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