Coverage Report

Created: 2025-08-28 06:29

/src/frr/pimd/pimd.c
Line
Count
Source (jump to first uncovered line)
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
 * PIM for Quagga
4
 * Copyright (C) 2008  Everton da Silva Marques
5
 */
6
7
#include <zebra.h>
8
9
#include "log.h"
10
#include "memory.h"
11
#include "if.h"
12
#include "prefix.h"
13
#include "vty.h"
14
#include "plist.h"
15
#include "hash.h"
16
#include "jhash.h"
17
#include "vrf.h"
18
#include "lib_errors.h"
19
#include "bfd.h"
20
21
#include "pimd.h"
22
#if PIM_IPV == 4
23
#include "pim_cmd.h"
24
#else
25
#include "pim6_cmd.h"
26
#endif
27
#include "pim_str.h"
28
#include "pim_oil.h"
29
#include "pim_pim.h"
30
#include "pim_ssmpingd.h"
31
#include "pim_static.h"
32
#include "pim_rp.h"
33
#include "pim_ssm.h"
34
#include "pim_vxlan.h"
35
#include "pim_zlookup.h"
36
#include "pim_zebra.h"
37
#include "pim_mlag.h"
38
39
#if MAXVIFS > 256
40
CPP_NOTICE("Work needs to be done to make this work properly via the pim mroute socket\n");
41
#endif /* MAXVIFS > 256 */
42
43
#if PIM_IPV == 4
44
const char *const PIM_ALL_SYSTEMS = MCAST_ALL_SYSTEMS;
45
const char *const PIM_ALL_ROUTERS = MCAST_ALL_ROUTERS;
46
const char *const PIM_ALL_PIM_ROUTERS = MCAST_ALL_PIM_ROUTERS;
47
const char *const PIM_ALL_IGMP_ROUTERS = MCAST_ALL_IGMP_ROUTERS;
48
#else
49
const char *const PIM_ALL_SYSTEMS = "ff02::1";
50
const char *const PIM_ALL_ROUTERS = "ff02::2";
51
const char *const PIM_ALL_PIM_ROUTERS = "ff02::d";
52
const char *const PIM_ALL_IGMP_ROUTERS = "ff02::16";
53
#endif
54
55
DEFINE_MTYPE_STATIC(PIMD, ROUTER, "PIM Router information");
56
57
struct pim_router *router = NULL;
58
pim_addr qpim_all_pim_routers_addr;
59
60
void pim_prefix_list_update(struct prefix_list *plist)
61
0
{
62
0
  struct pim_instance *pim;
63
0
  struct vrf *vrf;
64
65
0
  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
66
0
    pim = vrf->info;
67
0
    if (!pim)
68
0
      continue;
69
70
0
    pim_rp_prefix_list_update(pim, plist);
71
0
    pim_ssm_prefix_list_update(pim, plist);
72
0
    pim_upstream_spt_prefix_list_update(pim, plist);
73
0
  }
74
0
}
75
76
static void pim_free(void)
77
0
{
78
0
  pim_route_map_terminate();
79
80
0
  zclient_lookup_free();
81
0
}
82
83
void pim_router_init(void)
84
1
{
85
1
  router = XCALLOC(MTYPE_ROUTER, sizeof(*router));
86
87
1
  router->debugs = 0;
88
1
  router->master = frr_init_fast();
89
1
  router->t_periodic = PIM_DEFAULT_T_PERIODIC;
90
1
  router->multipath = MULTIPATH_NUM;
91
92
  /*
93
    RFC 4601: 4.6.3.  Assert Metrics
94
95
    assert_metric
96
    infinite_assert_metric() {
97
    return {1,infinity,infinity,0}
98
    }
99
  */
100
1
  router->infinite_assert_metric.rpt_bit_flag = 1;
101
1
  router->infinite_assert_metric.metric_preference =
102
1
    PIM_ASSERT_METRIC_PREFERENCE_MAX;
103
1
  router->infinite_assert_metric.route_metric =
104
1
    PIM_ASSERT_ROUTE_METRIC_MAX;
105
1
  router->infinite_assert_metric.ip_address = PIMADDR_ANY;
106
1
  router->rpf_cache_refresh_delay_msec = 50;
107
1
  router->register_suppress_time = PIM_REGISTER_SUPPRESSION_TIME_DEFAULT;
108
1
  router->packet_process = PIM_DEFAULT_PACKET_PROCESS;
109
1
  router->register_probe_time = PIM_REGISTER_PROBE_TIME_DEFAULT;
110
1
  router->vrf_id = VRF_DEFAULT;
111
1
  router->pim_mlag_intf_cnt = 0;
112
1
  router->connected_to_mlag = false;
113
1
}
114
115
void pim_router_terminate(void)
116
0
{
117
0
  XFREE(MTYPE_ROUTER, router);
118
0
}
119
120
void pim_init(void)
121
1
{
122
1
  if (!inet_pton(PIM_AF, PIM_ALL_PIM_ROUTERS,
123
1
           &qpim_all_pim_routers_addr)) {
124
0
    flog_err(
125
0
      EC_LIB_SOCKET,
126
0
      "%s %s: could not solve %s to group address: errno=%d: %s",
127
0
      __FILE__, __func__, PIM_ALL_PIM_ROUTERS, errno,
128
0
      safe_strerror(errno));
129
0
    assert(0);
130
0
    return;
131
0
  }
132
133
1
  pim_cmd_init();
134
1
}
135
136
void pim_terminate(void)
137
0
{
138
0
  struct zclient *zclient;
139
140
0
  bfd_protocol_integration_set_shutdown(true);
141
142
  /* reverse prefix_list_init */
143
0
  prefix_list_add_hook(NULL);
144
0
  prefix_list_delete_hook(NULL);
145
0
  prefix_list_reset();
146
147
0
  pim_vxlan_terminate();
148
0
  pim_vrf_terminate();
149
150
0
  zclient = pim_zebra_zclient_get();
151
0
  if (zclient) {
152
0
    zclient_stop(zclient);
153
0
    zclient_free(zclient);
154
0
  }
155
156
0
  pim_free();
157
0
  pim_mlag_terminate();
158
0
  pim_router_terminate();
159
160
0
  frr_fini();
161
0
}