aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/sch_sfb.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sched/sch_sfb.c')
-rw-r--r--net/sched/sch_sfb.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/net/sched/sch_sfb.c b/net/sched/sch_sfb.c
index e83c272c0325..96e42cae4c7a 100644
--- a/net/sched/sch_sfb.c
+++ b/net/sched/sch_sfb.c
@@ -26,6 +26,7 @@
26#include <net/ip.h> 26#include <net/ip.h>
27#include <net/pkt_sched.h> 27#include <net/pkt_sched.h>
28#include <net/inet_ecn.h> 28#include <net/inet_ecn.h>
29#include <net/flow_keys.h>
29 30
30/* 31/*
31 * SFB uses two B[l][n] : L x N arrays of bins (L levels, N bins per level) 32 * SFB uses two B[l][n] : L x N arrays of bins (L levels, N bins per level)
@@ -286,6 +287,7 @@ static int sfb_enqueue(struct sk_buff *skb, struct Qdisc *sch)
286 u32 minqlen = ~0; 287 u32 minqlen = ~0;
287 u32 r, slot, salt, sfbhash; 288 u32 r, slot, salt, sfbhash;
288 int ret = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; 289 int ret = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
290 struct flow_keys keys;
289 291
290 if (unlikely(sch->q.qlen >= q->limit)) { 292 if (unlikely(sch->q.qlen >= q->limit)) {
291 sch->qstats.overlimits++; 293 sch->qstats.overlimits++;
@@ -309,13 +311,19 @@ static int sfb_enqueue(struct sk_buff *skb, struct Qdisc *sch)
309 /* If using external classifiers, get result and record it. */ 311 /* If using external classifiers, get result and record it. */
310 if (!sfb_classify(skb, q, &ret, &salt)) 312 if (!sfb_classify(skb, q, &ret, &salt))
311 goto other_drop; 313 goto other_drop;
314 keys.src = salt;
315 keys.dst = 0;
316 keys.ports = 0;
312 } else { 317 } else {
313 salt = skb_get_rxhash(skb); 318 skb_flow_dissect(skb, &keys);
314 } 319 }
315 320
316 slot = q->slot; 321 slot = q->slot;
317 322
318 sfbhash = jhash_1word(salt, q->bins[slot].perturbation); 323 sfbhash = jhash_3words((__force u32)keys.dst,
324 (__force u32)keys.src,
325 (__force u32)keys.ports,
326 q->bins[slot].perturbation);
319 if (!sfbhash) 327 if (!sfbhash)
320 sfbhash = 1; 328 sfbhash = 1;
321 sfb_skb_cb(skb)->hashes[slot] = sfbhash; 329 sfb_skb_cb(skb)->hashes[slot] = sfbhash;
@@ -347,7 +355,10 @@ static int sfb_enqueue(struct sk_buff *skb, struct Qdisc *sch)
347 if (unlikely(p_min >= SFB_MAX_PROB)) { 355 if (unlikely(p_min >= SFB_MAX_PROB)) {
348 /* Inelastic flow */ 356 /* Inelastic flow */
349 if (q->double_buffering) { 357 if (q->double_buffering) {
350 sfbhash = jhash_1word(salt, q->bins[slot].perturbation); 358 sfbhash = jhash_3words((__force u32)keys.dst,
359 (__force u32)keys.src,
360 (__force u32)keys.ports,
361 q->bins[slot].perturbation);
351 if (!sfbhash) 362 if (!sfbhash)
352 sfbhash = 1; 363 sfbhash = 1;
353 sfb_skb_cb(skb)->hashes[slot] = sfbhash; 364 sfb_skb_cb(skb)->hashes[slot] = sfbhash;