Add Vxlan-Gpe over IPv6
[vpp.git] / vnet / vnet / ip / udp.h
index 151f2a8..1cf525c 100644 (file)
@@ -51,6 +51,7 @@ _ (547, dhcpv6_to_server)                       \
 _ (546, dhcpv6_to_client)                      \
 _ (4341, lisp_gpe6)                             \
 _ (4342, lisp_cp6)                             \
+_ (4790, vxlan6_gpe)      \
 _ (6633, vpath6_3)
 
 typedef enum {
@@ -152,6 +153,8 @@ ip_udp_encap_one (vlib_main_t * vm, vlib_buffer_t * b0, u8 * ec0, word ec_len,
   else
     {
       ip6_header_t * ip0;
+      int bogus0;
+
       ip0 = vlib_buffer_get_current(b0);
 
       /* Apply the encap string. */
@@ -164,6 +167,12 @@ ip_udp_encap_one (vlib_main_t * vm, vlib_buffer_t * b0, u8 * ec0, word ec_len,
       /* Fix UDP length */
       udp0 = (udp_header_t *)(ip0+1);
       udp0->length = new_l0;
+
+      udp0->checksum = ip6_tcp_udp_icmp_compute_checksum (vm, b0, ip0, &bogus0);
+      ASSERT(bogus0 == 0);
+
+      if (udp0->checksum == 0)
+          udp0->checksum = 0xffff;
     }
 }
 
@@ -225,6 +234,8 @@ ip_udp_encap_two (vlib_main_t * vm, vlib_buffer_t * b0, vlib_buffer_t * b1,
   else
     {
       ip6_header_t * ip0, * ip1;
+      int bogus0, bogus1;
+
       ip0 = vlib_buffer_get_current(b0);
       ip1 = vlib_buffer_get_current(b1);
 
@@ -245,6 +256,16 @@ ip_udp_encap_two (vlib_main_t * vm, vlib_buffer_t * b0, vlib_buffer_t * b1,
 
       udp0->length = new_l0;
       udp1->length = new_l1;
+
+      udp0->checksum = ip6_tcp_udp_icmp_compute_checksum (vm, b0, ip0, &bogus0);
+      udp1->checksum = ip6_tcp_udp_icmp_compute_checksum (vm, b1, ip1, &bogus1);
+      ASSERT(bogus0 == 0);
+      ASSERT(bogus1 == 0);
+
+      if (udp0->checksum == 0)
+          udp0->checksum = 0xffff;
+      if (udp1->checksum == 0)
+          udp1->checksum = 0xffff;
     }
 }