diff options
author | Tom Herbert <tom@herbertland.com> | 2015-09-01 18:24:28 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-09-02 00:06:22 +0200 |
commit | 807e165dc44fd93f9d378f861f0540a158d7343a (patch) | |
tree | f7ac0c0750f3a99c7261f21079e05ee1090345fe /net/core/flow_dissector.c | |
parent | flow_dissector: Add flags argument to skb_flow_dissector functions (diff) | |
download | linux-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.c | 15 |
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): { |