Revert "MTU: Setting of MTU on software interface (instead of hardware interface)"
[vpp.git] / src / vnet / interface.h
index 62fdc60..7556bc5 100644 (file)
@@ -76,6 +76,11 @@ typedef clib_error_t *(vnet_interface_set_rx_mode_function_t)
   (struct vnet_main_t * vnm, u32 if_index, u32 queue_id,
    vnet_hw_interface_rx_mode mode);
 
+/* Interface set l2 mode callback. */
+typedef clib_error_t *(vnet_interface_set_l2_mode_function_t)
+  (struct vnet_main_t * vnm, struct vnet_hw_interface_t * hi,
+   i32 l2_if_adjust);
+
 typedef enum vnet_interface_function_priority_t_
 {
   VNET_ITF_FUNC_PRIORITY_LOW,
@@ -101,6 +106,31 @@ static void __vnet_interface_function_init_##tag##_##f (void)           \
  init_function.next_interface_function = vnm->tag##_functions[p];       \
  vnm->tag##_functions[p] = &init_function;                              \
  init_function.fp = (void *) &f;                                        \
+}                                                                       \
+static void __vnet_interface_function_deinit_##tag##_##f (void)         \
+    __attribute__((__destructor__)) ;                                   \
+                                                                        \
+static void __vnet_interface_function_deinit_##tag##_##f (void)         \
+{                                                                       \
+ vnet_main_t * vnm = vnet_get_main();                                   \
+ _vnet_interface_function_list_elt_t *next;                             \
+ if (vnm->tag##_functions[p]->fp == (void *) &f)                        \
+    {                                                                   \
+      vnm->tag##_functions[p] =                                         \
+        vnm->tag##_functions[p]->next_interface_function;               \
+      return;                                                           \
+    }                                                                   \
+  next = vnm->tag##_functions[p];                                       \
+  while (next->next_interface_function)                                 \
+    {                                                                   \
+      if (next->next_interface_function->fp == (void *) &f)             \
+        {                                                               \
+          next->next_interface_function =                               \
+            next->next_interface_function->next_interface_function;     \
+          return;                                                       \
+        }                                                               \
+      next = next->next_interface_function;                             \
+    }                                                                   \
 }
 
 #define _VNET_INTERFACE_FUNCTION_DECL(f,tag)                            \
@@ -140,6 +170,9 @@ typedef struct _vnet_device_class
   /* Function to call interface rx mode is changed */
   vnet_interface_set_rx_mode_function_t *rx_mode_change_function;
 
+  /* Function to call interface l2 mode is changed */
+  vnet_interface_set_l2_mode_function_t *set_l2_mode_function;
+
   /* Redistribute flag changes/existence of this interface class. */
   u32 redistribute;
 
@@ -200,6 +233,14 @@ static void __vnet_add_device_class_registration_##x (void)             \
     x.next_class_registration = vnm->device_class_registrations;        \
     vnm->device_class_registrations = &x;                               \
 }                                                                       \
+static void __vnet_rm_device_class_registration_##x (void)              \
+    __attribute__((__destructor__)) ;                                   \
+static void __vnet_rm_device_class_registration_##x (void)              \
+{                                                                       \
+    vnet_main_t * vnm = vnet_get_main();                                \
+    VLIB_REMOVE_FROM_LINKED_LIST (vnm->device_class_registrations,      \
+                                  &x, next_class_registration);         \
+}                                                                       \
 __VA_ARGS__ vnet_device_class_t x
 
 #define VLIB_DEVICE_TX_FUNCTION_CLONE_TEMPLATE(arch, fn, tgt)          \
@@ -368,6 +409,14 @@ static void __vnet_add_hw_interface_class_registration_##x (void)       \
     x.next_class_registration = vnm->hw_interface_class_registrations;  \
     vnm->hw_interface_class_registrations = &x;                         \
 }                                                                       \
+static void __vnet_rm_hw_interface_class_registration_##x (void)        \
+    __attribute__((__destructor__)) ;                                   \
+static void __vnet_rm_hw_interface_class_registration_##x (void)        \
+{                                                                       \
+    vnet_main_t * vnm = vnet_get_main();                                \
+    VLIB_REMOVE_FROM_LINKED_LIST (vnm->hw_interface_class_registrations,\
+                                  &x, next_class_registration);         \
+}                                                                       \
 __VA_ARGS__ vnet_hw_interface_class_t x
 
 /* Hardware-interface.  This corresponds to a physical wire
@@ -556,11 +605,15 @@ typedef struct
 
 typedef enum
 {
+  /* THe BVI interface */
+  VNET_FLOOD_CLASS_BVI,
   /* Always flood */
   VNET_FLOOD_CLASS_NORMAL,
   VNET_FLOOD_CLASS_TUNNEL_MASTER,
   /* Does not flood when tunnel master is in the same L2 BD */
-  VNET_FLOOD_CLASS_TUNNEL_NORMAL
+  VNET_FLOOD_CLASS_TUNNEL_NORMAL,
+  /* Never flood to this type */
+  VNET_FLOOD_CLASS_NO_FLOOD,
 } vnet_flood_class_t;
 
 /* Software-interface.  This corresponds to a Ethernet VLAN, ATM vc, a
@@ -633,25 +686,25 @@ typedef enum
   VNET_N_SIMPLE_INTERFACE_COUNTER = 9,
   /* Combined counters. */
   VNET_INTERFACE_COUNTER_RX = 0,
-  VNET_INTERFACE_COUNTER_TX = 1,
-  VNET_INTERFACE_COUNTER_RX_UNICAST = 2,
-  VNET_INTERFACE_COUNTER_TX_UNICAST = 3,
-  VNET_INTERFACE_COUNTER_RX_MULTICAST = 4,
-  VNET_INTERFACE_COUNTER_TX_MULTICAST = 5,
-  VNET_INTERFACE_COUNTER_RX_BROADCAST = 6,
+  VNET_INTERFACE_COUNTER_RX_UNICAST = 1,
+  VNET_INTERFACE_COUNTER_RX_MULTICAST = 2,
+  VNET_INTERFACE_COUNTER_RX_BROADCAST = 3,
+  VNET_INTERFACE_COUNTER_TX = 4,
+  VNET_INTERFACE_COUNTER_TX_UNICAST = 5,
+  VNET_INTERFACE_COUNTER_TX_MULTICAST = 6,
   VNET_INTERFACE_COUNTER_TX_BROADCAST = 7,
   VNET_N_COMBINED_INTERFACE_COUNTER = 8,
 } vnet_interface_counter_type_t;
 
-#define foreach_combined_interface_counter(X)                  \
-  X(VNET_INTERFACE_COUNTER_RX, rx)                             \
-  X(VNET_INTERFACE_COUNTER_TX, tx)                             \
-  X(VNET_INTERFACE_COUNTER_RX_UNICAST, rx_unicast)             \
-  X(VNET_INTERFACE_COUNTER_TX_UNICAST, tx_unicast)             \
-  X(VNET_INTERFACE_COUNTER_RX_MULTICAST, rx_multicast)         \
-  X(VNET_INTERFACE_COUNTER_TX_MULTICAST, tx_multicast)         \
-  X(VNET_INTERFACE_COUNTER_RX_BROADCAST, rx_broadcast)         \
-  X(VNET_INTERFACE_COUNTER_TX_BROADCAST, tx_broadcast)
+#define foreach_rx_combined_interface_counter(_x)               \
+  for (_x = VNET_INTERFACE_COUNTER_RX;                          \
+       _x <= VNET_INTERFACE_COUNTER_RX_BROADCAST;               \
+       _x++)
+
+#define foreach_tx_combined_interface_counter(_x)               \
+  for (_x = VNET_INTERFACE_COUNTER_TX;                          \
+       _x <= VNET_INTERFACE_COUNTER_TX_BROADCAST;               \
+       _x++)
 
 typedef enum
 {