Subject: ECN and the DSCP field
To: None <kurahone@NetBSD.org, briggs@NetBSD.org, matt@NetBSD.org,>
From: Rui Paulo <rpaulo@fnop.net>
List: tech-net
Date: 06/06/2006 17:49:39
Hi,
As you might know, RFC 2474 introduces a new field called
"Differentiated Services".

Quoting the RFC:

   The DS field structure is presented below:


        0   1   2   3   4   5   6   7
      +---+---+---+---+---+---+---+---+
      |         DSCP          |  CU   |
      +---+---+---+---+---+---+---+---+

        DSCP: differentiated services codepoint
        CU:   currently unused

This replaces the ip_tos field with a more fine grained type of
service control.
DSCP can have serveral values, assigned from IANA and available from:
http://www.iana.org/assignments/dscp-registry.

The CU bits are now used by ECN indicating (from RFC 3168):

   Bits 6-7, ECN Field:

   Binary  Keyword                                  References
   ------  -------                                  ----------
     00     Not-ECT (Not ECN-Capable Transport)     [RFC 3168]
     01     ECT(1) (ECN-Capable Transport(1))       [RFC 3168]
     10     ECT(0) (ECN-Capable Transport(0))       [RFC 3168]
     11     CE (Congestion Experienced)             [RFC 3168]

So, what I was thinking was replacing our ip_tos field in 'struct ip'
by something like:

struct ip {

	[...]

	union {
		struct ip_ds {		/* differentiated services */
#if BYTE_ORDER == LITTLE_ENDIAN
			u_int8_t  ds_ecn:2;	/* ecn field */
			u_int8_t  ds_cp:6;	/* diffserv codepoint */
#endif
#if BYTE_ORDER == BIG_ENDIAN
			u_int8_t  ds_cp:6;	/* diffserv codepoint */
			u_int8_t  ds_ecn:2;	/* ecn field */
#endif
		} ip_ds __attribute__((__packed__));

		u_int8_t  ip_tos;	/* type of service */
	} ip_dsf __attribute__((__packed__));

	[...]

} __attribute__((__packed__));


This raises two issues:

	1) Some files are using local variables called ip_tos, so I
           can't do:
	   #define ip_tos ip_dsf.ip_tos
	   #define ip_ds  ip_dsf.ip_ds
	   without fixing them.
	2) I guess that we don't want to go fix every file that
           references ip->ip_tos. Out of question, right?

Concluding, doing this change is not strictly necessary for
implemeting ECN, but it could help future implementations of CoS/ToS
classifiers.

Comments?