BIER
[vpp.git] / src / vnet / interface_api.c
index ee13135..bd11d45 100644 (file)
@@ -54,6 +54,7 @@ _(SW_INTERFACE_SET_MTU, sw_interface_set_mtu)                   \
 _(WANT_INTERFACE_EVENTS, want_interface_events)                 \
 _(SW_INTERFACE_DUMP, sw_interface_dump)                         \
 _(SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address)   \
+_(SW_INTERFACE_SET_RX_MODE, sw_interface_set_rx_mode)           \
 _(SW_INTERFACE_SET_TABLE, sw_interface_set_table)               \
 _(SW_INTERFACE_GET_TABLE, sw_interface_get_table)               \
 _(SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered)     \
@@ -365,14 +366,6 @@ ip_table_bind (fib_protocol_t fproto,
   fib_source_t src;
   mfib_source_t msrc;
 
-  fib_index = fib_table_find (fproto, table_id);
-  mfib_index = mfib_table_find (fproto, table_id);
-
-  if (~0 == fib_index || ~0 == mfib_index)
-    {
-      return (VNET_API_ERROR_NO_SUCH_FIB);
-    }
-
   if (is_api)
     {
       src = FIB_SOURCE_API;
@@ -384,6 +377,32 @@ ip_table_bind (fib_protocol_t fproto,
       msrc = MFIB_SOURCE_CLI;
     }
 
+  /*
+   * This is temporary whilst I do the song and dance with the CSIT version
+   */
+  if (0 != table_id)
+    {
+      fib_index = fib_table_find_or_create_and_lock (fproto, table_id, src);
+      mfib_index =
+       mfib_table_find_or_create_and_lock (fproto, table_id, msrc);
+    }
+  else
+    {
+      fib_index = 0;
+      mfib_index = 0;
+    }
+
+  /*
+   * This if table does not exist = error is what we want in the end.
+   */
+  /* fib_index = fib_table_find (fproto, table_id); */
+  /* mfib_index = mfib_table_find (fproto, table_id); */
+
+  /* if (~0 == fib_index || ~0 == mfib_index) */
+  /*   { */
+  /*     return (VNET_API_ERROR_NO_SUCH_FIB); */
+  /*   } */
+
   if (FIB_PROTOCOL_IP6 == fproto)
     {
       /*
@@ -490,6 +509,15 @@ ip_table_bind (fib_protocol_t fproto,
       ip4_main.mfib_index_by_sw_if_index[sw_if_index] = mfib_index;
     }
 
+  /*
+   * Temporary. undo the locks from the find and create at the staart
+   */
+  if (0 != table_id)
+    {
+      fib_table_unlock (fib_index, fproto, src);
+      mfib_table_unlock (mfib_index, fproto, msrc);
+    }
+
   return (0);
 }
 
@@ -853,21 +881,14 @@ static void vl_api_sw_interface_set_mac_address_t_handler
   vnet_main_t *vnm = vnet_get_main ();
   u32 sw_if_index = ntohl (mp->sw_if_index);
   vnet_sw_interface_t *si;
-  u64 mac;
   clib_error_t *error;
   int rv = 0;
 
   VALIDATE_SW_IF_INDEX (mp);
 
-  mac = ((u64) mp->mac_address[0] << (8 * 0)
-        | (u64) mp->mac_address[1] << (8 * 1)
-        | (u64) mp->mac_address[2] << (8 * 2)
-        | (u64) mp->mac_address[3] << (8 * 3)
-        | (u64) mp->mac_address[4] << (8 * 4)
-        | (u64) mp->mac_address[5] << (8 * 5));
-
   si = vnet_get_sw_interface (vnm, sw_if_index);
-  error = vnet_hw_interface_change_mac_address (vnm, si->hw_if_index, mac);
+  error = vnet_hw_interface_change_mac_address (vnm, si->hw_if_index,
+                                               mp->mac_address);
   if (error)
     {
       rv = VNET_API_ERROR_UNIMPLEMENTED;
@@ -880,6 +901,34 @@ out:
   REPLY_MACRO (VL_API_SW_INTERFACE_SET_MAC_ADDRESS_REPLY);
 }
 
+static void vl_api_sw_interface_set_rx_mode_t_handler
+  (vl_api_sw_interface_set_rx_mode_t * mp)
+{
+  vl_api_sw_interface_set_rx_mode_reply_t *rmp;
+  vnet_main_t *vnm = vnet_get_main ();
+  u32 sw_if_index = ntohl (mp->sw_if_index);
+  vnet_sw_interface_t *si;
+  clib_error_t *error;
+  int rv = 0;
+
+  VALIDATE_SW_IF_INDEX (mp);
+
+  si = vnet_get_sw_interface (vnm, sw_if_index);
+  error = set_hw_interface_change_rx_mode (vnm, si->hw_if_index,
+                                          mp->queue_id_valid,
+                                          ntohl (mp->queue_id), mp->mode);
+  if (error)
+    {
+      rv = VNET_API_ERROR_UNIMPLEMENTED;
+      clib_error_report (error);
+      goto out;
+    }
+
+  BAD_SW_IF_INDEX_LABEL;
+out:
+  REPLY_MACRO (VL_API_SW_INTERFACE_SET_RX_MODE_REPLY);
+}
+
 /*
  * vpe_api_hookup
  * Add vpe's API message handlers to the table.