fib: make deag entries urpf extempt
[vpp.git] / src / vnet / ip / ip_api.c
index 5165927..db88d7b 100644 (file)
@@ -331,7 +331,8 @@ vl_api_ip_fib_dump_t_handler (vl_api_ip_fib_dump_t * mp)
 static void
 send_ip6_fib_details (vpe_api_main_t * am,
                      unix_shared_memory_queue_t * q,
-                     u32 table_id, fib_prefix_t * pfx,
+                     const fib_table_t * table,
+                     const fib_prefix_t * pfx,
                      fib_route_path_encode_t * api_rpaths, u32 context)
 {
   vl_api_ip6_fib_details_t *mp;
@@ -347,9 +348,11 @@ send_ip6_fib_details (vpe_api_main_t * am,
   mp->_vl_msg_id = ntohs (VL_API_IP6_FIB_DETAILS);
   mp->context = context;
 
-  mp->table_id = htonl (table_id);
+  mp->table_id = htonl (table->ft_table_id);
   mp->address_length = pfx->fp_len;
   memcpy (mp->address, &pfx->fp_addr.ip6, sizeof (pfx->fp_addr.ip6));
+  memcpy (mp->table_name, table->ft_desc,
+         clib_min (vec_len (table->ft_desc), sizeof (mp->table_name)));
 
   mp->count = htonl (path_count);
   fp = mp->path;
@@ -436,9 +439,7 @@ api_ip6_fib_table_get_all (unix_shared_memory_queue_t * q,
     fib_entry_get_prefix (*fib_entry_index, &pfx);
     api_rpaths = NULL;
     fib_entry_encode (*fib_entry_index, &api_rpaths);
-    send_ip6_fib_details (am, q,
-                         fib_table->ft_table_id,
-                         &pfx, api_rpaths, mp->context);
+    send_ip6_fib_details (am, q, fib_table, &pfx, api_rpaths, mp->context);
     vec_free (api_rpaths);
   }
 
@@ -910,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;
 
@@ -2599,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));
 
@@ -2622,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);
 }
 
@@ -2658,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;
@@ -2666,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,
@@ -2715,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;
 }
 
@@ -2725,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;
@@ -2734,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,
@@ -2774,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;
 }