API: Add service definitions for events and singleton messages.
[vpp.git] / src / vnet / ip / ip4_forward.c
index ae45106..6b7eb9c 100644 (file)
@@ -1923,7 +1923,8 @@ ip4_probe_neighbor (vlib_main_t * vm, ip4_address_t * dst, u32 sw_if_index)
   if (adj->lookup_next_index == IP_LOOKUP_NEXT_REWRITE)
     {
       adj_unlock (ai);
-      ai = adj_glean_add_or_lock (FIB_PROTOCOL_IP4, sw_if_index, &nh);
+      ai = adj_glean_add_or_lock (FIB_PROTOCOL_IP4,
+                                 VNET_LINK_IP4, sw_if_index, &nh);
       adj = adj_get (ai);
     }
 
@@ -2109,16 +2110,26 @@ ip4_rewrite_inline (vlib_main_t * vm,
          vnet_buffer (p1)->ip.save_rewrite_length = rw_len1;
 
          /* Check MTU of outgoing interface. */
-         error0 =
-           (vlib_buffer_length_in_chain (vm, p0) >
-            adj0[0].
-            rewrite_header.max_l3_packet_bytes ? IP4_ERROR_MTU_EXCEEDED :
-            error0);
-         error1 =
-           (vlib_buffer_length_in_chain (vm, p1) >
-            adj1[0].
-            rewrite_header.max_l3_packet_bytes ? IP4_ERROR_MTU_EXCEEDED :
-            error1);
+         if (vlib_buffer_length_in_chain (vm, p0) >
+             adj0[0].rewrite_header.max_l3_packet_bytes)
+           {
+             error0 = IP4_ERROR_MTU_EXCEEDED;
+             next0 = IP4_REWRITE_NEXT_ICMP_ERROR;
+             icmp4_error_set_vnet_buffer
+               (p0, ICMP4_destination_unreachable,
+                ICMP4_destination_unreachable_fragmentation_needed_and_dont_fragment_set,
+                0);
+           }
+         if (vlib_buffer_length_in_chain (vm, p1) >
+             adj1[0].rewrite_header.max_l3_packet_bytes)
+           {
+             error1 = IP4_ERROR_MTU_EXCEEDED;
+             next1 = IP4_REWRITE_NEXT_ICMP_ERROR;
+             icmp4_error_set_vnet_buffer
+               (p1, ICMP4_destination_unreachable,
+                ICMP4_destination_unreachable_fragmentation_needed_and_dont_fragment_set,
+                0);
+           }
 
          if (is_mcast)
            {
@@ -2290,9 +2301,16 @@ ip4_rewrite_inline (vlib_main_t * vm,
               vlib_buffer_length_in_chain (vm, p0) + rw_len0);
 
          /* Check MTU of outgoing interface. */
-         error0 = (vlib_buffer_length_in_chain (vm, p0)
-                   > adj0[0].rewrite_header.max_l3_packet_bytes
-                   ? IP4_ERROR_MTU_EXCEEDED : error0);
+         if (vlib_buffer_length_in_chain (vm, p0) >
+             adj0[0].rewrite_header.max_l3_packet_bytes)
+           {
+             error0 = IP4_ERROR_MTU_EXCEEDED;
+             next0 = IP4_REWRITE_NEXT_ICMP_ERROR;
+             icmp4_error_set_vnet_buffer
+               (p0, ICMP4_destination_unreachable,
+                ICMP4_destination_unreachable_fragmentation_needed_and_dont_fragment_set,
+                0);
+           }
          if (is_mcast)
            {
              error0 = ((adj0[0].rewrite_header.sw_if_index ==