1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3 * Copyright (c) 2021 Taehee Yoo <ap420073@gmail.com>
4 */
5 #ifndef _NET_AMT_H_
6 #define _NET_AMT_H_
7
8 #include <linux/siphash.h>
9 #include <linux/jhash.h>
10
11 enum amt_msg_type {
12 AMT_MSG_DISCOVERY = 1,
13 AMT_MSG_ADVERTISEMENT,
14 AMT_MSG_REQUEST,
15 AMT_MSG_MEMBERSHIP_QUERY,
16 AMT_MSG_MEMBERSHIP_UPDATE,
17 AMT_MSG_MULTICAST_DATA,
18 AMT_MSG_TEARDOWM,
19 __AMT_MSG_MAX,
20 };
21
22 #define AMT_MSG_MAX (__AMT_MSG_MAX - 1)
23
24 enum amt_ops {
25 /* A*B */
26 AMT_OPS_INT,
27 /* A+B */
28 AMT_OPS_UNI,
29 /* A-B */
30 AMT_OPS_SUB,
31 /* B-A */
32 AMT_OPS_SUB_REV,
33 __AMT_OPS_MAX,
34 };
35
36 #define AMT_OPS_MAX (__AMT_OPS_MAX - 1)
37
38 enum amt_filter {
39 AMT_FILTER_FWD,
40 AMT_FILTER_D_FWD,
41 AMT_FILTER_FWD_NEW,
42 AMT_FILTER_D_FWD_NEW,
43 AMT_FILTER_ALL,
44 AMT_FILTER_NONE_NEW,
45 AMT_FILTER_BOTH,
46 AMT_FILTER_BOTH_NEW,
47 __AMT_FILTER_MAX,
48 };
49
50 #define AMT_FILTER_MAX (__AMT_FILTER_MAX - 1)
51
52 enum amt_act {
53 AMT_ACT_GMI,
54 AMT_ACT_GMI_ZERO,
55 AMT_ACT_GT,
56 AMT_ACT_STATUS_FWD_NEW,
57 AMT_ACT_STATUS_D_FWD_NEW,
58 AMT_ACT_STATUS_NONE_NEW,
59 __AMT_ACT_MAX,
60 };
61
62 #define AMT_ACT_MAX (__AMT_ACT_MAX - 1)
63
64 enum amt_status {
65 AMT_STATUS_INIT,
66 AMT_STATUS_SENT_DISCOVERY,
67 AMT_STATUS_RECEIVED_DISCOVERY,
68 AMT_STATUS_SENT_ADVERTISEMENT,
69 AMT_STATUS_RECEIVED_ADVERTISEMENT,
70 AMT_STATUS_SENT_REQUEST,
71 AMT_STATUS_RECEIVED_REQUEST,
72 AMT_STATUS_SENT_QUERY,
73 AMT_STATUS_RECEIVED_QUERY,
74 AMT_STATUS_SENT_UPDATE,
75 AMT_STATUS_RECEIVED_UPDATE,
76 __AMT_STATUS_MAX,
77 };
78
79 #define AMT_STATUS_MAX (__AMT_STATUS_MAX - 1)
80
81 struct amt_header {
82 #if defined(__LITTLE_ENDIAN_BITFIELD)
83 u8 type:4,
84 version:4;
85 #elif defined(__BIG_ENDIAN_BITFIELD)
86 u8 version:4,
87 type:4;
88 #else
89 #error "Please fix <asm/byteorder.h>"
90 #endif
91 } __packed;
92
93 struct amt_header_discovery {
94 #if defined(__LITTLE_ENDIAN_BITFIELD)
95 u32 type:4,
96 version:4,
97 reserved:24;
98 #elif defined(__BIG_ENDIAN_BITFIELD)
99 u32 version:4,
100 type:4,
101 reserved:24;
102 #else
103 #error "Please fix <asm/byteorder.h>"
104 #endif
105 __be32 nonce;
106 } __packed;
107
108 struct amt_header_advertisement {
109 #if defined(__LITTLE_ENDIAN_BITFIELD)
110 u32 type:4,
111 version:4,
112 reserved:24;
113 #elif defined(__BIG_ENDIAN_BITFIELD)
114 u32 version:4,
115 type:4,
116 reserved:24;
117 #else
118 #error "Please fix <asm/byteorder.h>"
119 #endif
120 __be32 nonce;
121 __be32 ip4;
122 } __packed;
123
124 struct amt_header_request {
125 #if defined(__LITTLE_ENDIAN_BITFIELD)
126 u32 type:4,
127 version:4,
128 reserved1:7,
129 p:1,
130 reserved2:16;
131 #elif defined(__BIG_ENDIAN_BITFIELD)
132 u32 version:4,
133 type:4,
134 p:1,
135 reserved1:7,
136 reserved2:16;
137 #else
138 #error "Please fix <asm/byteorder.h>"
139 #endif
140 __be32 nonce;
141 } __packed;
142
143 struct amt_header_membership_query {
144 #if defined(__LITTLE_ENDIAN_BITFIELD)
145 u64 type:4,
146 version:4,
147 reserved:6,
148 l:1,
149 g:1,
150 response_mac:48;
151 #elif defined(__BIG_ENDIAN_BITFIELD)
152 u64 version:4,
153 type:4,
154 g:1,
155 l:1,
156 reserved:6,
157 response_mac:48;
158 #else
159 #error "Please fix <asm/byteorder.h>"
160 #endif
161 __be32 nonce;
162 } __packed;
163
164 struct amt_header_membership_update {
165 #if defined(__LITTLE_ENDIAN_BITFIELD)
166 u64 type:4,
167 version:4,
168 reserved:8,
169 response_mac:48;
170 #elif defined(__BIG_ENDIAN_BITFIELD)
171 u64 version:4,
172 type:4,
173 reserved:8,
174 response_mac:48;
175 #else
176 #error "Please fix <asm/byteorder.h>"
177 #endif
178 __be32 nonce;
179 } __packed;
180
181 struct amt_header_mcast_data {
182 #if defined(__LITTLE_ENDIAN_BITFIELD)
183 u16 type:4,
184 version:4,
185 reserved:8;
186 #elif defined(__BIG_ENDIAN_BITFIELD)
187 u16 version:4,
188 type:4,
189 reserved:8;
190 #else
191 #error "Please fix <asm/byteorder.h>"
192 #endif
193 } __packed;
194
195 struct amt_headers {
196 union {
197 struct amt_header_discovery discovery;
198 struct amt_header_advertisement advertisement;
199 struct amt_header_request request;
200 struct amt_header_membership_query query;
201 struct amt_header_membership_update update;
202 struct amt_header_mcast_data data;
203 };
204 } __packed;
205
206 struct amt_gw_headers {
207 union {
208 struct amt_header_discovery discovery;
209 struct amt_header_request request;
210 struct amt_header_membership_update update;
211 };
212 } __packed;
213
214 struct amt_relay_headers {
215 union {
216 struct amt_header_advertisement advertisement;
217 struct amt_header_membership_query query;
218 struct amt_header_mcast_data data;
219 };
220 } __packed;
221
222 struct amt_skb_cb {
223 struct amt_tunnel_list *tunnel;
224 };
225
226 struct amt_tunnel_list {
227 struct list_head list;
228 /* Protect All resources under an amt_tunne_list */
229 spinlock_t lock;
230 struct amt_dev *amt;
231 u32 nr_groups;
232 u32 nr_sources;
233 enum amt_status status;
234 struct delayed_work gc_wq;
235 __be16 source_port;
236 __be32 ip4;
237 __be32 nonce;
238 siphash_key_t key;
239 u64 mac:48,
240 reserved:16;
241 struct rcu_head rcu;
242 struct hlist_head groups[];
243 };
244
245 union amt_addr {
246 __be32 ip4;
247 #if IS_ENABLED(CONFIG_IPV6)
248 struct in6_addr ip6;
249 #endif
250 };
251
252 /* RFC 3810
253 *
254 * When the router is in EXCLUDE mode, the router state is represented
255 * by the notation EXCLUDE (X,Y), where X is called the "Requested List"
256 * and Y is called the "Exclude List". All sources, except those from
257 * the Exclude List, will be forwarded by the router
258 */
259 enum amt_source_status {
260 AMT_SOURCE_STATUS_NONE,
261 /* Node of Requested List */
262 AMT_SOURCE_STATUS_FWD,
263 /* Node of Exclude List */
264 AMT_SOURCE_STATUS_D_FWD,
265 };
266
267 /* protected by gnode->lock */
268 struct amt_source_node {
269 struct hlist_node node;
270 struct amt_group_node *gnode;
271 struct delayed_work source_timer;
272 union amt_addr source_addr;
273 enum amt_source_status status;
274 #define AMT_SOURCE_OLD 0
275 #define AMT_SOURCE_NEW 1
276 u8 flags;
277 struct rcu_head rcu;
278 };
279
280 /* Protected by amt_tunnel_list->lock */
281 struct amt_group_node {
282 struct amt_dev *amt;
283 union amt_addr group_addr;
284 union amt_addr host_addr;
285 bool v6;
286 u8 filter_mode;
287 u32 nr_sources;
288 struct amt_tunnel_list *tunnel_list;
289 struct hlist_node node;
290 struct delayed_work group_timer;
291 struct rcu_head rcu;
292 struct hlist_head sources[];
293 };
294
295 struct amt_dev {
296 struct net_device *dev;
297 struct net_device *stream_dev;
298 struct net *net;
299 /* Global lock for amt device */
300 spinlock_t lock;
301 /* Used only in relay mode */
302 struct list_head tunnel_list;
303 struct gro_cells gro_cells;
304
305 /* Protected by RTNL */
306 struct delayed_work discovery_wq;
307 /* Protected by RTNL */
308 struct delayed_work req_wq;
309 /* Protected by RTNL */
310 struct delayed_work secret_wq;
311 /* AMT status */
312 enum amt_status status;
313 /* Generated key */
314 siphash_key_t key;
315 struct socket __rcu *sock;
316 u32 max_groups;
317 u32 max_sources;
318 u32 hash_buckets;
319 u32 hash_seed;
320 /* Default 128 */
321 u32 max_tunnels;
322 /* Default 128 */
323 u32 nr_tunnels;
324 /* Gateway or Relay mode */
325 u32 mode;
326 /* Default 2268 */
327 __be16 relay_port;
328 /* Default 2268 */
329 __be16 gw_port;
330 /* Outer local ip */
331 __be32 local_ip;
332 /* Outer remote ip */
333 __be32 remote_ip;
334 /* Outer discovery ip */
335 __be32 discovery_ip;
336 /* Only used in gateway mode */
337 __be32 nonce;
338 /* Gateway sent request and received query */
339 bool ready4;
340 bool ready6;
341 u8 req_cnt;
342 u8 qi;
343 u64 qrv;
344 u64 qri;
345 /* Used only in gateway mode */
346 u64 mac:48,
347 reserved:16;
348 };
349
350 #define AMT_TOS 0xc0
351 #define AMT_IPHDR_OPTS 4
352 #define AMT_IP6HDR_OPTS 8
353 #define AMT_GC_INTERVAL (30 * 1000)
354 #define AMT_MAX_GROUP 32
355 #define AMT_MAX_SOURCE 128
356 #define AMT_HSIZE_SHIFT 8
357 #define AMT_HSIZE (1 << AMT_HSIZE_SHIFT)
358
359 #define AMT_DISCOVERY_TIMEOUT 5000
360 #define AMT_INIT_REQ_TIMEOUT 1
361 #define AMT_INIT_QUERY_INTERVAL 125
362 #define AMT_MAX_REQ_TIMEOUT 120
363 #define AMT_MAX_REQ_COUNT 3
364 #define AMT_SECRET_TIMEOUT 60000
365 #define IANA_AMT_UDP_PORT 2268
366 #define AMT_MAX_TUNNELS 128
367 #define AMT_MAX_REQS 128
368 #define AMT_GW_HLEN (sizeof(struct iphdr) + \
369 sizeof(struct udphdr) + \
370 sizeof(struct amt_gw_headers))
371 #define AMT_RELAY_HLEN (sizeof(struct iphdr) + \
372 sizeof(struct udphdr) + \
373 sizeof(struct amt_relay_headers))
374
netif_is_amt(const struct net_device * dev)375 static inline bool netif_is_amt(const struct net_device *dev)
376 {
377 return dev->rtnl_link_ops && !strcmp(dev->rtnl_link_ops->kind, "amt");
378 }
379
amt_gmi(const struct amt_dev * amt)380 static inline u64 amt_gmi(const struct amt_dev *amt)
381 {
382 return ((amt->qrv * amt->qi) + amt->qri) * 1000;
383 }
384
385 #endif /* _NET_AMT_H_ */
386