xref: /OK3568_Linux_fs/kernel/include/net/flow.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *	Generic internet FLOW.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef _NET_FLOW_H
9*4882a593Smuzhiyun #define _NET_FLOW_H
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/socket.h>
12*4882a593Smuzhiyun #include <linux/in6.h>
13*4882a593Smuzhiyun #include <linux/atomic.h>
14*4882a593Smuzhiyun #include <net/flow_dissector.h>
15*4882a593Smuzhiyun #include <linux/uidgid.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun /*
18*4882a593Smuzhiyun  * ifindex generation is per-net namespace, and loopback is
19*4882a593Smuzhiyun  * always the 1st device in ns (see net_dev_init), thus any
20*4882a593Smuzhiyun  * loopback device should get ifindex 1
21*4882a593Smuzhiyun  */
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define LOOPBACK_IFINDEX	1
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun struct flowi_tunnel {
26*4882a593Smuzhiyun 	__be64			tun_id;
27*4882a593Smuzhiyun };
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun struct flowi_common {
30*4882a593Smuzhiyun 	int	flowic_oif;
31*4882a593Smuzhiyun 	int	flowic_iif;
32*4882a593Smuzhiyun 	__u32	flowic_mark;
33*4882a593Smuzhiyun 	__u8	flowic_tos;
34*4882a593Smuzhiyun 	__u8	flowic_scope;
35*4882a593Smuzhiyun 	__u8	flowic_proto;
36*4882a593Smuzhiyun 	__u8	flowic_flags;
37*4882a593Smuzhiyun #define FLOWI_FLAG_ANYSRC		0x01
38*4882a593Smuzhiyun #define FLOWI_FLAG_KNOWN_NH		0x02
39*4882a593Smuzhiyun #define FLOWI_FLAG_SKIP_NH_OIF		0x04
40*4882a593Smuzhiyun 	__u32	flowic_secid;
41*4882a593Smuzhiyun 	kuid_t  flowic_uid;
42*4882a593Smuzhiyun 	struct flowi_tunnel flowic_tun_key;
43*4882a593Smuzhiyun 	__u32		flowic_multipath_hash;
44*4882a593Smuzhiyun };
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun union flowi_uli {
47*4882a593Smuzhiyun 	struct {
48*4882a593Smuzhiyun 		__be16	dport;
49*4882a593Smuzhiyun 		__be16	sport;
50*4882a593Smuzhiyun 	} ports;
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun 	struct {
53*4882a593Smuzhiyun 		__u8	type;
54*4882a593Smuzhiyun 		__u8	code;
55*4882a593Smuzhiyun 	} icmpt;
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	struct {
58*4882a593Smuzhiyun 		__le16	dport;
59*4882a593Smuzhiyun 		__le16	sport;
60*4882a593Smuzhiyun 	} dnports;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	__be32		spi;
63*4882a593Smuzhiyun 	__be32		gre_key;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	struct {
66*4882a593Smuzhiyun 		__u8	type;
67*4882a593Smuzhiyun 	} mht;
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun struct flowi4 {
71*4882a593Smuzhiyun 	struct flowi_common	__fl_common;
72*4882a593Smuzhiyun #define flowi4_oif		__fl_common.flowic_oif
73*4882a593Smuzhiyun #define flowi4_iif		__fl_common.flowic_iif
74*4882a593Smuzhiyun #define flowi4_mark		__fl_common.flowic_mark
75*4882a593Smuzhiyun #define flowi4_tos		__fl_common.flowic_tos
76*4882a593Smuzhiyun #define flowi4_scope		__fl_common.flowic_scope
77*4882a593Smuzhiyun #define flowi4_proto		__fl_common.flowic_proto
78*4882a593Smuzhiyun #define flowi4_flags		__fl_common.flowic_flags
79*4882a593Smuzhiyun #define flowi4_secid		__fl_common.flowic_secid
80*4882a593Smuzhiyun #define flowi4_tun_key		__fl_common.flowic_tun_key
81*4882a593Smuzhiyun #define flowi4_uid		__fl_common.flowic_uid
82*4882a593Smuzhiyun #define flowi4_multipath_hash	__fl_common.flowic_multipath_hash
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	/* (saddr,daddr) must be grouped, same order as in IP header */
85*4882a593Smuzhiyun 	__be32			saddr;
86*4882a593Smuzhiyun 	__be32			daddr;
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	union flowi_uli		uli;
89*4882a593Smuzhiyun #define fl4_sport		uli.ports.sport
90*4882a593Smuzhiyun #define fl4_dport		uli.ports.dport
91*4882a593Smuzhiyun #define fl4_icmp_type		uli.icmpt.type
92*4882a593Smuzhiyun #define fl4_icmp_code		uli.icmpt.code
93*4882a593Smuzhiyun #define fl4_ipsec_spi		uli.spi
94*4882a593Smuzhiyun #define fl4_mh_type		uli.mht.type
95*4882a593Smuzhiyun #define fl4_gre_key		uli.gre_key
96*4882a593Smuzhiyun } __attribute__((__aligned__(BITS_PER_LONG/8)));
97*4882a593Smuzhiyun 
flowi4_init_output(struct flowi4 * fl4,int oif,__u32 mark,__u8 tos,__u8 scope,__u8 proto,__u8 flags,__be32 daddr,__be32 saddr,__be16 dport,__be16 sport,kuid_t uid)98*4882a593Smuzhiyun static inline void flowi4_init_output(struct flowi4 *fl4, int oif,
99*4882a593Smuzhiyun 				      __u32 mark, __u8 tos, __u8 scope,
100*4882a593Smuzhiyun 				      __u8 proto, __u8 flags,
101*4882a593Smuzhiyun 				      __be32 daddr, __be32 saddr,
102*4882a593Smuzhiyun 				      __be16 dport, __be16 sport,
103*4882a593Smuzhiyun 				      kuid_t uid)
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun 	fl4->flowi4_oif = oif;
106*4882a593Smuzhiyun 	fl4->flowi4_iif = LOOPBACK_IFINDEX;
107*4882a593Smuzhiyun 	fl4->flowi4_mark = mark;
108*4882a593Smuzhiyun 	fl4->flowi4_tos = tos;
109*4882a593Smuzhiyun 	fl4->flowi4_scope = scope;
110*4882a593Smuzhiyun 	fl4->flowi4_proto = proto;
111*4882a593Smuzhiyun 	fl4->flowi4_flags = flags;
112*4882a593Smuzhiyun 	fl4->flowi4_secid = 0;
113*4882a593Smuzhiyun 	fl4->flowi4_tun_key.tun_id = 0;
114*4882a593Smuzhiyun 	fl4->flowi4_uid = uid;
115*4882a593Smuzhiyun 	fl4->daddr = daddr;
116*4882a593Smuzhiyun 	fl4->saddr = saddr;
117*4882a593Smuzhiyun 	fl4->fl4_dport = dport;
118*4882a593Smuzhiyun 	fl4->fl4_sport = sport;
119*4882a593Smuzhiyun 	fl4->flowi4_multipath_hash = 0;
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun /* Reset some input parameters after previous lookup */
flowi4_update_output(struct flowi4 * fl4,int oif,__u8 tos,__be32 daddr,__be32 saddr)123*4882a593Smuzhiyun static inline void flowi4_update_output(struct flowi4 *fl4, int oif, __u8 tos,
124*4882a593Smuzhiyun 					__be32 daddr, __be32 saddr)
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun 	fl4->flowi4_oif = oif;
127*4882a593Smuzhiyun 	fl4->flowi4_tos = tos;
128*4882a593Smuzhiyun 	fl4->daddr = daddr;
129*4882a593Smuzhiyun 	fl4->saddr = saddr;
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun struct flowi6 {
134*4882a593Smuzhiyun 	struct flowi_common	__fl_common;
135*4882a593Smuzhiyun #define flowi6_oif		__fl_common.flowic_oif
136*4882a593Smuzhiyun #define flowi6_iif		__fl_common.flowic_iif
137*4882a593Smuzhiyun #define flowi6_mark		__fl_common.flowic_mark
138*4882a593Smuzhiyun #define flowi6_scope		__fl_common.flowic_scope
139*4882a593Smuzhiyun #define flowi6_proto		__fl_common.flowic_proto
140*4882a593Smuzhiyun #define flowi6_flags		__fl_common.flowic_flags
141*4882a593Smuzhiyun #define flowi6_secid		__fl_common.flowic_secid
142*4882a593Smuzhiyun #define flowi6_tun_key		__fl_common.flowic_tun_key
143*4882a593Smuzhiyun #define flowi6_uid		__fl_common.flowic_uid
144*4882a593Smuzhiyun 	struct in6_addr		daddr;
145*4882a593Smuzhiyun 	struct in6_addr		saddr;
146*4882a593Smuzhiyun 	/* Note: flowi6_tos is encoded in flowlabel, too. */
147*4882a593Smuzhiyun 	__be32			flowlabel;
148*4882a593Smuzhiyun 	union flowi_uli		uli;
149*4882a593Smuzhiyun #define fl6_sport		uli.ports.sport
150*4882a593Smuzhiyun #define fl6_dport		uli.ports.dport
151*4882a593Smuzhiyun #define fl6_icmp_type		uli.icmpt.type
152*4882a593Smuzhiyun #define fl6_icmp_code		uli.icmpt.code
153*4882a593Smuzhiyun #define fl6_ipsec_spi		uli.spi
154*4882a593Smuzhiyun #define fl6_mh_type		uli.mht.type
155*4882a593Smuzhiyun #define fl6_gre_key		uli.gre_key
156*4882a593Smuzhiyun 	__u32			mp_hash;
157*4882a593Smuzhiyun } __attribute__((__aligned__(BITS_PER_LONG/8)));
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun struct flowidn {
160*4882a593Smuzhiyun 	struct flowi_common	__fl_common;
161*4882a593Smuzhiyun #define flowidn_oif		__fl_common.flowic_oif
162*4882a593Smuzhiyun #define flowidn_iif		__fl_common.flowic_iif
163*4882a593Smuzhiyun #define flowidn_mark		__fl_common.flowic_mark
164*4882a593Smuzhiyun #define flowidn_scope		__fl_common.flowic_scope
165*4882a593Smuzhiyun #define flowidn_proto		__fl_common.flowic_proto
166*4882a593Smuzhiyun #define flowidn_flags		__fl_common.flowic_flags
167*4882a593Smuzhiyun 	__le16			daddr;
168*4882a593Smuzhiyun 	__le16			saddr;
169*4882a593Smuzhiyun 	union flowi_uli		uli;
170*4882a593Smuzhiyun #define fld_sport		uli.ports.sport
171*4882a593Smuzhiyun #define fld_dport		uli.ports.dport
172*4882a593Smuzhiyun } __attribute__((__aligned__(BITS_PER_LONG/8)));
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun struct flowi {
175*4882a593Smuzhiyun 	union {
176*4882a593Smuzhiyun 		struct flowi_common	__fl_common;
177*4882a593Smuzhiyun 		struct flowi4		ip4;
178*4882a593Smuzhiyun 		struct flowi6		ip6;
179*4882a593Smuzhiyun 		struct flowidn		dn;
180*4882a593Smuzhiyun 	} u;
181*4882a593Smuzhiyun #define flowi_oif	u.__fl_common.flowic_oif
182*4882a593Smuzhiyun #define flowi_iif	u.__fl_common.flowic_iif
183*4882a593Smuzhiyun #define flowi_mark	u.__fl_common.flowic_mark
184*4882a593Smuzhiyun #define flowi_tos	u.__fl_common.flowic_tos
185*4882a593Smuzhiyun #define flowi_scope	u.__fl_common.flowic_scope
186*4882a593Smuzhiyun #define flowi_proto	u.__fl_common.flowic_proto
187*4882a593Smuzhiyun #define flowi_flags	u.__fl_common.flowic_flags
188*4882a593Smuzhiyun #define flowi_secid	u.__fl_common.flowic_secid
189*4882a593Smuzhiyun #define flowi_tun_key	u.__fl_common.flowic_tun_key
190*4882a593Smuzhiyun #define flowi_uid	u.__fl_common.flowic_uid
191*4882a593Smuzhiyun } __attribute__((__aligned__(BITS_PER_LONG/8)));
192*4882a593Smuzhiyun 
flowi4_to_flowi(struct flowi4 * fl4)193*4882a593Smuzhiyun static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun 	return container_of(fl4, struct flowi, u.ip4);
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun 
flowi4_to_flowi_common(struct flowi4 * fl4)198*4882a593Smuzhiyun static inline struct flowi_common *flowi4_to_flowi_common(struct flowi4 *fl4)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	return &(flowi4_to_flowi(fl4)->u.__fl_common);
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
flowi6_to_flowi(struct flowi6 * fl6)203*4882a593Smuzhiyun static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	return container_of(fl6, struct flowi, u.ip6);
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun 
flowi6_to_flowi_common(struct flowi6 * fl6)208*4882a593Smuzhiyun static inline struct flowi_common *flowi6_to_flowi_common(struct flowi6 *fl6)
209*4882a593Smuzhiyun {
210*4882a593Smuzhiyun 	return &(flowi6_to_flowi(fl6)->u.__fl_common);
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun 
flowidn_to_flowi(struct flowidn * fldn)213*4882a593Smuzhiyun static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn)
214*4882a593Smuzhiyun {
215*4882a593Smuzhiyun 	return container_of(fldn, struct flowi, u.dn);
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun __u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys);
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun #endif
221