From 8d10683f057e23e84d2db71c0ac18c1f3a95b243 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Mon, 28 Nov 2011 20:30:35 +0000 Subject: [PATCH] --- yaml --- r: 278280 b: refs/heads/master c: 4d77d2b567ec66a443792d99e96ac760991d80d0 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/net/flow_keys.h | 1 + trunk/net/core/flow_dissector.c | 13 +++++++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 62695e12597a..3958a2160ba7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c3940999b29ca7d6ad9b37b827a058c90fd51992 +refs/heads/master: 4d77d2b567ec66a443792d99e96ac760991d80d0 diff --git a/trunk/include/net/flow_keys.h b/trunk/include/net/flow_keys.h index e4cb28526563..80461c1ae9ef 100644 --- a/trunk/include/net/flow_keys.h +++ b/trunk/include/net/flow_keys.h @@ -2,6 +2,7 @@ #define _NET_FLOW_KEYS_H struct flow_keys { + /* (src,dst) must be grouped, in the same way than in IP header */ __be32 src; __be32 dst; union { diff --git a/trunk/net/core/flow_dissector.c b/trunk/net/core/flow_dissector.c index f0516d9280c3..0985b9b14b80 100644 --- a/trunk/net/core/flow_dissector.c +++ b/trunk/net/core/flow_dissector.c @@ -8,6 +8,16 @@ #include #include +/* copy saddr & daddr, possibly using 64bit load/store + * Equivalent to : flow->src = iph->saddr; + * flow->dst = iph->daddr; + */ +static void iph_to_flow_copy_addrs(struct flow_keys *flow, const struct iphdr *iph) +{ + BUILD_BUG_ON(offsetof(typeof(*flow), dst) != + offsetof(typeof(*flow), src) + sizeof(flow->src)); + memcpy(&flow->src, &iph->saddr, sizeof(flow->src) + sizeof(flow->dst)); +} bool skb_flow_dissect(const struct sk_buff *skb, struct flow_keys *flow) { @@ -31,8 +41,7 @@ bool skb_flow_dissect(const struct sk_buff *skb, struct flow_keys *flow) ip_proto = 0; else ip_proto = iph->protocol; - flow->src = iph->saddr; - flow->dst = iph->daddr; + iph_to_flow_copy_addrs(flow, iph); nhoff += iph->ihl * 4; break; }