blob: 1add8918a1551be091784ffd3e71d8b43954be3c [file] [log] [blame]
Jiri Pirko1bd758e2015-05-12 14:56:07 +02001#ifndef _NET_FLOW_DISSECTOR_H
2#define _NET_FLOW_DISSECTOR_H
Eric Dumazet0744dd02011-11-28 05:22:18 +00003
Jiri Pirkoc3f8eae2015-05-12 14:56:17 +02004#include <linux/types.h>
5#include <linux/skbuff.h>
6
Jiri Pirkofbff9492015-05-12 14:56:15 +02007/**
8 * struct flow_dissector_key_basic:
9 * @thoff: Transport header offset
10 * @n_proto: Network header protocol (eg. IPv4/IPv6)
11 * @ip_proto: Transport header protocol (eg. TCP/UDP)
12 */
13struct flow_dissector_key_basic {
14 u16 thoff;
15 __be16 n_proto;
16 u8 ip_proto;
17};
18
19/**
20 * struct flow_dissector_key_addrs:
21 * @src: source ip address in case of IPv4
22 * For IPv6 it contains 32bit hash of src address
23 * @dst: destination ip address in case of IPv4
24 * For IPv6 it contains 32bit hash of dst address
25 */
26struct flow_dissector_key_addrs {
27 /* (src,dst) must be grouped, in the same way than in IP header */
28 __be32 src;
29 __be32 dst;
30};
31
32/**
33 * flow_dissector_key_tp_ports:
34 * @ports: port numbers of Transport header
35 * port16[0]: src port number
36 * port16[1]: dst port number
37 */
38struct flow_dissector_key_ports {
39 union {
40 __be32 ports;
41 __be16 port16[2];
42 };
43};
44
45enum flow_dissector_key_id {
46 FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
47 FLOW_DISSECTOR_KEY_IPV4_ADDRS, /* struct flow_dissector_key_addrs */
48 FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS, /* struct flow_dissector_key_addrs */
49 FLOW_DISSECTOR_KEY_PORTS, /* struct flow_dissector_key_ports */
50
51 FLOW_DISSECTOR_KEY_MAX,
52};
53
54struct flow_dissector_key {
55 enum flow_dissector_key_id key_id;
56 size_t offset; /* offset of struct flow_dissector_key_*
57 in target the struct */
58};
59
60struct flow_dissector {
61 unsigned int used_keys; /* each bit repesents presence of one key id */
62 unsigned short int offset[FLOW_DISSECTOR_KEY_MAX];
63};
64
Jiri Pirkofbff9492015-05-12 14:56:15 +020065void skb_flow_dissector_init(struct flow_dissector *flow_dissector,
66 const struct flow_dissector_key *key,
67 unsigned int key_count);
Jiri Pirko06635a32015-05-12 14:56:16 +020068
69bool __skb_flow_dissect(const struct sk_buff *skb,
70 struct flow_dissector *flow_dissector,
71 void *target_container,
WANG Cong453a9402014-08-25 17:03:47 -070072 void *data, __be16 proto, int nhoff, int hlen);
Jiri Pirko1bd758e2015-05-12 14:56:07 +020073
74static inline bool skb_flow_dissect(const struct sk_buff *skb,
Jiri Pirko06635a32015-05-12 14:56:16 +020075 struct flow_dissector *flow_dissector,
76 void *target_container)
David S. Miller690e36e2014-08-23 12:13:41 -070077{
Jiri Pirko06635a32015-05-12 14:56:16 +020078 return __skb_flow_dissect(skb, flow_dissector, target_container,
79 NULL, 0, 0, 0);
80}
81
82struct flow_keys {
83 struct flow_dissector_key_addrs addrs;
84 struct flow_dissector_key_ports ports;
85 struct flow_dissector_key_basic basic;
86};
87
88extern struct flow_dissector flow_keys_dissector;
89extern struct flow_dissector flow_keys_buf_dissector;
90
91static inline bool skb_flow_dissect_flow_keys(const struct sk_buff *skb,
92 struct flow_keys *flow)
93{
94 memset(flow, 0, sizeof(*flow));
95 return __skb_flow_dissect(skb, &flow_keys_dissector, flow,
96 NULL, 0, 0, 0);
97}
98
99static inline bool skb_flow_dissect_flow_keys_buf(struct flow_keys *flow,
100 void *data, __be16 proto,
101 int nhoff, int hlen)
102{
103 memset(flow, 0, sizeof(*flow));
104 return __skb_flow_dissect(NULL, &flow_keys_buf_dissector, flow,
105 data, proto, nhoff, hlen);
David S. Miller690e36e2014-08-23 12:13:41 -0700106}
Jiri Pirko1bd758e2015-05-12 14:56:07 +0200107
David S. Miller690e36e2014-08-23 12:13:41 -0700108__be32 __skb_flow_get_ports(const struct sk_buff *skb, int thoff, u8 ip_proto,
109 void *data, int hlen_proto);
Jiri Pirko1bd758e2015-05-12 14:56:07 +0200110
111static inline __be32 skb_flow_get_ports(const struct sk_buff *skb,
112 int thoff, u8 ip_proto)
David S. Miller690e36e2014-08-23 12:13:41 -0700113{
114 return __skb_flow_get_ports(skb, thoff, ip_proto, NULL, 0);
115}
Jiri Pirko1bd758e2015-05-12 14:56:07 +0200116
Tom Herbert5ed20a62014-07-01 21:32:05 -0700117u32 flow_hash_from_keys(struct flow_keys *keys);
Jiri Pirko9c684b52015-05-12 14:56:11 +0200118void __skb_get_hash(struct sk_buff *skb);
Jiri Pirko10b89ee42015-05-12 14:56:09 +0200119u32 skb_get_poff(const struct sk_buff *skb);
120u32 __skb_get_poff(const struct sk_buff *skb, void *data,
121 const struct flow_keys *keys, int hlen);
Jiri Pirko1bd758e2015-05-12 14:56:07 +0200122
Tom Herbert2f59e1e2015-05-01 11:30:17 -0700123/* struct flow_keys_digest:
124 *
125 * This structure is used to hold a digest of the full flow keys. This is a
126 * larger "hash" of a flow to allow definitively matching specific flows where
127 * the 32 bit skb->hash is not large enough. The size is limited to 16 bytes so
128 * that it can by used in CB of skb (see sch_choke for an example).
129 */
130#define FLOW_KEYS_DIGEST_LEN 16
131struct flow_keys_digest {
132 u8 data[FLOW_KEYS_DIGEST_LEN];
133};
134
135void make_flow_keys_digest(struct flow_keys_digest *digest,
136 const struct flow_keys *flow);
137
Eric Dumazet0744dd02011-11-28 05:22:18 +0000138#endif