L2 over MPLS
[vpp.git] / src / vnet / ip / ip6_forward.c
index 4b574b9..8ae08a0 100644 (file)
@@ -355,7 +355,7 @@ ip6_add_interface_routes (vnet_main_t * vnm, u32 sw_if_index,
                                       FIB_SOURCE_INTERFACE,
                                       (FIB_ENTRY_FLAG_CONNECTED |
                                        FIB_ENTRY_FLAG_ATTACHED),
-                                      FIB_PROTOCOL_IP6,
+                                      DPO_PROTO_IP6,
                                       /* No next-hop address */
                                       NULL, sw_if_index,
                                       /* invalid FIB index */
@@ -390,7 +390,7 @@ ip6_add_interface_routes (vnet_main_t * vnm, u32 sw_if_index,
                                   FIB_SOURCE_INTERFACE,
                                   (FIB_ENTRY_FLAG_CONNECTED |
                                    FIB_ENTRY_FLAG_LOCAL),
-                                  FIB_PROTOCOL_IP6,
+                                  DPO_PROTO_IP6,
                                   &pfx.fp_addr,
                                   sw_if_index, ~0,
                                   1, NULL, FIB_ROUTE_PATH_FLAG_NONE);
@@ -481,6 +481,13 @@ ip6_add_del_interface_address (vlib_main_t * vm,
   u32 if_address_index;
   ip6_address_fib_t ip6_af, *addr_fib = 0;
 
+  /* local0 interface doesn't support IP addressing */
+  if (sw_if_index == 0)
+    {
+      return
+       clib_error_create ("local0 interface doesn't support IP addressing");
+    }
+
   vec_validate (im->fib_index_by_sw_if_index, sw_if_index);
   vec_validate (im->mfib_index_by_sw_if_index, sw_if_index);
 
@@ -1284,15 +1291,15 @@ ip6_tcp_udp_icmp_validate_checksum (vlib_main_t * vm, vlib_buffer_t * p0)
   udp0 = (void *) (ip0 + 1);
   if (ip0->protocol == IP_PROTOCOL_UDP && udp0->checksum == 0)
     {
-      p0->flags |= (IP_BUFFER_L4_CHECKSUM_COMPUTED
-                   | IP_BUFFER_L4_CHECKSUM_CORRECT);
+      p0->flags |= (VNET_BUFFER_F_L4_CHECKSUM_COMPUTED
+                   | VNET_BUFFER_F_L4_CHECKSUM_CORRECT);
       return p0->flags;
     }
 
   sum16 = ip6_tcp_udp_icmp_compute_checksum (vm, p0, ip0, &bogus_length);
 
-  p0->flags |= (IP_BUFFER_L4_CHECKSUM_COMPUTED
-               | ((sum16 == 0) << LOG2_IP_BUFFER_L4_CHECKSUM_CORRECT));
+  p0->flags |= (VNET_BUFFER_F_L4_CHECKSUM_COMPUTED
+               | ((sum16 == 0) << VNET_BUFFER_F_LOG2_L4_CHECKSUM_CORRECT));
 
   return p0->flags;
 }
@@ -1362,8 +1369,8 @@ ip6_local (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
          ip0 = vlib_buffer_get_current (p0);
          ip1 = vlib_buffer_get_current (p1);
 
-         vnet_buffer (p0)->ip.start_of_ip_header = p0->current_data;
-         vnet_buffer (p1)->ip.start_of_ip_header = p1->current_data;
+         vnet_buffer (p0)->l3_hdr_offset = p0->current_data;
+         vnet_buffer (p1)->l3_hdr_offset = p1->current_data;
 
          type0 = lm->builtin_protocol_by_ip_protocol[ip0->protocol];
          type1 = lm->builtin_protocol_by_ip_protocol[ip1->protocol];
@@ -1374,8 +1381,10 @@ ip6_local (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
          flags0 = p0->flags;
          flags1 = p1->flags;
 
-         good_l4_checksum0 = (flags0 & IP_BUFFER_L4_CHECKSUM_CORRECT) != 0;
-         good_l4_checksum1 = (flags1 & IP_BUFFER_L4_CHECKSUM_CORRECT) != 0;
+         good_l4_checksum0 =
+           (flags0 & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) != 0;
+         good_l4_checksum1 =
+           (flags1 & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) != 0;
          len_diff0 = 0;
          len_diff1 = 0;
 
@@ -1414,19 +1423,21 @@ ip6_local (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
 
          if (PREDICT_FALSE (type0 != IP_BUILTIN_PROTOCOL_UNKNOWN
                             && !good_l4_checksum0
-                            && !(flags0 & IP_BUFFER_L4_CHECKSUM_COMPUTED)))
+                            && !(flags0 &
+                                 VNET_BUFFER_F_L4_CHECKSUM_COMPUTED)))
            {
              flags0 = ip6_tcp_udp_icmp_validate_checksum (vm, p0);
              good_l4_checksum0 =
-               (flags0 & IP_BUFFER_L4_CHECKSUM_CORRECT) != 0;
+               (flags0 & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) != 0;
            }
          if (PREDICT_FALSE (type1 != IP_BUILTIN_PROTOCOL_UNKNOWN
                             && !good_l4_checksum1
-                            && !(flags1 & IP_BUFFER_L4_CHECKSUM_COMPUTED)))
+                            && !(flags1 &
+                                 VNET_BUFFER_F_L4_CHECKSUM_COMPUTED)))
            {
              flags1 = ip6_tcp_udp_icmp_validate_checksum (vm, p1);
              good_l4_checksum1 =
-               (flags1 & IP_BUFFER_L4_CHECKSUM_CORRECT) != 0;
+               (flags1 & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) != 0;
            }
 
          error0 = error1 = IP6_ERROR_UNKNOWN_PROTOCOL;
@@ -1493,14 +1504,15 @@ ip6_local (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
 
          ip0 = vlib_buffer_get_current (p0);
 
-         vnet_buffer (p0)->ip.start_of_ip_header = p0->current_data;
+         vnet_buffer (p0)->l3_hdr_offset = p0->current_data;
 
          type0 = lm->builtin_protocol_by_ip_protocol[ip0->protocol];
          next0 = lm->local_next_by_ip_protocol[ip0->protocol];
 
          flags0 = p0->flags;
 
-         good_l4_checksum0 = (flags0 & IP_BUFFER_L4_CHECKSUM_CORRECT) != 0;
+         good_l4_checksum0 =
+           (flags0 & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) != 0;
          len_diff0 = 0;
 
          if (PREDICT_TRUE (IP_PROTOCOL_UDP == ip6_locate_header (p0, ip0,
@@ -1522,11 +1534,12 @@ ip6_local (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
 
          if (PREDICT_FALSE (type0 != IP_BUILTIN_PROTOCOL_UNKNOWN
                             && !good_l4_checksum0
-                            && !(flags0 & IP_BUFFER_L4_CHECKSUM_COMPUTED)))
+                            && !(flags0 &
+                                 VNET_BUFFER_F_L4_CHECKSUM_COMPUTED)))
            {
              flags0 = ip6_tcp_udp_icmp_validate_checksum (vm, p0);
              good_l4_checksum0 =
-               (flags0 & IP_BUFFER_L4_CHECKSUM_CORRECT) != 0;
+               (flags0 & VNET_BUFFER_F_L4_CHECKSUM_CORRECT) != 0;
            }
 
          error0 = IP6_ERROR_UNKNOWN_PROTOCOL;
@@ -1912,6 +1925,14 @@ ip6_probe_neighbor (vlib_main_t * vm, ip6_address_t * dst, u32 sw_if_index)
   h->ip.src_address = src[0];
   h->neighbor.target_address = dst[0];
 
+  if (PREDICT_FALSE (!hi->hw_address))
+    {
+      return clib_error_return (0, "%U: interface %U do not support ip probe",
+                               format_ip6_address, dst,
+                               format_vnet_sw_if_index_name, vnm,
+                               sw_if_index);
+    }
+
   clib_memcpy (h->link_layer_option.ethernet_address, hi->hw_address,
               vec_len (hi->hw_address));
 
@@ -2019,7 +2040,7 @@ ip6_rewrite_inline (vlib_main_t * vm,
          error0 = error1 = IP6_ERROR_NONE;
          next0 = next1 = IP6_REWRITE_NEXT_DROP;
 
-         if (PREDICT_TRUE (!(p0->flags & VNET_BUFFER_LOCALLY_ORIGINATED)))
+         if (PREDICT_TRUE (!(p0->flags & VNET_BUFFER_F_LOCALLY_ORIGINATED)))
            {
              i32 hop_limit0 = ip0->hop_limit;
 
@@ -2046,9 +2067,9 @@ ip6_rewrite_inline (vlib_main_t * vm,
            }
          else
            {
-             p0->flags &= ~VNET_BUFFER_LOCALLY_ORIGINATED;
+             p0->flags &= ~VNET_BUFFER_F_LOCALLY_ORIGINATED;
            }
-         if (PREDICT_TRUE (!(p1->flags & VNET_BUFFER_LOCALLY_ORIGINATED)))
+         if (PREDICT_TRUE (!(p1->flags & VNET_BUFFER_F_LOCALLY_ORIGINATED)))
            {
              i32 hop_limit1 = ip1->hop_limit;
 
@@ -2075,7 +2096,7 @@ ip6_rewrite_inline (vlib_main_t * vm,
            }
          else
            {
-             p1->flags &= ~VNET_BUFFER_LOCALLY_ORIGINATED;
+             p1->flags &= ~VNET_BUFFER_F_LOCALLY_ORIGINATED;
            }
          adj0 = adj_get (adj_index0);
          adj1 = adj_get (adj_index1);
@@ -2186,7 +2207,7 @@ ip6_rewrite_inline (vlib_main_t * vm,
          next0 = IP6_REWRITE_NEXT_DROP;
 
          /* Check hop limit */
-         if (PREDICT_TRUE (!(p0->flags & VNET_BUFFER_LOCALLY_ORIGINATED)))
+         if (PREDICT_TRUE (!(p0->flags & VNET_BUFFER_F_LOCALLY_ORIGINATED)))
            {
              i32 hop_limit0 = ip0->hop_limit;
 
@@ -2212,7 +2233,7 @@ ip6_rewrite_inline (vlib_main_t * vm,
            }
          else
            {
-             p0->flags &= ~VNET_BUFFER_LOCALLY_ORIGINATED;
+             p0->flags &= ~VNET_BUFFER_F_LOCALLY_ORIGINATED;
            }
 
          /* Guess we are only writing on simple Ethernet header. */