Date: Sat, 26 Oct 2002 14:40:00 -0700 (PDT) From: Bill Fenner <fenner@research.att.com> To: arch@freebsd.org Subject: Re: Renumbering IPPROTO_DIVERT Message-ID: <200210262140.g9QLe08V001356@stash.attlabs.att.com>
next in thread | raw e-mail | index | archive | help
Here's a diff that implements Archie's suggestion, with a sysctl to turn it off in case you have a real consumer of IP protocol 254. The rip_divertcompat code should go away in a couple of releases. "compat" isn't a very good name for it, since it's not compatible. The first new if in rip_attach() is a related bug that I found during this conversion; turns out that raw IP uses the third argument mod 256 as the IP protocol number, instead of returning an error for a protocol number that IP cannot support. Bill Index: in.h =================================================================== RCS file: /home/ncvs/src/sys/netinet/in.h,v retrieving revision 1.72 diff -u -r1.72 in.h --- in.h 21 Oct 2002 20:40:02 -0000 1.72 +++ in.h 26 Oct 2002 21:35:01 -0000 @@ -236,12 +236,15 @@ #define IPPROTO_PIM 103 /* Protocol Independent Mcast */ #define IPPROTO_PGM 113 /* PGM */ /* 255: Reserved */ -/* BSD Private, local use, namespace incursion */ -#define IPPROTO_DIVERT 254 /* divert pseudo-protocol */ +/* BSD Private, local use, namespace incursion, no longer used */ +#define IPPROTO_OLD_DIVERT 254 /* OLD divert pseudo-proto */ #define IPPROTO_MAX 256 /* last return value of *_input(), meaning "all job for this pkt is done". */ #define IPPROTO_DONE 257 + +/* Only used internally, so can be outside the range of valid IP protocols. */ +#define IPPROTO_DIVERT 258 /* divert pseudo-protocol */ /* * Local port number conventions: Index: ip_divert.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip_divert.c,v retrieving revision 1.69 diff -u -r1.69 ip_divert.c --- ip_divert.c 24 Oct 2002 09:58:50 -0000 1.69 +++ ip_divert.c 25 Oct 2002 23:39:04 -0000 @@ -136,8 +136,8 @@ } /* - * IPPROTO_DIVERT is not a real IP protocol; don't allow any packets - * with that protocol number to enter the system from the outside. + * IPPROTO_DIVERT is not in the real IP protocol number space; this + * function should never be called. Just in case, drop any packets. */ void div_input(struct mbuf *m, int off) Index: raw_ip.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/raw_ip.c,v retrieving revision 1.103 diff -u -r1.103 raw_ip.c --- raw_ip.c 20 Oct 2002 22:52:07 -0000 1.103 +++ raw_ip.c 26 Oct 2002 21:32:25 -0000 @@ -493,11 +493,14 @@ u_long rip_sendspace = RIPSNDQ; u_long rip_recvspace = RIPRCVQ; +int rip_divertcompat = 1; SYSCTL_INT(_net_inet_raw, OID_AUTO, maxdgram, CTLFLAG_RW, &rip_sendspace, 0, "Maximum outgoing raw IP datagram size"); SYSCTL_INT(_net_inet_raw, OID_AUTO, recvspace, CTLFLAG_RW, &rip_recvspace, 0, "Maximum incoming raw IP datagram size"); +SYSCTL_INT(_net_inet_raw, OID_AUTO, divertcompat, CTLFLAG_RW, + &rip_divertcompat, 0, "Return an error when creating an 'old' DIVERT socket"); static int rip_attach(struct socket *so, int proto, struct thread *td) @@ -510,6 +513,12 @@ panic("rip_attach"); if (td && (error = suser(td)) != 0) return error; + + if (proto >= IPPROTO_MAX || proto < 0) + return EPROTONOSUPPORT; + + if (rip_divertcompat && proto == IPPROTO_OLD_DIVERT) + return EPROTONOSUPPORT; error = soreserve(so, rip_sendspace, rip_recvspace); if (error) To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200210262140.g9QLe08V001356>