Create macro for next_nodes used in lookup family of nodes
[vpp.git] / vnet / vnet / ip / ip6_hop_by_hop.c
index 52a6b84..057d16c 100644 (file)
@@ -81,7 +81,7 @@ typedef union {
 } time_u64_t;
 
 static inline u8
-fetch_trace_data_size(trace_type)
+fetch_trace_data_size(u8 trace_type)
 {
   u8 trace_data_size = 0;
 
@@ -217,7 +217,8 @@ static u8 * format_ip6_hop_by_hop_trace (u8 * s, va_list * args)
 vlib_node_registration_t ip6_hop_by_hop_node;
 
 #define foreach_ip6_hop_by_hop_error \
-_(PROCESSED, "Pkts with ip6 hop-by-hop options")
+_(PROCESSED, "Pkts with ip6 hop-by-hop options") \
+_(UNKNOWN_OPTION, "Unknown ip6 hop-by-hop options")
 
 typedef enum {
 #define _(sym,str) IP6_HOP_BY_HOP_ERROR_##sym,
@@ -242,7 +243,7 @@ ip6_hop_by_hop_node_fn (vlib_main_t * vm,
   ip6_hop_by_hop_main_t * hm = &ip6_hop_by_hop_main;
   u32 n_left_from, * from, * to_next;
   ip_lookup_next_t next_index;
-  u32 processed = 0;
+  u32 processed = 0, unknown_opts = 0;
   u8 elt_index = 0;
   time_u64_t time_u64;
 
@@ -429,6 +430,13 @@ ip6_hop_by_hop_node_fn (vlib_main_t * vm,
                 case 0: /* Pad */
                   opt0 = (ip6_hop_by_hop_option_t *) ((u8 *)opt0) + 1;
                   goto out0;
+
+                default:
+                  opt0 = (ip6_hop_by_hop_option_t *)
+                  (((u8 *)opt0) + opt0->length
+                  + sizeof (ip6_hop_by_hop_option_t));
+                  unknown_opts++;
+                  break;
                 }
             }
 
@@ -467,6 +475,11 @@ ip6_hop_by_hop_node_fn (vlib_main_t * vm,
       vlib_put_next_frame (vm, node, next_index, n_left_to_next);
     }
 
+    if (PREDICT_FALSE(unknown_opts > 0)) {
+      vlib_node_increment_counter (vm, ip6_hop_by_hop_node.index,
+                                   IP6_HOP_BY_HOP_ERROR_UNKNOWN_OPTION, unknown_opts);
+    }
+
   vlib_node_increment_counter (vm, ip6_hop_by_hop_node.index, 
                                IP6_HOP_BY_HOP_ERROR_PROCESSED, processed);
   return frame->n_vectors;
@@ -484,22 +497,7 @@ VLIB_REGISTER_NODE (ip6_hop_by_hop_node) = {
 
   /* See ip/lookup.h */
   .n_next_nodes = IP_LOOKUP_N_NEXT,
-  .next_nodes = {
-    [IP_LOOKUP_NEXT_MISS] = "ip6-miss",
-    [IP_LOOKUP_NEXT_DROP] = "ip6-drop",
-    [IP_LOOKUP_NEXT_PUNT] = "ip6-punt",
-    [IP_LOOKUP_NEXT_LOCAL] = "ip6-local",
-    [IP_LOOKUP_NEXT_ARP] = "ip6-discover-neighbor",
-    [IP_LOOKUP_NEXT_REWRITE] = "ip6-rewrite",
-    [IP_LOOKUP_NEXT_CLASSIFY] = "ip6-classify",
-    [IP_LOOKUP_NEXT_MAP] = "ip6-map",
-    [IP_LOOKUP_NEXT_MAP_T] = "ip6-map-t",
-    [IP_LOOKUP_NEXT_SIXRD] = "ip6-sixrd",
-    /* Next 3 arcs probably never used */
-    [IP_LOOKUP_NEXT_HOP_BY_HOP] = "ip6-hop-by-hop",
-    [IP_LOOKUP_NEXT_ADD_HOP_BY_HOP] = "ip6-add-hop-by-hop", 
-    [IP_LOOKUP_NEXT_POP_HOP_BY_HOP] = "ip6-pop-hop-by-hop", 
-  },
+  .next_nodes = IP6_LOOKUP_NEXT_NODES,
 };
 
 /* The main h-b-h tracer will be invoked, no need to do much here */
@@ -716,22 +714,7 @@ VLIB_REGISTER_NODE (ip6_add_hop_by_hop_node) = {
 
   /* See ip/lookup.h */
   .n_next_nodes = IP_LOOKUP_N_NEXT,
-  .next_nodes = {
-    [IP_LOOKUP_NEXT_MISS] = "ip6-miss",
-    [IP_LOOKUP_NEXT_DROP] = "ip6-drop",
-    [IP_LOOKUP_NEXT_PUNT] = "ip6-punt",
-    [IP_LOOKUP_NEXT_LOCAL] = "ip6-local",
-    [IP_LOOKUP_NEXT_ARP] = "ip6-discover-neighbor",
-    [IP_LOOKUP_NEXT_REWRITE] = "ip6-rewrite",
-    [IP_LOOKUP_NEXT_CLASSIFY] = "ip6-classify",
-    [IP_LOOKUP_NEXT_MAP] = "ip6-map",
-    [IP_LOOKUP_NEXT_MAP_T] = "ip6-map-t",
-    [IP_LOOKUP_NEXT_SIXRD] = "ip6-sixrd",
-    /* Next 3 arcs probably never used */
-    [IP_LOOKUP_NEXT_HOP_BY_HOP] = "ip6-hop-by-hop",
-    [IP_LOOKUP_NEXT_ADD_HOP_BY_HOP] = "ip6-add-hop-by-hop", 
-    [IP_LOOKUP_NEXT_POP_HOP_BY_HOP] = "ip6-pop-hop-by-hop", 
-  },
+  .next_nodes = IP6_LOOKUP_NEXT_NODES,
 };
 
 
@@ -967,22 +950,7 @@ VLIB_REGISTER_NODE (ip6_pop_hop_by_hop_node) = {
 
   /* See ip/lookup.h */
   .n_next_nodes = IP_LOOKUP_N_NEXT,
-  .next_nodes = {
-    [IP_LOOKUP_NEXT_MISS] = "ip6-miss",
-    [IP_LOOKUP_NEXT_DROP] = "ip6-drop",
-    [IP_LOOKUP_NEXT_PUNT] = "ip6-punt",
-    [IP_LOOKUP_NEXT_LOCAL] = "ip6-local",
-    [IP_LOOKUP_NEXT_ARP] = "ip6-discover-neighbor",
-    [IP_LOOKUP_NEXT_REWRITE] = "ip6-rewrite",
-    [IP_LOOKUP_NEXT_CLASSIFY] = "ip6-classify",
-    [IP_LOOKUP_NEXT_MAP] = "ip6-map",
-    [IP_LOOKUP_NEXT_MAP_T] = "ip6-map-t",
-    [IP_LOOKUP_NEXT_SIXRD] = "ip6-sixrd",
-    /* Next 3 arcs probably never used */
-    [IP_LOOKUP_NEXT_HOP_BY_HOP] = "ip6-hop-by-hop",
-    [IP_LOOKUP_NEXT_ADD_HOP_BY_HOP] = "ip6-add-hop-by-hop", 
-    [IP_LOOKUP_NEXT_POP_HOP_BY_HOP] = "ip6-pop-hop-by-hop", 
-  },
+  .next_nodes = IP6_LOOKUP_NEXT_NODES,
 };
 
 
@@ -1080,7 +1048,7 @@ int ip6_ioam_set_rewrite (u8 **rwp, u32 trace_type, u32 trace_option_elts,
 }
 
 clib_error_t *
-clear_ioam_rewrite_fn()
+clear_ioam_rewrite_fn(void)
 {
   ip6_hop_by_hop_main_t *hm = &ip6_hop_by_hop_main;
 
@@ -1096,11 +1064,18 @@ clear_ioam_rewrite_fn()
 
   return 0;
 }
+
+clib_error_t * clear_ioam_rewrite_command_fn (vlib_main_t * vm,
+                                 unformat_input_t * input,
+                                 vlib_cli_command_t * cmd)
+{
+  return(clear_ioam_rewrite_fn());
+}
   
 VLIB_CLI_COMMAND (ip6_clear_ioam_trace_cmd, static) = {
   .path = "clear ioam rewrite",
   .short_help = "clear ioam rewrite",
-  .function = clear_ioam_rewrite_fn,
+  .function = clear_ioam_rewrite_command_fn,
 };
 
 clib_error_t *
@@ -1126,7 +1101,7 @@ ip6_ioam_trace_profile_set(u32 trace_option_elts, u32 trace_type, u32 node_id,
       break;
 
     default:
-      return clib_error_return (0, "ip6_ioam_set_rewrite returned %d", rv);
+      return clib_error_return_code(0, rv, 0, "ip6_ioam_set_rewrite returned %d", rv);
     }
 
   return 0;