File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / pimd / pimd.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 10:09:11 2016 UTC (7 years, 8 months ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, HEAD
quagga 1.0.20160315

    1: /*
    2:   PIM for Quagga
    3:   Copyright (C) 2008  Everton da Silva Marques
    4: 
    5:   This program is free software; you can redistribute it and/or modify
    6:   it under the terms of the GNU General Public License as published by
    7:   the Free Software Foundation; either version 2 of the License, or
    8:   (at your option) any later version.
    9: 
   10:   This program is distributed in the hope that it will be useful, but
   11:   WITHOUT ANY WARRANTY; without even the implied warranty of
   12:   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13:   General Public License for more details.
   14:   
   15:   You should have received a copy of the GNU General Public License
   16:   along with this program; see the file COPYING; if not, write to the
   17:   Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
   18:   MA 02110-1301 USA
   19:   
   20:   $QuaggaId: $Format:%an, %ai, %h$ $
   21: */
   22: 
   23: #include <zebra.h>
   24: 
   25: #include "log.h"
   26: #include "memory.h"
   27: #include "vrf.h"
   28: 
   29: #include "pimd.h"
   30: #include "pim_cmd.h"
   31: #include "pim_iface.h"
   32: #include "pim_zebra.h"
   33: #include "pim_str.h"
   34: #include "pim_oil.h"
   35: #include "pim_pim.h"
   36: #include "pim_upstream.h"
   37: #include "pim_rpf.h"
   38: #include "pim_ssmpingd.h"
   39: #include "pim_static.h"
   40: 
   41: const char *const PIM_ALL_SYSTEMS      = MCAST_ALL_SYSTEMS;
   42: const char *const PIM_ALL_ROUTERS      = MCAST_ALL_ROUTERS;
   43: const char *const PIM_ALL_PIM_ROUTERS  = MCAST_ALL_PIM_ROUTERS;
   44: const char *const PIM_ALL_IGMP_ROUTERS = MCAST_ALL_IGMP_ROUTERS;
   45: 
   46: struct thread_master     *master = 0;
   47: uint32_t                  qpim_debugs = 0;
   48: int                       qpim_mroute_socket_fd = -1;
   49: int64_t                   qpim_mroute_socket_creation = 0; /* timestamp of creation */
   50: struct thread            *qpim_mroute_socket_reader = 0;
   51: int                       qpim_mroute_oif_highest_vif_index = -1;
   52: struct list              *qpim_channel_oil_list = 0;
   53: int                       qpim_t_periodic = PIM_DEFAULT_T_PERIODIC; /* Period between Join/Prune Messages */
   54: struct list              *qpim_upstream_list = 0;
   55: struct zclient           *qpim_zclient_update = 0;
   56: struct zclient           *qpim_zclient_lookup = 0;
   57: struct pim_assert_metric  qpim_infinite_assert_metric;
   58: long                      qpim_rpf_cache_refresh_delay_msec = 10000;
   59: struct thread            *qpim_rpf_cache_refresher = 0;
   60: int64_t                   qpim_rpf_cache_refresh_requests = 0;
   61: int64_t                   qpim_rpf_cache_refresh_events = 0;
   62: int64_t                   qpim_rpf_cache_refresh_last =  0;
   63: struct in_addr            qpim_inaddr_any;
   64: struct list              *qpim_ssmpingd_list = 0;
   65: struct in_addr            qpim_ssmpingd_group_addr;
   66: int64_t                   qpim_scan_oil_events = 0;
   67: int64_t                   qpim_scan_oil_last = 0;
   68: int64_t                   qpim_mroute_add_events = 0;
   69: int64_t                   qpim_mroute_add_last = 0;
   70: int64_t                   qpim_mroute_del_events = 0;
   71: int64_t                   qpim_mroute_del_last = 0;
   72: struct list              *qpim_static_route_list = 0;
   73: 
   74: static void pim_free()
   75: {
   76:   pim_ssmpingd_destroy();
   77: 
   78:   if (qpim_channel_oil_list)
   79:     list_free(qpim_channel_oil_list);
   80: 
   81:   if (qpim_upstream_list)
   82:     list_free(qpim_upstream_list);
   83: 
   84:   if (qpim_static_route_list)
   85:      list_free(qpim_static_route_list);
   86: }
   87: 
   88: void pim_init()
   89: {
   90:   srandom(time(NULL));
   91: 
   92:   if (!inet_aton(PIM_ALL_PIM_ROUTERS, &qpim_all_pim_routers_addr)) {
   93:     zlog_err("%s %s: could not solve %s to group address: errno=%d: %s",
   94: 	     __FILE__, __PRETTY_FUNCTION__,
   95: 	     PIM_ALL_PIM_ROUTERS, errno, safe_strerror(errno));
   96:     zassert(0);
   97:     return;
   98:   }
   99: 
  100:   qpim_channel_oil_list = list_new();
  101:   if (!qpim_channel_oil_list) {
  102:     zlog_err("%s %s: failure: channel_oil_list=list_new()",
  103: 	     __FILE__, __PRETTY_FUNCTION__);
  104:     return;
  105:   }
  106:   qpim_channel_oil_list->del = (void (*)(void *)) pim_channel_oil_free;
  107: 
  108:   qpim_upstream_list = list_new();
  109:   if (!qpim_upstream_list) {
  110:     zlog_err("%s %s: failure: upstream_list=list_new()",
  111: 	     __FILE__, __PRETTY_FUNCTION__);
  112:     pim_free();
  113:     return;
  114:   }
  115:   qpim_upstream_list->del = (void (*)(void *)) pim_upstream_free;
  116: 
  117:   qpim_static_route_list = list_new();
  118:   if (!qpim_static_route_list) {
  119:     zlog_err("%s %s: failure: static_route_list=list_new()",
  120:         __FILE__, __PRETTY_FUNCTION__);
  121:     return;
  122:   }
  123:   qpim_static_route_list->del = (void (*)(void *)) pim_static_route_free;
  124: 
  125:   qpim_mroute_socket_fd = -1; /* mark mroute as disabled */
  126:   qpim_mroute_oif_highest_vif_index = -1;
  127: 
  128:   zassert(!qpim_debugs);
  129:   zassert(!PIM_MROUTE_IS_ENABLED);
  130: 
  131:   qpim_inaddr_any.s_addr = PIM_NET_INADDR_ANY;
  132: 
  133:   /*
  134:     RFC 4601: 4.6.3.  Assert Metrics
  135: 
  136:     assert_metric
  137:     infinite_assert_metric() {
  138:     return {1,infinity,infinity,0}
  139:     }
  140:   */
  141:   qpim_infinite_assert_metric.rpt_bit_flag      = 1;
  142:   qpim_infinite_assert_metric.metric_preference = PIM_ASSERT_METRIC_PREFERENCE_MAX;
  143:   qpim_infinite_assert_metric.route_metric      = PIM_ASSERT_ROUTE_METRIC_MAX;
  144:   qpim_infinite_assert_metric.ip_address        = qpim_inaddr_any;
  145: 
  146:   pim_cmd_init();
  147:   pim_ssmpingd_init();
  148: }
  149: 
  150: void pim_terminate()
  151: {
  152:   vrf_terminate();
  153:   pim_free();
  154: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>