IP bi-direction multicast - same cable check on egress

Change-Id: I655382f7f74181dd7c795a2b22f151f76b50e793
Signed-off-by: Neale Ranns <nranns@cisco.com>
diff --git a/src/vnet/ip/ip4_error.h b/src/vnet/ip/ip4_error.h
index d277563..d9b56bc 100644
--- a/src/vnet/ip/ip4_error.h
+++ b/src/vnet/ip/ip4_error.h
@@ -59,6 +59,7 @@
   _ (SRC_LOOKUP_MISS, "ip4 source lookup miss")				\
   _ (DROP, "ip4 drop")                                                  \
   _ (PUNT, "ip4 punt")                                                  \
+  _ (SAME_INTERFACE, "ip4 egrees interface same as ingress")            \
 									\
   /* Errors signalled by ip4-local. */					\
   _ (UNKNOWN_PROTOCOL, "unknown ip protocol")				\
diff --git a/src/vnet/ip/ip4_forward.c b/src/vnet/ip/ip4_forward.c
index c7cf362..2f3f340 100755
--- a/src/vnet/ip/ip4_forward.c
+++ b/src/vnet/ip/ip4_forward.c
@@ -2477,6 +2477,16 @@
 	     rewrite_header.max_l3_packet_bytes ? IP4_ERROR_MTU_EXCEEDED :
 	     error1);
 
+	  if (is_mcast)
+	    {
+	      error0 = ((adj0[0].rewrite_header.sw_if_index ==
+			 vnet_buffer (p0)->sw_if_index[VLIB_RX]) ?
+			IP4_ERROR_SAME_INTERFACE : error0);
+	      error1 = ((adj1[0].rewrite_header.sw_if_index ==
+			 vnet_buffer (p1)->sw_if_index[VLIB_RX]) ?
+			IP4_ERROR_SAME_INTERFACE : error1);
+	    }
+
 	  /* Don't adjust the buffer for ttl issue; icmp-error node wants
 	   * to see the IP headerr */
 	  if (PREDICT_TRUE (error0 == IP4_ERROR_NONE))
@@ -2636,7 +2646,12 @@
 	  error0 = (vlib_buffer_length_in_chain (vm, p0)
 		    > adj0[0].rewrite_header.max_l3_packet_bytes
 		    ? IP4_ERROR_MTU_EXCEEDED : error0);
-
+	  if (is_mcast)
+	    {
+	      error0 = ((adj0[0].rewrite_header.sw_if_index ==
+			 vnet_buffer (p0)->sw_if_index[VLIB_RX]) ?
+			IP4_ERROR_SAME_INTERFACE : error0);
+	    }
 	  p0->error = error_node->errors[error0];
 
 	  /* Don't adjust the buffer for ttl issue; icmp-error node wants