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