Annotation of embedaddon/quagga/pimd/pimd.c, revision 1.1

1.1     ! misho       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>