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.55.2.5 retrieving revision 1.70.2.1 diff -u -p -r1.55.2.5 -r1.70.2.1 --- src/sys/netinet/raw_ip.c 2002/08/27 23:48:03 1.55.2.5 +++ src/sys/netinet/raw_ip.c 2003/07/02 15:27:00 1.70.2.1 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip.c,v 1.55.2.5 2002/08/27 23:48:03 nathanw Exp $ */ +/* $NetBSD: raw_ip.c,v 1.70.2.1 2003/07/02 15:27:00 darrenr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -65,7 +65,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.55.2.5 2002/08/27 23:48:03 nathanw Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.70.2.1 2003/07/02 15:27:00 darrenr Exp $"); #include "opt_ipsec.h" #include "opt_mrouting.h" @@ -126,8 +126,6 @@ rip_init() in_pcbinit(&rawcbtable, 1, 1); } -static struct sockaddr_in ripsrc = { sizeof(ripsrc), AF_INET }; - /* * Setup generic address and protocol structures * for raw_input routine, then pass them along with @@ -142,7 +140,7 @@ rip_input(m, va_alist) va_dcl #endif { - int off, proto; + int proto; struct ip *ip = mtod(m, struct ip *); struct inpcb *inp; struct inpcb *last = 0; @@ -151,7 +149,7 @@ rip_input(m, va_alist) va_list ap; va_start(ap, m); - off = va_arg(ap, int); + (void)va_arg(ap, int); /* ignore value, advance ap */ proto = va_arg(ap, int); va_end(ap); @@ -334,7 +332,9 @@ rip_output(m, va_alist) m_freem(m); return (EMSGSIZE); } - M_PREPEND(m, sizeof(struct ip), M_WAIT); + M_PREPEND(m, sizeof(struct ip), M_DONTWAIT); + if (!m) + return (ENOBUFS); ip = mtod(m, struct ip *); ip->ip_tos = 0; ip->ip_off = htons(0); @@ -350,6 +350,21 @@ rip_output(m, va_alist) return (EMSGSIZE); } ip = mtod(m, struct ip *); + + /* + * If the mbuf is read-only, we need to allocate + * a new mbuf for the header, since we need to + * modify the header. + */ + if (M_READONLY(m)) { + int hlen = ip->ip_hl << 2; + + m = m_copyup(m, hlen, (max_linkhdr + 3) & ~3); + if (m == NULL) + return (ENOMEM); /* XXX */ + ip = mtod(m, struct ip *); + } + /* XXX userland passes ip_len and ip_off in host order */ if (m->m_pkthdr.len != ip->ip_len) { m_freem(m); @@ -429,7 +444,8 @@ rip_ctloutput(op, so, level, optname, m) case PRCO_GETOPT: switch (optname) { case IP_HDRINCL: - *m = m_get(M_WAIT, M_SOOPTS); + *m = m_get(M_WAIT, MT_SOOPTS); + MCLAIM((*m), so->so_mowner); (*m)->m_len = sizeof (int); *mtod(*m, int *) = inp->inp_flags & INP_HDRINCL ? 1 : 0; break; @@ -502,19 +518,21 @@ u_long rip_recvspace = RIPRCVQ; /*ARGSUSED*/ int -rip_usrreq(so, req, m, nam, control, p) +rip_usrreq(so, req, m, nam, control, l) struct socket *so; int req; struct mbuf *m, *nam, *control; - struct proc *p; + 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));