punt and drop features:
 - new IPv4 and IPv6 feature arcs on the punt and drop nodes
 - new features:
   - redirect punted traffic to an interface and nexthop
   - police punted traffic.

Change-Id: I53be8bf4e06545add8a3619e462de5ffedd0a95c
Signed-off-by: Neale Ranns <nranns@cisco.com>
diff --git a/src/vnet/policer/node_funcs.c b/src/vnet/policer/node_funcs.c
index fd031d0..25cb420 100644
--- a/src/vnet/policer/node_funcs.c
+++ b/src/vnet/policer/node_funcs.c
@@ -18,14 +18,11 @@
 #include <vlib/vlib.h>
 #include <vnet/vnet.h>
 #include <vnet/policer/policer.h>
+#include <vnet/policer/police_inlines.h>
 #include <vnet/ip/ip.h>
 #include <vnet/classify/policer_classify.h>
 #include <vnet/classify/vnet_classify.h>
 
-#define IP4_NON_DSCP_BITS 0x03
-#define IP4_DSCP_SHIFT    2
-#define IP6_NON_DSCP_BITS 0xf03fffff
-#define IP6_DSCP_SHIFT    22
 
 /* Dispatch functions meant to be instantiated elsewhere */
 
@@ -67,60 +64,6 @@
 #undef _
 };
 
-static_always_inline void
-vnet_policer_mark (vlib_buffer_t * b, u8 dscp)
-{
-  ethernet_header_t *eh;
-  ip4_header_t *ip4h;
-  ip6_header_t *ip6h;
-  u16 type;
-
-  eh = (ethernet_header_t *) b->data;
-  type = clib_net_to_host_u16 (eh->type);
-
-  if (PREDICT_TRUE (type == ETHERNET_TYPE_IP4))
-    {
-      ip4h = (ip4_header_t *) & (b->data[sizeof (ethernet_header_t)]);;
-      ip4h->tos &= IP4_NON_DSCP_BITS;
-      ip4h->tos |= dscp << IP4_DSCP_SHIFT;
-      ip4h->checksum = ip4_header_checksum (ip4h);
-    }
-  else
-    {
-      if (PREDICT_TRUE (type == ETHERNET_TYPE_IP6))
-	{
-	  ip6h = (ip6_header_t *) & (b->data[sizeof (ethernet_header_t)]);
-	  ip6h->ip_version_traffic_class_and_flow_label &=
-	    clib_host_to_net_u32 (IP6_NON_DSCP_BITS);
-	  ip6h->ip_version_traffic_class_and_flow_label |=
-	    clib_host_to_net_u32 (dscp << IP6_DSCP_SHIFT);
-	}
-    }
-}
-
-static_always_inline
-  u8 vnet_policer_police (vlib_main_t * vm,
-			  vlib_buffer_t * b,
-			  u32 policer_index,
-			  u64 time_in_policer_periods,
-			  policer_result_e packet_color)
-{
-  u8 act;
-  u32 len;
-  u32 col;
-  policer_read_response_type_st *pol;
-  vnet_policer_main_t *pm = &vnet_policer_main;
-
-  len = vlib_buffer_length_in_chain (vm, b);
-  pol = &pm->policers[policer_index];
-  col = vnet_police_packet (pol, len, packet_color, time_in_policer_periods);
-  act = pol->action[col];
-  if (PREDICT_TRUE (act == SSE2_QOS_ACTION_MARK_AND_TRANSMIT))
-    vnet_policer_mark (b, pol->mark_dscp[col]);
-
-  return act;
-}
-
 static inline uword
 vnet_policer_inline (vlib_main_t * vm,
 		     vlib_node_runtime_t * node,