diff options
Diffstat (limited to 'pimd')
| -rw-r--r-- | pimd/README | 4 | ||||
| -rw-r--r-- | pimd/pim_bfd.c | 10 | ||||
| -rw-r--r-- | pimd/pim_bsm.c | 7 | ||||
| -rw-r--r-- | pimd/pim_cmd.c | 65 | ||||
| -rw-r--r-- | pimd/pim_hello.c | 2 | ||||
| -rw-r--r-- | pimd/pim_iface.c | 11 | ||||
| -rw-r--r-- | pimd/pim_main.c | 1 | ||||
| -rw-r--r-- | pimd/pim_mlag.c | 6 | ||||
| -rw-r--r-- | pimd/pim_msdp.c | 4 | ||||
| -rw-r--r-- | pimd/pim_nht.c | 6 | ||||
| -rw-r--r-- | pimd/pim_pim.c | 3 | ||||
| -rw-r--r-- | pimd/pim_rp.c | 6 | ||||
| -rw-r--r-- | pimd/pim_sock.c | 5 | ||||
| -rw-r--r-- | pimd/pim_tlv.c | 21 | ||||
| -rw-r--r-- | pimd/pim_tlv.h | 14 | ||||
| -rw-r--r-- | pimd/pim_upstream.c | 21 | ||||
| -rw-r--r-- | pimd/pim_zlookup.c | 20 |
17 files changed, 135 insertions, 71 deletions
diff --git a/pimd/README b/pimd/README index 3d03979a9a..1db0aad83c 100644 --- a/pimd/README +++ b/pimd/README @@ -33,7 +33,7 @@ HOME SITE qpimd lives at: - https://github.com/freerangerouting/frr + https://github.com/frrouting/frr PLATFORMS @@ -57,7 +57,7 @@ SUPPORT Please post comments, questions, patches, bug reports at the support site: - https://freerangerouting/frr + https://frrouting.org/frr RELATED WORK diff --git a/pimd/pim_bfd.c b/pimd/pim_bfd.c index 84f6733eaf..0df8ea6922 100644 --- a/pimd/pim_bfd.c +++ b/pimd/pim_bfd.c @@ -47,7 +47,7 @@ void pim_bfd_write_config(struct vty *vty, struct interface *ifp) if (!pim_ifp) return; - bfd_info = (struct bfd_info *)pim_ifp->bfd_info; + bfd_info = pim_ifp->bfd_info; if (!bfd_info) return; @@ -92,7 +92,7 @@ void pim_bfd_info_nbr_create(struct pim_interface *pim_ifp, if (!neigh->bfd_info) return; - nbr_bfd_info = (struct bfd_info *)neigh->bfd_info; + nbr_bfd_info = neigh->bfd_info; nbr_bfd_info->detect_mult = pim_ifp->bfd_info->detect_mult; nbr_bfd_info->desired_min_tx = pim_ifp->bfd_info->desired_min_tx; nbr_bfd_info->required_min_rx = pim_ifp->bfd_info->required_min_rx; @@ -118,7 +118,7 @@ static void pim_bfd_reg_dereg_nbr(struct pim_neighbor *nbr, int command) if (!nbr) return; pim_ifp = nbr->interface->info; - bfd_info = (struct bfd_info *)pim_ifp->bfd_info; + bfd_info = pim_ifp->bfd_info; if (!bfd_info) return; if (PIM_DEBUG_PIM_TRACE) { @@ -194,8 +194,8 @@ void pim_bfd_if_param_set(struct interface *ifp, uint32_t min_rx, if (!pim_ifp) return; - bfd_set_param((struct bfd_info **)&(pim_ifp->bfd_info), min_rx, min_tx, - detect_mult, defaults, &command); + bfd_set_param(&(pim_ifp->bfd_info), min_rx, min_tx, detect_mult, + defaults, &command); if (pim_ifp->bfd_info) { if (PIM_DEBUG_PIM_TRACE) diff --git a/pimd/pim_bsm.c b/pimd/pim_bsm.c index ad47427101..d949c657bd 100644 --- a/pimd/pim_bsm.c +++ b/pimd/pim_bsm.c @@ -1282,6 +1282,13 @@ int pim_bsm_process(struct interface *ifp, struct ip *ip_hdr, uint8_t *buf, bshdr = (struct bsm_hdr *)(buf + PIM_MSG_HEADER_LEN); pim_inet4_dump("<bsr?>", bshdr->bsr_addr.addr, bsr_str, sizeof(bsr_str)); + if (bshdr->hm_len > 32) { + zlog_warn("Bad hashmask length for IPv4; got %" PRIu8 + ", expected value in range 0-32", + bshdr->hm_len); + pim->bsm_dropped++; + return -1; + } pim->global_scope.hashMasklen = bshdr->hm_len; frag_tag = ntohs(bshdr->frag_tag); diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 871606414e..f6af98598b 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -70,10 +70,19 @@ #endif static struct cmd_node interface_node = { - INTERFACE_NODE, "%s(config-if)# ", 1 /* vtysh ? yes */ + .name = "interface", + .node = INTERFACE_NODE, + .parent_node = CONFIG_NODE, + .prompt = "%s(config-if)# ", + .config_write = pim_interface_config_write, }; -static struct cmd_node debug_node = {DEBUG_NODE, "", 1}; +static struct cmd_node debug_node = { + .name = "debug", + .node = DEBUG_NODE, + .prompt = "", + .config_write = pim_debug_config_write, +}; static struct vrf *pim_cmd_lookup_vrf(struct vty *vty, struct cmd_token *argv[], const int argc, int *idx) @@ -3319,12 +3328,9 @@ static void pim_show_statistics(struct pim_instance *pim, struct vty *vty, if (uj) { json = json_object_new_object(); - json_object_int_add(json, "Number of Received BSMs", - pim->bsm_rcvd); - json_object_int_add(json, "Number of Forwared BSMs", - pim->bsm_sent); - json_object_int_add(json, "Number of Dropped BSMs", - pim->bsm_dropped); + json_object_int_add(json, "bsmRx", pim->bsm_rcvd); + json_object_int_add(json, "bsmTx", pim->bsm_sent); + json_object_int_add(json, "bsmDropped", pim->bsm_dropped); } else { vty_out(vty, "BSM Statistics :\n"); vty_out(vty, "----------------\n"); @@ -3366,15 +3372,13 @@ static void pim_show_statistics(struct pim_instance *pim, struct vty *vty, json_row = json_object_new_object(); json_object_string_add(json_row, "If Name", ifp->name); + json_object_int_add(json_row, "bsmDroppedConfig", + pim_ifp->pim_ifstat_bsm_cfg_miss); json_object_int_add( - json_row, - "Number of BSMs dropped due to config miss", - pim_ifp->pim_ifstat_bsm_cfg_miss); - json_object_int_add( - json_row, "Number of unicast BSMs dropped", + json_row, "bsmDroppedUnicast", pim_ifp->pim_ifstat_ucast_bsm_cfg_miss); json_object_int_add(json_row, - "Number of BSMs dropped due to invalid scope zone", + "bsmDroppedInvalidScopeZone", pim_ifp->pim_ifstat_bsm_invalid_sz); json_object_object_add(json, ifp->name, json_row); } @@ -3792,11 +3796,11 @@ static void pim_show_bsr(struct pim_instance *pim, json_object_string_add(json, "bsr", bsr_str); json_object_int_add(json, "priority", pim->global_scope.current_bsr_prio); - json_object_int_add(json, "fragment_tag", + json_object_int_add(json, "fragmentTag", pim->global_scope.bsm_frag_tag); json_object_string_add(json, "state", bsr_state); json_object_string_add(json, "upTime", uptime); - json_object_string_add(json, "last_bsm_seen", last_bsm_seen); + json_object_string_add(json, "lastBsmSeen", last_bsm_seen); } else { @@ -9762,11 +9766,25 @@ DEFUN (no_ip_msdp_mesh_group_source, "mesh group local address\n") { PIM_DECLVAR_CONTEXT(vrf, pim); - if (argc == 7) - return ip_no_msdp_mesh_group_cmd_worker(pim, vty, argv[6]->arg); + + return ip_no_msdp_mesh_group_source_cmd_worker(pim, vty, argv[4]->arg); +} + +DEFUN (no_ip_msdp_mesh_group, + no_ip_msdp_mesh_group_cmd, + "no ip msdp mesh-group [WORD]", + NO_STR + IP_STR + CFG_MSDP_STR + "Delete MSDP mesh-group\n" + "mesh group name") +{ + PIM_DECLVAR_CONTEXT(vrf, pim); + + if (argc == 5) + return ip_no_msdp_mesh_group_cmd_worker(pim, vty, argv[4]->arg); else - return ip_no_msdp_mesh_group_source_cmd_worker(pim, vty, - argv[4]->arg); + return ip_no_msdp_mesh_group_cmd_worker(pim, vty, NULL); } static void print_empty_json_obj(struct vty *vty) @@ -10863,11 +10881,10 @@ DEFUN_HIDDEN (ip_pim_mlag, void pim_cmd_init(void) { - install_node(&interface_node, - pim_interface_config_write); /* INTERFACE_NODE */ + install_node(&interface_node); /* INTERFACE_NODE */ if_cmd_init(); - install_node(&debug_node, pim_debug_config_write); + install_node(&debug_node); install_element(ENABLE_NODE, &pim_test_sg_keepalive_cmd); @@ -11158,6 +11175,8 @@ void pim_cmd_init(void) install_element(VRF_NODE, &ip_msdp_mesh_group_source_cmd); install_element(CONFIG_NODE, &no_ip_msdp_mesh_group_source_cmd); install_element(VRF_NODE, &no_ip_msdp_mesh_group_source_cmd); + install_element(CONFIG_NODE, &no_ip_msdp_mesh_group_cmd); + install_element(VRF_NODE, &no_ip_msdp_mesh_group_cmd); install_element(VIEW_NODE, &show_ip_msdp_peer_detail_cmd); install_element(VIEW_NODE, &show_ip_msdp_peer_detail_vrf_all_cmd); install_element(VIEW_NODE, &show_ip_msdp_sa_detail_cmd); diff --git a/pimd/pim_hello.c b/pimd/pim_hello.c index ecdb3a34a7..e50504ec10 100644 --- a/pimd/pim_hello.c +++ b/pimd/pim_hello.c @@ -484,7 +484,7 @@ int pim_hello_build_tlv(struct interface *ifp, uint8_t *tlv_buf, return -1; } if (can_disable_join_suppression) { - *((uint8_t *)(curr) + 4) |= 0x80; /* enable T bit */ + *(curr + 4) |= 0x80; /* enable T bit */ } curr = tmp; diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index 07c4172f22..b25b6eaa8c 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -28,6 +28,7 @@ #include "plist.h" #include "hash.h" #include "ferr.h" +#include "network.h" #include "pimd.h" #include "pim_instance.h" @@ -900,15 +901,16 @@ struct in_addr pim_find_primary_addr(struct interface *ifp) * So let's grab the loopbacks v4 address * and use that as the primary address */ - if (!v4_addrs && v6_addrs && !if_is_loopback(ifp)) { + if (!v4_addrs && v6_addrs) { struct interface *lo_ifp; + // DBS - Come back and check here if (ifp->vrf_id == VRF_DEFAULT) lo_ifp = if_lookup_by_name("lo", vrf->vrf_id); else lo_ifp = if_lookup_by_name(vrf->name, vrf->vrf_id); - if (lo_ifp) + if (lo_ifp && (lo_ifp != ifp)) return pim_find_primary_addr(lo_ifp); } @@ -1102,7 +1104,8 @@ int pim_if_t_override_msec(struct interface *ifp) effective_override_interval_msec = pim_if_effective_override_interval_msec(ifp); - t_override_msec = random() % (effective_override_interval_msec + 1); + t_override_msec = + frr_weak_random() % (effective_override_interval_msec + 1); return t_override_msec; } @@ -1180,7 +1183,7 @@ long pim_if_t_suppressed_msec(struct interface *ifp) return 0; /* t_suppressed = t_periodic * rand(1.1, 1.4) */ - ramount = 1100 + (random() % (1400 - 1100 + 1)); + ramount = 1100 + (frr_weak_random() % (1400 - 1100 + 1)); t_suppressed_msec = router->t_periodic * ramount; return t_suppressed_msec; diff --git a/pimd/pim_main.c b/pimd/pim_main.c index 93b561ba0f..5c4c7151a5 100644 --- a/pimd/pim_main.c +++ b/pimd/pim_main.c @@ -75,6 +75,7 @@ struct zebra_privs_t pimd_privs = { static const struct frr_yang_module_info *const pimd_yang_modules[] = { &frr_interface_info, &frr_route_map_info, + &frr_vrf_info, }; FRR_DAEMON_INFO(pimd, PIM, .vty_port = PIMD_VTY_PORT, diff --git a/pimd/pim_mlag.c b/pimd/pim_mlag.c index 304e6ac6bc..78be914cee 100644 --- a/pimd/pim_mlag.c +++ b/pimd/pim_mlag.c @@ -583,7 +583,9 @@ static void pim_mlag_process_mlagd_state_change(struct mlag_status msg) router->mlag_role = msg.my_role; } - strcpy(router->peerlink_rif, msg.peerlink_rif); + strlcpy(router->peerlink_rif, msg.peerlink_rif, + sizeof(router->peerlink_rif)); + /* XXX - handle the case where we may rx the interface name from the * MLAG daemon before we get the interface from zebra. */ @@ -767,7 +769,7 @@ static void pim_mlag_process_mroute_del(struct mlag_mroute_del msg) int pim_zebra_mlag_handle_msg(struct stream *s, int len) { struct mlag_msg mlag_msg; - char buf[ZLOG_FILTER_LENGTH_MAX]; + char buf[80]; int rc = 0; size_t length; diff --git a/pimd/pim_msdp.c b/pimd/pim_msdp.c index 63d34e859c..52c989e644 100644 --- a/pimd/pim_msdp.c +++ b/pimd/pim_msdp.c @@ -1286,7 +1286,9 @@ enum pim_msdp_err pim_msdp_mg_del(struct pim_instance *pim, struct pim_msdp_mg *mg = pim->msdp.mg; struct pim_msdp_mg_mbr *mbr; - if (!mg || strcmp(mg->mesh_group_name, mesh_group_name)) { + if (!mg + || (mesh_group_name + && strcmp(mg->mesh_group_name, mesh_group_name))) { return PIM_MSDP_ERR_NO_MG; } diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index 60b7c73d43..68d43c0556 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -788,7 +788,11 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS) case NEXTHOP_TYPE_IPV6_IFINDEX: ifp1 = if_lookup_by_index(nexthop->ifindex, pim->vrf_id); - nbr = pim_neighbor_find_if(ifp1); + + if (!ifp1) + nbr = NULL; + else + nbr = pim_neighbor_find_if(ifp1); /* Overwrite with Nbr address as NH addr */ if (nbr) nexthop->gate.ipv4 = nbr->source_addr; diff --git a/pimd/pim_pim.c b/pimd/pim_pim.c index f37c140bf2..3976b262e3 100644 --- a/pimd/pim_pim.c +++ b/pimd/pim_pim.c @@ -23,6 +23,7 @@ #include "thread.h" #include "memory.h" #include "if.h" +#include "network.h" #include "pimd.h" #include "pim_pim.h" @@ -878,7 +879,7 @@ int pim_sock_add(struct interface *ifp) old_genid = pim_ifp->pim_generation_id; while (old_genid == pim_ifp->pim_generation_id) - pim_ifp->pim_generation_id = random(); + pim_ifp->pim_generation_id = frr_weak_random(); zlog_info("PIM INTERFACE UP: on interface %s ifindex=%d", ifp->name, ifp->ifindex); diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index a9f1d9335a..ef5f478226 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -1261,11 +1261,11 @@ void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj) char buf[48]; if (rp_info->rp_src == RP_SRC_STATIC) - strcpy(source, "Static"); + strlcpy(source, "Static", sizeof(source)); else if (rp_info->rp_src == RP_SRC_BSR) - strcpy(source, "BSR"); + strlcpy(source, "BSR", sizeof(source)); else - strcpy(source, "None"); + strlcpy(source, "None", sizeof(source)); if (uj) { /* * If we have moved on to a new RP then add the diff --git a/pimd/pim_sock.c b/pimd/pim_sock.c index ae5781f0cc..f0a71c96ce 100644 --- a/pimd/pim_sock.c +++ b/pimd/pim_sock.c @@ -375,8 +375,7 @@ int pim_socket_recvfromto(int fd, uint8_t *buf, size_t len, struct in_pktinfo *i = (struct in_pktinfo *)CMSG_DATA(cmsg); if (to) - ((struct sockaddr_in *)to)->sin_addr = - i->ipi_addr; + to->sin_addr = i->ipi_addr; if (tolen) *tolen = sizeof(struct sockaddr_in); if (ifindex) @@ -391,7 +390,7 @@ int pim_socket_recvfromto(int fd, uint8_t *buf, size_t len, && (cmsg->cmsg_type == IP_RECVDSTADDR)) { struct in_addr *i = (struct in_addr *)CMSG_DATA(cmsg); if (to) - ((struct sockaddr_in *)to)->sin_addr = *i; + to->sin_addr = *i; if (tolen) *tolen = sizeof(struct sockaddr_in); diff --git a/pimd/pim_tlv.c b/pimd/pim_tlv.c index 881a3e332a..633bb207bd 100644 --- a/pimd/pim_tlv.c +++ b/pimd/pim_tlv.c @@ -121,20 +121,19 @@ int pim_encode_addr_ucast(uint8_t *buf, struct prefix *p) { switch (p->family) { case AF_INET: - *(uint8_t *)buf = - PIM_MSG_ADDRESS_FAMILY_IPV4; /* notice: AF_INET != - PIM_MSG_ADDRESS_FAMILY_IPV4 - */ + *buf = PIM_MSG_ADDRESS_FAMILY_IPV4; /* notice: AF_INET != + PIM_MSG_ADDRESS_FAMILY_IPV4 + */ ++buf; - *(uint8_t *)buf = 0; /* ucast IPv4 native encoding type (RFC + *buf = 0; /* ucast IPv4 native encoding type (RFC 4601: 4.9.1) */ ++buf; memcpy(buf, &p->u.prefix4, sizeof(struct in_addr)); return ucast_ipv4_encoding_len; case AF_INET6: - *(uint8_t *)buf = PIM_MSG_ADDRESS_FAMILY_IPV6; + *buf = PIM_MSG_ADDRESS_FAMILY_IPV6; ++buf; - *(uint8_t *)buf = 0; + *buf = 0; ++buf; memcpy(buf, &p->u.prefix6, sizeof(struct in6_addr)); return ucast_ipv6_encoding_len; @@ -198,13 +197,13 @@ int pim_encode_addr_group(uint8_t *buf, afi_t afi, int bidir, int scope, switch (afi) { case AFI_IP: - *(uint8_t *)buf = PIM_MSG_ADDRESS_FAMILY_IPV4; + *buf = PIM_MSG_ADDRESS_FAMILY_IPV4; ++buf; - *(uint8_t *)buf = 0; + *buf = 0; ++buf; - *(uint8_t *)buf = flags; + *buf = flags; ++buf; - *(uint8_t *)buf = 32; + *buf = 32; ++buf; memcpy(buf, &group, sizeof(struct in_addr)); return group_ipv4_encoding_len; diff --git a/pimd/pim_tlv.h b/pimd/pim_tlv.h index 657675b312..ef764656d3 100644 --- a/pimd/pim_tlv.h +++ b/pimd/pim_tlv.h @@ -48,8 +48,18 @@ typedef uint32_t pim_hello_options; #define PIM_OPTION_UNSET(options, option_mask) ((options) &= ~(option_mask)) #define PIM_OPTION_IS_SET(options, option_mask) ((options) & (option_mask)) -#define PIM_TLV_GET_UINT16(buf) ntohs(*(const uint16_t *)(buf)) -#define PIM_TLV_GET_UINT32(buf) ntohl(*(const uint32_t *)(buf)) +#define PIM_TLV_GET_UINT16(buf) \ + ({ \ + uint16_t _tmp; \ + memcpy(&_tmp, (buf), sizeof(uint16_t)); \ + ntohs(_tmp); \ + }) +#define PIM_TLV_GET_UINT32(buf) \ + ({ \ + uint32_t _tmp; \ + memcpy(&_tmp, (buf), sizeof(uint32_t)); \ + ntohl(_tmp); \ + }) #define PIM_TLV_GET_TYPE(buf) PIM_TLV_GET_UINT16(buf) #define PIM_TLV_GET_LENGTH(buf) PIM_TLV_GET_UINT16(buf) #define PIM_TLV_GET_HOLDTIME(buf) PIM_TLV_GET_UINT16(buf) diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 872883dfde..1e78f41359 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -29,6 +29,7 @@ #include "hash.h" #include "jhash.h" #include "wheel.h" +#include "network.h" #include "pimd.h" #include "pim_pim.h" @@ -462,10 +463,26 @@ void pim_upstream_join_timer_decrease_to_t_override(const char *debug_label, return; } - join_timer_remain_msec = pim_time_timer_remain_msec(up->t_join_timer); t_override_msec = pim_if_t_override_msec(up->rpf.source_nexthop.interface); + if (up->t_join_timer) { + join_timer_remain_msec = + pim_time_timer_remain_msec(up->t_join_timer); + } else { + /* upstream join tracked with neighbor jp timer */ + struct pim_neighbor *nbr; + + nbr = pim_neighbor_find(up->rpf.source_nexthop.interface, + up->rpf.rpf_addr.u.prefix4); + if (nbr) + join_timer_remain_msec = + pim_time_timer_remain_msec(nbr->jp_timer); + else + /* Manipulate such that override takes place */ + join_timer_remain_msec = t_override_msec + 1; + } + if (PIM_DEBUG_PIM_TRACE) { char rpf_str[INET_ADDRSTRLEN]; pim_inet4_dump("<rpf?>", up->rpf.rpf_addr.u.prefix4, rpf_str, @@ -1746,7 +1763,7 @@ void pim_upstream_start_register_stop_timer(struct pim_upstream *up, if (!null_register) { uint32_t lower = (0.5 * PIM_REGISTER_SUPPRESSION_PERIOD); uint32_t upper = (1.5 * PIM_REGISTER_SUPPRESSION_PERIOD); - time = lower + (random() % (upper - lower + 1)) + time = lower + (frr_weak_random() % (upper - lower + 1)) - PIM_REGISTER_PROBE_PERIOD; } else time = PIM_REGISTER_PROBE_PERIOD; diff --git a/pimd/pim_zlookup.c b/pimd/pim_zlookup.c index 84fac4f951..49c221f8ed 100644 --- a/pimd/pim_zlookup.c +++ b/pimd/pim_zlookup.c @@ -285,17 +285,17 @@ static int zclient_read_nexthop(struct pim_instance *pim, * If we are sending v6 secondary assume we receive v6 * secondary */ - if (pim->send_v6_secondary) - nbr = pim_neighbor_find_by_secondary( - if_lookup_by_index( - nexthop_tab[num_ifindex] - .ifindex, - nexthop_vrf_id), - &p); + struct interface *ifp = if_lookup_by_index( + nexthop_tab[num_ifindex].ifindex, + nexthop_vrf_id); + + if (!ifp) + nbr = NULL; + else if (pim->send_v6_secondary) + nbr = pim_neighbor_find_by_secondary(ifp, &p); else - nbr = pim_neighbor_find_if(if_lookup_by_index( - nexthop_tab[num_ifindex].ifindex, - nexthop_vrf_id)); + nbr = pim_neighbor_find_if(ifp); + if (nbr) { nexthop_tab[num_ifindex].nexthop_addr.family = AF_INET; |
