vcl/session: use mq for bind replies
[vpp.git] / src / vnet / interface.c
index 34ad292..1e69ccb 100644 (file)
@@ -705,6 +705,22 @@ vnet_sw_interface_set_protocol_mtu (vnet_main_t * vnm, u32 sw_if_index,
     call_sw_interface_mtu_change_callbacks (vnm, sw_if_index);
 }
 
+void
+vnet_sw_interface_ip_directed_broadcast (vnet_main_t * vnm,
+                                        u32 sw_if_index, u8 enable)
+{
+  vnet_sw_interface_t *si;
+
+  si = vnet_get_sw_interface (vnm, sw_if_index);
+
+  if (enable)
+    si->flags |= VNET_SW_INTERFACE_FLAG_DIRECTED_BCAST;
+  else
+    si->flags &= ~VNET_SW_INTERFACE_FLAG_DIRECTED_BCAST;
+
+  ip4_directed_broadcast (sw_if_index, enable);
+}
+
 /*
  * Reflect a change in hardware MTU on protocol MTUs
  */
@@ -1042,8 +1058,9 @@ vnet_hw_interface_walk_sw (vnet_main_t * vnm,
   u32 id, sw_if_index;
 
   hi = vnet_get_hw_interface (vnm, hw_if_index);
-  /* the super first, then the and sub interfaces */
-  fn (vnm, hi->sw_if_index, ctx);
+  /* the super first, then the sub interfaces */
+  if (WALK_STOP == fn (vnm, hi->sw_if_index, ctx))
+    return;
 
   /* *INDENT-OFF* */
   hash_foreach (id, sw_if_index,
@@ -1055,6 +1072,24 @@ vnet_hw_interface_walk_sw (vnet_main_t * vnm,
   /* *INDENT-ON* */
 }
 
+void
+vnet_hw_interface_walk (vnet_main_t * vnm,
+                       vnet_hw_interface_walk_t fn, void *ctx)
+{
+  vnet_interface_main_t *im;
+  vnet_hw_interface_t *hi;
+
+  im = &vnm->interface_main;
+
+  /* *INDENT-OFF* */
+  pool_foreach (hi, im->hw_interfaces,
+  ({
+    if (WALK_STOP == fn(vnm, hi->hw_if_index, ctx))
+      break;
+  }));
+  /* *INDENT-ON* */
+}
+
 void
 vnet_sw_interface_walk (vnet_main_t * vnm,
                        vnet_sw_interface_walk_t fn, void *ctx)
@@ -1257,7 +1292,8 @@ int
 vnet_sw_interface_is_p2p (vnet_main_t * vnm, u32 sw_if_index)
 {
   vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index);
-  if (si->type == VNET_SW_INTERFACE_TYPE_P2P)
+  if ((si->type == VNET_SW_INTERFACE_TYPE_P2P) ||
+      (si->type == VNET_SW_INTERFACE_TYPE_PIPE))
     return 1;
 
   vnet_hw_interface_t *hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
@@ -1323,6 +1359,27 @@ vnet_interface_init (vlib_main_t * vm)
       {
        c->index = vec_len (im->device_classes);
        hash_set_mem (im->device_class_by_name, c->name, c->index);
+
+       if (c->tx_fn_registrations)
+         {
+           vlib_node_fn_registration_t *fnr = c->tx_fn_registrations;
+           int priority = -1;
+
+           /* to avoid confusion, please remove ".tx_function" statiement
+              from VNET_DEVICE_CLASS() if using function candidates */
+           ASSERT (c->tx_function == 0);
+
+           while (fnr)
+             {
+               if (fnr->priority > priority)
+                 {
+                   priority = fnr->priority;
+                   c->tx_function = fnr->function;
+                 }
+               fnr = fnr->next_registration;
+             }
+         }
+
        vec_add1 (im->device_classes, c[0]);
        c = c->next_class_registration;
       }
@@ -1589,6 +1646,7 @@ default_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai)
       adj_glean_update_rewrite (ai);
       break;
     case IP_LOOKUP_NEXT_ARP:
+    case IP_LOOKUP_NEXT_BCAST:
       /*
        * default rewirte in neighbour adj
        */