summaryrefslogtreecommitdiffstats
path: root/net/core/flow_dissector.c
diff options
context:
space:
mode:
authorTom Herbert <tom@herbertland.com>2015-09-01 18:24:28 +0200
committerDavid S. Miller <davem@davemloft.net>2015-09-02 00:06:22 +0200
commit807e165dc44fd93f9d378f861f0540a158d7343a (patch)
treef7ac0c0750f3a99c7261f21079e05ee1090345fe /net/core/flow_dissector.c
parentflow_dissector: Add flags argument to skb_flow_dissector functions (diff)
downloadlinux-807e165dc44fd93f9d378f861f0540a158d7343a.tar.xz
linux-807e165dc44fd93f9d378f861f0540a158d7343a.zip
flow_dissector: Add control/reporting of fragmentation
Add an input flag to flow dissector on rather dissection should be attempted on a first fragment. Also add key_control flags to indicate that a packet is a fragment or first fragment. Signed-off-by: Tom Herbert <tom@herbertland.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/flow_dissector.c')
-rw-r--r--net/core/flow_dissector.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
index c3d9807cb34e..7536a4669029 100644
--- a/net/core/flow_dissector.c
+++ b/net/core/flow_dissector.c
@@ -177,8 +177,6 @@ ip:
nhoff += iph->ihl * 4;
ip_proto = iph->protocol;
- if (ip_is_fragment(iph))
- ip_proto = 0;
if (!skb_flow_dissector_uses_key(flow_dissector,
FLOW_DISSECTOR_KEY_IPV4_ADDRS))
@@ -189,6 +187,19 @@ ip:
memcpy(&key_addrs->v4addrs, &iph->saddr,
sizeof(key_addrs->v4addrs));
key_control->addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
+
+ if (ip_is_fragment(iph)) {
+ key_control->is_fragment = 1;
+
+ if (iph->frag_off & htons(IP_OFFSET)) {
+ goto out_good;
+ } else {
+ key_control->first_frag = 1;
+ if (!(flags & FLOW_DISSECTOR_F_PARSE_1ST_FRAG))
+ goto out_good;
+ }
+ }
+
break;
}
case htons(ETH_P_IPV6): {