udp: Prepare for the asynchronized pru_send 2
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 3 Dec 2011 14:07:10 +0000 (22:07 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 4 Dec 2011 11:24:55 +0000 (19:24 +0800)
Save the MSG_DONTROUTE in the netmsg instead of messing w/ socket.so_options

sys/kern/uipc_socket.c
sys/net/netmsg.h
sys/netinet/udp_usrreq.c

index ca057c0..9e909fc 100644 (file)
@@ -891,9 +891,8 @@ int
 sosendudp(struct socket *so, struct sockaddr *addr, struct uio *uio,
          struct mbuf *top, struct mbuf *control, int flags, struct thread *td)
 {
-       boolean_t dontroute;            /* temporary SO_DONTROUTE setting */
        size_t resid;
-       int error;
+       int error, pru_flags = 0;
        int space;
 
        if (td->td_lwp != NULL)
@@ -937,16 +936,12 @@ restart:
                        goto release;
        }
 
-       dontroute = (flags & MSG_DONTROUTE) && !(so->so_options & SO_DONTROUTE);
-       if (dontroute)
-               so->so_options |= SO_DONTROUTE;
+       if (flags & MSG_DONTROUTE)
+               pru_flags |= PRUS_DONTROUTE;
 
-       error = so_pru_send(so, 0, top, addr, NULL, td);
+       error = so_pru_send(so, pru_flags, top, addr, NULL, td);
        top = NULL;             /* sent or freed in lower layer */
 
-       if (dontroute)
-               so->so_options &= ~SO_DONTROUTE;
-
 release:
        ssb_unlock(&so->so_snd);
 out:
index 6ea7573..a07c730 100644 (file)
@@ -192,6 +192,7 @@ struct netmsg_pru_send {
 #define PRUS_MORETOCOME                0x4
 #define PRUS_NAMALLOC          0x8
 #define PRUS_NOREPLY           0x10
+#define PRUS_DONTROUTE         0x20
 
 struct netmsg_pru_sense {
        struct netmsg_base      base;
index 09ffe46..72d4c66 100644 (file)
@@ -182,7 +182,7 @@ static void ip_2_ip6_hdr (struct ip6_hdr *ip6, struct ip *ip);
 static int udp_connect_oncpu(struct socket *so, struct thread *td,
                        struct sockaddr_in *sin, struct sockaddr_in *if_sin);
 static int udp_output (struct inpcb *, struct mbuf *, struct sockaddr *,
-                       struct thread *);
+                       struct thread *, int);
 
 void
 udp_init(void)
@@ -784,7 +784,7 @@ SYSCTL_PROC(_net_inet_udp, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW,
 
 static int
 udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *dstaddr,
-          struct thread *td)
+          struct thread *td, int flags)
 {
        struct udpiphdr *ui;
        int len = m->m_pkthdr.len;
@@ -902,7 +902,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *dstaddr,
 
        error = ip_output(m, inp->inp_options, &inp->inp_route,
            (inp->inp_socket->so_options & (SO_DONTROUTE | SO_BROADCAST)) |
-           IP_DEBUGROUTE,
+           flags | IP_DEBUGROUTE,
            inp->inp_moptions, inp);
 
        /*
@@ -1239,6 +1239,7 @@ udp_send(netmsg_t msg)
 {
        struct socket *so = msg->send.base.nm_so;
        struct mbuf *m = msg->send.nm_m;
+       int pru_flags = msg->send.nm_flags;
        struct inpcb *inp;
        int error;
 
@@ -1249,8 +1250,11 @@ udp_send(netmsg_t msg)
        if (inp) {
                struct sockaddr *addr = msg->send.nm_addr;
                struct thread *td = msg->send.nm_td;
+               int flags = 0;
 
-               error = udp_output(inp, m, addr, td);
+               if (pru_flags & PRUS_DONTROUTE)
+                       flags |= SO_DONTROUTE;
+               error = udp_output(inp, m, addr, td, flags);
        } else {
                m_freem(m);
                error = EINVAL;