diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/sched/sch_gred.c | 8 | ||||
| -rw-r--r-- | net/sched/sch_red.c | 8 | 
2 files changed, 14 insertions, 2 deletions
| diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c index 079b0a4ea1c2..29a2dd9f3029 100644 --- a/net/sched/sch_gred.c +++ b/net/sched/sch_gred.c @@ -146,6 +146,11 @@ static inline int gred_use_ecn(struct gred_sched *t)  	return t->red_flags & TC_RED_ECN;  } +static inline int gred_use_harddrop(struct gred_sched *t) +{ +	return t->red_flags & TC_RED_HARDDROP; +} +  static int gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)  {  	struct gred_sched_data *q=NULL; @@ -214,7 +219,8 @@ static int gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)  		case RED_HARD_MARK:  			sch->qstats.overlimits++; -			if (!gred_use_ecn(t) || !INET_ECN_set_ce(skb)) { +			if (gred_use_harddrop(t) || !gred_use_ecn(t) || +			    !INET_ECN_set_ce(skb)) {  				q->stats.forced_drop++;  				goto congestion_drop;  			} diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c index 0d89dee751a9..dccfa44c2d71 100644 --- a/net/sched/sch_red.c +++ b/net/sched/sch_red.c @@ -51,6 +51,11 @@ static inline int red_use_ecn(struct red_sched_data *q)  	return q->flags & TC_RED_ECN;  } +static inline int red_use_harddrop(struct red_sched_data *q) +{ +	return q->flags & TC_RED_HARDDROP; +} +  static int red_enqueue(struct sk_buff *skb, struct Qdisc* sch)  {  	struct red_sched_data *q = qdisc_priv(sch); @@ -76,7 +81,8 @@ static int red_enqueue(struct sk_buff *skb, struct Qdisc* sch)  		case RED_HARD_MARK:  			sch->qstats.overlimits++; -			if (!red_use_ecn(q) || !INET_ECN_set_ce(skb)) { +			if (red_use_harddrop(q) || !red_use_ecn(q) || +			    !INET_ECN_set_ce(skb)) {  				q->stats.forced_drop++;  				goto congestion_drop;  			} | 
