ipip: Tunnel flags controlling copying data to/from payload/encap
[vpp.git] / src / vnet / ip / ip4_format.c
index 3f22210..786a01d 100644 (file)
@@ -56,6 +56,21 @@ format_ip4_address_and_length (u8 * s, va_list * args)
   return format (s, "%U/%d", format_ip4_address, a, l);
 }
 
+u8 *
+format_ip4_address_and_mask (u8 * s, va_list * args)
+{
+  ip4_address_and_mask_t *am = va_arg (*args, ip4_address_and_mask_t *);
+
+  if (am->addr.as_u32 == 0 && am->mask.as_u32 == 0)
+    return format (s, "any");
+
+  if (am->mask.as_u32 == ~0)
+    return format (s, "%U", format_ip4_address, &am->addr);
+
+  return format (s, "%U/%U", format_ip4_address, &am->addr,
+                format_ip4_address, &am->mask);
+}
+
 /* Parse an IP4 address %d.%d.%d.%d. */
 uword
 unformat_ip4_address (unformat_input_t * input, va_list * args)
@@ -77,6 +92,27 @@ unformat_ip4_address (unformat_input_t * input, va_list * args)
   return 1;
 }
 
+uword
+unformat_ip4_address_and_mask (unformat_input_t * input, va_list * args)
+{
+  ip4_address_and_mask_t *am = va_arg (*args, ip4_address_and_mask_t *);
+  u32 addr = 0, mask = 0;
+
+  if (unformat (input, "any"))
+    ;
+  else if (unformat (input, "%U/%U", unformat_ip4_address, &addr,
+                    unformat_ip4_address, &mask))
+    ;
+  else if (unformat (input, "%U", unformat_ip4_address, &addr))
+    mask = ~0;
+  else
+    return 0;
+
+  am->addr.as_u32 = addr;
+  am->mask.as_u32 = mask;
+  return 1;
+}
+
 /* Format an IP4 header. */
 u8 *
 format_ip4_header (u8 * s, va_list * args)
@@ -119,6 +155,10 @@ format_ip4_header (u8 * s, va_list * args)
       s = format (s, " (should be 0x%04x)", clib_net_to_host_u16 (c));
   }
 
+  s = format (s, " dscp %U ecn %U",
+             format_ip_dscp, ip4_header_get_dscp (ip),
+             format_ip_ecn, ip4_header_get_ecn (ip));
+
   {
     u32 f = clib_net_to_host_u16 (ip->flags_and_fragment_offset);
     u32 o;
@@ -129,7 +169,7 @@ format_ip4_header (u8 * s, va_list * args)
 
     /* Fragment offset. */
     o = 8 * (f & 0x1fff);
-    f ^= o;
+    f ^= f & 0x1fff;
     if (o != 0)
       s = format (s, " offset %d", o);
 
@@ -142,6 +182,9 @@ format_ip4_header (u8 * s, va_list * args)
        _(CONGESTION);
 #undef _
       }
+    /* Fragment packet but not the first. */
+    if (o != 0)
+      return s;
   }
 
   /* Recurse into next protocol layer. */
@@ -177,7 +220,7 @@ unformat_ip4_header (unformat_input_t * input, va_list * args)
     ip = p;
   }
 
-  memset (ip, 0, sizeof (ip[0]));
+  clib_memset (ip, 0, sizeof (ip[0]));
   ip->ip_version_and_header_length = IP4_VERSION_AND_HEADER_LENGTH_NO_OPTIONS;
 
   if (!unformat (input, "%U: %U -> %U",