hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/include/net/flow_dissector.h
....@@ -8,6 +8,10 @@
88 #include <linux/string.h>
99 #include <uapi/linux/if_ether.h>
1010
11
+struct bpf_prog;
12
+struct net;
13
+struct sk_buff;
14
+
1115 /**
1216 * struct flow_dissector_key_control:
1317 * @thoff: Transport header offset
....@@ -32,7 +36,6 @@
3236
3337 /**
3438 * struct flow_dissector_key_basic:
35
- * @thoff: Transport header offset
3639 * @n_proto: Network header protocol (eg. IPv4/IPv6)
3740 * @ip_proto: Transport header protocol (eg. TCP/UDP)
3841 */
....@@ -47,17 +50,37 @@
4750 };
4851
4952 struct flow_dissector_key_vlan {
50
- u16 vlan_id:12,
51
- vlan_priority:3;
53
+ union {
54
+ struct {
55
+ u16 vlan_id:12,
56
+ vlan_dei:1,
57
+ vlan_priority:3;
58
+ };
59
+ __be16 vlan_tci;
60
+ };
5261 __be16 vlan_tpid;
62
+ __be16 vlan_eth_type;
63
+ u16 padding;
5364 };
5465
55
-struct flow_dissector_key_mpls {
66
+struct flow_dissector_mpls_lse {
5667 u32 mpls_ttl:8,
5768 mpls_bos:1,
5869 mpls_tc:3,
5970 mpls_label:20;
6071 };
72
+
73
+#define FLOW_DIS_MPLS_MAX 7
74
+struct flow_dissector_key_mpls {
75
+ struct flow_dissector_mpls_lse ls[FLOW_DIS_MPLS_MAX]; /* Label Stack */
76
+ u8 used_lses; /* One bit set for each Label Stack Entry in use */
77
+};
78
+
79
+static inline void dissector_set_mpls_lse(struct flow_dissector_key_mpls *mpls,
80
+ int lse_index)
81
+{
82
+ mpls->used_lses |= 1 << lse_index;
83
+}
6184
6285 #define FLOW_DIS_TUN_OPTS_MAX 255
6386 /**
....@@ -157,19 +180,16 @@
157180
158181 /**
159182 * flow_dissector_key_icmp:
160
- * @ports: type and code of ICMP header
161
- * icmp: ICMP type (high) and code (low)
162183 * type: ICMP type
163184 * code: ICMP code
185
+ * id: session identifier
164186 */
165187 struct flow_dissector_key_icmp {
166
- union {
167
- __be16 icmp;
168
- struct {
169
- u8 type;
170
- u8 code;
171
- };
188
+ struct {
189
+ u8 type;
190
+ u8 code;
172191 };
192
+ u16 id;
173193 };
174194
175195 /**
....@@ -201,18 +221,51 @@
201221 __u8 ttl;
202222 };
203223
224
+/**
225
+ * struct flow_dissector_key_meta:
226
+ * @ingress_ifindex: ingress ifindex
227
+ * @ingress_iftype: ingress interface type
228
+ */
229
+struct flow_dissector_key_meta {
230
+ int ingress_ifindex;
231
+ u16 ingress_iftype;
232
+};
233
+
234
+/**
235
+ * struct flow_dissector_key_ct:
236
+ * @ct_state: conntrack state after converting with map
237
+ * @ct_mark: conttrack mark
238
+ * @ct_zone: conntrack zone
239
+ * @ct_labels: conntrack labels
240
+ */
241
+struct flow_dissector_key_ct {
242
+ u16 ct_state;
243
+ u16 ct_zone;
244
+ u32 ct_mark;
245
+ u32 ct_labels[4];
246
+};
247
+
248
+/**
249
+ * struct flow_dissector_key_hash:
250
+ * @hash: hash value
251
+ */
252
+struct flow_dissector_key_hash {
253
+ u32 hash;
254
+};
255
+
204256 enum flow_dissector_key_id {
205257 FLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */
206258 FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
207259 FLOW_DISSECTOR_KEY_IPV4_ADDRS, /* struct flow_dissector_key_ipv4_addrs */
208260 FLOW_DISSECTOR_KEY_IPV6_ADDRS, /* struct flow_dissector_key_ipv6_addrs */
209261 FLOW_DISSECTOR_KEY_PORTS, /* struct flow_dissector_key_ports */
262
+ FLOW_DISSECTOR_KEY_PORTS_RANGE, /* struct flow_dissector_key_ports */
210263 FLOW_DISSECTOR_KEY_ICMP, /* struct flow_dissector_key_icmp */
211264 FLOW_DISSECTOR_KEY_ETH_ADDRS, /* struct flow_dissector_key_eth_addrs */
212265 FLOW_DISSECTOR_KEY_TIPC, /* struct flow_dissector_key_tipc */
213266 FLOW_DISSECTOR_KEY_ARP, /* struct flow_dissector_key_arp */
214
- FLOW_DISSECTOR_KEY_VLAN, /* struct flow_dissector_key_flow_vlan */
215
- FLOW_DISSECTOR_KEY_FLOW_LABEL, /* struct flow_dissector_key_flow_tags */
267
+ FLOW_DISSECTOR_KEY_VLAN, /* struct flow_dissector_key_vlan */
268
+ FLOW_DISSECTOR_KEY_FLOW_LABEL, /* struct flow_dissector_key_tags */
216269 FLOW_DISSECTOR_KEY_GRE_KEYID, /* struct flow_dissector_key_keyid */
217270 FLOW_DISSECTOR_KEY_MPLS_ENTROPY, /* struct flow_dissector_key_keyid */
218271 FLOW_DISSECTOR_KEY_ENC_KEYID, /* struct flow_dissector_key_keyid */
....@@ -223,17 +276,19 @@
223276 FLOW_DISSECTOR_KEY_MPLS, /* struct flow_dissector_key_mpls */
224277 FLOW_DISSECTOR_KEY_TCP, /* struct flow_dissector_key_tcp */
225278 FLOW_DISSECTOR_KEY_IP, /* struct flow_dissector_key_ip */
226
- FLOW_DISSECTOR_KEY_CVLAN, /* struct flow_dissector_key_flow_vlan */
279
+ FLOW_DISSECTOR_KEY_CVLAN, /* struct flow_dissector_key_vlan */
227280 FLOW_DISSECTOR_KEY_ENC_IP, /* struct flow_dissector_key_ip */
228281 FLOW_DISSECTOR_KEY_ENC_OPTS, /* struct flow_dissector_key_enc_opts */
282
+ FLOW_DISSECTOR_KEY_META, /* struct flow_dissector_key_meta */
283
+ FLOW_DISSECTOR_KEY_CT, /* struct flow_dissector_key_ct */
284
+ FLOW_DISSECTOR_KEY_HASH, /* struct flow_dissector_key_hash */
229285
230286 FLOW_DISSECTOR_KEY_MAX,
231287 };
232288
233289 #define FLOW_DISSECTOR_F_PARSE_1ST_FRAG BIT(0)
234
-#define FLOW_DISSECTOR_F_STOP_AT_L3 BIT(1)
235
-#define FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL BIT(2)
236
-#define FLOW_DISSECTOR_F_STOP_AT_ENCAP BIT(3)
290
+#define FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL BIT(1)
291
+#define FLOW_DISSECTOR_F_STOP_AT_ENCAP BIT(2)
237292
238293 struct flow_dissector_key {
239294 enum flow_dissector_key_id key_id;
....@@ -260,6 +315,8 @@
260315 struct flow_dissector_key_vlan cvlan;
261316 struct flow_dissector_key_keyid keyid;
262317 struct flow_dissector_key_ports ports;
318
+ struct flow_dissector_key_icmp icmp;
319
+ /* 'addrs' must be the last member */
263320 struct flow_dissector_key_addrs addrs;
264321 };
265322
....@@ -293,6 +350,9 @@
293350 }
294351
295352 u32 flow_hash_from_keys(struct flow_keys *keys);
353
+void skb_flow_get_icmp_tci(const struct sk_buff *skb,
354
+ struct flow_dissector_key_icmp *key_icmp,
355
+ void *data, int thoff, int hlen);
296356
297357 static inline bool dissector_uses_key(const struct flow_dissector *flow_dissector,
298358 enum flow_dissector_key_id key_id)
....@@ -307,6 +367,13 @@
307367 return ((char *)target_container) + flow_dissector->offset[key_id];
308368 }
309369
370
+struct bpf_flow_dissector {
371
+ struct bpf_flow_keys *flow_keys;
372
+ const struct sk_buff *skb;
373
+ void *data;
374
+ void *data_end;
375
+};
376
+
310377 static inline void
311378 flow_dissector_init_keys(struct flow_dissector_key_control *key_control,
312379 struct flow_dissector_key_basic *key_basic)
....@@ -315,4 +382,9 @@
315382 memset(key_basic, 0, sizeof(*key_basic));
316383 }
317384
385
+#ifdef CONFIG_BPF_SYSCALL
386
+int flow_dissector_bpf_prog_attach_check(struct net *net,
387
+ struct bpf_prog *prog);
388
+#endif /* CONFIG_BPF_SYSCALL */
389
+
318390 #endif