vnet_buffer (b[1])->sw_if_index[VLIB_RX] = tun_sw_if_index[1];
}
+ vnet_buffer (b[0])->sw_if_index[VLIB_TX] = (u32) ~0;
+ vnet_buffer (b[1])->sw_if_index[VLIB_TX] = (u32) ~0;
+
if (PREDICT_FALSE (b[0]->flags & VLIB_BUFFER_IS_TRACED))
gre_trace (vm, node, b[0], tun_sw_if_index[0], ip6[0], ip4[0],
is_ipv6);
vnet_buffer (b[0])->sw_if_index[VLIB_RX] = tun_sw_if_index[0];
}
+ vnet_buffer (b[0])->sw_if_index[VLIB_TX] = (u32) ~0;
+
if (PREDICT_FALSE (b[0]->flags & VLIB_BUFFER_IS_TRACED))
gre_trace (vm, node, b[0], tun_sw_if_index[0], ip6[0], ip4[0],
is_ipv6);
(vnm, hw_if_index, mac_address);
}
+static int
+vnet_sw_interface_check_table_same (u32 unnumbered_sw_if_index,
+ u32 ip_sw_if_index)
+{
+ vec_validate (ip4_main.fib_index_by_sw_if_index, unnumbered_sw_if_index);
+ vec_validate (ip4_main.mfib_index_by_sw_if_index, unnumbered_sw_if_index);
+ vec_validate (ip6_main.fib_index_by_sw_if_index, unnumbered_sw_if_index);
+ vec_validate (ip6_main.mfib_index_by_sw_if_index, unnumbered_sw_if_index);
+
+ vec_validate (ip4_main.fib_index_by_sw_if_index, ip_sw_if_index);
+ vec_validate (ip4_main.mfib_index_by_sw_if_index, ip_sw_if_index);
+ vec_validate (ip6_main.fib_index_by_sw_if_index, ip_sw_if_index);
+ vec_validate (ip6_main.mfib_index_by_sw_if_index, ip_sw_if_index);
+
+ if (ip4_main.fib_index_by_sw_if_index[unnumbered_sw_if_index] !=
+ ip4_main.fib_index_by_sw_if_index[ip_sw_if_index])
+ return VNET_API_ERROR_UNEXPECTED_INTF_STATE;
+
+ if (ip4_main.mfib_index_by_sw_if_index[unnumbered_sw_if_index] !=
+ ip4_main.mfib_index_by_sw_if_index[ip_sw_if_index])
+ return VNET_API_ERROR_UNEXPECTED_INTF_STATE;
+
+ if (ip6_main.fib_index_by_sw_if_index[unnumbered_sw_if_index] !=
+ ip6_main.fib_index_by_sw_if_index[ip_sw_if_index])
+ return VNET_API_ERROR_UNEXPECTED_INTF_STATE;
+
+ if (ip6_main.mfib_index_by_sw_if_index[unnumbered_sw_if_index] !=
+ ip6_main.mfib_index_by_sw_if_index[ip_sw_if_index])
+ return VNET_API_ERROR_UNEXPECTED_INTF_STATE;
+
+ return 0;
+}
+
/* update the unnumbered state of an interface*/
-void
+int
vnet_sw_interface_update_unnumbered (u32 unnumbered_sw_if_index,
u32 ip_sw_if_index, u8 enable)
{
vnet_main_t *vnm = vnet_get_main ();
vnet_sw_interface_t *si;
u32 was_unnum;
+ int rv = 0;
si = vnet_get_sw_interface (vnm, unnumbered_sw_if_index);
was_unnum = (si->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED);
if (enable)
{
+ rv = vnet_sw_interface_check_table_same (unnumbered_sw_if_index,
+ ip_sw_if_index);
+ if (rv != 0)
+ return rv;
si->flags |= VNET_SW_INTERFACE_FLAG_UNNUMBERED;
si->unnumbered_sw_if_index = ip_sw_if_index;
ip4_sw_interface_enable_disable (unnumbered_sw_if_index, enable);
ip6_sw_interface_enable_disable (unnumbered_sw_if_index, enable);
}
+
+ return 0;
}
vnet_l3_packet_type_t
goto done;
}
- vnet_sw_interface_update_unnumbered (unnumbered_sw_if_index,
- sw_if_index, mp->is_add);
+ rv = vnet_sw_interface_update_unnumbered (unnumbered_sw_if_index,
+ sw_if_index, mp->is_add);
done:
REPLY_MACRO (VL_API_SW_INTERFACE_SET_UNNUMBERED_REPLY);
}
return clib_error_return (0, "When enabling unnumbered specify the"
" IP enabled interface that it uses");
- vnet_sw_interface_update_unnumbered (unnumbered_sw_if_index,
- inherit_from_sw_if_index, enable);
+ int rv = vnet_sw_interface_update_unnumbered (
+ unnumbered_sw_if_index, inherit_from_sw_if_index, enable);
+
+ switch (rv)
+ {
+ case 0:
+ break;
+
+ case VNET_API_ERROR_UNEXPECTED_INTF_STATE:
+ return clib_error_return (
+ 0,
+ "When enabling unnumbered both interfaces must be in the same tables");
+
+ default:
+ return clib_error_return (
+ 0, "vnet_sw_interface_update_unnumbered returned %d", rv);
+ }
return (NULL);
}
u32 mtu[]);
/* update the unnumbered state of an interface */
-void vnet_sw_interface_update_unnumbered (u32 sw_if_index,
- u32 ip_sw_if_index, u8 enable);
+int vnet_sw_interface_update_unnumbered (u32 sw_if_index, u32 ip_sw_if_index,
+ u8 enable);
int vnet_sw_interface_stats_collect_enable_disable (u32 sw_if_index,
u8 enable);
return True
return False
- def set_unnumbered(self, ip_sw_if_index, is_add=True):
- res = self._test.vapi.sw_interface_set_unnumbered(ip_sw_if_index,
- self.east, is_add)
- res = self._test.vapi.sw_interface_set_unnumbered(ip_sw_if_index,
- self.west, is_add)
+ def set_unnumbered(self, ip_sw_if_index, is_east, is_add=True):
+ if is_east:
+ res = self._test.vapi.sw_interface_set_unnumbered(
+ ip_sw_if_index, self.east, is_add)
+ else:
+ res = self._test.vapi.sw_interface_set_unnumbered(
+ ip_sw_if_index, self.west, is_add)
class TestPipe(VppTestCase):
self.send_and_assert_no_replies(self.pg2, p_east * NUM_PKTS)
# IP enable the Pipes by making them unnumbered
- pipes[0].set_unnumbered(self.pg2.sw_if_index)
- pipes[1].set_unnumbered(self.pg3.sw_if_index)
+ pipes[1].set_unnumbered(self.pg2.sw_if_index, True)
+ pipes[1].set_unnumbered(self.pg3.sw_if_index, False)
self.send_and_expect(self.pg2, p_east * NUM_PKTS, self.pg3)