summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.md2
-rw-r--r--doc/user/conf.py27
-rw-r--r--ospfd/ospf_ext.c8
-rw-r--r--ospfd/ospf_ri.c23
-rw-r--r--ospfd/ospf_sr.c44
-rw-r--r--pimd/pim_iface.c8
-rw-r--r--pimd/pim_iface.h2
-rw-r--r--pimd/pim_igmp.c12
-rw-r--r--pimd/pim_mroute.c50
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);
}