diff options
Diffstat (limited to 'vnet/vnet/l2tp/l2tp.c')
-rw-r--r-- | vnet/vnet/l2tp/l2tp.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/vnet/vnet/l2tp/l2tp.c b/vnet/vnet/l2tp/l2tp.c index 85f9c30ed11..ebf317fe6db 100644 --- a/vnet/vnet/l2tp/l2tp.c +++ b/vnet/vnet/l2tp/l2tp.c @@ -296,7 +296,8 @@ int create_l2tpv3_ipv6_tunnel (l2t_main_t * lm, 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; @@ -346,6 +347,7 @@ int create_l2tpv3_ipv6_tunnel (l2t_main_t * lm, 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) { @@ -420,6 +422,8 @@ create_l2tpv3_tunnel_command_fn (vlib_main_t * vm, 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)) @@ -442,6 +446,9 @@ create_l2tpv3_tunnel_command_fn (vlib_main_t * vm, 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 @@ -451,6 +458,16 @@ create_l2tpv3_tunnel_command_fn (vlib_main_t * vm, 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) @@ -460,6 +477,7 @@ create_l2tpv3_tunnel_command_fn (vlib_main_t * vm, local_session_id, remote_session_id, local_cookie, remote_cookie, l2_sublayer_present, + encap_fib_index, &sw_if_index); switch(rv) { |