]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - net/core/flow_dissector.c
UBUNTU: Ubuntu-4.15.0-96.97
[mirror_ubuntu-bionic-kernel.git] / net / core / flow_dissector.c
1 #include <linux/kernel.h>
2 #include <linux/skbuff.h>
3 #include <linux/export.h>
4 #include <linux/ip.h>
5 #include <linux/ipv6.h>
6 #include <linux/if_vlan.h>
7 #include <net/dsa.h>
8 #include <net/dst_metadata.h>
9 #include <net/ip.h>
10 #include <net/ipv6.h>
11 #include <net/gre.h>
12 #include <net/pptp.h>
13 #include <net/tipc.h>
14 #include <linux/igmp.h>
15 #include <linux/icmp.h>
16 #include <linux/sctp.h>
17 #include <linux/dccp.h>
18 #include <linux/if_tunnel.h>
19 #include <linux/if_pppox.h>
20 #include <linux/ppp_defs.h>
21 #include <linux/stddef.h>
22 #include <linux/if_ether.h>
23 #include <linux/mpls.h>
24 #include <linux/tcp.h>
25 #include <net/flow_dissector.h>
26 #include <scsi/fc/fc_fcoe.h>
27
28 static void dissector_set_key(struct flow_dissector *flow_dissector,
29 enum flow_dissector_key_id key_id)
30 {
31 flow_dissector->used_keys |= (1 << key_id);
32 }
33
34 void skb_flow_dissector_init(struct flow_dissector *flow_dissector,
35 const struct flow_dissector_key *key,
36 unsigned int key_count)
37 {
38 unsigned int i;
39
40 memset(flow_dissector, 0, sizeof(*flow_dissector));
41
42 for (i = 0; i < key_count; i++, key++) {
43 /* User should make sure that every key target offset is withing
44 * boundaries of unsigned short.
45 */
46 BUG_ON(key->offset > USHRT_MAX);
47 BUG_ON(dissector_uses_key(flow_dissector,
48 key->key_id));
49
50 dissector_set_key(flow_dissector, key->key_id);
51 flow_dissector->offset[key->key_id] = key->offset;
52 }
53
54 /* Ensure that the dissector always includes control and basic key.
55 * That way we are able to avoid handling lack of these in fast path.
56 */
57 BUG_ON(!dissector_uses_key(flow_dissector,
58 FLOW_DISSECTOR_KEY_CONTROL));
59 BUG_ON(!dissector_uses_key(flow_dissector,
60 FLOW_DISSECTOR_KEY_BASIC));
61 }
62 EXPORT_SYMBOL(skb_flow_dissector_init);
63
64 /**
65 * skb_flow_get_be16 - extract be16 entity
66 * @skb: sk_buff to extract from
67 * @poff: offset to extract at
68 * @data: raw buffer pointer to the packet
69 * @hlen: packet header length
70 *
71 * The function will try to retrieve a be32 entity at
72 * offset poff
73 */
74 static __be16 skb_flow_get_be16(const struct sk_buff *skb, int poff,
75 void *data, int hlen)
76 {
77 __be16 *u, _u;
78
79 u = __skb_header_pointer(skb, poff, sizeof(_u), data, hlen, &_u);
80 if (u)
81 return *u;
82
83 return 0;
84 }
85
86 /**
87 * __skb_flow_get_ports - extract the upper layer ports and return them
88 * @skb: sk_buff to extract the ports from
89 * @thoff: transport header offset
90 * @ip_proto: protocol for which to get port offset
91 * @data: raw buffer pointer to the packet, if NULL use skb->data
92 * @hlen: packet header length, if @data is NULL use skb_headlen(skb)
93 *
94 * The function will try to retrieve the ports at offset thoff + poff where poff
95 * is the protocol port offset returned from proto_ports_offset
96 */
97 __be32 __skb_flow_get_ports(const struct sk_buff *skb, int thoff, u8 ip_proto,
98 void *data, int hlen)
99 {
100 int poff = proto_ports_offset(ip_proto);
101
102 if (!data) {
103 data = skb->data;
104 hlen = skb_headlen(skb);
105 }
106
107 if (poff >= 0) {
108 __be32 *ports, _ports;
109
110 ports = __skb_header_pointer(skb, thoff + poff,
111 sizeof(_ports), data, hlen, &_ports);
112 if (ports)
113 return *ports;
114 }
115
116 return 0;
117 }
118 EXPORT_SYMBOL(__skb_flow_get_ports);
119
120 static void
121 skb_flow_dissect_set_enc_addr_type(enum flow_dissector_key_id type,
122 struct flow_dissector *flow_dissector,
123 void *target_container)
124 {
125 struct flow_dissector_key_control *ctrl;
126
127 if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ENC_CONTROL))
128 return;
129
130 ctrl = skb_flow_dissector_target(flow_dissector,
131 FLOW_DISSECTOR_KEY_ENC_CONTROL,
132 target_container);
133 ctrl->addr_type = type;
134 }
135
136 static void
137 __skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
138 struct flow_dissector *flow_dissector,
139 void *target_container)
140 {
141 struct ip_tunnel_info *info;
142 struct ip_tunnel_key *key;
143
144 /* A quick check to see if there might be something to do. */
145 if (!dissector_uses_key(flow_dissector,
146 FLOW_DISSECTOR_KEY_ENC_KEYID) &&
147 !dissector_uses_key(flow_dissector,
148 FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) &&
149 !dissector_uses_key(flow_dissector,
150 FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS) &&
151 !dissector_uses_key(flow_dissector,
152 FLOW_DISSECTOR_KEY_ENC_CONTROL) &&
153 !dissector_uses_key(flow_dissector,
154 FLOW_DISSECTOR_KEY_ENC_PORTS))
155 return;
156
157 info = skb_tunnel_info(skb);
158 if (!info)
159 return;
160
161 key = &info->key;
162
163 switch (ip_tunnel_info_af(info)) {
164 case AF_INET:
165 skb_flow_dissect_set_enc_addr_type(FLOW_DISSECTOR_KEY_IPV4_ADDRS,
166 flow_dissector,
167 target_container);
168 if (dissector_uses_key(flow_dissector,
169 FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS)) {
170 struct flow_dissector_key_ipv4_addrs *ipv4;
171
172 ipv4 = skb_flow_dissector_target(flow_dissector,
173 FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS,
174 target_container);
175 ipv4->src = key->u.ipv4.src;
176 ipv4->dst = key->u.ipv4.dst;
177 }
178 break;
179 case AF_INET6:
180 skb_flow_dissect_set_enc_addr_type(FLOW_DISSECTOR_KEY_IPV6_ADDRS,
181 flow_dissector,
182 target_container);
183 if (dissector_uses_key(flow_dissector,
184 FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS)) {
185 struct flow_dissector_key_ipv6_addrs *ipv6;
186
187 ipv6 = skb_flow_dissector_target(flow_dissector,
188 FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS,
189 target_container);
190 ipv6->src = key->u.ipv6.src;
191 ipv6->dst = key->u.ipv6.dst;
192 }
193 break;
194 }
195
196 if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ENC_KEYID)) {
197 struct flow_dissector_key_keyid *keyid;
198
199 keyid = skb_flow_dissector_target(flow_dissector,
200 FLOW_DISSECTOR_KEY_ENC_KEYID,
201 target_container);
202 keyid->keyid = tunnel_id_to_key32(key->tun_id);
203 }
204
205 if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ENC_PORTS)) {
206 struct flow_dissector_key_ports *tp;
207
208 tp = skb_flow_dissector_target(flow_dissector,
209 FLOW_DISSECTOR_KEY_ENC_PORTS,
210 target_container);
211 tp->src = key->tp_src;
212 tp->dst = key->tp_dst;
213 }
214 }
215
216 static enum flow_dissect_ret
217 __skb_flow_dissect_mpls(const struct sk_buff *skb,
218 struct flow_dissector *flow_dissector,
219 void *target_container, void *data, int nhoff, int hlen)
220 {
221 struct flow_dissector_key_keyid *key_keyid;
222 struct mpls_label *hdr, _hdr[2];
223 u32 entry, label;
224
225 if (!dissector_uses_key(flow_dissector,
226 FLOW_DISSECTOR_KEY_MPLS_ENTROPY) &&
227 !dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_MPLS))
228 return FLOW_DISSECT_RET_OUT_GOOD;
229
230 hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data,
231 hlen, &_hdr);
232 if (!hdr)
233 return FLOW_DISSECT_RET_OUT_BAD;
234
235 entry = ntohl(hdr[0].entry);
236 label = (entry & MPLS_LS_LABEL_MASK) >> MPLS_LS_LABEL_SHIFT;
237
238 if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_MPLS)) {
239 struct flow_dissector_key_mpls *key_mpls;
240
241 key_mpls = skb_flow_dissector_target(flow_dissector,
242 FLOW_DISSECTOR_KEY_MPLS,
243 target_container);
244 key_mpls->mpls_label = label;
245 key_mpls->mpls_ttl = (entry & MPLS_LS_TTL_MASK)
246 >> MPLS_LS_TTL_SHIFT;
247 key_mpls->mpls_tc = (entry & MPLS_LS_TC_MASK)
248 >> MPLS_LS_TC_SHIFT;
249 key_mpls->mpls_bos = (entry & MPLS_LS_S_MASK)
250 >> MPLS_LS_S_SHIFT;
251 }
252
253 if (label == MPLS_LABEL_ENTROPY) {
254 key_keyid = skb_flow_dissector_target(flow_dissector,
255 FLOW_DISSECTOR_KEY_MPLS_ENTROPY,
256 target_container);
257 key_keyid->keyid = hdr[1].entry & htonl(MPLS_LS_LABEL_MASK);
258 }
259 return FLOW_DISSECT_RET_OUT_GOOD;
260 }
261
262 static enum flow_dissect_ret
263 __skb_flow_dissect_arp(const struct sk_buff *skb,
264 struct flow_dissector *flow_dissector,
265 void *target_container, void *data, int nhoff, int hlen)
266 {
267 struct flow_dissector_key_arp *key_arp;
268 struct {
269 unsigned char ar_sha[ETH_ALEN];
270 unsigned char ar_sip[4];
271 unsigned char ar_tha[ETH_ALEN];
272 unsigned char ar_tip[4];
273 } *arp_eth, _arp_eth;
274 const struct arphdr *arp;
275 struct arphdr _arp;
276
277 if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ARP))
278 return FLOW_DISSECT_RET_OUT_GOOD;
279
280 arp = __skb_header_pointer(skb, nhoff, sizeof(_arp), data,
281 hlen, &_arp);
282 if (!arp)
283 return FLOW_DISSECT_RET_OUT_BAD;
284
285 if (arp->ar_hrd != htons(ARPHRD_ETHER) ||
286 arp->ar_pro != htons(ETH_P_IP) ||
287 arp->ar_hln != ETH_ALEN ||
288 arp->ar_pln != 4 ||
289 (arp->ar_op != htons(ARPOP_REPLY) &&
290 arp->ar_op != htons(ARPOP_REQUEST)))
291 return FLOW_DISSECT_RET_OUT_BAD;
292
293 arp_eth = __skb_header_pointer(skb, nhoff + sizeof(_arp),
294 sizeof(_arp_eth), data,
295 hlen, &_arp_eth);
296 if (!arp_eth)
297 return FLOW_DISSECT_RET_OUT_BAD;
298
299 key_arp = skb_flow_dissector_target(flow_dissector,
300 FLOW_DISSECTOR_KEY_ARP,
301 target_container);
302
303 memcpy(&key_arp->sip, arp_eth->ar_sip, sizeof(key_arp->sip));
304 memcpy(&key_arp->tip, arp_eth->ar_tip, sizeof(key_arp->tip));
305
306 /* Only store the lower byte of the opcode;
307 * this covers ARPOP_REPLY and ARPOP_REQUEST.
308 */
309 key_arp->op = ntohs(arp->ar_op) & 0xff;
310
311 ether_addr_copy(key_arp->sha, arp_eth->ar_sha);
312 ether_addr_copy(key_arp->tha, arp_eth->ar_tha);
313
314 return FLOW_DISSECT_RET_OUT_GOOD;
315 }
316
317 static enum flow_dissect_ret
318 __skb_flow_dissect_gre(const struct sk_buff *skb,
319 struct flow_dissector_key_control *key_control,
320 struct flow_dissector *flow_dissector,
321 void *target_container, void *data,
322 __be16 *p_proto, int *p_nhoff, int *p_hlen,
323 unsigned int flags)
324 {
325 struct flow_dissector_key_keyid *key_keyid;
326 struct gre_base_hdr *hdr, _hdr;
327 int offset = 0;
328 u16 gre_ver;
329
330 hdr = __skb_header_pointer(skb, *p_nhoff, sizeof(_hdr),
331 data, *p_hlen, &_hdr);
332 if (!hdr)
333 return FLOW_DISSECT_RET_OUT_BAD;
334
335 /* Only look inside GRE without routing */
336 if (hdr->flags & GRE_ROUTING)
337 return FLOW_DISSECT_RET_OUT_GOOD;
338
339 /* Only look inside GRE for version 0 and 1 */
340 gre_ver = ntohs(hdr->flags & GRE_VERSION);
341 if (gre_ver > 1)
342 return FLOW_DISSECT_RET_OUT_GOOD;
343
344 *p_proto = hdr->protocol;
345 if (gre_ver) {
346 /* Version1 must be PPTP, and check the flags */
347 if (!(*p_proto == GRE_PROTO_PPP && (hdr->flags & GRE_KEY)))
348 return FLOW_DISSECT_RET_OUT_GOOD;
349 }
350
351 offset += sizeof(struct gre_base_hdr);
352
353 if (hdr->flags & GRE_CSUM)
354 offset += sizeof(((struct gre_full_hdr *) 0)->csum) +
355 sizeof(((struct gre_full_hdr *) 0)->reserved1);
356
357 if (hdr->flags & GRE_KEY) {
358 const __be32 *keyid;
359 __be32 _keyid;
360
361 keyid = __skb_header_pointer(skb, *p_nhoff + offset,
362 sizeof(_keyid),
363 data, *p_hlen, &_keyid);
364 if (!keyid)
365 return FLOW_DISSECT_RET_OUT_BAD;
366
367 if (dissector_uses_key(flow_dissector,
368 FLOW_DISSECTOR_KEY_GRE_KEYID)) {
369 key_keyid = skb_flow_dissector_target(flow_dissector,
370 FLOW_DISSECTOR_KEY_GRE_KEYID,
371 target_container);
372 if (gre_ver == 0)
373 key_keyid->keyid = *keyid;
374 else
375 key_keyid->keyid = *keyid & GRE_PPTP_KEY_MASK;
376 }
377 offset += sizeof(((struct gre_full_hdr *) 0)->key);
378 }
379
380 if (hdr->flags & GRE_SEQ)
381 offset += sizeof(((struct pptp_gre_header *) 0)->seq);
382
383 if (gre_ver == 0) {
384 if (*p_proto == htons(ETH_P_TEB)) {
385 const struct ethhdr *eth;
386 struct ethhdr _eth;
387
388 eth = __skb_header_pointer(skb, *p_nhoff + offset,
389 sizeof(_eth),
390 data, *p_hlen, &_eth);
391 if (!eth)
392 return FLOW_DISSECT_RET_OUT_BAD;
393 *p_proto = eth->h_proto;
394 offset += sizeof(*eth);
395
396 /* Cap headers that we access via pointers at the
397 * end of the Ethernet header as our maximum alignment
398 * at that point is only 2 bytes.
399 */
400 if (NET_IP_ALIGN)
401 *p_hlen = *p_nhoff + offset;
402 }
403 } else { /* version 1, must be PPTP */
404 u8 _ppp_hdr[PPP_HDRLEN];
405 u8 *ppp_hdr;
406
407 if (hdr->flags & GRE_ACK)
408 offset += sizeof(((struct pptp_gre_header *) 0)->ack);
409
410 ppp_hdr = __skb_header_pointer(skb, *p_nhoff + offset,
411 sizeof(_ppp_hdr),
412 data, *p_hlen, _ppp_hdr);
413 if (!ppp_hdr)
414 return FLOW_DISSECT_RET_OUT_BAD;
415
416 switch (PPP_PROTOCOL(ppp_hdr)) {
417 case PPP_IP:
418 *p_proto = htons(ETH_P_IP);
419 break;
420 case PPP_IPV6:
421 *p_proto = htons(ETH_P_IPV6);
422 break;
423 default:
424 /* Could probably catch some more like MPLS */
425 break;
426 }
427
428 offset += PPP_HDRLEN;
429 }
430
431 *p_nhoff += offset;
432 key_control->flags |= FLOW_DIS_ENCAPSULATION;
433 if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP)
434 return FLOW_DISSECT_RET_OUT_GOOD;
435
436 return FLOW_DISSECT_RET_PROTO_AGAIN;
437 }
438
439 static void
440 __skb_flow_dissect_tcp(const struct sk_buff *skb,
441 struct flow_dissector *flow_dissector,
442 void *target_container, void *data, int thoff, int hlen)
443 {
444 struct flow_dissector_key_tcp *key_tcp;
445 struct tcphdr *th, _th;
446
447 if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_TCP))
448 return;
449
450 th = __skb_header_pointer(skb, thoff, sizeof(_th), data, hlen, &_th);
451 if (!th)
452 return;
453
454 if (unlikely(__tcp_hdrlen(th) < sizeof(_th)))
455 return;
456
457 key_tcp = skb_flow_dissector_target(flow_dissector,
458 FLOW_DISSECTOR_KEY_TCP,
459 target_container);
460 key_tcp->flags = (*(__be16 *) &tcp_flag_word(th) & htons(0x0FFF));
461 }
462
463 static void
464 __skb_flow_dissect_ipv4(const struct sk_buff *skb,
465 struct flow_dissector *flow_dissector,
466 void *target_container, void *data, const struct iphdr *iph)
467 {
468 struct flow_dissector_key_ip *key_ip;
469
470 if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_IP))
471 return;
472
473 key_ip = skb_flow_dissector_target(flow_dissector,
474 FLOW_DISSECTOR_KEY_IP,
475 target_container);
476 key_ip->tos = iph->tos;
477 key_ip->ttl = iph->ttl;
478 }
479
480 static void
481 __skb_flow_dissect_ipv6(const struct sk_buff *skb,
482 struct flow_dissector *flow_dissector,
483 void *target_container, void *data, const struct ipv6hdr *iph)
484 {
485 struct flow_dissector_key_ip *key_ip;
486
487 if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_IP))
488 return;
489
490 key_ip = skb_flow_dissector_target(flow_dissector,
491 FLOW_DISSECTOR_KEY_IP,
492 target_container);
493 key_ip->tos = ipv6_get_dsfield(iph);
494 key_ip->ttl = iph->hop_limit;
495 }
496
497 /* Maximum number of protocol headers that can be parsed in
498 * __skb_flow_dissect
499 */
500 #define MAX_FLOW_DISSECT_HDRS 15
501
502 static bool skb_flow_dissect_allowed(int *num_hdrs)
503 {
504 ++*num_hdrs;
505
506 return (*num_hdrs <= MAX_FLOW_DISSECT_HDRS);
507 }
508
509 /**
510 * __skb_flow_dissect - extract the flow_keys struct and return it
511 * @skb: sk_buff to extract the flow from, can be NULL if the rest are specified
512 * @flow_dissector: list of keys to dissect
513 * @target_container: target structure to put dissected values into
514 * @data: raw buffer pointer to the packet, if NULL use skb->data
515 * @proto: protocol for which to get the flow, if @data is NULL use skb->protocol
516 * @nhoff: network header offset, if @data is NULL use skb_network_offset(skb)
517 * @hlen: packet header length, if @data is NULL use skb_headlen(skb)
518 *
519 * The function will try to retrieve individual keys into target specified
520 * by flow_dissector from either the skbuff or a raw buffer specified by the
521 * rest parameters.
522 *
523 * Caller must take care of zeroing target container memory.
524 */
525 bool __skb_flow_dissect(const struct sk_buff *skb,
526 struct flow_dissector *flow_dissector,
527 void *target_container,
528 void *data, __be16 proto, int nhoff, int hlen,
529 unsigned int flags)
530 {
531 struct flow_dissector_key_control *key_control;
532 struct flow_dissector_key_basic *key_basic;
533 struct flow_dissector_key_addrs *key_addrs;
534 struct flow_dissector_key_ports *key_ports;
535 struct flow_dissector_key_icmp *key_icmp;
536 struct flow_dissector_key_tags *key_tags;
537 struct flow_dissector_key_vlan *key_vlan;
538 enum flow_dissect_ret fdret;
539 bool skip_vlan = false;
540 int num_hdrs = 0;
541 u8 ip_proto = 0;
542 bool ret;
543
544 if (!data) {
545 data = skb->data;
546 proto = skb_vlan_tag_present(skb) ?
547 skb->vlan_proto : skb->protocol;
548 nhoff = skb_network_offset(skb);
549 hlen = skb_headlen(skb);
550 #if IS_ENABLED(CONFIG_NET_DSA)
551 if (unlikely(skb->dev && netdev_uses_dsa(skb->dev) &&
552 proto == htons(ETH_P_XDSA))) {
553 const struct dsa_device_ops *ops;
554 int offset = 0;
555
556 ops = skb->dev->dsa_ptr->tag_ops;
557 if (ops->flow_dissect &&
558 !ops->flow_dissect(skb, &proto, &offset)) {
559 hlen -= offset;
560 nhoff += offset;
561 }
562 }
563 #endif
564 }
565
566 /* It is ensured by skb_flow_dissector_init() that control key will
567 * be always present.
568 */
569 key_control = skb_flow_dissector_target(flow_dissector,
570 FLOW_DISSECTOR_KEY_CONTROL,
571 target_container);
572
573 /* It is ensured by skb_flow_dissector_init() that basic key will
574 * be always present.
575 */
576 key_basic = skb_flow_dissector_target(flow_dissector,
577 FLOW_DISSECTOR_KEY_BASIC,
578 target_container);
579
580 __skb_flow_dissect_tunnel_info(skb, flow_dissector,
581 target_container);
582
583 if (dissector_uses_key(flow_dissector,
584 FLOW_DISSECTOR_KEY_ETH_ADDRS)) {
585 struct ethhdr *eth = eth_hdr(skb);
586 struct flow_dissector_key_eth_addrs *key_eth_addrs;
587
588 key_eth_addrs = skb_flow_dissector_target(flow_dissector,
589 FLOW_DISSECTOR_KEY_ETH_ADDRS,
590 target_container);
591 memcpy(key_eth_addrs, &eth->h_dest, sizeof(*key_eth_addrs));
592 }
593
594 proto_again:
595 fdret = FLOW_DISSECT_RET_CONTINUE;
596
597 switch (proto) {
598 case htons(ETH_P_IP): {
599 const struct iphdr *iph;
600 struct iphdr _iph;
601
602 iph = __skb_header_pointer(skb, nhoff, sizeof(_iph), data, hlen, &_iph);
603 if (!iph || iph->ihl < 5) {
604 fdret = FLOW_DISSECT_RET_OUT_BAD;
605 break;
606 }
607
608 nhoff += iph->ihl * 4;
609
610 ip_proto = iph->protocol;
611
612 if (dissector_uses_key(flow_dissector,
613 FLOW_DISSECTOR_KEY_IPV4_ADDRS)) {
614 key_addrs = skb_flow_dissector_target(flow_dissector,
615 FLOW_DISSECTOR_KEY_IPV4_ADDRS,
616 target_container);
617
618 memcpy(&key_addrs->v4addrs, &iph->saddr,
619 sizeof(key_addrs->v4addrs));
620 key_control->addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
621 }
622
623 if (ip_is_fragment(iph)) {
624 key_control->flags |= FLOW_DIS_IS_FRAGMENT;
625
626 if (iph->frag_off & htons(IP_OFFSET)) {
627 fdret = FLOW_DISSECT_RET_OUT_GOOD;
628 break;
629 } else {
630 key_control->flags |= FLOW_DIS_FIRST_FRAG;
631 if (!(flags &
632 FLOW_DISSECTOR_F_PARSE_1ST_FRAG)) {
633 fdret = FLOW_DISSECT_RET_OUT_GOOD;
634 break;
635 }
636 }
637 }
638
639 __skb_flow_dissect_ipv4(skb, flow_dissector,
640 target_container, data, iph);
641
642 if (flags & FLOW_DISSECTOR_F_STOP_AT_L3) {
643 fdret = FLOW_DISSECT_RET_OUT_GOOD;
644 break;
645 }
646
647 break;
648 }
649 case htons(ETH_P_IPV6): {
650 const struct ipv6hdr *iph;
651 struct ipv6hdr _iph;
652
653 iph = __skb_header_pointer(skb, nhoff, sizeof(_iph), data, hlen, &_iph);
654 if (!iph) {
655 fdret = FLOW_DISSECT_RET_OUT_BAD;
656 break;
657 }
658
659 ip_proto = iph->nexthdr;
660 nhoff += sizeof(struct ipv6hdr);
661
662 if (dissector_uses_key(flow_dissector,
663 FLOW_DISSECTOR_KEY_IPV6_ADDRS)) {
664 key_addrs = skb_flow_dissector_target(flow_dissector,
665 FLOW_DISSECTOR_KEY_IPV6_ADDRS,
666 target_container);
667
668 memcpy(&key_addrs->v6addrs, &iph->saddr,
669 sizeof(key_addrs->v6addrs));
670 key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
671 }
672
673 if ((dissector_uses_key(flow_dissector,
674 FLOW_DISSECTOR_KEY_FLOW_LABEL) ||
675 (flags & FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL)) &&
676 ip6_flowlabel(iph)) {
677 __be32 flow_label = ip6_flowlabel(iph);
678
679 if (dissector_uses_key(flow_dissector,
680 FLOW_DISSECTOR_KEY_FLOW_LABEL)) {
681 key_tags = skb_flow_dissector_target(flow_dissector,
682 FLOW_DISSECTOR_KEY_FLOW_LABEL,
683 target_container);
684 key_tags->flow_label = ntohl(flow_label);
685 }
686 if (flags & FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL) {
687 fdret = FLOW_DISSECT_RET_OUT_GOOD;
688 break;
689 }
690 }
691
692 __skb_flow_dissect_ipv6(skb, flow_dissector,
693 target_container, data, iph);
694
695 if (flags & FLOW_DISSECTOR_F_STOP_AT_L3)
696 fdret = FLOW_DISSECT_RET_OUT_GOOD;
697
698 break;
699 }
700 case htons(ETH_P_8021AD):
701 case htons(ETH_P_8021Q): {
702 const struct vlan_hdr *vlan;
703 struct vlan_hdr _vlan;
704 bool vlan_tag_present = skb && skb_vlan_tag_present(skb);
705
706 if (vlan_tag_present)
707 proto = skb->protocol;
708
709 if (!vlan_tag_present || eth_type_vlan(skb->protocol)) {
710 vlan = __skb_header_pointer(skb, nhoff, sizeof(_vlan),
711 data, hlen, &_vlan);
712 if (!vlan) {
713 fdret = FLOW_DISSECT_RET_OUT_BAD;
714 break;
715 }
716
717 proto = vlan->h_vlan_encapsulated_proto;
718 nhoff += sizeof(*vlan);
719 if (skip_vlan) {
720 fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
721 break;
722 }
723 }
724
725 skip_vlan = true;
726 if (dissector_uses_key(flow_dissector,
727 FLOW_DISSECTOR_KEY_VLAN)) {
728 key_vlan = skb_flow_dissector_target(flow_dissector,
729 FLOW_DISSECTOR_KEY_VLAN,
730 target_container);
731
732 if (vlan_tag_present) {
733 key_vlan->vlan_id = skb_vlan_tag_get_id(skb);
734 key_vlan->vlan_priority =
735 (skb_vlan_tag_get_prio(skb) >> VLAN_PRIO_SHIFT);
736 } else {
737 key_vlan->vlan_id = ntohs(vlan->h_vlan_TCI) &
738 VLAN_VID_MASK;
739 key_vlan->vlan_priority =
740 (ntohs(vlan->h_vlan_TCI) &
741 VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT;
742 }
743 }
744
745 fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
746 break;
747 }
748 case htons(ETH_P_PPP_SES): {
749 struct {
750 struct pppoe_hdr hdr;
751 __be16 proto;
752 } *hdr, _hdr;
753 hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data, hlen, &_hdr);
754 if (!hdr) {
755 fdret = FLOW_DISSECT_RET_OUT_BAD;
756 break;
757 }
758
759 proto = hdr->proto;
760 nhoff += PPPOE_SES_HLEN;
761 switch (proto) {
762 case htons(PPP_IP):
763 proto = htons(ETH_P_IP);
764 fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
765 break;
766 case htons(PPP_IPV6):
767 proto = htons(ETH_P_IPV6);
768 fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
769 break;
770 default:
771 fdret = FLOW_DISSECT_RET_OUT_BAD;
772 break;
773 }
774 break;
775 }
776 case htons(ETH_P_TIPC): {
777 struct tipc_basic_hdr *hdr, _hdr;
778
779 hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr),
780 data, hlen, &_hdr);
781 if (!hdr) {
782 fdret = FLOW_DISSECT_RET_OUT_BAD;
783 break;
784 }
785
786 if (dissector_uses_key(flow_dissector,
787 FLOW_DISSECTOR_KEY_TIPC)) {
788 key_addrs = skb_flow_dissector_target(flow_dissector,
789 FLOW_DISSECTOR_KEY_TIPC,
790 target_container);
791 key_addrs->tipckey.key = tipc_hdr_rps_key(hdr);
792 key_control->addr_type = FLOW_DISSECTOR_KEY_TIPC;
793 }
794 fdret = FLOW_DISSECT_RET_OUT_GOOD;
795 break;
796 }
797
798 case htons(ETH_P_MPLS_UC):
799 case htons(ETH_P_MPLS_MC):
800 fdret = __skb_flow_dissect_mpls(skb, flow_dissector,
801 target_container, data,
802 nhoff, hlen);
803 break;
804 case htons(ETH_P_FCOE):
805 if ((hlen - nhoff) < FCOE_HEADER_LEN) {
806 fdret = FLOW_DISSECT_RET_OUT_BAD;
807 break;
808 }
809
810 nhoff += FCOE_HEADER_LEN;
811 fdret = FLOW_DISSECT_RET_OUT_GOOD;
812 break;
813
814 case htons(ETH_P_ARP):
815 case htons(ETH_P_RARP):
816 fdret = __skb_flow_dissect_arp(skb, flow_dissector,
817 target_container, data,
818 nhoff, hlen);
819 break;
820
821 default:
822 fdret = FLOW_DISSECT_RET_OUT_BAD;
823 break;
824 }
825
826 /* Process result of proto processing */
827 switch (fdret) {
828 case FLOW_DISSECT_RET_OUT_GOOD:
829 goto out_good;
830 case FLOW_DISSECT_RET_PROTO_AGAIN:
831 if (skb_flow_dissect_allowed(&num_hdrs))
832 goto proto_again;
833 goto out_good;
834 case FLOW_DISSECT_RET_CONTINUE:
835 case FLOW_DISSECT_RET_IPPROTO_AGAIN:
836 break;
837 case FLOW_DISSECT_RET_OUT_BAD:
838 default:
839 goto out_bad;
840 }
841
842 ip_proto_again:
843 fdret = FLOW_DISSECT_RET_CONTINUE;
844
845 switch (ip_proto) {
846 case IPPROTO_GRE:
847 fdret = __skb_flow_dissect_gre(skb, key_control, flow_dissector,
848 target_container, data,
849 &proto, &nhoff, &hlen, flags);
850 break;
851
852 case NEXTHDR_HOP:
853 case NEXTHDR_ROUTING:
854 case NEXTHDR_DEST: {
855 u8 _opthdr[2], *opthdr;
856
857 if (proto != htons(ETH_P_IPV6))
858 break;
859
860 opthdr = __skb_header_pointer(skb, nhoff, sizeof(_opthdr),
861 data, hlen, &_opthdr);
862 if (!opthdr) {
863 fdret = FLOW_DISSECT_RET_OUT_BAD;
864 break;
865 }
866
867 ip_proto = opthdr[0];
868 nhoff += (opthdr[1] + 1) << 3;
869
870 fdret = FLOW_DISSECT_RET_IPPROTO_AGAIN;
871 break;
872 }
873 case NEXTHDR_FRAGMENT: {
874 struct frag_hdr _fh, *fh;
875
876 if (proto != htons(ETH_P_IPV6))
877 break;
878
879 fh = __skb_header_pointer(skb, nhoff, sizeof(_fh),
880 data, hlen, &_fh);
881
882 if (!fh) {
883 fdret = FLOW_DISSECT_RET_OUT_BAD;
884 break;
885 }
886
887 key_control->flags |= FLOW_DIS_IS_FRAGMENT;
888
889 nhoff += sizeof(_fh);
890 ip_proto = fh->nexthdr;
891
892 if (!(fh->frag_off & htons(IP6_OFFSET))) {
893 key_control->flags |= FLOW_DIS_FIRST_FRAG;
894 if (flags & FLOW_DISSECTOR_F_PARSE_1ST_FRAG) {
895 fdret = FLOW_DISSECT_RET_IPPROTO_AGAIN;
896 break;
897 }
898 }
899
900 fdret = FLOW_DISSECT_RET_OUT_GOOD;
901 break;
902 }
903 case IPPROTO_IPIP:
904 proto = htons(ETH_P_IP);
905
906 key_control->flags |= FLOW_DIS_ENCAPSULATION;
907 if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP) {
908 fdret = FLOW_DISSECT_RET_OUT_GOOD;
909 break;
910 }
911
912 fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
913 break;
914
915 case IPPROTO_IPV6:
916 proto = htons(ETH_P_IPV6);
917
918 key_control->flags |= FLOW_DIS_ENCAPSULATION;
919 if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP) {
920 fdret = FLOW_DISSECT_RET_OUT_GOOD;
921 break;
922 }
923
924 fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
925 break;
926
927
928 case IPPROTO_MPLS:
929 proto = htons(ETH_P_MPLS_UC);
930 fdret = FLOW_DISSECT_RET_PROTO_AGAIN;
931 break;
932
933 case IPPROTO_TCP:
934 __skb_flow_dissect_tcp(skb, flow_dissector, target_container,
935 data, nhoff, hlen);
936 break;
937
938 default:
939 break;
940 }
941
942 if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS) &&
943 !(key_control->flags & FLOW_DIS_IS_FRAGMENT)) {
944 key_ports = skb_flow_dissector_target(flow_dissector,
945 FLOW_DISSECTOR_KEY_PORTS,
946 target_container);
947 key_ports->ports = __skb_flow_get_ports(skb, nhoff, ip_proto,
948 data, hlen);
949 }
950
951 if (dissector_uses_key(flow_dissector,
952 FLOW_DISSECTOR_KEY_ICMP)) {
953 key_icmp = skb_flow_dissector_target(flow_dissector,
954 FLOW_DISSECTOR_KEY_ICMP,
955 target_container);
956 key_icmp->icmp = skb_flow_get_be16(skb, nhoff, data, hlen);
957 }
958
959 /* Process result of IP proto processing */
960 switch (fdret) {
961 case FLOW_DISSECT_RET_PROTO_AGAIN:
962 if (skb_flow_dissect_allowed(&num_hdrs))
963 goto proto_again;
964 break;
965 case FLOW_DISSECT_RET_IPPROTO_AGAIN:
966 if (skb_flow_dissect_allowed(&num_hdrs))
967 goto ip_proto_again;
968 break;
969 case FLOW_DISSECT_RET_OUT_GOOD:
970 case FLOW_DISSECT_RET_CONTINUE:
971 break;
972 case FLOW_DISSECT_RET_OUT_BAD:
973 default:
974 goto out_bad;
975 }
976
977 out_good:
978 ret = true;
979
980 out:
981 key_control->thoff = min_t(u16, nhoff, skb ? skb->len : hlen);
982 key_basic->n_proto = proto;
983 key_basic->ip_proto = ip_proto;
984
985 return ret;
986
987 out_bad:
988 ret = false;
989 goto out;
990 }
991 EXPORT_SYMBOL(__skb_flow_dissect);
992
993 static siphash_key_t hashrnd __read_mostly;
994 static __always_inline void __flow_hash_secret_init(void)
995 {
996 net_get_random_once(&hashrnd, sizeof(hashrnd));
997 }
998
999 static const void *flow_keys_hash_start(const struct flow_keys *flow)
1000 {
1001 BUILD_BUG_ON(FLOW_KEYS_HASH_OFFSET % SIPHASH_ALIGNMENT);
1002 return &flow->FLOW_KEYS_HASH_START_FIELD;
1003 }
1004
1005 static inline size_t flow_keys_hash_length(const struct flow_keys *flow)
1006 {
1007 size_t len = offsetof(typeof(*flow), addrs) - FLOW_KEYS_HASH_OFFSET;
1008
1009 switch (flow->control.addr_type) {
1010 case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
1011 len += sizeof(flow->addrs.v4addrs);
1012 break;
1013 case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
1014 len += sizeof(flow->addrs.v6addrs);
1015 break;
1016 case FLOW_DISSECTOR_KEY_TIPC:
1017 len += sizeof(flow->addrs.tipckey);
1018 break;
1019 }
1020 return len;
1021 }
1022
1023 __be32 flow_get_u32_src(const struct flow_keys *flow)
1024 {
1025 switch (flow->control.addr_type) {
1026 case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
1027 return flow->addrs.v4addrs.src;
1028 case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
1029 return (__force __be32)ipv6_addr_hash(
1030 &flow->addrs.v6addrs.src);
1031 case FLOW_DISSECTOR_KEY_TIPC:
1032 return flow->addrs.tipckey.key;
1033 default:
1034 return 0;
1035 }
1036 }
1037 EXPORT_SYMBOL(flow_get_u32_src);
1038
1039 __be32 flow_get_u32_dst(const struct flow_keys *flow)
1040 {
1041 switch (flow->control.addr_type) {
1042 case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
1043 return flow->addrs.v4addrs.dst;
1044 case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
1045 return (__force __be32)ipv6_addr_hash(
1046 &flow->addrs.v6addrs.dst);
1047 default:
1048 return 0;
1049 }
1050 }
1051 EXPORT_SYMBOL(flow_get_u32_dst);
1052
1053 static inline void __flow_hash_consistentify(struct flow_keys *keys)
1054 {
1055 int addr_diff, i;
1056
1057 switch (keys->control.addr_type) {
1058 case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
1059 addr_diff = (__force u32)keys->addrs.v4addrs.dst -
1060 (__force u32)keys->addrs.v4addrs.src;
1061 if ((addr_diff < 0) ||
1062 (addr_diff == 0 &&
1063 ((__force u16)keys->ports.dst <
1064 (__force u16)keys->ports.src))) {
1065 swap(keys->addrs.v4addrs.src, keys->addrs.v4addrs.dst);
1066 swap(keys->ports.src, keys->ports.dst);
1067 }
1068 break;
1069 case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
1070 addr_diff = memcmp(&keys->addrs.v6addrs.dst,
1071 &keys->addrs.v6addrs.src,
1072 sizeof(keys->addrs.v6addrs.dst));
1073 if ((addr_diff < 0) ||
1074 (addr_diff == 0 &&
1075 ((__force u16)keys->ports.dst <
1076 (__force u16)keys->ports.src))) {
1077 for (i = 0; i < 4; i++)
1078 swap(keys->addrs.v6addrs.src.s6_addr32[i],
1079 keys->addrs.v6addrs.dst.s6_addr32[i]);
1080 swap(keys->ports.src, keys->ports.dst);
1081 }
1082 break;
1083 }
1084 }
1085
1086 static inline u32 __flow_hash_from_keys(struct flow_keys *keys,
1087 const siphash_key_t *keyval)
1088 {
1089 u32 hash;
1090
1091 __flow_hash_consistentify(keys);
1092
1093 hash = siphash(flow_keys_hash_start(keys),
1094 flow_keys_hash_length(keys), keyval);
1095 if (!hash)
1096 hash = 1;
1097
1098 return hash;
1099 }
1100
1101 u32 flow_hash_from_keys(struct flow_keys *keys)
1102 {
1103 __flow_hash_secret_init();
1104 return __flow_hash_from_keys(keys, &hashrnd);
1105 }
1106 EXPORT_SYMBOL(flow_hash_from_keys);
1107
1108 static inline u32 ___skb_get_hash(const struct sk_buff *skb,
1109 struct flow_keys *keys,
1110 const siphash_key_t *keyval)
1111 {
1112 skb_flow_dissect_flow_keys(skb, keys,
1113 FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL);
1114
1115 return __flow_hash_from_keys(keys, keyval);
1116 }
1117
1118 struct _flow_keys_digest_data {
1119 __be16 n_proto;
1120 u8 ip_proto;
1121 u8 padding;
1122 __be32 ports;
1123 __be32 src;
1124 __be32 dst;
1125 };
1126
1127 void make_flow_keys_digest(struct flow_keys_digest *digest,
1128 const struct flow_keys *flow)
1129 {
1130 struct _flow_keys_digest_data *data =
1131 (struct _flow_keys_digest_data *)digest;
1132
1133 BUILD_BUG_ON(sizeof(*data) > sizeof(*digest));
1134
1135 memset(digest, 0, sizeof(*digest));
1136
1137 data->n_proto = flow->basic.n_proto;
1138 data->ip_proto = flow->basic.ip_proto;
1139 data->ports = flow->ports.ports;
1140 data->src = flow->addrs.v4addrs.src;
1141 data->dst = flow->addrs.v4addrs.dst;
1142 }
1143 EXPORT_SYMBOL(make_flow_keys_digest);
1144
1145 static struct flow_dissector flow_keys_dissector_symmetric __read_mostly;
1146
1147 u32 __skb_get_hash_symmetric(const struct sk_buff *skb)
1148 {
1149 struct flow_keys keys;
1150
1151 __flow_hash_secret_init();
1152
1153 memset(&keys, 0, sizeof(keys));
1154 __skb_flow_dissect(skb, &flow_keys_dissector_symmetric, &keys,
1155 NULL, 0, 0, 0,
1156 FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL);
1157
1158 return __flow_hash_from_keys(&keys, &hashrnd);
1159 }
1160 EXPORT_SYMBOL_GPL(__skb_get_hash_symmetric);
1161
1162 /**
1163 * __skb_get_hash: calculate a flow hash
1164 * @skb: sk_buff to calculate flow hash from
1165 *
1166 * This function calculates a flow hash based on src/dst addresses
1167 * and src/dst port numbers. Sets hash in skb to non-zero hash value
1168 * on success, zero indicates no valid hash. Also, sets l4_hash in skb
1169 * if hash is a canonical 4-tuple hash over transport ports.
1170 */
1171 void __skb_get_hash(struct sk_buff *skb)
1172 {
1173 struct flow_keys keys;
1174 u32 hash;
1175
1176 __flow_hash_secret_init();
1177
1178 hash = ___skb_get_hash(skb, &keys, &hashrnd);
1179
1180 __skb_set_sw_hash(skb, hash, flow_keys_have_l4(&keys));
1181 }
1182 EXPORT_SYMBOL(__skb_get_hash);
1183
1184 __u32 skb_get_hash_perturb(const struct sk_buff *skb,
1185 const siphash_key_t *perturb)
1186 {
1187 struct flow_keys keys;
1188
1189 return ___skb_get_hash(skb, &keys, perturb);
1190 }
1191 EXPORT_SYMBOL(skb_get_hash_perturb);
1192
1193 u32 __skb_get_poff(const struct sk_buff *skb, void *data,
1194 const struct flow_keys *keys, int hlen)
1195 {
1196 u32 poff = keys->control.thoff;
1197
1198 /* skip L4 headers for fragments after the first */
1199 if ((keys->control.flags & FLOW_DIS_IS_FRAGMENT) &&
1200 !(keys->control.flags & FLOW_DIS_FIRST_FRAG))
1201 return poff;
1202
1203 switch (keys->basic.ip_proto) {
1204 case IPPROTO_TCP: {
1205 /* access doff as u8 to avoid unaligned access */
1206 const u8 *doff;
1207 u8 _doff;
1208
1209 doff = __skb_header_pointer(skb, poff + 12, sizeof(_doff),
1210 data, hlen, &_doff);
1211 if (!doff)
1212 return poff;
1213
1214 poff += max_t(u32, sizeof(struct tcphdr), (*doff & 0xF0) >> 2);
1215 break;
1216 }
1217 case IPPROTO_UDP:
1218 case IPPROTO_UDPLITE:
1219 poff += sizeof(struct udphdr);
1220 break;
1221 /* For the rest, we do not really care about header
1222 * extensions at this point for now.
1223 */
1224 case IPPROTO_ICMP:
1225 poff += sizeof(struct icmphdr);
1226 break;
1227 case IPPROTO_ICMPV6:
1228 poff += sizeof(struct icmp6hdr);
1229 break;
1230 case IPPROTO_IGMP:
1231 poff += sizeof(struct igmphdr);
1232 break;
1233 case IPPROTO_DCCP:
1234 poff += sizeof(struct dccp_hdr);
1235 break;
1236 case IPPROTO_SCTP:
1237 poff += sizeof(struct sctphdr);
1238 break;
1239 }
1240
1241 return poff;
1242 }
1243
1244 /**
1245 * skb_get_poff - get the offset to the payload
1246 * @skb: sk_buff to get the payload offset from
1247 *
1248 * The function will get the offset to the payload as far as it could
1249 * be dissected. The main user is currently BPF, so that we can dynamically
1250 * truncate packets without needing to push actual payload to the user
1251 * space and can analyze headers only, instead.
1252 */
1253 u32 skb_get_poff(const struct sk_buff *skb)
1254 {
1255 struct flow_keys keys;
1256
1257 if (!skb_flow_dissect_flow_keys(skb, &keys, 0))
1258 return 0;
1259
1260 return __skb_get_poff(skb, skb->data, &keys, skb_headlen(skb));
1261 }
1262
1263 __u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys)
1264 {
1265 memset(keys, 0, sizeof(*keys));
1266
1267 memcpy(&keys->addrs.v6addrs.src, &fl6->saddr,
1268 sizeof(keys->addrs.v6addrs.src));
1269 memcpy(&keys->addrs.v6addrs.dst, &fl6->daddr,
1270 sizeof(keys->addrs.v6addrs.dst));
1271 keys->control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
1272 keys->ports.src = fl6->fl6_sport;
1273 keys->ports.dst = fl6->fl6_dport;
1274 keys->keyid.keyid = fl6->fl6_gre_key;
1275 keys->tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6);
1276 keys->basic.ip_proto = fl6->flowi6_proto;
1277
1278 return flow_hash_from_keys(keys);
1279 }
1280 EXPORT_SYMBOL(__get_hash_from_flowi6);
1281
1282 __u32 __get_hash_from_flowi4(const struct flowi4 *fl4, struct flow_keys *keys)
1283 {
1284 memset(keys, 0, sizeof(*keys));
1285
1286 keys->addrs.v4addrs.src = fl4->saddr;
1287 keys->addrs.v4addrs.dst = fl4->daddr;
1288 keys->control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
1289 keys->ports.src = fl4->fl4_sport;
1290 keys->ports.dst = fl4->fl4_dport;
1291 keys->keyid.keyid = fl4->fl4_gre_key;
1292 keys->basic.ip_proto = fl4->flowi4_proto;
1293
1294 return flow_hash_from_keys(keys);
1295 }
1296 EXPORT_SYMBOL(__get_hash_from_flowi4);
1297
1298 static const struct flow_dissector_key flow_keys_dissector_keys[] = {
1299 {
1300 .key_id = FLOW_DISSECTOR_KEY_CONTROL,
1301 .offset = offsetof(struct flow_keys, control),
1302 },
1303 {
1304 .key_id = FLOW_DISSECTOR_KEY_BASIC,
1305 .offset = offsetof(struct flow_keys, basic),
1306 },
1307 {
1308 .key_id = FLOW_DISSECTOR_KEY_IPV4_ADDRS,
1309 .offset = offsetof(struct flow_keys, addrs.v4addrs),
1310 },
1311 {
1312 .key_id = FLOW_DISSECTOR_KEY_IPV6_ADDRS,
1313 .offset = offsetof(struct flow_keys, addrs.v6addrs),
1314 },
1315 {
1316 .key_id = FLOW_DISSECTOR_KEY_TIPC,
1317 .offset = offsetof(struct flow_keys, addrs.tipckey),
1318 },
1319 {
1320 .key_id = FLOW_DISSECTOR_KEY_PORTS,
1321 .offset = offsetof(struct flow_keys, ports),
1322 },
1323 {
1324 .key_id = FLOW_DISSECTOR_KEY_VLAN,
1325 .offset = offsetof(struct flow_keys, vlan),
1326 },
1327 {
1328 .key_id = FLOW_DISSECTOR_KEY_FLOW_LABEL,
1329 .offset = offsetof(struct flow_keys, tags),
1330 },
1331 {
1332 .key_id = FLOW_DISSECTOR_KEY_GRE_KEYID,
1333 .offset = offsetof(struct flow_keys, keyid),
1334 },
1335 };
1336
1337 static const struct flow_dissector_key flow_keys_dissector_symmetric_keys[] = {
1338 {
1339 .key_id = FLOW_DISSECTOR_KEY_CONTROL,
1340 .offset = offsetof(struct flow_keys, control),
1341 },
1342 {
1343 .key_id = FLOW_DISSECTOR_KEY_BASIC,
1344 .offset = offsetof(struct flow_keys, basic),
1345 },
1346 {
1347 .key_id = FLOW_DISSECTOR_KEY_IPV4_ADDRS,
1348 .offset = offsetof(struct flow_keys, addrs.v4addrs),
1349 },
1350 {
1351 .key_id = FLOW_DISSECTOR_KEY_IPV6_ADDRS,
1352 .offset = offsetof(struct flow_keys, addrs.v6addrs),
1353 },
1354 {
1355 .key_id = FLOW_DISSECTOR_KEY_PORTS,
1356 .offset = offsetof(struct flow_keys, ports),
1357 },
1358 };
1359
1360 static const struct flow_dissector_key flow_keys_buf_dissector_keys[] = {
1361 {
1362 .key_id = FLOW_DISSECTOR_KEY_CONTROL,
1363 .offset = offsetof(struct flow_keys, control),
1364 },
1365 {
1366 .key_id = FLOW_DISSECTOR_KEY_BASIC,
1367 .offset = offsetof(struct flow_keys, basic),
1368 },
1369 };
1370
1371 struct flow_dissector flow_keys_dissector __read_mostly;
1372 EXPORT_SYMBOL(flow_keys_dissector);
1373
1374 struct flow_dissector flow_keys_buf_dissector __read_mostly;
1375
1376 static int __init init_default_flow_dissectors(void)
1377 {
1378 skb_flow_dissector_init(&flow_keys_dissector,
1379 flow_keys_dissector_keys,
1380 ARRAY_SIZE(flow_keys_dissector_keys));
1381 skb_flow_dissector_init(&flow_keys_dissector_symmetric,
1382 flow_keys_dissector_symmetric_keys,
1383 ARRAY_SIZE(flow_keys_dissector_symmetric_keys));
1384 skb_flow_dissector_init(&flow_keys_buf_dissector,
1385 flow_keys_buf_dissector_keys,
1386 ARRAY_SIZE(flow_keys_buf_dissector_keys));
1387 return 0;
1388 }
1389
1390 core_initcall(init_default_flow_dissectors);