Date: Mon, 26 May 2003 18:10:13 -0700 From: Terry Lambert <tlambert2@mindspring.com> To: ashish@symonds.net Cc: freebsd-hackers@freebsd.org Subject: [PATCH] Re: changing the ToS in IP Header Message-ID: <3ED2BAF5.2B6EC508@mindspring.com> References: <1231.203.192.199.30.1053976846.squirrel@secure.symonds.net>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
Ashish Kulkarni wrote:
> as I mentioned earlier, I want to do it for all outgoing packets on an
> interface, not on per socket basis. I actually was hoping that somene
> would provide me pointers to where I should look in the source (me being a
> newcomer to BSD as such) to implement a sysctl that will allow me to
> change the tos, eg. "net.inet.ip.tos". I'd have prefered to use a packet
> mangling firewall, but afaik there are none which do that so I'll have to
> do it the hard way ;-)
The attached patch adds a new sysctl oid for support of a
"net.inet.ip.default_tos" (default: 0).
I sent it as a context diff, in case the kernel has changed
more than a little since the last time I updated.
Note: I only compile-tested this.
-- Terry
[-- Attachment #2 --]
Index: in_pcb.c
===================================================================
RCS file: /cvs/src/sys/netinet/in_pcb.c,v
retrieving revision 1.120
diff -c -r1.120 in_pcb.c
*** in_pcb.c 21 Feb 2003 05:28:27 -0000 1.120
--- in_pcb.c 26 May 2003 20:56:30 -0000
***************
*** 31,37 ****
* SUCH DAMAGE.
*
* @(#)in_pcb.c 8.4 (Berkeley) 5/24/95
! * $FreeBSD: src/sys/netinet/in_pcb.c,v 1.120 2003/02/21 05:28:27 cjc Exp $
*/
#include "opt_ipsec.h"
--- 31,37 ----
* SUCH DAMAGE.
*
* @(#)in_pcb.c 8.4 (Berkeley) 5/24/95
! * $FreeBSD$
*/
#include "opt_ipsec.h"
***************
*** 104,109 ****
--- 104,114 ----
int ipport_reservedhigh = IPPORT_RESERVED - 1; /* 1023 */
int ipport_reservedlow = 0;
+ /*
+ * Default type of service for all IP packets.
+ */
+ int ip_default_tos = 0;
+
#define RANGECHK(var, min, max) \
if ((var) < (min)) { (var) = (min); } \
else if ((var) > (max)) { (var) = (max); }
***************
*** 124,129 ****
--- 129,145 ----
return error;
}
+ static int
+ sysctl_net_iptos_check(SYSCTL_HANDLER_ARGS)
+ {
+ int error = sysctl_handle_int(oidp,
+ oidp->oid_arg1, oidp->oid_arg2, req);
+ if (!error) {
+ RANGECHK(ip_default_tos, 0, 255);
+ }
+ return error;
+ }
+
#undef RANGECHK
SYSCTL_NODE(_net_inet_ip, IPPROTO_IP, portrange, CTLFLAG_RW, 0, "IP Ports");
***************
*** 144,149 ****
--- 160,167 ----
CTLFLAG_RW|CTLFLAG_SECURE, &ipport_reservedhigh, 0, "");
SYSCTL_INT(_net_inet_ip_portrange, OID_AUTO, reservedlow,
CTLFLAG_RW|CTLFLAG_SECURE, &ipport_reservedlow, 0, "");
+ SYSCTL_PROC(_net_inet_ip, OID_AUTO, default_tos, CTLTYPE_INT|CTLFLAG_RW,
+ &ip_default_tos, 0, &sysctl_net_iptos_check, "I", "");
/*
* in_pcb.c: manage the Protocol Control Blocks.
***************
*** 174,179 ****
--- 192,198 ----
inp->inp_gencnt = ++pcbinfo->ipi_gencnt;
inp->inp_pcbinfo = pcbinfo;
inp->inp_socket = so;
+ inp->inp_ip_tos = (u_char)ip_default_tos;
#ifdef IPSEC
error = ipsec_init_policy(so, &inp->inp_sp);
if (error != 0) {
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3ED2BAF5.2B6EC508>
