FIB: return entry prefix by const reference to avoid the copy
[vpp.git] / src / vnet / fib / fib_path.c
index b4f9971..4714228 100644 (file)
@@ -80,7 +80,7 @@ typedef enum fib_path_type_t_ {
      */
     FIB_PATH_TYPE_INTF_RX,
     /**
-     * interface receive.
+     * Path resolves via a UDP encap object.
      */
     FIB_PATH_TYPE_UDP_ENCAP,
     /**
@@ -874,13 +874,10 @@ fib_path_unresolve (fib_path_t *path)
     case FIB_PATH_TYPE_RECURSIVE:
        if (FIB_NODE_INDEX_INVALID != path->fp_via_fib)
        {
-           fib_prefix_t pfx;
-
-           fib_entry_get_prefix(path->fp_via_fib, &pfx);
            fib_entry_child_remove(path->fp_via_fib,
                                   path->fp_sibling);
            fib_table_entry_special_remove(path->recursive.fp_tbl_id,
-                                          &pfx,
+                                          fib_entry_get_prefix(path->fp_via_fib),
                                           FIB_SOURCE_RR);
            path->fp_via_fib = FIB_NODE_INDEX_INVALID;
        }
@@ -1349,7 +1346,8 @@ fib_path_create (fib_node_index_t pl_index,
            {
                path->fp_type = FIB_PATH_TYPE_DEAG;
                path->deag.fp_tbl_id = rpath->frp_fib_index;
-           }           
+                path->deag.fp_rpf_id = ~0;
+           }
        }
        else
        {
@@ -2071,7 +2069,7 @@ fib_path_get_resolving_interface (fib_node_index_t path_index)
     case FIB_PATH_TYPE_BIER_IMP:
        break;
     }
-    return (~0);
+    return (dpo_get_urpf(&path->fp_dpo));
 }
 
 index_t
@@ -2238,6 +2236,7 @@ fib_path_contribute_urpf (fib_node_index_t path_index,
 void
 fib_path_stack_mpls_disp (fib_node_index_t path_index,
                           dpo_proto_t payload_proto,
+                          fib_mpls_lsp_mode_t mode,
                           dpo_id_t *dpo)
 {
     fib_path_t *path;
@@ -2253,10 +2252,8 @@ fib_path_stack_mpls_disp (fib_node_index_t path_index,
         dpo_id_t tmp = DPO_INVALID;
 
         dpo_copy(&tmp, dpo);
-        dpo_set(dpo,
-                DPO_MPLS_DISPOSITION,
-                payload_proto,
-                mpls_disp_dpo_create(payload_proto, ~0, &tmp));
+
+        mpls_disp_dpo_create(payload_proto, ~0, mode, &tmp, dpo);
         dpo_reset(&tmp);
         break;
     }                
@@ -2265,12 +2262,10 @@ fib_path_stack_mpls_disp (fib_node_index_t path_index,
         dpo_id_t tmp = DPO_INVALID;
 
         dpo_copy(&tmp, dpo);
-        dpo_set(dpo,
-                DPO_MPLS_DISPOSITION,
-                payload_proto,
-                mpls_disp_dpo_create(payload_proto,
-                                     path->deag.fp_rpf_id,
-                                     &tmp));
+
+        mpls_disp_dpo_create(payload_proto,
+                             path->deag.fp_rpf_id,
+                             mode, &tmp, dpo);
         dpo_reset(&tmp);
         break;
     }
@@ -2325,6 +2320,8 @@ fib_path_contribute_forwarding (fib_node_index_t path_index,
            case FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS:
            case FIB_FORW_CHAIN_TYPE_ETHERNET:
            case FIB_FORW_CHAIN_TYPE_NSH:
+           case FIB_FORW_CHAIN_TYPE_MCAST_IP4:
+           case FIB_FORW_CHAIN_TYPE_MCAST_IP6:
            {
                adj_index_t ai;
 
@@ -2340,8 +2337,6 @@ fib_path_contribute_forwarding (fib_node_index_t path_index,
 
                break;
            }
-           case FIB_FORW_CHAIN_TYPE_MCAST_IP4:
-           case FIB_FORW_CHAIN_TYPE_MCAST_IP6:
            case FIB_FORW_CHAIN_TYPE_BIER:
                break;
            }
@@ -2595,6 +2590,7 @@ fib_path_encode (fib_node_index_t path_list_index,
     api_rpath->rpath.frp_preference = path->fp_preference;
     api_rpath->rpath.frp_proto = path->fp_nh_proto;
     api_rpath->rpath.frp_sw_if_index = ~0;
+    api_rpath->rpath.frp_fib_index = 0;
     api_rpath->dpo = path->fp_dpo;
 
     switch (path->fp_type)
@@ -2620,7 +2616,16 @@ fib_path_encode (fib_node_index_t path_list_index,
         break;
       case FIB_PATH_TYPE_RECURSIVE:
         api_rpath->rpath.frp_addr = path->recursive.fp_nh.fp_ip;
+        api_rpath->rpath.frp_fib_index = path->recursive.fp_tbl_id;
         break;
+      case FIB_PATH_TYPE_DVR:
+          api_rpath->rpath.frp_sw_if_index = path->dvr.fp_interface;
+          api_rpath->rpath.frp_flags |= FIB_ROUTE_PATH_DVR;
+          break;
+      case FIB_PATH_TYPE_UDP_ENCAP:
+          api_rpath->rpath.frp_udp_encap_id = path->udp_encap.fp_udp_encap_id;
+          api_rpath->rpath.frp_flags |= FIB_ROUTE_PATH_UDP_ENCAP;
+          break;
       default:
         break;
       }