network - Major netmsg retooling, part 2
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 15 Sep 2010 16:42:06 +0000 (09:42 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 15 Sep 2010 16:42:06 +0000 (09:42 -0700)
* Convert remaining protocols (divert, ipx, mpls, natm).

* Minor code correction in gif (no operational change).

* Remove NS protocol from LINT in preparation for complete removal
  from tree.

16 files changed:
sys/config/LINT
sys/net/gif/if_gif.c
sys/netinet/ip_divert.c
sys/netinet/ip_divert.h
sys/netproto/ipx/ipx.c
sys/netproto/ipx/ipx_input.c
sys/netproto/ipx/ipx_ip.c
sys/netproto/ipx/ipx_proto.c
sys/netproto/ipx/ipx_usrreq.c
sys/netproto/ipx/ipx_var.h
sys/netproto/ipx/spx.h
sys/netproto/ipx/spx_usrreq.c
sys/netproto/mpls/mpls_input.c
sys/netproto/mpls/mpls_proto.c
sys/netproto/natm/natm.c
sys/netproto/natm/natm_proto.c

index f225b4a..13bf453 100644 (file)
@@ -633,7 +633,6 @@ options     IPFILTER_LOG            #ipfilter logging
 options        IPFILTER_DEFAULT_BLOCK  #block all packets by default
 options        IPSTEALTH               #support for stealth forwarding
 options        TCPDEBUG
-options                NS                      # NETNS support
 
 device         pf
 device         pfsync
index 2c7fb33..45d67f7 100644 (file)
@@ -329,7 +329,7 @@ gif_output_serialized(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
                 */
                uint32_t af = dst->sa_family;
 
-               bpf_ptap(ifp->if_bpf, m, &af, sizeof(4));
+               bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
        }
        ifp->if_opackets++;     
        ifp->if_obytes += m->m_pkthdr.len;
index 5c0f890..f345c76 100644 (file)
@@ -163,76 +163,6 @@ div_input(struct mbuf **mp, int *offp, int proto)
        return(IPPROTO_DONE);
 }
 
-struct lwkt_port *
-div_soport(struct socket *so, struct sockaddr *nam, struct mbuf **mptr)
-{
-       struct sockaddr_in *sin;
-       struct mbuf *m;
-       int dir;
-
-       sin = (struct sockaddr_in *)nam;
-       m = *mptr;
-       M_ASSERTPKTHDR(m);
-
-       m->m_pkthdr.rcvif = NULL;
-       dir = DIV_IS_OUTPUT(sin) ? IP_MPORT_OUT : IP_MPORT_IN;
-
-       if (sin != NULL) {
-               int i;
-
-               /*
-                * Try locating the interface, if we originally had one.
-                * This is done even for outgoing packets, since for a
-                * forwarded packet, there must be an interface attached.
-                *
-                * Find receive interface with the given name, stuffed
-                * (if it exists) in the sin_zero[] field.
-                * The name is user supplied data so don't trust its size
-                * or that it is zero terminated.
-                */
-               for (i = 0; sin->sin_zero[i] && i < sizeof(sin->sin_zero); i++)
-                       ;
-               if (i > 0 && i < sizeof(sin->sin_zero))
-                       m->m_pkthdr.rcvif = ifunit(sin->sin_zero);
-       }
-
-       if (dir == IP_MPORT_IN && m->m_pkthdr.rcvif == NULL) {
-               /*
-                * No luck with the name, check by IP address.
-                * Clear the port and the ifname to make sure
-                * there are no distractions for ifa_ifwithaddr.
-                *
-                * Be careful not to trash sin->sin_port; it will
-                * be used later in div_output().
-                */
-               struct ifaddr *ifa;
-               u_short sin_port;
-
-               bzero(sin->sin_zero, sizeof(sin->sin_zero));
-               sin_port = sin->sin_port; /* save */
-               sin->sin_port = 0;
-               ifa = ifa_ifwithaddr((struct sockaddr *)sin);
-               if (ifa == NULL) {
-                       m_freem(m);
-                       *mptr = NULL;
-                       return NULL;
-               }
-               sin->sin_port = sin_port; /* restore */
-               m->m_pkthdr.rcvif = ifa->ifa_ifp;
-       }
-
-       /*
-        * Recalculate the protocol thread.
-        */
-       ip_cpufn(mptr, 0, dir);
-       m = *mptr;
-       if (m) {
-               KKASSERT(m->m_flags & M_HASH);
-               return(cpu_portfn(m->m_pkthdr.hash));
-       }
-       return(NULL);
-}
-
 /*
  * Divert a packet by passing it up to the divert socket at port 'port'.
  *
@@ -391,9 +321,12 @@ divert_packet(struct mbuf *m, int incoming)
                        nmp->base.lmsg.u.ms_result32 |= DIV_OUTPUT;
 
                lwkt_sendmsg(cpu_portfn(0), &nmp->base.lmsg);
-       } else
-#endif
+       } else {
+               div_packet(m, incoming, port);
+       }
+#else
        div_packet(m, incoming, port);
+#endif
 }
 
 /*
@@ -483,7 +416,7 @@ div_attach(netmsg_t msg)
        if (error)
                goto out;
        lwkt_gettoken(&div_token);
-       so->so_port = cpu0_soport(so, NULL, NULL);
+       sosetport(so, cpu_portfn(0));
        error = in_pcballoc(so, &divcbinfo);
        if (error) {
                lwkt_reltoken(&div_token);
index b050095..291692f 100644 (file)
@@ -50,8 +50,6 @@ struct divert_info {
 
 void   div_init(void);
 int    div_input(struct mbuf **, int *offp, int);
-struct lwkt_port *
-       div_soport(struct socket *, struct sockaddr *, struct mbuf **);
 
 extern struct mbuf *(*ip_divert_p)(struct mbuf *, int, int);
 
index d5cbe83..b03de97 100644 (file)
@@ -63,7 +63,7 @@ static        int ipx_ifinit(struct ifnet *ifp, struct ipx_ifaddr *ia,
  * Generic internet control operations (ioctl's).
  */
 int
-ipx_control(struct socket *so, u_long cmd, caddr_t data,
+ipx_control_oncpu(struct socket *so, u_long cmd, caddr_t data,
        struct ifnet *ifp, struct thread *td)
 {
        struct ifreq *ifr = (struct ifreq *)data;
index e25999f..831cdbb 100644 (file)
@@ -92,7 +92,7 @@ struct        ipxpcb ipxrawpcb;
 
 long   ipx_pexseq;
 
-static void ipxintr(struct netmsg *);
+static void ipxintr(netmsg_t msg);
 static int ipx_do_route(struct ipx_addr *src, struct route *ro);
 static void ipx_undo_route(struct route *ro);
 static void ipx_forward(struct mbuf *m);
@@ -125,9 +125,9 @@ ipx_init(void)
  * IPX input routine.  Pass to next level.
  */
 static void
-ipxintr(struct netmsg *msg)
+ipxintr(netmsg_t msg)
 {
-       struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet;
+       struct mbuf *m = msg->packet.nm_packet;
        struct ipx *ipx;
        struct ipxpcb *ipxp;
        struct ipx_ifaddr *ia;
@@ -280,22 +280,24 @@ out:
  *     arg_as_sa:      XXX should be swapped with dummy
  */
 void
-ipx_ctlinput(int cmd, struct sockaddr *arg_as_sa, void *dummy)
+ipx_ctlinput(netmsg_t msg)
 {
+       int cmd = msg->ctlinput.nm_cmd;
+       struct sockaddr *arg_as_sa = msg->ctlinput.nm_arg;
        caddr_t arg = (/* XXX */ caddr_t)arg_as_sa;
        struct ipx_addr *ipx;
+       struct sockaddr_ipx *sipx;
 
        if (cmd < 0 || cmd > PRC_NCMDS)
-               return;
-       switch (cmd) {
-               struct sockaddr_ipx *sipx;
+               goto out;
 
+       switch (cmd) {
        case PRC_IFDOWN:
        case PRC_HOSTDEAD:
        case PRC_HOSTUNREACH:
                sipx = (struct sockaddr_ipx *)arg;
                if (sipx->sipx_family != AF_IPX)
-                       return;
+                       break;
                ipx = &sipx->sipx_addr;
                break;
 
@@ -304,6 +306,8 @@ ipx_ctlinput(int cmd, struct sockaddr *arg_as_sa, void *dummy)
                        kprintf("ipx_ctlinput: cmd %d.\n", cmd);
                break;
        }
+out:
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
 /*
index b2e000c..c11d7d7 100644 (file)
@@ -58,6 +58,8 @@
 #include <sys/socketvar.h>
 #include <sys/sockio.h>
 
+#include <sys/msgport2.h>
+
 #include <net/if.h>
 #include <net/netisr.h>
 #include <net/route.h>
@@ -387,14 +389,14 @@ ipxip_route(struct socket *so, struct sockopt *sopt)
         */
        ifr_ipxip.ifr_name[4] = '0' + ipxipif_units - 1;
        ifr_ipxip.ifr_dstaddr = *(struct sockaddr *)ipx_dst;
-       ipx_control(so, (int)SIOCSIFDSTADDR, (caddr_t)&ifr_ipxip,
+       ipx_control_oncpu(so, (int)SIOCSIFDSTADDR, (caddr_t)&ifr_ipxip,
                        (struct ifnet *)ifn, sopt->sopt_td);
 
        /* use any of our addresses */
        satoipx_addr(ifr_ipxip.ifr_addr).x_host = 
                        ipx_ifaddr->ia_addr.sipx_addr.x_host;
 
-       return (ipx_control(so, (int)SIOCSIFADDR, (caddr_t)&ifr_ipxip,
+       return (ipx_control_oncpu(so, (int)SIOCSIFADDR, (caddr_t)&ifr_ipxip,
                        (struct ifnet *)ifn, sopt->sopt_td));
 }
 
@@ -416,7 +418,7 @@ void
 ipxip_ctlinput(netmsg_t msg)
 {
        int cmd = msg->ctlinput.nm_cmd;
-       struct sockaddr *sa = msg->ctlinput.nm_data;
+       struct sockaddr *sa = msg->ctlinput.nm_arg;
        struct sockaddr_in *sin;
 
        if ((unsigned)cmd >= PRC_NCMDS)
index 607dcb4..8b11045 100644 (file)
@@ -61,44 +61,90 @@ static      struct pr_usrreqs nousrreqs;
  */
 
 static struct protosw ipxsw[] = {
-{ 0,           &ipxdomain,     0,              0,
-  0,           0,              0,              0,
-  cpu0_soport, NULL,
-  ipx_init,    0,              0,              0,
-  &nousrreqs
-},
-{ SOCK_DGRAM,  &ipxdomain,     0,              PR_ATOMIC|PR_ADDR,
-  0,           0,              ipx_ctlinput,   ipx_ctloutput,
-  cpu0_soport, cpu0_ctlport,
-  0,           0,              0,              0,
-  &ipx_usrreqs
-},
-{ SOCK_STREAM, &ipxdomain,     IPXPROTO_SPX,   PR_CONNREQUIRED|PR_WANTRCVD,
-  0,           0,              spx_ctlinput,   spx_ctloutput,
-  cpu0_soport, cpu0_ctlport,
-  spx_init,    spx_fasttimo,   spx_slowtimo,   0,
-  &spx_usrreqs
-},
-{ SOCK_SEQPACKET,&ipxdomain,   IPXPROTO_SPX,   PR_CONNREQUIRED|PR_WANTRCVD|PR_ATOMIC,
-  0,           0,              spx_ctlinput,   spx_ctloutput,
-  cpu0_soport, cpu0_ctlport,
-  0,           0,              0,              0,
-  &spx_usrreq_sps
-},
-{ SOCK_RAW,    &ipxdomain,     IPXPROTO_RAW,   PR_ATOMIC|PR_ADDR,
-  0,           0,              0,              ipx_ctloutput,
-  cpu0_soport, NULL,
-  0,           0,              0,              0,
-  &ripx_usrreqs
-},
+    {
+       .pr_type = 0,
+       .pr_domain = &ipxdomain,
+       .pr_protocol = 0,
+       .pr_flags = 0,
+
+       .pr_init = ipx_init,
+       .pr_usrreqs = &nousrreqs
+    },
+    {
+       .pr_type = SOCK_DGRAM,
+       .pr_domain = &ipxdomain,
+       .pr_protocol = 0,
+       .pr_flags = PR_ATOMIC|PR_ADDR,
+
+       .pr_input = NULL,
+       .pr_output = NULL,
+       .pr_ctlinput = ipx_ctlinput,
+       .pr_ctloutput = ipx_ctloutput,
+
+       .pr_ctlport = cpu0_ctlport,
+       .pr_usrreqs = &ipx_usrreqs
+    },
+    {
+       .pr_type = SOCK_STREAM,
+       .pr_domain = &ipxdomain,
+       .pr_protocol = IPXPROTO_SPX,
+       .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD,
+
+       .pr_input = NULL,
+       .pr_output = NULL,
+       .pr_ctlinput = spx_ctlinput,
+       .pr_ctloutput = spx_ctloutput,
+       .pr_ctlport = cpu0_ctlport,
+
+       .pr_init = spx_init,
+       .pr_fasttimo = spx_fasttimo,
+       .pr_slowtimo = spx_slowtimo,
+       .pr_drain = NULL,
+       .pr_usrreqs = &spx_usrreqs
+    },
+    {
+       .pr_type = SOCK_SEQPACKET,
+       .pr_domain = &ipxdomain,
+       .pr_protocol = IPXPROTO_SPX,
+       .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_ATOMIC,
+
+       .pr_input = NULL,
+       .pr_output = NULL,
+       .pr_ctlinput = spx_ctlinput,
+       .pr_ctloutput = spx_ctloutput,
+
+       .pr_ctlport = cpu0_ctlport,
+       .pr_usrreqs = &spx_usrreq_sps
+    },
+    {
+       .pr_type = SOCK_RAW,
+       .pr_domain = &ipxdomain,
+       .pr_protocol = IPXPROTO_RAW,
+       .pr_flags = PR_ATOMIC|PR_ADDR,
+
+       .pr_input = NULL,
+       .pr_output = NULL,
+       .pr_ctlinput = NULL,
+       .pr_ctloutput = ipx_ctloutput,
+
+       .pr_usrreqs = &ripx_usrreqs
+    },
 #ifdef IPTUNNEL
 #if 0
-{ SOCK_RAW,    &ipxdomain,     IPPROTO_IPX,    PR_ATOMIC|PR_ADDR,
-  iptun_input, rip_output,     iptun_ctlinput, 0,
-  cpu0_soport, cpu0_ctlport,
-  0,           0,              0,              0,
-  &rip_usrreqs
-},
+    {
+       .pr_type = SOCK_RAW,
+       .pr_domain = &ipxdomain,
+       .pr_protocol = IPPROTO_IPX,
+       .pr_flags = PR_ATOMIC|PR_ADDR,
+
+       .pr_input = iptun_input,
+       .pr_output = rip_output,
+       .pr_ctlinput = iptun_ctlinput,
+       .pr_ctloutput = 0,
+
+       .pr_ctlport = cpu0_ctlport,
+       .pr_usrreqs = &rip_usrreqs
+    },
 #endif
 #endif
 };
index ca5cc6b..bb45e7e 100644 (file)
@@ -50,7 +50,9 @@
 #include <sys/socketvar.h>
 #include <sys/socketvar2.h>
 #include <sys/sysctl.h>
+
 #include <sys/thread2.h>
+#include <sys/msgport2.h>
 
 #include <net/if.h>
 #include <net/route.h>
@@ -74,37 +76,33 @@ static int ipxrecvspace = IPXRCVQ;
 SYSCTL_INT(_net_ipx_ipx, OID_AUTO, ipxrecvspace, CTLFLAG_RW,
             &ipxrecvspace, 0, "");
 
-static int ipx_usr_abort(struct socket *so);
-static int ipx_attach(struct socket *so, int proto,
-                      struct pru_attach_info *ai);
-static int ipx_bind(struct socket *so, struct sockaddr *nam,
-                    struct thread *td);
-static int ipx_connect(struct socket *so, struct sockaddr *nam,
-                       struct thread *td);
-static int ipx_detach(struct socket *so);
-static int ipx_disconnect(struct socket *so);
-static int ipx_send(struct socket *so, int flags, struct mbuf *m,
-                    struct sockaddr *addr, struct mbuf *control, 
-                    struct thread *td);
-static int ipx_shutdown(struct socket *so);
-static int ripx_attach(struct socket *so, int proto,
-                       struct pru_attach_info *ai);
-static int ipx_output(struct ipxpcb *ipxp, struct mbuf *m0);
+static void ipx_usr_abort(netmsg_t msg);
+static void ipx_attach(netmsg_t msg);
+static void ipx_bind(netmsg_t msg);
+static void ipx_connect(netmsg_t msg);
+/*static void ipx_control(netmsg_t msg);*/
+static void ipx_detach(netmsg_t msg);
+static void ipx_disconnect(netmsg_t msg);
+/*static void ipx_peeraddr(netmsg_t msg);*/
+static void ipx_send(netmsg_t msg);
+static void ipx_shutdown(netmsg_t msg);
+/*static void ipx_sockaddr(netmsg_t msg);*/
+static void ripx_attach(netmsg_t msg);
 
 struct pr_usrreqs ipx_usrreqs = {
        .pru_abort = ipx_usr_abort,
-       .pru_accept = pru_accept_notsupp,
+       .pru_accept = pr_generic_notsupp,
        .pru_attach = ipx_attach,
        .pru_bind = ipx_bind,
        .pru_connect = ipx_connect,
-       .pru_connect2 = pru_connect2_notsupp,
+       .pru_connect2 = pr_generic_notsupp,
        .pru_control = ipx_control,
        .pru_detach = ipx_detach,
        .pru_disconnect = ipx_disconnect,
-       .pru_listen = pru_listen_notsupp,
+       .pru_listen = pr_generic_notsupp,
        .pru_peeraddr = ipx_peeraddr,
-       .pru_rcvd = pru_rcvd_notsupp,
-       .pru_rcvoob = pru_rcvoob_notsupp,
+       .pru_rcvd = pr_generic_notsupp,
+       .pru_rcvoob = pr_generic_notsupp,
        .pru_send = ipx_send,
        .pru_sense = pru_sense_null,
        .pru_shutdown = ipx_shutdown,
@@ -115,18 +113,18 @@ struct    pr_usrreqs ipx_usrreqs = {
 
 struct pr_usrreqs ripx_usrreqs = {
        .pru_abort = ipx_usr_abort,
-       .pru_accept = pru_accept_notsupp,
+       .pru_accept = pr_generic_notsupp,
        .pru_attach = ripx_attach,
        .pru_bind = ipx_bind,
        .pru_connect = ipx_connect,
-       .pru_connect2 = pru_connect2_notsupp,
+       .pru_connect2 = pr_generic_notsupp,
        .pru_control = ipx_control,
        .pru_detach = ipx_detach,
        .pru_disconnect = ipx_disconnect,
-       .pru_listen = pru_listen_notsupp,
+       .pru_listen = pr_generic_notsupp,
        .pru_peeraddr = ipx_peeraddr,
-       .pru_rcvd = pru_rcvd_notsupp,
-       .pru_rcvoob = pru_rcvoob_notsupp,
+       .pru_rcvd = pr_generic_notsupp,
+       .pru_rcvoob = pr_generic_notsupp,
        .pru_send = ipx_send,
        .pru_sense = pru_sense_null,
        .pru_shutdown = ipx_shutdown,
@@ -340,17 +338,21 @@ ipx_output(struct ipxpcb *ipxp, struct mbuf *m0)
        return (ipx_outputfl(m, ro, so->so_options & SO_BROADCAST));
 }
 
-int
-ipx_ctloutput(struct socket *so, struct sockopt *sopt)
+void
+ipx_ctloutput(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
+       struct sockopt *sopt = msg->ctloutput.nm_sopt;
        struct ipxpcb *ipxp = sotoipxpcb(so);
        int mask, error, optval;
        short soptval;
        struct ipx ioptval;
 
        error = 0;
-       if (ipxp == NULL)
-               return (EINVAL);
+       if (ipxp == NULL) {
+               error = EINVAL;
+               goto out;
+       }
 
        switch (sopt->sopt_dir) {
        case SOPT_GET:
@@ -445,103 +447,150 @@ ipx_ctloutput(struct socket *so, struct sockopt *sopt)
                }
                break;
        }
-       return (error);
+out:
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /*
  * NOTE: (so) is referenced from soabort*() and netmsg_pru_abort()
  *      will sofree() it when we return.
  */
-static int
-ipx_usr_abort(struct socket *so)
+static void
+ipx_usr_abort(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp = sotoipxpcb(so);
 
        ipx_pcbdetach(ipxp);
        soisdisconnected(so);
 
-       return (0);
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
-static int
-ipx_attach(struct socket *so, int proto, struct pru_attach_info *ai)
+static void
+ipx_attach(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
+       struct pru_attach_info *ai = msg->attach.nm_ai;
+       struct ipxpcb *ipxp = sotoipxpcb(so);
        int error;
+
+       if (ipxp != NULL) {
+               error = EINVAL;
+       } else {
+               error = ipx_pcballoc(so, &ipxpcb);
+               if (error == 0) {
+                       error = soreserve(so, ipxsendspace, ipxrecvspace,
+                                         ai->sb_rlimit);
+               }
+       }
+       lwkt_replymsg(&msg->lmsg, error);
+}
+
+static void
+ipx_bind(netmsg_t msg)
+{
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp = sotoipxpcb(so);
+       int error;
 
-       if (ipxp != NULL)
-               return (EINVAL);
-       error = ipx_pcballoc(so, &ipxpcb);
-       if (error == 0)
-               error = soreserve(so, ipxsendspace, ipxrecvspace,
-                                 ai->sb_rlimit);
-       return (error);
+       error = ipx_pcbbind(ipxp, msg->bind.nm_nam, msg->bind.nm_td);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-ipx_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
+static void
+ipx_connect(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp = sotoipxpcb(so);
+       int error;
 
-       return (ipx_pcbbind(ipxp, nam, td));
+       if (ipx_nullhost(ipxp->ipxp_faddr)) {
+               error = ipx_pcbconnect(ipxp,
+                                      msg->connect.nm_nam,
+                                      msg->connect.nm_td);
+               if (error == 0)
+                       soisconnected(so);
+       } else {
+               error = EISCONN;
+       }
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-ipx_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
+void
+ipx_control(netmsg_t msg)
 {
        int error;
-       struct ipxpcb *ipxp = sotoipxpcb(so);
 
-       if (!ipx_nullhost(ipxp->ipxp_faddr))
-               return (EISCONN);
-       error = ipx_pcbconnect(ipxp, nam, td);
-       if (error == 0)
-               soisconnected(so);
-       return (error);
+       error = ipx_control_oncpu(msg->base.nm_so,
+                                 msg->control.nm_cmd,
+                                 msg->control.nm_data,
+                                 msg->control.nm_ifp,
+                                 msg->control.nm_td);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-ipx_detach(struct socket *so)
+static void
+ipx_detach(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp = sotoipxpcb(so);
+       int error;
 
-       if (ipxp == NULL)
-               return (ENOTCONN);
-       ipx_pcbdetach(ipxp);
-       return (0);
+       if (ipxp) {
+               ipx_pcbdetach(ipxp);
+               error = 0;
+       } else {
+               error = ENOTCONN;
+       }
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-ipx_disconnect(struct socket *so)
+static void
+ipx_disconnect(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp = sotoipxpcb(so);
+       int error;
 
-       if (ipx_nullhost(ipxp->ipxp_faddr))
-               return (ENOTCONN);
-       soreference(so);
-       ipx_pcbdisconnect(ipxp);
-       soisdisconnected(so);
-       sofree(so);
-
-       return (0);
+       if (ipx_nullhost(ipxp->ipxp_faddr)) {
+               error= ENOTCONN;
+       } else {
+               soreference(so);
+               ipx_pcbdisconnect(ipxp);
+               soisdisconnected(so);
+               sofree(so);
+               error = 0;
+       }
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-int
-ipx_peeraddr(struct socket *so, struct sockaddr **nam)
+void
+ipx_peeraddr(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp = sotoipxpcb(so);
 
-       ipx_setpeeraddr(ipxp, nam);
-       return (0);
+       ipx_setpeeraddr(ipxp, msg->peeraddr.nm_nam);
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
-static int
-ipx_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
-       struct mbuf *control, struct thread *td)
+static void
+ipx_send(netmsg_t msg)
 {
-       int error;
+       struct socket *so = msg->base.nm_so;
+       struct mbuf *m = msg->send.nm_m;
+       struct sockaddr *nam = msg->send.nm_addr;
+       struct mbuf *control = msg->send.nm_control;
+       struct thread *td = msg->send.nm_td;
        struct ipxpcb *ipxp = sotoipxpcb(so);
        struct ipx_addr laddr;
+       int error;
+
+       if (control) {
+               m_freem(control);
+               control = NULL;
+       }
 
        if (nam != NULL) {
                laddr = ipxp->ipxp_laddr;
@@ -571,41 +620,50 @@ ipx_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
 send_release:
        if (m != NULL)
                m_freem(m);
-       return (error);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-ipx_shutdown(struct socket *so)
+static void
+ipx_shutdown(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
+
        socantsendmore(so);
-       return (0);
+
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
-int
-ipx_sockaddr(struct socket *so, struct sockaddr **nam)
+void
+ipx_sockaddr(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp = sotoipxpcb(so);
 
-       ipx_setsockaddr(ipxp, nam); /* XXX what if alloc fails? */
-       return (0);
+       /* XXX what if alloc fails? */
+       ipx_setsockaddr(ipxp, msg->sockaddr.nm_nam);
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
-static int
-ripx_attach(struct socket *so, int proto, struct pru_attach_info *ai)
+static void
+ripx_attach(netmsg_t msg)
 {
-       int error = 0;
+       struct socket *so = msg->base.nm_so;
+       struct pru_attach_info *ai = msg->attach.nm_ai;
        struct ipxpcb *ipxp;
+       int error;
 
-       if ((error = priv_check_cred(ai->p_ucred, PRIV_ROOT, NULL_CRED_OKAY)) != 0)
-               return (error);
+       error = priv_check_cred(ai->p_ucred, PRIV_ROOT, NULL_CRED_OKAY);
+       if (error)
+               goto out;
        error = ipx_pcballoc(so, &ipxrawpcb);
        if (error)
-               return (error);
+               goto out;
        error = soreserve(so, ipxsendspace, ipxrecvspace, ai->sb_rlimit);
        if (error)
-               return (error);
+               goto out;
        ipxp = sotoipxpcb(so);
        ipxp->ipxp_faddr.x_host = ipx_broadhost;
        ipxp->ipxp_flags = IPXP_RAWIN | IPXP_RAWOUT;
-       return (error);
+out:
+       lwkt_replymsg(&msg->lmsg, error);
 }
index ed48c72..f87ffc2 100644 (file)
@@ -86,21 +86,23 @@ struct route;
 struct sockaddr;
 struct socket;
 struct sockopt;
+union netmsg;
 
 void   ipx_abort (struct ipxpcb *ipxp);
 u_short        ipx_cksum (struct mbuf *m, int len);
-int    ipx_control (struct socket *so, u_long cmd, caddr_t data,
+int    ipx_control_oncpu (struct socket *so, u_long cmd, caddr_t data,
                         struct ifnet *ifp, struct thread *td);
-void   ipx_ctlinput (int cmd, struct sockaddr *arg_as_sa, void *dummy);
-int    ipx_ctloutput (struct socket *so, struct sockopt *sopt);
+void   ipx_ctlinput (union netmsg *);
+void   ipx_ctloutput (union netmsg *);
+void   ipx_control (union netmsg *);
+void   ipx_peeraddr (union netmsg *);
+void   ipx_sockaddr (union netmsg *);
 void   ipx_drop (struct ipxpcb *ipxp, int error);
 void   ipx_init (void);
 void   ipx_input (struct mbuf *m, struct ipxpcb *ipxp);
 int    ipx_outputfl (struct mbuf *m0, struct route *ro, int flags);
 int    ipx_output_type20 (struct mbuf *);
-int    ipx_peeraddr (struct socket *so, struct sockaddr **nam);
 void   ipx_printhost (struct ipx_addr *addr);
-int    ipx_sockaddr (struct socket *so, struct sockaddr **nam);
 void   ipx_watch_output (struct mbuf *m, struct ifnet *ifp);
 
 #endif /* _KERNEL */
index 84c969a..f3b926c 100644 (file)
@@ -175,8 +175,8 @@ struct spxpcb {
 extern struct pr_usrreqs spx_usrreqs;
 extern struct pr_usrreqs spx_usrreq_sps;
 
-void   spx_ctlinput (int cmd, struct sockaddr *arg_as_sa, void *dummy);
-int    spx_ctloutput (struct socket *so, struct sockopt *sopt);
+void   spx_ctlinput (union netmsg *);
+void   spx_ctloutput (union netmsg *);
 void   spx_fasttimo (void);
 void   spx_init (void);
 void   spx_input (struct mbuf *m, struct ipxpcb *ipxp);
index a0b702b..737655a 100644 (file)
@@ -47,7 +47,9 @@
 #include <sys/socket.h>
 #include <sys/socketvar.h>
 #include <sys/socketvar2.h>
+
 #include <sys/thread2.h>
+#include <sys/msgport2.h>
 
 #include <net/route.h>
 #include <netinet/tcp_fsm.h>
@@ -89,25 +91,19 @@ static      void spx_template(struct spxpcb *cb);
 static struct spxpcb *spx_timers(struct spxpcb *cb, int timer);
 static struct spxpcb *spx_usrclosed(struct spxpcb *cb);
 
-static int spx_usr_abort(struct socket *so);
-static int spx_accept(struct socket *so, struct sockaddr **nam);
-static int spx_attach(struct socket *so, int proto,
-                      struct pru_attach_info *ai);
-static int spx_bind(struct socket *so, struct sockaddr *nam,
-                    struct thread *td);
-static int spx_connect(struct socket *so, struct sockaddr *nam,
-                       struct thread *td);
-static int spx_detach(struct socket *so);
-static int spx_usr_disconnect(struct socket *so);
-static int spx_listen(struct socket *so, struct thread *td);
-static int spx_rcvd(struct socket *so, int flags);
-static int spx_rcvoob(struct socket *so, struct mbuf *m, int flags);
-static int spx_send(struct socket *so, int flags, struct mbuf *m,
-                    struct sockaddr *addr, struct mbuf *control, 
-                    struct thread *td);
-static int spx_shutdown(struct socket *so);
-static int spx_sp_attach(struct socket *so, int proto,
-                         struct pru_attach_info *ai);
+static void spx_usr_abort(netmsg_t);
+static void spx_accept(netmsg_t);
+static void spx_attach(netmsg_t);
+static void spx_bind(netmsg_t);
+static void spx_connect(netmsg_t);
+static void spx_detach(netmsg_t);
+static void spx_usr_disconnect(netmsg_t);
+static void spx_listen(netmsg_t);
+static void spx_rcvd(netmsg_t);
+static void spx_rcvoob(netmsg_t);
+static void spx_send(netmsg_t);
+static void spx_shutdown(netmsg_t);
+static void spx_sp_attach(netmsg_t);
 
 struct pr_usrreqs spx_usrreqs = {
        .pru_abort = spx_usr_abort,
@@ -115,7 +111,7 @@ struct      pr_usrreqs spx_usrreqs = {
        .pru_attach = spx_attach,
        .pru_bind = spx_bind,
        .pru_connect = spx_connect,
-       .pru_connect2 = pru_connect2_notsupp,
+       .pru_connect2 = pr_generic_notsupp,
        .pru_control = ipx_control,
        .pru_detach = spx_detach,
        .pru_disconnect = spx_usr_disconnect,
@@ -137,7 +133,7 @@ struct      pr_usrreqs spx_usrreq_sps = {
        .pru_attach = spx_sp_attach,
        .pru_bind = spx_bind,
        .pru_connect = spx_connect,
-       .pru_connect2 = pru_connect2_notsupp,
+       .pru_connect2 = pr_generic_notsupp,
        .pru_control = ipx_control,
        .pru_detach = spx_detach,
        .pru_disconnect = spx_usr_disconnect,
@@ -666,32 +662,34 @@ present:
 }
 
 void
-spx_ctlinput(int cmd, struct sockaddr *arg_as_sa, void *dummy)
+spx_ctlinput(netmsg_t msg)
 {
+       /*struct socket *so = msg->base.nm_so;*/
+       int cmd = msg->ctlinput.nm_cmd;
+       struct sockaddr *arg_as_sa = msg->ctlinput.nm_arg;
        caddr_t arg = (/* XXX */ caddr_t)arg_as_sa;
        struct ipx_addr *na;
        struct sockaddr_ipx *sipx;
 
        if (cmd < 0 || cmd > PRC_NCMDS)
-               return;
+               goto out;
 
        switch (cmd) {
-
        case PRC_ROUTEDEAD:
-               return;
-
+               break;
        case PRC_IFDOWN:
        case PRC_HOSTDEAD:
        case PRC_HOSTUNREACH:
                sipx = (struct sockaddr_ipx *)arg;
                if (sipx->sipx_family != AF_IPX)
-                       return;
+                       break;
                na = &sipx->sipx_addr;
                break;
-
        default:
                break;
        }
+out:
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
 #ifdef notdef
@@ -1169,10 +1167,12 @@ spx_setpersist(struct spxpcb *cb)
                cb->s_rxtshift++;
 }
 
-int
-spx_ctloutput(struct socket *so, struct sockopt *sopt)
+void
+spx_ctloutput(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp = sotoipxpcb(so);
+       struct sockopt *sopt = msg->ctloutput.nm_sopt;
        struct spxpcb *cb;
        int mask, error;
        short soptval;
@@ -1184,12 +1184,15 @@ spx_ctloutput(struct socket *so, struct sockopt *sopt)
        if (sopt->sopt_level != IPXPROTO_SPX) {
                /* This will have to be changed when we do more general
                   stacking of protocols */
-               return (ipx_ctloutput(so, sopt));
+               ipx_ctloutput(msg);
+               /* msg now invalid */
+               return;
        }
-       if (ipxp == NULL)
-               return (EINVAL);
-       else
-               cb = ipxtospxpcb(ipxp);
+       if (ipxp == NULL) {
+               error = EINVAL;
+               goto out;
+       }
+       cb = ipxtospxpcb(ipxp);
 
        switch (sopt->sopt_dir) {
        case SOPT_GET:
@@ -1291,16 +1294,18 @@ spx_ctloutput(struct socket *so, struct sockopt *sopt)
                }
                break;
        }
-       return (error);
+out:
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /*
  * NOTE: (so) is referenced from soabort*() and netmsg_pru_abort()
  *      will sofree() it when we return.
  */
-static int
-spx_usr_abort(struct socket *so)
+static void
+spx_usr_abort(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp;
        struct spxpcb *cb;
 
@@ -1309,7 +1314,7 @@ spx_usr_abort(struct socket *so)
 
        spx_drop(cb, ECONNABORTED);
 
-       return (0);
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
 /*
@@ -1317,9 +1322,11 @@ spx_usr_abort(struct socket *so)
  * done at higher levels; just return the address
  * of the peer, storing through addr.
  */
-static int
-spx_accept(struct socket *so, struct sockaddr **nam)
+static void
+spx_accept(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
+       struct sockaddr **nam = msg->accept.nm_nam;
        struct ipxpcb *ipxp;
        struct sockaddr_ipx *sipx, ssipx;
 
@@ -1330,24 +1337,27 @@ spx_accept(struct socket *so, struct sockaddr **nam)
        sipx->sipx_family = AF_IPX;
        sipx->sipx_addr = ipxp->ipxp_faddr;
        *nam = dup_sockaddr((struct sockaddr *)sipx);
-       return (0);
+
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
 static int
-spx_attach(struct socket *so, int proto, struct pru_attach_info *ai)
+spx_attach_oncpu(struct socket *so, int proto, struct pru_attach_info *ai)
 {
-       int error;
        struct ipxpcb *ipxp;
        struct spxpcb *cb;
        struct mbuf *mm;
        struct signalsockbuf *ssb;
+       int error;
 
        ipxp = sotoipxpcb(so);
        cb = ipxtospxpcb(ipxp);
 
-       if (ipxp != NULL)
-               return (EISCONN);
        crit_enter();
+       if (ipxp != NULL) {
+               error = EISCONN;
+               goto spx_attach_end;
+       }
        error = ipx_pcballoc(so, &ipxpcb);
        if (error)
                goto spx_attach_end;
@@ -1389,17 +1399,32 @@ spx_attach(struct socket *so, int proto, struct pru_attach_info *ai)
        ipxp->ipxp_pcb = (caddr_t)cb; 
 spx_attach_end:
        crit_exit();
-       return (error);
+       return error;
 }
 
-static int
-spx_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
+static void
+spx_attach(netmsg_t msg)
+{
+       int error;
+
+       error = spx_attach_oncpu(msg->base.nm_so,
+                                msg->attach.nm_proto,
+                                msg->attach.nm_ai);
+       lwkt_replymsg(&msg->lmsg, error);
+}
+
+
+static void
+spx_bind(netmsg_t msg)
 {  
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp;
+       int error;
 
        ipxp = sotoipxpcb(so);
 
-       return (ipx_pcbbind(ipxp, nam, td));
+       error = ipx_pcbbind(ipxp, msg->bind.nm_nam, msg->bind.nm_td);
+       lwkt_replymsg(&msg->lmsg, error);
 }  
    
 /*
@@ -1408,12 +1433,15 @@ spx_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
  * Start keep-alive timer, setup prototype header,
  * Send initial system packet requesting connection.
  */
-static int
-spx_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
+static void
+spx_connect(netmsg_t msg)
 {
-       int error;
+       struct socket *so = msg->base.nm_so;
+       struct sockaddr *nam = msg->connect.nm_nam;
+       struct thread *td = msg->connect.nm_td;
        struct ipxpcb *ipxp;
        struct spxpcb *cb;
+       int error;
 
        ipxp = sotoipxpcb(so);
        cb = ipxtospxpcb(ipxp);
@@ -1446,27 +1474,32 @@ spx_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
        error = spx_output(cb, NULL);
 spx_connect_end:
        crit_exit();
-       return (error);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-spx_detach(struct socket *so)
+static void
+spx_detach(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp;
        struct spxpcb *cb;
+       int error;
 
        ipxp = sotoipxpcb(so);
        cb = ipxtospxpcb(ipxp);
 
-       if (ipxp == NULL)
-               return (ENOTCONN);
-       crit_enter();
-       if (cb->s_state > TCPS_LISTEN)
-               spx_disconnect(cb);
-       else
-               spx_close(cb);
-       crit_exit();
-       return (0);
+       if (ipxp) {
+               crit_enter();
+               if (cb->s_state > TCPS_LISTEN)
+                       spx_disconnect(cb);
+               else
+                       spx_close(cb);
+               crit_exit();
+               error = 0;
+       } else {
+               error = ENOTCONN;
+       }
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /*
@@ -1474,9 +1507,10 @@ spx_detach(struct socket *so)
  * handshaking at the spx level optionally.
  * here is the hook to do it:
  */
-static int
-spx_usr_disconnect(struct socket *so)
+static void
+spx_usr_disconnect(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp;
        struct spxpcb *cb;
 
@@ -1486,34 +1520,37 @@ spx_usr_disconnect(struct socket *so)
        crit_enter();
        spx_disconnect(cb);
        crit_exit();
-       return (0);
+
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
-static int
-spx_listen(struct socket *so, struct thread *td)
+static void
+spx_listen(netmsg_t msg)
 {
-       int error;
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp;
        struct spxpcb *cb;
+       int error;
 
        error = 0;
        ipxp = sotoipxpcb(so);
        cb = ipxtospxpcb(ipxp);
 
        if (ipxp->ipxp_lport == 0)
-               error = ipx_pcbbind(ipxp, NULL, td);
+               error = ipx_pcbbind(ipxp, NULL, msg->listen.nm_td);
        if (error == 0)
                cb->s_state = TCPS_LISTEN;
-       return (error);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /*
  * After a receive, possibly send acknowledgment
  * updating allocation.
  */
-static int
-spx_rcvd(struct socket *so, int flags)
+static void
+spx_rcvd(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp;
        struct spxpcb *cb;
 
@@ -1525,14 +1562,18 @@ spx_rcvd(struct socket *so, int flags)
        spx_output(cb, NULL);
        cb->s_flags &= ~SF_RVD;
        crit_exit();
-       return (0);
+
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
-static int
-spx_rcvoob(struct socket *so, struct mbuf *m, int flags)
+static void
+spx_rcvoob(netmsg_t msg)
 {
+       struct mbuf *m = msg->rcvoob.nm_m;
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp;
        struct spxpcb *cb;
+       int error;
 
        ipxp = sotoipxpcb(so);
        cb = ipxtospxpcb(ipxp);
@@ -1541,18 +1582,23 @@ spx_rcvoob(struct socket *so, struct mbuf *m, int flags)
            (so->so_state & SS_RCVATMARK)) {
                m->m_len = 1;
                *mtod(m, caddr_t) = cb->s_iobc;
-               return (0);
+               error = 0;
+       } else {
+               error = EINVAL;
        }
-       return (EINVAL);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-spx_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr,
-       struct mbuf *controlp, struct thread *td)
+static void
+spx_send(netmsg_t msg)
 {
-       int error;
+       struct socket *so = msg->base.nm_so;
+       struct mbuf *m = msg->send.nm_m;
+       struct mbuf *controlp = msg->send.nm_control;
+       int flags = msg->send.nm_flags;
        struct ipxpcb *ipxp;
        struct spxpcb *cb;
+       int error;
 
        error = 0;
        ipxp = sotoipxpcb(so);
@@ -1584,15 +1630,16 @@ spx_send_end:
        if (m != NULL)
                m_freem(m);
        crit_exit();
-       return (error);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-spx_shutdown(struct socket *so)
+static void
+spx_shutdown(netmsg_t msg)
 {
-       int error;
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp;
        struct spxpcb *cb;
+       int error;
 
        error = 0;
        ipxp = sotoipxpcb(so);
@@ -1604,22 +1651,23 @@ spx_shutdown(struct socket *so)
        if (cb != NULL)
                error = spx_output(cb, NULL);
        crit_exit();
-       return (error);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-spx_sp_attach(struct socket *so, int proto, struct pru_attach_info *ai)
+static void
+spx_sp_attach(netmsg_t msg)
 {
-       int error;
+       struct socket *so = msg->base.nm_so;
        struct ipxpcb *ipxp;
+       int error;
 
-       error = spx_attach(so, proto, ai);
+       error = spx_attach_oncpu(so, msg->attach.nm_proto, msg->attach.nm_ai);
        if (error == 0) {
                ipxp = sotoipxpcb(so);
                ((struct spxpcb *)ipxp->ipxp_pcb)->s_flags |=
                                        (SF_HI | SF_HO | SF_PI);
        }
-       return (error);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /*
index 5216d06..1af5894 100644 (file)
@@ -57,7 +57,7 @@ SYSCTL_INT(_net_mpls, OID_AUTO, forwarding, CTLFLAG_RW,
     &mplsforwarding, 0, "Enable MPLS forwarding between interfaces");
 */
 
-static void    mpls_input_handler(struct netmsg *);
+static void    mpls_input_handler(netmsg_t);
 static void    mpls_forward(struct mbuf *);
 
 void
@@ -83,13 +83,14 @@ mpls_init(void)
 }
 
 static void
-mpls_input_handler(struct netmsg *msg0)
+mpls_input_handler(netmsg_t msg)
 {
-        struct mbuf *m = ((struct netmsg_packet *)msg0)->nm_packet;
+        struct mbuf *m = msg->packet.nm_packet;
 
        get_mplock();
         mpls_input(m);
        rel_mplock();
+       /* do not reply, msg embedded in mbuf */
 }
 
 void
index 8729173..f38d34b 100644 (file)
@@ -46,18 +46,21 @@ static struct domain mplsdomain;
 static struct pr_usrreqs nousrreqs;  /* XXX use this for something */
 
 struct protosw mplssw[] = {
-{ 0,           &mplsdomain,    0,      0,
-  0,           0,              0,      0,
-  cpu0_soport, NULL,
-  mpls_init,   0,              0,      0,
-  &nousrreqs
-},
-{ SOCK_RAW,    &mplsdomain,    0,      PR_ATOMIC|PR_ADDR,
-  0,           0,              0,      0,
-  cpu0_soport, NULL,
-  0,           0,              0,      0,
-  &nousrreqs
-},
+    {
+       .pr_type = 0,
+       .pr_domain = &mplsdomain,
+
+       .pr_init = mpls_init,
+       .pr_usrreqs = &nousrreqs
+    },
+    {
+       .pr_type = SOCK_RAW,
+       .pr_domain = &mplsdomain,
+       .pr_protocol = 0,
+       .pr_flags = PR_ATOMIC|PR_ADDR,
+
+       .pr_usrreqs = &nousrreqs
+    }
 };
 
 static struct  domain mplsdomain = {
index 2d4e12f..fc1d3e8 100644 (file)
@@ -71,29 +71,17 @@ static u_long natm0_recvspace = 16*1024;
  * user requests
  */
 #ifdef FREEBSD_USRREQS
+
 /*
  * FreeBSD new usrreqs supersedes pr_usrreq.
  */
-static int natm_usr_attach (struct socket *, int, struct pru_attach_info *);
-static int natm_usr_detach (struct socket *);
-static int natm_usr_connect (struct socket *, struct sockaddr *,
-                                struct thread *);
-static int natm_usr_disconnect (struct socket *);
-static int natm_usr_shutdown (struct socket *);
-static int natm_usr_send (struct socket *, int, struct mbuf *,
-                             struct sockaddr *, struct mbuf *, 
-                             struct thread *);
-static int natm_usr_peeraddr (struct socket *, struct sockaddr **);
-static int natm_usr_control (struct socket *, u_long, caddr_t,
-                                struct ifnet *, struct thread *);
-static int natm_usr_abort (struct socket *);
-static int natm_usr_bind (struct socket *, struct sockaddr *, 
-                             struct thread *);
-static int natm_usr_sockaddr (struct socket *, struct sockaddr **);
-
-static int
-natm_usr_attach(struct socket *so, int proto, struct pru_attach_info *ai)
+
+static void
+natm_usr_attach(netmsg_t msg)
 {
+    struct socket *so = msg->base.nm_so;
+    struct pru_attach_info *ai = msg->attach.nm_ai;
+    int proto = msg->attach.nm_proto;
     struct natmpcb *npcb;
     int error = 0;
 
@@ -120,12 +108,13 @@ natm_usr_attach(struct socket *so, int proto, struct pru_attach_info *ai)
     npcb->npcb_socket = so;
  out:
     crit_exit();
-    return (error);
+    lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-natm_usr_detach(struct socket *so)
+static void
+natm_usr_detach(netmsg_t msg)
 {
+    struct socket *so = msg->base.nm_so;
     struct natmpcb *npcb;
     int error = 0;
 
@@ -144,12 +133,15 @@ natm_usr_detach(struct socket *so)
     sofree(so);                                /* remove pcb ref */
  out:
     crit_exit();
-    return (error);
+    lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-natm_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
+static void
+natm_usr_connect(netmsg_t msg)
 {
+    struct socket *so = msg->base.nm_so;
+    struct sockaddr *nam = msg->connect.nm_nam;
+    struct thread *td = msg->connect.nm_td;
     struct natmpcb *npcb;
     struct sockaddr_natm *snatm;
     struct atm_pseudoioctl api;
@@ -229,12 +221,13 @@ natm_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
 
  out:
     crit_exit();
-    return (error);
+    lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-natm_usr_disconnect(struct socket *so)
+static void
+natm_usr_disconnect(netmsg_t msg)
 {
+    struct socket *so = msg->base.nm_so;
     struct natmpcb *npcb;
     struct atm_pseudoioctl api;
     struct ifnet *ifp;
@@ -273,20 +266,25 @@ natm_usr_disconnect(struct socket *so)
 
  out:
     crit_exit();
-    return (error);
+    lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-natm_usr_shutdown(struct socket *so)
+static void
+natm_usr_shutdown(netmsg_t msg)
 {
+    struct socket *so = msg->base.nm_so;
+
     socantsendmore(so);
-    return 0;
+
+    lwkt_replymsg(&msg->lmsg, 0);
 }
 
-static int
-natm_usr_send(struct socket *so, int flags, struct mbuf *m, 
-             struct sockaddr *nam, struct mbuf *control, struct thread *td)
+static void
+natm_usr_send(netmsg_t msg)
 {
+    struct socket *so = msg->base.nm_so;
+    struct mbuf *m = msg->send.nm_m;
+    struct mbuf *control = msg->send.nm_control;
     struct natmpcb *npcb;
     struct atm_pseudohdr *aph;
     int error = 0;
@@ -325,12 +323,15 @@ natm_usr_send(struct socket *so, int flags, struct mbuf *m,
 
  out:
     crit_exit();
-    return (error);
+    lwkt_replymsg(&msg->lmsg, error);
+
 }
 
-static int
-natm_usr_peeraddr(struct socket *so, struct sockaddr **nam)
+static void
+natm_usr_peeraddr(netmsg_t msg)
 {
+    struct socket *so = msg->base.nm_so;
+    struct sockaddr **nam = msg->peeraddr.nm_nam;
     struct natmpcb *npcb;
     struct sockaddr_natm *snatm, ssnatm;
     int error = 0;
@@ -354,13 +355,16 @@ natm_usr_peeraddr(struct socket *so, struct sockaddr **nam)
 
  out:
     crit_exit();
-    return (error);
+    lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-natm_usr_control(struct socket *so, u_long cmd, caddr_t arg,
-                struct ifnet *ifp, struct thread *td)
+static void
+natm_usr_control(netmsg_t msg)
 {
+    struct socket *so = msg->base.nm_so;
+    u_long cmd = msg->control.nm_cmd;
+    caddr_t arg = msg->control.nm_data;
+    struct thread *td = msg->control.nm_td;
     struct natmpcb *npcb;
     struct atm_rawioctl ario;
     int error = 0;
@@ -393,58 +397,43 @@ natm_usr_control(struct socket *so, u_long cmd, caddr_t arg,
            else
                npcb->npcb_flags &= ~(NPCB_RAW);
        }
-    }
-    else
+    } else {
        error = EOPNOTSUPP;
- out:
-    return (error);
+    }
+out:
+    lwkt_replymsg(&msg->lmsg, error);
 }
 
 /*
  * NOTE: (so) is referenced from soabort*() and netmsg_pru_abort()
  *      will sofree() it when we return.
  */
-static int
-natm_usr_abort(struct socket *so)
-{
-    int error;
-
-    error = natm_usr_shutdown(so);
-
-    return error;
-}
-
-static int
-natm_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
-{
-    return EOPNOTSUPP;
-}
-
-static int
-natm_usr_sockaddr(struct socket *so, struct sockaddr **nam)
+static void
+natm_usr_abort(netmsg_t msg)
 {
-    return EOPNOTSUPP;
+    natm_usr_shutdown(msg);
+    /* msg now invalid */
 }
 
 /* xxx - should be const */
 struct pr_usrreqs natm_usrreqs = {
        .pru_abort = natm_usr_abort,
-       .pru_accept = pru_accept_notsupp,
+       .pru_accept = pr_generic_notsupp,
        .pru_attach = natm_usr_attach,
-       .pru_bind = natm_usr_bind,
+       .pru_bind = pr_generic_notsupp,
        .pru_connect = natm_usr_connect,
-       .pru_connect2 = pru_connect2_notsupp,
+       .pru_connect2 = pr_generic_notsupp,
        .pru_control = natm_usr_control,
        .pru_detach = natm_usr_detach,
        .pru_disconnect = natm_usr_disconnect,
-       .pru_listen = pru_listen_notsupp,
+       .pru_listen = pr_generic_notsupp,
        .pru_peeraddr = natm_usr_peeraddr,
-       .pru_rcvd = pru_rcvd_notsupp,
-       .pru_rcvoob = pru_rcvoob_notsupp,
+       .pru_rcvd = pr_generic_notsupp,
+       .pru_rcvoob = pr_generic_notsupp,
        .pru_send = natm_usr_send,
        .pru_sense = pru_sense_null,
        .pru_shutdown = natm_usr_shutdown,
-       .pru_sockaddr = natm_usr_sockaddr,
+       .pru_sockaddr = pr_generic_notsupp,
        .pru_sosend = sosend,
        .pru_soreceive = soreceive
 };
@@ -749,7 +738,7 @@ natm5_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp,
   return (ENOPROTOOPT);
 }
 
-static void natmintr(struct netmsg *);
+static void natmintr(netmsg_t);
 
 #if defined(__DragonFly__)
 static void
@@ -776,9 +765,9 @@ natm_init(void)
  * we really need it.
  */
 static void
-natmintr(struct netmsg *msg)
+natmintr(netmsg_t msg)
 {
-  struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet;
+  struct mbuf *m = msg->packet.nm_packet;
   struct socket *so;
   struct natmpcb *npcb;
 
index 38925df..08ce761 100644 (file)
 static struct domain natmdomain;
 
 static struct protosw natmsw[] = {
-{ SOCK_STREAM, &natmdomain,    PROTO_NATMAAL5, PR_CONNREQUIRED,
-  0,   0,      0,      0,
-#ifdef FREEBSD_USRREQS
-  cpu0_soport, NULL,
-#else
-  natm_usrreq,
-#endif
-  0,   0,      0,      0,      
-#if defined(__NetBSD__) || defined(__OpenBSD__)
-       natm5_sysctl
-#elif defined(FREEBSD_USRREQS)
-        &natm_usrreqs
-#endif
-},
-{ SOCK_DGRAM,  &natmdomain,    PROTO_NATMAAL5, PR_CONNREQUIRED | PR_ATOMIC,
-  0,   0,      0,      0,
-#ifdef FREEBSD_USRREQS
-  cpu0_soport, NULL,
-#else
-  natm_usrreq,
-#endif
-  0,   0,      0,      0,      
-#if defined(__NetBSD__) || defined(__OpenBSD__)
-       natm5_sysctl
-#elif defined(FREEBSD_USRREQS)
-        &natm_usrreqs
-#endif
-},
-{ SOCK_STREAM, &natmdomain,    PROTO_NATMAAL0, PR_CONNREQUIRED,
-  0,   0,      0,      0,
-#ifdef FREEBSD_USRREQS
-  cpu0_soport, NULL,
-#else
-  natm_usrreq,
-#endif
-  0,   0,      0,      0,      
-#if defined(__NetBSD__) || defined(__OpenBSD__)
-       natm0_sysctl
-#elif defined(FREEBSD_USRREQS)
-        &natm_usrreqs
-#endif
-},
+    {
+       .pr_type = SOCK_STREAM,
+       .pr_domain = &natmdomain,
+       .pr_protocol = PROTO_NATMAAL5,
+       .pr_flags = PR_CONNREQUIRED,
+
+       .pr_usrreqs = &natm_usrreqs
+    },
+    {
+       .pr_type = SOCK_DGRAM,
+       .pr_domain = &natmdomain,
+       .pr_protocol = PROTO_NATMAAL5,
+       .pr_flags = PR_CONNREQUIRED | PR_ATOMIC,
+
+       .pr_usrreqs = &natm_usrreqs
+    },
+    {
+       .pr_type = SOCK_STREAM,
+       .pr_domain = &natmdomain,
+       .pr_protocol = PROTO_NATMAAL0,
+       .pr_flags = PR_CONNREQUIRED,
+
+       .pr_usrreqs = &natm_usrreqs
+    }
 };
 
 static struct domain natmdomain = {