summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_route.c1
-rw-r--r--docker/ubuntu-ci/Dockerfile1
-rw-r--r--ospf6d/ospf6_top.c144
-rw-r--r--ospfd/ospf_ext.c18
-rw-r--r--tests/topotests/all_protocol_startup/r1/ospf6d.conf4
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt1/ospf6d.conf4
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt2/ospf6d.conf4
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt3/ospf6d.conf4
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt4/ospf6d.conf4
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt5/ospf6d.conf4
-rw-r--r--tests/topotests/bfd_profiles_topo1/r4/ospf6d.conf2
-rw-r--r--tests/topotests/bfd_profiles_topo1/r5/ospf6d.conf2
-rw-r--r--tests/topotests/bgp_features/r1/ospf6d.conf6
-rw-r--r--tests/topotests/bgp_features/r2/ospf6d.conf6
-rw-r--r--tests/topotests/bgp_features/r3/ospf6d.conf6
-rw-r--r--tests/topotests/ospf6_topo1/r1/ospf6d.conf4
-rw-r--r--tests/topotests/ospf6_topo1/r2/ospf6d.conf4
-rw-r--r--tests/topotests/ospf6_topo1/r3/ospf6d.conf6
-rw-r--r--tests/topotests/ospf6_topo1/r4/ospf6d.conf4
-rw-r--r--tests/topotests/ospf_topo1/r1/ospf6d.conf6
-rw-r--r--tests/topotests/ospf_topo1/r2/ospf6d.conf4
-rw-r--r--tests/topotests/ospf_topo1/r3/ospf6d.conf6
-rw-r--r--tests/topotests/ospf_topo1/r4/ospf6d.conf4
-rw-r--r--zebra/rib.h1
-rw-r--r--zebra/zapi_msg.c25
-rw-r--r--zebra/zebra_rib.c64
26 files changed, 125 insertions, 213 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 9283055d9d..125a39d807 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -7595,7 +7595,6 @@ bool bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi,
*/
aggregate->count = 0;
aggregate->incomplete_origin_count = 0;
- aggregate->incomplete_origin_count = 0;
aggregate->egp_origin_count = 0;
/* ORIGIN attribute: If at least one route among routes that are
diff --git a/docker/ubuntu-ci/Dockerfile b/docker/ubuntu-ci/Dockerfile
index 939a43e4ea..1b3deb2750 100644
--- a/docker/ubuntu-ci/Dockerfile
+++ b/docker/ubuntu-ci/Dockerfile
@@ -45,6 +45,7 @@ RUN apt update && apt upgrade -y && \
apt-get install -y \
curl \
gdb \
+ kmod \
iproute2 \
iputils-ping \
liblua5.3-dev \
diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c
index ef312cbe3a..63672a96e7 100644
--- a/ospf6d/ospf6_top.c
+++ b/ospf6d/ospf6_top.c
@@ -1070,148 +1070,6 @@ DEFUN (no_ospf6_distance_ospf6,
return CMD_SUCCESS;
}
-DEFUN_HIDDEN (ospf6_interface_area,
- ospf6_interface_area_cmd,
- "interface IFNAME area <A.B.C.D|(0-4294967295)>",
- "Enable routing on an IPv6 interface\n"
- IFNAME_STR
- "Specify the OSPF6 area ID\n"
- "OSPF6 area ID in IPv4 address notation\n"
- "OSPF6 area ID in decimal notation\n"
- )
-{
- VTY_DECLVAR_CONTEXT(ospf6, ospf6);
- int idx_ifname = 1;
- int idx_ipv4 = 3;
- struct ospf6_area *oa;
- struct ospf6_interface *oi;
- struct interface *ifp;
- uint32_t area_id;
- int format;
-
- vty_out(vty,
- "This command is deprecated, because it is not VRF-aware.\n");
- vty_out(vty,
- "Please, use \"ipv6 ospf6 area\" on an interface instead.\n");
-
- /* find/create ospf6 interface */
- ifp = if_get_by_name(argv[idx_ifname]->arg, ospf6->vrf_id, ospf6->name);
- oi = (struct ospf6_interface *)ifp->info;
- if (oi == NULL)
- oi = ospf6_interface_create(ifp);
- if (oi->area) {
- vty_out(vty, "%s already attached to Area %s\n",
- oi->interface->name, oi->area->name);
- return CMD_SUCCESS;
- }
-
- if (str2area_id(argv[idx_ipv4]->arg, &area_id, &format)) {
- vty_out(vty, "Malformed Area-ID: %s\n", argv[idx_ipv4]->arg);
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- oi->area_id = area_id;
- oi->area_id_format = format;
-
- oa = ospf6_area_lookup(area_id, ospf6);
- if (oa == NULL)
- oa = ospf6_area_create(area_id, ospf6, format);
-
- /* attach interface to area */
- listnode_add(oa->if_list, oi); /* sort ?? */
- oi->area = oa;
-
- SET_FLAG(oa->flag, OSPF6_AREA_ENABLE);
-
- /* ospf6 process is currently disabled, not much more to do */
- if (CHECK_FLAG(ospf6->flag, OSPF6_DISABLED))
- return CMD_SUCCESS;
-
- /* start up */
- ospf6_interface_enable(oi);
-
- /* If the router is ABR, originate summary routes */
- if (ospf6_check_and_set_router_abr(ospf6)) {
- ospf6_abr_enable_area(oa);
- ospf6_schedule_abr_task(oa->ospf6);
- }
-
- return CMD_SUCCESS;
-}
-
-DEFUN_HIDDEN (no_ospf6_interface_area,
- no_ospf6_interface_area_cmd,
- "no interface IFNAME area <A.B.C.D|(0-4294967295)>",
- NO_STR
- "Disable routing on an IPv6 interface\n"
- IFNAME_STR
- "Specify the OSPF6 area ID\n"
- "OSPF6 area ID in IPv4 address notation\n"
- "OSPF6 area ID in decimal notation\n"
- )
-{
- VTY_DECLVAR_CONTEXT(ospf6, ospf6);
- int idx_ifname = 2;
- int idx_ipv4 = 4;
- struct ospf6_interface *oi;
- struct ospf6_area *oa;
- struct interface *ifp;
- uint32_t area_id;
-
- vty_out(vty,
- "This command is deprecated, because it is not VRF-aware.\n");
- vty_out(vty,
- "Please, use \"no ipv6 ospf6 area\" on an interface instead.\n");
-
- /* find/create ospf6 interface */
- ifp = if_get_by_name(argv[idx_ifname]->arg, ospf6->vrf_id, ospf6->name);
-
- if (ifp == NULL) {
- vty_out(vty, "No such interface %s\n", argv[idx_ifname]->arg);
- return CMD_SUCCESS;
- }
-
- oi = (struct ospf6_interface *)ifp->info;
- if (oi == NULL) {
- vty_out(vty, "Interface %s not enabled\n", ifp->name);
- return CMD_SUCCESS;
- }
-
- /* parse Area-ID */
- if (inet_pton(AF_INET, argv[idx_ipv4]->arg, &area_id) != 1)
- area_id = htonl(strtoul(argv[idx_ipv4]->arg, NULL, 10));
-
- /* Verify Area */
- if (oi->area == NULL) {
- vty_out(vty, "%s not attached to area %s\n",
- oi->interface->name, argv[idx_ipv4]->arg);
- return CMD_SUCCESS;
- }
-
- if (oi->area->area_id != area_id) {
- vty_out(vty, "Wrong Area-ID: %s is attached to area %s\n",
- oi->interface->name, oi->area->name);
- return CMD_SUCCESS;
- }
-
- ospf6_interface_disable(oi);
-
- oa = oi->area;
- listnode_delete(oi->area->if_list, oi);
- oi->area = (struct ospf6_area *)NULL;
-
- /* Withdraw inter-area routes from this area, if necessary */
- if (oa->if_list->count == 0) {
- UNSET_FLAG(oa->flag, OSPF6_AREA_ENABLE);
- ospf6_abr_disable_area(oa);
- }
-
- oi->area_id = 0;
- oi->area_id_format = OSPF6_AREA_FMT_UNSET;
-
- return CMD_SUCCESS;
-}
-
DEFUN (ospf6_stub_router_admin,
ospf6_stub_router_admin_cmd,
"stub-router administrative",
@@ -2360,8 +2218,6 @@ void ospf6_top_init(void)
install_element(OSPF6_NODE, &ospf6_timers_lsa_cmd);
install_element(OSPF6_NODE, &no_ospf6_timers_lsa_cmd);
- install_element(OSPF6_NODE, &ospf6_interface_area_cmd);
- install_element(OSPF6_NODE, &no_ospf6_interface_area_cmd);
install_element(OSPF6_NODE, &ospf6_stub_router_admin_cmd);
install_element(OSPF6_NODE, &no_ospf6_stub_router_admin_cmd);
diff --git a/ospfd/ospf_ext.c b/ospfd/ospf_ext.c
index 75b58035a3..d82c2146c7 100644
--- a/ospfd/ospf_ext.c
+++ b/ospfd/ospf_ext.c
@@ -1734,8 +1734,12 @@ static uint16_t show_vty_ext_link_adj_sid(struct vty *vty,
struct tlv_header *tlvh)
{
struct ext_subtlv_adj_sid *top = (struct ext_subtlv_adj_sid *)tlvh;
+ uint8_t tlv_size;
- check_tlv_size(EXT_SUBTLV_ADJ_SID_SIZE, "Adjacency SID");
+ tlv_size = CHECK_FLAG(top->flags, EXT_SUBTLV_LINK_ADJ_SID_VFLG)
+ ? SID_LABEL_SIZE(EXT_SUBTLV_ADJ_SID_SIZE)
+ : SID_INDEX_SIZE(EXT_SUBTLV_ADJ_SID_SIZE);
+ check_tlv_size(tlv_size, "Adjacency SID");
vty_out(vty,
" Adj-SID Sub-TLV: Length %u\n\tFlags: 0x%x\n\tMT-ID:0x%x\n\tWeight: 0x%x\n\t%s: %u\n",
@@ -1755,8 +1759,12 @@ static uint16_t show_vty_ext_link_lan_adj_sid(struct vty *vty,
{
struct ext_subtlv_lan_adj_sid *top =
(struct ext_subtlv_lan_adj_sid *)tlvh;
+ uint8_t tlv_size;
- check_tlv_size(EXT_SUBTLV_LAN_ADJ_SID_SIZE, "Lan-Adjacency SID");
+ tlv_size = CHECK_FLAG(top->flags, EXT_SUBTLV_LINK_ADJ_SID_VFLG)
+ ? SID_LABEL_SIZE(EXT_SUBTLV_LAN_ADJ_SID_SIZE)
+ : SID_INDEX_SIZE(EXT_SUBTLV_LAN_ADJ_SID_SIZE);
+ check_tlv_size(tlv_size, "LAN-Adjacency SID");
vty_out(vty,
" LAN-Adj-SID Sub-TLV: Length %u\n\tFlags: 0x%x\n\tMT-ID:0x%x\n\tWeight: 0x%x\n\tNeighbor ID: %pI4\n\t%s: %u\n",
@@ -1867,8 +1875,12 @@ static uint16_t show_vty_ext_pref_pref_sid(struct vty *vty,
{
struct ext_subtlv_prefix_sid *top =
(struct ext_subtlv_prefix_sid *)tlvh;
+ uint8_t tlv_size;
- check_tlv_size(EXT_SUBTLV_PREFIX_SID_SIZE, "Prefix SID");
+ tlv_size = CHECK_FLAG(top->flags, EXT_SUBTLV_PREFIX_SID_VFLG)
+ ? SID_LABEL_SIZE(EXT_SUBTLV_PREFIX_SID_SIZE)
+ : SID_INDEX_SIZE(EXT_SUBTLV_PREFIX_SID_SIZE);
+ check_tlv_size(tlv_size, "Prefix SID");
vty_out(vty,
" Prefix SID Sub-TLV: Length %u\n\tAlgorithm: %u\n\tFlags: 0x%x\n\tMT-ID:0x%x\n\t%s: %u\n",
diff --git a/tests/topotests/all_protocol_startup/r1/ospf6d.conf b/tests/topotests/all_protocol_startup/r1/ospf6d.conf
index 33c26501ba..31c904b415 100644
--- a/tests/topotests/all_protocol_startup/r1/ospf6d.conf
+++ b/tests/topotests/all_protocol_startup/r1/ospf6d.conf
@@ -6,12 +6,12 @@ log file ospf6d.log
! debug ospf6 neighbor
!
interface r1-eth4
- ipv6 ospf6 hello-interval 1
+ ipv6 ospf6 area 0.0.0.0
+ ipv6 ospf6 hello-interval 1
!
router ospf6
ospf6 router-id 192.168.0.1
log-adjacency-changes
- interface r1-eth4 area 0.0.0.0
!
line vty
!
diff --git a/tests/topotests/bfd_ospf_topo1/rt1/ospf6d.conf b/tests/topotests/bfd_ospf_topo1/rt1/ospf6d.conf
index 98da8c2619..a8ce562da2 100644
--- a/tests/topotests/bfd_ospf_topo1/rt1/ospf6d.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt1/ospf6d.conf
@@ -6,12 +6,14 @@ hostname rt1
password 1
!
interface eth-rt2
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
ipv6 ospf6 bfd
!
interface eth-rt3
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
@@ -19,7 +21,5 @@ interface eth-rt3
!
router ospf6
ospf6 router-id 1.1.1.1
- interface eth-rt2 area 0.0.0.0
- interface eth-rt3 area 0.0.0.0
redistribute connected
!
diff --git a/tests/topotests/bfd_ospf_topo1/rt2/ospf6d.conf b/tests/topotests/bfd_ospf_topo1/rt2/ospf6d.conf
index 34b0902094..f04d017681 100644
--- a/tests/topotests/bfd_ospf_topo1/rt2/ospf6d.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt2/ospf6d.conf
@@ -5,19 +5,19 @@ hostname rt2
password 1
!
interface eth-rt1
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
ipv6 ospf6 bfd
!
interface eth-rt5
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
!
router ospf6
ospf6 router-id 2.2.2.2
- interface eth-rt1 area 0.0.0.0
- interface eth-rt5 area 0.0.0.0
redistribute connected
!
diff --git a/tests/topotests/bfd_ospf_topo1/rt3/ospf6d.conf b/tests/topotests/bfd_ospf_topo1/rt3/ospf6d.conf
index 8ab4eee1d3..faf975497d 100644
--- a/tests/topotests/bfd_ospf_topo1/rt3/ospf6d.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt3/ospf6d.conf
@@ -5,19 +5,19 @@ hostname rt3
password 1
!
interface eth-rt1
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
ipv6 ospf6 bfd
!
interface eth-rt4
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
!
router ospf6
ospf6 router-id 3.3.3.3
- interface eth-rt1 area 0.0.0.0
- interface eth-rt4 area 0.0.0.0
redistribute connected
!
diff --git a/tests/topotests/bfd_ospf_topo1/rt4/ospf6d.conf b/tests/topotests/bfd_ospf_topo1/rt4/ospf6d.conf
index 138b688140..c96093b98a 100644
--- a/tests/topotests/bfd_ospf_topo1/rt4/ospf6d.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt4/ospf6d.conf
@@ -5,18 +5,18 @@ hostname rt4
password 1
!
interface eth-rt3
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
!
interface eth-rt5
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
!
router ospf6
ospf6 router-id 4.4.4.4
- interface eth-rt3 area 0.0.0.0
- interface eth-rt5 area 0.0.0.0
redistribute connected
!
diff --git a/tests/topotests/bfd_ospf_topo1/rt5/ospf6d.conf b/tests/topotests/bfd_ospf_topo1/rt5/ospf6d.conf
index 6eb4fe59a8..6d40d17d50 100644
--- a/tests/topotests/bfd_ospf_topo1/rt5/ospf6d.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt5/ospf6d.conf
@@ -5,18 +5,18 @@ hostname rt5
password 1
!
interface eth-rt2
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 network broadcast
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 8
!
interface eth-rt4
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 network broadcast
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 8
!
router ospf6
ospf6 router-id 5.5.5.5
- interface eth-rt2 area 0.0.0.0
- interface eth-rt4 area 0.0.0.0
redistribute connected
!
diff --git a/tests/topotests/bfd_profiles_topo1/r4/ospf6d.conf b/tests/topotests/bfd_profiles_topo1/r4/ospf6d.conf
index 4ef28c39ca..948874c0e5 100644
--- a/tests/topotests/bfd_profiles_topo1/r4/ospf6d.conf
+++ b/tests/topotests/bfd_profiles_topo1/r4/ospf6d.conf
@@ -1,4 +1,5 @@
interface r4-eth1
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 bfd profile fast-tx
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
@@ -6,5 +7,4 @@ interface r4-eth1
router ospf6
ospf6 router-id 10.254.254.4
redistribute connected
- interface r4-eth1 area 0.0.0.0
!
diff --git a/tests/topotests/bfd_profiles_topo1/r5/ospf6d.conf b/tests/topotests/bfd_profiles_topo1/r5/ospf6d.conf
index 20b53cfc55..f6e8dc3b67 100644
--- a/tests/topotests/bfd_profiles_topo1/r5/ospf6d.conf
+++ b/tests/topotests/bfd_profiles_topo1/r5/ospf6d.conf
@@ -1,4 +1,5 @@
interface r5-eth0
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 bfd
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
@@ -6,5 +7,4 @@ interface r5-eth0
router ospf6
ospf6 router-id 10.254.254.5
redistribute connected
- interface r5-eth0 area 0.0.0.0
!
diff --git a/tests/topotests/bgp_features/r1/ospf6d.conf b/tests/topotests/bgp_features/r1/ospf6d.conf
index 9afc6f4919..3e6196ecaf 100644
--- a/tests/topotests/bgp_features/r1/ospf6d.conf
+++ b/tests/topotests/bgp_features/r1/ospf6d.conf
@@ -3,19 +3,19 @@ log file ospf6d.log
! debug ospf6 neighbor
!
interface r1-lo
+ ipv6 ospf6 area 0.0.0.0
!
interface r1-eth1
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 priority 10
!
interface r1-eth2
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 priority 10
!
router ospf6
ospf6 router-id 192.168.0.1
log-adjacency-changes
- interface r1-lo area 0.0.0.0
- interface r1-eth1 area 0.0.0.0
- interface r1-eth2 area 0.0.0.0
!
line vty
!
diff --git a/tests/topotests/bgp_features/r2/ospf6d.conf b/tests/topotests/bgp_features/r2/ospf6d.conf
index 7fe535651e..56aecd006c 100644
--- a/tests/topotests/bgp_features/r2/ospf6d.conf
+++ b/tests/topotests/bgp_features/r2/ospf6d.conf
@@ -3,19 +3,19 @@ log file ospf6d.log
! debug ospf6 neighbor
!
interface r2-lo
+ ipv6 ospf6 area 0.0.0.0
!
interface r2-eth1
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 priority 5
!
interface r2-eth2
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 priority 10
!
router ospf6
ospf6 router-id 192.168.0.2
log-adjacency-changes
- interface r2-lo area 0.0.0.0
- interface r2-eth1 area 0.0.0.0
- interface r2-eth2 area 0.0.0.0
!
line vty
!
diff --git a/tests/topotests/bgp_features/r3/ospf6d.conf b/tests/topotests/bgp_features/r3/ospf6d.conf
index 07325b69b0..f15b9d9ea5 100644
--- a/tests/topotests/bgp_features/r3/ospf6d.conf
+++ b/tests/topotests/bgp_features/r3/ospf6d.conf
@@ -3,19 +3,19 @@ log file ospf6d.log
! debug ospf6 neighbor
!
interface r3-lo
+ ipv6 ospf6 area 0.0.0.0
!
interface r3-eth1
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 priority 5
!
interface r3-eth2
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 priority 5
!
router ospf6
ospf6 router-id 192.168.0.3
log-adjacency-changes
- interface r3-lo area 0.0.0.0
- interface r3-eth1 area 0.0.0.0
- interface r3-eth2 area 0.0.0.0
!
line vty
!
diff --git a/tests/topotests/ospf6_topo1/r1/ospf6d.conf b/tests/topotests/ospf6_topo1/r1/ospf6d.conf
index 5f1ceee964..d2693ec07d 100644
--- a/tests/topotests/ospf6_topo1/r1/ospf6d.conf
+++ b/tests/topotests/ospf6_topo1/r1/ospf6d.conf
@@ -10,11 +10,13 @@ log file ospf6d.log
! debug ospf6 flooding
!
interface r1-stubnet
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 network broadcast
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
!
interface r1-sw5
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 network broadcast
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
@@ -23,8 +25,6 @@ router ospf6
ospf6 router-id 10.0.0.1
log-adjacency-changes detail
redistribute static
- interface r1-stubnet area 0.0.0.0
- interface r1-sw5 area 0.0.0.0
!
line vty
exec-timeout 0 0
diff --git a/tests/topotests/ospf6_topo1/r2/ospf6d.conf b/tests/topotests/ospf6_topo1/r2/ospf6d.conf
index d51b41e1e5..c9e88f1545 100644
--- a/tests/topotests/ospf6_topo1/r2/ospf6d.conf
+++ b/tests/topotests/ospf6_topo1/r2/ospf6d.conf
@@ -10,11 +10,13 @@ log file ospf6d.log
! debug ospf6 flooding
!
interface r2-stubnet
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 network broadcast
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
!
interface r2-sw5
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 network broadcast
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
@@ -23,8 +25,6 @@ router ospf6
ospf6 router-id 10.0.0.2
log-adjacency-changes detail
redistribute static
- interface r2-stubnet area 0.0.0.0
- interface r2-sw5 area 0.0.0.0
!
line vty
exec-timeout 0 0
diff --git a/tests/topotests/ospf6_topo1/r3/ospf6d.conf b/tests/topotests/ospf6_topo1/r3/ospf6d.conf
index cad71ac067..e1c3e44d0e 100644
--- a/tests/topotests/ospf6_topo1/r3/ospf6d.conf
+++ b/tests/topotests/ospf6_topo1/r3/ospf6d.conf
@@ -10,16 +10,19 @@ log file ospf6d.log
! debug ospf6 flooding
!
interface r3-stubnet
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 network broadcast
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
!
interface r3-sw5
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 network broadcast
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
!
interface r3-sw6
+ ipv6 ospf6 area 0.0.0.1
ipv6 ospf6 network broadcast
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
@@ -28,9 +31,6 @@ router ospf6
ospf6 router-id 10.0.0.3
log-adjacency-changes detail
redistribute static
- interface r3-stubnet area 0.0.0.0
- interface r3-sw5 area 0.0.0.0
- interface r3-sw6 area 0.0.0.1
!
line vty
exec-timeout 0 0
diff --git a/tests/topotests/ospf6_topo1/r4/ospf6d.conf b/tests/topotests/ospf6_topo1/r4/ospf6d.conf
index f0b166bc4b..230ec7aad4 100644
--- a/tests/topotests/ospf6_topo1/r4/ospf6d.conf
+++ b/tests/topotests/ospf6_topo1/r4/ospf6d.conf
@@ -10,11 +10,13 @@ log file ospf6d.log
! debug ospf6 flooding
!
interface r4-stubnet
+ ipv6 ospf6 area 0.0.0.1
ipv6 ospf6 network broadcast
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
!
interface r4-sw6
+ ipv6 ospf6 area 0.0.0.1
ipv6 ospf6 network broadcast
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
@@ -23,8 +25,6 @@ router ospf6
ospf6 router-id 10.0.0.4
log-adjacency-changes detail
redistribute static
- interface r4-stubnet area 0.0.0.1
- interface r4-sw6 area 0.0.0.1
!
line vty
exec-timeout 0 0
diff --git a/tests/topotests/ospf_topo1/r1/ospf6d.conf b/tests/topotests/ospf_topo1/r1/ospf6d.conf
index ca3497b4a5..0e6c7dadfb 100644
--- a/tests/topotests/ospf_topo1/r1/ospf6d.conf
+++ b/tests/topotests/ospf_topo1/r1/ospf6d.conf
@@ -4,10 +4,12 @@ router ospf6
redistribute kernel
redistribute connected
redistribute static
- interface r1-eth0 area 0.0.0.0
- interface r1-eth1 area 0.0.0.0
+!
+interface r1-eth0
+ ipv6 ospf6 area 0.0.0.0
!
int r1-eth1
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 dead-interval 10
ipv6 ospf6 hello-interval 2
!
diff --git a/tests/topotests/ospf_topo1/r2/ospf6d.conf b/tests/topotests/ospf_topo1/r2/ospf6d.conf
index 44047e1a4e..f6a1f50530 100644
--- a/tests/topotests/ospf_topo1/r2/ospf6d.conf
+++ b/tests/topotests/ospf_topo1/r2/ospf6d.conf
@@ -4,14 +4,14 @@ router ospf6
redistribute kernel
redistribute connected
redistribute static
- interface r2-eth0 area 0.0.0.0
- interface r2-eth1 area 0.0.0.0
!
int r2-eth0
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
!
int r2-eth1
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
!
diff --git a/tests/topotests/ospf_topo1/r3/ospf6d.conf b/tests/topotests/ospf_topo1/r3/ospf6d.conf
index 13ad9a7356..278a016968 100644
--- a/tests/topotests/ospf_topo1/r3/ospf6d.conf
+++ b/tests/topotests/ospf_topo1/r3/ospf6d.conf
@@ -4,19 +4,19 @@ router ospf6
redistribute kernel
redistribute connected
redistribute static
- interface r3-eth0 area 0.0.0.0
- interface r3-eth1 area 0.0.0.0
- interface r3-eth2 area 0.0.0.1
!
int r3-eth0
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
!
int r3-eth1
+ ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
!
int r3-eth2
+ ipv6 ospf6 area 0.0.0.1
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
!
diff --git a/tests/topotests/ospf_topo1/r4/ospf6d.conf b/tests/topotests/ospf_topo1/r4/ospf6d.conf
index f9bde0e83c..777dd0b7b7 100644
--- a/tests/topotests/ospf_topo1/r4/ospf6d.conf
+++ b/tests/topotests/ospf_topo1/r4/ospf6d.conf
@@ -4,14 +4,14 @@ router ospf6
redistribute kernel
redistribute connected
redistribute static
- interface r4-eth0 area 0.0.0.1
- interface r4-eth1 area 0.0.0.1
!
int r4-eth0
+ ipv6 ospf6 area 0.0.0.1
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
!
int r4-eth1
+ ipv6 ospf6 area 0.0.0.1
ipv6 ospf6 hello-interval 2
ipv6 ospf6 dead-interval 10
!
diff --git a/zebra/rib.h b/zebra/rib.h
index 7ce6fbe609..61d9953d81 100644
--- a/zebra/rib.h
+++ b/zebra/rib.h
@@ -430,6 +430,7 @@ extern int rib_queue_nhg_ctx_add(struct nhg_ctx *ctx);
/* Enqueue incoming nhg from proto daemon for processing */
extern int rib_queue_nhe_add(struct nhg_hash_entry *nhe);
+extern int rib_queue_nhe_del(struct nhg_hash_entry *nhe);
/* Enqueue evpn route for processing */
int zebra_rib_queue_evpn_route_add(vrf_id_t vrf_id, const struct ethaddr *rmac,
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
index 2d1614ca54..761eafeb13 100644
--- a/zebra/zapi_msg.c
+++ b/zebra/zapi_msg.c
@@ -1959,20 +1959,19 @@ static void zread_nhg_del(ZAPI_HANDLER_ARGS)
return;
}
- /*
- * Delete the received nhg id
- */
- nhe = zebra_nhg_proto_del(api_nhg.id, api_nhg.proto);
+ /* Create a temporary nhe */
+ nhe = zebra_nhg_alloc();
+ nhe->id = api_nhg.id;
+ nhe->type = api_nhg.proto;
+ nhe->zapi_instance = client->instance;
+ nhe->zapi_session = client->session_id;
+
+ /* Sanity check - Empty nexthop and group */
+ nhe->nhg.nexthop = NULL;
+
+ /* Enqueue to workqueue for processing */
+ rib_queue_nhe_del(nhe);
- if (nhe) {
- zebra_nhg_decrement_ref(nhe);
- zsend_nhg_notify(api_nhg.proto, client->instance,
- client->session_id, api_nhg.id,
- ZAPI_NHG_REMOVED);
- } else
- zsend_nhg_notify(api_nhg.proto, client->instance,
- client->session_id, api_nhg.id,
- ZAPI_NHG_REMOVE_FAIL);
/* Stats */
client->nhg_del_cnt++;
}
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 0bcb21fd74..980fced8a7 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -186,6 +186,7 @@ struct wq_nhg_wrapper {
struct nhg_ctx *ctx;
struct nhg_hash_entry *nhe;
} u;
+ bool deletion;
};
#define WQ_NHG_WRAPPER_TYPE_CTX 0x01
@@ -339,7 +340,7 @@ static char *_dump_re_status(const struct route_entry *re, char *buf,
: "",
CHECK_FLAG(re->status, ROUTE_ENTRY_QUEUED) ? "Queued " : "",
CHECK_FLAG(re->status, ROUTE_ENTRY_ROUTE_REPLACING)
- ? "Replacing"
+ ? "Replacing "
: "",
CHECK_FLAG(re->status, ROUTE_ENTRY_INSTALLED) ? "Installed "
: "",
@@ -2531,7 +2532,7 @@ static void process_subq_evpn(struct listnode *lnode)
static void process_subq_nhg(struct listnode *lnode)
{
struct nhg_ctx *ctx;
- struct nhg_hash_entry *nhe, *newnhe;
+ struct nhg_hash_entry *nhe, *newnhe, *oldnhe;
struct wq_nhg_wrapper *w;
uint8_t qindex = META_QUEUE_NHG;
@@ -2563,15 +2564,33 @@ static void process_subq_nhg(struct listnode *lnode)
subqueue2str(qindex));
/* Process incoming nhg update, probably from a proto daemon */
- newnhe = zebra_nhg_proto_add(nhe->id, nhe->type,
- nhe->zapi_instance,
- nhe->zapi_session, &nhe->nhg, 0);
+ if (w->deletion) {
+ /*
+ * Delete the received nhg id
+ */
+ oldnhe = zebra_nhg_proto_del(nhe->id, nhe->type);
+ if (oldnhe) {
+ zsend_nhg_notify(nhe->type, nhe->zapi_instance,
+ nhe->zapi_session, nhe->id,
+ ZAPI_NHG_REMOVED);
+ zebra_nhg_decrement_ref(oldnhe);
+ } else
+ zsend_nhg_notify(nhe->type, nhe->zapi_instance,
+ nhe->zapi_session, nhe->id,
+ ZAPI_NHG_REMOVE_FAIL);
- /* Report error to daemon via ZAPI */
- if (newnhe == NULL)
- zsend_nhg_notify(nhe->type, nhe->zapi_instance,
- nhe->zapi_session, nhe->id,
- ZAPI_NHG_FAIL_INSTALL);
+ } else {
+ newnhe = zebra_nhg_proto_add(nhe->id, nhe->type,
+ nhe->zapi_instance,
+ nhe->zapi_session,
+ &nhe->nhg, 0);
+
+ /* Report error to daemon via ZAPI */
+ if (newnhe == NULL)
+ zsend_nhg_notify(nhe->type, nhe->zapi_instance,
+ nhe->zapi_session, nhe->id,
+ ZAPI_NHG_FAIL_INSTALL);
+ }
/* Free temp nhe - we own that memory. */
zebra_nhg_free(nhe);
@@ -3339,7 +3358,8 @@ static int rib_meta_queue_nhg_ctx_add(struct meta_queue *mq, void *data)
return 0;
}
-static int rib_meta_queue_nhg_add(struct meta_queue *mq, void *data)
+static int rib_meta_queue_nhg_process(struct meta_queue *mq, void *data,
+ bool deletion)
{
struct nhg_hash_entry *nhe = NULL;
uint8_t qindex = META_QUEUE_NHG;
@@ -3354,6 +3374,7 @@ static int rib_meta_queue_nhg_add(struct meta_queue *mq, void *data)
w->type = WQ_NHG_WRAPPER_TYPE_NHG;
w->u.nhe = nhe;
+ w->deletion = deletion;
listnode_add(mq->subq[qindex], w);
mq->size++;
@@ -3365,6 +3386,16 @@ static int rib_meta_queue_nhg_add(struct meta_queue *mq, void *data)
return 0;
}
+static int rib_meta_queue_nhg_add(struct meta_queue *mq, void *data)
+{
+ return rib_meta_queue_nhg_process(mq, data, false);
+}
+
+static int rib_meta_queue_nhg_del(struct meta_queue *mq, void *data)
+{
+ return rib_meta_queue_nhg_process(mq, data, true);
+}
+
static int rib_meta_queue_evpn_add(struct meta_queue *mq, void *data)
{
listnode_add(mq->subq[META_QUEUE_EVPN], data);
@@ -3473,6 +3504,17 @@ int rib_queue_nhe_add(struct nhg_hash_entry *nhe)
}
/*
+ * Enqueue incoming nhg from proto daemon for processing
+ */
+int rib_queue_nhe_del(struct nhg_hash_entry *nhe)
+{
+ if (nhe == NULL)
+ return -1;
+
+ return mq_add_handler(nhe, rib_meta_queue_nhg_del);
+}
+
+/*
* Enqueue evpn route for processing
*/
int zebra_rib_queue_evpn_route_add(vrf_id_t vrf_id, const struct ethaddr *rmac,