Line data Source code
1 : /* 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 <l2tp/packet.h> 24 : 25 : typedef struct 26 : { 27 : /* ip6 addresses */ 28 : ip6_address_t our_address; 29 : ip6_address_t client_address; 30 : 31 : /* l2tpv3 header parameters */ 32 : u64 local_cookie[2]; 33 : u64 remote_cookie; 34 : u32 local_session_id; 35 : u32 remote_session_id; 36 : 37 : /* tunnel interface */ 38 : u32 hw_if_index; 39 : u32 sw_if_index; 40 : 41 : /* fib index used for outgoing encapsulated packets */ 42 : u32 encap_fib_index; 43 : 44 : u8 l2tp_hdr_size; 45 : u8 l2_sublayer_present; 46 : u8 cookie_flags; /* in host byte order */ 47 : 48 : u8 admin_up; 49 : } l2t_session_t; 50 : 51 : typedef enum 52 : { 53 : L2T_LOOKUP_SRC_ADDRESS = 0, 54 : L2T_LOOKUP_DST_ADDRESS, 55 : L2T_LOOKUP_SESSION_ID, 56 : } ip6_to_l2_lookup_t; 57 : 58 : typedef struct 59 : { 60 : /* session pool */ 61 : l2t_session_t *sessions; 62 : 63 : /* ip6 -> l2 hash tables. Make up your minds, people... */ 64 : uword *session_by_src_address; 65 : uword *session_by_dst_address; 66 : uword *session_by_session_id; 67 : 68 : ip6_to_l2_lookup_t lookup_type; 69 : 70 : /* Counters */ 71 : vlib_combined_counter_main_t counter_main; 72 : 73 : /* vector of free l2tpv3 tunnel interfaces */ 74 : u32 *free_l2tpv3_tunnel_hw_if_indices; 75 : 76 : /* show device instance by real device instance */ 77 : u32 *dev_inst_by_real; 78 : 79 : /* convenience */ 80 : vlib_main_t *vlib_main; 81 : vnet_main_t *vnet_main; 82 : 83 : bool proto_registered; 84 : 85 : } l2t_main_t; 86 : 87 : /* Packet trace structure */ 88 : typedef struct 89 : { 90 : int is_user_to_network; 91 : u32 session_index; 92 : ip6_address_t our_address; 93 : ip6_address_t client_address; 94 : } l2t_trace_t; 95 : 96 : extern l2t_main_t l2t_main; 97 : extern vlib_node_registration_t l2t_encap_node; 98 : extern vlib_node_registration_t l2t_decap_node; 99 : extern vlib_node_registration_t l2t_decap_local_node; 100 : 101 : enum 102 : { 103 : SESSION_COUNTER_USER_TO_NETWORK = 0, 104 : SESSION_COUNTER_NETWORK_TO_USER, 105 : }; 106 : 107 : static inline u32 108 1 : session_index_to_counter_index (u32 session_index, u32 counter_id) 109 : { 110 1 : return ((session_index << 1) + counter_id); 111 : } 112 : 113 : u8 *format_l2t_trace (u8 * s, va_list * args); 114 : 115 : typedef struct 116 : { 117 : /* Any per-interface config would go here */ 118 : } ip6_l2tpv3_config_t; 119 : 120 : uword unformat_pg_l2tp_header (unformat_input_t * input, va_list * args); 121 : 122 : void l2tp_encap_init (vlib_main_t * vm); 123 : int create_l2tpv3_ipv6_tunnel (l2t_main_t * lm, 124 : ip6_address_t * client_address, 125 : ip6_address_t * our_address, 126 : u32 local_session_id, 127 : u32 remote_session_id, 128 : u64 local_cookie, 129 : u64 remote_cookie, 130 : int l2_sublayer_present, 131 : u32 encap_fib_index, u32 * sw_if_index); 132 : 133 : int l2tpv3_set_tunnel_cookies (l2t_main_t * lm, 134 : u32 sw_if_index, 135 : u64 new_local_cookie, u64 new_remote_cookie); 136 : 137 : int l2tpv3_interface_enable_disable (vnet_main_t * vnm, 138 : u32 sw_if_index, int enable_disable); 139 : 140 : #endif /* __included_l2tp_h__ */ 141 : 142 : /* 143 : * fd.io coding-style-patch-verification: ON 144 : * 145 : * Local Variables: 146 : * eval: (c-set-style "gnu") 147 : * End: 148 : */