fib: fix crash while adding intf-rx routes
[vpp.git] / src / vnet / fib / fib_path.c
index e4ad877..ee2cc8e 100644 (file)
@@ -501,11 +501,9 @@ format_fib_path (u8 * s, va_list * args)
        else
        {
            s = format (s, " %U",
-                       format_vnet_sw_interface_name,
+                       format_vnet_sw_if_index_name,
                        vnm,
-                       vnet_get_sw_interface(
-                           vnm,
-                           path->attached_next_hop.fp_interface));
+                       path->attached_next_hop.fp_interface);
            if (vnet_sw_interface_is_p2p(vnet_get_main(),
                                         path->attached_next_hop.fp_interface))
            {
@@ -1365,7 +1363,8 @@ fib_path_create (fib_node_index_t pl_index,
        dpo_copy(&path->exclusive.fp_ex_dpo, &rpath->dpo);
     }
     else if ((path->fp_cfg_flags & FIB_PATH_CFG_FLAG_ICMP_PROHIBIT) ||
-        (path->fp_cfg_flags & FIB_PATH_CFG_FLAG_ICMP_UNREACH))
+       (path->fp_cfg_flags & FIB_PATH_CFG_FLAG_ICMP_UNREACH) ||
+       (path->fp_cfg_flags & FIB_PATH_CFG_FLAG_DROP))
     {
         path->fp_type = FIB_PATH_TYPE_SPECIAL;
     }
@@ -1507,6 +1506,12 @@ fib_path_copy (fib_node_index_t path_index,
     clib_memset(&path->fp_dpo, 0, sizeof(path->fp_dpo));
     dpo_reset(&path->fp_dpo);
 
+    if (path->fp_type == FIB_PATH_TYPE_EXCLUSIVE)
+    {
+       clib_memset(&path->exclusive.fp_ex_dpo, 0, sizeof(dpo_id_t));
+       dpo_copy(&path->exclusive.fp_ex_dpo, &orig_path->exclusive.fp_ex_dpo);
+    }
+
     return (fib_path_get_index(path));
 }
 
@@ -1992,7 +1997,11 @@ fib_path_resolve (fib_node_index_t path_index)
        }
        else
        {
-           fib_prefix_from_ip46_addr(&path->recursive.fp_nh.fp_ip, &pfx);
+           ASSERT(!ip46_address_is_zero(&path->recursive.fp_nh.fp_ip));
+
+           fib_protocol_t fp = (ip46_address_is_ip4(&path->recursive.fp_nh.fp_ip) ?
+                                        FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6);
+           fib_prefix_from_ip46_addr(fp, &path->recursive.fp_nh.fp_ip, &pfx);
        }
 
         fib_table_lock(path->recursive.fp_tbl_id,