If a custom fib ID is used (different from ~0), the associated
fib is used to forward outgoing encapsulated packets.
Otherwise, the fib used is the same as for any packet
received on the original RX interface (L2TP does not modify RX interface index).
Change-Id: I4533d5f7fa432c78c937d3acdd802d0d1c92a0c7
Signed-off-by: Pierre Pfister <ppfister@cisco.com>
if (vnet_buffer(b)->l2t.next_index != L2T_ENCAP_NEXT_IP6_LOOKUP)
return vnet_buffer(b)->l2t.next_index;
if (vnet_buffer(b)->l2t.next_index != L2T_ENCAP_NEXT_IP6_LOOKUP)
return vnet_buffer(b)->l2t.next_index;
- /* clear so it is not interpreted as fib_index */
- vnet_buffer(b)->sw_if_index[VLIB_TX] = (u32)~0;
-
em->counters[node_counter_base_index + L2T_ENCAP_ERROR_NETWORK_TO_USER] += 1;
session_index = vnet_buffer(b)->l2t.session_index;
em->counters[node_counter_base_index + L2T_ENCAP_ERROR_NETWORK_TO_USER] += 1;
session_index = vnet_buffer(b)->l2t.session_index;
s = pool_elt_at_index (lm->sessions, session_index);
s = pool_elt_at_index (lm->sessions, session_index);
+ vnet_buffer(b)->sw_if_index[VLIB_TX] = s->encap_fib_index;
+
/* Paint on an l2tpv3 hdr */
vlib_buffer_advance (b, -(s->l2tp_hdr_size));
l2tp = vlib_buffer_get_current (b);
/* Paint on an l2tpv3 hdr */
vlib_buffer_advance (b, -(s->l2tp_hdr_size));
l2tp = vlib_buffer_get_current (b);
u32 remote_session_id,
u64 local_cookie,
u64 remote_cookie,
u32 remote_session_id,
u64 local_cookie,
u64 remote_cookie,
- int l2_sublayer_present,
+ int l2_sublayer_present,
+ u32 encap_fib_index,
u32 * sw_if_index)
{
l2t_session_t *s = 0;
u32 * sw_if_index)
{
l2t_session_t *s = 0;
sizeof (l2tpv3_header_t) :
sizeof (l2tpv3_header_t) - sizeof(l2tp_hdr.l2_specific_sublayer);
s->admin_up = 0;
sizeof (l2tpv3_header_t) :
sizeof (l2tpv3_header_t) - sizeof(l2tp_hdr.l2_specific_sublayer);
s->admin_up = 0;
+ s->encap_fib_index = encap_fib_index;
/* Setup hash table entries */
switch (lm->lookup_type) {
/* Setup hash table entries */
switch (lm->lookup_type) {
int l2_sublayer_present = 0;
int rv;
u32 sw_if_index;
int l2_sublayer_present = 0;
int rv;
u32 sw_if_index;
+ u32 encap_fib_id = ~0;
+ u32 encap_fib_index = ~0;
/* Get a line of input. */
if (! unformat_user (input, unformat_line_input, line_input))
/* Get a line of input. */
if (! unformat_user (input, unformat_line_input, line_input))
else if (unformat (line_input, "remote-session-id %d",
&remote_session_id))
;
else if (unformat (line_input, "remote-session-id %d",
&remote_session_id))
;
+ else if (unformat (line_input, "fib-id %d",
+ &encap_fib_id))
+ ;
else if (unformat (line_input, "l2-sublayer-present"))
l2_sublayer_present = 1;
else
else if (unformat (line_input, "l2-sublayer-present"))
l2_sublayer_present = 1;
else
unformat_free (line_input);
unformat_free (line_input);
+ if (encap_fib_id != ~0) {
+ uword *p;
+ ip6_main_t *im = &ip6_main;
+ if (!(p = hash_get (im->fib_index_by_table_id, encap_fib_id)))
+ return clib_error_return (0, "No fib with id %d", encap_fib_id);
+ encap_fib_index = p[0];
+ } else {
+ encap_fib_index = ~0;
+ }
+
if (our_address_set == 0)
return clib_error_return (0, "our address not specified");
if (client_address_set == 0)
if (our_address_set == 0)
return clib_error_return (0, "our address not specified");
if (client_address_set == 0)
local_session_id, remote_session_id,
local_cookie, remote_cookie,
l2_sublayer_present,
local_session_id, remote_session_id,
local_cookie, remote_cookie,
l2_sublayer_present,
&sw_if_index);
switch(rv)
{
&sw_if_index);
switch(rv)
{
ip6_address_t our_address;
ip6_address_t client_address;
ip6_address_t our_address;
ip6_address_t client_address;
- /* $$$$ maybe add encap-path lookup fib ID? */
-
/* l2tpv3 header parameters */
u64 local_cookie[2];
u64 remote_cookie;
/* l2tpv3 header parameters */
u64 local_cookie[2];
u64 remote_cookie;
u32 hw_if_index;
u32 sw_if_index;
u32 hw_if_index;
u32 sw_if_index;
+ u32 encap_fib_index; //fib index used for outgoing encapsulated packets
+
u8 l2tp_hdr_size;
u8 l2_sublayer_present;
u8 cookie_flags; /* in host byte order */
u8 l2tp_hdr_size;
u8 l2_sublayer_present;
u8 cookie_flags; /* in host byte order */
u32 remote_session_id,
u64 local_cookie,
u64 remote_cookie,
u32 remote_session_id,
u64 local_cookie,
u64 remote_cookie,
- int l2_sublayer_present,
+ int l2_sublayer_present,
+ u32 encap_fib_index,
u32 * sw_if_index);
int l2tpv3_set_tunnel_cookies (l2t_main_t * lm,
u32 * sw_if_index);
int l2tpv3_set_tunnel_cookies (l2t_main_t * lm,
+ u32 encap_fib_index;
+
+ if (mp->encap_vrf_id != ~0) {
+ uword *p;
+ ip6_main_t *im = &ip6_main;
+ if (!(p = hash_get (im->fib_index_by_table_id, ntohl(mp->encap_vrf_id)))) {
+ rv = VNET_API_ERROR_NO_SUCH_FIB;
+ goto out;
+ }
+ encap_fib_index = p[0];
+ } else {
+ encap_fib_index = ~0;
+ }
+
rv = create_l2tpv3_ipv6_tunnel (lm,
(ip6_address_t *) mp->client_address,
(ip6_address_t *) mp->our_address,
rv = create_l2tpv3_ipv6_tunnel (lm,
(ip6_address_t *) mp->client_address,
(ip6_address_t *) mp->our_address,
clib_net_to_host_u64(mp->local_cookie),
clib_net_to_host_u64(mp->remote_cookie),
mp->l2_sublayer_present,
clib_net_to_host_u64(mp->local_cookie),
clib_net_to_host_u64(mp->remote_cookie),
mp->l2_sublayer_present,
@param remote_session_id - remote tunnel session id
@param local_cookie - local tunnel cookie
@param l2_sublayer_present - l2 sublayer is present in packets if non-zero
@param remote_session_id - remote tunnel session id
@param local_cookie - local tunnel cookie
@param l2_sublayer_present - l2 sublayer is present in packets if non-zero
+ @param encap_vrf_id - fib identifier used for outgoing encapsulated packets
*/
define l2tpv3_create_tunnel {
u32 client_index;
*/
define l2tpv3_create_tunnel {
u32 client_index;
u64 local_cookie;
u64 remote_cookie;
u8 l2_sublayer_present;
u64 local_cookie;
u64 remote_cookie;
u8 l2_sublayer_present;
};
/** \brief l2tpv3 tunnel interface create response
};
/** \brief l2tpv3 tunnel interface create response