version 1.1.1.3, 1998/01/05 09:56:02 |
version 1.16, 1995/03/02 09:33:40 |
|
|
|
/* $NetBSD$ */ |
|
|
/* |
/* |
* Copyright (c) 1982, 1986, 1988, 1993 |
* Copyright (c) 1982, 1986, 1988, 1993 |
* The Regents of the University of California. All rights reserved. |
* The Regents of the University of California. All rights reserved. |
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* SUCH DAMAGE. |
* |
* |
* @(#)raw_ip.c 8.7 (Berkeley) 5/15/95 |
* @(#)raw_ip.c 8.2 (Berkeley) 1/4/94 |
*/ |
*/ |
|
|
#include <sys/param.h> |
#include <sys/param.h> |
|
|
struct mbuf *n; |
struct mbuf *n; |
if (n = m_copy(m, 0, (int)M_COPYALL)) { |
if (n = m_copy(m, 0, (int)M_COPYALL)) { |
if (sbappendaddr(&last->so_rcv, |
if (sbappendaddr(&last->so_rcv, |
(struct sockaddr *)&ripsrc, n, |
(struct sockaddr *)&ripsrc, |
(struct mbuf *)0) == 0) |
n, (struct mbuf *)0) == 0) |
/* should notify about lost packet */ |
/* should notify about lost packet */ |
m_freem(n); |
m_freem(n); |
else |
else |
Line 181 rip_ctloutput(op, so, level, optname, m) |
|
Line 183 rip_ctloutput(op, so, level, optname, m) |
|
register int error; |
register int error; |
|
|
if (level != IPPROTO_IP) { |
if (level != IPPROTO_IP) { |
if (op == PRCO_SETOPT && *m) |
if (m != 0 && *m != 0) |
(void) m_free(*m); |
(void)m_free(*m); |
return (EINVAL); |
return (EINVAL); |
} |
} |
|
|
switch (optname) { |
switch (optname) { |
|
|
case IP_HDRINCL: |
case IP_HDRINCL: |
error = 0; |
if (op == PRCO_SETOPT || op == PRCO_GETOPT) { |
if (op == PRCO_SETOPT) { |
if (m == 0 || *m == 0 || (*m)->m_len < sizeof (int)) |
if (*m == 0 || (*m)->m_len < sizeof (int)) |
return (EINVAL); |
error = EINVAL; |
if (op == PRCO_SETOPT) { |
else if (*mtod(*m, int *)) |
if (*mtod(*m, int *)) |
inp->inp_flags |= INP_HDRINCL; |
inp->inp_flags |= INP_HDRINCL; |
else |
else |
inp->inp_flags &= ~INP_HDRINCL; |
inp->inp_flags &= ~INP_HDRINCL; |
if (*m) |
|
(void)m_free(*m); |
(void)m_free(*m); |
} else { |
} else { |
*m = m_get(M_WAIT, MT_SOOPTS); |
(*m)->m_len = sizeof (int); |
(*m)->m_len = sizeof (int); |
*mtod(*m, int *) = inp->inp_flags & INP_HDRINCL; |
*mtod(*m, int *) = inp->inp_flags & INP_HDRINCL; |
} |
|
return (0); |
} |
} |
return (error); |
break; |
|
|
case DVMRP_INIT: |
case DVMRP_INIT: |
case DVMRP_DONE: |
case DVMRP_DONE: |
Line 227 rip_ctloutput(op, so, level, optname, m) |
|
Line 229 rip_ctloutput(op, so, level, optname, m) |
|
(void)m_free(*m); |
(void)m_free(*m); |
return (EOPNOTSUPP); |
return (EOPNOTSUPP); |
#endif |
#endif |
|
|
default: |
|
if (optname >= DVMRP_INIT) { |
|
#ifdef MROUTING |
|
if (op == PRCO_SETOPT) { |
|
error = ip_mrouter_cmd(optname, so, *m); |
|
if (*m) |
|
(void)m_free(*m); |
|
} else |
|
error = EINVAL; |
|
return (error); |
|
#else |
|
if (op == PRCO_SETOPT && *m) |
|
(void)m_free(*m); |
|
return (EOPNOTSUPP); |
|
#endif |
|
} |
|
|
|
} |
} |
return (ip_ctloutput(op, so, level, optname, m)); |
return (ip_ctloutput(op, so, level, optname, m)); |
} |
} |