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.82 retrieving revision 1.88.10.3 diff -u -p -r1.82 -r1.88.10.3 --- src/sys/netinet/raw_ip.c 2005/02/02 21:41:55 1.82 +++ src/sys/netinet/raw_ip.c 2006/05/06 23:32:11 1.88.10.3 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip.c,v 1.82 2005/02/02 21:41:55 perry Exp $ */ +/* $NetBSD: raw_ip.c,v 1.88.10.3 2006/05/06 23:32:11 christos Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,13 +61,14 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.82 2005/02/02 21:41:55 perry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.88.10.3 2006/05/06 23:32:11 christos Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" #include "opt_mrouting.h" #include +#include #include #include #include @@ -76,6 +77,7 @@ __KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1 #include #include #include +#include #include #include @@ -87,6 +89,7 @@ __KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1 #include #include #include +#include #include #include @@ -122,7 +125,7 @@ void rip_disconnect(struct inpcb *); * Initialize raw connection block q. */ void -rip_init() +rip_init(void) { in_pcbinit(&rawcbtable, 1, 1); @@ -236,12 +239,9 @@ rip_input(struct mbuf *m, ...) } int -rip_pcbnotify(table, faddr, laddr, proto, errno, notify) - struct inpcbtable *table; - struct in_addr faddr, laddr; - int proto; - int errno; - void (*notify)(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; @@ -266,10 +266,7 @@ 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)(struct inpcb *, int) = in_rtchange; @@ -383,11 +380,8 @@ rip_output(struct mbuf *m, ...) * 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; @@ -462,9 +456,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 *); @@ -483,9 +475,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 *); @@ -501,8 +491,7 @@ rip_connect(inp, nam) } void -rip_disconnect(inp) - struct inpcb *inp; +rip_disconnect(struct inpcb *inp) { inp->inp_faddr = zeroin_addr; @@ -513,19 +502,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)); @@ -555,7 +543,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 = kauth_authorize_generic(p->p_cred, + KAUTH_GENERIC_ISSUSER, &p->p_acflag))) { error = EACCES; break; } @@ -682,3 +671,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); +}