keep USETRAILERS from SIOCSARP
[unix-history] / usr / src / sys / netinet / raw_ip.c
index 6bd48be..cdf00d3 100644 (file)
@@ -1,4 +1,10 @@
-/*     raw_ip.c        6.5     85/06/02        */
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ *     @(#)raw_ip.c    7.2 (Berkeley) %G%
+ */
 
 #include "param.h"
 #include "mbuf.h"
 
 #include "param.h"
 #include "mbuf.h"
@@ -88,9 +94,59 @@ rip_output(m0, so)
                ip->ip_src.s_addr = 0;
        ip->ip_dst = ((struct sockaddr_in *)&rp->rcb_faddr)->sin_addr;
        ip->ip_ttl = MAXTTL;
                ip->ip_src.s_addr = 0;
        ip->ip_dst = ((struct sockaddr_in *)&rp->rcb_faddr)->sin_addr;
        ip->ip_ttl = MAXTTL;
-       return (ip_output(m, (struct mbuf *)0, &rp->rcb_route, 
-          IP_ROUTETOIF|IP_ALLOWBROADCAST));
+       return (ip_output(m, rp->rcb_options, &rp->rcb_route, 
+          (so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST));
 bad:
        m_freem(m);
        return (error);
 }
 bad:
        m_freem(m);
        return (error);
 }
+
+/*
+ * Raw IP socket option processing.
+ */
+rip_ctloutput(op, so, level, optname, m)
+       int op;
+       struct socket *so;
+       int level, optname;
+       struct mbuf **m;
+{
+       int error = 0;
+       register struct rawcb *rp = sotorawcb(so);
+
+       if (level != IPPROTO_IP)
+               error = EINVAL;
+       else switch (op) {
+
+       case PRCO_SETOPT:
+               switch (optname) {
+               case IP_OPTIONS:
+                       return (ip_pcbopts(&rp->rcb_options, *m));
+
+               default:
+                       error = EINVAL;
+                       break;
+               }
+               break;
+
+       case PRCO_GETOPT:
+               switch (optname) {
+               case IP_OPTIONS:
+                       *m = m_get(M_WAIT, MT_SOOPTS);
+                       if (rp->rcb_options) {
+                               (*m)->m_off = rp->rcb_options->m_off;
+                               (*m)->m_len = rp->rcb_options->m_len;
+                               bcopy(mtod(rp->rcb_options, caddr_t),
+                                   mtod(*m, caddr_t), (unsigned)(*m)->m_len);
+                       } else
+                               (*m)->m_len = 0;
+                       break;
+               default:
+                       error = EINVAL;
+                       break;
+               }
+               break;
+       }
+       if (op == PRCO_SETOPT && *m)
+               (void)m_free(*m);
+       return (error);
+}