summaryrefslogtreecommitdiffstats
path: root/sys/netinet/raw_ip.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netinet/raw_ip.c')
-rw-r--r--sys/netinet/raw_ip.c64
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));
}
OpenPOWER on IntegriCloud