diff options
author | Nikolay Aleksandrov <nikolay@redhat.com> | 2013-10-02 07:39:24 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-03 15:36:37 -0400 |
commit | 357afe9c46c951c34769e39cabdf8d1637e2eecc (patch) | |
tree | 4313ee038c1557c1aa36ec594a0aa20e545ca2df /net/core | |
parent | 5080546682bae3d32734b18e281091684f0ebbe4 (diff) |
flow_dissector: factor out the ports extraction in skb_flow_get_ports
Factor out the code that extracts the ports from skb_flow_dissect and
add a new function skb_flow_get_ports which can be re-used.
Suggested-by: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/flow_dissector.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 8d7d0dd72db2..f8e25ac41c6c 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c | |||
@@ -25,9 +25,35 @@ static void iph_to_flow_copy_addrs(struct flow_keys *flow, const struct iphdr *i | |||
25 | memcpy(&flow->src, &iph->saddr, sizeof(flow->src) + sizeof(flow->dst)); | 25 | memcpy(&flow->src, &iph->saddr, sizeof(flow->src) + sizeof(flow->dst)); |
26 | } | 26 | } |
27 | 27 | ||
28 | /** | ||
29 | * skb_flow_get_ports - extract the upper layer ports and return them | ||
30 | * @skb: buffer to extract the ports from | ||
31 | * @thoff: transport header offset | ||
32 | * @ip_proto: protocol for which to get port offset | ||
33 | * | ||
34 | * The function will try to retrieve the ports at offset thoff + poff where poff | ||
35 | * is the protocol port offset returned from proto_ports_offset | ||
36 | */ | ||
37 | __be32 skb_flow_get_ports(const struct sk_buff *skb, int thoff, u8 ip_proto) | ||
38 | { | ||
39 | int poff = proto_ports_offset(ip_proto); | ||
40 | |||
41 | if (poff >= 0) { | ||
42 | __be32 *ports, _ports; | ||
43 | |||
44 | ports = skb_header_pointer(skb, thoff + poff, | ||
45 | sizeof(_ports), &_ports); | ||
46 | if (ports) | ||
47 | return *ports; | ||
48 | } | ||
49 | |||
50 | return 0; | ||
51 | } | ||
52 | EXPORT_SYMBOL(skb_flow_get_ports); | ||
53 | |||
28 | bool skb_flow_dissect(const struct sk_buff *skb, struct flow_keys *flow) | 54 | bool skb_flow_dissect(const struct sk_buff *skb, struct flow_keys *flow) |
29 | { | 55 | { |
30 | int poff, nhoff = skb_network_offset(skb); | 56 | int nhoff = skb_network_offset(skb); |
31 | u8 ip_proto; | 57 | u8 ip_proto; |
32 | __be16 proto = skb->protocol; | 58 | __be16 proto = skb->protocol; |
33 | 59 | ||
@@ -150,16 +176,7 @@ ipv6: | |||
150 | } | 176 | } |
151 | 177 | ||
152 | flow->ip_proto = ip_proto; | 178 | flow->ip_proto = ip_proto; |
153 | poff = proto_ports_offset(ip_proto); | 179 | flow->ports = skb_flow_get_ports(skb, nhoff, ip_proto); |
154 | if (poff >= 0) { | ||
155 | __be32 *ports, _ports; | ||
156 | |||
157 | ports = skb_header_pointer(skb, nhoff + poff, | ||
158 | sizeof(_ports), &_ports); | ||
159 | if (ports) | ||
160 | flow->ports = *ports; | ||
161 | } | ||
162 | |||
163 | flow->thoff = (u16) nhoff; | 180 | flow->thoff = (u16) nhoff; |
164 | 181 | ||
165 | return true; | 182 | return true; |