BIER
[vpp.git] / src / vnet / ip / ip_api.c
index a64c5b7..0fdb167 100644 (file)
@@ -79,7 +79,8 @@ _(IP6ND_PROXY_ADD_DEL, ip6nd_proxy_add_del)                             \
 _(IP6ND_PROXY_DUMP, ip6nd_proxy_dump)                                   \
 _(SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable )    \
 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS,                             \
-  sw_interface_ip6_set_link_local_address)
+  sw_interface_ip6_set_link_local_address)                             \
+_(IP_CONTAINER_PROXY_ADD_DEL, ip_container_proxy_add_del )
 
 extern void stats_dslock_with_hint (int hint, int tag);
 extern void stats_dsunlock (void);
@@ -364,7 +365,7 @@ send_ip6_fib_details (vpe_api_main_t * am,
       }
     fp->weight = api_rpath->rpath.frp_weight;
     fp->preference = api_rpath->rpath.frp_preference;
-    fp->sw_if_index = api_rpath->rpath.frp_sw_if_index;
+    fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index);
     copy_fib_next_hop (api_rpath, fp);
     fp++;
   }
@@ -463,7 +464,7 @@ send_ip_mfib_details (unix_shared_memory_queue_t * q,
   if (!mp)
     return;
   memset (mp, 0, sizeof (*mp));
-  mp->_vl_msg_id = ntohs (VL_API_IP_FIB_DETAILS);
+  mp->_vl_msg_id = ntohs (VL_API_IP_MFIB_DETAILS);
   mp->context = context;
 
   mp->rpf_id = mfib_entry->mfe_rpf_id;
@@ -562,7 +563,7 @@ send_ip6_mfib_details (vpe_api_main_t * am,
   if (!mp)
     return;
   memset (mp, 0, sizeof (*mp));
-  mp->_vl_msg_id = ntohs (VL_API_IP6_FIB_DETAILS);
+  mp->_vl_msg_id = ntohs (VL_API_IP6_MFIB_DETAILS);
   mp->context = context;
 
   mp->table_id = htonl (table_id);
@@ -831,10 +832,12 @@ add_del_route_t_handler (u8 is_multipath,
                         u8 is_rpf_id,
                         u8 is_l2_bridged,
                         u8 is_source_lookup,
+                        u8 is_udp_encap,
                         u32 fib_index,
                         const fib_prefix_t * prefix,
                         dpo_proto_t next_hop_proto,
                         const ip46_address_t * next_hop,
+                        u32 next_hop_id,
                         u32 next_hop_sw_if_index,
                         u8 next_hop_fib_index,
                         u16 next_hop_weight,
@@ -882,6 +885,11 @@ add_del_route_t_handler (u8 is_multipath,
     path_flags |= FIB_ROUTE_PATH_SOURCE_LOOKUP;
   if (is_multicast)
     entry_flags |= FIB_ENTRY_FLAG_MULTICAST;
+  if (is_udp_encap)
+    {
+      path_flags |= FIB_ROUTE_PATH_UDP_ENCAP;
+      path.frp_udp_encap_id = next_hop_id;
+    }
 
   path.frp_flags = path_flags;
 
@@ -1111,8 +1119,10 @@ ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
                                   mp->is_resolve_attached, 0, 0,
                                   mp->is_l2_bridged,
                                   mp->is_source_lookup,
+                                  mp->is_udp_encap,
                                   fib_index, &pfx, DPO_PROTO_IP4,
                                   &nh,
+                                  ntohl (mp->next_hop_id),
                                   ntohl (mp->next_hop_sw_if_index),
                                   next_hop_fib_index,
                                   mp->next_hop_weight,
@@ -1172,8 +1182,10 @@ ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
                                   mp->is_resolve_attached, 0, 0,
                                   mp->is_l2_bridged,
                                   mp->is_source_lookup,
+                                  mp->is_udp_encap,
                                   fib_index, &pfx, DPO_PROTO_IP6,
-                                  &nh, ntohl (mp->next_hop_sw_if_index),
+                                  &nh, ntohl (mp->next_hop_id),
+                                  ntohl (mp->next_hop_sw_if_index),
                                   next_hop_fib_index,
                                   mp->next_hop_weight,
                                   mp->next_hop_preference,
@@ -1271,40 +1283,45 @@ mroute_add_del_handler (u8 is_add,
                        u8 is_local,
                        u32 fib_index,
                        const mfib_prefix_t * prefix,
+                       dpo_proto_t nh_proto,
                        u32 entry_flags,
                        fib_rpf_id_t rpf_id,
-                       u32 next_hop_sw_if_index, u32 itf_flags)
+                       u32 next_hop_sw_if_index, u32 itf_flags, u32 bier_imp)
 {
   stats_dslock_with_hint (1 /* release hint */ , 2 /* tag */ );
 
   fib_route_path_t path = {
     .frp_sw_if_index = next_hop_sw_if_index,
-    .frp_proto = fib_proto_to_dpo (prefix->fp_proto),
+    .frp_proto = nh_proto,
   };
 
   if (is_local)
     path.frp_flags |= FIB_ROUTE_PATH_LOCAL;
 
-
-  if (!is_local && ~0 == next_hop_sw_if_index)
+  if (DPO_PROTO_BIER == nh_proto)
+    {
+      path.frp_bier_imp = bier_imp;
+      path.frp_flags = FIB_ROUTE_PATH_BIER_IMP;
+    }
+  else if (!is_local && ~0 == next_hop_sw_if_index)
     {
       mfib_table_entry_update (fib_index, prefix,
                               MFIB_SOURCE_API, rpf_id, entry_flags);
+      goto done;
+    }
+
+  if (is_add)
+    {
+      mfib_table_entry_path_update (fib_index, prefix,
+                                   MFIB_SOURCE_API, &path, itf_flags);
     }
   else
     {
-      if (is_add)
-       {
-         mfib_table_entry_path_update (fib_index, prefix,
-                                       MFIB_SOURCE_API, &path, itf_flags);
-       }
-      else
-       {
-         mfib_table_entry_path_remove (fib_index, prefix,
-                                       MFIB_SOURCE_API, &path);
-       }
+      mfib_table_entry_path_remove (fib_index, prefix,
+                                   MFIB_SOURCE_API, &path);
     }
 
+done:
   stats_dsunlock ();
   return (0);
 }
@@ -1313,9 +1330,11 @@ static int
 api_mroute_add_del_t_handler (vl_api_ip_mroute_add_del_t * mp)
 {
   fib_protocol_t fproto;
+  dpo_proto_t nh_proto;
   u32 fib_index;
   int rv;
 
+  nh_proto = mp->next_hop_afi;
   fproto = (mp->is_ipv6 ? FIB_PROTOCOL_IP6 : FIB_PROTOCOL_IP4);
   rv = add_del_mroute_check (fproto,
                             mp->table_id,
@@ -1348,10 +1367,12 @@ api_mroute_add_del_t_handler (vl_api_ip_mroute_add_del_t * mp)
   return (mroute_add_del_handler (mp->is_add,
                                  mp->is_local,
                                  fib_index, &pfx,
+                                 nh_proto,
                                  ntohl (mp->entry_flags),
                                  ntohl (mp->rpf_id),
                                  ntohl (mp->next_hop_sw_if_index),
-                                 ntohl (mp->itf_flags)));
+                                 ntohl (mp->itf_flags),
+                                 ntohl (mp->bier_imp)));
 }
 
 void
@@ -1849,6 +1870,29 @@ vl_api_mfib_signal_dump_t_handler (vl_api_mfib_signal_dump_t * mp)
     ;
 }
 
+static void
+  vl_api_ip_container_proxy_add_del_t_handler
+  (vl_api_ip_container_proxy_add_del_t * mp)
+{
+  vl_api_ip_container_proxy_add_del_reply_t *rmp;
+  vnet_ip_container_proxy_args_t args;
+  int rv = 0;
+  clib_error_t *error;
+
+  memset (&args, 0, sizeof (args));
+  ip_set (&args.prefix.fp_addr, mp->ip, mp->is_ip4);
+  args.prefix.fp_len = mp->plen ? mp->plen : (mp->is_ip4 ? 32 : 128);
+  args.sw_if_index = clib_net_to_host_u32 (mp->sw_if_index);
+  args.is_add = mp->is_add;
+  if ((error = vnet_ip_container_proxy_add_del (&args)))
+    {
+      rv = clib_error_get_code (error);
+      clib_error_report (error);
+    }
+
+  REPLY_MACRO (VL_API_IP_CONTAINER_PROXY_ADD_DEL_REPLY);
+}
+
 #define vl_msg_name_crc_list
 #include <vnet/ip/ip.api.h>
 #undef vl_msg_name_crc_list