acl: add API call for setting the toggle to select between linear and bihash-based...
[vpp.git] / src / plugins / srv6-as / as.c
index 7a982de..d9dbd8a 100644 (file)
@@ -36,6 +36,7 @@ unsigned char def_str[] =
 unsigned char params_str[] =
   "nh <next-hop> oif <iface-out> iif <iface-in> src <src-addr> next <sid> [next <sid> ...]";
 
+srv6_as_main_t srv6_as_main;
 
 static inline u8 *
 prepare_rewrite (ip6_address_t src_addr, ip6_address_t * sid_list,
@@ -63,7 +64,7 @@ prepare_rewrite (ip6_address_t src_addr, ip6_address_t * sid_list,
   iph->src_address = src_addr;
   iph->dst_address = sid_list[0];
   iph->payload_length = sr_hdr_len;
-  iph->hop_limit = IPv6_DEFAULT_HOP_LIMIT;
+  iph->hop_limit = sr_get_hop_limit ();
 
   if (num_sids > 1)
     {
@@ -76,13 +77,13 @@ prepare_rewrite (ip6_address_t src_addr, ip6_address_t * sid_list,
       srh->length = sr_hdr_len / 8 - 1;
       srh->type = ROUTING_HEADER_TYPE_SR;
       srh->segments_left = num_sids - 1;
-      srh->first_segment = num_sids - 1;
+      srh->last_entry = num_sids - 1;
       srh->flags = 0x00;
-      srh->reserved = 0x00;
+      srh->tag = 0x0000;
 
       /* Fill segment list */
       ip6_address_t *this_address;
-      ip6_address_t *addrp = srh->segments + srh->first_segment;
+      ip6_address_t *addrp = srh->segments + srh->last_entry;
       vec_foreach (this_address, sid_list)
       {
        *addrp = *this_address;
@@ -176,12 +177,16 @@ srv6_as_localsid_creation_fn (ip6_sr_localsid_t * localsid)
 
       /* Set interface in promiscuous mode */
       vnet_main_t *vnm = vnet_get_main ();
-      ethernet_set_flags (vnm, ls_mem->sw_if_index_in,
-                         ETHERNET_INTERFACE_FLAG_ACCEPT_ALL);
+      vnet_hw_interface_t *hi =
+       vnet_get_sup_hw_interface (vnm, ls_mem->sw_if_index_in);
+      /* Make sure it is main interface */
+      if (hi->sw_if_index == ls_mem->sw_if_index_in)
+       ethernet_set_flags (vnm, hi->hw_if_index,
+                           ETHERNET_INTERFACE_FLAG_ACCEPT_ALL);
 
       /* Prepare rewrite string */
       ls_mem->rewrite = prepare_rewrite (ls_mem->src_addr, ls_mem->sid_list,
-                                        IP_PROTOCOL_IP6_NONXT);
+                                        IP_PROTOCOL_IP6_ETHERNET);
 
       /* Associate local SID index to this interface (resize vector if needed) */
       if (ls_mem->sw_if_index_in >= vec_len (sm->sw_iface_localsid2))
@@ -277,7 +282,11 @@ srv6_as_localsid_removal_fn (ip6_sr_localsid_t * localsid)
 
       /* Disable promiscuous mode on the interface */
       vnet_main_t *vnm = vnet_get_main ();
-      ethernet_set_flags (vnm, ls_mem->sw_if_index_in, 0);
+      vnet_hw_interface_t *hi =
+       vnet_get_sup_hw_interface (vnm, ls_mem->sw_if_index_in);
+      /* Make sure it is main interface */
+      if (hi->sw_if_index == ls_mem->sw_if_index_in)
+       ethernet_set_flags (vnm, hi->hw_if_index, 0);
 
       /* Remove local SID index from interface table */
       sm->sw_iface_localsid2[ls_mem->sw_if_index_in] = ~(u32) 0;
@@ -534,6 +543,7 @@ srv6_as_init (vlib_main_t * vm)
                                      keyword_str,
                                      def_str,
                                      params_str,
+                                     128,
                                      &sm->srv6_as_dpo_type,
                                      format_srv6_as_localsid,
                                      unformat_srv6_as_localsid,