Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/netinet/raw_ip.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/netinet/raw_ip.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.71 retrieving revision 1.88.10.1 diff -u -p -r1.71 -r1.88.10.1 --- src/sys/netinet/raw_ip.c 2003/08/07 16:33:14 1.71 +++ src/sys/netinet/raw_ip.c 2006/03/08 01:19:40 1.88.10.1 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip.c,v 1.71 2003/08/07 16:33:14 agc Exp $ */ +/* $NetBSD: raw_ip.c,v 1.88.10.1 2006/03/08 01:19:40 elad Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,12 +61,14 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.71 2003/08/07 16:33:14 agc Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.88.10.1 2006/03/08 01:19:40 elad Exp $"); +#include "opt_inet.h" #include "opt_ipsec.h" #include "opt_mrouting.h" #include +#include #include #include #include @@ -86,6 +88,7 @@ __KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1 #include #include #include +#include #include #include @@ -94,13 +97,18 @@ __KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1 #include #endif /*IPSEC*/ +#ifdef FAST_IPSEC +#include +#include /* XXX ipsecstat namespace */ +#endif /* FAST_IPSEC*/ + struct inpcbtable rawcbtable; -int rip_pcbnotify __P((struct inpcbtable *, struct in_addr, - struct in_addr, int, int, void (*) __P((struct inpcb *, int)))); -int rip_bind __P((struct inpcb *, struct mbuf *)); -int rip_connect __P((struct inpcb *, struct mbuf *)); -void rip_disconnect __P((struct inpcb *)); +int rip_pcbnotify(struct inpcbtable *, struct in_addr, + struct in_addr, int, int, void (*)(struct inpcb *, int)); +int rip_bind(struct inpcb *, struct mbuf *); +int rip_connect(struct inpcb *, struct mbuf *); +void rip_disconnect(struct inpcb *); /* * Nominal space allocated to a raw ip socket. @@ -116,7 +124,7 @@ void rip_disconnect __P((struct inpcb * * Initialize raw connection block q. */ void -rip_init() +rip_init(void) { in_pcbinit(&rawcbtable, 1, 1); @@ -128,16 +136,11 @@ rip_init() * mbuf chain. */ void -#if __STDC__ rip_input(struct mbuf *m, ...) -#else -rip_input(m, va_alist) - struct mbuf *m; - va_dcl -#endif { int proto; struct ip *ip = mtod(m, struct ip *); + struct inpcb_hdr *inph; struct inpcb *inp; struct inpcb *last = 0; struct mbuf *opts = 0; @@ -163,7 +166,10 @@ rip_input(m, va_alist) ip->ip_len = ntohs(ip->ip_len) - (ip->ip_hl << 2); NTOHS(ip->ip_off); - CIRCLEQ_FOREACH(inp, &rawcbtable.inpt_queue, inp_queue) { + CIRCLEQ_FOREACH(inph, &rawcbtable.inpt_queue, inph_queue) { + inp = (struct inpcb *)inph; + if (inp->inp_af != AF_INET) + continue; if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != proto) continue; if (!in_nullhost(inp->inp_laddr) && @@ -175,7 +181,7 @@ rip_input(m, va_alist) if (last) { struct mbuf *n; -#ifdef IPSEC +#if defined(IPSEC) || defined(FAST_IPSEC) /* check AH/ESP integrity. */ if (ipsec4_in_reject_so(m, last->inp_socket)) { ipsecstat.in_polvio++; @@ -199,7 +205,7 @@ rip_input(m, va_alist) } last = inp; } -#ifdef IPSEC +#if defined(IPSEC) || defined(FAST_IPSEC) /* check AH/ESP integrity. */ if (last && ipsec4_in_reject_so(m, last->inp_socket)) { m_freem(m); @@ -232,21 +238,20 @@ rip_input(m, va_alist) } int -rip_pcbnotify(table, faddr, laddr, proto, errno, notify) - struct inpcbtable *table; - struct in_addr faddr, laddr; - int proto; - int errno; - void (*notify) __P((struct inpcb *, int)); +rip_pcbnotify(struct inpcbtable *table, + struct in_addr faddr, struct in_addr laddr, int proto, int errno, + void (*notify)(struct inpcb *, int)) { struct inpcb *inp, *ninp; int nmatch; nmatch = 0; - for (inp = CIRCLEQ_FIRST(&table->inpt_queue); + for (inp = (struct inpcb *)CIRCLEQ_FIRST(&table->inpt_queue); inp != (struct inpcb *)&table->inpt_queue; inp = ninp) { - ninp = inp->inp_queue.cqe_next; + ninp = (struct inpcb *)inp->inp_queue.cqe_next; + if (inp->inp_af != AF_INET) + continue; if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != proto) continue; if (in_hosteq(inp->inp_faddr, faddr) && @@ -260,13 +265,10 @@ rip_pcbnotify(table, faddr, laddr, proto } void * -rip_ctlinput(cmd, sa, v) - int cmd; - struct sockaddr *sa; - void *v; +rip_ctlinput(int cmd, struct sockaddr *sa, void *v) { struct ip *ip = v; - void (*notify) __P((struct inpcb *, int)) = in_rtchange; + void (*notify)(struct inpcb *, int) = in_rtchange; int errno; if (sa->sa_family != AF_INET || @@ -297,13 +299,7 @@ rip_ctlinput(cmd, sa, v) * Tack on options user may have setup with control call. */ int -#if __STDC__ rip_output(struct mbuf *m, ...) -#else -rip_output(m, va_alist) - struct mbuf *m; - va_dcl -#endif { struct inpcb *inp; struct ip *ip; @@ -369,31 +365,22 @@ rip_output(m, va_alist) HTONS(ip->ip_len); HTONS(ip->ip_off); if (ip->ip_id == 0) - ip->ip_id = htons(ip_id++); + ip->ip_id = ip_newid(); opts = NULL; /* XXX prevent ip_output from overwriting header fields */ flags |= IP_RAWOUTPUT; ipstat.ips_rawout++; } -#ifdef IPSEC - if (ipsec_setsocket(m, inp->inp_socket) != 0) { - m_freem(m); - return ENOBUFS; - } -#endif /*IPSEC*/ return (ip_output(m, opts, &inp->inp_route, flags, inp->inp_moptions, - &inp->inp_errormtu)); + inp->inp_socket, &inp->inp_errormtu)); } /* * Raw IP socket option processing. */ int -rip_ctloutput(op, so, level, optname, m) - int op; - struct socket *so; - int level, optname; - struct mbuf **m; +rip_ctloutput(int op, struct socket *so, int level, int optname, + struct mbuf **m) { struct inpcb *inp = sotoinpcb(so); int error = 0; @@ -427,6 +414,9 @@ rip_ctloutput(op, so, level, optname, m) case MRT_ADD_MFC: case MRT_DEL_MFC: case MRT_ASSERT: + case MRT_API_CONFIG: + case MRT_ADD_BW_UPCALL: + case MRT_DEL_BW_UPCALL: error = ip_mrouter_set(so, optname, m); break; #endif @@ -449,6 +439,8 @@ rip_ctloutput(op, so, level, optname, m) #ifdef MROUTING case MRT_VERSION: case MRT_ASSERT: + case MRT_API_SUPPORT: + case MRT_API_CONFIG: error = ip_mrouter_get(so, optname, m); break; #endif @@ -463,9 +455,7 @@ rip_ctloutput(op, so, level, optname, m) } int -rip_bind(inp, nam) - struct inpcb *inp; - struct mbuf *nam; +rip_bind(struct inpcb *inp, struct mbuf *nam) { struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *); @@ -484,9 +474,7 @@ rip_bind(inp, nam) } int -rip_connect(inp, nam) - struct inpcb *inp; - struct mbuf *nam; +rip_connect(struct inpcb *inp, struct mbuf *nam) { struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *); @@ -502,8 +490,7 @@ rip_connect(inp, nam) } void -rip_disconnect(inp) - struct inpcb *inp; +rip_disconnect(struct inpcb *inp) { inp->inp_faddr = zeroin_addr; @@ -514,19 +501,18 @@ u_long rip_recvspace = RIPRCVQ; /*ARGSUSED*/ int -rip_usrreq(so, req, m, nam, control, p) - struct socket *so; - int req; - struct mbuf *m, *nam, *control; - struct proc *p; +rip_usrreq(struct socket *so, int req, + struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { struct inpcb *inp; + struct proc *p; int s; int error = 0; #ifdef MROUTING extern struct socket *ip_mrouter; #endif + p = l ? l->l_proc : NULL; if (req == PRU_CONTROL) return (in_control(so, (long)m, (caddr_t)nam, (struct ifnet *)control, p)); @@ -556,7 +542,8 @@ rip_usrreq(so, req, m, nam, control, p) error = EISCONN; break; } - if (p == 0 || (error = suser(p->p_ucred, &p->p_acflag))) { + if (p == 0 || (error = generic_authorize(p->p_cred, + KAUTH_GENERIC_ISSUSER, &p->p_acflag))) { error = EACCES; break; } @@ -683,3 +670,32 @@ release: splx(s); return (error); } + +SYSCTL_SETUP(sysctl_net_inet_raw_setup, "sysctl net.inet.raw subtree setup") +{ + + sysctl_createv(clog, 0, NULL, NULL, + CTLFLAG_PERMANENT, + CTLTYPE_NODE, "net", NULL, + NULL, 0, NULL, 0, + CTL_NET, CTL_EOL); + sysctl_createv(clog, 0, NULL, NULL, + CTLFLAG_PERMANENT, + CTLTYPE_NODE, "inet", NULL, + NULL, 0, NULL, 0, + CTL_NET, PF_INET, CTL_EOL); + sysctl_createv(clog, 0, NULL, NULL, + CTLFLAG_PERMANENT, + CTLTYPE_NODE, "raw", + SYSCTL_DESCR("Raw IPv4 settings"), + NULL, 0, NULL, 0, + CTL_NET, PF_INET, IPPROTO_RAW, CTL_EOL); + + sysctl_createv(clog, 0, NULL, NULL, + CTLFLAG_PERMANENT, + CTLTYPE_STRUCT, "pcblist", + SYSCTL_DESCR("Raw IPv4 control block list"), + sysctl_inpcblist, 0, &rawcbtable, 0, + CTL_NET, PF_INET, IPPROTO_RAW, + CTL_CREATE, CTL_EOL); +}