fib: fix dpo-receive address in ip6-ll fibs 42/37242/5
authorVladislav Grishenko <themiron@yandex-team.ru>
Sun, 15 May 2022 20:44:43 +0000 (01:44 +0500)
committerNeale Ranns <neale@graphiant.com>
Fri, 30 Sep 2022 03:49:49 +0000 (03:49 +0000)
Need to fill frp_addr for local path, it's used by dpo-receive.
If not, address output can be invalid:

$ sudo vppctl sh ip6-ll fe80::dcad:ff:fe00:3/128
IP6-link-local:loop3, fib_index:2, locks:[IPv6-nd:1, ]
fe80::dcad:ff:fe00:3/128 fib:2 index:55 locks:2
  IPv6-nd refs:1 entry-flags:connected,import,local, src-flags:added,contributing,active,
    path-list:[72] locks:2 flags:shared,local, uPRF-list:58 len:0 itfs:[]
      path:[82] pl-index:72 ip6 weight=1 pref=0 receive:  oper-flags:resolved, cfg-flags:local,glean,
        [@0]: dpo-receive: 8000:100:fe80::dcad:ff on loop3

 forwarding:   unicast-ip6-chain
  [@0]: dpo-load-balance: [proto:ip6 index:57 buckets:1 uRPF:58 to:[0:0]]
    [0] [@2]: dpo-receive: 8000:100:fe80::dcad:ff on loop3

Type: fix
Change-Id: Ib9874c5eac74af789e721098d512a1058cb8e404
Signed-off-by: Vladislav Grishenko <themiron@yandex-team.ru>
src/vnet/ip/ip6_ll_table.c
test/test_ip6.py

index b3f42da..3dc2517 100644 (file)
@@ -111,8 +111,13 @@ ip6_ll_table_entry_update (const ip6_ll_prefix_t * ilp,
     .frp_flags = flags,
     .frp_sw_if_index = ilp->ilp_sw_if_index,
     .frp_proto = DPO_PROTO_IP6,
+    .frp_fib_index = ~0,
+    .frp_weight = 1,
   };
-  fib_prefix_t fp;
+  fib_prefix_t fp = { 0 };
+
+  if (flags & FIB_ROUTE_PATH_LOCAL)
+    rpath.frp_addr.ip6 = ilp->ilp_addr;
 
   vec_validate_init_empty (ip6_ll_table.ilt_fibs, ilp->ilp_sw_if_index, ~0);
 
index 01a6d94..38bce97 100644 (file)
@@ -274,7 +274,7 @@ class TestIPv6(TestIPv6ND):
 
     def tearDown(self):
         """Run standard test teardown and log ``show ip6 neighbors``."""
-        for i in self.interfaces:
+        for i in reversed(self.interfaces):
             i.unconfig_ip6()
             i.admin_down()
         for i in self.sub_interfaces:
@@ -1100,6 +1100,8 @@ class TestIPv6(TestIPv6ND):
         self.pg_start()
 
         subitf = VppDot1QSubint(self, self.pg1, 99)
+        self.interfaces.append(subitf)
+        self.sub_interfaces.append(subitf)
 
         subitf.admin_up()
         subitf.config_ip6()