DVR: run L3 output features
[vpp.git] / src / vnet / ip / ip_api.c
index 7aec411..599a66b 100644 (file)
@@ -851,7 +851,7 @@ add_del_route_t_handler (u8 is_multipath,
                         u8 is_resolve_attached,
                         u8 is_interface_rx,
                         u8 is_rpf_id,
-                        u8 is_l2_bridged,
+                        u8 is_dvr,
                         u8 is_source_lookup,
                         u8 is_udp_encap,
                         u32 fib_index,
@@ -892,8 +892,8 @@ add_del_route_t_handler (u8 is_multipath,
       path.frp_local_label = next_hop_via_label;
       path.frp_eos = MPLS_NON_EOS;
     }
-  if (is_l2_bridged)
-    path.frp_proto = DPO_PROTO_ETHERNET;
+  if (is_dvr)
+    path_flags |= FIB_ROUTE_PATH_DVR;
   if (is_resolve_host)
     path_flags |= FIB_ROUTE_PATH_RESOLVE_VIA_HOST;
   if (is_resolve_attached)
@@ -911,6 +911,11 @@ add_del_route_t_handler (u8 is_multipath,
       path_flags |= FIB_ROUTE_PATH_UDP_ENCAP;
       path.frp_udp_encap_id = next_hop_id;
     }
+  if (path.frp_sw_if_index == ~0 && ip46_address_is_zero (&path.frp_addr)
+      && path.frp_fib_index != ~0)
+    {
+      path_flags |= FIB_ROUTE_PATH_DEAG;
+    }
 
   path.frp_flags = path_flags;
 
@@ -1138,7 +1143,7 @@ ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
                                   mp->classify_table_index,
                                   mp->is_resolve_host,
                                   mp->is_resolve_attached, 0, 0,
-                                  mp->is_l2_bridged,
+                                  mp->is_dvr,
                                   mp->is_source_lookup,
                                   mp->is_udp_encap,
                                   fib_index, &pfx, DPO_PROTO_IP4,
@@ -1201,7 +1206,7 @@ ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
                                   mp->classify_table_index,
                                   mp->is_resolve_host,
                                   mp->is_resolve_attached, 0, 0,
-                                  mp->is_l2_bridged,
+                                  mp->is_dvr,
                                   mp->is_source_lookup,
                                   mp->is_udp_encap,
                                   fib_index, &pfx, DPO_PROTO_IP6,
@@ -2600,13 +2605,12 @@ vl_api_proxy_arp_add_del_t_handler (vl_api_proxy_arp_add_del_t * mp)
   u32 fib_index;
   int rv;
   ip4_main_t *im = &ip4_main;
-  stats_main_t *sm = &stats_main;
   int vnet_proxy_arp_add_del (ip4_address_t * lo_addr,
                              ip4_address_t * hi_addr,
                              u32 fib_index, int is_del);
   uword *p;
 
-  dslock (sm, 1 /* release hint */ , 6 /* tag */ );
+  stats_dslock_with_hint (1 /* release hint */ , 6 /* tag */ );
 
   p = hash_get (im->fib_index_by_table_id, ntohl (mp->vrf_id));
 
@@ -2623,7 +2627,7 @@ vl_api_proxy_arp_add_del_t_handler (vl_api_proxy_arp_add_del_t * mp)
                               fib_index, mp->is_add == 0);
 
 out:
-  dsunlock (sm);
+  stats_dsunlock ();
   REPLY_MACRO (VL_API_PROXY_ARP_ADD_DEL_REPLY);
 }
 
@@ -2659,7 +2663,6 @@ ip4_reset_fib_t_handler (vl_api_reset_fib_t * mp)
   vnet_interface_main_t *im = &vnm->interface_main;
   ip4_main_t *im4 = &ip4_main;
   static u32 *sw_if_indices_to_shut;
-  stats_main_t *sm = &stats_main;
   fib_table_t *fib_table;
   ip4_fib_t *fib;
   u32 sw_if_index;
@@ -2667,7 +2670,7 @@ ip4_reset_fib_t_handler (vl_api_reset_fib_t * mp)
   int rv = VNET_API_ERROR_NO_SUCH_FIB;
   u32 target_fib_id = ntohl (mp->vrf_id);
 
-  dslock (sm, 1 /* release hint */ , 8 /* tag */ );
+  stats_dslock_with_hint (1 /* release hint */ , 8 /* tag */ );
 
   /* *INDENT-OFF* */
   pool_foreach (fib_table, im4->fibs,
@@ -2716,7 +2719,7 @@ ip4_reset_fib_t_handler (vl_api_reset_fib_t * mp)
     })); /* pool_foreach (fib) */
     /* *INDENT-ON* */
 
-  dsunlock (sm);
+  stats_dsunlock ();
   return rv;
 }
 
@@ -2726,7 +2729,6 @@ ip6_reset_fib_t_handler (vl_api_reset_fib_t * mp)
   vnet_main_t *vnm = vnet_get_main ();
   vnet_interface_main_t *im = &vnm->interface_main;
   ip6_main_t *im6 = &ip6_main;
-  stats_main_t *sm = &stats_main;
   static u32 *sw_if_indices_to_shut;
   fib_table_t *fib_table;
   ip6_fib_t *fib;
@@ -2735,7 +2737,7 @@ ip6_reset_fib_t_handler (vl_api_reset_fib_t * mp)
   int rv = VNET_API_ERROR_NO_SUCH_FIB;
   u32 target_fib_id = ntohl (mp->vrf_id);
 
-  dslock (sm, 1 /* release hint */ , 9 /* tag */ );
+  stats_dslock_with_hint (1 /* release hint */ , 9 /* tag */ );
 
   /* *INDENT-OFF* */
   pool_foreach (fib_table, im6->fibs,
@@ -2775,7 +2777,7 @@ ip6_reset_fib_t_handler (vl_api_reset_fib_t * mp)
   })); /* pool_foreach (fib) */
   /* *INDENT-ON* */
 
-  dsunlock (sm);
+  stats_dsunlock ();
   return rv;
 }