blob: 3f77f70fb5a8cacad127071eed1b53981df2876d [file] [log] [blame]
Ed Warnickecb9cada2015-12-08 15:45:58 -07001/*
2 * l2tp.h : L2TPv3 tunnel support
3 *
4 * Copyright (c) 2013 Cisco and/or its affiliates.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#ifndef __included_l2tp_h__
19#define __included_l2tp_h__
20
21#include <vlib/vlib.h>
22#include <vnet/ip/ip.h>
23#include <vnet/l2tp/packet.h>
24
25typedef struct {
26 /* ip6 addresses */
27 ip6_address_t our_address;
28 ip6_address_t client_address;
29
30 /* $$$$ maybe add encap-path lookup fib ID? */
31
32 /* l2tpv3 header parameters */
33 u64 local_cookie[2];
34 u64 remote_cookie;
35 u32 local_session_id;
36 u32 remote_session_id;
37
38 /* tunnel interface */
39 u32 hw_if_index;
40 u32 sw_if_index;
41
42 u8 l2tp_hdr_size;
43 u8 l2_sublayer_present;
44 u8 cookie_flags; /* in host byte order */
45} l2t_session_t;
46
47typedef enum {
48 L2T_LOOKUP_SRC_ADDRESS = 0,
49 L2T_LOOKUP_DST_ADDRESS,
50 L2T_LOOKUP_SESSION_ID,
51} ip6_to_l2_lookup_t;
52
53typedef struct {
54 /* session pool */
55 l2t_session_t *sessions;
56
57 /* ip6 -> l2 hash tables. Make up your minds, people... */
58 uword *session_by_src_address;
59 uword *session_by_dst_address;
60 uword *session_by_session_id;
61
62 ip6_to_l2_lookup_t lookup_type;
63
64 /* Counters */
65 vlib_combined_counter_main_t counter_main;
66
67 /* vector of free l2tpv3 tunnel interfaces */
68 u32 * free_l2tpv3_tunnel_hw_if_indices;
69
70 /* show device instance by real device instance */
71 u32 * dev_inst_by_real;
72
73 /* convenience */
74 vlib_main_t *vlib_main;
75 vnet_main_t *vnet_main;
76
77} l2t_main_t;
78
79/* Packet trace structure */
80typedef struct {
81 int is_user_to_network;
82 u32 session_index;
83 ip6_address_t our_address;
84 ip6_address_t client_address;
85} l2t_trace_t;
86
87l2t_main_t l2t_main;
Jean-Mickael Guerin8941ec22016-03-04 14:14:21 +010088extern vlib_node_registration_t l2t_encap_node;
89extern vlib_node_registration_t l2t_decap_node;
Ed Warnickecb9cada2015-12-08 15:45:58 -070090
91enum {
92 SESSION_COUNTER_USER_TO_NETWORK=0,
93 SESSION_COUNTER_NETWORK_TO_USER,
94};
95
96static inline u32 session_index_to_counter_index (u32 session_index,
97 u32 counter_id)
98{
99 return ((session_index << 1) + counter_id);
100}
101
102u8 * format_l2t_trace (u8 * s, va_list * args);
103
104typedef struct {
105 // Any per-interface config would go here
106} ip6_l2tpv3_config_t;
107
108uword unformat_pg_l2tp_header (unformat_input_t * input, va_list * args);
109
110void l2tp_encap_init (vlib_main_t *vm);
111void l2tp_decap_init (void);
112int create_l2tpv3_ipv6_tunnel (l2t_main_t * lm,
113 ip6_address_t * client_address,
114 ip6_address_t * our_address,
115 u32 local_session_id,
116 u32 remote_session_id,
117 u64 local_cookie,
118 u64 remote_cookie,
119 int l2_sublayer_present,
120 u32 * sw_if_index);
121
122int l2tpv3_set_tunnel_cookies (l2t_main_t * lm,
123 u32 sw_if_index,
124 u64 new_local_cookie,
125 u64 new_remote_cookie);
126
127int l2tpv3_interface_enable_disable (vnet_main_t * vnm,
128 u32 sw_if_index,
129 int enable_disable);
130
131#endif /* __included_l2tp_h__ */