manual page distributed with 4.2BSD
[unix-history] / usr / src / sys / netinet / udp_usrreq.c
index 1ce507c..41c80df 100644 (file)
@@ -1,4 +1,4 @@
-/*     udp_usrreq.c    6.7     84/08/29        */
+/*     udp_usrreq.c    6.11    85/04/29        */
 
 #include "param.h"
 #include "dir.h"
 
 #include "param.h"
 #include "dir.h"
@@ -204,7 +204,7 @@ udp_output(inp, m0)
        so = inp->inp_socket;
        if (so->so_options & SO_DONTROUTE)
                return (ip_output(m, (struct mbuf *)0, (struct route *)0,
        so = inp->inp_socket;
        if (so->so_options & SO_DONTROUTE)
                return (ip_output(m, (struct mbuf *)0, (struct route *)0,
-                   (so->so_state & SS_PRIV) | IP_ROUTETOIF));
+                   (so->so_options & SO_BROADCAST) | IP_ROUTETOIF));
        /*
         * Use cached route for previous datagram if
         * this is also to the same destination. 
        /*
         * Use cached route for previous datagram if
         * this is also to the same destination. 
@@ -219,9 +219,13 @@ udp_output(inp, m0)
                RTFREE(ro->ro_rt);
                ro->ro_rt = (struct rtentry *)0;
        }
                RTFREE(ro->ro_rt);
                ro->ro_rt = (struct rtentry *)0;
        }
-       return (ip_output(m, (struct mbuf *)0, ro, so->so_state & SS_PRIV));
+       return (ip_output(m, (struct mbuf *)0, ro, 
+           so->so_options & SO_BROADCAST));
 }
 
 }
 
+int    udp_sendspace = 2048;           /* really max datagram size */
+int    udp_recvspace = 4 * (1024+sizeof(struct sockaddr_in)); /* 4 1K dgrams */
+
 /*ARGSUSED*/
 udp_usrreq(so, req, m, nam, rights)
        struct socket *so;
 /*ARGSUSED*/
 udp_usrreq(so, req, m, nam, rights)
        struct socket *so;
@@ -231,6 +235,9 @@ udp_usrreq(so, req, m, nam, rights)
        struct inpcb *inp = sotoinpcb(so);
        int error = 0;
 
        struct inpcb *inp = sotoinpcb(so);
        int error = 0;
 
+       if (req == PRU_CONTROL)
+               return (in_control(so, (int)m, (caddr_t)nam,
+                       (struct ifnet *)rights));
        if (rights && rights->m_len) {
                error = EINVAL;
                goto release;
        if (rights && rights->m_len) {
                error = EINVAL;
                goto release;
@@ -249,7 +256,7 @@ udp_usrreq(so, req, m, nam, rights)
                error = in_pcballoc(so, &udb);
                if (error)
                        break;
                error = in_pcballoc(so, &udb);
                if (error)
                        break;
-               error = soreserve(so, 2048, 2048);
+               error = soreserve(so, udp_sendspace, udp_recvspace);
                if (error)
                        break;
                break;
                if (error)
                        break;
                break;
@@ -330,8 +337,8 @@ udp_usrreq(so, req, m, nam, rights)
                m = NULL;
                if (nam) {
                        in_pcbdisconnect(inp);
                m = NULL;
                if (nam) {
                        in_pcbdisconnect(inp);
-                       splx(s);
                        inp->inp_laddr = laddr;
                        inp->inp_laddr = laddr;
+                       splx(s);
                }
                }
                break;
                }
                }
                break;
@@ -364,7 +371,6 @@ udp_usrreq(so, req, m, nam, rights)
                error =  EOPNOTSUPP;
                break;
 
                error =  EOPNOTSUPP;
                break;
 
-       case PRU_CONTROL:
        case PRU_RCVD:
        case PRU_RCVOOB:
                return (EOPNOTSUPP);    /* do not free mbuf's */
        case PRU_RCVD:
        case PRU_RCVOOB:
                return (EOPNOTSUPP);    /* do not free mbuf's */