dscp revision 67adc03ef81fb610f8df093b17f55275ee816754
d6fa26d0adaec6c910115be34fe7a5a5f402c14fMark Andrews
803b50652fd6ad81d04d18fc04332c8a94f8fe9aAndreas Gustafsson Differentiate Services Code Point Support
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein$Id: dscp,v 1.1.2.1 2012/02/24 05:20:36 marka Exp $
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox UserDifferentiate Services Code Point (DSCP) is implemented in IPv4 using the
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox UserTOS octet and in IPv6 using the TCLASS octet.
803b50652fd6ad81d04d18fc04332c8a94f8fe9aAndreas Gustafsson
d6fa26d0adaec6c910115be34fe7a5a5f402c14fMark AndrewsRFC 3542 defines the api to manipulate the TCLASS octet as part of
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinthe advanced socket API. TCLASS is settable on both a socket and
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinpacket basis (setsockopt/sendmsg) and the sent value can be retrieved
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinusing recvmsg over UDP. Retrieval is undefined for TCP.
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinThe Advanced socket API was not incorporated into the POSIX socket
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox UserAPI for IPv6 and may not be completely implemented in any OS.
0c6ada0a814f3c5417daa1654129bc2af56ed504Automatic Updater
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserFor TOS setsockopt() supports setting of the field on a persocket
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox Userbasis. TOS may also be set on a per packet basis on some OS using
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox Usersendmsg. If it is not supported the sendmsg call reports a error.
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserSupport can only be determined by attempted to send a packet with
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox Userthe option set. Retrieval of the sent TOS value is retrievable on
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinLinux. This can be determined at compile time.
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserDSCP values need to be compatible with TOS values as it is a re-use
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox Userof the field.
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinLIBISC:
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserWe will need to be able to probe for the level of DSCP support. We
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox Userneed to know if we can set it at the socket level, packet level and
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox Userif we can retrieve the DSCP value sent. This needs to be done
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinindependently for IPv4 and IPv6.
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User#define ISC_NET_DSCPRECVV4 0x01 /* Can receive sent DSCP value IPv4 */
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User#define ISC_NET_DSCPRECVV6 0x02 /* Can receive sent DSCP value IPv6 */
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User#define ISC_NET_DSCPSETV4 0x04 /* Can set DSCP on socket IPv4 */
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User#define ISC_NET_DSCPSETV6 0x08 /* Can set DSCP on socket IPv6 */
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User#define ISC_NET_DSCPPKTV4 0x10 /* Can set DSCP on per packet IPv4 */
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User#define ISC_NET_DSCPPKTV6 0x20 /* Can set DSCP on per packet IPv6 */
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User#define ISC_NET_DSCPALL 0x3f /* All valid flags */
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox Userunsigned int
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox Userisc_net_probedscp(void);
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User/*%<
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User * Probe the level of DSCP support.
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User */
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserWe also need to be able to set DSCP values on a per socket basis, per packet
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox Userbasis and to retrieve dscp values from received packet.
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserSetting dscp on a per socket basis shall be done using isc_socket_dscp.
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox Uservoid
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox Userisc_socket_dscp(isc_socket_t *sock, unsigned int dscp);
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User/*%<
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User * Requires:
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User *\li 'sock' is a valid socket.
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User */
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User/*@}*/
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
d060d8669f5558690e7faf4a1c12fe5c02a7c60dAutomatic Updaterisc_socketevent shall be extended to support the sending of and retrieval
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinof DSCP values. If ISC_SOCKEVENTATTR_DSCP is set then isc_socket_sendto2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinshall set the DSCP value. isc_socket_recv shall set ISC_SOCKEVENTATTR_DSCP
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinand the dscp element if the OS returns the value via recvmsg.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define ISC_SOCKEVENTATTR_DSCP 0x00040000U /* public */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinstruct isc_socketevent {
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User ISC_EVENT_COMMON(isc_socketevent_t);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_result_t result; /*%< OK, EOF, whatever else */
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User unsigned int minimum; /*%< minimum i/o for event */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein unsigned int n; /*%< bytes read or written */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein unsigned int offset; /*%< offset into buffer list */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_region_t region; /*%< for single-buffer i/o */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_bufferlist_t bufferlist; /*%< list of buffers */
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User isc_sockaddr_t address; /*%< source address */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_time_t timestamp; /*%< timestamp of packet recv */
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User struct in6_pktinfo pktinfo; /*%< ipv6 pktinfo */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_uint32_t attributes; /*%< see below */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isc_eventdestructor_t destroy; /*%< original destructor */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein unsigned int dscp; /*%< UDP dscp value */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein};
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
ed4475f3f583f6137b4ff7fea775c5363a4fdb29Automatic UpdaterA convience function will be provided to allocate and intialize the structure.
ed4475f3f583f6137b4ff7fea775c5363a4fdb29Automatic Updater
d060d8669f5558690e7faf4a1c12fe5c02a7c60dAutomatic Updaterisc_socketevent_t *
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox Userisc_socket_socketevent(isc_socket_t *sock0, isc_eventtype_t eventtype,
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox User isc_taskaction_t action, const void *arg)
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox UserNAMED/LIBDNS:
ed4475f3f583f6137b4ff7fea775c5363a4fdb29Automatic Updater
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox UserNamed needs to be able to set the DSCP value of sent traffic. We should
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox Userbe able to set DSCP for all TCP connections.
ed4475f3f583f6137b4ff7fea775c5363a4fdb29Automatic Updater
ed4475f3f583f6137b4ff7fea775c5363a4fdb29Automatic UpdaterFor UDP we should have a default DSCP value for when we can't set this on
ed4475f3f583f6137b4ff7fea775c5363a4fdb29Automatic Updatera per packet basis with the ability to override for specific destinations.
ed4475f3f583f6137b4ff7fea775c5363a4fdb29Automatic Updater
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox Useroptions/view/server;
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox Usertcp-dscp <value>;
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox Userudp-dscp <value>;
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox User
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox Userhttp://bogpeople.com/networking/dscp.shtml list a set of TOS compatible
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox Uservalues (below).
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox UserDSCP Name DS Field Value IP Precedence
ed4475f3f583f6137b4ff7fea775c5363a4fdb29Automatic Updater Binary Decimal
ed4475f3f583f6137b4ff7fea775c5363a4fdb29Automatic UpdaterCS0 000 000 0 0
d060d8669f5558690e7faf4a1c12fe5c02a7c60dAutomatic UpdaterCS1 001 000 8 1
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserAF11 001 010 10 1
d060d8669f5558690e7faf4a1c12fe5c02a7c60dAutomatic UpdaterAF12 001 100 12 1
d060d8669f5558690e7faf4a1c12fe5c02a7c60dAutomatic UpdaterAF13 001 110 14 1
d060d8669f5558690e7faf4a1c12fe5c02a7c60dAutomatic UpdaterCS2 010 000 16 2
d060d8669f5558690e7faf4a1c12fe5c02a7c60dAutomatic UpdaterAF21 010 010 18 2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinAF22 010 100 20 2
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserAF23 010 110 22 2
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserCS3 011 000 24 3
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserAF31 011 010 26 3
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox UserAF32 011 100 28 3
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserAF33 011 110 30 3
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserCS4 100 000 32 4
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserAF41 100 010 34 4
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox UserAF42 100 100 36 4
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserAF43 100 110 38 4
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserCS5 101 000 40 5
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox UserEF 101 110 46 5
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox UserCS6 110 000 48 6
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox UserCS7 111 000 56 7
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserCS Class Selector (RFC 2474)
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox UserAFxy Assured Forwarding (x=class, y=drop precedence) (RFC2597)
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox UserEF Expedited Forwarding (RFC 3246)
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox Uservalue should be one of these or a numeric 0..63. The default value is 0.
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User