diff options
| author | Thomas Graf <tgraf@suug.ch> | 2005-11-05 21:14:27 +0100 | 
|---|---|---|
| committer | Thomas Graf <tgr@axs.localdomain> | 2005-11-05 22:02:29 +0100 | 
| commit | b38c7eef7e536d12051cc3d5864032f2f907cdfe (patch) | |
| tree | fcf0b38267b9f5cb77f98ffdbc3dc16b31a0908a /net/sched | |
| parent | d8f64e19605d6ce40bc560e7bc919e2e02a79c1b (diff) | |
| download | linux-b38c7eef7e536d12051cc3d5864032f2f907cdfe.tar.bz2 | |
[PKT_SCHED]: GRED: Support ECN marking
Adds a new u8 flags in a unused padding area of the netlink
message. Adds ECN marking support to be used instead of dropping
packets immediately.
Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
Diffstat (limited to 'net/sched')
| -rw-r--r-- | net/sched/sch_gred.c | 25 | 
1 files changed, 21 insertions, 4 deletions
| diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c index 69f0fd45d4c3..079b0a4ea1c2 100644 --- a/net/sched/sch_gred.c +++ b/net/sched/sch_gred.c @@ -55,6 +55,7 @@ struct gred_sched  {  	struct gred_sched_data *tab[MAX_DPs];  	unsigned long	flags; +	u32		red_flags;  	u32 		DPs;  	u32 		def;  	struct red_parms wred_set; @@ -140,6 +141,11 @@ static inline void gred_store_wred_set(struct gred_sched *table,  	table->wred_set.qavg = q->parms.qavg;  } +static inline int gred_use_ecn(struct gred_sched *t) +{ +	return t->red_flags & TC_RED_ECN; +} +  static int gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)  {  	struct gred_sched_data *q=NULL; @@ -198,13 +204,22 @@ static int gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)  		case RED_PROB_MARK:  			sch->qstats.overlimits++; -			q->stats.prob_drop++; -			goto congestion_drop; +			if (!gred_use_ecn(t) || !INET_ECN_set_ce(skb)) { +				q->stats.prob_drop++; +				goto congestion_drop; +			} + +			q->stats.prob_mark++; +			break;  		case RED_HARD_MARK:  			sch->qstats.overlimits++; -			q->stats.forced_drop++; -			goto congestion_drop; +			if (!gred_use_ecn(t) || !INET_ECN_set_ce(skb)) { +				q->stats.forced_drop++; +				goto congestion_drop; +			} +			q->stats.forced_mark++; +			break;  	}  	if (q->backlog + skb->len <= q->limit) { @@ -348,6 +363,7 @@ static inline int gred_change_table_def(struct Qdisc *sch, struct rtattr *dps)  	sch_tree_lock(sch);  	table->DPs = sopt->DPs;  	table->def = sopt->def_DP; +	table->red_flags = sopt->flags;  	/*  	 * Every entry point to GRED is synchronized with the above code @@ -489,6 +505,7 @@ static int gred_dump(struct Qdisc *sch, struct sk_buff *skb)  		.DPs	= table->DPs,  		.def_DP	= table->def,  		.grio	= gred_rio_mode(table), +		.flags	= table->red_flags,  	};  	opts = RTA_NEST(skb, TCA_OPTIONS); |