| version 1.1.1.2, 1998/01/05 09:54:16 |
version 1.1.1.3, 1998/01/05 09:56:02 |
|
|
| * 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.2 (Berkeley) 1/4/94 |
* @(#)raw_ip.c 8.7 (Berkeley) 5/15/95 |
| */ |
*/ |
| |
|
| #include <sys/param.h> |
#include <sys/param.h> |
|
|
| if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != ip->ip_p) |
if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != ip->ip_p) |
| continue; |
continue; |
| if (inp->inp_laddr.s_addr && |
if (inp->inp_laddr.s_addr && |
| inp->inp_laddr.s_addr == ip->ip_dst.s_addr) |
inp->inp_laddr.s_addr != ip->ip_dst.s_addr) |
| continue; |
continue; |
| if (inp->inp_faddr.s_addr && |
if (inp->inp_faddr.s_addr && |
| inp->inp_faddr.s_addr == ip->ip_src.s_addr) |
inp->inp_faddr.s_addr != ip->ip_src.s_addr) |
| continue; |
continue; |
| if (last) { |
if (last) { |
| 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, &ripsrc, |
if (sbappendaddr(&last->so_rcv, |
| n, (struct mbuf *)0) == 0) |
(struct sockaddr *)&ripsrc, n, |
| |
(struct mbuf *)0) == 0) |
| /* should notify about lost packet */ |
/* should notify about lost packet */ |
| m_freem(n); |
m_freem(n); |
| else |
else |
|
|
| last = inp->inp_socket; |
last = inp->inp_socket; |
| } |
} |
| if (last) { |
if (last) { |
| if (sbappendaddr(&last->so_rcv, &ripsrc, |
if (sbappendaddr(&last->so_rcv, (struct sockaddr *)&ripsrc, |
| m, (struct mbuf *)0) == 0) |
m, (struct mbuf *)0) == 0) |
| m_freem(m); |
m_freem(m); |
| else |
else |
| Line 179 rip_ctloutput(op, so, level, optname, m) |
|
| Line 180 rip_ctloutput(op, so, level, optname, m) |
|
| register struct inpcb *inp = sotoinpcb(so); |
register struct inpcb *inp = sotoinpcb(so); |
| register int error; |
register int error; |
| |
|
| if (level != IPPROTO_IP) |
if (level != IPPROTO_IP) { |
| |
if (op == PRCO_SETOPT && *m) |
| |
(void) m_free(*m); |
| return (EINVAL); |
return (EINVAL); |
| |
} |
| |
|
| switch (optname) { |
switch (optname) { |
| |
|
| case IP_HDRINCL: |
case IP_HDRINCL: |
| if (op == PRCO_SETOPT || op == PRCO_GETOPT) { |
error = 0; |
| if (m == 0 || *m == 0 || (*m)->m_len < sizeof (int)) |
if (op == PRCO_SETOPT) { |
| return (EINVAL); |
if (*m == 0 || (*m)->m_len < sizeof (int)) |
| if (op == PRCO_SETOPT) { |
error = EINVAL; |
| if (*mtod(*m, int *)) |
else 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_len = sizeof (int); |
*m = m_get(M_WAIT, MT_SOOPTS); |
| *mtod(*m, int *) = inp->inp_flags & INP_HDRINCL; |
(*m)->m_len = sizeof (int); |
| } |
*mtod(*m, int *) = inp->inp_flags & INP_HDRINCL; |
| return (0); |
|
| } |
} |
| break; |
return (error); |
| |
|
| case DVMRP_INIT: |
case DVMRP_INIT: |
| case DVMRP_DONE: |
case DVMRP_DONE: |
| Line 223 rip_ctloutput(op, so, level, optname, m) |
|
| Line 227 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)); |
| } |
} |