162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2021 Taehee Yoo <ap420073@gmail.com>
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#ifndef _NET_AMT_H_
662306a36Sopenharmony_ci#define _NET_AMT_H_
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/siphash.h>
962306a36Sopenharmony_ci#include <linux/jhash.h>
1062306a36Sopenharmony_ci#include <linux/netdevice.h>
1162306a36Sopenharmony_ci#include <net/gro_cells.h>
1262306a36Sopenharmony_ci#include <net/rtnetlink.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cienum amt_msg_type {
1562306a36Sopenharmony_ci	AMT_MSG_DISCOVERY = 1,
1662306a36Sopenharmony_ci	AMT_MSG_ADVERTISEMENT,
1762306a36Sopenharmony_ci	AMT_MSG_REQUEST,
1862306a36Sopenharmony_ci	AMT_MSG_MEMBERSHIP_QUERY,
1962306a36Sopenharmony_ci	AMT_MSG_MEMBERSHIP_UPDATE,
2062306a36Sopenharmony_ci	AMT_MSG_MULTICAST_DATA,
2162306a36Sopenharmony_ci	AMT_MSG_TEARDOWN,
2262306a36Sopenharmony_ci	__AMT_MSG_MAX,
2362306a36Sopenharmony_ci};
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#define AMT_MSG_MAX (__AMT_MSG_MAX - 1)
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cienum amt_ops {
2862306a36Sopenharmony_ci	/* A*B */
2962306a36Sopenharmony_ci	AMT_OPS_INT,
3062306a36Sopenharmony_ci	/* A+B */
3162306a36Sopenharmony_ci	AMT_OPS_UNI,
3262306a36Sopenharmony_ci	/* A-B */
3362306a36Sopenharmony_ci	AMT_OPS_SUB,
3462306a36Sopenharmony_ci	/* B-A */
3562306a36Sopenharmony_ci	AMT_OPS_SUB_REV,
3662306a36Sopenharmony_ci	__AMT_OPS_MAX,
3762306a36Sopenharmony_ci};
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define AMT_OPS_MAX (__AMT_OPS_MAX - 1)
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cienum amt_filter {
4262306a36Sopenharmony_ci	AMT_FILTER_FWD,
4362306a36Sopenharmony_ci	AMT_FILTER_D_FWD,
4462306a36Sopenharmony_ci	AMT_FILTER_FWD_NEW,
4562306a36Sopenharmony_ci	AMT_FILTER_D_FWD_NEW,
4662306a36Sopenharmony_ci	AMT_FILTER_ALL,
4762306a36Sopenharmony_ci	AMT_FILTER_NONE_NEW,
4862306a36Sopenharmony_ci	AMT_FILTER_BOTH,
4962306a36Sopenharmony_ci	AMT_FILTER_BOTH_NEW,
5062306a36Sopenharmony_ci	__AMT_FILTER_MAX,
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#define AMT_FILTER_MAX (__AMT_FILTER_MAX - 1)
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cienum amt_act {
5662306a36Sopenharmony_ci	AMT_ACT_GMI,
5762306a36Sopenharmony_ci	AMT_ACT_GMI_ZERO,
5862306a36Sopenharmony_ci	AMT_ACT_GT,
5962306a36Sopenharmony_ci	AMT_ACT_STATUS_FWD_NEW,
6062306a36Sopenharmony_ci	AMT_ACT_STATUS_D_FWD_NEW,
6162306a36Sopenharmony_ci	AMT_ACT_STATUS_NONE_NEW,
6262306a36Sopenharmony_ci	__AMT_ACT_MAX,
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#define AMT_ACT_MAX (__AMT_ACT_MAX - 1)
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cienum amt_status {
6862306a36Sopenharmony_ci	AMT_STATUS_INIT,
6962306a36Sopenharmony_ci	AMT_STATUS_SENT_DISCOVERY,
7062306a36Sopenharmony_ci	AMT_STATUS_RECEIVED_DISCOVERY,
7162306a36Sopenharmony_ci	AMT_STATUS_SENT_ADVERTISEMENT,
7262306a36Sopenharmony_ci	AMT_STATUS_RECEIVED_ADVERTISEMENT,
7362306a36Sopenharmony_ci	AMT_STATUS_SENT_REQUEST,
7462306a36Sopenharmony_ci	AMT_STATUS_RECEIVED_REQUEST,
7562306a36Sopenharmony_ci	AMT_STATUS_SENT_QUERY,
7662306a36Sopenharmony_ci	AMT_STATUS_RECEIVED_QUERY,
7762306a36Sopenharmony_ci	AMT_STATUS_SENT_UPDATE,
7862306a36Sopenharmony_ci	AMT_STATUS_RECEIVED_UPDATE,
7962306a36Sopenharmony_ci	__AMT_STATUS_MAX,
8062306a36Sopenharmony_ci};
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci#define AMT_STATUS_MAX (__AMT_STATUS_MAX - 1)
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci/* Gateway events only */
8562306a36Sopenharmony_cienum amt_event {
8662306a36Sopenharmony_ci	AMT_EVENT_NONE,
8762306a36Sopenharmony_ci	AMT_EVENT_RECEIVE,
8862306a36Sopenharmony_ci	AMT_EVENT_SEND_DISCOVERY,
8962306a36Sopenharmony_ci	AMT_EVENT_SEND_REQUEST,
9062306a36Sopenharmony_ci	__AMT_EVENT_MAX,
9162306a36Sopenharmony_ci};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistruct amt_header {
9462306a36Sopenharmony_ci#if defined(__LITTLE_ENDIAN_BITFIELD)
9562306a36Sopenharmony_ci	u8 type:4,
9662306a36Sopenharmony_ci	   version:4;
9762306a36Sopenharmony_ci#elif defined(__BIG_ENDIAN_BITFIELD)
9862306a36Sopenharmony_ci	u8 version:4,
9962306a36Sopenharmony_ci	   type:4;
10062306a36Sopenharmony_ci#else
10162306a36Sopenharmony_ci#error  "Please fix <asm/byteorder.h>"
10262306a36Sopenharmony_ci#endif
10362306a36Sopenharmony_ci} __packed;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistruct amt_header_discovery {
10662306a36Sopenharmony_ci#if defined(__LITTLE_ENDIAN_BITFIELD)
10762306a36Sopenharmony_ci	u32	type:4,
10862306a36Sopenharmony_ci		version:4,
10962306a36Sopenharmony_ci		reserved:24;
11062306a36Sopenharmony_ci#elif defined(__BIG_ENDIAN_BITFIELD)
11162306a36Sopenharmony_ci	u32	version:4,
11262306a36Sopenharmony_ci		type:4,
11362306a36Sopenharmony_ci		reserved:24;
11462306a36Sopenharmony_ci#else
11562306a36Sopenharmony_ci#error  "Please fix <asm/byteorder.h>"
11662306a36Sopenharmony_ci#endif
11762306a36Sopenharmony_ci	__be32	nonce;
11862306a36Sopenharmony_ci} __packed;
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cistruct amt_header_advertisement {
12162306a36Sopenharmony_ci#if defined(__LITTLE_ENDIAN_BITFIELD)
12262306a36Sopenharmony_ci	u32	type:4,
12362306a36Sopenharmony_ci		version:4,
12462306a36Sopenharmony_ci		reserved:24;
12562306a36Sopenharmony_ci#elif defined(__BIG_ENDIAN_BITFIELD)
12662306a36Sopenharmony_ci	u32	version:4,
12762306a36Sopenharmony_ci		type:4,
12862306a36Sopenharmony_ci		reserved:24;
12962306a36Sopenharmony_ci#else
13062306a36Sopenharmony_ci#error  "Please fix <asm/byteorder.h>"
13162306a36Sopenharmony_ci#endif
13262306a36Sopenharmony_ci	__be32	nonce;
13362306a36Sopenharmony_ci	__be32	ip4;
13462306a36Sopenharmony_ci} __packed;
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_cistruct amt_header_request {
13762306a36Sopenharmony_ci#if defined(__LITTLE_ENDIAN_BITFIELD)
13862306a36Sopenharmony_ci	u32	type:4,
13962306a36Sopenharmony_ci		version:4,
14062306a36Sopenharmony_ci		reserved1:7,
14162306a36Sopenharmony_ci		p:1,
14262306a36Sopenharmony_ci		reserved2:16;
14362306a36Sopenharmony_ci#elif defined(__BIG_ENDIAN_BITFIELD)
14462306a36Sopenharmony_ci	u32	version:4,
14562306a36Sopenharmony_ci		type:4,
14662306a36Sopenharmony_ci		p:1,
14762306a36Sopenharmony_ci		reserved1:7,
14862306a36Sopenharmony_ci		reserved2:16;
14962306a36Sopenharmony_ci#else
15062306a36Sopenharmony_ci#error  "Please fix <asm/byteorder.h>"
15162306a36Sopenharmony_ci#endif
15262306a36Sopenharmony_ci	__be32	nonce;
15362306a36Sopenharmony_ci} __packed;
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_cistruct amt_header_membership_query {
15662306a36Sopenharmony_ci#if defined(__LITTLE_ENDIAN_BITFIELD)
15762306a36Sopenharmony_ci	u64	type:4,
15862306a36Sopenharmony_ci		version:4,
15962306a36Sopenharmony_ci		reserved:6,
16062306a36Sopenharmony_ci		l:1,
16162306a36Sopenharmony_ci		g:1,
16262306a36Sopenharmony_ci		response_mac:48;
16362306a36Sopenharmony_ci#elif defined(__BIG_ENDIAN_BITFIELD)
16462306a36Sopenharmony_ci	u64	version:4,
16562306a36Sopenharmony_ci		type:4,
16662306a36Sopenharmony_ci		g:1,
16762306a36Sopenharmony_ci		l:1,
16862306a36Sopenharmony_ci		reserved:6,
16962306a36Sopenharmony_ci		response_mac:48;
17062306a36Sopenharmony_ci#else
17162306a36Sopenharmony_ci#error  "Please fix <asm/byteorder.h>"
17262306a36Sopenharmony_ci#endif
17362306a36Sopenharmony_ci	__be32	nonce;
17462306a36Sopenharmony_ci} __packed;
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_cistruct amt_header_membership_update {
17762306a36Sopenharmony_ci#if defined(__LITTLE_ENDIAN_BITFIELD)
17862306a36Sopenharmony_ci	u64	type:4,
17962306a36Sopenharmony_ci		version:4,
18062306a36Sopenharmony_ci		reserved:8,
18162306a36Sopenharmony_ci		response_mac:48;
18262306a36Sopenharmony_ci#elif defined(__BIG_ENDIAN_BITFIELD)
18362306a36Sopenharmony_ci	u64	version:4,
18462306a36Sopenharmony_ci		type:4,
18562306a36Sopenharmony_ci		reserved:8,
18662306a36Sopenharmony_ci		response_mac:48;
18762306a36Sopenharmony_ci#else
18862306a36Sopenharmony_ci#error  "Please fix <asm/byteorder.h>"
18962306a36Sopenharmony_ci#endif
19062306a36Sopenharmony_ci	__be32	nonce;
19162306a36Sopenharmony_ci} __packed;
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_cistruct amt_header_mcast_data {
19462306a36Sopenharmony_ci#if defined(__LITTLE_ENDIAN_BITFIELD)
19562306a36Sopenharmony_ci	u16	type:4,
19662306a36Sopenharmony_ci		version:4,
19762306a36Sopenharmony_ci		reserved:8;
19862306a36Sopenharmony_ci#elif defined(__BIG_ENDIAN_BITFIELD)
19962306a36Sopenharmony_ci	u16	version:4,
20062306a36Sopenharmony_ci		type:4,
20162306a36Sopenharmony_ci		reserved:8;
20262306a36Sopenharmony_ci#else
20362306a36Sopenharmony_ci#error  "Please fix <asm/byteorder.h>"
20462306a36Sopenharmony_ci#endif
20562306a36Sopenharmony_ci} __packed;
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_cistruct amt_headers {
20862306a36Sopenharmony_ci	union {
20962306a36Sopenharmony_ci		struct amt_header_discovery discovery;
21062306a36Sopenharmony_ci		struct amt_header_advertisement advertisement;
21162306a36Sopenharmony_ci		struct amt_header_request request;
21262306a36Sopenharmony_ci		struct amt_header_membership_query query;
21362306a36Sopenharmony_ci		struct amt_header_membership_update update;
21462306a36Sopenharmony_ci		struct amt_header_mcast_data data;
21562306a36Sopenharmony_ci	};
21662306a36Sopenharmony_ci} __packed;
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_cistruct amt_gw_headers {
21962306a36Sopenharmony_ci	union {
22062306a36Sopenharmony_ci		struct amt_header_discovery discovery;
22162306a36Sopenharmony_ci		struct amt_header_request request;
22262306a36Sopenharmony_ci		struct amt_header_membership_update update;
22362306a36Sopenharmony_ci	};
22462306a36Sopenharmony_ci} __packed;
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_cistruct amt_relay_headers {
22762306a36Sopenharmony_ci	union {
22862306a36Sopenharmony_ci		struct amt_header_advertisement advertisement;
22962306a36Sopenharmony_ci		struct amt_header_membership_query query;
23062306a36Sopenharmony_ci		struct amt_header_mcast_data data;
23162306a36Sopenharmony_ci	};
23262306a36Sopenharmony_ci} __packed;
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_cistruct amt_skb_cb {
23562306a36Sopenharmony_ci	struct amt_tunnel_list *tunnel;
23662306a36Sopenharmony_ci};
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_cistruct amt_tunnel_list {
23962306a36Sopenharmony_ci	struct list_head	list;
24062306a36Sopenharmony_ci	/* Protect All resources under an amt_tunne_list */
24162306a36Sopenharmony_ci	spinlock_t		lock;
24262306a36Sopenharmony_ci	struct amt_dev		*amt;
24362306a36Sopenharmony_ci	u32			nr_groups;
24462306a36Sopenharmony_ci	u32			nr_sources;
24562306a36Sopenharmony_ci	enum amt_status		status;
24662306a36Sopenharmony_ci	struct delayed_work	gc_wq;
24762306a36Sopenharmony_ci	__be16			source_port;
24862306a36Sopenharmony_ci	__be32			ip4;
24962306a36Sopenharmony_ci	__be32			nonce;
25062306a36Sopenharmony_ci	siphash_key_t		key;
25162306a36Sopenharmony_ci	u64			mac:48,
25262306a36Sopenharmony_ci				reserved:16;
25362306a36Sopenharmony_ci	struct rcu_head		rcu;
25462306a36Sopenharmony_ci	struct hlist_head	groups[];
25562306a36Sopenharmony_ci};
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ciunion amt_addr {
25862306a36Sopenharmony_ci	__be32			ip4;
25962306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_IPV6)
26062306a36Sopenharmony_ci	struct in6_addr		ip6;
26162306a36Sopenharmony_ci#endif
26262306a36Sopenharmony_ci};
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci/* RFC 3810
26562306a36Sopenharmony_ci *
26662306a36Sopenharmony_ci * When the router is in EXCLUDE mode, the router state is represented
26762306a36Sopenharmony_ci * by the notation EXCLUDE (X,Y), where X is called the "Requested List"
26862306a36Sopenharmony_ci * and Y is called the "Exclude List".  All sources, except those from
26962306a36Sopenharmony_ci * the Exclude List, will be forwarded by the router
27062306a36Sopenharmony_ci */
27162306a36Sopenharmony_cienum amt_source_status {
27262306a36Sopenharmony_ci	AMT_SOURCE_STATUS_NONE,
27362306a36Sopenharmony_ci	/* Node of Requested List */
27462306a36Sopenharmony_ci	AMT_SOURCE_STATUS_FWD,
27562306a36Sopenharmony_ci	/* Node of Exclude List */
27662306a36Sopenharmony_ci	AMT_SOURCE_STATUS_D_FWD,
27762306a36Sopenharmony_ci};
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci/* protected by gnode->lock */
28062306a36Sopenharmony_cistruct amt_source_node {
28162306a36Sopenharmony_ci	struct hlist_node	node;
28262306a36Sopenharmony_ci	struct amt_group_node	*gnode;
28362306a36Sopenharmony_ci	struct delayed_work     source_timer;
28462306a36Sopenharmony_ci	union amt_addr		source_addr;
28562306a36Sopenharmony_ci	enum amt_source_status	status;
28662306a36Sopenharmony_ci#define AMT_SOURCE_OLD	0
28762306a36Sopenharmony_ci#define AMT_SOURCE_NEW	1
28862306a36Sopenharmony_ci	u8			flags;
28962306a36Sopenharmony_ci	struct rcu_head		rcu;
29062306a36Sopenharmony_ci};
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci/* Protected by amt_tunnel_list->lock */
29362306a36Sopenharmony_cistruct amt_group_node {
29462306a36Sopenharmony_ci	struct amt_dev		*amt;
29562306a36Sopenharmony_ci	union amt_addr		group_addr;
29662306a36Sopenharmony_ci	union amt_addr		host_addr;
29762306a36Sopenharmony_ci	bool			v6;
29862306a36Sopenharmony_ci	u8			filter_mode;
29962306a36Sopenharmony_ci	u32			nr_sources;
30062306a36Sopenharmony_ci	struct amt_tunnel_list	*tunnel_list;
30162306a36Sopenharmony_ci	struct hlist_node	node;
30262306a36Sopenharmony_ci	struct delayed_work     group_timer;
30362306a36Sopenharmony_ci	struct rcu_head		rcu;
30462306a36Sopenharmony_ci	struct hlist_head	sources[];
30562306a36Sopenharmony_ci};
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci#define AMT_MAX_EVENTS	16
30862306a36Sopenharmony_cistruct amt_events {
30962306a36Sopenharmony_ci	enum amt_event event;
31062306a36Sopenharmony_ci	struct sk_buff *skb;
31162306a36Sopenharmony_ci};
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_cistruct amt_dev {
31462306a36Sopenharmony_ci	struct net_device       *dev;
31562306a36Sopenharmony_ci	struct net_device       *stream_dev;
31662306a36Sopenharmony_ci	struct net		*net;
31762306a36Sopenharmony_ci	/* Global lock for amt device */
31862306a36Sopenharmony_ci	spinlock_t		lock;
31962306a36Sopenharmony_ci	/* Used only in relay mode */
32062306a36Sopenharmony_ci	struct list_head        tunnel_list;
32162306a36Sopenharmony_ci	struct gro_cells	gro_cells;
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci	/* Protected by RTNL */
32462306a36Sopenharmony_ci	struct delayed_work     discovery_wq;
32562306a36Sopenharmony_ci	/* Protected by RTNL */
32662306a36Sopenharmony_ci	struct delayed_work     req_wq;
32762306a36Sopenharmony_ci	/* Protected by RTNL */
32862306a36Sopenharmony_ci	struct delayed_work     secret_wq;
32962306a36Sopenharmony_ci	struct work_struct	event_wq;
33062306a36Sopenharmony_ci	/* AMT status */
33162306a36Sopenharmony_ci	enum amt_status		status;
33262306a36Sopenharmony_ci	/* Generated key */
33362306a36Sopenharmony_ci	siphash_key_t		key;
33462306a36Sopenharmony_ci	struct socket	  __rcu *sock;
33562306a36Sopenharmony_ci	u32			max_groups;
33662306a36Sopenharmony_ci	u32			max_sources;
33762306a36Sopenharmony_ci	u32			hash_buckets;
33862306a36Sopenharmony_ci	u32			hash_seed;
33962306a36Sopenharmony_ci	/* Default 128 */
34062306a36Sopenharmony_ci	u32                     max_tunnels;
34162306a36Sopenharmony_ci	/* Default 128 */
34262306a36Sopenharmony_ci	u32                     nr_tunnels;
34362306a36Sopenharmony_ci	/* Gateway or Relay mode */
34462306a36Sopenharmony_ci	u32                     mode;
34562306a36Sopenharmony_ci	/* Default 2268 */
34662306a36Sopenharmony_ci	__be16			relay_port;
34762306a36Sopenharmony_ci	/* Default 2268 */
34862306a36Sopenharmony_ci	__be16			gw_port;
34962306a36Sopenharmony_ci	/* Outer local ip */
35062306a36Sopenharmony_ci	__be32			local_ip;
35162306a36Sopenharmony_ci	/* Outer remote ip */
35262306a36Sopenharmony_ci	__be32			remote_ip;
35362306a36Sopenharmony_ci	/* Outer discovery ip */
35462306a36Sopenharmony_ci	__be32			discovery_ip;
35562306a36Sopenharmony_ci	/* Only used in gateway mode */
35662306a36Sopenharmony_ci	__be32			nonce;
35762306a36Sopenharmony_ci	/* Gateway sent request and received query */
35862306a36Sopenharmony_ci	bool			ready4;
35962306a36Sopenharmony_ci	bool			ready6;
36062306a36Sopenharmony_ci	u8			req_cnt;
36162306a36Sopenharmony_ci	u8			qi;
36262306a36Sopenharmony_ci	u64			qrv;
36362306a36Sopenharmony_ci	u64			qri;
36462306a36Sopenharmony_ci	/* Used only in gateway mode */
36562306a36Sopenharmony_ci	u64			mac:48,
36662306a36Sopenharmony_ci				reserved:16;
36762306a36Sopenharmony_ci	/* AMT gateway side message handler queue */
36862306a36Sopenharmony_ci	struct amt_events	events[AMT_MAX_EVENTS];
36962306a36Sopenharmony_ci	u8			event_idx;
37062306a36Sopenharmony_ci	u8			nr_events;
37162306a36Sopenharmony_ci};
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci#define AMT_TOS			0xc0
37462306a36Sopenharmony_ci#define AMT_IPHDR_OPTS		4
37562306a36Sopenharmony_ci#define AMT_IP6HDR_OPTS		8
37662306a36Sopenharmony_ci#define AMT_GC_INTERVAL		(30 * 1000)
37762306a36Sopenharmony_ci#define AMT_MAX_GROUP		32
37862306a36Sopenharmony_ci#define AMT_MAX_SOURCE		128
37962306a36Sopenharmony_ci#define AMT_HSIZE_SHIFT		8
38062306a36Sopenharmony_ci#define AMT_HSIZE		(1 << AMT_HSIZE_SHIFT)
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_ci#define AMT_DISCOVERY_TIMEOUT	5000
38362306a36Sopenharmony_ci#define AMT_INIT_REQ_TIMEOUT	1
38462306a36Sopenharmony_ci#define AMT_INIT_QUERY_INTERVAL	125
38562306a36Sopenharmony_ci#define AMT_MAX_REQ_TIMEOUT	120
38662306a36Sopenharmony_ci#define AMT_MAX_REQ_COUNT	3
38762306a36Sopenharmony_ci#define AMT_SECRET_TIMEOUT	60000
38862306a36Sopenharmony_ci#define IANA_AMT_UDP_PORT	2268
38962306a36Sopenharmony_ci#define AMT_MAX_TUNNELS         128
39062306a36Sopenharmony_ci#define AMT_MAX_REQS		128
39162306a36Sopenharmony_ci#define AMT_GW_HLEN (sizeof(struct iphdr) + \
39262306a36Sopenharmony_ci		     sizeof(struct udphdr) + \
39362306a36Sopenharmony_ci		     sizeof(struct amt_gw_headers))
39462306a36Sopenharmony_ci#define AMT_RELAY_HLEN (sizeof(struct iphdr) + \
39562306a36Sopenharmony_ci		     sizeof(struct udphdr) + \
39662306a36Sopenharmony_ci		     sizeof(struct amt_relay_headers))
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_cistatic inline bool netif_is_amt(const struct net_device *dev)
39962306a36Sopenharmony_ci{
40062306a36Sopenharmony_ci	return dev->rtnl_link_ops && !strcmp(dev->rtnl_link_ops->kind, "amt");
40162306a36Sopenharmony_ci}
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_cistatic inline u64 amt_gmi(const struct amt_dev *amt)
40462306a36Sopenharmony_ci{
40562306a36Sopenharmony_ci	return ((amt->qrv * amt->qi) + amt->qri) * 1000;
40662306a36Sopenharmony_ci}
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci#endif /* _NET_AMT_H_ */
409