diff options
Diffstat (limited to 'sys/netinet/raw_ip.c')
-rw-r--r-- | sys/netinet/raw_ip.c | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index c8092ee..ad621f0 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)raw_ip.c 8.2 (Berkeley) 1/4/94 + * @(#)raw_ip.c 8.7 (Berkeley) 5/15/95 */ #include <sys/param.h> @@ -93,16 +93,17 @@ rip_input(m) if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != ip->ip_p) continue; 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; 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; if (last) { struct mbuf *n; if (n = m_copy(m, 0, (int)M_COPYALL)) { - if (sbappendaddr(&last->so_rcv, &ripsrc, - n, (struct mbuf *)0) == 0) + if (sbappendaddr(&last->so_rcv, + (struct sockaddr *)&ripsrc, n, + (struct mbuf *)0) == 0) /* should notify about lost packet */ m_freem(n); else @@ -112,7 +113,7 @@ rip_input(m) last = inp->inp_socket; } if (last) { - if (sbappendaddr(&last->so_rcv, &ripsrc, + if (sbappendaddr(&last->so_rcv, (struct sockaddr *)&ripsrc, m, (struct mbuf *)0) == 0) m_freem(m); else @@ -179,28 +180,31 @@ rip_ctloutput(op, so, level, optname, m) register struct inpcb *inp = sotoinpcb(so); register int error; - if (level != IPPROTO_IP) + if (level != IPPROTO_IP) { + if (op == PRCO_SETOPT && *m) + (void) m_free(*m); return (EINVAL); + } switch (optname) { case IP_HDRINCL: - if (op == PRCO_SETOPT || op == PRCO_GETOPT) { - if (m == 0 || *m == 0 || (*m)->m_len < sizeof (int)) - return (EINVAL); - if (op == PRCO_SETOPT) { - if (*mtod(*m, int *)) - inp->inp_flags |= INP_HDRINCL; - else - inp->inp_flags &= ~INP_HDRINCL; + error = 0; + if (op == PRCO_SETOPT) { + if (*m == 0 || (*m)->m_len < sizeof (int)) + error = EINVAL; + else if (*mtod(*m, int *)) + inp->inp_flags |= INP_HDRINCL; + else + inp->inp_flags &= ~INP_HDRINCL; + if (*m) (void)m_free(*m); - } else { - (*m)->m_len = sizeof (int); - *mtod(*m, int *) = inp->inp_flags & INP_HDRINCL; - } - return (0); + } else { + *m = m_get(M_WAIT, MT_SOOPTS); + (*m)->m_len = sizeof (int); + *mtod(*m, int *) = inp->inp_flags & INP_HDRINCL; } - break; + return (error); case DVMRP_INIT: case DVMRP_DONE: @@ -223,6 +227,24 @@ rip_ctloutput(op, so, level, optname, m) (void)m_free(*m); return (EOPNOTSUPP); #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)); } |