fib: API to extract any resolving interface rather than the one from the 29/29629/2
authorNeale Ranns <neale.ranns@cisco.com>
Mon, 26 Oct 2020 10:44:54 +0000 (10:44 +0000)
committerDave Barach <openvpp@barachs.net>
Mon, 26 Oct 2020 13:39:06 +0000 (13:39 +0000)
best source

Type: improvement

Signed-off-by: Neale Ranns <neale.ranns@cisco.com>
Change-Id: Iaa91cbc7eba94f4ffbdc249ecdb49770bd2ae916

src/vnet/arp/arp.c
src/vnet/fib/fib_entry.c
src/vnet/fib/fib_entry.h

index 6a32229..8b57376 100644 (file)
@@ -543,7 +543,7 @@ arp_reply (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
          dst_fei = ip4_fib_table_lookup (ip4_fib_get (fib_index0),
                                          &arp0->ip4_over_ethernet[1].ip4,
                                          32);
-         conn_sw_if_index0 = fib_entry_get_resolving_interface (dst_fei);
+         conn_sw_if_index0 = fib_entry_get_any_resolving_interface (dst_fei);
 
          switch (arp_dst_fib_check (dst_fei, &dst_flags))
            {
index a8dec1a..33c29a6 100644 (file)
@@ -1464,6 +1464,27 @@ fib_entry_get_resolving_interface (fib_node_index_t entry_index)
     return (fib_path_list_get_resolving_interface(fib_entry->fe_parent));
 }
 
+u32
+fib_entry_get_any_resolving_interface (fib_node_index_t entry_index)
+{
+    const fib_entry_src_t *src;
+    fib_entry_t *fib_entry;
+    fib_source_t source;
+    u32 sw_if_index;
+
+    fib_entry = fib_entry_get(entry_index);
+
+    FOR_EACH_SRC_ADDED(fib_entry, src, source,
+    ({
+        sw_if_index = fib_entry_get_resolving_interface_for_source (entry_index,
+                                                                    source);
+
+        if (~0 != sw_if_index)
+            break;
+    }));
+    return (sw_if_index);
+}
+
 fib_source_t
 fib_entry_get_best_source (fib_node_index_t entry_index)
 {
index b97c80f..4053ff6 100644 (file)
@@ -440,6 +440,7 @@ extern u32 fib_entry_child_add(fib_node_index_t fib_entry_index,
 extern void fib_entry_child_remove(fib_node_index_t fib_entry_index,
                                   u32 sibling_index);
 extern u32 fib_entry_get_resolving_interface(fib_node_index_t fib_entry_index);
+extern u32 fib_entry_get_any_resolving_interface(fib_node_index_t fib_entry_index);
 extern u32 fib_entry_get_resolving_interface_for_source(
     fib_node_index_t fib_entry_index,
     fib_source_t source);