summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_attr.c14
-rw-r--r--bgpd/bgp_packet.c43
-rw-r--r--doc/user/overview.rst2
-rw-r--r--tests/topotests/bgp_as_wide_bgp_identifier/__init__.py0
-rw-r--r--tests/topotests/bgp_as_wide_bgp_identifier/r1/bgpd.conf5
-rw-r--r--tests/topotests/bgp_as_wide_bgp_identifier/r1/zebra.conf6
-rw-r--r--tests/topotests/bgp_as_wide_bgp_identifier/r2/bgpd.conf6
-rw-r--r--tests/topotests/bgp_as_wide_bgp_identifier/r2/zebra.conf6
-rw-r--r--tests/topotests/bgp_as_wide_bgp_identifier/r3/bgpd.conf5
-rw-r--r--tests/topotests/bgp_as_wide_bgp_identifier/r3/zebra.conf6
-rw-r--r--tests/topotests/bgp_as_wide_bgp_identifier/test_bgp_as_wide_bgp_identifier.py118
-rw-r--r--yang/frr-route-map.yang2
-rw-r--r--zebra/main.c1
-rw-r--r--zebra/rtadv.c161
-rw-r--r--zebra/rtadv.h3
-rw-r--r--zebra/zebra_vrf.c2
-rw-r--r--zebra/zebra_vxlan.c2
17 files changed, 307 insertions, 75 deletions
diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c
index 221386e38d..8cb7a07f42 100644
--- a/bgpd/bgp_attr.c
+++ b/bgpd/bgp_attr.c
@@ -152,10 +152,16 @@ static bool cluster_hash_cmp(const void *p1, const void *p2)
const struct cluster_list *cluster1 = p1;
const struct cluster_list *cluster2 = p2;
- return (cluster1->length == cluster2->length
- && (cluster1->list == cluster2->list
- || memcmp(cluster1->list, cluster2->list, cluster1->length)
- == 0));
+ if (cluster1->list == cluster2->list)
+ return true;
+
+ if (!cluster1->list || !cluster2->list)
+ return false;
+
+ if (cluster1->length != cluster2->length)
+ return false;
+
+ return (memcmp(cluster1->list, cluster2->list, cluster1->length) == 0);
}
static void cluster_free(struct cluster_list *cluster)
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index 3ede2ce9fb..7137c1a784 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -974,14 +974,21 @@ static int bgp_collision_detect(struct peer *new, struct in_addr remote_id)
return -1;
} else if ((peer->status == OpenConfirm)
|| (peer->status == OpenSent)) {
- /* 1. The BGP Identifier of the local system is compared
- to
- the BGP Identifier of the remote system (as specified
- in
- the OPEN message). */
-
+ /* 1. The BGP Identifier of the local system is
+ * compared to the BGP Identifier of the remote
+ * system (as specified in the OPEN message).
+ *
+ * If the BGP Identifiers of the peers
+ * involved in the connection collision
+ * are identical, then the connection
+ * initiated by the BGP speaker with the
+ * larger AS number is preserved.
+ */
if (ntohl(peer->local_id.s_addr)
- < ntohl(remote_id.s_addr))
+ < ntohl(remote_id.s_addr)
+ || (ntohl(peer->local_id.s_addr)
+ == ntohl(remote_id.s_addr)
+ && peer->local_as < peer->as))
if (!CHECK_FLAG(peer->sflags,
PEER_STATUS_ACCEPT_PEER)) {
/* 2. If the value of the local BGP
@@ -1005,10 +1012,13 @@ static int bgp_collision_detect(struct peer *new, struct in_addr remote_id)
return -1;
}
else {
- if (ntohl(peer->local_id.s_addr) ==
- ntohl(remote_id.s_addr))
- flog_err(EC_BGP_ROUTER_ID_SAME, "Peer's router-id %s is the same as ours",
- inet_ntoa(remote_id));
+ if (ntohl(peer->local_id.s_addr)
+ == ntohl(remote_id.s_addr)
+ && peer->local_as == peer->as)
+ flog_err(
+ EC_BGP_ROUTER_ID_SAME,
+ "Peer's router-id %s is the same as ours",
+ inet_ntoa(remote_id));
/* 3. Otherwise, the local system closes newly
created
@@ -1197,10 +1207,17 @@ static int bgp_open_receive(struct peer *peer, bgp_size_t size)
}
}
- /* remote router-id check. */
+ /* rfc6286:
+ * If the BGP Identifier field of the OPEN message
+ * is zero, or if it is the same as the BGP Identifier
+ * of the local BGP speaker and the message is from an
+ * internal peer, then the Error Subcode is set to
+ * "Bad BGP Identifier".
+ */
if (remote_id.s_addr == INADDR_ANY
|| IPV4_CLASS_DE(ntohl(remote_id.s_addr))
- || ntohl(peer->local_id.s_addr) == ntohl(remote_id.s_addr)) {
+ || (peer->sort == BGP_PEER_IBGP
+ && ntohl(peer->local_id.s_addr) == ntohl(remote_id.s_addr))) {
if (bgp_debug_neighbor_events(peer))
zlog_debug("%s bad OPEN, wrong router identifier %s",
peer->host, inet_ntoa(remote_id));
diff --git a/doc/user/overview.rst b/doc/user/overview.rst
index c9934d1c68..cf8cc44097 100644
--- a/doc/user/overview.rst
+++ b/doc/user/overview.rst
@@ -300,6 +300,8 @@ BGP
:t:`The Generalized TTL Security Mechanism (GTSM). V. Gill, J. Heasley, D. Meyer, P. Savola, C. Pingnataro. October 2007.`
- :rfc:`5575`
:t:`Dissemination of Flow Specification Rules. P. Marques, N. Sheth, R. Raszuk, B. Greene, J. Mauch, D. McPherson. August 2009`
+- :rfc:`6286`
+ :t:`Autonomous-System-Wide Unique BGP Identifier for BGP-4. E. Chen, J. Yuan, June 2011.`
- :rfc:`6608`
:t:`Subcodes for BGP Finite State Machine Error. J. Dong, M. Chen, Huawei Technologies, A. Suryanarayana, Cisco Systems. May 2012.`
- :rfc:`6810`
diff --git a/tests/topotests/bgp_as_wide_bgp_identifier/__init__.py b/tests/topotests/bgp_as_wide_bgp_identifier/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/topotests/bgp_as_wide_bgp_identifier/__init__.py
diff --git a/tests/topotests/bgp_as_wide_bgp_identifier/r1/bgpd.conf b/tests/topotests/bgp_as_wide_bgp_identifier/r1/bgpd.conf
new file mode 100644
index 0000000000..fc273ba7c6
--- /dev/null
+++ b/tests/topotests/bgp_as_wide_bgp_identifier/r1/bgpd.conf
@@ -0,0 +1,5 @@
+! exit1
+router bgp 65001
+ bgp router-id 10.10.10.10
+ neighbor 192.168.255.1 remote-as 65002
+!
diff --git a/tests/topotests/bgp_as_wide_bgp_identifier/r1/zebra.conf b/tests/topotests/bgp_as_wide_bgp_identifier/r1/zebra.conf
new file mode 100644
index 0000000000..c060e1402e
--- /dev/null
+++ b/tests/topotests/bgp_as_wide_bgp_identifier/r1/zebra.conf
@@ -0,0 +1,6 @@
+! exit1
+interface r1-eth0
+ ip address 192.168.255.2/24
+!
+ip forwarding
+!
diff --git a/tests/topotests/bgp_as_wide_bgp_identifier/r2/bgpd.conf b/tests/topotests/bgp_as_wide_bgp_identifier/r2/bgpd.conf
new file mode 100644
index 0000000000..1134d98b38
--- /dev/null
+++ b/tests/topotests/bgp_as_wide_bgp_identifier/r2/bgpd.conf
@@ -0,0 +1,6 @@
+! spine
+router bgp 65002
+ bgp router-id 10.10.10.10
+ neighbor 192.168.255.2 remote-as 65001
+ neighbor 192.168.255.3 remote-as 65002
+!
diff --git a/tests/topotests/bgp_as_wide_bgp_identifier/r2/zebra.conf b/tests/topotests/bgp_as_wide_bgp_identifier/r2/zebra.conf
new file mode 100644
index 0000000000..a45520f97f
--- /dev/null
+++ b/tests/topotests/bgp_as_wide_bgp_identifier/r2/zebra.conf
@@ -0,0 +1,6 @@
+! spine
+interface r2-eth0
+ ip address 192.168.255.1/24
+!
+ip forwarding
+!
diff --git a/tests/topotests/bgp_as_wide_bgp_identifier/r3/bgpd.conf b/tests/topotests/bgp_as_wide_bgp_identifier/r3/bgpd.conf
new file mode 100644
index 0000000000..fa943d10c3
--- /dev/null
+++ b/tests/topotests/bgp_as_wide_bgp_identifier/r3/bgpd.conf
@@ -0,0 +1,5 @@
+! exit2
+router bgp 65002
+ bgp router-id 10.10.10.10
+ neighbor 192.168.255.1 remote-as 65002
+!
diff --git a/tests/topotests/bgp_as_wide_bgp_identifier/r3/zebra.conf b/tests/topotests/bgp_as_wide_bgp_identifier/r3/zebra.conf
new file mode 100644
index 0000000000..2f4dbc5efd
--- /dev/null
+++ b/tests/topotests/bgp_as_wide_bgp_identifier/r3/zebra.conf
@@ -0,0 +1,6 @@
+! exit2
+interface r3-eth0
+ ip address 192.168.255.3/24
+!
+ip forwarding
+!
diff --git a/tests/topotests/bgp_as_wide_bgp_identifier/test_bgp_as_wide_bgp_identifier.py b/tests/topotests/bgp_as_wide_bgp_identifier/test_bgp_as_wide_bgp_identifier.py
new file mode 100644
index 0000000000..55021aaa09
--- /dev/null
+++ b/tests/topotests/bgp_as_wide_bgp_identifier/test_bgp_as_wide_bgp_identifier.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+
+#
+# test_bgp_as_wide_bgp_identifier.py
+# Part of NetDEF Topology Tests
+#
+# Copyright (c) 2020 by
+# Donatas Abraitis <donatas.abraitis@gmail.com>
+#
+# Permission to use, copy, modify, and/or distribute this software
+# for any purpose with or without fee is hereby granted, provided
+# that the above copyright notice and this permission notice appear
+# in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
+# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+# OF THIS SOFTWARE.
+#
+
+"""
+rfc6286: Autonomous-System-Wide Unique BGP Identifier for BGP-4
+Test if 'Bad BGP Identifier' notification is sent only to
+internal peers (autonomous-system-wide). eBGP peers are not
+affected and should work.
+"""
+
+import os
+import sys
+import json
+import time
+import pytest
+import functools
+
+CWD = os.path.dirname(os.path.realpath(__file__))
+sys.path.append(os.path.join(CWD, '../'))
+
+# pylint: disable=C0413
+from lib import topotest
+from lib.topogen import Topogen, TopoRouter, get_topogen
+from lib.topolog import logger
+from mininet.topo import Topo
+
+class TemplateTopo(Topo):
+ def build(self, *_args, **_opts):
+ tgen = get_topogen(self)
+
+ for routern in range(1, 4):
+ tgen.add_router('r{}'.format(routern))
+
+ switch = tgen.add_switch('s1')
+ switch.add_link(tgen.gears['r1'])
+ switch.add_link(tgen.gears['r2'])
+ switch.add_link(tgen.gears['r3'])
+
+def setup_module(mod):
+ tgen = Topogen(TemplateTopo, mod.__name__)
+ tgen.start_topology()
+
+ router_list = tgen.routers()
+
+ for i, (rname, router) in enumerate(router_list.iteritems(), 1):
+ router.load_config(
+ TopoRouter.RD_ZEBRA,
+ os.path.join(CWD, '{}/zebra.conf'.format(rname))
+ )
+ router.load_config(
+ TopoRouter.RD_BGP,
+ os.path.join(CWD, '{}/bgpd.conf'.format(rname))
+ )
+
+ tgen.start_router()
+
+def teardown_module(mod):
+ tgen = get_topogen()
+ tgen.stop_topology()
+
+def test_bgp_as_wide_bgp_identifier():
+ tgen = get_topogen()
+
+ if tgen.routers_have_failure():
+ pytest.skip(tgen.errors)
+
+ def _bgp_converge(router):
+ output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
+ expected = {
+ '192.168.255.1': {
+ 'bgpState': 'Established'
+ }
+ }
+ return topotest.json_cmp(output, expected)
+
+ def _bgp_failed(router):
+ output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
+ expected = {
+ '192.168.255.1': {
+ 'lastNotificationReason': 'OPEN Message Error/Bad BGP Identifier'
+ }
+ }
+ return topotest.json_cmp(output, expected)
+
+ test_func = functools.partial(_bgp_converge, tgen.gears['r1'])
+ success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
+
+ assert result is None, 'Failed to converge: "{}"'.format(tgen.gears['r1'])
+
+ test_func = functools.partial(_bgp_failed, tgen.gears['r3'])
+ success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
+
+ assert result is None, 'Bad BGP Identifier notification not sent: "{}"'.format(tgen.gears['r3'])
+
+if __name__ == '__main__':
+ args = ["-s"] + sys.argv[1:]
+ sys.exit(pytest.main(args))
diff --git a/yang/frr-route-map.yang b/yang/frr-route-map.yang
index eea29733a3..106593d9d3 100644
--- a/yang/frr-route-map.yang
+++ b/yang/frr-route-map.yang
@@ -210,7 +210,7 @@ module frr-route-map {
case interface {
when "./condition = 'interface'";
leaf interface {
- type frr-interface:interface-ref;
+ type string;
}
}
case access-list-num {
diff --git a/zebra/main.c b/zebra/main.c
index 4673ec53e4..306372ccdb 100644
--- a/zebra/main.c
+++ b/zebra/main.c
@@ -174,6 +174,7 @@ static void sigint(void)
work_queue_free_and_null(&zrouter.lsp_process_q);
vrf_terminate();
+ rtadv_terminate();
ns_walk_func(zebra_ns_early_shutdown);
zebra_ns_notify_close();
diff --git a/zebra/rtadv.c b/zebra/rtadv.c
index 60ac471b5a..a22e39dc48 100644
--- a/zebra/rtadv.c
+++ b/zebra/rtadv.c
@@ -204,9 +204,12 @@ static void rtadv_send_packet(int sock, struct interface *ifp,
}
/* Logging of packet. */
- if (IS_ZEBRA_DEBUG_PACKET)
- zlog_debug("%s(%u): Tx RA, socket %u", ifp->name, ifp->ifindex,
- sock);
+ if (IS_ZEBRA_DEBUG_PACKET) {
+ struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id);
+
+ zlog_debug("%s(%s:%u): Tx RA, socket %u", ifp->name,
+ VRF_LOGNAME(vrf), ifp->ifindex, sock);
+ }
/* Fill in sockaddr_in6. */
memset(&addr, 0, sizeof(struct sockaddr_in6));
@@ -333,16 +336,6 @@ static void rtadv_send_packet(int sock, struct interface *ifp,
IPV6_ADDR_COPY(&pinfo->nd_opt_pi_prefix,
&rprefix->prefix.prefix);
-#ifdef DEBUG
- {
- uint8_t buf[INET6_ADDRSTRLEN];
-
- zlog_debug("DEBUG %s",
- inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix,
- buf, INET6_ADDRSTRLEN));
- }
-#endif /* DEBUG */
-
len += sizeof(struct nd_opt_prefix_info);
}
@@ -388,9 +381,11 @@ static void rtadv_send_packet(int sock, struct interface *ifp,
sizeof(struct nd_opt_rdnss) + sizeof(struct in6_addr);
if (len + opt_len > max_len) {
+ struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id);
+
zlog_warn(
- "%s(%u): Tx RA: RDNSS option would exceed MTU, omitting it",
- ifp->name, ifp->ifindex);
+ "%s(%s:%u): Tx RA: RDNSS option would exceed MTU, omitting it",
+ ifp->name, VRF_LOGNAME(vrf), ifp->ifindex);
goto no_more_opts;
}
struct nd_opt_rdnss *opt = (struct nd_opt_rdnss *)(buf + len);
@@ -510,10 +505,17 @@ static int rtadv_timer(struct thread *thread)
<= 0)
zif->rtadv.inFastRexmit = 0;
- if (IS_ZEBRA_DEBUG_SEND)
+ if (IS_ZEBRA_DEBUG_SEND) {
+ struct vrf *vrf =
+ vrf_lookup_by_id(
+ ifp->vrf_id);
+
zlog_debug(
- "Fast RA Rexmit on interface %s",
- ifp->name);
+ "Fast RA Rexmit on interface %s(%s:%u)",
+ ifp->name,
+ VRF_LOGNAME(vrf),
+ ifp->ifindex);
+ }
rtadv_send_packet(rtadv_get_socket(zvrf),
ifp, RA_ENABLE);
@@ -612,9 +614,14 @@ static void rtadv_process_advert(uint8_t *msg, unsigned int len,
inet_ntop(AF_INET6, &addr->sin6_addr, addr_str, INET6_ADDRSTRLEN);
if (len < sizeof(struct nd_router_advert)) {
- if (IS_ZEBRA_DEBUG_PACKET)
- zlog_debug("%s(%u): Rx RA with invalid length %d from %s",
- ifp->name, ifp->ifindex, len, addr_str);
+ if (IS_ZEBRA_DEBUG_PACKET) {
+ struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id);
+
+ zlog_debug(
+ "%s(%s:%u): Rx RA with invalid length %d from %s",
+ ifp->name, VRF_LOGNAME(vrf), ifp->ifindex, len,
+ addr_str);
+ }
return;
}
@@ -622,9 +629,14 @@ static void rtadv_process_advert(uint8_t *msg, unsigned int len,
rtadv_process_optional(msg + sizeof(struct nd_router_advert),
len - sizeof(struct nd_router_advert),
ifp, addr);
- if (IS_ZEBRA_DEBUG_PACKET)
- zlog_debug("%s(%u): Rx RA with non-linklocal source address from %s",
- ifp->name, ifp->ifindex, addr_str);
+ if (IS_ZEBRA_DEBUG_PACKET) {
+ struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id);
+
+ zlog_debug(
+ "%s(%s:%u): Rx RA with non-linklocal source address from %s",
+ ifp->name, VRF_LOGNAME(vrf), ifp->ifindex,
+ addr_str);
+ }
return;
}
@@ -703,9 +715,12 @@ static void rtadv_process_packet(uint8_t *buf, unsigned int len,
return;
}
- if (IS_ZEBRA_DEBUG_PACKET)
- zlog_debug("%s(%u): Rx RA/RS len %d from %s", ifp->name,
- ifp->ifindex, len, addr_str);
+ if (IS_ZEBRA_DEBUG_PACKET) {
+ struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id);
+
+ zlog_debug("%s(%s:%u): Rx RA/RS len %d from %s", ifp->name,
+ VRF_LOGNAME(vrf), ifp->ifindex, len, addr_str);
+ }
if (if_is_loopback(ifp)
|| CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK))
@@ -718,8 +733,11 @@ static void rtadv_process_packet(uint8_t *buf, unsigned int len,
/* ICMP message length check. */
if (len < sizeof(struct icmp6_hdr)) {
- zlog_debug("%s(%u): Rx RA with Invalid ICMPV6 packet length %d",
- ifp->name, ifp->ifindex, len);
+ struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id);
+
+ zlog_debug(
+ "%s(%s:%u): Rx RA with Invalid ICMPV6 packet length %d",
+ ifp->name, VRF_LOGNAME(vrf), ifp->ifindex, len);
return;
}
@@ -728,15 +746,20 @@ static void rtadv_process_packet(uint8_t *buf, unsigned int len,
/* ICMP message type check. */
if (icmph->icmp6_type != ND_ROUTER_SOLICIT
&& icmph->icmp6_type != ND_ROUTER_ADVERT) {
- zlog_debug("%s(%u): Rx RA - Unwanted ICMPV6 message type %d",
- ifp->name, ifp->ifindex, icmph->icmp6_type);
+ struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id);
+
+ zlog_debug("%s(%s:%u): Rx RA - Unwanted ICMPV6 message type %d",
+ ifp->name, VRF_LOGNAME(vrf), ifp->ifindex,
+ icmph->icmp6_type);
return;
}
/* Hoplimit check. */
if (hoplimit >= 0 && hoplimit != 255) {
- zlog_debug("%s(%u): Rx RA - Invalid hoplimit %d", ifp->name,
- ifp->ifindex, hoplimit);
+ struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id);
+
+ zlog_debug("%s(%s:%u): Rx RA - Invalid hoplimit %d", ifp->name,
+ VRF_LOGNAME(vrf), ifp->ifindex, hoplimit);
return;
}
@@ -1055,25 +1078,34 @@ static void zebra_interface_radv_set(ZAPI_HANDLER_ARGS, int enable)
unsigned int ra_interval = ra_interval_rxd;
- if (IS_ZEBRA_DEBUG_EVENT)
- zlog_debug("%u: IF %u RA %s from client %s, interval %ums",
- zvrf_id(zvrf), ifindex,
+ if (IS_ZEBRA_DEBUG_EVENT) {
+ struct vrf *vrf = zvrf->vrf;
+
+ zlog_debug("%s:%u: IF %u RA %s from client %s, interval %ums",
+ VRF_LOGNAME(vrf), zvrf_id(zvrf), ifindex,
enable ? "enable" : "disable",
zebra_route_string(client->proto), ra_interval);
+ }
/* Locate interface and check VRF match. */
ifp = if_lookup_by_index(ifindex, zvrf->vrf->vrf_id);
if (!ifp) {
+ struct vrf *vrf = zvrf->vrf;
+
flog_warn(EC_ZEBRA_UNKNOWN_INTERFACE,
- "%u: IF %u RA %s client %s - interface unknown",
- zvrf_id(zvrf), ifindex, enable ? "enable" : "disable",
+ "%s:%u: IF %u RA %s client %s - interface unknown",
+ VRF_LOGNAME(vrf), zvrf_id(zvrf), ifindex,
+ enable ? "enable" : "disable",
zebra_route_string(client->proto));
return;
}
if (ifp->vrf_id != zvrf_id(zvrf)) {
+ struct vrf *vrf = zvrf->vrf;
+
zlog_debug(
- "%u: IF %u RA %s client %s - VRF mismatch, IF VRF %u",
- zvrf_id(zvrf), ifindex, enable ? "enable" : "disable",
+ "%s:%u: IF %u RA %s client %s - VRF mismatch, IF VRF %u",
+ VRF_LOGNAME(vrf), zvrf_id(zvrf), ifindex,
+ enable ? "enable" : "disable",
zebra_route_string(client->proto), ifp->vrf_id);
return;
}
@@ -2329,6 +2361,13 @@ static void rtadv_event(struct zebra_vrf *zvrf, enum rtadv_event event, int val)
{
struct rtadv *rtadv = &zvrf->rtadv;
+ if (IS_ZEBRA_DEBUG_EVENT) {
+ struct vrf *vrf = zvrf->vrf;
+
+ zlog_debug("%s(%s) with event: %d and val: %d", __func__,
+ VRF_LOGNAME(vrf), event, val);
+ }
+
switch (event) {
case RTADV_START:
thread_add_read(zrouter.master, rtadv_read, zvrf, val,
@@ -2371,20 +2410,26 @@ void rtadv_init(struct zebra_vrf *zvrf)
}
}
-void rtadv_terminate(struct zebra_vrf *zvrf)
+void rtadv_vrf_terminate(struct zebra_vrf *zvrf)
{
rtadv_event(zvrf, RTADV_STOP, 0);
if (zvrf->rtadv.sock >= 0) {
close(zvrf->rtadv.sock);
zvrf->rtadv.sock = -1;
- } else if (zrouter.rtadv_sock >= 0) {
- close(zrouter.rtadv_sock);
- zrouter.rtadv_sock = -1;
}
+
zvrf->rtadv.adv_if_count = 0;
zvrf->rtadv.adv_msec_if_count = 0;
}
+void rtadv_terminate(void)
+{
+ if (zrouter.rtadv_sock >= 0) {
+ close(zrouter.rtadv_sock);
+ zrouter.rtadv_sock = -1;
+ }
+}
+
void rtadv_cmd_init(void)
{
hook_register(zebra_if_extra_info, nd_dump_vty);
@@ -2445,10 +2490,13 @@ static int if_join_all_router(int sock, struct interface *ifp)
ifp->name, ifp->ifindex, sock,
safe_strerror(errno));
- if (IS_ZEBRA_DEBUG_EVENT)
+ if (IS_ZEBRA_DEBUG_EVENT) {
+ struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id);
+
zlog_debug(
- "%s(%u): Join All-Routers multicast group, socket %u",
- ifp->name, ifp->ifindex, sock);
+ "%s(%s:%u): Join All-Routers multicast group, socket %u",
+ ifp->name, VRF_LOGNAME(vrf), ifp->ifindex, sock);
+ }
return 0;
}
@@ -2465,17 +2513,22 @@ static int if_leave_all_router(int sock, struct interface *ifp)
ret = setsockopt(sock, IPPROTO_IPV6, IPV6_LEAVE_GROUP, (char *)&mreq,
sizeof(mreq));
- if (ret < 0)
+ if (ret < 0) {
+ struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id);
+
flog_err_sys(
EC_LIB_SOCKET,
- "%s(%u): Failed to leave group, socket %u error %s",
- ifp->name, ifp->ifindex, sock, safe_strerror(errno));
+ "%s(%s:%u): Failed to leave group, socket %u error %s",
+ ifp->name, VRF_LOGNAME(vrf), ifp->ifindex, sock,
+ safe_strerror(errno));
+ }
+ if (IS_ZEBRA_DEBUG_EVENT) {
+ struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id);
- if (IS_ZEBRA_DEBUG_EVENT)
zlog_debug(
- "%s(%u): Leave All-Routers multicast group, socket %u",
- ifp->name, ifp->ifindex, sock);
-
+ "%s(%s:%u): Leave All-Routers multicast group, socket %u",
+ ifp->name, VRF_LOGNAME(vrf), ifp->ifindex, sock);
+ }
return 0;
}
diff --git a/zebra/rtadv.h b/zebra/rtadv.h
index 64b28cbfd6..68a5bbcdbe 100644
--- a/zebra/rtadv.h
+++ b/zebra/rtadv.h
@@ -153,7 +153,8 @@ typedef enum {
} ipv6_nd_suppress_ra_status;
extern void rtadv_init(struct zebra_vrf *zvrf);
-extern void rtadv_terminate(struct zebra_vrf *zvrf);
+extern void rtadv_vrf_terminate(struct zebra_vrf *zvrf);
+extern void rtadv_terminate(void);
extern void rtadv_stop_ra(struct interface *ifp);
extern void rtadv_stop_ra_all(void);
extern void rtadv_cmd_init(void);
diff --git a/zebra/zebra_vrf.c b/zebra/zebra_vrf.c
index dfa7d5ae92..ee1e251a69 100644
--- a/zebra/zebra_vrf.c
+++ b/zebra/zebra_vrf.c
@@ -178,7 +178,7 @@ static int zebra_vrf_disable(struct vrf *vrf)
zebra_vxlan_vrf_disable(zvrf);
#if defined(HAVE_RTADV)
- rtadv_terminate(zvrf);
+ rtadv_vrf_terminate(zvrf);
#endif
/* Inform clients that the VRF is now inactive. This is a
diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c
index aa2e5c91c9..2342641270 100644
--- a/zebra/zebra_vxlan.c
+++ b/zebra/zebra_vxlan.c
@@ -10259,7 +10259,7 @@ static int zebra_evpn_pim_cfg_clean_up(struct zserv *client)
{
struct zebra_vrf *zvrf = zebra_vrf_get_evpn();
- if (CHECK_FLAG(zvrf->flags, ZEBRA_PIM_SEND_VXLAN_SG)) {
+ if (zvrf && CHECK_FLAG(zvrf->flags, ZEBRA_PIM_SEND_VXLAN_SG)) {
if (IS_ZEBRA_DEBUG_VXLAN)
zlog_debug("VxLAN SG updates to PIM, stop");
UNSET_FLAG(zvrf->flags, ZEBRA_PIM_SEND_VXLAN_SG);