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 retrieving revision 1.70.2.7 retrieving revision 1.71 diff -u -p -r1.70.2.7 -r1.71 --- src/sys/netinet/raw_ip.c 2005/11/10 14:11:07 1.70.2.7 +++ src/sys/netinet/raw_ip.c 2003/08/07 16:33:14 1.71 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip.c,v 1.70.2.7 2005/11/10 14:11:07 skrll Exp $ */ +/* $NetBSD: raw_ip.c,v 1.71 2003/08/07 16:33:14 agc Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,14 +61,12 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.70.2.7 2005/11/10 14:11:07 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.71 2003/08/07 16:33:14 agc Exp $"); -#include "opt_inet.h" #include "opt_ipsec.h" #include "opt_mrouting.h" #include -#include #include #include #include @@ -88,7 +86,6 @@ __KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1 #include #include #include -#include #include #include @@ -97,18 +94,13 @@ __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(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 *); +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 *)); /* * Nominal space allocated to a raw ip socket. @@ -124,7 +116,7 @@ void rip_disconnect(struct inpcb *); * Initialize raw connection block q. */ void -rip_init(void) +rip_init() { in_pcbinit(&rawcbtable, 1, 1); @@ -136,11 +128,16 @@ rip_init(void) * 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; @@ -166,10 +163,7 @@ rip_input(struct mbuf *m, ...) ip->ip_len = ntohs(ip->ip_len) - (ip->ip_hl << 2); NTOHS(ip->ip_off); - CIRCLEQ_FOREACH(inph, &rawcbtable.inpt_queue, inph_queue) { - inp = (struct inpcb *)inph; - if (inp->inp_af != AF_INET) - continue; + CIRCLEQ_FOREACH(inp, &rawcbtable.inpt_queue, inp_queue) { if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != proto) continue; if (!in_nullhost(inp->inp_laddr) && @@ -181,7 +175,7 @@ rip_input(struct mbuf *m, ...) if (last) { struct mbuf *n; -#if defined(IPSEC) || defined(FAST_IPSEC) +#ifdef IPSEC /* check AH/ESP integrity. */ if (ipsec4_in_reject_so(m, last->inp_socket)) { ipsecstat.in_polvio++; @@ -205,7 +199,7 @@ rip_input(struct mbuf *m, ...) } last = inp; } -#if defined(IPSEC) || defined(FAST_IPSEC) +#ifdef IPSEC /* check AH/ESP integrity. */ if (last && ipsec4_in_reject_so(m, last->inp_socket)) { m_freem(m); @@ -238,20 +232,21 @@ rip_input(struct mbuf *m, ...) } int -rip_pcbnotify(struct inpcbtable *table, - struct in_addr faddr, struct in_addr laddr, int proto, int errno, - void (*notify)(struct inpcb *, 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)); { struct inpcb *inp, *ninp; int nmatch; nmatch = 0; - for (inp = (struct inpcb *)CIRCLEQ_FIRST(&table->inpt_queue); + for (inp = CIRCLEQ_FIRST(&table->inpt_queue); inp != (struct inpcb *)&table->inpt_queue; inp = ninp) { - ninp = (struct inpcb *)inp->inp_queue.cqe_next; - if (inp->inp_af != AF_INET) - continue; + ninp = inp->inp_queue.cqe_next; if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != proto) continue; if (in_hosteq(inp->inp_faddr, faddr) && @@ -265,10 +260,13 @@ rip_pcbnotify(struct inpcbtable *table, } void * -rip_ctlinput(int cmd, struct sockaddr *sa, void *v) +rip_ctlinput(cmd, sa, v) + int cmd; + struct sockaddr *sa; + void *v; { struct ip *ip = v; - void (*notify)(struct inpcb *, int) = in_rtchange; + void (*notify) __P((struct inpcb *, int)) = in_rtchange; int errno; if (sa->sa_family != AF_INET || @@ -299,7 +297,13 @@ rip_ctlinput(int cmd, struct sockaddr *s * 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; @@ -365,22 +369,31 @@ rip_output(struct mbuf *m, ...) HTONS(ip->ip_len); HTONS(ip->ip_off); if (ip->ip_id == 0) - ip->ip_id = ip_newid(); + ip->ip_id = htons(ip_id++); 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_socket, &inp->inp_errormtu)); + &inp->inp_errormtu)); } /* * Raw IP socket option processing. */ int -rip_ctloutput(int op, struct socket *so, int level, int optname, - struct mbuf **m) +rip_ctloutput(op, so, level, optname, m) + int op; + struct socket *so; + int level, optname; + struct mbuf **m; { struct inpcb *inp = sotoinpcb(so); int error = 0; @@ -414,9 +427,6 @@ rip_ctloutput(int op, struct socket *so, 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 @@ -439,8 +449,6 @@ rip_ctloutput(int op, struct socket *so, #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 @@ -455,7 +463,9 @@ rip_ctloutput(int op, struct socket *so, } int -rip_bind(struct inpcb *inp, struct mbuf *nam) +rip_bind(inp, nam) + struct inpcb *inp; + struct mbuf *nam; { struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *); @@ -474,7 +484,9 @@ rip_bind(struct inpcb *inp, struct mbuf } int -rip_connect(struct inpcb *inp, struct mbuf *nam) +rip_connect(inp, nam) + struct inpcb *inp; + struct mbuf *nam; { struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *); @@ -490,7 +502,8 @@ rip_connect(struct inpcb *inp, struct mb } void -rip_disconnect(struct inpcb *inp) +rip_disconnect(inp) + struct inpcb *inp; { inp->inp_faddr = zeroin_addr; @@ -501,18 +514,19 @@ u_long rip_recvspace = RIPRCVQ; /*ARGSUSED*/ int -rip_usrreq(struct socket *so, int req, - struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) +rip_usrreq(so, req, m, nam, control, p) + struct socket *so; + int req; + struct mbuf *m, *nam, *control; + struct proc *p; { 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)); @@ -669,32 +683,3 @@ 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); -}