diff options
| -rw-r--r-- | .github/ISSUE_TEMPLATE/bug_report.md | 2 | ||||
| -rw-r--r-- | doc/user/conf.py | 27 | ||||
| -rw-r--r-- | ospfd/ospf_ext.c | 8 | ||||
| -rw-r--r-- | ospfd/ospf_ri.c | 23 | ||||
| -rw-r--r-- | ospfd/ospf_sr.c | 44 | ||||
| -rw-r--r-- | pimd/pim_iface.c | 8 | ||||
| -rw-r--r-- | pimd/pim_iface.h | 2 | ||||
| -rw-r--r-- | pimd/pim_igmp.c | 12 | ||||
| -rw-r--r-- | pimd/pim_mroute.c | 50 |
9 files changed, 110 insertions, 66 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 1209f52e14..98c7c3d54d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -37,7 +37,7 @@ If applicable, add screenshots to help explain your problem. **Versions** - OS Kernel: [e.g. Linux, OpenBSD, etc] [version] - - FRR Version [version] + - FRR Version: [version] **Additional context** Add any other context about the problem here. diff --git a/doc/user/conf.py b/doc/user/conf.py index d8a188b152..1f6f050bcf 100644 --- a/doc/user/conf.py +++ b/doc/user/conf.py @@ -16,6 +16,7 @@ import sys import os import re import pygments +import sphinx from sphinx.highlighting import lexers # If extensions (or modules to document with autodoc) are in another directory, @@ -359,14 +360,36 @@ texinfo_documents = [ with open('../extra/frrlexer.py', 'rb') as lex: frrlexerpy = lex.read() +# Parse version string into int array +def vparse(s): + a = [] + + for c in s: + if c != '.': + a.append(int(c)) + + while len(a) < 3: + a.append(0) + + return a[:3] + # custom extensions here def setup(app): # object type for FRR CLI commands, can be extended to document parent CLI # node later on app.add_object_type('clicmd', 'clicmd') + # css overrides for HTML theme - app.add_stylesheet('overrides.css') - app.add_javascript('overrides.js') + # Note sphinx version differences + sver = vparse(sphinx.__version__) + + if sver < vparse('1.8.0') : + app.add_stylesheet('overrides.css') + app.add_javascript('overrides.js') + else: + app.add_css_file('overrides.css') + app.add_js_file('overrides.js') + # load Pygments lexer for FRR config syntax # # NB: in Pygments 2.2+ this can be done with `load_lexer_from_file`, but we diff --git a/ospfd/ospf_ext.c b/ospfd/ospf_ext.c index bc952e4ef9..90dc108c0e 100644 --- a/ospfd/ospf_ext.c +++ b/ospfd/ospf_ext.c @@ -563,9 +563,9 @@ static void ospf_ext_link_update_adj_sid(struct ext_itf *exti) set_adj_sid(exti, true, bck_label, SID_LABEL); set_adj_sid(exti, false, label, SID_LABEL); } else { - set_lan_adj_sid(exti, true, bck_label, SID_LABEL, + set_lan_adj_sid(exti, true, bck_label, SID_LABEL, exti->lan_sid[0].neighbor_id); - set_lan_adj_sid(exti, false, label, SID_LABEL, + set_lan_adj_sid(exti, false, label, SID_LABEL, exti->lan_sid[1].neighbor_id); } @@ -590,8 +590,8 @@ static void ospf_ext_link_delete_adj_sid(struct ext_itf *exti) ospf_sr_local_block_release_label(exti->adj_sid[0].value); ospf_sr_local_block_release_label(exti->adj_sid[1].value); } else { - ospf_sr_local_block_release_label(exti->adj_sid[0].value); - ospf_sr_local_block_release_label(exti->adj_sid[1].value); + ospf_sr_local_block_release_label(exti->lan_sid[0].value); + ospf_sr_local_block_release_label(exti->lan_sid[1].value); } /* And reset corresponding TLV */ unset_adjacency_sid(exti); diff --git a/ospfd/ospf_ri.c b/ospfd/ospf_ri.c index 8eeaf7be3c..fc9c8f6be6 100644 --- a/ospfd/ospf_ri.c +++ b/ospfd/ospf_ri.c @@ -573,20 +573,23 @@ static void initialize_params(struct ospf_router_info *ori) return; } -static int is_mandated_params_set(struct ospf_router_info ori) +static int is_mandated_params_set(struct ospf_router_info *ori) { int rc = 0; - if (ntohs(ori.router_cap.header.type) == 0) + if (ori == NULL) return rc; - if ((ntohs(ori.pce_info.pce_header.header.type) == RI_TLV_PCE) - && (ntohs(ori.pce_info.pce_address.header.type) == 0) - && (ntohs(ori.pce_info.pce_cap_flag.header.type) == 0)) + if (ntohs(ori->router_cap.header.type) == 0) return rc; - if ((ori.sr_info.enabled) && (ntohs(TLV_TYPE(ori.sr_info.algo)) == 0) - && (ntohs(TLV_TYPE(ori.sr_info.srgb)) == 0)) + if ((ntohs(ori->pce_info.pce_header.header.type) == RI_TLV_PCE) + && (ntohs(ori->pce_info.pce_address.header.type) == 0) + && (ntohs(ori->pce_info.pce_cap_flag.header.type) == 0)) + return rc; + + if ((ori->sr_info.enabled) && (ntohs(TLV_TYPE(ori->sr_info.algo)) == 0) + && (ntohs(TLV_TYPE(ori->sr_info.srgb)) == 0)) return rc; rc = 1; @@ -626,6 +629,10 @@ void ospf_router_info_update_sr(bool enable, struct sr_node *srn) initialize_params(&OspfRI); } + /* Check that SR node is valid */ + if (srn == NULL) + return; + if (IS_DEBUG_OSPF_SR) zlog_debug("RI (%s): %s Routing Information for Segment Routing", __func__, enable ? "Enable" : "Disable"); @@ -986,7 +993,7 @@ static int ospf_router_info_lsa_originate(void *arg) } /* Router Information is not yet Engaged, check parameters */ - if (!is_mandated_params_set(OspfRI)) + if (!is_mandated_params_set(&OspfRI)) flog_warn( EC_OSPF_LSA, "RI (%s): lacks mandated ROUTER INFORMATION parameters", diff --git a/ospfd/ospf_sr.c b/ospfd/ospf_sr.c index f6a190db80..eb882c5d0e 100644 --- a/ospfd/ospf_sr.c +++ b/ospfd/ospf_sr.c @@ -2074,13 +2074,17 @@ static int update_srgb(uint32_t lower, uint32_t size) osr_debug("SR(%s): Got new SRGB [%u/%u]", __func__, OspfSR.srgb.start, OspfSR.srgb.start + OspfSR.srgb.size - 1); - /* SRGB is reserved, set Router Information parameters */ - ospf_router_info_update_sr(true, OspfSR.self); + /* Update Self SR-Node */ + if (OspfSR.self != NULL) { + /* SRGB is reserved, set Router Information parameters */ + ospf_router_info_update_sr(true, OspfSR.self); - /* and update NHLFE entries */ - hash_iterate(OspfSR.neighbors, - (void (*)(struct hash_bucket *, void *))update_in_nhlfe, - NULL); + /* and update NHLFE entries */ + hash_iterate( + OspfSR.neighbors, + (void (*)(struct hash_bucket *, void *))update_in_nhlfe, + NULL); + } return 0; } @@ -2198,9 +2202,11 @@ DEFUN (sr_local_label_range, } /* SRLB is reserved, Update Self SR-Node and Router Information LSA */ - OspfSR.self->srlb.lower_bound = lower; - OspfSR.self->srlb.range_size = upper - lower + 1; - ospf_router_info_update_sr(true, OspfSR.self); + if (OspfSR.self != NULL) { + OspfSR.self->srlb.lower_bound = lower; + OspfSR.self->srlb.range_size = upper - lower + 1; + ospf_router_info_update_sr(true, OspfSR.self); + } /* and update (LAN)-Adjacency SID */ ospf_ext_link_srlb_update(); @@ -2250,8 +2256,8 @@ DEFUN (no_sr_local_label_range, if (OspfSR.self != NULL) { OspfSR.self->srlb.lower_bound = DEFAULT_SRLB_LABEL; OspfSR.self->srlb.range_size = DEFAULT_SRLB_SIZE; + ospf_router_info_update_sr(true, OspfSR.self); } - ospf_router_info_update_sr(true, OspfSR.self); /* and update (LAN)-Adjacency SID */ ospf_ext_link_srlb_update(); @@ -2287,12 +2293,13 @@ DEFUN (sr_node_msd, /* Set this router MSD */ OspfSR.msd = msd; - if (OspfSR.self != NULL) + if (OspfSR.self != NULL) { OspfSR.self->msd = msd; - /* Set Router Information parameters if SR is UP */ - if (OspfSR.status == SR_UP) - ospf_router_info_update_sr(true, OspfSR.self); + /* Set Router Information parameters if SR is UP */ + if (OspfSR.status == SR_UP) + ospf_router_info_update_sr(true, OspfSR.self); + } return CMD_SUCCESS; } @@ -2311,12 +2318,13 @@ DEFUN (no_sr_node_msd, /* unset this router MSD */ OspfSR.msd = 0; - if (OspfSR.self != NULL) + if (OspfSR.self != NULL) { OspfSR.self->msd = 0; - /* Set Router Information parameters if SR is UP */ - if (OspfSR.status == SR_UP) - ospf_router_info_update_sr(true, OspfSR.self); + /* Set Router Information parameters if SR is UP */ + if (OspfSR.status == SR_UP) + ospf_router_info_update_sr(true, OspfSR.self); + } return CMD_SUCCESS; } diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index 88bcc48f80..0caa360df9 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -1504,14 +1504,14 @@ void pim_if_create_pimreg(struct pim_instance *pim) } } -int pim_if_connected_to_source(struct interface *ifp, struct in_addr src) +struct prefix *pim_if_connected_to_source(struct interface *ifp, struct in_addr src) { struct listnode *cnode; struct connected *c; struct prefix p; if (!ifp) - return 0; + return NULL; p.family = AF_INET; p.u.prefix4 = src; @@ -1520,11 +1520,11 @@ int pim_if_connected_to_source(struct interface *ifp, struct in_addr src) for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, c)) { if ((c->address->family == AF_INET) && prefix_match(CONNECTED_PREFIX(c), &p)) { - return 1; + return CONNECTED_PREFIX(c); } } - return 0; + return NULL; } bool pim_if_is_vrf_device(struct interface *ifp) diff --git a/pimd/pim_iface.h b/pimd/pim_iface.h index 13aaf8d3b2..8decfef74d 100644 --- a/pimd/pim_iface.h +++ b/pimd/pim_iface.h @@ -223,7 +223,7 @@ void pim_if_update_assert_tracking_desired(struct interface *ifp); void pim_if_create_pimreg(struct pim_instance *pim); -int pim_if_connected_to_source(struct interface *ifp, struct in_addr src); +struct prefix *pim_if_connected_to_source(struct interface *ifp, struct in_addr src); int pim_update_source_set(struct interface *ifp, struct in_addr source); bool pim_if_is_vrf_device(struct interface *ifp); diff --git a/pimd/pim_igmp.c b/pimd/pim_igmp.c index a8612f91fa..20f339d43f 100644 --- a/pimd/pim_igmp.c +++ b/pimd/pim_igmp.c @@ -310,7 +310,7 @@ static int igmp_recv_query(struct igmp_sock *igmp, int query_version, return 0; } - if (if_lookup_address(&from, AF_INET, ifp->vrf_id)) { + if (if_lookup_exact_address(&from, AF_INET, ifp->vrf_id)) { if (PIM_DEBUG_IGMP_PACKETS) zlog_debug("Recv IGMP query on interface: %s from ourself %s", ifp->name, from_str); @@ -995,6 +995,7 @@ struct igmp_sock *pim_igmp_sock_add(struct list *igmp_sock_list, { struct pim_interface *pim_ifp; struct igmp_sock *igmp; + struct sockaddr_in sin; int fd; pim_ifp = ifp->info; @@ -1006,6 +1007,15 @@ struct igmp_sock *pim_igmp_sock_add(struct list *igmp_sock_list, return 0; } + sin.sin_family = AF_INET; + sin.sin_addr = ifaddr; + sin.sin_port = 0; + if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) != 0) { + zlog_warn("Could not bind IGMP socket for %s on %s", + inet_ntoa(ifaddr), ifp->name); + return 0; + } + igmp = igmp_sock_new(fd, ifaddr, ifp, mtrace_only); igmp_read_on(igmp); diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c index 9060b6a95a..0bccba397b 100644 --- a/pimd/pim_mroute.c +++ b/pimd/pim_mroute.c @@ -592,12 +592,9 @@ static int pim_mroute_msg(struct pim_instance *pim, const char *buf, struct pim_interface *pim_ifp; const struct ip *ip_hdr; const struct igmpmsg *msg; - char ip_src_str[INET_ADDRSTRLEN] = ""; - char ip_dst_str[INET_ADDRSTRLEN] = ""; - char src_str[INET_ADDRSTRLEN] = "<src?>"; - char grp_str[INET_ADDRSTRLEN] = "<grp?>"; struct in_addr ifaddr; struct igmp_sock *igmp; + const struct prefix *connected_src; if (buf_size < (int)sizeof(struct ip)) return 0; @@ -617,34 +614,37 @@ static int pim_mroute_msg(struct pim_instance *pim, const char *buf, if (!ifp || !ifp->info) return 0; + connected_src = pim_if_connected_to_source(ifp, ip_hdr->ip_src); + + if (!connected_src) { + if (PIM_DEBUG_IGMP_PACKETS) { + zlog_debug("Recv IGMP packet on interface: %s from a non-connected source: %pI4", + ifp->name, &ip_hdr->ip_src); + } + return 0; + } + pim_ifp = ifp->info; - ifaddr = pim_find_primary_addr(ifp); - igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->igmp_socket_list, - ifaddr); + ifaddr = connected_src->u.prefix4; + igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->igmp_socket_list, ifaddr); if (PIM_DEBUG_MROUTE) { - pim_inet4_dump("<src?>", ip_hdr->ip_src, ip_src_str, - sizeof(ip_src_str)); - pim_inet4_dump("<dst?>", ip_hdr->ip_dst, ip_dst_str, - sizeof(ip_dst_str)); - zlog_debug( - "%s(%s): igmp kernel upcall on %s(%p) for %s -> %s", + "%s(%s): igmp kernel upcall on %s(%p) for %pI4 -> %pI4", __func__, pim->vrf->name, ifp->name, igmp, - ip_src_str, ip_dst_str); + &ip_hdr->ip_src, &ip_hdr->ip_dst); } if (igmp) pim_igmp_packet(igmp, (char *)buf, buf_size); - + else if (PIM_DEBUG_IGMP_PACKETS) { + zlog_debug("No IGMP socket on interface: %s with connected source: %pFX", + ifp->name, connected_src); + } } else if (ip_hdr->ip_p) { if (PIM_DEBUG_MROUTE_DETAIL) { - pim_inet4_dump("<src?>", ip_hdr->ip_src, src_str, - sizeof(src_str)); - pim_inet4_dump("<grp?>", ip_hdr->ip_dst, grp_str, - sizeof(grp_str)); zlog_debug( - "%s: no kernel upcall proto=%d src: %s dst: %s msg_size=%d", - __func__, ip_hdr->ip_p, src_str, grp_str, + "%s: no kernel upcall proto=%d src: %pI4 dst: %pI4 msg_size=%d", + __func__, ip_hdr->ip_p, &ip_hdr->ip_src, &ip_hdr->ip_dst, buf_size); } @@ -656,15 +656,11 @@ static int pim_mroute_msg(struct pim_instance *pim, const char *buf, if (!ifp) return 0; if (PIM_DEBUG_MROUTE) { - pim_inet4_dump("<src?>", msg->im_src, src_str, - sizeof(src_str)); - pim_inet4_dump("<grp?>", msg->im_dst, grp_str, - sizeof(grp_str)); zlog_debug( - "%s: pim kernel upcall %s type=%d ip_p=%d from fd=%d for (S,G)=(%s,%s) on %s vifi=%d size=%d", + "%s: pim kernel upcall %s type=%d ip_p=%d from fd=%d for (S,G)=(%pI4,%pI4) on %s vifi=%d size=%d", __func__, igmpmsgtype2str[msg->im_msgtype], msg->im_msgtype, ip_hdr->ip_p, - pim->mroute_socket, src_str, grp_str, ifp->name, + pim->mroute_socket, &msg->im_src, &msg->im_dst, ifp->name, msg->im_vif, buf_size); } |
