Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Jun 2012 22:33:54 +0200
From:      Michael Tuexen <Michael.Tuexen@lurchi.franken.de>
To:        "freebsd-net@freebsd.org mailing list" <freebsd-net@freebsd.org>
Subject:   IP_RECVTOS
Message-ID:  <1D03F00E-2777-4B0B-8E1C-860EA115B6AF@lurchi.franken.de>

next in thread | raw e-mail | index | archive | help

--Apple-Mail=_6CCF2CB6-B5EA-4BB0-AAAE-F354DAE44261
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=us-ascii

Dear all,

there is currently no way to receive the TOS byte of a received UDP/IPv4 =
packet.
The attached patch adds a socket option (IP_RECVTOS) which you can use
to get a cmsg of type (IP_RECVTOS) which contains the TOS byte. Much =
like
IP_RECVTTL does for TTL. Any comments/objections? If there are none, I =
would
like to commit this to head soon.

Best regards
Michael


--Apple-Mail=_6CCF2CB6-B5EA-4BB0-AAAE-F354DAE44261
Content-Disposition: attachment;
	filename=recvtos.patch
Content-Type: application/octet-stream;
	name="recvtos.patch"
Content-Transfer-Encoding: 7bit

Index: in.h
===================================================================
--- in.h	(revision 236601)
+++ in.h	(working copy)
@@ -462,6 +462,7 @@
 #define	IP_RECVTTL		65   /* bool; receive IP TTL w/dgram */
 #define	IP_MINTTL		66   /* minimum TTL for packet or drop */
 #define	IP_DONTFRAG		67   /* don't fragment packet */
+#define	IP_RECVTOS		68   /* bool; receive IP TOS w/dgram */
 
 /* IPv4 Source Filter Multicast API [RFC3678] */
 #define	IP_ADD_SOURCE_MEMBERSHIP	70   /* join a source-specific group */
Index: in_pcb.c
===================================================================
--- in_pcb.c	(revision 236601)
+++ in_pcb.c	(working copy)
@@ -2295,6 +2295,10 @@
 		db_printf("%sINP_DONTFRAG", comma ? ", " : "");
 		comma = 1;
 	}
+	if (inp_flags & INP_RECVTOS) {
+		db_printf("%sINP_RECVTOS", comma ? ", " : "");
+		comma = 1;
+	}
 	if (inp_flags & IN6P_IPV6_V6ONLY) {
 		db_printf("%sIN6P_IPV6_V6ONLY", comma ? ", " : "");
 		comma = 1;
Index: in_pcb.h
===================================================================
--- in_pcb.h	(revision 236601)
+++ in_pcb.h	(working copy)
@@ -509,6 +509,7 @@
 #define	INP_DONTFRAG		0x00000800 /* don't fragment packet */
 #define	INP_BINDANY		0x00001000 /* allow bind to any address */
 #define	INP_INHASHLIST		0x00002000 /* in_pcbinshash() has been called */
+#define	INP_RECVTOS		0x00004000 /* receive incoming IP TOS */
 #define	IN6P_IPV6_V6ONLY	0x00008000 /* restrict AF_INET6 socket for v6 */
 #define	IN6P_PKTINFO		0x00010000 /* receive IP6 dst and I/F */
 #define	IN6P_HOPLIMIT		0x00020000 /* receive hoplimit */
@@ -528,7 +529,7 @@
 #define	IN6P_MTU		0x80000000 /* receive path MTU */
 
 #define	INP_CONTROLOPTS		(INP_RECVOPTS|INP_RECVRETOPTS|INP_RECVDSTADDR|\
-				 INP_RECVIF|INP_RECVTTL|\
+				 INP_RECVIF|INP_RECVTTL|INP_RECVTOS|\
 				 IN6P_PKTINFO|IN6P_HOPLIMIT|IN6P_HOPOPTS|\
 				 IN6P_DSTOPTS|IN6P_RTHDR|IN6P_RTHDRDSTOPTS|\
 				 IN6P_TCLASS|IN6P_AUTOFLOWLABEL|IN6P_RFC2292|\
Index: ip_output.c
===================================================================
--- ip_output.c	(revision 236601)
+++ ip_output.c	(working copy)
@@ -984,6 +984,7 @@
 		case IP_FAITH:
 		case IP_ONESBCAST:
 		case IP_DONTFRAG:
+		case IP_RECVTOS:
 			error = sooptcopyin(sopt, &optval, sizeof optval,
 					    sizeof optval);
 			if (error)
@@ -1047,6 +1048,9 @@
 			case IP_BINDANY:
 				OPTSET(INP_BINDANY);
 				break;
+			case IP_RECVTOS:
+				OPTSET(INP_RECVTOS);
+				break;
 			}
 			break;
 #undef OPTSET
@@ -1156,6 +1160,7 @@
 		case IP_ONESBCAST:
 		case IP_DONTFRAG:
 		case IP_BINDANY:
+		case IP_RECVTOS:
 			switch (sopt->sopt_name) {
 
 			case IP_TOS:
@@ -1214,6 +1219,9 @@
 			case IP_BINDANY:
 				optval = OPTBIT(INP_BINDANY);
 				break;
+			case IP_RECVTOS:
+				optval = OPTBIT(INP_RECVTOS);
+				break;
 			}
 			error = sooptcopyout(sopt, &optval, sizeof optval);
 			break;
Index: ip_input.c
===================================================================
--- ip_input.c	(revision 236601)
+++ ip_input.c	(working copy)
@@ -1684,6 +1684,12 @@
 		if (*mp)
 			mp = &(*mp)->m_next;
 	}
+	if (inp->inp_flags & INP_RECVTOS) {
+		*mp = sbcreatecontrol((caddr_t) &ip->ip_tos,
+		    sizeof(u_char), IP_RECVTOS, IPPROTO_IP);
+		if (*mp)
+			mp = &(*mp)->m_next;
+	}
 }
 
 /*

--Apple-Mail=_6CCF2CB6-B5EA-4BB0-AAAE-F354DAE44261--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1D03F00E-2777-4B0B-8E1C-860EA115B6AF>