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