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