| version 1.87, 2005/04/29 10:39:09 |
version 1.87.2.3, 2007/02/26 09:11:45 |
| Line 77 __KERNEL_RCSID(0, "$NetBSD$"); |
|
| Line 77 __KERNEL_RCSID(0, "$NetBSD$"); |
|
| #include <sys/errno.h> |
#include <sys/errno.h> |
| #include <sys/systm.h> |
#include <sys/systm.h> |
| #include <sys/proc.h> |
#include <sys/proc.h> |
| |
#include <sys/kauth.h> |
| |
|
| #include <net/if.h> |
#include <net/if.h> |
| #include <net/route.h> |
#include <net/route.h> |
| Line 265 rip_pcbnotify(struct inpcbtable *table, |
|
| Line 266 rip_pcbnotify(struct inpcbtable *table, |
|
| } |
} |
| |
|
| void * |
void * |
| rip_ctlinput(int cmd, struct sockaddr *sa, void *v) |
rip_ctlinput(int cmd, const struct sockaddr *sa, void *v) |
| { |
{ |
| struct ip *ip = v; |
struct ip *ip = v; |
| void (*notify)(struct inpcb *, int) = in_rtchange; |
void (*notify)(struct inpcb *, int) = in_rtchange; |
| Line 284 rip_ctlinput(int cmd, struct sockaddr *s |
|
| Line 285 rip_ctlinput(int cmd, struct sockaddr *s |
|
| else if (errno == 0) |
else if (errno == 0) |
| return NULL; |
return NULL; |
| if (ip) { |
if (ip) { |
| rip_pcbnotify(&rawcbtable, satosin(sa)->sin_addr, |
rip_pcbnotify(&rawcbtable, satocsin(sa)->sin_addr, |
| ip->ip_src, ip->ip_p, errno, notify); |
ip->ip_src, ip->ip_p, errno, notify); |
| |
|
| /* XXX mapped address case */ |
/* XXX mapped address case */ |
| } else |
} else |
| in_pcbnotifyall(&rawcbtable, satosin(sa)->sin_addr, errno, |
in_pcbnotifyall(&rawcbtable, satocsin(sa)->sin_addr, errno, |
| notify); |
notify); |
| return NULL; |
return NULL; |
| } |
} |
| Line 502 u_long rip_recvspace = RIPRCVQ; |
|
| Line 503 u_long rip_recvspace = RIPRCVQ; |
|
| /*ARGSUSED*/ |
/*ARGSUSED*/ |
| int |
int |
| rip_usrreq(struct socket *so, int req, |
rip_usrreq(struct socket *so, int req, |
| struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct proc *p) |
struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) |
| { |
{ |
| struct inpcb *inp; |
struct inpcb *inp; |
| int s; |
int s; |
| Line 513 rip_usrreq(struct socket *so, int req, |
|
| Line 514 rip_usrreq(struct socket *so, int req, |
|
| |
|
| if (req == PRU_CONTROL) |
if (req == PRU_CONTROL) |
| return (in_control(so, (long)m, (caddr_t)nam, |
return (in_control(so, (long)m, (caddr_t)nam, |
| (struct ifnet *)control, p)); |
(struct ifnet *)control, l)); |
| |
|
| |
s = splsoftnet(); |
| |
|
| if (req == PRU_PURGEIF) { |
if (req == PRU_PURGEIF) { |
| in_pcbpurgeif0(&rawcbtable, (struct ifnet *)control); |
in_pcbpurgeif0(&rawcbtable, (struct ifnet *)control); |
| in_purgeif((struct ifnet *)control); |
in_purgeif((struct ifnet *)control); |
| in_pcbpurgeif(&rawcbtable, (struct ifnet *)control); |
in_pcbpurgeif(&rawcbtable, (struct ifnet *)control); |
| |
splx(s); |
| return (0); |
return (0); |
| } |
} |
| |
|
| s = splsoftnet(); |
|
| inp = sotoinpcb(so); |
inp = sotoinpcb(so); |
| #ifdef DIAGNOSTIC |
#ifdef DIAGNOSTIC |
| if (req != PRU_SEND && req != PRU_SENDOOB && control) |
if (req != PRU_SEND && req != PRU_SENDOOB && control) |
| Line 540 rip_usrreq(struct socket *so, int req, |
|
| Line 543 rip_usrreq(struct socket *so, int req, |
|
| error = EISCONN; |
error = EISCONN; |
| break; |
break; |
| } |
} |
| if (p == 0 || (error = suser(p->p_ucred, &p->p_acflag))) { |
|
| |
if (l == NULL) { |
| error = EACCES; |
error = EACCES; |
| break; |
break; |
| } |
} |
| |
|
| |
/* XXX: raw socket permissions are checked in socreate() */ |
| |
|
| if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) { |
if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) { |
| error = soreserve(so, rip_sendspace, rip_recvspace); |
error = soreserve(so, rip_sendspace, rip_recvspace); |
| if (error) |
if (error) |