network - Major netmsg retooling, part 1
authorMatthew Dillon <dillon@apollo.backplane.com>
Tue, 14 Sep 2010 23:28:53 +0000 (16:28 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 15 Sep 2010 02:34:59 +0000 (19:34 -0700)
* Remove all the netmsg shims and make all pr_usrreqs and some proto->pr_*
  requests directly netmsg'd.

* Fix issues with tcp implied connects and tcp6->tcp4 fallbacks with
  implied connects.

* Fix an issue with a stack-based udp netmsg (allocate it)

* Consolidate struct ip6protosw and struct protosw into a single
  structure and normalize the API functions which differed between
  the two (primarily proto->pr_input()).

* Remove protosw->pr_soport()

* Replace varargs protocol *_input() functions (ongoing) with fixed
  arguments.

136 files changed:
sys/bus/usb/usb_ethersubr.c
sys/dev/acpica5/acpi_cpu_pstate.c
sys/dev/netif/aue/if_aue.c
sys/kern/kern_poll.c
sys/kern/sys_socket.c
sys/kern/uipc_domain.c
sys/kern/uipc_msg.c
sys/kern/uipc_proto.c
sys/kern/uipc_socket.c
sys/kern/uipc_socket2.c
sys/kern/uipc_syscalls.c
sys/kern/uipc_usrreq.c
sys/net/bpf.c
sys/net/bridge/bridgestp.c
sys/net/bridge/if_bridge.c
sys/net/bridge/if_bridgevar.h
sys/net/dummynet/ip_dummynet.c
sys/net/dummynet/ip_dummynet_glue.c
sys/net/gre/if_gre.c
sys/net/if.c
sys/net/if_ethersubr.c
sys/net/if_poll.c
sys/net/if_var.h
sys/net/ip_mroute/ip_mroute.c
sys/net/ipfw/ip_fw2.c
sys/net/ipfw/ip_fw2_glue.c
sys/net/netisr.c
sys/net/netisr.h
sys/net/netmsg.h
sys/net/netmsg2.h
sys/net/pf/pf.c
sys/net/pfil.c
sys/net/ppp/if_ppp.c
sys/net/raw_cb.h
sys/net/raw_usrreq.c
sys/net/route.c
sys/net/rtsock.c
sys/net/stf/if_stf.c
sys/net/stf/if_stf.h
sys/net/vlan/if_vlan.c
sys/net/vlan/if_vlan_ether.c
sys/net/vlan/if_vlan_ether.h
sys/netbt/bt_input.c
sys/netbt/bt_proto.c
sys/netbt/hci.h
sys/netbt/hci_socket.c
sys/netbt/l2cap.h
sys/netbt/l2cap_socket.c
sys/netbt/rfcomm.h
sys/netbt/rfcomm_socket.c
sys/netbt/sco.h
sys/netbt/sco_socket.c
sys/netgraph/netgraph/ng_base.c
sys/netgraph/socket/ng_socket.c
sys/netinet/if_ether.c
sys/netinet/igmp.c
sys/netinet/igmp_var.h
sys/netinet/in.c
sys/netinet/in_gif.c
sys/netinet/in_gif.h
sys/netinet/in_pcb.c
sys/netinet/in_pcb.h
sys/netinet/in_proto.c
sys/netinet/in_var.h
sys/netinet/ip_carp.c
sys/netinet/ip_carp.h
sys/netinet/ip_demux.c
sys/netinet/ip_divert.c
sys/netinet/ip_divert.h
sys/netinet/ip_encap.c
sys/netinet/ip_encap.h
sys/netinet/ip_flow.c
sys/netinet/ip_gre.c
sys/netinet/ip_gre.h
sys/netinet/ip_icmp.c
sys/netinet/ip_icmp.h
sys/netinet/ip_input.c
sys/netinet/ip_output.c
sys/netinet/ip_var.h
sys/netinet/pim_var.h
sys/netinet/raw_ip.c
sys/netinet/sctp_input.c
sys/netinet/sctp_usrreq.c
sys/netinet/sctp_var.h
sys/netinet/tcp_input.c
sys/netinet/tcp_subr.c
sys/netinet/tcp_syncache.c
sys/netinet/tcp_timer.c
sys/netinet/tcp_timer.h
sys/netinet/tcp_usrreq.c
sys/netinet/tcp_var.h
sys/netinet/udp_usrreq.c
sys/netinet/udp_var.h
sys/netinet6/ah.h
sys/netinet6/ah_input.c
sys/netinet6/esp.h
sys/netinet6/esp6.h
sys/netinet6/esp_input.c
sys/netinet6/icmp6.c
sys/netinet6/in6.c
sys/netinet6/in6_gif.c
sys/netinet6/in6_pcb.c
sys/netinet6/in6_pcb.h
sys/netinet6/in6_proto.c
sys/netinet6/in6_var.h
sys/netinet6/ip6_input.c
sys/netinet6/ip6_output.c
sys/netinet6/ip6_var.h
sys/netinet6/ip6protosw.h
sys/netinet6/ipcomp.h
sys/netinet6/ipcomp_input.c
sys/netinet6/raw_ip6.c
sys/netinet6/sctp6_usrreq.c
sys/netinet6/tcp6_var.h
sys/netinet6/udp6_usrreq.c
sys/netinet6/udp6_var.h
sys/netproto/atalk/aarp.c
sys/netproto/atalk/at_control.c
sys/netproto/atalk/at_extern.h
sys/netproto/atalk/at_proto.c
sys/netproto/atalk/ddp_input.c
sys/netproto/atalk/ddp_usrreq.c
sys/netproto/atm/atm_aal5.c
sys/netproto/atm/atm_proto.c
sys/netproto/atm/atm_subr.c
sys/netproto/atm/atm_usrreq.c
sys/netproto/atm/atm_var.h
sys/netproto/atm/kern_include.h
sys/netproto/ipsec/ipsec6.h
sys/netproto/ipsec/ipsec_input.c
sys/netproto/ipx/ipx_ip.c
sys/netproto/ipx/ipx_ip.h
sys/netproto/key/keysock.c
sys/sys/protosw.h
sys/sys/socketops.h
sys/sys/un.h

index c284b98..3d0dfbc 100644 (file)
@@ -75,9 +75,9 @@
 static int netisr_inited = 0;
 
 static void
-usbintr(struct netmsg *msg)
+usbintr(netmsg_t msg)
 {
-       struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet;
+       struct mbuf *m = msg->packet.nm_packet;
        struct ifnet *ifp;
 
        /* not MPSAFE */
index dd155a9..6fcf086 100644 (file)
@@ -68,8 +68,7 @@ struct acpi_pst_softc;
 LIST_HEAD(acpi_pst_list, acpi_pst_softc);
 
 struct netmsg_acpi_pst {
-       struct netmsg   nmsg;
-
+       struct netmsg_base base;
        const struct acpi_pst_res *ctrl;
        const struct acpi_pst_res *status;
 };
@@ -133,11 +132,11 @@ static const struct acpi_pstate *
 static int     acpi_pst_alloc_resource(device_t, ACPI_OBJECT *, int,
                    struct acpi_pst_res *);
 
-static void    acpi_pst_check_csr_handler(struct netmsg *);
-static void    acpi_pst_check_pstates_handler(struct netmsg *);
-static void    acpi_pst_init_handler(struct netmsg *);
-static void    acpi_pst_set_pstate_handler(struct netmsg *);
-static void    acpi_pst_get_pstate_handler(struct netmsg *);
+static void    acpi_pst_check_csr_handler(netmsg_t);
+static void    acpi_pst_check_pstates_handler(netmsg_t);
+static void    acpi_pst_init_handler(netmsg_t);
+static void    acpi_pst_set_pstate_handler(netmsg_t);
+static void    acpi_pst_get_pstate_handler(netmsg_t);
 
 static int     acpi_pst_sysctl_freqs(SYSCTL_HANDLER_ARGS);
 static int     acpi_pst_sysctl_members(SYSCTL_HANDLER_ARGS);
@@ -944,13 +943,13 @@ acpi_pst_sysctl_global(SYSCTL_HANDLER_ARGS)
 }
 
 static void
-acpi_pst_check_csr_handler(struct netmsg *nmsg)
+acpi_pst_check_csr_handler(netmsg_t msg)
 {
-       struct netmsg_acpi_pst *msg = (struct netmsg_acpi_pst *)nmsg;
+       struct netmsg_acpi_pst *rmsg = (struct netmsg_acpi_pst *)msg;
        int error;
 
-       error = acpi_pst_md->pmd_check_csr(msg->ctrl, msg->status);
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       error = acpi_pst_md->pmd_check_csr(rmsg->ctrl, rmsg->status);
+       lwkt_replymsg(&rmsg->base.lmsg, error);
 }
 
 static int
@@ -961,45 +960,45 @@ acpi_pst_check_csr(struct acpi_pst_softc *sc)
        if (acpi_pst_md == NULL)
                return 0;
 
-       netmsg_init(&msg.nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                    MSGF_PRIORITY, acpi_pst_check_csr_handler);
        msg.ctrl = &sc->pst_creg;
        msg.status = &sc->pst_sreg;
 
-       return lwkt_domsg(cpu_portfn(sc->pst_cpuid), &msg.nmsg.nm_lmsg, 0);
+       return lwkt_domsg(cpu_portfn(sc->pst_cpuid), &msg.base.lmsg, 0);
 }
 
 static void
-acpi_pst_check_pstates_handler(struct netmsg *nmsg)
+acpi_pst_check_pstates_handler(netmsg_t msg)
 {
        int error;
 
        error = acpi_pst_md->pmd_check_pstates(acpi_pstates, acpi_npstates);
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 static int
 acpi_pst_check_pstates(struct acpi_pst_softc *sc)
 {
-       struct netmsg nmsg;
+       struct netmsg_base msg;
 
        if (acpi_pst_md == NULL)
                return 0;
 
-       netmsg_init(&nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg, NULL, &curthread->td_msgport,
                    MSGF_PRIORITY, acpi_pst_check_pstates_handler);
 
-       return lwkt_domsg(cpu_portfn(sc->pst_cpuid), &nmsg.nm_lmsg, 0);
+       return lwkt_domsg(cpu_portfn(sc->pst_cpuid), &msg.lmsg, 0);
 }
 
 static void
-acpi_pst_init_handler(struct netmsg *nmsg)
+acpi_pst_init_handler(netmsg_t msg)
 {
-       struct netmsg_acpi_pst *msg = (struct netmsg_acpi_pst *)nmsg;
+       struct netmsg_acpi_pst *rmsg = (struct netmsg_acpi_pst *)msg;
        int error;
 
-       error = acpi_pst_md->pmd_init(msg->ctrl, msg->status);
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       error = acpi_pst_md->pmd_init(rmsg->ctrl, rmsg->status);
+       lwkt_replymsg(&rmsg->base.lmsg, error);
 }
 
 static int
@@ -1010,23 +1009,23 @@ acpi_pst_init(struct acpi_pst_softc *sc)
        if (acpi_pst_md == NULL)
                return 0;
 
-       netmsg_init(&msg.nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                    MSGF_PRIORITY, acpi_pst_init_handler);
        msg.ctrl = &sc->pst_creg;
        msg.status = &sc->pst_sreg;
 
-       return lwkt_domsg(cpu_portfn(sc->pst_cpuid), &msg.nmsg.nm_lmsg, 0);
+       return lwkt_domsg(cpu_portfn(sc->pst_cpuid), &msg.base.lmsg, 0);
 }
 
 static void
-acpi_pst_set_pstate_handler(struct netmsg *nmsg)
+acpi_pst_set_pstate_handler(netmsg_t msg)
 {
-       struct netmsg_acpi_pst *msg = (struct netmsg_acpi_pst *)nmsg;
+       struct netmsg_acpi_pst *rmsg = (struct netmsg_acpi_pst *)msg;
        int error;
 
-       error = acpi_pst_md->pmd_set_pstate(msg->ctrl, msg->status,
-                                           nmsg->nm_lmsg.u.ms_resultp);
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       error = acpi_pst_md->pmd_set_pstate(rmsg->ctrl, rmsg->status,
+                                           rmsg->base.lmsg.u.ms_resultp);
+       lwkt_replymsg(&rmsg->base.lmsg, error);
 }
 
 static int
@@ -1036,25 +1035,25 @@ acpi_pst_set_pstate(struct acpi_pst_softc *sc, const struct acpi_pstate *pstate)
 
        KKASSERT(acpi_pst_md != NULL);
 
-       netmsg_init(&msg.nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                    MSGF_PRIORITY, acpi_pst_set_pstate_handler);
-       msg.nmsg.nm_lmsg.u.ms_resultp = __DECONST(void *, pstate);
+       msg.base.lmsg.u.ms_resultp = __DECONST(void *, pstate);
        msg.ctrl = &sc->pst_creg;
        msg.status = &sc->pst_sreg;
 
-       return lwkt_domsg(cpu_portfn(sc->pst_cpuid), &msg.nmsg.nm_lmsg, 0);
+       return lwkt_domsg(cpu_portfn(sc->pst_cpuid), &msg.base.lmsg, 0);
 }
 
 static void
-acpi_pst_get_pstate_handler(struct netmsg *nmsg)
+acpi_pst_get_pstate_handler(netmsg_t msg)
 {
-       struct netmsg_acpi_pst *msg = (struct netmsg_acpi_pst *)nmsg;
+       struct netmsg_acpi_pst *rmsg = (struct netmsg_acpi_pst *)msg;
        const struct acpi_pstate *pstate;
 
-       pstate = acpi_pst_md->pmd_get_pstate(msg->status, acpi_pstates,
+       pstate = acpi_pst_md->pmd_get_pstate(rmsg->status, acpi_pstates,
                                             acpi_npstates);
-       nmsg->nm_lmsg.u.ms_resultp = __DECONST(void *, pstate);
-       lwkt_replymsg(&nmsg->nm_lmsg, 0);
+       rmsg->base.lmsg.u.ms_resultp = __DECONST(void *, pstate);
+       lwkt_replymsg(&rmsg->base.lmsg, 0);
 }
 
 static const struct acpi_pstate *
@@ -1065,12 +1064,12 @@ acpi_pst_get_pstate(struct acpi_pst_softc *sc)
        if (acpi_pst_md == NULL)
                return 0;
 
-       netmsg_init(&msg.nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                    MSGF_PRIORITY, acpi_pst_get_pstate_handler);
        msg.status = &sc->pst_sreg;
 
-       lwkt_domsg(cpu_portfn(sc->pst_cpuid), &msg.nmsg.nm_lmsg, 0);
-       return msg.nmsg.nm_lmsg.u.ms_resultp;
+       lwkt_domsg(cpu_portfn(sc->pst_cpuid), &msg.base.lmsg, 0);
+       return msg.base.lmsg.u.ms_resultp;
 }
 
 static int
index f424d56..a3ae47b 100644 (file)
@@ -971,7 +971,7 @@ static void
 aue_start_ipifunc(void *arg)
 {
        struct ifnet *ifp = arg;
-       struct lwkt_msg *lmsg = &ifp->if_start_nmsg[mycpuid].nm_lmsg;
+       struct lwkt_msg *lmsg = &ifp->if_start_nmsg[mycpuid].lmsg;
 
        crit_enter();
        if (lmsg->ms_flags & MSGF_DONE)
index 97a983e..a627bb1 100644 (file)
@@ -136,8 +136,8 @@ struct pollctx {
        int                     polling_enabled;        /* tunable */
        int                     pollhz;                 /* tunable */
 
-       struct netmsg           poll_netmsg;
-       struct netmsg           poll_more_netmsg;
+       struct netmsg_base      poll_netmsg;
+       struct netmsg_base      poll_more_netmsg;
 };
 
 static struct pollctx  *poll_context[POLLCTX_MAX];
@@ -169,15 +169,15 @@ static int        poll_each_burst = POLL_EACH_BURST;
 TUNABLE_INT("kern.polling.each_burst", &poll_each_burst);
 
 /* Netisr handlers */
-static void    netisr_poll(struct netmsg *);
-static void    netisr_pollmore(struct netmsg *);
-static void    poll_register(struct netmsg *);
-static void    poll_deregister(struct netmsg *);
-static void    poll_sysctl_pollhz(struct netmsg *);
-static void    poll_sysctl_polling(struct netmsg *);
-static void    poll_sysctl_regfrac(struct netmsg *);
-static void    poll_sysctl_burstmax(struct netmsg *);
-static void    poll_sysctl_eachburst(struct netmsg *);
+static void    netisr_poll(netmsg_t);
+static void    netisr_pollmore(netmsg_t);
+static void    poll_register(netmsg_t);
+static void    poll_deregister(netmsg_t);
+static void    poll_sysctl_pollhz(netmsg_t);
+static void    poll_sysctl_polling(netmsg_t);
+static void    poll_sysctl_regfrac(netmsg_t);
+static void    poll_sysctl_burstmax(netmsg_t);
+static void    poll_sysctl_eachburst(netmsg_t);
 
 /* Systimer handler */
 static void    pollclock(systimer_t, struct intrframe *);
@@ -191,8 +191,6 @@ static int  sysctl_eachburst(SYSCTL_HANDLER_ARGS);
 static void    poll_add_sysctl(struct sysctl_ctx_list *,
                                struct sysctl_oid_list *, struct pollctx *);
 
-static void    schedpoll_oncpu(struct netmsg *);
-
 void           init_device_poll_pcpu(int);     /* per-cpu init routine */
 
 #define POLL_KTR_STRING                "ifp=%p"
@@ -260,13 +258,13 @@ init_device_poll_pcpu(int cpuid)
        netmsg_init(&pctx->poll_netmsg, NULL, &netisr_adone_rport,
                    0, netisr_poll);
 #ifdef INVARIANTS
-       pctx->poll_netmsg.nm_lmsg.u.ms_resultp = pctx;
+       pctx->poll_netmsg.lmsg.u.ms_resultp = pctx;
 #endif
 
        netmsg_init(&pctx->poll_more_netmsg, NULL, &netisr_adone_rport,
                    0, netisr_pollmore);
 #ifdef INVARIANTS
-       pctx->poll_more_netmsg.nm_lmsg.u.ms_resultp = pctx;
+       pctx->poll_more_netmsg.lmsg.u.ms_resultp = pctx;
 #endif
 
        KASSERT(cpuid < POLLCTX_MAX, ("cpu id must < %d", cpuid));
@@ -301,24 +299,24 @@ init_device_poll_pcpu(int cpuid)
 }
 
 static void
-schedpoll_oncpu(struct netmsg *msg)
+schedpoll_oncpu(netmsg_t msg)
 {
-       if (msg->nm_lmsg.ms_flags & MSGF_DONE)
-               lwkt_sendmsg(cpu_portfn(mycpuid), &msg->nm_lmsg);
+       if (msg->lmsg.ms_flags & MSGF_DONE)
+               lwkt_sendmsg(cpu_portfn(mycpuid), &msg->lmsg);
 }
 
 static __inline void
 schedpoll(struct pollctx *pctx)
 {
        crit_enter();
-       schedpoll_oncpu(&pctx->poll_netmsg);
+       schedpoll_oncpu((netmsg_t)&pctx->poll_netmsg);
        crit_exit();
 }
 
 static __inline void
 schedpollmore(struct pollctx *pctx)
 {
-       schedpoll_oncpu(&pctx->poll_more_netmsg);
+       schedpoll_oncpu((netmsg_t)&pctx->poll_more_netmsg);
 }
 
 /*
@@ -328,7 +326,7 @@ static int
 sysctl_pollhz(SYSCTL_HANDLER_ARGS)
 {
        struct pollctx *pctx = arg1;
-       struct netmsg msg;
+       struct netmsg_base msg;
        lwkt_port_t port;
        int error, phz;
 
@@ -343,10 +341,10 @@ sysctl_pollhz(SYSCTL_HANDLER_ARGS)
 
        netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, poll_sysctl_pollhz);
-       msg.nm_lmsg.u.ms_result = phz;
+       msg.lmsg.u.ms_result = phz;
 
        port = cpu_portfn(pctx->poll_cpuid);
-       lwkt_domsg(port, &msg.nm_lmsg, 0);
+       lwkt_domsg(port, &msg.lmsg, 0);
        return 0;
 }
 
@@ -357,7 +355,7 @@ static int
 sysctl_polling(SYSCTL_HANDLER_ARGS)
 {
        struct pollctx *pctx = arg1;
-       struct netmsg msg;
+       struct netmsg_base msg;
        lwkt_port_t port;
        int error, enabled;
 
@@ -368,10 +366,10 @@ sysctl_polling(SYSCTL_HANDLER_ARGS)
 
        netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, poll_sysctl_polling);
-       msg.nm_lmsg.u.ms_result = enabled;
+       msg.lmsg.u.ms_result = enabled;
 
        port = cpu_portfn(pctx->poll_cpuid);
-       lwkt_domsg(port, &msg.nm_lmsg, 0);
+       lwkt_domsg(port, &msg.lmsg, 0);
        return 0;
 }
 
@@ -379,7 +377,7 @@ static int
 sysctl_regfrac(SYSCTL_HANDLER_ARGS)
 {
        struct pollctx *pctx = arg1;
-       struct netmsg msg;
+       struct netmsg_base msg;
        lwkt_port_t port;
        uint32_t reg_frac;
        int error;
@@ -391,10 +389,10 @@ sysctl_regfrac(SYSCTL_HANDLER_ARGS)
 
        netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, poll_sysctl_regfrac);
-       msg.nm_lmsg.u.ms_result = reg_frac;
+       msg.lmsg.u.ms_result = reg_frac;
 
        port = cpu_portfn(pctx->poll_cpuid);
-       lwkt_domsg(port, &msg.nm_lmsg, 0);
+       lwkt_domsg(port, &msg.lmsg, 0);
        return 0;
 }
 
@@ -402,7 +400,7 @@ static int
 sysctl_burstmax(SYSCTL_HANDLER_ARGS)
 {
        struct pollctx *pctx = arg1;
-       struct netmsg msg;
+       struct netmsg_base msg;
        lwkt_port_t port;
        uint32_t burst_max;
        int error;
@@ -418,10 +416,10 @@ sysctl_burstmax(SYSCTL_HANDLER_ARGS)
 
        netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, poll_sysctl_burstmax);
-       msg.nm_lmsg.u.ms_result = burst_max;
+       msg.lmsg.u.ms_result = burst_max;
 
        port = cpu_portfn(pctx->poll_cpuid);
-       lwkt_domsg(port, &msg.nm_lmsg, 0);
+       lwkt_domsg(port, &msg.lmsg, 0);
        return 0;
 }
 
@@ -429,7 +427,7 @@ static int
 sysctl_eachburst(SYSCTL_HANDLER_ARGS)
 {
        struct pollctx *pctx = arg1;
-       struct netmsg msg;
+       struct netmsg_base msg;
        lwkt_port_t port;
        uint32_t each_burst;
        int error;
@@ -441,10 +439,10 @@ sysctl_eachburst(SYSCTL_HANDLER_ARGS)
 
        netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, poll_sysctl_eachburst);
-       msg.nm_lmsg.u.ms_result = each_burst;
+       msg.lmsg.u.ms_result = each_burst;
 
        port = cpu_portfn(pctx->poll_cpuid);
-       lwkt_domsg(port, &msg.nm_lmsg, 0);
+       lwkt_domsg(port, &msg.lmsg, 0);
        return 0;
 }
 
@@ -518,7 +516,7 @@ pollclock(systimer_t info, struct intrframe *frame __unused)
 
 /* ARGSUSED */
 static void
-netisr_pollmore(struct netmsg *msg)
+netisr_pollmore(netmsg_t msg)
 {
        struct pollctx *pctx;
        struct timeval t;
@@ -531,9 +529,9 @@ netisr_pollmore(struct netmsg *msg)
        pctx = poll_context[cpuid];
        KKASSERT(pctx != NULL);
        KKASSERT(pctx->poll_cpuid == cpuid);
-       KKASSERT(pctx == msg->nm_lmsg.u.ms_resultp);
+       KKASSERT(pctx == msg->lmsg.u.ms_resultp);
 
-       lwkt_replymsg(&msg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
 
        if (pctx->poll_handlers == 0)
                return;
@@ -594,7 +592,7 @@ netisr_pollmore(struct netmsg *msg)
  */
 /* ARGSUSED */
 static void
-netisr_poll(struct netmsg *msg)
+netisr_poll(netmsg_t msg)
 {
        struct pollctx *pctx;
        int i, cycles, cpuid;
@@ -606,10 +604,10 @@ netisr_poll(struct netmsg *msg)
        pctx = poll_context[cpuid];
        KKASSERT(pctx != NULL);
        KKASSERT(pctx->poll_cpuid == cpuid);
-       KKASSERT(pctx == msg->nm_lmsg.u.ms_resultp);
+       KKASSERT(pctx == msg->lmsg.u.ms_resultp);
 
        crit_enter();
-       lwkt_replymsg(&msg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
        crit_exit();
 
        if (pctx->poll_handlers == 0)
@@ -657,9 +655,9 @@ netisr_poll(struct netmsg *msg)
 }
 
 static void
-poll_register(struct netmsg *msg)
+poll_register(netmsg_t msg)
 {
-       struct ifnet *ifp = msg->nm_lmsg.u.ms_resultp;
+       struct ifnet *ifp = msg->lmsg.u.ms_resultp;
        struct pollctx *pctx;
        int rc, cpuid;
 
@@ -706,7 +704,7 @@ poll_register(struct netmsg *msg)
                }
        }
 back:
-       lwkt_replymsg(&msg->nm_lmsg, rc);
+       lwkt_replymsg(&msg->lmsg, rc);
 }
 
 /*
@@ -728,7 +726,7 @@ ether_poll_register(struct ifnet *ifp)
 int
 ether_pollcpu_register(struct ifnet *ifp, int cpuid)
 {
-       struct netmsg msg;
+       struct netmsg_base msg;
        lwkt_port_t port;
        int rc;
 
@@ -768,12 +766,12 @@ ether_pollcpu_register(struct ifnet *ifp, int cpuid)
 
        netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, poll_register);
-       msg.nm_lmsg.u.ms_resultp = ifp;
+       msg.lmsg.u.ms_resultp = ifp;
 
        port = cpu_portfn(cpuid);
-       lwkt_domsg(port, &msg.nm_lmsg, 0);
+       lwkt_domsg(port, &msg.lmsg, 0);
 
-       if (msg.nm_lmsg.ms_error) {
+       if (msg.lmsg.ms_error) {
                ifnet_serialize_all(ifp);
                ifp->if_flags &= ~IFF_POLLING;
                ifp->if_poll_cpuid = -1;
@@ -790,9 +788,9 @@ ether_pollcpu_register(struct ifnet *ifp, int cpuid)
 }
 
 static void
-poll_deregister(struct netmsg *msg)
+poll_deregister(netmsg_t msg)
 {
-       struct ifnet *ifp = msg->nm_lmsg.u.ms_resultp;
+       struct ifnet *ifp = msg->lmsg.u.ms_resultp;
        struct pollctx *pctx;
        int rc, i, cpuid;
 
@@ -823,7 +821,7 @@ poll_deregister(struct netmsg *msg)
                }
                rc = 0;
        }
-       lwkt_replymsg(&msg->nm_lmsg, rc);
+       lwkt_replymsg(&msg->lmsg, rc);
 }
 
 /*
@@ -833,7 +831,7 @@ poll_deregister(struct netmsg *msg)
 int
 ether_poll_deregister(struct ifnet *ifp)
 {
-       struct netmsg msg;
+       struct netmsg_base msg;
        lwkt_port_t port;
        int rc, cpuid;
 
@@ -862,12 +860,12 @@ ether_poll_deregister(struct ifnet *ifp)
 
        netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, poll_deregister);
-       msg.nm_lmsg.u.ms_resultp = ifp;
+       msg.lmsg.u.ms_resultp = ifp;
 
        port = cpu_portfn(cpuid);
-       lwkt_domsg(port, &msg.nm_lmsg, 0);
+       lwkt_domsg(port, &msg.lmsg, 0);
 
-       if (!msg.nm_lmsg.ms_error) {
+       if (!msg.lmsg.ms_error) {
                ifnet_serialize_all(ifp);
                if (ifp->if_flags & IFF_RUNNING)
                        ifp->if_poll(ifp, POLL_DEREGISTER, 1);
@@ -942,7 +940,7 @@ poll_add_sysctl(struct sysctl_ctx_list *ctx, struct sysctl_oid_list *parent,
 }
 
 static void
-poll_sysctl_pollhz(struct netmsg *msg)
+poll_sysctl_pollhz(netmsg_t msg)
 {
        struct pollctx *pctx;
        int cpuid;
@@ -960,7 +958,7 @@ poll_sysctl_pollhz(struct netmsg *msg)
         * Polling systimer frequency will be adjusted once polling
         * is enabled and there are registered devices.
         */
-       pctx->pollhz = msg->nm_lmsg.u.ms_result;
+       pctx->pollhz = msg->lmsg.u.ms_result;
        if (pctx->polling_enabled && pctx->poll_handlers)
                systimer_adjust_periodic(&pctx->pollclock, pctx->pollhz);
 
@@ -973,11 +971,11 @@ poll_sysctl_pollhz(struct netmsg *msg)
                        pctx->reg_frac_count = pctx->reg_frac - 1;
        }
 
-       lwkt_replymsg(&msg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
 static void
-poll_sysctl_polling(struct netmsg *msg)
+poll_sysctl_polling(netmsg_t msg)
 {
        struct pollctx *pctx;
        int cpuid;
@@ -993,7 +991,7 @@ poll_sysctl_polling(struct netmsg *msg)
         * If polling is disabled or there is no device registered,
         * cut the polling systimer frequency to 1hz.
         */
-       pctx->polling_enabled = msg->nm_lmsg.u.ms_result;
+       pctx->polling_enabled = msg->lmsg.u.ms_result;
        if (pctx->polling_enabled && pctx->poll_handlers) {
                systimer_adjust_periodic(&pctx->pollclock, pctx->pollhz);
        } else {
@@ -1030,11 +1028,11 @@ poll_sysctl_polling(struct netmsg *msg)
                pctx->poll_handlers = 0;
        }
 
-       lwkt_replymsg(&msg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
 static void
-poll_sysctl_regfrac(struct netmsg *msg)
+poll_sysctl_regfrac(netmsg_t msg)
 {
        struct pollctx *pctx;
        uint32_t reg_frac;
@@ -1047,7 +1045,7 @@ poll_sysctl_regfrac(struct netmsg *msg)
        KKASSERT(pctx != NULL);
        KKASSERT(pctx->poll_cpuid == cpuid);
 
-       reg_frac = msg->nm_lmsg.u.ms_result;
+       reg_frac = msg->lmsg.u.ms_result;
        if (reg_frac > pctx->pollhz)
                reg_frac = pctx->pollhz;
        else if (reg_frac < 1)
@@ -1057,11 +1055,11 @@ poll_sysctl_regfrac(struct netmsg *msg)
        if (pctx->reg_frac_count > pctx->reg_frac)
                pctx->reg_frac_count = pctx->reg_frac - 1;
 
-       lwkt_replymsg(&msg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
 static void
-poll_sysctl_burstmax(struct netmsg *msg)
+poll_sysctl_burstmax(netmsg_t msg)
 {
        struct pollctx *pctx;
        int cpuid;
@@ -1073,7 +1071,7 @@ poll_sysctl_burstmax(struct netmsg *msg)
        KKASSERT(pctx != NULL);
        KKASSERT(pctx->poll_cpuid == cpuid);
 
-       pctx->poll_burst_max = msg->nm_lmsg.u.ms_result;
+       pctx->poll_burst_max = msg->lmsg.u.ms_result;
        if (pctx->poll_each_burst > pctx->poll_burst_max)
                pctx->poll_each_burst = pctx->poll_burst_max;
        if (pctx->poll_burst > pctx->poll_burst_max)
@@ -1081,11 +1079,11 @@ poll_sysctl_burstmax(struct netmsg *msg)
        if (pctx->residual_burst > pctx->poll_burst_max)
                pctx->residual_burst = pctx->poll_burst_max;
 
-       lwkt_replymsg(&msg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
 static void
-poll_sysctl_eachburst(struct netmsg *msg)
+poll_sysctl_eachburst(netmsg_t msg)
 {
        struct pollctx *pctx;
        uint32_t each_burst;
@@ -1098,12 +1096,12 @@ poll_sysctl_eachburst(struct netmsg *msg)
        KKASSERT(pctx != NULL);
        KKASSERT(pctx->poll_cpuid == cpuid);
 
-       each_burst = msg->nm_lmsg.u.ms_result;
+       each_burst = msg->lmsg.u.ms_result;
        if (each_burst > pctx->poll_burst_max)
                each_burst = pctx->poll_burst_max;
        else if (each_burst < 1)
                each_burst = 1;
        pctx->poll_each_burst = each_burst;
 
-       lwkt_replymsg(&msg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
 }
index 92527aa..504234c 100644 (file)
@@ -175,12 +175,13 @@ soo_ioctl(struct file *fp, u_long cmd, caddr_t data,
                 * interface and routing ioctls should have a
                 * different entry since a socket's unnecessary
                 */
-               if (IOCGROUP(cmd) == 'i')
+               if (IOCGROUP(cmd) == 'i') {
                        error = ifioctl(so, cmd, data, cred);
-               else if (IOCGROUP(cmd) == 'r')
+               } else if (IOCGROUP(cmd) == 'r') {
                        error = rtioctl(cmd, data, cred);
-               else
-                       error = so_pru_control(so, cmd, data, NULL);
+               } else {
+                       error = so_pru_control_direct(so, cmd, data, NULL);
+               }
                break;
        }
        rel_mplock();
index 7fd6efc..a0555c4 100644 (file)
@@ -78,12 +78,13 @@ static struct callout pfslowtimo_ch;
  * Note: you cant unload it again because a socket may be using it.
  * XXX can't fail at this time.
  */
+#define PR_NOTSUPP(pr, label)          \
+       if (pr->pr_ ## label == NULL)   \
+               pr->pr_ ## label = pr_generic_notsupp;
+
 #define PRU_NOTSUPP(pu, label)         \
        if (pu->pru_ ## label == NULL)  \
-               pu->pru_ ## label = pru_ ## label ## _notsupp;
-#define PRU_NULL(pu, label)            \
-       if (pu->pru_ ## label == NULL)  \
-               pu->pru_ ## label = pru_ ## label ## _null;
+               pu->pru_ ## label = pr_generic_notsupp;
 
 static void
 net_init_domain(struct domain *dp)
@@ -92,13 +93,17 @@ net_init_domain(struct domain *dp)
        struct pr_usrreqs *pu;
 
        crit_enter();
+
        if (dp->dom_init)
                (*dp->dom_init)();
+
        for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
                pu = pr->pr_usrreqs;
-               if (pu == NULL)
+               if (pu == NULL) {
                        panic("domaininit: %ssw[%ld] has no usrreqs!",
                              dp->dom_name, (long)(pr - dp->dom_protosw));
+               }
+               PR_NOTSUPP(pr, ctloutput);
                PRU_NOTSUPP(pu, accept);
                PRU_NOTSUPP(pu, bind);
                PRU_NOTSUPP(pu, connect);
@@ -109,12 +114,15 @@ net_init_domain(struct domain *dp)
                PRU_NOTSUPP(pu, peeraddr);
                PRU_NOTSUPP(pu, rcvd);
                PRU_NOTSUPP(pu, rcvoob);
-               PRU_NULL(pu, sense);
                PRU_NOTSUPP(pu, shutdown);
                PRU_NOTSUPP(pu, sockaddr);
-               PRU_NOTSUPP(pu, sosend);
-               PRU_NOTSUPP(pu, soreceive);
-               PRU_NOTSUPP(pu, ctloutput);
+
+               if (pu->pru_sense == NULL)
+                       pu->pru_sense = pru_sense_null;
+               if (pu->pru_sosend == NULL)
+                       pu->pru_sosend = pru_sosend_notsupp;
+               if (pu->pru_soreceive == NULL)
+                       pu->pru_soreceive = pru_soreceive_notsupp;
 
                if (pr->pr_init)
                        (*pr->pr_init)();
index 1c9e786..61a4cc2 100644 (file)
@@ -58,10 +58,9 @@ so_pru_abort(struct socket *so)
 {
        struct netmsg_pru_abort msg;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_abort);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_abort;
-       (void)lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_abort);
+       (void)lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
 }
 
 /*
@@ -74,10 +73,9 @@ so_pru_aborta(struct socket *so)
        struct netmsg_pru_abort *msg;
 
        msg = kmalloc(sizeof(*msg), M_LWKTMSG, M_WAITOK | M_ZERO);
-       netmsg_init(&msg->nm_netmsg, so, &netisr_afree_rport,
-                   0, netmsg_pru_abort);
-       msg->nm_prufn = so->so_proto->pr_usrreqs->pru_abort;
-       lwkt_sendmsg(so->so_port, &msg->nm_netmsg.nm_lmsg);
+       netmsg_init(&msg->base, so, &netisr_afree_rport,
+                   0, so->so_proto->pr_usrreqs->pru_abort);
+       lwkt_sendmsg(so->so_port, &msg->base.lmsg);
 }
 
 /*
@@ -87,286 +85,278 @@ so_pru_aborta(struct socket *so)
 void
 so_pru_abort_oncpu(struct socket *so)
 {
-       so->so_proto->pr_usrreqs->pru_abort(so);
+       struct netmsg_pru_abort msg;
+       netisr_fn_t func = so->so_proto->pr_usrreqs->pru_abort;
+
+       netmsg_init(&msg.base, so, &netisr_adone_rport, 0, func);
+       msg.base.lmsg.ms_flags &= ~(MSGF_REPLY | MSGF_DONE);
+       msg.base.lmsg.ms_flags |= MSGF_SYNC;
+       func((netmsg_t)&msg);
 }
 
+/*
+ * WARNING!  Synchronous call from user context
+ */
 int
-so_pru_accept(struct socket *so, struct sockaddr **nam)
+so_pru_accept_direct(struct socket *so, struct sockaddr **nam)
 {
-       /* Block (memory allocation) in process context. XXX JH */
-       return ((*so->so_proto->pr_usrreqs->pru_accept)(so, nam));
-
-#ifdef notdef
-       int error;
        struct netmsg_pru_accept msg;
+       netisr_fn_t func = so->so_proto->pr_usrreqs->pru_accept;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_accept);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_accept;
+       netmsg_init(&msg.base, so, &netisr_adone_rport, 0, func);
+       msg.base.lmsg.ms_flags &= ~(MSGF_REPLY | MSGF_DONE);
+       msg.base.lmsg.ms_flags |= MSGF_SYNC;
        msg.nm_nam = nam;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
-       return (error);
-#endif
+       func((netmsg_t)&msg);
+       return(msg.base.lmsg.ms_error);
 }
 
 int
 so_pru_attach(struct socket *so, int proto, struct pru_attach_info *ai)
 {
-       int error;
        struct netmsg_pru_attach msg;
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_attach);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_attach;
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_attach);
        msg.nm_proto = proto;
        msg.nm_ai = ai;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
+int
+so_pru_attach_direct(struct socket *so, int proto, struct pru_attach_info *ai)
+{
+       struct netmsg_pru_attach msg;
+       netisr_fn_t func = so->so_proto->pr_usrreqs->pru_attach;
+
+       netmsg_init(&msg.base, so, &netisr_adone_rport, 0, func);
+       msg.base.lmsg.ms_flags &= ~(MSGF_REPLY | MSGF_DONE);
+       msg.base.lmsg.ms_flags |= MSGF_SYNC;
+       msg.nm_proto = proto;
+       msg.nm_ai = ai;
+       func((netmsg_t)&msg);
+       return(msg.base.lmsg.ms_error);
+}
+
 /*
  * NOTE: If the target port changes the bind operation will deal with it.
  */
 int
 so_pru_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
-       int error;
        struct netmsg_pru_bind msg;
+       int error;
 
-#if 0
-       port = so->so_proto->pr_mport(NULL, nam, NULL);
-#endif
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_bind);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_bind;
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_bind);
        msg.nm_nam = nam;
-       msg.nm_td = td;         /* used only for prison_ip() XXX JH */
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       msg.nm_td = td;         /* used only for prison_ip() */
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
 int
 so_pru_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
-       int error;
        struct netmsg_pru_connect msg;
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_connect);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_connect;
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_connect);
        msg.nm_nam = nam;
        msg.nm_td = td;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       msg.nm_m = NULL;
+       msg.nm_flags = 0;
+       msg.nm_reconnect = 0;
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
 int
 so_pru_connect2(struct socket *so1, struct socket *so2)
 {
-       int error;
        struct netmsg_pru_connect2 msg;
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so1, &curthread->td_msgport,
-                   0, netmsg_pru_connect2);
-       msg.nm_prufn = so1->so_proto->pr_usrreqs->pru_connect2;
+       netmsg_init(&msg.base, so1, &curthread->td_msgport,
+                   0, so1->so_proto->pr_usrreqs->pru_connect2);
        msg.nm_so1 = so1;
        msg.nm_so2 = so2;
-       error = lwkt_domsg(so1->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       error = lwkt_domsg(so1->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
+/*
+ * WARNING!  Synchronous call from user context.  Control function may do
+ *          copyin/copyout.
+ */
 int
-so_pru_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp)
+so_pru_control_direct(struct socket *so, u_long cmd, caddr_t data,
+                     struct ifnet *ifp)
 {
-       return ((*so->so_proto->pr_usrreqs->pru_control)(
-                       so, cmd, data, ifp, curthread));
-#ifdef gag     /* does copyin and copyout deep inside stack XXX JH */
-       int error;
        struct netmsg_pru_control msg;
+       netisr_fn_t func = so->so_proto->pr_usrreqs->pru_control;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_control);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_control;
+       netmsg_init(&msg.base, so, &netisr_adone_rport, 0, func);
+       msg.base.lmsg.ms_flags &= ~(MSGF_REPLY | MSGF_DONE);
+       msg.base.lmsg.ms_flags |= MSGF_SYNC;
        msg.nm_cmd = cmd;
        msg.nm_data = data;
        msg.nm_ifp = ifp;
-       msg.nm_td = td;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
-       return (error);
-#endif
+       msg.nm_td = curthread;
+       func((netmsg_t)&msg);
+       return(msg.base.lmsg.ms_error);
 }
 
 int
 so_pru_detach(struct socket *so)
 {
-       int error;
        struct netmsg_pru_detach msg;
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_detach);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_detach;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_detach);
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
 int
 so_pru_disconnect(struct socket *so)
 {
-       int error;
        struct netmsg_pru_disconnect msg;
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_disconnect);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_disconnect;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_disconnect);
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
 int
 so_pru_listen(struct socket *so, struct thread *td)
 {
-       int error;
        struct netmsg_pru_listen msg;
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_listen);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_listen;
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_listen);
        msg.nm_td = td;         /* used only for prison_ip() XXX JH */
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
 int
 so_pru_peeraddr(struct socket *so, struct sockaddr **nam)
 {
-       int error;
        struct netmsg_pru_peeraddr msg;
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_peeraddr);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_peeraddr;
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_peeraddr);
        msg.nm_nam = nam;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
 int
 so_pru_rcvd(struct socket *so, int flags)
 {
-       int error;
        struct netmsg_pru_rcvd msg;
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_rcvd);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_rcvd;
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_rcvd);
        msg.nm_flags = flags;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
 int
 so_pru_rcvoob(struct socket *so, struct mbuf *m, int flags)
 {
-       int error;
        struct netmsg_pru_rcvoob msg;
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_rcvoob);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_rcvoob;
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_rcvoob);
        msg.nm_m = m;
        msg.nm_flags = flags;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
 /*
- * NOTE: so_pru_send() is the only code which uses pr_mport() now.
- *
  * NOTE: If the target port changes the implied connect will deal with it.
  */
 int
 so_pru_send(struct socket *so, int flags, struct mbuf *m,
            struct sockaddr *addr, struct mbuf *control, struct thread *td)
 {
-       int error;
        struct netmsg_pru_send msg;
-       lwkt_port_t port;
-
-       port = so->so_proto->pr_mport(so, addr, &m);
-       if (port == NULL) {
-               KKASSERT(m == NULL);
-               return EINVAL;
-       }
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_send);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_send;
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_send);
        msg.nm_flags = flags;
        msg.nm_m = m;
        msg.nm_addr = addr;
        msg.nm_control = control;
        msg.nm_td = td;
-       error = lwkt_domsg(port, &msg.nm_netmsg.nm_lmsg, 0);
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
-/*
- * MPSAFE
- */
 int
 so_pru_sense(struct socket *so, struct stat *sb)
 {
-       int error;
        struct netmsg_pru_sense msg;
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_sense);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_sense;
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_sense);
        msg.nm_stat = sb;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
 int
 so_pru_shutdown(struct socket *so)
 {
-       int error;
        struct netmsg_pru_shutdown msg;
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_shutdown);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_shutdown;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_shutdown);
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
 int
 so_pru_sockaddr(struct socket *so, struct sockaddr **nam)
 {
-       int error;
        struct netmsg_pru_sockaddr msg;
+       int error;
 
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_sockaddr);
-       msg.nm_prufn = so->so_proto->pr_usrreqs->pru_sockaddr;
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_usrreqs->pru_sockaddr);
        msg.nm_nam = nam;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
 int
-so_pru_ctloutput(struct socket *so, struct sockopt *sopt)
+so_pr_ctloutput(struct socket *so, struct sockopt *sopt)
 {
-       struct netmsg_pru_ctloutput msg;
+       struct netmsg_pr_ctloutput msg;
        int error;
 
        KKASSERT(!sopt->sopt_val || kva_p(sopt->sopt_val));
-       netmsg_init(&msg.nm_netmsg, so, &curthread->td_msgport,
-                   0, netmsg_pru_ctloutput);
-       /* TBD: move pr_ctloutput to pr_usrreqs */
-       msg.nm_prufn = so->so_proto->pr_ctloutput;
+       netmsg_init(&msg.base, so, &curthread->td_msgport,
+                   0, so->so_proto->pr_ctloutput);
        msg.nm_sopt = sopt;
-       error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, 0);
+       error = lwkt_domsg(so->so_port, &msg.base.lmsg, 0);
        return (error);
 }
 
@@ -392,13 +382,12 @@ so_pru_ctlinput(struct protosw *pr, int cmd, struct sockaddr *arg, void *extra)
        port = pr->pr_ctlport(cmd, arg, extra);
        if (port == NULL)
                return;
-       netmsg_init(&msg.nm_netmsg, NULL, &curthread->td_msgport,
-                   0, netmsg_pru_ctlinput);
-       msg.nm_prufn = pr->pr_ctlinput;
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
+                   0, pr->pr_ctlinput);
        msg.nm_cmd = cmd;
        msg.nm_arg = arg;
        msg.nm_extra = extra;
-       lwkt_domsg(port, &msg.nm_netmsg.nm_lmsg, 0);
+       lwkt_domsg(port, &msg.base.lmsg, 0);
 }
 
 /*
@@ -409,212 +398,28 @@ so_pru_ctlinput(struct protosw *pr, int cmd, struct sockaddr *arg, void *extra)
  */
 
 /*
- * Abort and destroy a socket.
- *
- * The originator referenced the socket so we must dereference it when
- * done.
- */
-void
-netmsg_pru_abort(netmsg_t msg)
-{
-       struct netmsg_pru_abort *nm = (void *)msg;
-       struct socket *so = msg->nm_so;
-       int error;
-
-       error = nm->nm_prufn(so);
-       sofree(so);     /* from soabort*() */
-       lwkt_replymsg(&msg->nm_lmsg, error);
-}
-
-#ifdef notused
-void
-netmsg_pru_accept(netmsg_t msg)
-{
-       struct netmsg_pru_accept *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg, nm->nm_prufn(msg->nm_so, nm->nm_nam));
-}
-#endif
-
-void
-netmsg_pru_attach(netmsg_t msg)
-{
-       struct netmsg_pru_attach *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg,
-                     nm->nm_prufn(msg->nm_so, nm->nm_proto, nm->nm_ai));
-}
-
-void
-netmsg_pru_bind(netmsg_t msg)
-{
-       struct netmsg_pru_bind *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg,
-                     nm->nm_prufn(msg->nm_so, nm->nm_nam, nm->nm_td));
-}
-
-void
-netmsg_pru_connect(netmsg_t msg)
-{
-       struct netmsg_pru_connect *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg,
-                     nm->nm_prufn(msg->nm_so, nm->nm_nam, nm->nm_td));
-}
-
-void
-netmsg_pru_connect2(netmsg_t msg)
-{
-       struct netmsg_pru_connect2 *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg, nm->nm_prufn(nm->nm_so1, nm->nm_so2));
-}
-
-void
-netmsg_pru_control(netmsg_t msg)
-{
-       struct netmsg_pru_control *nm = (void *)msg;
-       int error;
-
-       error = nm->nm_prufn(msg->nm_so, nm->nm_cmd, nm->nm_data,
-                               nm->nm_ifp, nm->nm_td);
-       lwkt_replymsg(&msg->nm_lmsg, error);
-}
-
-void
-netmsg_pru_detach(netmsg_t msg)
-{
-       struct netmsg_pru_detach *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg, nm->nm_prufn(msg->nm_so));
-}
-
-void
-netmsg_pru_disconnect(netmsg_t msg)
-{
-       struct netmsg_pru_disconnect *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg, nm->nm_prufn(msg->nm_so));
-}
-
-void
-netmsg_pru_listen(netmsg_t msg)
-{
-       struct netmsg_pru_listen *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg, nm->nm_prufn(msg->nm_so, nm->nm_td));
-}
-
-void
-netmsg_pru_peeraddr(netmsg_t msg)
-{
-       struct netmsg_pru_peeraddr *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg, nm->nm_prufn(msg->nm_so, nm->nm_nam));
-}
-
-void
-netmsg_pru_rcvd(netmsg_t msg)
-{
-       struct netmsg_pru_rcvd *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg, nm->nm_prufn(msg->nm_so, nm->nm_flags));
-}
-
-void
-netmsg_pru_rcvoob(netmsg_t msg)
-{
-       struct netmsg_pru_rcvoob *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg,
-                     nm->nm_prufn(msg->nm_so, nm->nm_m, nm->nm_flags));
-}
-
-void
-netmsg_pru_send(netmsg_t msg)
-{
-       struct netmsg_pru_send *nm = (void *)msg;
-       int error;
-
-       error = nm->nm_prufn(msg->nm_so, nm->nm_flags, nm->nm_m,
-                               nm->nm_addr, nm->nm_control, nm->nm_td);
-       lwkt_replymsg(&msg->nm_lmsg, error);
-}
-
-void
-netmsg_pru_sense(netmsg_t msg)
-{
-       struct netmsg_pru_sense *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg, nm->nm_prufn(msg->nm_so, nm->nm_stat));
-}
-
-void
-netmsg_pru_shutdown(netmsg_t msg)
-{
-       struct netmsg_pru_shutdown *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg, nm->nm_prufn(msg->nm_so));
-}
-
-void
-netmsg_pru_sockaddr(netmsg_t msg)
-{
-       struct netmsg_pru_sockaddr *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg, nm->nm_prufn(msg->nm_so, nm->nm_nam));
-}
-
-void
-netmsg_pru_ctloutput(netmsg_t msg)
-{
-       struct netmsg_pru_ctloutput *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg, nm->nm_prufn(msg->nm_so, nm->nm_sopt));
-}
-
-void
-netmsg_pru_ctlinput(netmsg_t msg)
-{
-       struct netmsg_pru_ctlinput *nm = (void *)msg;
-
-       nm->nm_prufn(nm->nm_cmd, nm->nm_arg, nm->nm_extra);
-       lwkt_replymsg(&nm->nm_netmsg.nm_lmsg, 0);
-}
-
-void
-netmsg_pr_timeout(netmsg_t msg)
-{
-       struct netmsg_pr_timeout *nm = (void *)msg;
-
-       lwkt_replymsg(&msg->nm_lmsg, nm->nm_prfn());
-}
-
-/*
  * Handle a predicate event request.  This function is only called once
  * when the predicate message queueing request is received.
  */
 void
-netmsg_so_notify(netmsg_t netmsg)
+netmsg_so_notify(netmsg_t msg)
 {
-       struct netmsg_so_notify *msg = (void *)netmsg;
        struct signalsockbuf *ssb;
 
-       ssb = (msg->nm_etype & NM_REVENT) ?
-                       &msg->nm_so->so_rcv :
-                       &msg->nm_so->so_snd;
+       ssb = (msg->notify.nm_etype & NM_REVENT) ?
+                       &msg->base.nm_so->so_rcv :
+                       &msg->base.nm_so->so_snd;
 
        /*
         * Reply immediately if the event has occured, otherwise queue the
         * request.
         */
-       if (msg->nm_predicate(&msg->nm_netmsg)) {
-               lwkt_replymsg(&msg->nm_netmsg.nm_lmsg,
-                             msg->nm_netmsg.nm_lmsg.ms_error);
+       if (msg->notify.nm_predicate(&msg->notify)) {
+               lwkt_replymsg(&msg->base.lmsg,
+                             msg->base.lmsg.ms_error);
        } else {
                lwkt_gettoken(&kq_token);
-               TAILQ_INSERT_TAIL(&ssb->ssb_kq.ki_mlist, msg, nm_list);
+               TAILQ_INSERT_TAIL(&ssb->ssb_kq.ki_mlist, &msg->notify, nm_list);
                atomic_set_int(&ssb->ssb_flags, SSB_MEVENT);
                lwkt_reltoken(&kq_token);
        }
@@ -639,10 +444,10 @@ netmsg_so_notify_doabort(lwkt_msg_t lmsg)
        struct netmsg_so_notify_abort msg;
 
        if ((lmsg->ms_flags & (MSGF_DONE | MSGF_REPLY)) == 0) {
-               netmsg_init(&msg.nm_netmsg, NULL, &curthread->td_msgport,
+               netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                            0, netmsg_so_notify_abort);
                msg.nm_notifymsg = (void *)lmsg;
-               lwkt_domsg(lmsg->ms_target_port, &msg.nm_netmsg.nm_lmsg, 0);
+               lwkt_domsg(lmsg->ms_target_port, &msg.base.lmsg, 0);
        }
 }
 
@@ -663,29 +468,28 @@ netmsg_so_notify_doabort(lwkt_msg_t lmsg)
  * reply reaches the originating cpu.  Test both bits anyway.
  */
 void
-netmsg_so_notify_abort(netmsg_t netmsg)
+netmsg_so_notify_abort(netmsg_t msg)
 {
-       struct netmsg_so_notify_abort *abrtmsg = (void *)netmsg;
-       struct netmsg_so_notify *msg = abrtmsg->nm_notifymsg;
+       struct netmsg_so_notify_abort *abrtmsg = &msg->notify_abort;
+       struct netmsg_so_notify *nmsg = abrtmsg->nm_notifymsg;
        struct signalsockbuf *ssb;
 
        /*
         * The original notify message is not destroyed until after the
         * abort request is returned, so we can check its state.
         */
-       if ((msg->nm_netmsg.nm_lmsg.ms_flags & (MSGF_DONE | MSGF_REPLY)) == 0) {
-               ssb = (msg->nm_etype & NM_REVENT) ?
-                               &msg->nm_so->so_rcv :
-                               &msg->nm_so->so_snd;
+       if ((nmsg->base.lmsg.ms_flags & (MSGF_DONE | MSGF_REPLY)) == 0) {
+               ssb = (nmsg->nm_etype & NM_REVENT) ?
+                               &nmsg->base.nm_so->so_rcv :
+                               &nmsg->base.nm_so->so_snd;
                lwkt_gettoken(&kq_token);
-               TAILQ_REMOVE(&ssb->ssb_kq.ki_mlist, msg, nm_list);
+               TAILQ_REMOVE(&ssb->ssb_kq.ki_mlist, nmsg, nm_list);
                lwkt_reltoken(&kq_token);
-               lwkt_replymsg(&msg->nm_netmsg.nm_lmsg, EINTR);
+               lwkt_replymsg(&nmsg->base.lmsg, EINTR);
        }
 
        /*
         * Reply to the abort message
         */
-       lwkt_replymsg(&abrtmsg->nm_netmsg.nm_lmsg, 0);
+       lwkt_replymsg(&abrtmsg->base.lmsg, 0);
 }
-
index 67740a4..c8dd499 100644 (file)
  */
 
 static struct protosw localsw[] = {
-{ SOCK_STREAM, &localdomain,   0,      PR_CONNREQUIRED|PR_WANTRCVD|PR_RIGHTS,
-  NULL,                NULL,           NULL,           &uipc_ctloutput,
-  sync_soport, NULL,
-  NULL,                NULL,           NULL,           NULL,
-  &uipc_usrreqs
-},
-{ SOCK_SEQPACKET, &localdomain,        0,      PR_CONNREQUIRED|PR_WANTRCVD|PR_RIGHTS|PR_ATOMIC,
-  NULL,                NULL,           NULL,           &uipc_ctloutput,
-  sync_soport, NULL,
-  NULL,                NULL,           NULL,           NULL,
-  &uipc_usrreqs
-},
-{ SOCK_DGRAM,  &localdomain,   0,              PR_ATOMIC|PR_ADDR|PR_RIGHTS,
-  NULL,                NULL,           NULL,           NULL,
-  sync_soport, NULL,
-  NULL,                NULL,           NULL,           NULL,
-  &uipc_usrreqs
-},
-{ 0,           NULL,           0,              0,
-  NULL,                NULL,           raw_ctlinput,   NULL,
-  sync_soport, cpu0_ctlport,
-  raw_init,    NULL,           NULL,           NULL,
-  &raw_usrreqs
-}
+    {
+       .pr_type = SOCK_STREAM,
+       .pr_domain = &localdomain,
+       .pr_protocol = 0,
+       .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_RIGHTS|PR_SYNC_PORT,
+       .pr_ctloutput = uipc_ctloutput,
+       .pr_usrreqs = &uipc_usrreqs
+    },
+    {
+       .pr_type = SOCK_SEQPACKET,
+       .pr_domain = &localdomain,
+       .pr_protocol = 0,
+       .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_RIGHTS|PR_SYNC_PORT|
+                   PR_ATOMIC,
+       .pr_ctloutput = uipc_ctloutput,
+       .pr_usrreqs = &uipc_usrreqs
+    },
+    {
+       .pr_type = SOCK_DGRAM,
+       .pr_domain = &localdomain,
+       .pr_protocol = 0,
+       .pr_flags = PR_RIGHTS|PR_SYNC_PORT|PR_ATOMIC|PR_ADDR,
+       .pr_ctloutput = NULL,
+       .pr_usrreqs = &uipc_usrreqs
+    },
+    {
+       .pr_type = 0,
+       .pr_protocol = 0,
+       .pr_flags = PR_SYNC_PORT,
+       .pr_ctlinput = raw_ctlinput,
+       .pr_ctloutput = NULL,
+       .pr_init = raw_init,
+       .pr_usrreqs = &raw_usrreqs
+    }
 };
 
 struct domain localdomain = {
@@ -86,5 +96,6 @@ DOMAIN_SET(local);
 
 SYSCTL_NODE(_net, PF_LOCAL, local, CTLFLAG_RW, 0, "Local domain");
 SYSCTL_NODE(_net_local, SOCK_STREAM, stream, CTLFLAG_RW, 0, "SOCK_STREAM");
-SYSCTL_NODE(_net_local, SOCK_SEQPACKET, seqpacket, CTLFLAG_RW, 0, "SOCK_SEQPACKET");
+SYSCTL_NODE(_net_local, SOCK_SEQPACKET, seqpacket, CTLFLAG_RW, 0,
+                       "SOCK_SEQPACKET");
 SYSCTL_NODE(_net_local, SOCK_DGRAM, dgram, CTLFLAG_RW, 0, "SOCK_DGRAM");
index 4ec07d3..3139912 100644 (file)
@@ -206,8 +206,15 @@ socreate(int dom, struct socket **aso, int type,
         * on the socket on this port until an inpcb is attached to it and
         * is able to match incoming packets, or until the socket becomes
         * available to userland.
+        *
+        * We normally default the socket to the protocol thread on cpu 0.
+        * If PR_SYNC_PORT is set (unix domain sockets) there is no protocol
+        * thread and all pr_*()/pru_*() calls are executed synchronously.
         */
-       so->so_port = cpu0_soport(so, NULL, NULL);
+       if (prp->pr_flags & PR_SYNC_PORT)
+               so->so_port = &netisr_sync_port;
+       else
+               so->so_port = cpu_portfn(0);
 
        TAILQ_INIT(&so->so_incomp);
        TAILQ_INIT(&so->so_comp);
@@ -454,7 +461,7 @@ soaccept(struct socket *so, struct sockaddr **nam)
                panic("soaccept: !NOFDREF");
        soreference(so);                /* create ref */
        soclrstate(so, SS_NOFDREF);     /* owned by lack of SS_NOFDREF */
-       error = so_pru_accept(so, nam);
+       error = so_pru_accept_direct(so, nam);
        return (error);
 }
 
@@ -1336,7 +1343,7 @@ sosetopt(struct socket *so, struct sockopt *sopt)
        sopt->sopt_dir = SOPT_SET;
        if (sopt->sopt_level != SOL_SOCKET) {
                if (so->so_proto && so->so_proto->pr_ctloutput) {
-                       return (so_pru_ctloutput(so, sopt));
+                       return (so_pr_ctloutput(so, sopt));
                }
                error = ENOPROTOOPT;
        } else {
@@ -1471,7 +1478,7 @@ sosetopt(struct socket *so, struct sockopt *sopt)
                        break;
                }
                if (error == 0 && so->so_proto && so->so_proto->pr_ctloutput) {
-                       (void) so_pru_ctloutput(so, sopt);
+                       (void) so_pr_ctloutput(so, sopt);
                }
        }
 bad:
@@ -1529,7 +1536,7 @@ sogetopt(struct socket *so, struct sockopt *sopt)
        sopt->sopt_dir = SOPT_GET;
        if (sopt->sopt_level != SOL_SOCKET) {
                if (so->so_proto && so->so_proto->pr_ctloutput) {
-                       return (so_pru_ctloutput(so, sopt));
+                       return (so_pr_ctloutput(so, sopt));
                } else
                        return (ENOPROTOOPT);
        } else {
index f4c6bc9..6a1fabe 100644 (file)
@@ -50,6 +50,7 @@
 #include <sys/stat.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
+#include <sys/socketops.h>
 #include <sys/signalvar.h>
 #include <sys/sysctl.h>
 #include <sys/aio.h> /* for aio_swake proto */
@@ -358,12 +359,12 @@ sonewconn(struct socket *head, int connstatus)
        ai.fd_rdir = NULL;              /* jail code cruft XXX JH */
 
        /*
-        * Reserve space and call pru_attach.  We can directcall the
+        * Reserve space and call pru_attach.  We can direct-call the
         * function since we're already in the protocol thread.
         */
        if (soreserve(so, head->so_snd.ssb_hiwat,
                      head->so_rcv.ssb_hiwat, NULL) ||
-           (*so->so_proto->pr_usrreqs->pru_attach)(so, 0, &ai)) {
+           so_pru_attach_direct(so, 0, &ai)) {
                so->so_head = NULL;
                soclrstate(so, SS_ASSERTINPROG);
                sofree(so);             /* remove implied pcb ref */
@@ -500,10 +501,10 @@ sowakeup(struct socket *so, struct signalsockbuf *ssb)
                lwkt_gettoken(&kq_token);
                lwkt_gettoken_hard(&ssb->ssb_token);
                TAILQ_FOREACH_MUTABLE(msg, &kqinfo->ki_mlist, nm_list, nmsg) {
-                       if (msg->nm_predicate(&msg->nm_netmsg)) {
+                       if (msg->nm_predicate(msg)) {
                                TAILQ_REMOVE(&kqinfo->ki_mlist, msg, nm_list);
-                               lwkt_replymsg(&msg->nm_netmsg.nm_lmsg, 
-                                             msg->nm_netmsg.nm_lmsg.ms_error);
+                               lwkt_replymsg(&msg->base.lmsg,
+                                             msg->base.lmsg.ms_error);
                        }
                }
                if (TAILQ_EMPTY(&ssb->ssb_kq.ki_mlist))
@@ -646,77 +647,10 @@ ssb_release(struct signalsockbuf *ssb, struct socket *so)
  * Some routines that return EOPNOTSUPP for entry points that are not
  * supported by a protocol.  Fill in as needed.
  */
-int
-pru_accept_notsupp(struct socket *so, struct sockaddr **nam)
-{
-       return EOPNOTSUPP;
-}
-
-int
-pru_bind_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td)
-{
-       return EOPNOTSUPP;
-}
-
-int
-pru_connect_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td)
-{
-       return EOPNOTSUPP;
-}
-
-int
-pru_connect2_notsupp(struct socket *so1, struct socket *so2)
-{
-       return EOPNOTSUPP;
-}
-
-int
-pru_control_notsupp(struct socket *so, u_long cmd, caddr_t data,
-                   struct ifnet *ifp, struct thread *td)
-{
-       return EOPNOTSUPP;
-}
-
-int
-pru_disconnect_notsupp(struct socket *so)
-{
-       return EOPNOTSUPP;
-}
-
-int
-pru_listen_notsupp(struct socket *so, struct thread *td)
-{
-       return EOPNOTSUPP;
-}
-
-int
-pru_peeraddr_notsupp(struct socket *so, struct sockaddr **nam)
-{
-       return EOPNOTSUPP;
-}
-
-int
-pru_rcvd_notsupp(struct socket *so, int flags)
-{
-       return EOPNOTSUPP;
-}
-
-int
-pru_rcvoob_notsupp(struct socket *so, struct mbuf *m, int flags)
-{
-       return EOPNOTSUPP;
-}
-
-int
-pru_shutdown_notsupp(struct socket *so)
-{
-       return EOPNOTSUPP;
-}
-
-int
-pru_sockaddr_notsupp(struct socket *so, struct sockaddr **nam)
+void
+pr_generic_notsupp(netmsg_t msg)
 {
-       return EOPNOTSUPP;
+       lwkt_replymsg(&msg->lmsg, EOPNOTSUPP);
 }
 
 int
@@ -739,21 +673,15 @@ pru_soreceive_notsupp(struct socket *so, struct sockaddr **paddr,
        return (EOPNOTSUPP);
 }
 
-int
-pru_ctloutput_notsupp(struct socket *so, struct sockopt *sopt)
-{
-       return (EOPNOTSUPP);
-}
-
 /*
  * This isn't really a ``null'' operation, but it's the default one
  * and doesn't do anything destructive.
  */
-int
-pru_sense_null(struct socket *so, struct stat *sb)
+void
+pru_sense_null(netmsg_t msg)
 {
-       sb->st_blksize = so->so_snd.ssb_hiwat;
-       return 0;
+       msg->sense.nm_stat->st_blksize = msg->base.nm_so->so_snd.ssb_hiwat;
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
 /*
index 192c5cc..16f7cb5 100644 (file)
@@ -216,33 +216,32 @@ sys_listen(struct listen_args *uap)
  * Returns the accepted socket as well.
  */
 static boolean_t
-soaccept_predicate(struct netmsg *msg0)
+soaccept_predicate(struct netmsg_so_notify *msg)
 {
-       struct netmsg_so_notify *msg = (struct netmsg_so_notify *)msg0;
-       struct socket *head = msg->nm_so;
+       struct socket *head = msg->base.nm_so;
 
        if (head->so_error != 0) {
-               msg->nm_netmsg.nm_lmsg.ms_error = head->so_error;
+               msg->base.lmsg.ms_error = head->so_error;
                return (TRUE);
        }
        lwkt_gettoken(&head->so_rcv.ssb_token);
        if (!TAILQ_EMPTY(&head->so_comp)) {
                /* Abuse nm_so field as copy in/copy out parameter. XXX JH */
-               msg->nm_so = TAILQ_FIRST(&head->so_comp);
-               TAILQ_REMOVE(&head->so_comp, msg->nm_so, so_list);
+               msg->base.nm_so = TAILQ_FIRST(&head->so_comp);
+               TAILQ_REMOVE(&head->so_comp, msg->base.nm_so, so_list);
                head->so_qlen--;
 
-               msg->nm_netmsg.nm_lmsg.ms_error = 0;
+               msg->base.lmsg.ms_error = 0;
                lwkt_reltoken(&head->so_rcv.ssb_token);
                return (TRUE);
        }
        lwkt_reltoken(&head->so_rcv.ssb_token);
        if (head->so_state & SS_CANTRCVMORE) {
-               msg->nm_netmsg.nm_lmsg.ms_error = ECONNABORTED;
+               msg->base.lmsg.ms_error = ECONNABORTED;
                return (TRUE);
        }
        if (msg->nm_fflags & FNONBLOCK) {
-               msg->nm_netmsg.nm_lmsg.ms_error = EWOULDBLOCK;
+               msg->base.lmsg.ms_error = EWOULDBLOCK;
                return (TRUE);
        }
 
@@ -296,20 +295,19 @@ kern_accept(int s, int fflags, struct sockaddr **name, int *namelen, int *res)
                fflags = lfp->f_flag;
 
        /* optimize for uniprocessor case later XXX JH */
-       netmsg_init_abortable(&msg.nm_netmsg, head, &curthread->td_msgport,
+       netmsg_init_abortable(&msg.base, head, &curthread->td_msgport,
                              0, netmsg_so_notify, netmsg_so_notify_doabort);
        msg.nm_predicate = soaccept_predicate;
        msg.nm_fflags = fflags;
-       msg.nm_so = head;
        msg.nm_etype = NM_REVENT;
-       error = lwkt_domsg(head->so_port, &msg.nm_netmsg.nm_lmsg, PCATCH);
+       error = lwkt_domsg(head->so_port, &msg.base.lmsg, PCATCH);
        if (error)
                goto done;
 
        /*
         * At this point we have the connection that's ready to be accepted.
         */
-       so = msg.nm_so;
+       so = msg.base.nm_so;
 
        fflag = lfp->f_flag;
 
@@ -453,14 +451,13 @@ sys_extaccept(struct extaccept_args *uap)
  * Returns TRUE if predicate satisfied.
  */
 static boolean_t
-soconnected_predicate(struct netmsg *msg0)
+soconnected_predicate(struct netmsg_so_notify *msg)
 {
-       struct netmsg_so_notify *msg = (struct netmsg_so_notify *)msg0;
-       struct socket *so = msg->nm_so;
+       struct socket *so = msg->base.nm_so;
 
        /* check predicate */
        if (!(so->so_state & SS_ISCONNECTING) || so->so_error != 0) {
-               msg->nm_netmsg.nm_lmsg.ms_error = so->so_error;
+               msg->base.lmsg.ms_error = so->so_error;
                return (TRUE);
        }
 
@@ -502,15 +499,14 @@ kern_connect(int s, int fflags, struct sockaddr *sa)
        if ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {
                struct netmsg_so_notify msg;
 
-               netmsg_init_abortable(&msg.nm_netmsg, so,
+               netmsg_init_abortable(&msg.base, so,
                                      &curthread->td_msgport,
                                      0,
                                      netmsg_so_notify,
                                      netmsg_so_notify_doabort);
                msg.nm_predicate = soconnected_predicate;
-               msg.nm_so = so;
                msg.nm_etype = NM_REVENT;
-               error = lwkt_domsg(so->so_port, &msg.nm_netmsg.nm_lmsg, PCATCH);
+               error = lwkt_domsg(so->so_port, &msg.base.lmsg, PCATCH);
                if (error == EINTR || error == ERESTART)
                        interrupted = 1;
        }
index 17e7719..b374076 100644 (file)
@@ -60,6 +60,7 @@
 #include <sys/file2.h>
 #include <sys/spinlock2.h>
 #include <sys/socketvar2.h>
+#include <sys/msgport2.h>
 
 static MALLOC_DEFINE(M_UNPCB, "unpcb", "unpcb struct");
 static unp_gen_t unp_gencnt;
@@ -107,14 +108,14 @@ static void    unp_fp_externalize(struct lwp *lp, struct file *fp, int fd);
  * NOTE: (so) is referenced from soabort*() and netmsg_pru_abort()
  *      will sofree() it when we return.
  */
-static int
-uipc_abort(struct socket *so)
+static void
+uipc_abort(netmsg_t msg)
 {
        struct unpcb *unp;
        int error;
 
        lwkt_gettoken(&unp_token);
-       unp = so->so_pcb;
+       unp = msg->base.nm_so->so_pcb;
        if (unp) {
                unp_drop(unp, ECONNABORTED);
                unp_detach(unp);
@@ -124,113 +125,117 @@ uipc_abort(struct socket *so)
        }
        lwkt_reltoken(&unp_token);
 
-       return error;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-uipc_accept(struct socket *so, struct sockaddr **nam)
+static void
+uipc_accept(netmsg_t msg)
 {
        struct unpcb *unp;
+       int error;
 
        lwkt_gettoken(&unp_token);
-       unp = so->so_pcb;
+       unp = msg->base.nm_so->so_pcb;
        if (unp == NULL) {
-               lwkt_reltoken(&unp_token);
-               return EINVAL;
-       }
-
-       /*
-        * Pass back name of connected socket,
-        * if it was bound and we are still connected
-        * (our peer may have closed already!).
-        */
-       if (unp->unp_conn && unp->unp_conn->unp_addr) {
-               *nam = dup_sockaddr((struct sockaddr *)unp->unp_conn->unp_addr);
+               error = EINVAL;
        } else {
-               *nam = dup_sockaddr((struct sockaddr *)&sun_noname);
+               /*
+                * Pass back name of connected socket,
+                * if it was bound and we are still connected
+                * (our peer may have closed already!).
+                */
+               if (unp->unp_conn && unp->unp_conn->unp_addr) {
+                       *msg->accept.nm_nam = dup_sockaddr(
+                               (struct sockaddr *)unp->unp_conn->unp_addr);
+               } else {
+                       *msg->accept.nm_nam = dup_sockaddr(
+                               (struct sockaddr *)&sun_noname);
+               }
+               error = 0;
        }
        lwkt_reltoken(&unp_token);
-       return 0;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-uipc_attach(struct socket *so, int proto, struct pru_attach_info *ai)
+static void
+uipc_attach(netmsg_t msg)
 {
        struct unpcb *unp;
        int error;
 
        lwkt_gettoken(&unp_token);
-       unp = so->so_pcb;
+       unp = msg->base.nm_so->so_pcb;
        if (unp)
                error = EISCONN;
        else
-               error = unp_attach(so, ai);
+               error = unp_attach(msg->base.nm_so, msg->attach.nm_ai);
        lwkt_reltoken(&unp_token);
-
-       return error;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-uipc_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
+static void
+uipc_bind(netmsg_t msg)
 {
        struct unpcb *unp;
        int error;
 
        lwkt_gettoken(&unp_token);
-       unp = so->so_pcb;
+       unp = msg->base.nm_so->so_pcb;
        if (unp)
-               error = unp_bind(unp, nam, td);
+               error = unp_bind(unp, msg->bind.nm_nam, msg->bind.nm_td);
        else
                error = EINVAL;
        lwkt_reltoken(&unp_token);
-
-       return error;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-uipc_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
+static void
+uipc_connect(netmsg_t msg)
 {
        struct unpcb *unp;
        int error;
 
        lwkt_gettoken(&unp_token);
-       unp = so->so_pcb;
-       if (unp)
-               error = unp_connect(so, nam, td);
-       else
+       unp = msg->base.nm_so->so_pcb;
+       if (unp) {
+               error = unp_connect(msg->base.nm_so,
+                                   msg->connect.nm_nam,
+                                   msg->connect.nm_td);
+       } else {
                error = EINVAL;
+       }
        lwkt_reltoken(&unp_token);
-
-       return error;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-uipc_connect2(struct socket *so1, struct socket *so2)
+static void
+uipc_connect2(netmsg_t msg)
 {
        struct unpcb *unp;
        int error;
 
        lwkt_gettoken(&unp_token);
-       unp = so1->so_pcb;
-       if (unp)
-               error = unp_connect2(so1, so2);
-       else
+       unp = msg->connect2.nm_so1->so_pcb;
+       if (unp) {
+               error = unp_connect2(msg->connect2.nm_so1,
+                                    msg->connect2.nm_so2);
+       } else {
                error = EINVAL;
+       }
        lwkt_reltoken(&unp_token);
-
-       return error;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /* control is EOPNOTSUPP */
 
-static int
-uipc_detach(struct socket *so)
+static void
+uipc_detach(netmsg_t msg)
 {
        struct unpcb *unp;
        int error;
 
        lwkt_gettoken(&unp_token);
-       unp = so->so_pcb;
+       unp = msg->base.nm_so->so_pcb;
        if (unp) {
                unp_detach(unp);
                error = 0;
@@ -238,18 +243,17 @@ uipc_detach(struct socket *so)
                error = EINVAL;
        }
        lwkt_reltoken(&unp_token);
-
-       return error;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-uipc_disconnect(struct socket *so)
+static void
+uipc_disconnect(netmsg_t msg)
 {
        struct unpcb *unp;
        int error;
 
        lwkt_gettoken(&unp_token);
-       unp = so->so_pcb;
+       unp = msg->base.nm_so->so_pcb;
        if (unp) {
                unp_disconnect(unp);
                error = 0;
@@ -257,39 +261,38 @@ uipc_disconnect(struct socket *so)
                error = EINVAL;
        }
        lwkt_reltoken(&unp_token);
-
-       return error;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-uipc_listen(struct socket *so, struct thread *td)
+static void
+uipc_listen(netmsg_t msg)
 {
        struct unpcb *unp;
        int error;
 
        lwkt_gettoken(&unp_token);
-       unp = so->so_pcb;
+       unp = msg->base.nm_so->so_pcb;
        if (unp == NULL || unp->unp_vnode == NULL)
                error = EINVAL;
        else
-               error = unp_listen(unp, td);
+               error = unp_listen(unp, msg->listen.nm_td);
        lwkt_reltoken(&unp_token);
-
-       return error;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-uipc_peeraddr(struct socket *so, struct sockaddr **nam)
+static void
+uipc_peeraddr(netmsg_t msg)
 {
        struct unpcb *unp;
        int error;
 
        lwkt_gettoken(&unp_token);
-       unp = so->so_pcb;
+       unp = msg->base.nm_so->so_pcb;
        if (unp == NULL) {
                error = EINVAL;
        } else if (unp->unp_conn && unp->unp_conn->unp_addr) {
-               *nam = dup_sockaddr((struct sockaddr *)unp->unp_conn->unp_addr);
+               *msg->peeraddr.nm_nam = dup_sockaddr(
+                               (struct sockaddr *)unp->unp_conn->unp_addr);
                error = 0;
        } else {
                /*
@@ -297,25 +300,28 @@ uipc_peeraddr(struct socket *so, struct sockaddr **nam)
                 * connection is established.  So, this else clause is
                 * added as workaround to return PF_LOCAL sockaddr.
                 */
-               *nam = dup_sockaddr((struct sockaddr *)&sun_noname);
+               *msg->peeraddr.nm_nam = dup_sockaddr(
+                               (struct sockaddr *)&sun_noname);
                error = 0;
        }
        lwkt_reltoken(&unp_token);
-
-       return error;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-uipc_rcvd(struct socket *so, int flags)
+static void
+uipc_rcvd(netmsg_t msg)
 {
        struct unpcb *unp;
+       struct socket *so;
        struct socket *so2;
+       int error;
 
        lwkt_gettoken(&unp_token);
+       so = msg->base.nm_so;
        unp = so->so_pcb;
        if (unp == NULL) {
-               lwkt_reltoken(&unp_token);
-               return EINVAL;
+               error = EINVAL;
+               goto done;
        }
 
        switch (so->so_type) {
@@ -343,34 +349,40 @@ uipc_rcvd(struct socket *so, int flags)
                panic("uipc_rcvd unknown socktype");
                /*NOTREACHED*/
        }
+       error = 0;
+done:
        lwkt_reltoken(&unp_token);
-
-       return 0;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /* pru_rcvoob is EOPNOTSUPP */
 
-static int
-uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
-         struct mbuf *control, struct thread *td)
+static void
+uipc_send(netmsg_t msg)
 {
        struct unpcb *unp;
+       struct socket *so;
        struct socket *so2;
+       struct mbuf *control;
+       struct mbuf *m;
        int error = 0;
 
        lwkt_gettoken(&unp_token);
-
+       so = msg->base.nm_so;
+       control = msg->send.nm_control;
+       m = msg->send.nm_m;
        unp = so->so_pcb;
+
        if (unp == NULL) {
                error = EINVAL;
                goto release;
        }
-       if (flags & PRUS_OOB) {
+       if (msg->send.nm_flags & PRUS_OOB) {
                error = EOPNOTSUPP;
                goto release;
        }
 
-       if (control && (error = unp_internalize(control, td)))
+       if (control && (error = unp_internalize(control, msg->send.nm_td)))
                goto release;
 
        switch (so->so_type) {
@@ -378,12 +390,14 @@ uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
        {
                struct sockaddr *from;
 
-               if (nam) {
+               if (msg->send.nm_addr) {
                        if (unp->unp_conn) {
                                error = EISCONN;
                                break;
                        }
-                       error = unp_connect(so, nam, td);
+                       error = unp_connect(so,
+                                           msg->send.nm_addr,
+                                           msg->send.nm_td);
                        if (error)
                                break;
                } else {
@@ -404,7 +418,7 @@ uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
                } else {
                        error = ENOBUFS;
                }
-               if (nam)
+               if (msg->send.nm_addr)
                        unp_disconnect(unp);
                break;
        }
@@ -417,8 +431,10 @@ uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
                 * if not equal to the peer's address.
                 */
                if (!(so->so_state & SS_ISCONNECTED)) {
-                       if (nam) {
-                               error = unp_connect(so, nam, td);
+                       if (msg->send.nm_addr) {
+                               error = unp_connect(so,
+                                                   msg->send.nm_addr,
+                                                   msg->send.nm_td);
                                if (error)
                                        break;  /* XXX */
                        } else {
@@ -472,7 +488,7 @@ uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
        /*
         * SEND_EOF is equivalent to a SEND followed by a SHUTDOWN.
         */
-       if (flags & PRUS_EOF) {
+       if (msg->send.nm_flags & PRUS_EOF) {
                socantsendmore(so);
                unp_shutdown(unp);
        }
@@ -487,22 +503,27 @@ release:
                m_freem(control);
        if (m)
                m_freem(m);
-       return error;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /*
  * MPSAFE
  */
-static int
-uipc_sense(struct socket *so, struct stat *sb)
+static void
+uipc_sense(netmsg_t msg)
 {
        struct unpcb *unp;
+       struct socket *so;
+       struct stat *sb;
+       int error;
 
        lwkt_gettoken(&unp_token);
+       so = msg->base.nm_so;
+       sb = msg->sense.nm_stat;
        unp = so->so_pcb;
        if (unp == NULL) {
-               lwkt_reltoken(&unp_token);
-               return EINVAL;
+               error = EINVAL;
+               goto done;
        }
        sb->st_blksize = so->so_snd.ssb_hiwat;
        sb->st_dev = NOUDEV;
@@ -512,18 +533,21 @@ uipc_sense(struct socket *so, struct stat *sb)
                spin_unlock(&unp_ino_spin);
        }
        sb->st_ino = unp->unp_ino;
+       error = 0;
+done:
        lwkt_reltoken(&unp_token);
-
-       return (0);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-uipc_shutdown(struct socket *so)
+static void
+uipc_shutdown(netmsg_t msg)
 {
+       struct socket *so;
        struct unpcb *unp;
        int error;
 
        lwkt_gettoken(&unp_token);
+       so = msg->base.nm_so;
        unp = so->so_pcb;
        if (unp) {
                socantsendmore(so);
@@ -533,28 +557,28 @@ uipc_shutdown(struct socket *so)
                error = EINVAL;
        }
        lwkt_reltoken(&unp_token);
-
-       return error;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-uipc_sockaddr(struct socket *so, struct sockaddr **nam)
+static void
+uipc_sockaddr(netmsg_t msg)
 {
        struct unpcb *unp;
        int error;
 
        lwkt_gettoken(&unp_token);
-       unp = so->so_pcb;
+       unp = msg->base.nm_so->so_pcb;
        if (unp) {
-               if (unp->unp_addr)
-                       *nam = dup_sockaddr((struct sockaddr *)unp->unp_addr);
+               if (unp->unp_addr) {
+                       *msg->sockaddr.nm_nam =
+                               dup_sockaddr((struct sockaddr *)unp->unp_addr);
+               }
                error = 0;
        } else {
                error = EINVAL;
        }
        lwkt_reltoken(&unp_token);
-
-       return error;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 struct pr_usrreqs uipc_usrreqs = {
@@ -564,13 +588,13 @@ struct pr_usrreqs uipc_usrreqs = {
        .pru_bind = uipc_bind,
        .pru_connect = uipc_connect,
        .pru_connect2 = uipc_connect2,
-       .pru_control = pru_control_notsupp,
+       .pru_control = pr_generic_notsupp,
        .pru_detach = uipc_detach,
        .pru_disconnect = uipc_disconnect,
        .pru_listen = uipc_listen,
        .pru_peeraddr = uipc_peeraddr,
        .pru_rcvd = uipc_rcvd,
-       .pru_rcvoob = pru_rcvoob_notsupp,
+       .pru_rcvoob = pr_generic_notsupp,
        .pru_send = uipc_send,
        .pru_sense = uipc_sense,
        .pru_shutdown = uipc_shutdown,
@@ -579,13 +603,17 @@ struct pr_usrreqs uipc_usrreqs = {
        .pru_soreceive = soreceive
 };
 
-int
-uipc_ctloutput(struct socket *so, struct sockopt *sopt)
+void
+uipc_ctloutput(netmsg_t msg)
 {
+       struct socket *so;
+       struct sockopt *sopt;
        struct unpcb *unp;
        int error = 0;
 
        lwkt_gettoken(&unp_token);
+       so = msg->base.nm_so;
+       sopt = msg->ctloutput.nm_sopt;
        unp = so->so_pcb;
 
        switch (sopt->sopt_dir) {
@@ -615,8 +643,7 @@ uipc_ctloutput(struct socket *so, struct sockopt *sopt)
                break;
        }
        lwkt_reltoken(&unp_token);
-
-       return (error);
+       lwkt_replymsg(&msg->lmsg, error);
 }
        
 /*
@@ -665,6 +692,7 @@ unp_attach(struct socket *so, struct pru_attach_info *ai)
        int error;
 
        lwkt_gettoken(&unp_token);
+
        if (so->so_snd.ssb_hiwat == 0 || so->so_rcv.ssb_hiwat == 0) {
                switch (so->so_type) {
 
@@ -699,7 +727,6 @@ unp_attach(struct socket *so, struct pru_attach_info *ai)
                         : &unp_shead, unp, unp_link);
        so->so_pcb = (caddr_t)unp;
        soreference(so);
-       so->so_port = sync_soport(so, NULL, NULL);
        error = 0;
 failed:
        lwkt_reltoken(&unp_token);
index d8bbda1..f54e78c 100644 (file)
@@ -78,7 +78,7 @@
 #include <sys/devfs.h>
 
 struct netmsg_bpf_output {
-       struct netmsg   nm_netmsg;
+       struct netmsg_base base;
        struct mbuf     *nm_mbuf;
        struct ifnet    *nm_ifp;
        struct sockaddr *nm_dst;
@@ -540,9 +540,9 @@ bpf_timed_out(void *arg)
 }
 
 static void
-bpf_output_dispatch(struct netmsg *nmsg)
+bpf_output_dispatch(netmsg_t msg)
 {
-       struct netmsg_bpf_output *bmsg = (struct netmsg_bpf_output *)nmsg;
+       struct netmsg_bpf_output *bmsg = (struct netmsg_bpf_output *)msg;
        struct ifnet *ifp = bmsg->nm_ifp;
        int error;
 
@@ -550,7 +550,7 @@ bpf_output_dispatch(struct netmsg *nmsg)
         * The driver frees the mbuf.
         */
        error = ifp->if_output(ifp, bmsg->nm_mbuf, bmsg->nm_dst, NULL);
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 static int
@@ -586,13 +586,13 @@ bpfwrite(struct dev_write_args *ap)
        if (d->bd_hdrcmplt)
                dst.sa_family = pseudo_AF_HDRCMPLT;
 
-       netmsg_init(&bmsg.nm_netmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&bmsg.base, NULL, &curthread->td_msgport,
                    0, bpf_output_dispatch);
        bmsg.nm_mbuf = m;
        bmsg.nm_ifp = ifp;
        bmsg.nm_dst = &dst;
 
-       return lwkt_domsg(cpu_portfn(0), &bmsg.nm_netmsg.nm_lmsg, 0);
+       return lwkt_domsg(cpu_portfn(0), &bmsg.base.lmsg, 0);
 }
 
 /*
index 56683b1..7c7edc5 100644 (file)
@@ -923,7 +923,7 @@ bstp_stop(struct bridge_softc *sc)
        bstp_timer_stop(&sc->sc_hello_timer);
 
        crit_enter();
-       lmsg = &sc->sc_bstptimemsg.nm_lmsg;
+       lmsg = &sc->sc_bstptimemsg.lmsg;
        if ((lmsg->ms_flags & MSGF_DONE) == 0) {
                /* Pending to be processed; drop it */
                lwkt_dropmsg(lmsg);
@@ -1122,7 +1122,7 @@ bstp_tick(void *arg)
        }
        callout_deactivate(&sc->sc_bstpcallout);
 
-       lmsg = &sc->sc_bstptimemsg.nm_lmsg;
+       lmsg = &sc->sc_bstptimemsg.lmsg;
        KKASSERT(lmsg->ms_flags & MSGF_DONE);
        lwkt_sendmsg(BRIDGE_CFGPORT, lmsg);
 
@@ -1130,15 +1130,15 @@ bstp_tick(void *arg)
 }
 
 void
-bstp_tick_handler(struct netmsg *nmsg)
+bstp_tick_handler(netmsg_t msg)
 {
-       struct bridge_softc *sc = nmsg->nm_lmsg.u.ms_resultp;
+       struct bridge_softc *sc = msg->lmsg.u.ms_resultp;
        struct bridge_iflist *bif;
 
        KKASSERT(&curthread->td_msgport == BRIDGE_CFGPORT);
        crit_enter();
        /* Reply ASAP */
-       lwkt_replymsg(&nmsg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
        crit_exit();
 
        ifnet_serialize_all(sc->sc_ifp);
index 58ca156..70871f3 100644 (file)
 typedef int    (*bridge_ctl_t)(struct bridge_softc *, void *);
 
 struct netmsg_brctl {
-       struct netmsg           bc_nmsg;
+       struct netmsg_base      base;
        bridge_ctl_t            bc_func;
        struct bridge_softc     *bc_sc;
        void                    *bc_arg;
 };
 
 struct netmsg_brsaddr {
-       struct netmsg           br_nmsg;
+       struct netmsg_base      base;
        struct bridge_softc     *br_softc;
        struct ifnet            *br_dst_if;
        struct bridge_rtinfo    *br_rtinfo;
@@ -331,21 +331,21 @@ struct netmsg_brsaddr {
 };
 
 struct netmsg_braddbif {
-       struct netmsg           br_nmsg;
+       struct netmsg_base      base;
        struct bridge_softc     *br_softc;
        struct bridge_ifinfo    *br_bif_info;
        struct ifnet            *br_bif_ifp;
 };
 
 struct netmsg_brdelbif {
-       struct netmsg           br_nmsg;
+       struct netmsg_base      base;
        struct bridge_softc     *br_softc;
        struct bridge_ifinfo    *br_bif_info;
        struct bridge_iflist_head *br_bif_list;
 };
 
 struct netmsg_brsflags {
-       struct netmsg           br_nmsg;
+       struct netmsg_base      base;
        struct bridge_softc     *br_softc;
        struct bridge_ifinfo    *br_bif_info;
        uint32_t                br_bif_flags;
@@ -373,7 +373,7 @@ static int  bridge_output(struct ifnet *, struct mbuf *);
 
 static void    bridge_forward(struct bridge_softc *, struct mbuf *m);
 
-static void    bridge_timer_handler(struct netmsg *);
+static void    bridge_timer_handler(netmsg_t);
 static void    bridge_timer(void *);
 
 static void    bridge_start_bcast(struct bridge_softc *, struct mbuf *);
@@ -394,8 +394,8 @@ static int  bridge_rtdaddr(struct bridge_softc *, const uint8_t *);
 static int     bridge_rtsaddr(struct bridge_softc *, const uint8_t *,
                    struct ifnet *, uint8_t);
 static void    bridge_rtmsg_sync(struct bridge_softc *sc);
-static void    bridge_rtreap_handler(struct netmsg *);
-static void    bridge_rtinstall_handler(struct netmsg *);
+static void    bridge_rtreap_handler(netmsg_t);
+static void    bridge_rtinstall_handler(netmsg_t);
 static int     bridge_rtinstall_oncpu(struct bridge_softc *, const uint8_t *,
                    struct ifnet *, int, uint8_t, struct bridge_rtinfo **);
 
@@ -458,12 +458,12 @@ static int        bridge_ip6_checkbasic(struct mbuf **mp);
 #endif /* INET6 */
 static int     bridge_fragment(struct ifnet *, struct mbuf *,
                    struct ether_header *, int, struct llc *);
-static void    bridge_enqueue_handler(struct netmsg *);
+static void    bridge_enqueue_handler(netmsg_t);
 static void    bridge_handoff(struct ifnet *, struct mbuf *);
 
-static void    bridge_del_bif_handler(struct netmsg *);
-static void    bridge_add_bif_handler(struct netmsg *);
-static void    bridge_set_bifflags_handler(struct netmsg *);
+static void    bridge_del_bif_handler(netmsg_t);
+static void    bridge_add_bif_handler(netmsg_t);
+static void    bridge_set_bifflags_handler(netmsg_t);
 static void    bridge_del_bif(struct bridge_softc *, struct bridge_ifinfo *,
                    struct bridge_iflist_head *);
 static void    bridge_add_bif(struct bridge_softc *, struct bridge_ifinfo *,
@@ -655,12 +655,12 @@ bridge_clone_create(struct if_clone *ifc, int unit, caddr_t param __unused)
        callout_init(&sc->sc_brcallout);
        netmsg_init(&sc->sc_brtimemsg, NULL, &netisr_adone_rport,
                    MSGF_DROPABLE, bridge_timer_handler);
-       sc->sc_brtimemsg.nm_lmsg.u.ms_resultp = sc;
+       sc->sc_brtimemsg.lmsg.u.ms_resultp = sc;
 
        callout_init(&sc->sc_bstpcallout);
        netmsg_init(&sc->sc_bstptimemsg, NULL, &netisr_adone_rport,
                    MSGF_DROPABLE, bstp_tick_handler);
-       sc->sc_bstptimemsg.nm_lmsg.u.ms_resultp = sc;
+       sc->sc_bstptimemsg.lmsg.u.ms_resultp = sc;
 
        /* Initialize per-cpu member iface lists */
        sc->sc_iflists = kmalloc(sizeof(*sc->sc_iflists) * ncpus,
@@ -707,10 +707,9 @@ bridge_clone_create(struct if_clone *ifc, int unit, caddr_t param __unused)
 }
 
 static void
-bridge_delete_dispatch(struct netmsg *nmsg)
+bridge_delete_dispatch(netmsg_t msg)
 {
-       struct lwkt_msg *lmsg = &nmsg->nm_lmsg;
-       struct bridge_softc *sc = lmsg->u.ms_resultp;
+       struct bridge_softc *sc = msg->lmsg.u.ms_resultp;
        struct ifnet *bifp = sc->sc_ifp;
        struct bridge_iflist *bif;
 
@@ -724,7 +723,7 @@ bridge_delete_dispatch(struct netmsg *nmsg)
 
        ifnet_deserialize_all(bifp);
 
-       lwkt_replymsg(lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
 /*
@@ -736,8 +735,7 @@ static void
 bridge_clone_destroy(struct ifnet *ifp)
 {
        struct bridge_softc *sc = ifp->if_softc;
-       struct lwkt_msg *lmsg;
-       struct netmsg nmsg;
+       struct netmsg_base msg;
 
        ifnet_serialize_all(ifp);
 
@@ -746,11 +744,10 @@ bridge_clone_destroy(struct ifnet *ifp)
 
        ifnet_deserialize_all(ifp);
 
-       netmsg_init(&nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, bridge_delete_dispatch);
-       lmsg = &nmsg.nm_lmsg;
-       lmsg->u.ms_resultp = sc;
-       lwkt_domsg(BRIDGE_CFGPORT, lmsg, 0);
+       msg.lmsg.u.ms_resultp = sc;
+       lwkt_domsg(BRIDGE_CFGPORT, &msg.lmsg, 0);
 
        crit_enter();   /* XXX MP */
        LIST_REMOVE(sc, sc_list);
@@ -1098,7 +1095,7 @@ bridge_ioctl_stop(struct bridge_softc *sc, void *arg __unused)
        callout_stop(&sc->sc_brcallout);
 
        crit_enter();
-       lmsg = &sc->sc_brtimemsg.nm_lmsg;
+       lmsg = &sc->sc_brtimemsg.lmsg;
        if ((lmsg->ms_flags & MSGF_DONE) == 0) {
                /* Pending to be processed; drop it */
                lwkt_dropmsg(lmsg);
@@ -1721,14 +1718,13 @@ bridge_ioctl_delspan(struct bridge_softc *sc, void *arg)
 }
 
 static void
-bridge_ifdetach_dispatch(struct netmsg *nmsg)
+bridge_ifdetach_dispatch(netmsg_t msg)
 {
-       struct lwkt_msg *lmsg = &nmsg->nm_lmsg;
        struct ifnet *ifp, *bifp;
        struct bridge_softc *sc;
        struct bridge_iflist *bif;
 
-       ifp = lmsg->u.ms_resultp;
+       ifp = msg->lmsg.u.ms_resultp;
        sc = ifp->if_bridge;
 
        /* Check if the interface is a bridge member */
@@ -1768,7 +1764,7 @@ bridge_ifdetach_dispatch(struct netmsg *nmsg)
        crit_exit();
 
 reply:
-       lwkt_replymsg(lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
 /*
@@ -1780,15 +1776,13 @@ reply:
 static void
 bridge_ifdetach(void *arg __unused, struct ifnet *ifp)
 {
-       struct lwkt_msg *lmsg;
-       struct netmsg nmsg;
+       struct netmsg_base msg;
 
-       netmsg_init(&nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, bridge_ifdetach_dispatch);
-       lmsg = &nmsg.nm_lmsg;
-       lmsg->u.ms_resultp = ifp;
+       msg.lmsg.u.ms_resultp = ifp;
 
-       lwkt_domsg(BRIDGE_CFGPORT, lmsg, 0);
+       lwkt_domsg(BRIDGE_CFGPORT, &msg.lmsg, 0);
 }
 
 /*
@@ -1825,12 +1819,12 @@ bridge_enqueue(struct ifnet *dst_ifp, struct mbuf *m)
        struct netmsg_packet *nmp;
 
        nmp = &m->m_hdr.mh_netmsg;
-       netmsg_init(&nmp->nm_netmsg, NULL, &netisr_apanic_rport,
+       netmsg_init(&nmp->base, NULL, &netisr_apanic_rport,
                    0, bridge_enqueue_handler);
        nmp->nm_packet = m;
-       nmp->nm_netmsg.nm_lmsg.u.ms_resultp = dst_ifp;
+       nmp->base.lmsg.u.ms_resultp = dst_ifp;
 
-       lwkt_sendmsg(ifnet_portfn(mycpu->gd_cpuid), &nmp->nm_netmsg.nm_lmsg);
+       lwkt_sendmsg(ifnet_portfn(mycpu->gd_cpuid), &nmp->base.lmsg);
 }
 
 /*
@@ -2506,21 +2500,21 @@ bridge_span(struct bridge_softc *sc, struct mbuf *m)
 }
 
 static void
-bridge_rtmsg_sync_handler(struct netmsg *nmsg)
+bridge_rtmsg_sync_handler(netmsg_t msg)
 {
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&msg->lmsg, mycpuid + 1);
 }
 
 static void
 bridge_rtmsg_sync(struct bridge_softc *sc)
 {
-       struct netmsg nmsg;
+       struct netmsg_base msg;
 
        ASSERT_IFNET_NOT_SERIALIZED_ALL(sc->sc_ifp);
 
-       netmsg_init(&nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, bridge_rtmsg_sync_handler);
-       ifnet_domsg(&nmsg.nm_lmsg, 0);
+       ifnet_domsg(&msg.lmsg, 0);
 }
 
 static __inline void
@@ -2595,9 +2589,9 @@ bridge_rtinstall_oncpu(struct bridge_softc *sc, const uint8_t *dst,
 }
 
 static void
-bridge_rtinstall_handler(struct netmsg *nmsg)
+bridge_rtinstall_handler(netmsg_t msg)
 {
-       struct netmsg_brsaddr *brmsg = (struct netmsg_brsaddr *)nmsg;
+       struct netmsg_brsaddr *brmsg = (struct netmsg_brsaddr *)msg;
        int error;
 
        error = bridge_rtinstall_oncpu(brmsg->br_softc,
@@ -2606,15 +2600,15 @@ bridge_rtinstall_handler(struct netmsg *nmsg)
                                       &brmsg->br_rtinfo);
        if (error) {
                KKASSERT(mycpuid == 0 && brmsg->br_rtinfo == NULL);
-               lwkt_replymsg(&nmsg->nm_lmsg, error);
+               lwkt_replymsg(&brmsg->base.lmsg, error);
                return;
        } else if (brmsg->br_rtinfo == NULL) {
                /* rtnode already exists for 'dst' */
                KKASSERT(mycpuid == 0);
-               lwkt_replymsg(&nmsg->nm_lmsg, 0);
+               lwkt_replymsg(&brmsg->base.lmsg, 0);
                return;
        }
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&brmsg->base.lmsg, mycpuid + 1);
 }
 
 /*
@@ -2642,7 +2636,7 @@ bridge_rtupdate(struct bridge_softc *sc, const uint8_t *dst,
                if (brmsg == NULL)
                        return ENOMEM;
 
-               netmsg_init(&brmsg->br_nmsg, NULL, &netisr_afree_rport,
+               netmsg_init(&brmsg->base, NULL, &netisr_afree_rport,
                            0, bridge_rtinstall_handler);
                memcpy(brmsg->br_dst, dst, ETHER_ADDR_LEN);
                brmsg->br_dst_if = dst_if;
@@ -2651,7 +2645,7 @@ bridge_rtupdate(struct bridge_softc *sc, const uint8_t *dst,
                brmsg->br_softc = sc;
                brmsg->br_rtinfo = NULL;
 
-               ifnet_sendmsg(&brmsg->br_nmsg.nm_lmsg, 0);
+               ifnet_sendmsg(&brmsg->base.lmsg, 0);
                return 0;
        }
        bridge_rtinfo_update(brt->brt_info, dst_if, 0, flags,
@@ -2667,7 +2661,7 @@ bridge_rtsaddr(struct bridge_softc *sc, const uint8_t *dst,
 
        ASSERT_IFNET_NOT_SERIALIZED_ALL(sc->sc_ifp);
 
-       netmsg_init(&brmsg.br_nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&brmsg.base, NULL, &curthread->td_msgport,
                    0, bridge_rtinstall_handler);
        memcpy(brmsg.br_dst, dst, ETHER_ADDR_LEN);
        brmsg.br_dst_if = dst_if;
@@ -2676,7 +2670,7 @@ bridge_rtsaddr(struct bridge_softc *sc, const uint8_t *dst,
        brmsg.br_softc = sc;
        brmsg.br_rtinfo = NULL;
 
-       return ifnet_domsg(&brmsg.br_nmsg.nm_lmsg, 0);
+       return ifnet_domsg(&brmsg.base.lmsg, 0);
 }
 
 /*
@@ -2695,44 +2689,44 @@ bridge_rtlookup(struct bridge_softc *sc, const uint8_t *addr)
 }
 
 static void
-bridge_rtreap_handler(struct netmsg *nmsg)
+bridge_rtreap_handler(netmsg_t msg)
 {
-       struct bridge_softc *sc = nmsg->nm_lmsg.u.ms_resultp;
+       struct bridge_softc *sc = msg->lmsg.u.ms_resultp;
        struct bridge_rtnode *brt, *nbrt;
 
        LIST_FOREACH_MUTABLE(brt, &sc->sc_rtlists[mycpuid], brt_list, nbrt) {
                if (brt->brt_info->bri_dead)
                        bridge_rtnode_destroy(sc, brt);
        }
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&msg->lmsg, mycpuid + 1);
 }
 
 static void
 bridge_rtreap(struct bridge_softc *sc)
 {
-       struct netmsg nmsg;
+       struct netmsg_base msg;
 
        ASSERT_IFNET_NOT_SERIALIZED_ALL(sc->sc_ifp);
 
-       netmsg_init(&nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, bridge_rtreap_handler);
-       nmsg.nm_lmsg.u.ms_resultp = sc;
+       msg.lmsg.u.ms_resultp = sc;
 
-       ifnet_domsg(&nmsg.nm_lmsg, 0);
+       ifnet_domsg(&msg.lmsg, 0);
 }
 
 static void
 bridge_rtreap_async(struct bridge_softc *sc)
 {
-       struct netmsg *nmsg;
+       struct netmsg_base *msg;
 
-       nmsg = kmalloc(sizeof(*nmsg), M_LWKTMSG, M_WAITOK);
+       msg = kmalloc(sizeof(*msg), M_LWKTMSG, M_WAITOK);
 
-       netmsg_init(nmsg, NULL, &netisr_afree_rport,
+       netmsg_init(msg, NULL, &netisr_afree_rport,
                    0, bridge_rtreap_handler);
-       nmsg->nm_lmsg.u.ms_resultp = sc;
+       msg->lmsg.u.ms_resultp = sc;
 
-       ifnet_sendmsg(&nmsg->nm_lmsg, 0);
+       ifnet_sendmsg(&msg->lmsg, 0);
 }
 
 /*
@@ -2804,7 +2798,7 @@ static void
 bridge_timer(void *arg)
 {
        struct bridge_softc *sc = arg;
-       struct lwkt_msg *lmsg;
+       struct netmsg_base *msg;
 
        KKASSERT(mycpuid == BRIDGE_CFGCPU);
 
@@ -2817,23 +2811,23 @@ bridge_timer(void *arg)
        }
        callout_deactivate(&sc->sc_brcallout);
 
-       lmsg = &sc->sc_brtimemsg.nm_lmsg;
-       KKASSERT(lmsg->ms_flags & MSGF_DONE);
-       lwkt_sendmsg(BRIDGE_CFGPORT, lmsg);
+       msg = &sc->sc_brtimemsg;
+       KKASSERT(msg->lmsg.ms_flags & MSGF_DONE);
+       lwkt_sendmsg(BRIDGE_CFGPORT, &msg->lmsg);
 
        crit_exit();
 }
 
 static void
-bridge_timer_handler(struct netmsg *nmsg)
+bridge_timer_handler(netmsg_t msg)
 {
-       struct bridge_softc *sc = nmsg->nm_lmsg.u.ms_resultp;
+       struct bridge_softc *sc = msg->lmsg.u.ms_resultp;
 
        KKASSERT(&curthread->td_msgport == BRIDGE_CFGPORT);
 
        crit_enter();
        /* Reply ASAP */
-       lwkt_replymsg(&nmsg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
        crit_exit();
 
        bridge_rtage(sc);
@@ -3636,15 +3630,15 @@ out:
 }
 
 static void
-bridge_enqueue_handler(struct netmsg *nmsg)
+bridge_enqueue_handler(netmsg_t msg)
 {
        struct netmsg_packet *nmp;
        struct ifnet *dst_ifp;
        struct mbuf *m;
 
-       nmp = (struct netmsg_packet *)nmsg;
+       nmp = &msg->packet;
        m = nmp->nm_packet;
-       dst_ifp = nmp->nm_netmsg.nm_lmsg.u.ms_resultp;
+       dst_ifp = nmp->base.lmsg.u.ms_resultp;
 
        bridge_handoff(dst_ifp, m);
 }
@@ -3669,9 +3663,9 @@ bridge_handoff(struct ifnet *dst_ifp, struct mbuf *m)
 }
 
 static void
-bridge_control_dispatch(struct netmsg *nmsg)
+bridge_control_dispatch(netmsg_t msg)
 {
-       struct netmsg_brctl *bc_msg = (struct netmsg_brctl *)nmsg;
+       struct netmsg_brctl *bc_msg = (struct netmsg_brctl *)msg;
        struct ifnet *bifp = bc_msg->bc_sc->sc_ifp;
        int error;
 
@@ -3679,7 +3673,7 @@ bridge_control_dispatch(struct netmsg *nmsg)
        error = bc_msg->bc_func(bc_msg->bc_sc, bc_msg->bc_arg);
        ifnet_deserialize_all(bifp);
 
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       lwkt_replymsg(&bc_msg->base.lmsg, error);
 }
 
 static int
@@ -3688,30 +3682,28 @@ bridge_control(struct bridge_softc *sc, u_long cmd,
 {
        struct ifnet *bifp = sc->sc_ifp;
        struct netmsg_brctl bc_msg;
-       struct netmsg *nmsg;
        int error;
 
        ASSERT_IFNET_SERIALIZED_ALL(bifp);
 
        bzero(&bc_msg, sizeof(bc_msg));
-       nmsg = &bc_msg.bc_nmsg;
 
-       netmsg_init(nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&bc_msg.base, NULL, &curthread->td_msgport,
                    0, bridge_control_dispatch);
        bc_msg.bc_func = bc_func;
        bc_msg.bc_sc = sc;
        bc_msg.bc_arg = bc_arg;
 
        ifnet_deserialize_all(bifp);
-       error = lwkt_domsg(BRIDGE_CFGPORT, &nmsg->nm_lmsg, 0);
+       error = lwkt_domsg(BRIDGE_CFGPORT, &bc_msg.base.lmsg, 0);
        ifnet_serialize_all(bifp);
        return error;
 }
 
 static void
-bridge_add_bif_handler(struct netmsg *nmsg)
+bridge_add_bif_handler(netmsg_t msg)
 {
-       struct netmsg_braddbif *amsg = (struct netmsg_braddbif *)nmsg;
+       struct netmsg_braddbif *amsg = (struct netmsg_braddbif *)msg;
        struct bridge_softc *sc;
        struct bridge_iflist *bif;
 
@@ -3725,7 +3717,7 @@ bridge_add_bif_handler(struct netmsg *nmsg)
 
        LIST_INSERT_HEAD(&sc->sc_iflists[mycpuid], bif, bif_next);
 
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&amsg->base.lmsg, mycpuid + 1);
 }
 
 static void
@@ -3736,19 +3728,19 @@ bridge_add_bif(struct bridge_softc *sc, struct bridge_ifinfo *bif_info,
 
        ASSERT_IFNET_NOT_SERIALIZED_ALL(sc->sc_ifp);
 
-       netmsg_init(&amsg.br_nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&amsg.base, NULL, &curthread->td_msgport,
                    0, bridge_add_bif_handler);
        amsg.br_softc = sc;
        amsg.br_bif_info = bif_info;
        amsg.br_bif_ifp = ifp;
 
-       ifnet_domsg(&amsg.br_nmsg.nm_lmsg, 0);
+       ifnet_domsg(&amsg.base.lmsg, 0);
 }
 
 static void
-bridge_del_bif_handler(struct netmsg *nmsg)
+bridge_del_bif_handler(netmsg_t msg)
 {
-       struct netmsg_brdelbif *dmsg = (struct netmsg_brdelbif *)nmsg;
+       struct netmsg_brdelbif *dmsg = (struct netmsg_brdelbif *)msg;
        struct bridge_softc *sc;
        struct bridge_iflist *bif;
 
@@ -3768,7 +3760,7 @@ bridge_del_bif_handler(struct netmsg *nmsg)
        /* Save the removed bif for later freeing */
        LIST_INSERT_HEAD(dmsg->br_bif_list, bif, bif_next);
 
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&dmsg->base.lmsg, mycpuid + 1);
 }
 
 static void
@@ -3779,19 +3771,19 @@ bridge_del_bif(struct bridge_softc *sc, struct bridge_ifinfo *bif_info,
 
        ASSERT_IFNET_NOT_SERIALIZED_ALL(sc->sc_ifp);
 
-       netmsg_init(&dmsg.br_nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&dmsg.base, NULL, &curthread->td_msgport,
                    0, bridge_del_bif_handler);
        dmsg.br_softc = sc;
        dmsg.br_bif_info = bif_info;
        dmsg.br_bif_list = saved_bifs;
 
-       ifnet_domsg(&dmsg.br_nmsg.nm_lmsg, 0);
+       ifnet_domsg(&dmsg.base.lmsg, 0);
 }
 
 static void
-bridge_set_bifflags_handler(struct netmsg *nmsg)
+bridge_set_bifflags_handler(netmsg_t msg)
 {
-       struct netmsg_brsflags *smsg = (struct netmsg_brsflags *)nmsg;
+       struct netmsg_brsflags *smsg = (struct netmsg_brsflags *)msg;
        struct bridge_softc *sc;
        struct bridge_iflist *bif;
 
@@ -3806,7 +3798,7 @@ bridge_set_bifflags_handler(struct netmsg *nmsg)
 
        bif->bif_flags = smsg->br_bif_flags;
 
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&smsg->base.lmsg, mycpuid + 1);
 }
 
 static void
@@ -3817,11 +3809,11 @@ bridge_set_bifflags(struct bridge_softc *sc, struct bridge_ifinfo *bif_info,
 
        ASSERT_IFNET_NOT_SERIALIZED_ALL(sc->sc_ifp);
 
-       netmsg_init(&smsg.br_nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&smsg.base, NULL, &curthread->td_msgport,
                    0, bridge_set_bifflags_handler);
        smsg.br_softc = sc;
        smsg.br_bif_info = bif_info;
        smsg.br_bif_flags = bif_flags;
 
-       ifnet_domsg(&smsg.br_nmsg.nm_lmsg, 0);
+       ifnet_domsg(&smsg.base.lmsg, 0);
 }
index 333a1a0..ab6bb5f 100644 (file)
@@ -332,9 +332,9 @@ struct bridge_softc {
        uint32_t                sc_brtcnt;      /* cur. # of addresses */
        uint32_t                sc_brttimeout;  /* rt timeout in seconds */
        struct callout          sc_brcallout;   /* bridge callout */
-       struct netmsg           sc_brtimemsg;   /* bridge callout msg */
+       struct netmsg_base      sc_brtimemsg;   /* bridge callout msg */
        struct callout          sc_bstpcallout; /* STP callout */
-       struct netmsg           sc_bstptimemsg; /* STP callout msg */
+       struct netmsg_base      sc_bstptimemsg; /* STP callout msg */
        struct bridge_iflist_head *sc_iflists;  /* percpu member if lists */
        struct bridge_rtnode_head **sc_rthashs; /* percpu forwarding tables */
        struct bridge_rtnode_head *sc_rtlists;  /* percpu lists of the above */
@@ -359,7 +359,7 @@ void        bstp_linkstate(struct ifnet *, int);
 void   bstp_stop(struct bridge_softc *);
 void   bstp_input(struct bridge_softc *, struct bridge_iflist *,
                   struct mbuf *);
-void   bstp_tick_handler(struct netmsg *);
+void   bstp_tick_handler(netmsg_t);
 
 void   bridge_enqueue(struct ifnet *, struct mbuf *);
 
index 86df63d..5912120 100644 (file)
@@ -138,7 +138,7 @@ static struct dn_flowset_head       flowset_table[DN_NR_HASH_MAX];
 /*
  * Variables for dummynet systimer
  */
-static struct netmsg   dn_netmsg;
+static struct netmsg_base dn_netmsg;
 static struct systimer dn_clock;
 static int             dn_hz = 1000;
 
@@ -187,7 +187,7 @@ static int  config_pipe(struct dn_ioc_pipe *);
 static void    dummynet_flush(void);
 
 static void    dummynet_clock(systimer_t, struct intrframe *);
-static void    dummynet(struct netmsg *);
+static void    dummynet(netmsg_t);
 
 static struct dn_pipe *dn_find_pipe(int);
 static struct dn_flow_set *dn_locate_flowset(int, int);
@@ -644,7 +644,7 @@ dn_expire_pipe_cb(struct dn_pipe *pipe, void *dummy __unused)
  * increment the current tick counter and schedule expired events.
  */
 static void
-dummynet(struct netmsg *msg)
+dummynet(netmsg_t msg)
 {
     void *p;
     struct dn_heap *h;
@@ -657,7 +657,7 @@ dummynet(struct netmsg *msg)
 
     /* Reply ASAP */
     crit_enter();
-    lwkt_replymsg(&msg->nm_lmsg, 0);
+    lwkt_replymsg(&msg->lmsg, 0);
     crit_exit();
 
     curr_time++;
@@ -1875,8 +1875,8 @@ dummynet_clock(systimer_t info __unused, struct intrframe *frame __unused)
             mycpuid, ip_dn_cpu));
 
     crit_enter();
-    if (DUMMYNET_LOADED && (dn_netmsg.nm_lmsg.ms_flags & MSGF_DONE))
-       lwkt_sendmsg(cpu_portfn(mycpuid), &dn_netmsg.nm_lmsg);
+    if (DUMMYNET_LOADED && (dn_netmsg.lmsg.ms_flags & MSGF_DONE))
+       lwkt_sendmsg(cpu_portfn(mycpuid), &dn_netmsg.lmsg);
     crit_exit();
 }
 
@@ -1903,7 +1903,7 @@ sysctl_dn_hz(SYSCTL_HANDLER_ARGS)
 }
 
 static void
-ip_dn_init_dispatch(struct netmsg *msg)
+ip_dn_init_dispatch(netmsg_t msg)
 {
     int i, error = 0;
 
@@ -1945,13 +1945,13 @@ ip_dn_init_dispatch(struct netmsg *msg)
 
 back:
     crit_exit();
-    lwkt_replymsg(&msg->nm_lmsg, error);
+    lwkt_replymsg(&msg->lmsg, error);
 }
 
 static int
 ip_dn_init(void)
 {
-    struct netmsg smsg;
+    struct netmsg_base smsg;
 
     if (ip_dn_cpu >= ncpus) {
        kprintf("%s: CPU%d does not exist, switch to CPU0\n",
@@ -1961,14 +1961,14 @@ ip_dn_init(void)
 
     netmsg_init(&smsg, NULL, &curthread->td_msgport,
                0, ip_dn_init_dispatch);
-    lwkt_domsg(cpu_portfn(ip_dn_cpu), &smsg.nm_lmsg, 0);
-    return smsg.nm_lmsg.ms_error;
+    lwkt_domsg(cpu_portfn(ip_dn_cpu), &smsg.lmsg, 0);
+    return smsg.lmsg.ms_error;
 }
 
 #ifdef KLD_MODULE
 
 static void
-ip_dn_stop_dispatch(struct netmsg *msg)
+ip_dn_stop_dispatch(netmsg_t msg)
 {
     crit_enter();
 
@@ -1980,18 +1980,18 @@ ip_dn_stop_dispatch(struct netmsg *msg)
     systimer_del(&dn_clock);
 
     crit_exit();
-    lwkt_replymsg(&msg->nm_lmsg, 0);
+    lwkt_replymsg(&msg->lmsg, 0);
 }
 
 
 static void
 ip_dn_stop(void)
 {
-    struct netmsg smsg;
+    struct netmsg_base smsg;
 
     netmsg_init(&smsg, NULL, &curthread->td_msgport,
                0, ip_dn_stop_dispatch);
-    lwkt_domsg(cpu_portfn(ip_dn_cpu), &smsg.nm_lmsg, 0);
+    lwkt_domsg(cpu_portfn(ip_dn_cpu), &smsg.lmsg, 0);
 
     netmsg_service_sync();
 }
index 214ae09..4467d47 100644 (file)
 
 #include <net/dummynet/ip_dummynet.h>
 
-static void    ip_dn_ether_output(struct netmsg *);
-static void    ip_dn_ether_demux(struct netmsg *);
-static void    ip_dn_ip_input(struct netmsg *);
-static void    ip_dn_ip_output(struct netmsg *);
+static void    ip_dn_ether_output(netmsg_t);
+static void    ip_dn_ether_demux(netmsg_t);
+static void    ip_dn_ip_input(netmsg_t);
+static void    ip_dn_ip_output(netmsg_t);
 
-static void    ip_dn_sockopt_dispatch(struct netmsg *);
-static void    ip_dn_freepkt_dispatch(struct netmsg *);
-static void    ip_dn_dispatch(struct netmsg *);
+static void    ip_dn_sockopt_dispatch(netmsg_t);
+static void    ip_dn_freepkt_dispatch(netmsg_t);
+static void    ip_dn_dispatch(netmsg_t);
 
 static void    ip_dn_freepkt(struct dn_pkt *);
 
@@ -90,12 +90,12 @@ ip_dn_queue(struct mbuf *m)
                ("mbuf is not tagged for dummynet!\n"));
 
        nmp = &m->m_hdr.mh_netmsg;
-       netmsg_init(&nmp->nm_netmsg, NULL, &netisr_apanic_rport,
+       netmsg_init(&nmp->base, NULL, &netisr_apanic_rport,
                    0, ip_dn_dispatch);
        nmp->nm_packet = m;
 
        port = cpu_portfn(ip_dn_cpu);
-       lwkt_sendmsg(port, &nmp->nm_netmsg.nm_lmsg);
+       lwkt_sendmsg(port, &nmp->base.lmsg);
 }
 
 void
@@ -109,11 +109,11 @@ ip_dn_packet_free(struct dn_pkt *pkt)
                ("mbuf is not tagged for dummynet!\n"));
 
        nmp = &m->m_hdr.mh_netmsg;
-       netmsg_init(&nmp->nm_netmsg, NULL, &netisr_apanic_rport,
+       netmsg_init(&nmp->base, NULL, &netisr_apanic_rport,
                    0, ip_dn_freepkt_dispatch);
        nmp->nm_packet = m;
 
-       lwkt_sendmsg(pkt->msgport, &nmp->nm_netmsg.nm_lmsg);
+       lwkt_sendmsg(pkt->msgport, &nmp->base.lmsg);
 }
 
 void
@@ -145,11 +145,10 @@ ip_dn_packet_redispatch(struct dn_pkt *pkt)
                ("mbuf is not tagged for dummynet!\n"));
 
        nmp = &m->m_hdr.mh_netmsg;
-       netmsg_init(&nmp->nm_netmsg, NULL, &netisr_apanic_rport,
-                   0, dispatch);
+       netmsg_init(&nmp->base, NULL, &netisr_apanic_rport, 0, dispatch);
        nmp->nm_packet = m;
 
-       lwkt_sendmsg(pkt->msgport, &nmp->nm_netmsg.nm_lmsg);
+       lwkt_sendmsg(pkt->msgport, &nmp->base.lmsg);
 }
 
 int
@@ -208,14 +207,14 @@ ip_dn_freepkt(struct dn_pkt *pkt)
 }
 
 static void
-ip_dn_freepkt_dispatch(struct netmsg *nmsg)
+ip_dn_freepkt_dispatch(netmsg_t nmsg)
 {
        struct netmsg_packet *nmp;
        struct mbuf *m;
        struct m_tag *mtag;
        struct dn_pkt *pkt;
 
-       nmp = (struct netmsg_packet *)nmsg;
+       nmp = &nmsg->packet;
        m = nmp->nm_packet;
        M_ASSERTPKTHDR(m);
        KASSERT(m->m_pkthdr.fw_flags & DUMMYNET_MBUF_TAGGED,
@@ -234,7 +233,7 @@ ip_dn_freepkt_dispatch(struct netmsg *nmsg)
 }
 
 static void
-ip_dn_dispatch(struct netmsg *nmsg)
+ip_dn_dispatch(netmsg_t nmsg)
 {
        struct netmsg_packet *nmp;
        struct mbuf *m;
@@ -246,7 +245,7 @@ ip_dn_dispatch(struct netmsg *nmsg)
                 "dummynet cpuid %d, mycpuid %d\n", __func__,
                 ip_dn_cpu, mycpuid));
 
-       nmp = (struct netmsg_packet *)nmsg;
+       nmp = &nmsg->packet;
        m = nmp->nm_packet;
        M_ASSERTPKTHDR(m);
        KASSERT(m->m_pkthdr.fw_flags & DUMMYNET_MBUF_TAGGED,
@@ -268,7 +267,7 @@ ip_dn_dispatch(struct netmsg *nmsg)
 }
 
 static void
-ip_dn_ip_output(struct netmsg *nmsg)
+ip_dn_ip_output(netmsg_t nmsg)
 {
        struct netmsg_packet *nmp;
        struct mbuf *m;
@@ -278,7 +277,7 @@ ip_dn_ip_output(struct netmsg *nmsg)
        ip_dn_unref_priv_t unref_priv;
        void *priv;
 
-       nmp = (struct netmsg_packet *)nmsg;
+       nmp = &nmsg->packet;
        m = nmp->nm_packet;
        M_ASSERTPKTHDR(m);
        KASSERT(m->m_pkthdr.fw_flags & DUMMYNET_MBUF_TAGGED,
@@ -317,7 +316,7 @@ ip_dn_ip_output(struct netmsg *nmsg)
 }
 
 static void
-ip_dn_ip_input(struct netmsg *nmsg)
+ip_dn_ip_input(netmsg_t nmsg)
 {
        struct netmsg_packet *nmp;
        struct mbuf *m;
@@ -326,7 +325,7 @@ ip_dn_ip_input(struct netmsg *nmsg)
        ip_dn_unref_priv_t unref_priv;
        void *priv;
 
-       nmp = (struct netmsg_packet *)nmsg;
+       nmp = &nmsg->packet;
        m = nmp->nm_packet;
        M_ASSERTPKTHDR(m);
        KASSERT(m->m_pkthdr.fw_flags & DUMMYNET_MBUF_TAGGED,
@@ -356,7 +355,7 @@ ip_dn_ip_input(struct netmsg *nmsg)
 }
 
 static void
-ip_dn_ether_demux(struct netmsg *nmsg)
+ip_dn_ether_demux(netmsg_t nmsg)
 {
        struct netmsg_packet *nmp;
        struct mbuf *m;
@@ -365,7 +364,7 @@ ip_dn_ether_demux(struct netmsg *nmsg)
        ip_dn_unref_priv_t unref_priv;
        void *priv;
 
-       nmp = (struct netmsg_packet *)nmsg;
+       nmp = &nmsg->packet;
        m = nmp->nm_packet;
        M_ASSERTPKTHDR(m);
        KASSERT(m->m_pkthdr.fw_flags & DUMMYNET_MBUF_TAGGED,
@@ -403,7 +402,7 @@ back:
 }
 
 static void
-ip_dn_ether_output(struct netmsg *nmsg)
+ip_dn_ether_output(netmsg_t nmsg)
 {
        struct netmsg_packet *nmp;
        struct mbuf *m;
@@ -412,7 +411,7 @@ ip_dn_ether_output(struct netmsg *nmsg)
        ip_dn_unref_priv_t unref_priv;
        void *priv;
 
-       nmp = (struct netmsg_packet *)nmsg;
+       nmp = &nmsg->packet;
        m = nmp->nm_packet;
        M_ASSERTPKTHDR(m);
        KASSERT(m->m_pkthdr.fw_flags & DUMMYNET_MBUF_TAGGED,
@@ -442,9 +441,9 @@ ip_dn_ether_output(struct netmsg *nmsg)
 }
 
 static void
-ip_dn_sockopt_dispatch(struct netmsg *nmsg)
+ip_dn_sockopt_dispatch(netmsg_t nmsg)
 {
-       lwkt_msg *msg = &nmsg->nm_lmsg;
+       lwkt_msg *msg = &nmsg->lmsg;
        struct dn_sopt *dn_sopt = msg->u.ms_resultp;
        int error;
 
@@ -464,24 +463,24 @@ static int
 ip_dn_sockopt_flush(struct sockopt *sopt)
 {
        struct dn_sopt dn_sopt;
-       struct netmsg smsg;
+       struct netmsg_base smsg;
 
        bzero(&dn_sopt, sizeof(dn_sopt));
        dn_sopt.dn_sopt_name = sopt->sopt_name;
 
        netmsg_init(&smsg, NULL, &curthread->td_msgport,
                    0, ip_dn_sockopt_dispatch);
-       smsg.nm_lmsg.u.ms_resultp = &dn_sopt;
-       lwkt_domsg(cpu_portfn(ip_dn_cpu), &smsg.nm_lmsg, 0);
+       smsg.lmsg.u.ms_resultp = &dn_sopt;
+       lwkt_domsg(cpu_portfn(ip_dn_cpu), &smsg.lmsg, 0);
 
-       return smsg.nm_lmsg.ms_error;
+       return smsg.lmsg.ms_error;
 }
 
 static int
 ip_dn_sockopt_get(struct sockopt *sopt)
 {
        struct dn_sopt dn_sopt;
-       struct netmsg smsg;
+       struct netmsg_base smsg;
        int error;
 
        bzero(&dn_sopt, sizeof(dn_sopt));
@@ -489,10 +488,10 @@ ip_dn_sockopt_get(struct sockopt *sopt)
 
        netmsg_init(&smsg, NULL, &curthread->td_msgport,
                    0, ip_dn_sockopt_dispatch);
-       smsg.nm_lmsg.u.ms_resultp = &dn_sopt;
-       lwkt_domsg(cpu_portfn(ip_dn_cpu), &smsg.nm_lmsg, 0);
+       smsg.lmsg.u.ms_resultp = &dn_sopt;
+       lwkt_domsg(cpu_portfn(ip_dn_cpu), &smsg.lmsg, 0);
 
-       error = smsg.nm_lmsg.ms_error;
+       error = smsg.lmsg.ms_error;
        if (error) {
                KKASSERT(dn_sopt.dn_sopt_arg == NULL);
                KKASSERT(dn_sopt.dn_sopt_arglen == 0);
@@ -509,7 +508,7 @@ ip_dn_sockopt_config(struct sockopt *sopt)
 {
        struct dn_ioc_pipe tmp_ioc_pipe;
        struct dn_sopt dn_sopt;
-       struct netmsg smsg;
+       struct netmsg_base smsg;
        int error;
 
        error = soopt_to_kbuf(sopt, &tmp_ioc_pipe, sizeof tmp_ioc_pipe,
@@ -524,8 +523,8 @@ ip_dn_sockopt_config(struct sockopt *sopt)
 
        netmsg_init(&smsg, NULL, &curthread->td_msgport,
                    0, ip_dn_sockopt_dispatch);
-       smsg.nm_lmsg.u.ms_resultp = &dn_sopt;
-       lwkt_domsg(cpu_portfn(ip_dn_cpu), &smsg.nm_lmsg, 0);
+       smsg.lmsg.u.ms_resultp = &dn_sopt;
+       lwkt_domsg(cpu_portfn(ip_dn_cpu), &smsg.lmsg, 0);
 
-       return smsg.nm_lmsg.ms_error;
+       return smsg.lmsg.ms_error;
 }
index 8143671..1f224c3 100644 (file)
@@ -115,21 +115,41 @@ static int gre_compute_route(struct gre_softc *sc);
 static void    greattach(void);
 
 #ifdef INET
+
 extern struct domain inetdomain;
+
 static const struct protosw in_gre_protosw =
-{ SOCK_RAW,     &inetdomain,    IPPROTO_GRE,    PR_ATOMIC|PR_ADDR,
-  gre_input,   rip_output,     rip_ctlinput,   rip_ctloutput,
-  cpu0_soport, cpu0_ctlport,
-  0,           0,              0,              0,
-  &rip_usrreqs
-};
+    {
+       .pr_type = SOCK_RAW,
+       .pr_domain = &inetdomain,
+       .pr_protocol = IPPROTO_GRE,
+       .pr_flags = PR_ATOMIC|PR_ADDR,
+
+       .pr_input = gre_input,
+       .pr_output = rip_output,
+       .pr_ctlinput = rip_ctlinput,
+       .pr_ctloutput = rip_ctloutput,
+
+       .pr_ctlport = cpu0_ctlport,
+       .pr_usrreqs = &rip_usrreqs
+    };
+
 static const struct protosw in_mobile_protosw =
-{ SOCK_RAW,     &inetdomain,    IPPROTO_MOBILE, PR_ATOMIC|PR_ADDR,
-  gre_mobile_input, rip_output, rip_ctlinput,   rip_ctloutput,
-  cpu0_soport, cpu0_ctlport,
-  0,           0,              0,              0,
-  &rip_usrreqs
-};
+    {
+       .pr_type = SOCK_RAW,
+       .pr_domain = &inetdomain,
+       .pr_protocol = IPPROTO_MOBILE,
+       .pr_flags = PR_ATOMIC|PR_ADDR,
+
+       .pr_input = gre_mobile_input,
+       .pr_output = rip_output,
+       .pr_ctlinput = rip_ctlinput,
+       .pr_ctloutput = rip_ctloutput,
+
+       .pr_ctlport = cpu0_ctlport,
+       .pr_usrreqs = &rip_usrreqs
+    };
+
 #endif
 
 SYSCTL_DECL(_net_link);
index 38002d0..7cdead3 100644 (file)
@@ -96,7 +96,7 @@
 #endif /* COMPAT_43 */
 
 struct netmsg_ifaddr {
-       struct netmsg   netmsg;
+       struct netmsg_base base;
        struct ifaddr   *ifa;
        struct ifnet    *ifp;
        int             tail;
@@ -253,7 +253,7 @@ static void
 if_start_ipifunc(void *arg)
 {
        struct ifnet *ifp = arg;
-       struct lwkt_msg *lmsg = &ifp->if_start_nmsg[mycpuid].nm_lmsg;
+       struct lwkt_msg *lmsg = &ifp->if_start_nmsg[mycpuid].lmsg;
 
        crit_enter();
        if (lmsg->ms_flags & MSGF_DONE)
@@ -322,9 +322,9 @@ if_start_need_schedule(struct ifaltq *ifq, int running)
 }
 
 static void
-if_start_dispatch(struct netmsg *nmsg)
+if_start_dispatch(netmsg_t msg)
 {
-       struct lwkt_msg *lmsg = &nmsg->nm_lmsg;
+       struct lwkt_msg *lmsg = &msg->base.lmsg;
        struct ifnet *ifp = lmsg->u.ms_resultp;
        struct ifaltq *ifq = &ifp->if_snd;
        int running = 0;
@@ -518,12 +518,12 @@ if_attach(struct ifnet *ifp, lwkt_serialize_t serializer)
                ifp->if_start_cpuid = if_start_cpuid_poll;
 #endif
 
-       ifp->if_start_nmsg = kmalloc(ncpus * sizeof(struct netmsg),
+       ifp->if_start_nmsg = kmalloc(ncpus * sizeof(*ifp->if_start_nmsg),
                                     M_LWKTMSG, M_WAITOK);
        for (i = 0; i < ncpus; ++i) {
                netmsg_init(&ifp->if_start_nmsg[i], NULL, &netisr_adone_rport,
                            0, if_start_dispatch);
-               ifp->if_start_nmsg[i].nm_lmsg.u.ms_resultp = ifp;
+               ifp->if_start_nmsg[i].lmsg.u.ms_resultp = ifp;
        }
 
        TAILQ_INSERT_TAIL(&ifnet, ifp, if_link);
@@ -1803,15 +1803,16 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct ucred *cred)
                case OSIOCGIFNETMASK:
                        cmd = SIOCGIFNETMASK;
                }
-               error =  so_pru_control(so, cmd, data, ifp);
-               switch (ocmd) {
 
+               error = so_pru_control_direct(so, cmd, data, ifp);
+
+               switch (ocmd) {
                case OSIOCGIFADDR:
                case OSIOCGIFDSTADDR:
                case OSIOCGIFBRDADDR:
                case OSIOCGIFNETMASK:
                        *(u_short *)&ifr->ifr_addr = ifr->ifr_addr.sa_family;
-
+                       break;
                }
            }
 #endif /* COMPAT_43 */
@@ -2559,7 +2560,7 @@ ifac_free(struct ifaddr_container *ifac, int cpu_id)
 }
 
 static void
-ifa_iflink_dispatch(struct netmsg *nmsg)
+ifa_iflink_dispatch(netmsg_t nmsg)
 {
        struct netmsg_ifaddr *msg = (struct netmsg_ifaddr *)nmsg;
        struct ifaddr *ifa = msg->ifa;
@@ -2582,7 +2583,7 @@ ifa_iflink_dispatch(struct netmsg *nmsg)
 
        crit_exit();
 
-       ifa_forwardmsg(&nmsg->nm_lmsg, cpu + 1);
+       ifa_forwardmsg(&nmsg->lmsg, cpu + 1);
 }
 
 void
@@ -2590,17 +2591,17 @@ ifa_iflink(struct ifaddr *ifa, struct ifnet *ifp, int tail)
 {
        struct netmsg_ifaddr msg;
 
-       netmsg_init(&msg.netmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                    0, ifa_iflink_dispatch);
        msg.ifa = ifa;
        msg.ifp = ifp;
        msg.tail = tail;
 
-       ifa_domsg(&msg.netmsg.nm_lmsg, 0);
+       ifa_domsg(&msg.base.lmsg, 0);
 }
 
 static void
-ifa_ifunlink_dispatch(struct netmsg *nmsg)
+ifa_ifunlink_dispatch(netmsg_t nmsg)
 {
        struct netmsg_ifaddr *msg = (struct netmsg_ifaddr *)nmsg;
        struct ifaddr *ifa = msg->ifa;
@@ -2620,7 +2621,7 @@ ifa_ifunlink_dispatch(struct netmsg *nmsg)
 
        crit_exit();
 
-       ifa_forwardmsg(&nmsg->nm_lmsg, cpu + 1);
+       ifa_forwardmsg(&nmsg->lmsg, cpu + 1);
 }
 
 void
@@ -2628,21 +2629,21 @@ ifa_ifunlink(struct ifaddr *ifa, struct ifnet *ifp)
 {
        struct netmsg_ifaddr msg;
 
-       netmsg_init(&msg.netmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                    0, ifa_ifunlink_dispatch);
        msg.ifa = ifa;
        msg.ifp = ifp;
 
-       ifa_domsg(&msg.netmsg.nm_lmsg, 0);
+       ifa_domsg(&msg.base.lmsg, 0);
 }
 
 static void
-ifa_destroy_dispatch(struct netmsg *nmsg)
+ifa_destroy_dispatch(netmsg_t nmsg)
 {
        struct netmsg_ifaddr *msg = (struct netmsg_ifaddr *)nmsg;
 
        IFAFREE(msg->ifa);
-       ifa_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifa_forwardmsg(&nmsg->lmsg, mycpuid + 1);
 }
 
 void
@@ -2650,11 +2651,11 @@ ifa_destroy(struct ifaddr *ifa)
 {
        struct netmsg_ifaddr msg;
 
-       netmsg_init(&msg.netmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                    0, ifa_destroy_dispatch);
        msg.ifa = ifa;
 
-       ifa_domsg(&msg.netmsg.nm_lmsg, 0);
+       ifa_domsg(&msg.base.lmsg, 0);
 }
 
 struct lwkt_port *
@@ -2695,11 +2696,11 @@ ifnet_sendmsg(struct lwkt_msg *lmsg, int cpu)
 static void
 ifnet_service_loop(void *arg __unused)
 {
-       struct netmsg *msg;
+       netmsg_t msg;
 
        while ((msg = lwkt_waitport(&curthread->td_msgport, 0))) {
-               KASSERT(msg->nm_dispatch, ("ifnet_service: badmsg"));
-               msg->nm_dispatch(msg);
+               KASSERT(msg->base.nm_dispatch, ("ifnet_service: badmsg"));
+               msg->base.nm_dispatch(msg);
        }
 }
 
index 14a5603..8f2c83e 100644 (file)
@@ -1041,7 +1041,7 @@ ether_input_ipifunc(void *arg)
        do {
                next = m->m_nextpkt;
                m->m_nextpkt = NULL;
-               lwkt_sendmsg(port, &m->m_hdr.mh_netmsg.nm_netmsg.nm_lmsg);
+               lwkt_sendmsg(port, &m->m_hdr.mh_netmsg.base.lmsg);
                m = next;
        } while (m != NULL);
 }
@@ -1484,9 +1484,9 @@ failed:
 }
 
 static void
-ether_input_handler(struct netmsg *nmsg)
+ether_input_handler(netmsg_t nmsg)
 {
-       struct netmsg_packet *nmp = (struct netmsg_packet *)nmsg;
+       struct netmsg_packet *nmp = &nmsg->packet;      /* actual size */
        struct ether_header *eh;
        struct ifnet *ifp;
        struct mbuf *m;
@@ -1528,10 +1528,10 @@ ether_dispatch(int isr, struct mbuf *m, struct mbuf_chain *chain)
 
        KKASSERT(m->m_flags & M_HASH);
        pmsg = &m->m_hdr.mh_netmsg;
-       netmsg_init(&pmsg->nm_netmsg, NULL, &netisr_apanic_rport,
+       netmsg_init(&pmsg->base, NULL, &netisr_apanic_rport,
                    0, ether_input_handler);
        pmsg->nm_packet = m;
-       pmsg->nm_netmsg.nm_lmsg.u.ms_result = isr;
+       pmsg->base.lmsg.u.ms_result = isr;
 
        if (chain != NULL) {
                int cpuid = m->m_pkthdr.hash;
@@ -1546,8 +1546,7 @@ ether_dispatch(int isr, struct mbuf *m, struct mbuf_chain *chain)
                }
                m->m_nextpkt = NULL;
        } else {
-               lwkt_sendmsg(cpu_portfn(m->m_pkthdr.hash),
-                            &pmsg->nm_netmsg.nm_lmsg);
+               lwkt_sendmsg(cpu_portfn(m->m_pkthdr.hash), &pmsg->base.lmsg);
        }
 }
 
index 3a11cb0..407259f 100644 (file)
@@ -139,7 +139,7 @@ struct iopoll_ctx {
        uint32_t                stalled;                /* statistics */
        uint32_t                pending_polls;          /* state */
 
-       struct netmsg           poll_netmsg;
+       struct netmsg_base      poll_netmsg;
 
        int                     poll_cpuid;
        int                     pollhz;
@@ -151,7 +151,7 @@ struct iopoll_ctx {
        uint32_t                poll_handlers; /* next free entry in pr[]. */
        struct iopoll_rec       pr[IFPOLL_LIST_LEN];
 
-       struct netmsg           poll_more_netmsg;
+       struct netmsg_base      poll_more_netmsg;
 
        uint32_t                poll_burst;             /* state */
        uint32_t                poll_burst_max;         /* tunable */
@@ -185,7 +185,7 @@ struct stpoll_rec {
 };
 
 struct stpoll_ctx {
-       struct netmsg           poll_netmsg;
+       struct netmsg_base      poll_netmsg;
 
        int                     pollhz;
 
@@ -197,19 +197,19 @@ struct stpoll_ctx {
 };
 
 struct iopoll_sysctl_netmsg {
-       struct netmsg           nmsg;
+       struct netmsg_base      base;
        struct iopoll_ctx       *ctx;
 };
 
 void           ifpoll_init_pcpu(int);
-static void    ifpoll_register_handler(struct netmsg *);
-static void    ifpoll_deregister_handler(struct netmsg *);
+static void    ifpoll_register_handler(netmsg_t);
+static void    ifpoll_deregister_handler(netmsg_t);
 
 /*
  * Status polling
  */
 static void    stpoll_init(void);
-static void    stpoll_handler(struct netmsg *);
+static void    stpoll_handler(netmsg_t);
 static void    stpoll_clock(struct stpoll_ctx *);
 static int     stpoll_register(struct ifnet *, const struct ifpoll_status *);
 static int     stpoll_deregister(struct ifnet *);
@@ -219,8 +219,8 @@ static int  stpoll_deregister(struct ifnet *);
  */
 static struct iopoll_ctx *iopoll_ctx_create(int, int);
 static void    iopoll_init(int);
-static void    iopoll_handler(struct netmsg *);
-static void    iopollmore_handler(struct netmsg *);
+static void    iopoll_handler(netmsg_t);
+static void    iopollmore_handler(netmsg_t);
 static void    iopoll_clock(struct iopoll_ctx *);
 static int     iopoll_register(struct ifnet *, struct iopoll_ctx *,
                    const struct ifpoll_io *);
@@ -228,9 +228,9 @@ static int  iopoll_deregister(struct ifnet *, struct iopoll_ctx *);
 
 static void    iopoll_add_sysctl(struct sysctl_ctx_list *,
                    struct sysctl_oid_list *, struct iopoll_ctx *);
-static void    sysctl_burstmax_handler(struct netmsg *);
+static void    sysctl_burstmax_handler(netmsg_t);
 static int     sysctl_burstmax(SYSCTL_HANDLER_ARGS);
-static void    sysctl_eachburst_handler(struct netmsg *);
+static void    sysctl_eachburst_handler(netmsg_t);
 static int     sysctl_eachburst(SYSCTL_HANDLER_ARGS);
 
 /*
@@ -241,9 +241,9 @@ static void poll_comm_start(int);
 static void    poll_comm_adjust_pollhz(struct poll_comm *);
 static void    poll_comm_systimer0(systimer_t, struct intrframe *);
 static void    poll_comm_systimer(systimer_t, struct intrframe *);
-static void    sysctl_pollhz_handler(struct netmsg *);
-static void    sysctl_stfrac_handler(struct netmsg *);
-static void    sysctl_txfrac_handler(struct netmsg *);
+static void    sysctl_pollhz_handler(netmsg_t);
+static void    sysctl_stfrac_handler(netmsg_t);
+static void    sysctl_txfrac_handler(netmsg_t);
 static int     sysctl_pollhz(SYSCTL_HANDLER_ARGS);
 static int     sysctl_stfrac(SYSCTL_HANDLER_ARGS);
 static int     sysctl_txfrac(SYSCTL_HANDLER_ARGS);
@@ -272,28 +272,28 @@ TUNABLE_INT("net.ifpoll.status_frac", &ifpoll_stfrac);
 TUNABLE_INT("net.ifpoll.tx_frac", &ifpoll_txfrac);
 
 static __inline void
-ifpoll_sendmsg_oncpu(struct netmsg *msg)
+ifpoll_sendmsg_oncpu(netmsg_t msg)
 {
-       if (msg->nm_lmsg.ms_flags & MSGF_DONE)
-               ifnet_sendmsg(&msg->nm_lmsg, mycpuid);
+       if (msg->lmsg.ms_flags & MSGF_DONE)
+               ifnet_sendmsg(&msg->lmsg, mycpuid);
 }
 
 static __inline void
 sched_stpoll(struct stpoll_ctx *st_ctx)
 {
-       ifpoll_sendmsg_oncpu(&st_ctx->poll_netmsg);
+       ifpoll_sendmsg_oncpu((netmsg_t)&st_ctx->poll_netmsg);
 }
 
 static __inline void
 sched_iopoll(struct iopoll_ctx *io_ctx)
 {
-       ifpoll_sendmsg_oncpu(&io_ctx->poll_netmsg);
+       ifpoll_sendmsg_oncpu((netmsg_t)&io_ctx->poll_netmsg);
 }
 
 static __inline void
 sched_iopollmore(struct iopoll_ctx *io_ctx)
 {
-       ifpoll_sendmsg_oncpu(&io_ctx->poll_more_netmsg);
+       ifpoll_sendmsg_oncpu((netmsg_t)&io_ctx->poll_more_netmsg);
 }
 
 static __inline void
@@ -346,7 +346,7 @@ int
 ifpoll_register(struct ifnet *ifp)
 {
        struct ifpoll_info info;
-       struct netmsg nmsg;
+       struct netmsg_base nmsg;
        int error;
 
        if (ifp->if_qpoll == NULL) {
@@ -376,9 +376,9 @@ ifpoll_register(struct ifnet *ifp)
 
        netmsg_init(&nmsg, NULL, &curthread->td_msgport,
                    0, ifpoll_register_handler);
-       nmsg.nm_lmsg.u.ms_resultp = &info;
+       nmsg.lmsg.u.ms_resultp = &info;
 
-       error = ifnet_domsg(&nmsg.nm_lmsg, 0);
+       error = ifnet_domsg(&nmsg.lmsg, 0);
        if (error) {
                if (!ifpoll_deregister(ifp)) {
                        if_printf(ifp, "ifpoll_register: "
@@ -391,7 +391,7 @@ ifpoll_register(struct ifnet *ifp)
 int
 ifpoll_deregister(struct ifnet *ifp)
 {
-       struct netmsg nmsg;
+       struct netmsg_base nmsg;
        int error;
 
        if (ifp->if_qpoll == NULL)
@@ -409,9 +409,9 @@ ifpoll_deregister(struct ifnet *ifp)
 
        netmsg_init(&nmsg, NULL, &curthread->td_msgport,
                    0, ifpoll_deregister_handler);
-       nmsg.nm_lmsg.u.ms_resultp = ifp;
+       nmsg.lmsg.u.ms_resultp = ifp;
 
-       error = ifnet_domsg(&nmsg.nm_lmsg, 0);
+       error = ifnet_domsg(&nmsg.lmsg, 0);
        if (!error) {
                ifnet_serialize_all(ifp);
                ifp->if_qpoll(ifp, NULL);
@@ -421,9 +421,9 @@ ifpoll_deregister(struct ifnet *ifp)
 }
 
 static void
-ifpoll_register_handler(struct netmsg *nmsg)
+ifpoll_register_handler(netmsg_t nmsg)
 {
-       const struct ifpoll_info *info = nmsg->nm_lmsg.u.ms_resultp;
+       const struct ifpoll_info *info = nmsg->lmsg.u.ms_resultp;
        int cpuid = mycpuid, nextcpu;
        int error;
 
@@ -451,18 +451,18 @@ ifpoll_register_handler(struct netmsg *nmsg)
 
        nextcpu = cpuid + 1;
        if (nextcpu < ifpoll_ncpus)
-               ifnet_forwardmsg(&nmsg->nm_lmsg, nextcpu);
+               ifnet_forwardmsg(&nmsg->lmsg, nextcpu);
        else
-               lwkt_replymsg(&nmsg->nm_lmsg, 0);
+               lwkt_replymsg(&nmsg->lmsg, 0);
        return;
 failed:
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       lwkt_replymsg(&nmsg->lmsg, error);
 }
 
 static void
-ifpoll_deregister_handler(struct netmsg *nmsg)
+ifpoll_deregister_handler(netmsg_t nmsg)
 {
-       struct ifnet *ifp = nmsg->nm_lmsg.u.ms_resultp;
+       struct ifnet *ifp = nmsg->lmsg.u.ms_resultp;
        int cpuid = mycpuid, nextcpu;
 
        KKASSERT(cpuid < ifpoll_ncpus);
@@ -479,9 +479,9 @@ ifpoll_deregister_handler(struct netmsg *nmsg)
 
        nextcpu = cpuid + 1;
        if (nextcpu < ifpoll_ncpus)
-               ifnet_forwardmsg(&nmsg->nm_lmsg, nextcpu);
+               ifnet_forwardmsg(&nmsg->lmsg, nextcpu);
        else
-               lwkt_replymsg(&nmsg->nm_lmsg, 0);
+               lwkt_replymsg(&nmsg->lmsg, 0);
 }
 
 static void
@@ -512,7 +512,7 @@ stpoll_init(void)
  * once per polling systimer tick.
  */
 static void
-stpoll_handler(struct netmsg *msg)
+stpoll_handler(netmsg_t msg)
 {
        struct stpoll_ctx *st_ctx = &stpoll_context;
        struct thread *td = curthread;
@@ -523,7 +523,7 @@ stpoll_handler(struct netmsg *msg)
        crit_enter_quick(td);
 
        /* Reply ASAP */
-       lwkt_replymsg(&msg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
 
        if (st_ctx->poll_handlers == 0) {
                crit_exit_quick(td);
@@ -692,11 +692,11 @@ iopoll_ctx_create(int cpuid, int poll_type)
 
        netmsg_init(&io_ctx->poll_netmsg, NULL, &netisr_adone_rport,
                    0, iopoll_handler);
-       io_ctx->poll_netmsg.nm_lmsg.u.ms_resultp = io_ctx;
+       io_ctx->poll_netmsg.lmsg.u.ms_resultp = io_ctx;
 
        netmsg_init(&io_ctx->poll_more_netmsg, NULL, &netisr_adone_rport,
                    0, iopollmore_handler);
-       io_ctx->poll_more_netmsg.nm_lmsg.u.ms_resultp = io_ctx;
+       io_ctx->poll_more_netmsg.lmsg.u.ms_resultp = io_ctx;
 
        /*
         * Initialize per-cpu sysctl nodes
@@ -779,19 +779,19 @@ iopoll_clock(struct iopoll_ctx *io_ctx)
  * ISR to be scheduled in the handler.
  */
 static void
-iopoll_handler(struct netmsg *msg)
+iopoll_handler(netmsg_t msg)
 {
        struct iopoll_ctx *io_ctx;
        struct thread *td = curthread;
        int i, cycles;
 
-       io_ctx = msg->nm_lmsg.u.ms_resultp;
+       io_ctx = msg->lmsg.u.ms_resultp;
        KKASSERT(&td->td_msgport == ifnet_portfn(io_ctx->poll_cpuid));
 
        crit_enter_quick(td);
 
        /* Reply ASAP */
-       lwkt_replymsg(&msg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
 
        if (io_ctx->poll_handlers == 0) {
                crit_exit_quick(td);
@@ -848,7 +848,7 @@ iopoll_handler(struct netmsg *msg)
  * work performed in low level handling.
  */
 static void
-iopollmore_handler(struct netmsg *msg)
+iopollmore_handler(netmsg_t msg)
 {
        struct thread *td = curthread;
        struct iopoll_ctx *io_ctx;
@@ -856,13 +856,13 @@ iopollmore_handler(struct netmsg *msg)
        int kern_load;
        uint32_t pending_polls;
 
-       io_ctx = msg->nm_lmsg.u.ms_resultp;
+       io_ctx = msg->lmsg.u.ms_resultp;
        KKASSERT(&td->td_msgport == ifnet_portfn(io_ctx->poll_cpuid));
 
        crit_enter_quick(td);
 
        /* Replay ASAP */
-       lwkt_replymsg(&msg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
 
        if (io_ctx->poll_handlers == 0) {
                crit_exit_quick(td);
@@ -967,7 +967,7 @@ iopoll_add_sysctl(struct sysctl_ctx_list *ctx, struct sysctl_oid_list *parent,
 }
 
 static void
-sysctl_burstmax_handler(struct netmsg *nmsg)
+sysctl_burstmax_handler(netmsg_t nmsg)
 {
        struct iopoll_sysctl_netmsg *msg = (struct iopoll_sysctl_netmsg *)nmsg;
        struct iopoll_ctx *io_ctx;
@@ -975,7 +975,7 @@ sysctl_burstmax_handler(struct netmsg *nmsg)
        io_ctx = msg->ctx;
        KKASSERT(&curthread->td_msgport == ifnet_portfn(io_ctx->poll_cpuid));
 
-       io_ctx->poll_burst_max = nmsg->nm_lmsg.u.ms_result;
+       io_ctx->poll_burst_max = nmsg->lmsg.u.ms_result;
        if (io_ctx->poll_each_burst > io_ctx->poll_burst_max)
                io_ctx->poll_each_burst = io_ctx->poll_burst_max;
        if (io_ctx->poll_burst > io_ctx->poll_burst_max)
@@ -983,7 +983,7 @@ sysctl_burstmax_handler(struct netmsg *nmsg)
        if (io_ctx->residual_burst > io_ctx->poll_burst_max)
                io_ctx->residual_burst = io_ctx->poll_burst_max;
 
-       lwkt_replymsg(&nmsg->nm_lmsg, 0);
+       lwkt_replymsg(&nmsg->lmsg, 0);
 }
 
 static int
@@ -991,7 +991,6 @@ sysctl_burstmax(SYSCTL_HANDLER_ARGS)
 {
        struct iopoll_ctx *io_ctx = arg1;
        struct iopoll_sysctl_netmsg msg;
-       struct netmsg *nmsg;
        uint32_t burst_max;
        int error;
 
@@ -1004,17 +1003,16 @@ sysctl_burstmax(SYSCTL_HANDLER_ARGS)
        else if (burst_max > MAX_IOPOLL_BURST_MAX)
                burst_max = MAX_IOPOLL_BURST_MAX;
 
-       nmsg = &msg.nmsg;
-       netmsg_init(nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                    0, sysctl_burstmax_handler);
-       nmsg->nm_lmsg.u.ms_result = burst_max;
+       msg.base.lmsg.u.ms_result = burst_max;
        msg.ctx = io_ctx;
 
-       return ifnet_domsg(&nmsg->nm_lmsg, io_ctx->poll_cpuid);
+       return ifnet_domsg(&msg.base.lmsg, io_ctx->poll_cpuid);
 }
 
 static void
-sysctl_eachburst_handler(struct netmsg *nmsg)
+sysctl_eachburst_handler(netmsg_t nmsg)
 {
        struct iopoll_sysctl_netmsg *msg = (struct iopoll_sysctl_netmsg *)nmsg;
        struct iopoll_ctx *io_ctx;
@@ -1023,14 +1021,14 @@ sysctl_eachburst_handler(struct netmsg *nmsg)
        io_ctx = msg->ctx;
        KKASSERT(&curthread->td_msgport == ifnet_portfn(io_ctx->poll_cpuid));
 
-       each_burst = nmsg->nm_lmsg.u.ms_result;
+       each_burst = nmsg->lmsg.u.ms_result;
        if (each_burst > io_ctx->poll_burst_max)
                each_burst = io_ctx->poll_burst_max;
        else if (each_burst < 1)
                each_burst = 1;
        io_ctx->poll_each_burst = each_burst;
 
-       lwkt_replymsg(&nmsg->nm_lmsg, 0);
+       lwkt_replymsg(&nmsg->lmsg, 0);
 }
 
 static int
@@ -1038,7 +1036,6 @@ sysctl_eachburst(SYSCTL_HANDLER_ARGS)
 {
        struct iopoll_ctx *io_ctx = arg1;
        struct iopoll_sysctl_netmsg msg;
-       struct netmsg *nmsg;
        uint32_t each_burst;
        int error;
 
@@ -1047,13 +1044,12 @@ sysctl_eachburst(SYSCTL_HANDLER_ARGS)
        if (error || req->newptr == NULL)
                return error;
 
-       nmsg = &msg.nmsg;
-       netmsg_init(nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                    0, sysctl_eachburst_handler);
-       nmsg->nm_lmsg.u.ms_result = each_burst;
+       msg.base.lmsg.u.ms_result = each_burst;
        msg.ctx = io_ctx;
 
-       return ifnet_domsg(&nmsg->nm_lmsg, io_ctx->poll_cpuid);
+       return ifnet_domsg(&msg.base.lmsg, io_ctx->poll_cpuid);
 }
 
 static int
@@ -1257,7 +1253,7 @@ static int
 sysctl_pollhz(SYSCTL_HANDLER_ARGS)
 {
        struct poll_comm *comm = arg1;
-       struct netmsg nmsg;
+       struct netmsg_base nmsg;
        int error, phz;
 
        phz = comm->pollhz;
@@ -1271,20 +1267,20 @@ sysctl_pollhz(SYSCTL_HANDLER_ARGS)
 
        netmsg_init(&nmsg, NULL, &curthread->td_msgport,
                    0, sysctl_pollhz_handler);
-       nmsg.nm_lmsg.u.ms_result = phz;
+       nmsg.lmsg.u.ms_result = phz;
 
-       return ifnet_domsg(&nmsg.nm_lmsg, comm->poll_cpuid);
+       return ifnet_domsg(&nmsg.lmsg, comm->poll_cpuid);
 }
 
 static void
-sysctl_pollhz_handler(struct netmsg *nmsg)
+sysctl_pollhz_handler(netmsg_t nmsg)
 {
        struct poll_comm *comm = poll_common[mycpuid];
 
        KKASSERT(&curthread->td_msgport == ifnet_portfn(comm->poll_cpuid));
 
        /* Save polling frequency */
-       comm->pollhz = nmsg->nm_lmsg.u.ms_result;
+       comm->pollhz = nmsg->lmsg.u.ms_result;
 
        /*
         * Adjust cached pollhz
@@ -1300,14 +1296,14 @@ sysctl_pollhz_handler(struct netmsg *nmsg)
         */
        poll_comm_adjust_pollhz(comm);
 
-       lwkt_replymsg(&nmsg->nm_lmsg, 0);
+       lwkt_replymsg(&nmsg->lmsg, 0);
 }
 
 static int
 sysctl_stfrac(SYSCTL_HANDLER_ARGS)
 {
        struct poll_comm *comm = arg1;
-       struct netmsg nmsg;
+       struct netmsg_base nmsg;
        int error, stfrac;
 
        KKASSERT(comm->poll_cpuid == 0);
@@ -1321,16 +1317,16 @@ sysctl_stfrac(SYSCTL_HANDLER_ARGS)
 
        netmsg_init(&nmsg, NULL, &curthread->td_msgport,
                    0, sysctl_stfrac_handler);
-       nmsg.nm_lmsg.u.ms_result = stfrac;
+       nmsg.lmsg.u.ms_result = stfrac;
 
-       return ifnet_domsg(&nmsg.nm_lmsg, comm->poll_cpuid);
+       return ifnet_domsg(&nmsg.lmsg, comm->poll_cpuid);
 }
 
 static void
-sysctl_stfrac_handler(struct netmsg *nmsg)
+sysctl_stfrac_handler(netmsg_t nmsg)
 {
        struct poll_comm *comm = poll_common[mycpuid];
-       int stfrac = nmsg->nm_lmsg.u.ms_result;
+       int stfrac = nmsg->lmsg.u.ms_result;
 
        KKASSERT(&curthread->td_msgport == ifnet_portfn(comm->poll_cpuid));
 
@@ -1340,14 +1336,14 @@ sysctl_stfrac_handler(struct netmsg *nmsg)
                comm->stfrac_count = comm->poll_stfrac;
        crit_exit();
 
-       lwkt_replymsg(&nmsg->nm_lmsg, 0);
+       lwkt_replymsg(&nmsg->lmsg, 0);
 }
 
 static int
 sysctl_txfrac(SYSCTL_HANDLER_ARGS)
 {
        struct poll_comm *comm = arg1;
-       struct netmsg nmsg;
+       struct netmsg_base nmsg;
        int error, txfrac;
 
        txfrac = comm->poll_txfrac;
@@ -1359,16 +1355,16 @@ sysctl_txfrac(SYSCTL_HANDLER_ARGS)
 
        netmsg_init(&nmsg, NULL, &curthread->td_msgport,
                    0, sysctl_txfrac_handler);
-       nmsg.nm_lmsg.u.ms_result = txfrac;
+       nmsg.lmsg.u.ms_result = txfrac;
 
-       return ifnet_domsg(&nmsg.nm_lmsg, comm->poll_cpuid);
+       return ifnet_domsg(&nmsg.lmsg, comm->poll_cpuid);
 }
 
 static void
-sysctl_txfrac_handler(struct netmsg *nmsg)
+sysctl_txfrac_handler(netmsg_t nmsg)
 {
        struct poll_comm *comm = poll_common[mycpuid];
-       int txfrac = nmsg->nm_lmsg.u.ms_result;
+       int txfrac = nmsg->lmsg.u.ms_result;
 
        KKASSERT(&curthread->td_msgport == ifnet_portfn(comm->poll_cpuid));
 
@@ -1378,5 +1374,5 @@ sysctl_txfrac_handler(struct netmsg *nmsg)
                comm->txfrac_count = comm->poll_txfrac;
        crit_exit();
 
-       lwkt_replymsg(&nmsg->nm_lmsg, 0);
+       lwkt_replymsg(&nmsg->lmsg, 0);
 }
index 3334f05..f88573f 100644 (file)
@@ -88,7 +88,7 @@ struct        ifaddr_container;
 struct ifaddr;
 struct lwkt_port;
 struct lwkt_msg;
-struct netmsg;
+union  netmsg;
 struct pktinfo;
 struct ifpoll_info;
 
@@ -273,7 +273,7 @@ struct ifnet {
        struct lwkt_serialize *if_serializer;   /* serializer or MP lock */
        struct lwkt_serialize if_default_serializer; /* if not supplied */
        int     if_cpuid;
-       struct netmsg *if_start_nmsg; /* percpu messages to schedule if_start */
+       struct netmsg_base *if_start_nmsg; /* percpu msgs to sched if_start */
        void    *if_pf_kif; /* pf interface abstraction */
        union {
                void *carp_s;           /* carp structure (used by !carp ifs) */
index c7ab539..8c2ac22 100644 (file)
@@ -1708,16 +1708,19 @@ encap_send(struct ip *ip, struct vif *vifp, struct mbuf *m)
  *
  * This is similar to mroute_encapcheck() + mroute_encap_input() in -current.
  */
-static void
-X_ipip_input(struct mbuf *m, int off, int proto)
+static int
+X_ipip_input(struct mbuf **mp, int *offp, int proto)
 {
+    struct mbuf *m = *mp;
     struct ip *ip = mtod(m, struct ip *);
     int hlen = ip->ip_hl << 2;
 
     if (!have_encap_tunnel) {
-       rip_input(m, off, proto);
-       return;
+       rip_input(mp, offp, proto);
+       return(IPPROTO_DONE);
     }
+    *mp = NULL;
+
     /*
      * dump the packet if it's not to a multicast destination or if
      * we don't have an encapsulating tunnel with the source.
@@ -1728,7 +1731,7 @@ X_ipip_input(struct mbuf *m, int off, int proto)
     if (!IN_MULTICAST(ntohl(((struct ip *)((char *)ip+hlen))->ip_dst.s_addr))) {
        ++mrtstat.mrts_bad_tunnel;
        m_freem(m);
-       return;
+       return(IPPROTO_DONE);
     }
     if (ip->ip_src.s_addr != last_encap_src) {
        struct vif *vifp = viftable;
@@ -1751,7 +1754,7 @@ X_ipip_input(struct mbuf *m, int off, int proto)
        if (mrtdebug)
            log(LOG_DEBUG, "ip_mforward: no tunnel with %lx\n",
                (u_long)ntohl(ip->ip_src.s_addr));
-       return;
+       return(IPPROTO_DONE);
     }
 
     if (hlen > sizeof(struct ip))
@@ -1762,6 +1765,7 @@ X_ipip_input(struct mbuf *m, int off, int proto)
     m->m_pkthdr.rcvif = last_encap_vif->v_ifp;
 
     netisr_queue(NETISR_IP, m);
+    return(IPPROTO_DONE);
 }
 
 /*
@@ -2108,26 +2112,24 @@ X_ip_rsvp_force_done(struct socket *so)
     lwkt_reltoken(&mroute_token);
 }
 
-static void
-X_rsvp_input(struct mbuf *m, ...)
+static int
+X_rsvp_input(struct mbuf **mp, int *offp, int proto)
 {
     int vifi;
+    struct mbuf *m = *mp;
     struct ip *ip = mtod(m, struct ip *);
     struct sockaddr_in rsvp_src = { sizeof rsvp_src, AF_INET };
     struct ifnet *ifp;
-    int off, proto;
+    int off;
 #ifdef ALTQ
     /* support IP_RECVIF used by rsvpd rel4.2a1 */
     struct inpcb *inp;
     struct socket *so;
     struct mbuf *opts;
 #endif
-    __va_list ap;
 
-    __va_start(ap, m);
-    off = __va_arg(ap, int);
-    proto = __va_arg(ap, int);
-    __va_end(ap);
+    off = *offp;
+    *mp = NULL;
 
     if (rsvpdebug)
        kprintf("rsvp_input: rsvp_on %d\n",rsvp_on);
@@ -2138,7 +2140,7 @@ X_rsvp_input(struct mbuf *m, ...)
      */
     if (!rsvp_on) {
        m_freem(m);
-       return;
+       return(IPPROTO_DONE);
     }
 
     lwkt_gettoken(&mroute_token);
@@ -2170,7 +2172,8 @@ X_rsvp_input(struct mbuf *m, ...)
        if (ip_rsvpd != NULL) {
            if (rsvpdebug)
                kprintf("rsvp_input: Sending packet up old-style socket\n");
-           rip_input(m, off, proto);  /* xxx */
+           *mp = m;
+           rip_input(mp, offp, proto);  /* xxx */
        } else {
            if (rsvpdebug && vifi == numvifs)
                kprintf("rsvp_input: Can't find vif for packet.\n");
@@ -2179,7 +2182,7 @@ X_rsvp_input(struct mbuf *m, ...)
            m_freem(m);
        }
        lwkt_reltoken(&mroute_token);
-       return;
+       return(IPPROTO_DONE);
     }
     rsvp_src.sin_addr = ip->ip_src;
 
@@ -2191,8 +2194,9 @@ X_rsvp_input(struct mbuf *m, ...)
     opts = NULL;
     inp = (struct inpcb *)so->so_pcb;
     if (inp->inp_flags & INP_CONTROLOPTS ||
-       inp->inp_socket->so_options & SO_TIMESTAMP)
+       inp->inp_socket->so_options & SO_TIMESTAMP) {
        ip_savecontrol(inp, &opts, ip, m);
+    }
     if (ssb_appendaddr(&so->so_rcv,
                     (struct sockaddr *)&rsvp_src,m, opts) == 0) {
        m_freem(m);
@@ -2215,8 +2219,8 @@ X_rsvp_input(struct mbuf *m, ...)
            kprintf("rsvp_input: send packet up\n");
     }
 #endif /* !ALTQ */
-
     lwkt_reltoken(&mroute_token);
+    return(IPPROTO_DONE);
 }
 
 /*
@@ -3017,24 +3021,19 @@ pim_register_send_rp(struct ip *ip, struct vif *vifp,
  * (used by PIM-SM): the PIM header is stripped off, and the inner packet
  * is passed to if_simloop().
  */
-void
-pim_input(struct mbuf *m, ...)
+int
+pim_input(struct mbuf **mp, int *offp, int proto)
 {
-    int off, proto;
+    struct mbuf *m = *mp;
     struct ip *ip = mtod(m, struct ip *);
     struct pim *pim;
     int minlen;
     int datalen = ip->ip_len;
     int ip_tos;
     int iphlen;
-    __va_list ap;
 
-    __va_start(ap, m);
-    off = __va_arg(ap, int);
-    proto = __va_arg(ap, int);
-    __va_end(ap);
-
-    iphlen = off;
+    iphlen = *offp;
+    *mp = NULL;
 
     /* Keep statistics */
     pimstat.pims_rcv_total_msgs++;
@@ -3048,7 +3047,7 @@ pim_input(struct mbuf *m, ...)
        log(LOG_ERR, "pim_input: packet size too small %d from %lx\n",
            datalen, (u_long)ip->ip_src.s_addr);
        m_freem(m);
-       return;
+       return(IPPROTO_DONE);
     }
     
     /*
@@ -3067,7 +3066,7 @@ pim_input(struct mbuf *m, ...)
     if ((m->m_flags & M_EXT || m->m_len < minlen) &&
        (m = m_pullup(m, minlen)) == 0) {
        log(LOG_ERR, "pim_input: m_pullup failure\n");
-       return;
+       return(IPPROTO_DONE);
     }
     /* m_pullup() may have given us a new mbuf so reset ip. */
     ip = mtod(m, struct ip *);
@@ -3092,7 +3091,7 @@ pim_input(struct mbuf *m, ...)
        if (mrtdebug & DEBUG_PIM)
            log(LOG_DEBUG, "pim_input: invalid checksum");
        m_freem(m);
-       return;
+       return(IPPROTO_DONE);
     }
 
     /* PIM version check */
@@ -3101,7 +3100,7 @@ pim_input(struct mbuf *m, ...)
        log(LOG_ERR, "pim_input: incorrect version %d, expecting %d\n",
            PIM_VT_V(pim->pim_vt), PIM_VERSION);
        m_freem(m);
-       return;
+       return(IPPROTO_DONE);
     }
     
     /* restore mbuf back to the outer IP */
@@ -3124,7 +3123,7 @@ pim_input(struct mbuf *m, ...)
                log(LOG_DEBUG,
                    "pim_input: register vif not set: %d\n", reg_vif_num);
            m_freem(m);
-           return;
+           return(IPPROTO_DONE);
        }
        
        /*
@@ -3137,7 +3136,7 @@ pim_input(struct mbuf *m, ...)
                "pim_input: register packet size too small %d from %lx\n",
                datalen, (u_long)ip->ip_src.s_addr);
            m_freem(m);
-           return;
+           return(IPPROTO_DONE);
        }
        
        reghdr = (u_int32_t *)(pim + 1);
@@ -3159,7 +3158,7 @@ pim_input(struct mbuf *m, ...)
                    "of the inner packet\n", encap_ip->ip_v);
            }
            m_freem(m);
-           return;
+           return(IPPROTO_DONE);
        }
        
        /* verify the inner packet is destined to a mcast group */
@@ -3171,7 +3170,7 @@ pim_input(struct mbuf *m, ...)
                    "multicast %lx\n",
                    (u_long)ntohl(encap_ip->ip_dst.s_addr));
            m_freem(m);
-           return;
+           return(IPPROTO_DONE);
        }
 
        /* If a NULL_REGISTER, pass it to the daemon */
@@ -3211,7 +3210,7 @@ pim_input(struct mbuf *m, ...)
            log(LOG_ERR,
                "pim_input: pim register: could not copy register head\n");
            m_freem(m);
-           return;
+           return(IPPROTO_DONE);
        }
        
        /* Keep statistics */
@@ -3247,9 +3246,10 @@ pim_input_to_daemon:
      * XXX: the outer IP header pkt size of a Register is not adjust to
      * reflect the fact that the inner multicast data is truncated.
      */
-    rip_input(m, iphlen, proto);
-
-    return;
+    *mp = m;
+    *offp = iphlen;
+    rip_input(mp, offp, proto);
+    return(IPPROTO_DONE);
 }
 #endif /* PIM */
 
index f6d3090..2fe5cf0 100644 (file)
@@ -223,7 +223,7 @@ do { \
 #define IPFW_DEFAULT_SET       31      /* set number for the default rule */
 
 struct netmsg_ipfw {
-       struct netmsg   nmsg;
+       struct netmsg_base base;
        const struct ipfw_ioc_rule *ioc_rule;
        struct ip_fw    *next_rule;
        struct ip_fw    *prev_rule;
@@ -232,7 +232,7 @@ struct netmsg_ipfw {
 };
 
 struct netmsg_del {
-       struct netmsg   nmsg;
+       struct netmsg_base base;
        struct ip_fw    *start_rule;
        struct ip_fw    *prev_rule;
        uint16_t        rulenum;
@@ -241,7 +241,7 @@ struct netmsg_del {
 };
 
 struct netmsg_zent {
-       struct netmsg   nmsg;
+       struct netmsg_base base;
        struct ip_fw    *start_rule;
        uint16_t        rulenum;
        uint16_t        log_only;
@@ -370,7 +370,7 @@ static uint32_t curr_dyn_buckets = 256; /* must be power of 2 */
 static uint32_t dyn_buckets_gen; /* generation of dyn buckets array */
 static struct lock dyn_lock; /* dynamic rules' hash table lock */
 
-static struct netmsg ipfw_timeout_netmsg; /* schedule ipfw timeout */
+static struct netmsg_base ipfw_timeout_netmsg; /* schedule ipfw timeout */
 static struct callout ipfw_timeout_h;
 
 /*
@@ -2581,7 +2581,7 @@ ipfw_create_rule(const struct ipfw_ioc_rule *ioc_rule, struct ip_fw_stub *stub)
 }
 
 static void
-ipfw_add_rule_dispatch(struct netmsg *nmsg)
+ipfw_add_rule_dispatch(netmsg_t nmsg)
 {
        struct netmsg_ipfw *fwmsg = (struct netmsg_ipfw *)nmsg;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
@@ -2632,16 +2632,16 @@ ipfw_add_rule_dispatch(struct netmsg *nmsg)
                ipfw_inc_static_count(rule);
 
                /* Return the rule on CPU0 */
-               nmsg->nm_lmsg.u.ms_resultp = rule;
+               nmsg->lmsg.u.ms_resultp = rule;
        }
 
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&nmsg->lmsg, mycpuid + 1);
 }
 
 static void
-ipfw_enable_state_dispatch(struct netmsg *nmsg)
+ipfw_enable_state_dispatch(netmsg_t nmsg)
 {
-       struct lwkt_msg *lmsg = &nmsg->nm_lmsg;
+       struct lwkt_msg *lmsg = &nmsg->lmsg;
        struct ip_fw *rule = lmsg->u.ms_resultp;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
 
@@ -2667,7 +2667,7 @@ ipfw_add_rule(struct ipfw_ioc_rule *ioc_rule, uint32_t rule_flags)
 {
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
        struct netmsg_ipfw fwmsg;
-       struct netmsg *nmsg;
+       struct netmsg_base *nmsg;
        struct ip_fw *f, *prev, *rule;
        struct ip_fw_stub *stub;
 
@@ -2729,7 +2729,7 @@ ipfw_add_rule(struct ipfw_ioc_rule *ioc_rule, uint32_t rule_flags)
         * The rule duplicated on CPU0 will be returned.
         */
        bzero(&fwmsg, sizeof(fwmsg));
-       nmsg = &fwmsg.nmsg;
+       nmsg = &fwmsg.base;
        netmsg_init(nmsg, NULL, &curthread->td_msgport,
                    0, ipfw_add_rule_dispatch);
        fwmsg.ioc_rule = ioc_rule;
@@ -2737,10 +2737,10 @@ ipfw_add_rule(struct ipfw_ioc_rule *ioc_rule, uint32_t rule_flags)
        fwmsg.next_rule = prev == NULL ? NULL : f;
        fwmsg.stub = stub;
 
-       ifnet_domsg(&nmsg->nm_lmsg, 0);
+       ifnet_domsg(&nmsg->lmsg, 0);
        KKASSERT(fwmsg.prev_rule == NULL && fwmsg.next_rule == NULL);
 
-       rule = nmsg->nm_lmsg.u.ms_resultp;
+       rule = nmsg->lmsg.u.ms_resultp;
        KKASSERT(rule != NULL && rule->cpuid == mycpuid);
 
        if (rule_flags & IPFW_RULE_F_STATE) {
@@ -2751,10 +2751,10 @@ ipfw_add_rule(struct ipfw_ioc_rule *ioc_rule, uint32_t rule_flags)
                bzero(nmsg, sizeof(*nmsg));
                netmsg_init(nmsg, NULL, &curthread->td_msgport,
                            0, ipfw_enable_state_dispatch);
-               nmsg->nm_lmsg.u.ms_resultp = rule;
+               nmsg->lmsg.u.ms_resultp = rule;
 
-               ifnet_domsg(&nmsg->nm_lmsg, 0);
-               KKASSERT(nmsg->nm_lmsg.u.ms_resultp == NULL);
+               ifnet_domsg(&nmsg->lmsg, 0);
+               KKASSERT(nmsg->lmsg.u.ms_resultp == NULL);
        }
 
        DPRINTF("++ installed rule %d, static count now %d\n",
@@ -2815,9 +2815,9 @@ ipfw_delete_rule(struct ipfw_context *ctx,
 }
 
 static void
-ipfw_flush_dispatch(struct netmsg *nmsg)
+ipfw_flush_dispatch(netmsg_t nmsg)
 {
-       struct lwkt_msg *lmsg = &nmsg->nm_lmsg;
+       struct lwkt_msg *lmsg = &nmsg->lmsg;
        int kill_default = lmsg->u.ms_result;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
        struct ip_fw *rule;
@@ -2832,7 +2832,7 @@ ipfw_flush_dispatch(struct netmsg *nmsg)
 }
 
 static void
-ipfw_disable_rule_state_dispatch(struct netmsg *nmsg)
+ipfw_disable_rule_state_dispatch(netmsg_t nmsg)
 {
        struct netmsg_del *dmsg = (struct netmsg_del *)nmsg;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
@@ -2861,7 +2861,7 @@ ipfw_disable_rule_state_dispatch(struct netmsg *nmsg)
                rule = rule->next;
        }
 
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&nmsg->lmsg, mycpuid + 1);
 }
 
 /*
@@ -2873,7 +2873,7 @@ static void
 ipfw_flush(int kill_default)
 {
        struct netmsg_del dmsg;
-       struct netmsg nmsg;
+       struct netmsg_base nmsg;
        struct lwkt_msg *lmsg;
        struct ip_fw *rule;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
@@ -2899,9 +2899,9 @@ ipfw_flush(int kill_default)
         * will be created.
         */
        bzero(&dmsg, sizeof(dmsg));
-       netmsg_init(&dmsg.nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&dmsg.base, NULL, &curthread->td_msgport,
                    0, ipfw_disable_rule_state_dispatch);
-       ifnet_domsg(&dmsg.nmsg.nm_lmsg, 0);
+       ifnet_domsg(&dmsg.base.lmsg, 0);
 
        /*
         * This actually nukes all states (dyn rules)
@@ -2926,7 +2926,7 @@ ipfw_flush(int kill_default)
        bzero(&nmsg, sizeof(nmsg));
        netmsg_init(&nmsg, NULL, &curthread->td_msgport,
                    0, ipfw_flush_dispatch);
-       lmsg = &nmsg.nm_lmsg;
+       lmsg = &nmsg.lmsg;
        lmsg->u.ms_result = kill_default;
        ifnet_domsg(lmsg, 0);
 
@@ -2959,7 +2959,7 @@ ipfw_flush(int kill_default)
 }
 
 static void
-ipfw_alt_delete_rule_dispatch(struct netmsg *nmsg)
+ipfw_alt_delete_rule_dispatch(netmsg_t nmsg)
 {
        struct netmsg_del *dmsg = (struct netmsg_del *)nmsg;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
@@ -2988,7 +2988,7 @@ ipfw_alt_delete_rule_dispatch(struct netmsg *nmsg)
        while (rule && rule->rulenum == dmsg->rulenum)
                rule = ipfw_delete_rule(ctx, prev, rule);
 
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&nmsg->lmsg, mycpuid + 1);
 }
 
 static int
@@ -2997,7 +2997,7 @@ ipfw_alt_delete_rule(uint16_t rulenum)
        struct ip_fw *prev, *rule, *f;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
        struct netmsg_del dmsg;
-       struct netmsg *nmsg;
+       struct netmsg_base *nmsg;
        int state;
 
        /*
@@ -3028,13 +3028,13 @@ ipfw_alt_delete_rule(uint16_t rulenum)
                 * created based the rules numbered 'rulenum'.
                 */
                bzero(&dmsg, sizeof(dmsg));
-               nmsg = &dmsg.nmsg;
+               nmsg = &dmsg.base;
                netmsg_init(nmsg, NULL, &curthread->td_msgport,
                            0, ipfw_disable_rule_state_dispatch);
                dmsg.start_rule = rule;
                dmsg.rulenum = rulenum;
 
-               ifnet_domsg(&nmsg->nm_lmsg, 0);
+               ifnet_domsg(&nmsg->lmsg, 0);
                KKASSERT(dmsg.start_rule == NULL);
 
                /*
@@ -3059,20 +3059,20 @@ ipfw_alt_delete_rule(uint16_t rulenum)
         * Get rid of the rule duplications on all CPUs
         */
        bzero(&dmsg, sizeof(dmsg));
-       nmsg = &dmsg.nmsg;
+       nmsg = &dmsg.base;
        netmsg_init(nmsg, NULL, &curthread->td_msgport,
                    0, ipfw_alt_delete_rule_dispatch);
        dmsg.prev_rule = prev;
        dmsg.start_rule = rule;
        dmsg.rulenum = rulenum;
 
-       ifnet_domsg(&nmsg->nm_lmsg, 0);
+       ifnet_domsg(&nmsg->lmsg, 0);
        KKASSERT(dmsg.prev_rule == NULL && dmsg.start_rule == NULL);
        return 0;
 }
 
 static void
-ipfw_alt_delete_ruleset_dispatch(struct netmsg *nmsg)
+ipfw_alt_delete_ruleset_dispatch(netmsg_t nmsg)
 {
        struct netmsg_del *dmsg = (struct netmsg_del *)nmsg;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
@@ -3098,11 +3098,11 @@ ipfw_alt_delete_ruleset_dispatch(struct netmsg *nmsg)
        }
        KASSERT(del, ("no match set?!\n"));
 
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&nmsg->lmsg, mycpuid + 1);
 }
 
 static void
-ipfw_disable_ruleset_state_dispatch(struct netmsg *nmsg)
+ipfw_disable_ruleset_state_dispatch(netmsg_t nmsg)
 {
        struct netmsg_del *dmsg = (struct netmsg_del *)nmsg;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
@@ -3123,14 +3123,14 @@ ipfw_disable_ruleset_state_dispatch(struct netmsg *nmsg)
        }
        KASSERT(cleared, ("no match set?!\n"));
 
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&nmsg->lmsg, mycpuid + 1);
 }
 
 static int
 ipfw_alt_delete_ruleset(uint8_t set)
 {
        struct netmsg_del dmsg;
-       struct netmsg *nmsg;
+       struct netmsg_base *nmsg;
        int state, del;
        struct ip_fw *rule;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
@@ -3160,12 +3160,12 @@ ipfw_alt_delete_ruleset(uint8_t set)
                 * created based the rules in this set.
                 */
                bzero(&dmsg, sizeof(dmsg));
-               nmsg = &dmsg.nmsg;
+               nmsg = &dmsg.base;
                netmsg_init(nmsg, NULL, &curthread->td_msgport,
                            0, ipfw_disable_ruleset_state_dispatch);
                dmsg.from_set = set;
 
-               ifnet_domsg(&nmsg->nm_lmsg, 0);
+               ifnet_domsg(&nmsg->lmsg, 0);
 
                /*
                 * Nuke all related states
@@ -3192,17 +3192,17 @@ ipfw_alt_delete_ruleset(uint8_t set)
         * Delete this set
         */
        bzero(&dmsg, sizeof(dmsg));
-       nmsg = &dmsg.nmsg;
+       nmsg = &dmsg.base;
        netmsg_init(nmsg, NULL, &curthread->td_msgport,
                    0, ipfw_alt_delete_ruleset_dispatch);
        dmsg.from_set = set;
 
-       ifnet_domsg(&nmsg->nm_lmsg, 0);
+       ifnet_domsg(&nmsg->lmsg, 0);
        return 0;
 }
 
 static void
-ipfw_alt_move_rule_dispatch(struct netmsg *nmsg)
+ipfw_alt_move_rule_dispatch(netmsg_t nmsg)
 {
        struct netmsg_del *dmsg = (struct netmsg_del *)nmsg;
        struct ip_fw *rule;
@@ -3221,14 +3221,14 @@ ipfw_alt_move_rule_dispatch(struct netmsg *nmsg)
                        rule->set = dmsg->to_set;
                rule = rule->next;
        }
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&nmsg->lmsg, mycpuid + 1);
 }
 
 static int
 ipfw_alt_move_rule(uint16_t rulenum, uint8_t set)
 {
        struct netmsg_del dmsg;
-       struct netmsg *nmsg;
+       struct netmsg_base *nmsg;
        struct ip_fw *rule;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
 
@@ -3244,20 +3244,20 @@ ipfw_alt_move_rule(uint16_t rulenum, uint8_t set)
                return 0; /* XXX error? */
 
        bzero(&dmsg, sizeof(dmsg));
-       nmsg = &dmsg.nmsg;
+       nmsg = &dmsg.base;
        netmsg_init(nmsg, NULL, &curthread->td_msgport,
                    0, ipfw_alt_move_rule_dispatch);
        dmsg.start_rule = rule;
        dmsg.rulenum = rulenum;
        dmsg.to_set = set;
 
-       ifnet_domsg(&nmsg->nm_lmsg, 0);
+       ifnet_domsg(&nmsg->lmsg, 0);
        KKASSERT(dmsg.start_rule == NULL);
        return 0;
 }
 
 static void
-ipfw_alt_move_ruleset_dispatch(struct netmsg *nmsg)
+ipfw_alt_move_ruleset_dispatch(netmsg_t nmsg)
 {
        struct netmsg_del *dmsg = (struct netmsg_del *)nmsg;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
@@ -3267,28 +3267,28 @@ ipfw_alt_move_ruleset_dispatch(struct netmsg *nmsg)
                if (rule->set == dmsg->from_set)
                        rule->set = dmsg->to_set;
        }
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&nmsg->lmsg, mycpuid + 1);
 }
 
 static int
 ipfw_alt_move_ruleset(uint8_t from_set, uint8_t to_set)
 {
        struct netmsg_del dmsg;
-       struct netmsg *nmsg;
+       struct netmsg_base *nmsg;
 
        bzero(&dmsg, sizeof(dmsg));
-       nmsg = &dmsg.nmsg;
+       nmsg = &dmsg.base;
        netmsg_init(nmsg, NULL, &curthread->td_msgport,
                    0, ipfw_alt_move_ruleset_dispatch);
        dmsg.from_set = from_set;
        dmsg.to_set = to_set;
 
-       ifnet_domsg(&nmsg->nm_lmsg, 0);
+       ifnet_domsg(&nmsg->lmsg, 0);
        return 0;
 }
 
 static void
-ipfw_alt_swap_ruleset_dispatch(struct netmsg *nmsg)
+ipfw_alt_swap_ruleset_dispatch(netmsg_t nmsg)
 {
        struct netmsg_del *dmsg = (struct netmsg_del *)nmsg;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
@@ -3300,23 +3300,23 @@ ipfw_alt_swap_ruleset_dispatch(struct netmsg *nmsg)
                else if (rule->set == dmsg->to_set)
                        rule->set = dmsg->from_set;
        }
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&nmsg->lmsg, mycpuid + 1);
 }
 
 static int
 ipfw_alt_swap_ruleset(uint8_t set1, uint8_t set2)
 {
        struct netmsg_del dmsg;
-       struct netmsg *nmsg;
+       struct netmsg_base *nmsg;
 
        bzero(&dmsg, sizeof(dmsg));
-       nmsg = &dmsg.nmsg;
+       nmsg = &dmsg.base;
        netmsg_init(nmsg, NULL, &curthread->td_msgport,
                    0, ipfw_alt_swap_ruleset_dispatch);
        dmsg.from_set = set1;
        dmsg.to_set = set2;
 
-       ifnet_domsg(&nmsg->nm_lmsg, 0);
+       ifnet_domsg(&nmsg->lmsg, 0);
        return 0;
 }
 
@@ -3396,7 +3396,7 @@ clear_counters(struct ip_fw *rule, int log_only)
 }
 
 static void
-ipfw_zero_entry_dispatch(struct netmsg *nmsg)
+ipfw_zero_entry_dispatch(netmsg_t nmsg)
 {
        struct netmsg_zent *zmsg = (struct netmsg_zent *)nmsg;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
@@ -3428,7 +3428,7 @@ ipfw_zero_entry_dispatch(struct netmsg *nmsg)
                 */
                zmsg->start_rule = start->sibling;
        }
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&nmsg->lmsg, mycpuid + 1);
 }
 
 /**
@@ -3441,12 +3441,12 @@ static int
 ipfw_ctl_zero_entry(int rulenum, int log_only)
 {
        struct netmsg_zent zmsg;
-       struct netmsg *nmsg;
+       struct netmsg_base *nmsg;
        const char *msg;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
 
        bzero(&zmsg, sizeof(zmsg));
-       nmsg = &zmsg.nmsg;
+       nmsg = &zmsg.base;
        netmsg_init(nmsg, NULL, &curthread->td_msgport,
                    0, ipfw_zero_entry_dispatch);
        zmsg.log_only = log_only;
@@ -3472,7 +3472,7 @@ ipfw_ctl_zero_entry(int rulenum, int log_only)
                msg = log_only ? "ipfw: Entry %d logging count reset.\n"
                               : "ipfw: Entry %d cleared.\n";
        }
-       ifnet_domsg(&nmsg->nm_lmsg, 0);
+       ifnet_domsg(&nmsg->lmsg, 0);
        KKASSERT(zmsg.start_rule == NULL);
 
        if (fw_verbose)
@@ -3872,9 +3872,9 @@ skip:
 }
 
 static void
-ipfw_set_disable_dispatch(struct netmsg *nmsg)
+ipfw_set_disable_dispatch(netmsg_t nmsg)
 {
-       struct lwkt_msg *lmsg = &nmsg->nm_lmsg;
+       struct lwkt_msg *lmsg = &nmsg->lmsg;
        struct ipfw_context *ctx = ipfw_ctx[mycpuid];
 
        ctx->ipfw_gen++;
@@ -3886,7 +3886,7 @@ ipfw_set_disable_dispatch(struct netmsg *nmsg)
 static void
 ipfw_ctl_set_disable(uint32_t disable, uint32_t enable)
 {
-       struct netmsg nmsg;
+       struct netmsg_base nmsg;
        struct lwkt_msg *lmsg;
        uint32_t set_disable;
 
@@ -3897,7 +3897,7 @@ ipfw_ctl_set_disable(uint32_t disable, uint32_t enable)
        bzero(&nmsg, sizeof(nmsg));
        netmsg_init(&nmsg, NULL, &curthread->td_msgport,
                    0, ipfw_set_disable_dispatch);
-       lmsg = &nmsg.nm_lmsg;
+       lmsg = &nmsg.lmsg;
        lmsg->u.ms_result32 = set_disable;
 
        ifnet_domsg(lmsg, 0);
@@ -3984,7 +3984,7 @@ ipfw_ctl(struct sockopt *sopt)
  * every dyn_keepalive_period
  */
 static void
-ipfw_tick_dispatch(struct netmsg *nmsg)
+ipfw_tick_dispatch(netmsg_t nmsg)
 {
        time_t keep_alive;
        uint32_t gen;
@@ -3995,7 +3995,7 @@ ipfw_tick_dispatch(struct netmsg *nmsg)
 
        /* Reply ASAP */
        crit_enter();
-       lwkt_replymsg(&nmsg->nm_lmsg, 0);
+       lwkt_replymsg(&nmsg->lmsg, 0);
        crit_exit();
 
        if (ipfw_dyn_v == NULL || dyn_count == 0)
@@ -4085,7 +4085,7 @@ done:
 static void
 ipfw_tick(void *dummy __unused)
 {
-       struct lwkt_msg *lmsg = &ipfw_timeout_netmsg.nm_lmsg;
+       struct lwkt_msg *lmsg = &ipfw_timeout_netmsg.lmsg;
 
        KKASSERT(mycpuid == IPFW_CFGCPUID);
 
@@ -4270,9 +4270,9 @@ ipfw_dehook(void)
 }
 
 static void
-ipfw_sysctl_enable_dispatch(struct netmsg *nmsg)
+ipfw_sysctl_enable_dispatch(netmsg_t nmsg)
 {
-       struct lwkt_msg *lmsg = &nmsg->nm_lmsg;
+       struct lwkt_msg *lmsg = &nmsg->lmsg;
        int enable = lmsg->u.ms_result;
 
        if (fw_enable == enable)
@@ -4290,7 +4290,7 @@ reply:
 static int
 ipfw_sysctl_enable(SYSCTL_HANDLER_ARGS)
 {
-       struct netmsg nmsg;
+       struct netmsg_base nmsg;
        struct lwkt_msg *lmsg;
        int enable, error;
 
@@ -4301,7 +4301,7 @@ ipfw_sysctl_enable(SYSCTL_HANDLER_ARGS)
 
        netmsg_init(&nmsg, NULL, &curthread->td_msgport,
                    0, ipfw_sysctl_enable_dispatch);
-       lmsg = &nmsg.nm_lmsg;
+       lmsg = &nmsg.lmsg;
        lmsg->u.ms_result = enable;
 
        return lwkt_domsg(IPFW_CFGPORT, lmsg, 0);
@@ -4358,7 +4358,7 @@ ipfw_sysctl_dyn_rst(SYSCTL_HANDLER_ARGS)
 }
 
 static void
-ipfw_ctx_init_dispatch(struct netmsg *nmsg)
+ipfw_ctx_init_dispatch(netmsg_t nmsg)
 {
        struct netmsg_ipfw *fwmsg = (struct netmsg_ipfw *)nmsg;
        struct ipfw_context *ctx;
@@ -4395,11 +4395,11 @@ ipfw_ctx_init_dispatch(struct netmsg *nmsg)
        if (mycpuid == 0)
                ipfw_inc_static_count(def_rule);
 
-       ifnet_forwardmsg(&nmsg->nm_lmsg, mycpuid + 1);
+       ifnet_forwardmsg(&nmsg->lmsg, mycpuid + 1);
 }
 
 static void
-ipfw_init_dispatch(struct netmsg *nmsg)
+ipfw_init_dispatch(netmsg_t nmsg)
 {
        struct netmsg_ipfw fwmsg;
        int error = 0;
@@ -4411,9 +4411,9 @@ ipfw_init_dispatch(struct netmsg *nmsg)
        }
 
        bzero(&fwmsg, sizeof(fwmsg));
-       netmsg_init(&fwmsg.nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&fwmsg.base, NULL, &curthread->td_msgport,
                    0, ipfw_ctx_init_dispatch);
-       ifnet_domsg(&fwmsg.nmsg.nm_lmsg, 0);
+       ifnet_domsg(&fwmsg.base.lmsg, 0);
 
        ip_fw_chk_ptr = ipfw_chk;
        ip_fw_ctl_ptr = ipfw_ctl;
@@ -4450,23 +4450,23 @@ ipfw_init_dispatch(struct netmsg *nmsg)
        if (fw_enable)
                ipfw_hook();
 reply:
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       lwkt_replymsg(&nmsg->lmsg, error);
 }
 
 static int
 ipfw_init(void)
 {
-       struct netmsg smsg;
+       struct netmsg_base smsg;
 
        netmsg_init(&smsg, NULL, &curthread->td_msgport,
                    0, ipfw_init_dispatch);
-       return lwkt_domsg(IPFW_CFGPORT, &smsg.nm_lmsg, 0);
+       return lwkt_domsg(IPFW_CFGPORT, &smsg.lmsg, 0);
 }
 
 #ifdef KLD_MODULE
 
 static void
-ipfw_fini_dispatch(struct netmsg *nmsg)
+ipfw_fini_dispatch(netmsg_t nmsg)
 {
        int error = 0, cpu;
 
@@ -4483,11 +4483,11 @@ ipfw_fini_dispatch(struct netmsg *nmsg)
        netmsg_service_sync();
 
        crit_enter();
-       if ((ipfw_timeout_netmsg.nm_lmsg.ms_flags & MSGF_DONE) == 0) {
+       if ((ipfw_timeout_netmsg.lmsg.ms_flags & MSGF_DONE) == 0) {
                /*
                 * Callout message is pending; drop it
                 */
-               lwkt_dropmsg(&ipfw_timeout_netmsg.nm_lmsg);
+               lwkt_dropmsg(&ipfw_timeout_netmsg.lmsg);
        }
        crit_exit();
 
@@ -4502,17 +4502,17 @@ ipfw_fini_dispatch(struct netmsg *nmsg)
 
        kprintf("IP firewall unloaded\n");
 reply:
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       lwkt_replymsg(&nmsg->lmsg, error);
 }
 
 static int
 ipfw_fini(void)
 {
-       struct netmsg smsg;
+       struct netmsg_base smsg;
 
        netmsg_init(&smsg, NULL, &curthread->td_msgport,
                    0, ipfw_fini_dispatch);
-       return lwkt_domsg(IPFW_CFGPORT, &smsg.nm_lmsg, 0);
+       return lwkt_domsg(IPFW_CFGPORT, &smsg.lmsg, 0);
 }
 
 #endif /* KLD_MODULE */
index 3a1c947..13c48c5 100644 (file)
@@ -51,12 +51,12 @@ int ip_fw_loaded;
 int fw_enable = 1;
 int fw_one_pass = 1;
 
-static void    ip_fw_sockopt_dispatch(struct netmsg *);
+static void    ip_fw_sockopt_dispatch(netmsg_t msg);
 
 int
 ip_fw_sockopt(struct sockopt *sopt)
 {
-       struct netmsg smsg;
+       struct netmsg_base smsg;
 
        /*
         * Disallow modifications in really-really secure mode, but still allow
@@ -70,15 +70,14 @@ ip_fw_sockopt(struct sockopt *sopt)
 
        netmsg_init(&smsg, NULL, &curthread->td_msgport,
                    0, ip_fw_sockopt_dispatch);
-       smsg.nm_lmsg.u.ms_resultp = sopt;
-       return lwkt_domsg(IPFW_CFGPORT, &smsg.nm_lmsg, 0);
+       smsg.lmsg.u.ms_resultp = sopt;
+       return lwkt_domsg(IPFW_CFGPORT, &smsg.lmsg, 0);
 }
 
 static void
-ip_fw_sockopt_dispatch(struct netmsg *nmsg)
+ip_fw_sockopt_dispatch(netmsg_t msg)
 {
-       struct lwkt_msg *msg = &nmsg->nm_lmsg;
-       struct sockopt *sopt = msg->u.ms_resultp;
+       struct sockopt *sopt = msg->lmsg.u.ms_resultp;
        int error;
 
        KKASSERT(mycpuid == 0);
@@ -87,5 +86,5 @@ ip_fw_sockopt_dispatch(struct netmsg *nmsg)
                error = ip_fw_ctl_ptr(sopt);
        else
                error = ENOPROTOOPT;
-       lwkt_replymsg(msg, error);
+       lwkt_replymsg(&msg->lmsg, error);
 }
index 7c0771a..911aba6 100644 (file)
@@ -58,7 +58,7 @@
 #include <net/netmsg2.h>
 #include <sys/mplock2.h>
 
-static void netmsg_sync_func(struct netmsg *msg);
+static void netmsg_sync_func(netmsg_t msg);
 static void netmsg_service_loop(void *arg);
 static void cpu0_cpufn(struct mbuf **mp, int hoff);
 
@@ -107,18 +107,17 @@ netisr_autofree_reply(lwkt_port_t port, lwkt_msg_t msg)
  * synchronously, effectively turning the message into a glorified direct
  * procedure call back into the protocol stack.  The operation must be
  * complete on return or we will deadlock, so panic if it isn't.
+ *
+ * However, the target function is under no obligation to immediately
+ * reply the message.  It may forward it elsewhere.
  */
 static int
 netmsg_put_port(lwkt_port_t port, lwkt_msg_t lmsg)
 {
-       netmsg_t netmsg = (void *)lmsg;
+       netmsg_base_t nmsg = (void *)lmsg;
 
        if ((lmsg->ms_flags & MSGF_SYNC) && port == &curthread->td_msgport) {
-               netmsg->nm_dispatch(netmsg);
-               if ((lmsg->ms_flags & MSGF_DONE) == 0) {
-                       panic("netmsg_put_port: self-referential "
-                             "deadlock on netport");
-               }
+               nmsg->nm_dispatch((netmsg_t)nmsg);
                return(EASYNC);
        } else {
                return(netmsg_fwd_port_fn(port, lmsg));
@@ -138,12 +137,12 @@ netmsg_put_port(lwkt_port_t port, lwkt_msg_t lmsg)
 static int
 netmsg_sync_putport(lwkt_port_t port, lwkt_msg_t lmsg)
 {
-       netmsg_t netmsg = (void *)lmsg;
+       netmsg_base_t nmsg = (void *)lmsg;
 
        KKASSERT((lmsg->ms_flags & MSGF_DONE) == 0);
 
        lmsg->ms_target_port = port;    /* required for abort */
-       netmsg->nm_dispatch(netmsg);
+       nmsg->nm_dispatch((netmsg_t)nmsg);
        return(EASYNC);
 }
 
@@ -227,12 +226,12 @@ void
 netmsg_service_sync(void)
 {
        struct netmsg_port_registration *reg;
-       struct netmsg smsg;
+       struct netmsg_base smsg;
 
        netmsg_init(&smsg, NULL, &curthread->td_msgport, 0, netmsg_sync_func);
 
        TAILQ_FOREACH(reg, &netreglist, npr_entry) {
-               lwkt_domsg(reg->npr_port, &smsg.nm_lmsg, 0);
+               lwkt_domsg(reg->npr_port, &smsg.lmsg, 0);
        }
 }
 
@@ -241,9 +240,9 @@ netmsg_service_sync(void)
  * EASYNC to be returned if the netmsg function disposes of the message.
  */
 static void
-netmsg_sync_func(struct netmsg *msg)
+netmsg_sync_func(netmsg_t msg)
 {
-       lwkt_replymsg(&msg->nm_lmsg, 0);
+       lwkt_replymsg(&msg->lmsg, 0);
 }
 
 /*
@@ -254,7 +253,7 @@ static void
 netmsg_service_loop(void *arg)
 {
        struct netmsg_rollup *ru;
-       struct netmsg *msg;
+       netmsg_base_t msg;
        thread_t td = curthread;;
        int limit;
 
@@ -266,7 +265,7 @@ netmsg_service_loop(void *arg)
                do {
                        KASSERT(msg->nm_dispatch != NULL,
                                ("netmsg_service isr %d badmsg\n",
-                               msg->nm_lmsg.u.ms_result));
+                               msg->lmsg.u.ms_result));
                        if (msg->nm_so &&
                            msg->nm_so->so_port != &td->td_msgport) {
                                /*
@@ -277,12 +276,12 @@ netmsg_service_loop(void *arg)
                                kprintf("netmsg_service_loop: Warning, "
                                        "port changed so=%p\n", msg->nm_so);
                                lwkt_forwardmsg(msg->nm_so->so_port,
-                                               &msg->nm_lmsg);
+                                               &msg->lmsg);
                        } else {
                                /*
                                 * We are on the correct port, dispatch it.
                                 */
-                               msg->nm_dispatch(msg);
+                               msg->nm_dispatch((netmsg_t)msg);
                        }
                        if (--limit == 0)
                                break;
@@ -347,11 +346,11 @@ netisr_queue(int num, struct mbuf *m)
         */
        port = cpu_portfn(m->m_pkthdr.hash);
        pmsg = &m->m_hdr.mh_netmsg;
-       netmsg_init(&pmsg->nm_netmsg, NULL, &netisr_apanic_rport,
+       netmsg_init(&pmsg->base, NULL, &netisr_apanic_rport,
                    0, ni->ni_handler);
        pmsg->nm_packet = m;
-       pmsg->nm_netmsg.nm_lmsg.u.ms_result = num;
-       lwkt_sendmsg(port, &pmsg->nm_netmsg.nm_lmsg);
+       pmsg->base.lmsg.u.ms_result = num;
+       lwkt_sendmsg(port, &pmsg->base.lmsg);
 
        return (0);
 }
@@ -456,16 +455,6 @@ cur_netport(void)
 }
 
 /*
- * Return a default protocol mbuf processing thread port
- */
-lwkt_port_t
-cpu0_soport(struct socket *so __unused, struct sockaddr *nam __unused,
-           struct mbuf **dummy __unused)
-{
-       return (&netisr_cpu[0].td_msgport);
-}
-
-/*
  * Return a default protocol control message processing thread port
  */
 lwkt_port_t
@@ -476,17 +465,6 @@ cpu0_ctlport(int cmd __unused, struct sockaddr *sa __unused,
 }
 
 /*
- * This is a dummy port that causes a message to be executed synchronously
- * instead of being queued to a port.
- */
-lwkt_port_t
-sync_soport(struct socket *so __unused, struct sockaddr *nam __unused,
-           struct mbuf **dummy __unused)
-{
-       return (&netisr_sync_port);
-}
-
-/*
  * This is a default netisr packet characterization function which
  * sets M_HASH.  If a netisr is registered with a NULL cpufn function
  * this one is assigned.
@@ -520,13 +498,13 @@ schednetisr_remote(void *data)
        int num = (int)(intptr_t)data;
        struct netisr *ni = &netisrs[num];
        lwkt_port_t port = &netisr_cpu[0].td_msgport;
-       struct netmsg *pmsg;
+       netmsg_base_t pmsg;
 
        pmsg = &netisrs[num].ni_netmsg;
-       if (pmsg->nm_lmsg.ms_flags & MSGF_DONE) {
+       if (pmsg->lmsg.ms_flags & MSGF_DONE) {
                netmsg_init(pmsg, NULL, &netisr_adone_rport, 0, ni->ni_handler);
-               pmsg->nm_lmsg.u.ms_result = num;
-               lwkt_sendmsg(port, &pmsg->nm_lmsg);
+               pmsg->lmsg.u.ms_result = num;
+               lwkt_sendmsg(port, &pmsg->lmsg);
        }
 }
 
index 9a90419..4d897d9 100644 (file)
 #include <net/netmsg.h>
 #endif
 
-TAILQ_HEAD(notifymsglist, netmsg_so_notify);
-
-typedef __boolean_t (*msg_predicate_fn_t)(struct netmsg *);
-
-/*
- * Base class.  All net messages must start with the same fields.
- */
-
-struct netmsg_packet {
-    struct netmsg      nm_netmsg;
-    struct mbuf                *nm_packet;
-    int                        nm_nxt;
-};
-
-struct netmsg_pr_timeout {
-    struct netmsg      nm_netmsg;
-    int                        (*nm_prfn) (void);
-};
-
-struct netmsg_so_notify {
-    struct netmsg                      nm_netmsg;
-    msg_predicate_fn_t                 nm_predicate;
-    struct socket                      *nm_so;
-    int                                        nm_fflags; /* flags e.g. FNONBLOCK */
-    int                                        nm_etype;  /* receive or send event */
-    TAILQ_ENTRY(netmsg_so_notify)      nm_list;
-};
-
-struct netmsg_so_notify_abort {
-    struct netmsg                      nm_netmsg;
-    struct netmsg_so_notify            *nm_notifymsg;
-};
-
-#define NM_REVENT      0x1             /* event on receive buffer */
-#define NM_SEVENT      0x2             /* event on send buffer */
-
 #endif
 
 #ifdef _KERNEL
 
-/*
- * for dispatching pr_ functions,
- * until they can be converted to message-passing
- */
-void netmsg_pru_abort(netmsg_t);
-void netmsg_pru_accept(netmsg_t);
-void netmsg_pru_attach(netmsg_t);
-void netmsg_pru_bind(netmsg_t);
-void netmsg_pru_connect(netmsg_t);
-void netmsg_pru_connect2(netmsg_t);
-void netmsg_pru_control(netmsg_t);
-void netmsg_pru_detach(netmsg_t);
-void netmsg_pru_disconnect(netmsg_t);
-void netmsg_pru_listen(netmsg_t);
-void netmsg_pru_peeraddr(netmsg_t);
-void netmsg_pru_rcvd(netmsg_t);
-void netmsg_pru_rcvoob(netmsg_t);
-void netmsg_pru_send(netmsg_t);
-void netmsg_pru_sense(netmsg_t);
-void netmsg_pru_shutdown(netmsg_t);
-void netmsg_pru_sockaddr(netmsg_t);
-
-void netmsg_pru_ctloutput(netmsg_t);
-void netmsg_pru_ctlinput(netmsg_t);
-
-void netmsg_pr_timeout(netmsg_t);
-
 void netmsg_so_notify(netmsg_t);
 void netmsg_so_notify_abort(netmsg_t);
 void netmsg_so_notify_doabort(lwkt_msg_t);
@@ -216,7 +153,7 @@ struct netisr {
        netisr_fn_t     ni_handler;     /* packet handler function */
        netisr_ru_t     ni_rufunc;      /* rollup function */
        netisr_cpufn_t  ni_cpufn;       /* characterize pkt return cpu */
-       struct netmsg   ni_netmsg;      /* for sched_netisr() (no-data) */
+       struct netmsg_base ni_netmsg;   /* for sched_netisr() (no-data) */
 };
 
 #endif
@@ -229,6 +166,7 @@ struct netisr {
 extern lwkt_port netisr_adone_rport;
 extern lwkt_port netisr_afree_rport;
 extern lwkt_port netisr_apanic_rport;
+extern lwkt_port netisr_sync_port;
 
 lwkt_port_t    cpu_portfn(int cpu);
 lwkt_port_t    cur_netport(void);
index 328f2d0..5e68985 100644 (file)
 #include <sys/protosw.h>
 #endif
 
-struct netmsg;
-
-typedef void (*netisr_fn_t)(struct netmsg *);
+typedef void (*netisr_fn_t)(netmsg_t);
 typedef void (*netisr_ru_t)(void);
 typedef void (*netisr_cpufn_t)(struct mbuf **, int);
 
+#if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
+
 /*
- * Base netmsg
+ * The base netmsg prefixes all netmsgs and includes an embedded LWKT
+ * message.
  */
-typedef struct netmsg {
-       struct lwkt_msg         nm_lmsg;
+struct netmsg_base {
+       struct lwkt_msg         lmsg;
        netisr_fn_t             nm_dispatch;
        struct socket           *nm_so;
-} *netmsg_t;
+};
 
-#if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
+typedef struct netmsg_base *netmsg_base_t;
+
+/*
+ * NETISR messages
+ *
+ * NOTE: netmsg_packet is embedded in mbufs.
+ */
+TAILQ_HEAD(notifymsglist, netmsg_so_notify);
+
+struct netmsg_packet {
+       struct netmsg_base      base;
+       struct mbuf             *nm_packet;
+       int                     nm_nxt;
+};
+
+struct netmsg_pr_timeout {
+       struct netmsg_base      base;
+};
+
+struct netmsg_so_notify;
+typedef __boolean_t (*msg_predicate_fn_t)(struct netmsg_so_notify *);
+
+struct netmsg_so_notify {
+       struct netmsg_base      base;
+       msg_predicate_fn_t      nm_predicate;
+       int                     nm_fflags; /* flags e.g. FNONBLOCK */
+       int                     nm_etype;  /* receive or send event */
+       TAILQ_ENTRY(netmsg_so_notify) nm_list;
+};
+
+struct netmsg_so_notify_abort {
+       struct netmsg_base      base;
+       struct netmsg_so_notify *nm_notifymsg;
+};
+
+#define NM_REVENT      0x1             /* event on receive buffer */
+#define NM_SEVENT      0x2             /* event on send buffer */
 
 /*
  * User protocol requests messages.
  */
 struct netmsg_pru_abort {
-       struct netmsg           nm_netmsg;
-       pru_abort_fn_t          nm_prufn;
+       struct netmsg_base      base;
 };
 
 struct netmsg_pru_accept {
-       struct netmsg           nm_netmsg;
-       pru_accept_fn_t         nm_prufn;
+       struct netmsg_base      base;
        struct sockaddr         **nm_nam;
 };
 
 struct netmsg_pru_attach {
-       struct netmsg           nm_netmsg;
-       pru_attach_fn_t         nm_prufn;
+       struct netmsg_base      base;
        int                     nm_proto;
        struct pru_attach_info  *nm_ai;
 };
 
 struct netmsg_pru_bind {
-       struct netmsg           nm_netmsg;
-       pru_bind_fn_t           nm_prufn;
+       struct netmsg_base      base;
        struct sockaddr         *nm_nam;
        struct thread           *nm_td;
 };
 
 struct netmsg_pru_connect {
-       struct netmsg           nm_netmsg;
-       pru_connect_fn_t        nm_prufn;
+       struct netmsg_base      base;
        struct sockaddr         *nm_nam;
        struct thread           *nm_td;
+       struct mbuf             *nm_m;          /* connect with send */
+       int                     nm_flags;       /* connect with send */
+       int                     nm_reconnect;   /* message control */
 };
 
+#define NMSG_RECONNECT_RECONNECT       0x0001  /* thread port change */
+#define NMSG_RECONNECT_NAMALLOC                0x0002  /* nm_nam allocated */
+#define NMSG_RECONNECT_PUSH            0x0004  /* call tcp_output */
+#define NMSG_RECONNECT_FALLBACK                0x0008  /* fallback to ipv4 */
+
 struct netmsg_pru_connect2 {
-       struct netmsg           nm_netmsg;
-       pru_connect2_fn_t       nm_prufn;
+       struct netmsg_base      base;
        struct socket           *nm_so1;
        struct socket           *nm_so2;
 };
 
 struct netmsg_pru_control {
-       struct netmsg           nm_netmsg;
-       pru_control_fn_t        nm_prufn;
+       struct netmsg_base      base;
        u_long                  nm_cmd;
        caddr_t                 nm_data;
        struct ifnet            *nm_ifp;
@@ -109,70 +147,70 @@ struct netmsg_pru_control {
 };
 
 struct netmsg_pru_detach {
-       struct netmsg           nm_netmsg;
-       pru_detach_fn_t         nm_prufn;
+       struct netmsg_base      base;
 };
 
 struct netmsg_pru_disconnect {
-       struct netmsg           nm_netmsg;
-       pru_disconnect_fn_t     nm_prufn;
+       struct netmsg_base      base;
 };
 
 struct netmsg_pru_listen {
-       struct netmsg           nm_netmsg;
-       pru_listen_fn_t         nm_prufn;
+       struct netmsg_base      base;
        struct thread           *nm_td;
 };
 
 struct netmsg_pru_peeraddr {
-       struct netmsg           nm_netmsg;
-       pru_peeraddr_fn_t       nm_prufn;
+       struct netmsg_base      base;
        struct sockaddr         **nm_nam;
 };
 
 struct netmsg_pru_rcvd {
-       struct netmsg           nm_netmsg;
-       pru_rcvd_fn_t           nm_prufn;
+       struct netmsg_base      base;
        int                     nm_flags;
 };
 
 struct netmsg_pru_rcvoob {
-       struct netmsg           nm_netmsg;
-       pru_rcvoob_fn_t         nm_prufn;
+       struct netmsg_base      base;
        struct mbuf             *nm_m;
        int                     nm_flags;
 };
 
 struct netmsg_pru_send {
-       struct netmsg           nm_netmsg;
-       pru_send_fn_t           nm_prufn;
-       int                     nm_flags;
+       struct netmsg_base      base;
+       int                     nm_flags;       /* PRUS_xxx */
        struct mbuf             *nm_m;
        struct sockaddr         *nm_addr;
        struct mbuf             *nm_control;
        struct thread           *nm_td;
+       /*
+        * XXX hack to be 100% certain netmsg_pru_send can be overwritten
+        * by netmsg_pru_connect
+        */
+       char                    nm_dummy[sizeof(struct netmsg_pru_connect) -
+                                        sizeof(struct netmsg_base)];
 };
 
+#define PRUS_OOB               0x1
+#define PRUS_EOF               0x2
+#define PRUS_MORETOCOME                0x4
+#define PRUS_NAMALLOC          0x8
+
 struct netmsg_pru_sense {
-       struct netmsg           nm_netmsg;
-       pru_sense_fn_t          nm_prufn;
+       struct netmsg_base      base;
        struct stat             *nm_stat;
 };
 
 struct netmsg_pru_shutdown {
-       struct netmsg           nm_netmsg;
-       pru_shutdown_fn_t       nm_prufn;
+       struct netmsg_base      base;
 };
 
 struct netmsg_pru_sockaddr {
-       struct netmsg           nm_netmsg;
-       pru_sockaddr_fn_t       nm_prufn;
+       struct netmsg_base      base;
        struct sockaddr         **nm_nam;
 };
 
 struct netmsg_pru_sosend {
-       struct netmsg           nm_netmsg;
-       pru_sosend_fn_t         nm_prufn;
+       struct netmsg_base      base;
        struct sockaddr         *nm_addr;
        struct uio              *nm_uio;
        struct mbuf             *nm_top;
@@ -182,7 +220,7 @@ struct netmsg_pru_sosend {
 };
 
 struct netmsg_pru_soreceive {
-       struct netmsg           nm_netmsg;
+       struct netmsg_base      base;
        struct sockaddr         *nm_addr;
        struct sockaddr         **nm_paddr;
        struct uio              *nm_uio;
@@ -191,20 +229,56 @@ struct netmsg_pru_soreceive {
        int                     *nm_flagsp;
 };
 
-struct netmsg_pru_ctloutput {
-       struct netmsg           nm_netmsg;
-       pru_ctloutput_fn_t      nm_prufn;
+struct netmsg_pr_ctloutput {
+       struct netmsg_base      base;
        struct sockopt          *nm_sopt;
 };
 
 struct netmsg_pru_ctlinput {
-       struct netmsg           nm_netmsg;
-       pru_ctlinput_fn_t       nm_prufn;
+       struct netmsg_base      base;
        int                     nm_cmd;
        struct sockaddr         *nm_arg;
        void                    *nm_extra;
 };
 
+/*
+ * Union of all possible netmsgs.  Note that when a netmsg is sent the
+ * actual allocated storage is likely only the size of the particular
+ * class of message, and not sizeof(union netmsg).
+ */
+union netmsg {
+       struct lwkt_msg                 lmsg;           /* base embedded */
+       struct netmsg_base              base;           /* base embedded */
+
+       struct netmsg_packet            packet;         /* mbuf embedded */
+       struct netmsg_pr_timeout        timeout;
+       struct netmsg_so_notify         notify;
+       struct netmsg_so_notify_abort   notify_abort;
+
+       struct netmsg_pr_ctloutput      ctloutput;
+
+       struct netmsg_pru_abort         abort;
+       struct netmsg_pru_accept        accept;         /* synchronous */
+       struct netmsg_pru_attach        attach;
+       struct netmsg_pru_bind          bind;
+       struct netmsg_pru_connect       connect;
+       struct netmsg_pru_connect2      connect2;
+       struct netmsg_pru_control       control;        /* synchronous */
+       struct netmsg_pru_detach        detach;
+       struct netmsg_pru_disconnect    disconnect;
+       struct netmsg_pru_listen        listen;
+       struct netmsg_pru_peeraddr      peeraddr;
+       struct netmsg_pru_rcvd          rcvd;
+       struct netmsg_pru_rcvoob        rcvoob;
+       struct netmsg_pru_send          send;
+       struct netmsg_pru_sense         sense;
+       struct netmsg_pru_shutdown      shutdown;
+       struct netmsg_pru_sockaddr      sockaddr;
+       struct netmsg_pru_sosend        sosend;         /* synchronous */
+       struct netmsg_pru_soreceive     soreceive;      /* synchronous */
+       struct netmsg_pru_ctlinput      ctlinput;
+};
+
 #endif /* _KERNEL || _KERNEL_STRUCTURES */
 
 #endif /* !_NET_NETMSG_H_ */
index da5299b..c951a13 100644 (file)
  * dispatch function.
  */
 static __inline void
-netmsg_init(netmsg_t msg, struct socket *so, lwkt_port_t rport,
+netmsg_init(netmsg_base_t msg, struct socket *so, lwkt_port_t rport,
            int flags, netisr_fn_t dispatch)
 {
-       lwkt_initmsg(&msg->nm_lmsg, rport, flags);
+       lwkt_initmsg(&msg->lmsg, rport, flags);
        msg->nm_dispatch = dispatch;
        msg->nm_so = so;
 }
 
 static __inline void
-netmsg_init_abortable(netmsg_t msg, struct socket *so, lwkt_port_t rport,
+netmsg_init_abortable(netmsg_base_t msg, struct socket *so, lwkt_port_t rport,
                      int flags, netisr_fn_t dispatch,
                      void (*abortfn)(lwkt_msg_t))
 {
-       lwkt_initmsg_abortable(&msg->nm_lmsg, rport, flags, abortfn);
+       lwkt_initmsg_abortable(&msg->lmsg, rport, flags, abortfn);
        msg->nm_dispatch = dispatch;
        msg->nm_so = so;
 }
index ac0d484..7df9f77 100644 (file)
@@ -2629,7 +2629,7 @@ pf_get_translation(struct pf_pdesc *pd, struct mbuf *m, int off, int direction,
 
 #ifdef SMP
 struct netmsg_hashlookup {
-       struct netmsg           nm_netmsg;
+       struct netmsg_base      base;
        struct inpcb            **nm_pinp;
        struct inpcbinfo        *nm_pcbinfo;
        struct pf_addr          *nm_saddr;
@@ -2640,21 +2640,21 @@ struct netmsg_hashlookup {
 };
 
 static void
-in_pcblookup_hash_handler(struct netmsg *msg0)
+in_pcblookup_hash_handler(netmsg_t msg)
 {
-       struct netmsg_hashlookup *msg = (struct netmsg_hashlookup *)msg0;
+       struct netmsg_hashlookup *rmsg = (struct netmsg_hashlookup *)msg;
 
-       if (msg->nm_af == AF_INET)
-               *msg->nm_pinp = in_pcblookup_hash(msg->nm_pcbinfo,
-                   msg->nm_saddr->v4, msg->nm_sport, msg->nm_daddr->v4,
-                   msg->nm_dport, INPLOOKUP_WILDCARD, NULL);
+       if (rmsg->nm_af == AF_INET)
+               *rmsg->nm_pinp = in_pcblookup_hash(rmsg->nm_pcbinfo,
+                   rmsg->nm_saddr->v4, rmsg->nm_sport, rmsg->nm_daddr->v4,
+                   rmsg->nm_dport, INPLOOKUP_WILDCARD, NULL);
 #ifdef INET6
        else
-               *msg->nm_pinp = in6_pcblookup_hash(msg->nm_pcbinfo,
-                   &msg->nm_saddr->v6, msg->nm_sport, &msg->nm_daddr->v6,
-                   msg->nm_dport, INPLOOKUP_WILDCARD, NULL);
+               *rmsg->nm_pinp = in6_pcblookup_hash(rmsg->nm_pcbinfo,
+                   &rmsg->nm_saddr->v6, rmsg->nm_sport, &rmsg->nm_daddr->v6,
+                   rmsg->nm_dport, INPLOOKUP_WILDCARD, NULL);
 #endif /* INET6 */
-       lwkt_replymsg(&msg->nm_netmsg.nm_lmsg, 0);
+       lwkt_replymsg(&rmsg->base.lmsg, 0);
 }
 #endif /* SMP */
 
@@ -2704,7 +2704,7 @@ pf_socket_lookup(int direction, struct pf_pdesc *pd)
                 */
                if (pi_cpu != mycpu->gd_cpuid) {
                        msg = kmalloc(sizeof(*msg), M_LWKTMSG, M_INTWAIT);
-                       netmsg_init(&msg->nm_netmsg, NULL, &netisr_afree_rport,
+                       netmsg_init(&msg->base, NULL, &netisr_afree_rport,
                                    0, in_pcblookup_hash_handler);
                        msg->nm_pinp = &inp;
                        msg->nm_pcbinfo = pi;
@@ -2762,7 +2762,7 @@ pf_socket_lookup(int direction, struct pf_pdesc *pd)
 #ifdef SMP
                if (msg != NULL) {
                        lwkt_domsg(cpu_portfn(pi_cpu),
-                                    &msg->nm_netmsg.nm_lmsg, 0);
+                                    &msg->base.lmsg, 0);
                } else
 #endif /* SMP */
                {
index 4dbc9c0..d45b505 100644 (file)
@@ -69,7 +69,7 @@ struct packet_filter_hook {
 };
 
 struct netmsg_pfil {
-       struct netmsg           pfil_nmsg;
+       struct netmsg_base      base;
        pfil_func_t             pfil_func;
        void                    *pfil_arg;
        int                     pfil_flags;
@@ -88,8 +88,8 @@ static struct packet_filter_hook *
                        pfil_list_find(const pfil_list_t *, pfil_func_t,
                                       const void *);
 
-static void            pfil_remove_hook_dispatch(struct netmsg *);
-static void            pfil_add_hook_dispatch(struct netmsg *);
+static void            pfil_remove_hook_dispatch(netmsg_t);
+static void            pfil_add_hook_dispatch(netmsg_t);
 
 /*
  * pfil_run_hooks() runs the specified packet filter hooks.
@@ -176,7 +176,7 @@ pfil_head_get(int type, u_long val)
 }
 
 static void
-pfil_add_hook_dispatch(struct netmsg *nmsg)
+pfil_add_hook_dispatch(netmsg_t nmsg)
 {
        struct netmsg_pfil *pfilmsg = (struct netmsg_pfil *)nmsg;
        pfil_func_t func = pfilmsg->pfil_func;
@@ -252,7 +252,7 @@ pfil_add_hook_dispatch(struct netmsg *nmsg)
        if (old_list_out != NULL)
                pfil_list_free(old_list_out);
 reply:
-       lwkt_replymsg(&nmsg->nm_lmsg, err);
+       lwkt_replymsg(&nmsg->base.lmsg, err);
 }
 
 /*
@@ -267,9 +267,10 @@ int
 pfil_add_hook(pfil_func_t func, void *arg, int flags, struct pfil_head *ph)
 {
        struct netmsg_pfil pfilmsg;
-       struct netmsg *nmsg;
+       netmsg_base_t nmsg;
+       int error;
 
-       nmsg = &pfilmsg.pfil_nmsg;
+       nmsg = &pfilmsg.base;
        netmsg_init(nmsg, NULL, &curthread->td_msgport,
                    0, pfil_add_hook_dispatch);
        pfilmsg.pfil_func = func;
@@ -277,11 +278,12 @@ pfil_add_hook(pfil_func_t func, void *arg, int flags, struct pfil_head *ph)
        pfilmsg.pfil_flags = flags;
        pfilmsg.pfil_ph = ph;
 
-       return lwkt_domsg(PFIL_CFGPORT, &nmsg->nm_lmsg, 0);
+       error = lwkt_domsg(PFIL_CFGPORT, &nmsg->lmsg, 0);
+       return error;
 }
 
 static void
-pfil_remove_hook_dispatch(struct netmsg *nmsg)
+pfil_remove_hook_dispatch(netmsg_t nmsg)
 {
        struct netmsg_pfil *pfilmsg = (struct netmsg_pfil *)nmsg;
        pfil_func_t func = pfilmsg->pfil_func;
@@ -358,7 +360,7 @@ pfil_remove_hook_dispatch(struct netmsg *nmsg)
        if (old_list_out != NULL)
                pfil_list_free(old_list_out);
 reply:
-       lwkt_replymsg(&nmsg->nm_lmsg, err);
+       lwkt_replymsg(&nmsg->base.lmsg, err);
 }
 
 /*
@@ -369,9 +371,9 @@ int
 pfil_remove_hook(pfil_func_t func, void *arg, int flags, struct pfil_head *ph)
 {
        struct netmsg_pfil pfilmsg;
-       struct netmsg *nmsg;
+       netmsg_base_t nmsg;
 
-       nmsg = &pfilmsg.pfil_nmsg;
+       nmsg = &pfilmsg.base;
        netmsg_init(nmsg, NULL, &curthread->td_msgport,
                    0, pfil_remove_hook_dispatch);
        pfilmsg.pfil_func = func;
@@ -379,7 +381,7 @@ pfil_remove_hook(pfil_func_t func, void *arg, int flags, struct pfil_head *ph)
        pfilmsg.pfil_flags = flags;
        pfilmsg.pfil_ph = ph;
 
-       return lwkt_domsg(PFIL_CFGPORT, &nmsg->nm_lmsg, 0);
+       return lwkt_domsg(PFIL_CFGPORT, &nmsg->lmsg, 0);
 }
 
 static void
index 94fc751..9590a24 100644 (file)
@@ -199,7 +199,7 @@ static struct compressor *ppp_compressors[8] = {
  * Software interrupt routine, called at spl[soft]net.
  */
 static void
-pppintr(struct netmsg *msg)
+pppintr(netmsg_t msg)
 {
     struct mbuf *m;
     struct ppp_softc *sc;
@@ -210,7 +210,7 @@ pppintr(struct netmsg *msg)
      * be replied.  Interlock processing and notification by replying
      * the message first.
      */
-    lwkt_replymsg(&msg->nm_lmsg, 0);
+    lwkt_replymsg(&msg->lmsg, 0);
 
     get_mplock();
 
index 50fc113..a2c6ea1 100644 (file)
@@ -74,8 +74,10 @@ struct rawcb {
 #ifdef _KERNEL
 extern LIST_HEAD(rawcb_list_head, rawcb) rawcb_list;
 
+union netmsg;
+
 int     raw_attach (struct socket *, int, struct rlimit *);
-void    raw_ctlinput (int, struct sockaddr *, void *);
+void    raw_ctlinput (union netmsg *);
 void    raw_detach (struct rawcb *);
 void    raw_disconnect (struct rawcb *);
 void    raw_init (void);
index cfc7f30..19f6f39 100644 (file)
@@ -45,6 +45,7 @@
 #include <sys/socketvar.h>
 
 #include <sys/socketvar2.h>
+#include <sys/msgport2.h>
 
 #include <net/raw_cb.h>
 
@@ -135,118 +136,145 @@ raw_input(struct mbuf *m0, const struct sockproto *proto,
        lwkt_reltoken(&raw_token);
 }
 
-/*ARGSUSED*/
+/*
+ * nm_cmd, nm_arg, nm_extra
+ */
 void
-raw_ctlinput(int cmd, struct sockaddr *arg, void *dummy)
+raw_ctlinput(netmsg_t msg)
 {
+       int error = 0;
 
-       if (cmd < 0 || cmd > PRC_NCMDS)
-               return;
-       /* INCOMPLETE */
+       if (msg->ctlinput.nm_cmd < 0 || msg->ctlinput.nm_cmd > PRC_NCMDS)
+               ;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /*
  * NOTE: (so) is referenced from soabort*() and netmsg_pru_abort()
  *      will sofree() it when we return.
  */
-static int
-raw_uabort(struct socket *so)
+static void
+raw_uabort(netmsg_t msg)
 {
-       struct rawcb *rp = sotorawcb(so);
+       struct rawcb *rp = sotorawcb(msg->base.nm_so);
+       int error;
 
-       if (rp == NULL)
-               return EINVAL;
-       raw_disconnect(rp);
-       soisdisconnected(so);
-       return 0;
+       if (rp) {
+               raw_disconnect(rp);
+               soisdisconnected(msg->base.nm_so);
+               error = 0;
+       } else {
+               error = EINVAL;
+       }
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /* pru_accept is EOPNOTSUPP */
 
-static int
-raw_uattach(struct socket *so, int proto, struct pru_attach_info *ai)
+static void
+raw_uattach(netmsg_t msg)
 {
-       struct rawcb *rp = sotorawcb(so);
+       struct socket *so = msg->base.nm_so;
+       int proto = msg->attach.nm_proto;
+       struct pru_attach_info *ai = msg->attach.nm_ai;
+       struct rawcb *rp;
        int error;
 
-       if (rp == NULL)
-               return EINVAL;
-       if ((error = priv_check_cred(ai->p_ucred, PRIV_ROOT, NULL_CRED_OKAY)) != 0)
-               return error;
-       return raw_attach(so, proto, ai->sb_rlimit);
+       rp = sotorawcb(so);
+       if (rp) {
+               error = priv_check_cred(ai->p_ucred, PRIV_ROOT, NULL_CRED_OKAY);
+               if (error == 0)
+                       error = raw_attach(so, proto, ai->sb_rlimit);
+       } else {
+               error = EINVAL;
+       }
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-raw_ubind(struct socket *so, struct sockaddr *nam, struct thread *td)
+static void
+raw_ubind(netmsg_t msg)
 {
-       return EINVAL;
+       lwkt_replymsg(&msg->lmsg, EINVAL);
 }
 
-static int
-raw_uconnect(struct socket *so, struct sockaddr *nam, struct thread *td)
+static void
+raw_uconnect(netmsg_t msg)
 {
-       return EINVAL;
+       lwkt_replymsg(&msg->lmsg, EINVAL);
 }
 
 /* pru_connect2 is EOPNOTSUPP */
 /* pru_control is EOPNOTSUPP */
 
-static int
-raw_udetach(struct socket *so)
+static void
+raw_udetach(netmsg_t msg)
 {
-       struct rawcb *rp = sotorawcb(so);
-
-       if (rp == NULL)
-               return EINVAL;
+       struct rawcb *rp = sotorawcb(msg->base.nm_so);
+       int error;
 
-       raw_detach(rp);
-       return 0;
+       if (rp) {
+               raw_detach(rp);
+               error = 0;
+       } else {
+               error = EINVAL;
+       }
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-raw_udisconnect(struct socket *so)
+static void
+raw_udisconnect(netmsg_t msg)
 {
-       struct rawcb *rp = sotorawcb(so);
+       struct socket *so = msg->base.nm_so;
+       struct rawcb *rp;
+       int error;
 
-       if (rp == NULL)
-               return EINVAL;
-       if (rp->rcb_faddr == NULL) {
-               return ENOTCONN;
+       rp = sotorawcb(so);
+       if (rp == NULL) {
+               error = EINVAL;
+       } else if (rp->rcb_faddr == NULL) {
+               error = ENOTCONN;
+       } else {
+               soreference(so);
+               raw_disconnect(rp);
+               soisdisconnected(so);
+               sofree(so);
+               error = 0;
        }
-       soreference(so);
-       raw_disconnect(rp);
-       soisdisconnected(so);
-       sofree(so);
-
-       return 0;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /* pru_listen is EOPNOTSUPP */
 
-static int
-raw_upeeraddr(struct socket *so, struct sockaddr **nam)
+static void
+raw_upeeraddr(netmsg_t msg)
 {
-       struct rawcb *rp = sotorawcb(so);
+       struct rawcb *rp = sotorawcb(msg->base.nm_so);
+       int error;
 
-       if (rp == NULL)
-               return EINVAL;
-       if (rp->rcb_faddr == NULL) {
-               return ENOTCONN;
+       if (rp == NULL) {
+               error = EINVAL;
+       } else if (rp->rcb_faddr == NULL) {
+               error = ENOTCONN;
+       } else {
+               *msg->peeraddr.nm_nam = dup_sockaddr(rp->rcb_faddr);
+               error = 0;
        }
-       *nam = dup_sockaddr(rp->rcb_faddr);
-       return 0;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /* pru_rcvd is EOPNOTSUPP */
 /* pru_rcvoob is EOPNOTSUPP */
 
-static int
-raw_usend(struct socket *so, int flags, struct mbuf *m,
-         struct sockaddr *nam, struct mbuf *control, struct thread *td)
+static void
+raw_usend(netmsg_t msg)
 {
-       int error;
+       struct socket *so = msg->base.nm_so;
+       struct mbuf *m = msg->send.nm_m;
+       struct mbuf *control = msg->send.nm_control;
        struct rawcb *rp = sotorawcb(so);
        struct pr_output_info oi;
+       int flags = msg->send.nm_flags;
+       int error;
 
        if (rp == NULL) {
                error = EINVAL;
@@ -262,67 +290,75 @@ raw_usend(struct socket *so, int flags, struct mbuf *m,
                error = EOPNOTSUPP;
                goto release;
        }
-       if (nam) {
+       if (msg->send.nm_addr) {
                if (rp->rcb_faddr) {
                        error = EISCONN;
                        goto release;
                }
-               rp->rcb_faddr = nam;
+               rp->rcb_faddr = msg->send.nm_addr;
        } else if (rp->rcb_faddr == NULL) {
                error = ENOTCONN;
                goto release;
        }
-       oi.p_pid = td->td_proc->p_pid;
+       oi.p_pid = msg->send.nm_td->td_proc->p_pid;
        error = (*so->so_proto->pr_output)(m, so, &oi);
        m = NULL;
-       if (nam)
+       if (msg->send.nm_addr)
                rp->rcb_faddr = NULL;
 release:
        if (m != NULL)
                m_freem(m);
-       return (error);
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 /* pru_sense is null */
 
-static int
-raw_ushutdown(struct socket *so)
+static void
+raw_ushutdown(netmsg_t msg)
 {
-       struct rawcb *rp = sotorawcb(so);
+       struct rawcb *rp = sotorawcb(msg->base.nm_so);
+       int error;
 
-       if (rp == NULL)
-               return EINVAL;
-       socantsendmore(so);
-       return 0;
+       if (rp) {
+               socantsendmore(msg->base.nm_so);
+               error = 0;
+       } else {
+               error = EINVAL;
+       }
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-raw_usockaddr(struct socket *so, struct sockaddr **nam)
+static void
+raw_usockaddr(netmsg_t msg)
 {
-       struct rawcb *rp = sotorawcb(so);
+       struct rawcb *rp = sotorawcb(msg->base.nm_so);
+       int error;
 
-       if (rp == NULL)
-               return EINVAL;
-       if (rp->rcb_laddr == NULL)
-               return EINVAL;
-       *nam = dup_sockaddr(rp->rcb_laddr);
-       return 0;
+       if (rp == NULL) {
+               error = EINVAL;
+       } else if (rp->rcb_laddr == NULL) {
+               error = EINVAL;
+       } else {
+               *msg->sockaddr.nm_nam = dup_sockaddr(rp->rcb_laddr);
+               error = 0;
+       }
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
 struct pr_usrreqs raw_usrreqs = {
        .pru_abort = raw_uabort,
-       .pru_accept = pru_accept_notsupp,
+       .pru_accept = pr_generic_notsupp,
        .pru_attach = raw_uattach,
        .pru_bind = raw_ubind,
        .pru_connect = raw_uconnect,
-       .pru_connect2 = pru_connect2_notsupp,
-       .pru_control = pru_control_notsupp,
+       .pru_connect2 = pr_generic_notsupp,
+       .pru_control = pr_generic_notsupp,
        .pru_detach = raw_udetach, 
        .pru_disconnect = raw_udisconnect,
-       .pru_listen = pru_listen_notsupp,
+       .pru_listen = pr_generic_notsupp,
        .pru_peeraddr = raw_upeeraddr,
-       .pru_rcvd = pru_rcvd_notsupp,
-       .pru_rcvoob = pru_rcvoob_notsupp,
+       .pru_rcvd = pr_generic_notsupp,
+       .pru_rcvoob = pr_generic_notsupp,
        .pru_send = raw_usend,
        .pru_sense = pru_sense_null,
        .pru_shutdown = raw_ushutdown,
index f3ebb80..75cb594 100644 (file)
@@ -115,12 +115,11 @@ static void rtinit_rtrequest_callback(int, int, struct rt_addrinfo *,
                                      struct rtentry *, void *);
 
 #ifdef SMP
-static void rtredirect_msghandler(struct netmsg *netmsg);
-static void rtrequest1_msghandler(struct netmsg *netmsg);
+static void rtredirect_msghandler(netmsg_t msg);
+static void rtrequest1_msghandler(netmsg_t msg);
 #endif
-static void rtsearch_msghandler(struct netmsg *netmsg);
-
-static void rtmask_add_msghandler(struct netmsg *netmsg);
+static void rtsearch_msghandler(netmsg_t msg);
+static void rtmask_add_msghandler(netmsg_t msg);
 
 static int rt_setshims(struct rtentry *, struct sockaddr **);
 
@@ -160,7 +159,7 @@ route_init(void)
 }
 
 static void
-rtable_init_oncpu(struct netmsg *nmsg)
+rtable_init_oncpu(netmsg_t msg)
 {
        struct domain *dom;
        int cpu = mycpuid;
@@ -172,17 +171,16 @@ rtable_init_oncpu(struct netmsg *nmsg)
                                dom->dom_rtoffset);
                }
        }
-       ifnet_forwardmsg(&nmsg->nm_lmsg, cpu + 1);
+       ifnet_forwardmsg(&msg->lmsg, cpu + 1);
 }
 
 static void
 rtable_init(void)
 {
-       struct netmsg nmsg;
+       struct netmsg_base msg;
 
-       netmsg_init(&nmsg, NULL, &curthread->td_msgport,
-                   0, rtable_init_oncpu);
-       ifnet_domsg(&nmsg.nm_lmsg, 0);
+       netmsg_init(&msg, NULL, &curthread->td_msgport, 0, rtable_init_oncpu);
+       ifnet_domsg(&msg.lmsg, 0);
 }
 
 /*
@@ -195,13 +193,13 @@ rtable_init(void)
 static void
 rtable_service_loop(void *dummy __unused)
 {
-       struct netmsg *netmsg;
+       netmsg_base_t msg;
        thread_t td = curthread;
 
        get_mplock();   /* XXX is this mpsafe yet? */
 
-       while ((netmsg = lwkt_waitport(&td->td_msgport, 0)) != NULL) {
-               netmsg->nm_dispatch(netmsg);
+       while ((msg = lwkt_waitport(&td->td_msgport, 0)) != NULL) {
+               msg->nm_dispatch((netmsg_t)msg);
        }
 }
 
@@ -364,9 +362,9 @@ rtfree_oncpu(struct rtentry *rt)
 }
 
 static void
-rtfree_remote_dispatch(struct netmsg *nmsg)
+rtfree_remote_dispatch(netmsg_t msg)
 {
-       struct lwkt_msg *lmsg = &nmsg->nm_lmsg;
+       struct lwkt_msg *lmsg = &msg->lmsg;
        struct rtentry *rt = lmsg->u.ms_resultp;
 
        rtfree_oncpu(rt);
@@ -376,7 +374,7 @@ rtfree_remote_dispatch(struct netmsg *nmsg)
 void
 rtfree_remote(struct rtentry *rt, int allow_panic)
 {
-       struct netmsg nmsg;
+       struct netmsg_base msg;
        struct lwkt_msg *lmsg;
 
        KKASSERT(rt->rt_cpuid != mycpuid);
@@ -390,9 +388,9 @@ rtfree_remote(struct rtentry *rt, int allow_panic)
                print_backtrace(-1);
        }
 
-       netmsg_init(&nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, rtfree_remote_dispatch);
-       lmsg = &nmsg.nm_lmsg;
+       lmsg = &msg.lmsg;
        lmsg->u.ms_resultp = rt;
 
        lwkt_domsg(rtable_portfn(rt->rt_cpuid), lmsg, 0);
@@ -502,7 +500,7 @@ out:
 #ifdef SMP
 
 struct netmsg_rtredirect {
-       struct netmsg   netmsg;
+       struct netmsg_base base;
        struct sockaddr *dst;
        struct sockaddr *gateway;
        struct sockaddr *netmask;
@@ -529,14 +527,14 @@ rtredirect(struct sockaddr *dst, struct sockaddr *gateway,
 #ifdef SMP
        struct netmsg_rtredirect msg;
 
-       netmsg_init(&msg.netmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                    0, rtredirect_msghandler);
        msg.dst = dst;
        msg.gateway = gateway;
        msg.netmask = netmask;
        msg.flags = flags;
        msg.src = src;
-       error = lwkt_domsg(rtable_portfn(0), &msg.netmsg.nm_lmsg, 0);
+       error = lwkt_domsg(rtable_portfn(0), &msg.base.lmsg, 0);
 #else
        error = rtredirect_oncpu(dst, gateway, netmask, flags, src);
 #endif
@@ -551,18 +549,18 @@ rtredirect(struct sockaddr *dst, struct sockaddr *gateway,
 #ifdef SMP
 
 static void
-rtredirect_msghandler(struct netmsg *netmsg)
+rtredirect_msghandler(netmsg_t msg)
 {
-       struct netmsg_rtredirect *msg = (void *)netmsg;
+       struct netmsg_rtredirect *rmsg = (void *)msg;
        int nextcpu;
 
-       rtredirect_oncpu(msg->dst, msg->gateway, msg->netmask,
-                        msg->flags, msg->src);
+       rtredirect_oncpu(rmsg->dst, rmsg->gateway, rmsg->netmask,
+                        rmsg->flags, rmsg->src);
        nextcpu = mycpuid + 1;
        if (nextcpu < ncpus)
-               lwkt_forwardmsg(rtable_portfn(nextcpu), &netmsg->nm_lmsg);
+               lwkt_forwardmsg(rtable_portfn(nextcpu), &msg->lmsg);
        else
-               lwkt_replymsg(&netmsg->nm_lmsg, 0);
+               lwkt_replymsg(&msg->lmsg, 0);
 }
 
 #endif
@@ -732,7 +730,7 @@ rtrequest_global(
 #ifdef SMP
 
 struct netmsg_rtq {
-       struct netmsg           netmsg;
+       struct netmsg_base      base;
        int                     req;
        struct rt_addrinfo      *rtinfo;
        rtrequest1_callback_func_t callback;
@@ -749,14 +747,14 @@ rtrequest1_global(int req, struct rt_addrinfo *rtinfo,
 #ifdef SMP
        struct netmsg_rtq msg;
 
-       netmsg_init(&msg.netmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                    0, rtrequest1_msghandler);
-       msg.netmsg.nm_lmsg.ms_error = -1;
+       msg.base.lmsg.ms_error = -1;
        msg.req = req;
        msg.rtinfo = rtinfo;
        msg.callback = callback;
        msg.arg = arg;
-       error = lwkt_domsg(rtable_portfn(0), &msg.netmsg.nm_lmsg, 0);
+       error = lwkt_domsg(rtable_portfn(0), &msg.base.lmsg, 0);
 #else
        struct rtentry *rt = NULL;
 
@@ -777,9 +775,9 @@ rtrequest1_global(int req, struct rt_addrinfo *rtinfo,
 #ifdef SMP
 
 static void
-rtrequest1_msghandler(struct netmsg *netmsg)
+rtrequest1_msghandler(netmsg_t msg)
 {
-       struct netmsg_rtq *msg = (void *)netmsg;
+       struct netmsg_rtq *rmsg = (void *)msg;
        struct rt_addrinfo rtinfo;
        struct rtentry *rt = NULL;
        int nextcpu;
@@ -791,13 +789,13 @@ rtrequest1_msghandler(struct netmsg *netmsg)
         * _not_ be changed; else the next CPU on the netmsg forwarding
         * path will see a different rtinfo than what this CPU has seen.
         */
-       rtinfo = *msg->rtinfo;
+       rtinfo = *rmsg->rtinfo;
 
-       error = rtrequest1(msg->req, &rtinfo, &rt);
+       error = rtrequest1(rmsg->req, &rtinfo, &rt);
        if (rt)
                --rt->rt_refcnt;
-       if (msg->callback)
-               msg->callback(msg->req, error, &rtinfo, rt, msg->arg);
+       if (rmsg->callback)
+               rmsg->callback(rmsg->req, error, &rtinfo, rt, rmsg->arg);
 
        /*
         * RTM_DELETE's are propogated even if an error occurs, since a
@@ -805,21 +803,20 @@ rtrequest1_msghandler(struct netmsg *netmsg)
         * are not necessarily replicated.  An overall error is returned
         * only if no cpus have the route in question.
         */
-       if (msg->netmsg.nm_lmsg.ms_error < 0 || error == 0)
-               msg->netmsg.nm_lmsg.ms_error = error;
+       if (rmsg->base.lmsg.ms_error < 0 || error == 0)
+               rmsg->base.lmsg.ms_error = error;
 
        nextcpu = mycpuid + 1;
-       if (error && msg->req != RTM_DELETE) {
+       if (error && rmsg->req != RTM_DELETE) {
                if (mycpuid != 0) {
                        panic("rtrequest1_msghandler: rtrequest table "
                              "error was not on cpu #0");
                }
-               lwkt_replymsg(&msg->netmsg.nm_lmsg, error);
+               lwkt_replymsg(&rmsg->base.lmsg, error);
        } else if (nextcpu < ncpus) {
-               lwkt_forwardmsg(rtable_portfn(nextcpu), &msg->netmsg.nm_lmsg);
+               lwkt_forwardmsg(rtable_portfn(nextcpu), &rmsg->base.lmsg);
        } else {
-               lwkt_replymsg(&msg->netmsg.nm_lmsg,
-                             msg->netmsg.nm_lmsg.ms_error);
+               lwkt_replymsg(&rmsg->base.lmsg, rmsg->base.lmsg.ms_error);
        }
 }
 
@@ -1649,7 +1646,7 @@ rtinit_rtrequest_callback(int cmd, int error,
 }
 
 struct netmsg_rts {
-       struct netmsg           netmsg;
+       struct netmsg_base      base;
        int                     req;
        struct rt_addrinfo      *rtinfo;
        rtsearch_callback_func_t callback;
@@ -1665,7 +1662,7 @@ rtsearch_global(int req, struct rt_addrinfo *rtinfo,
 {
        struct netmsg_rts msg;
 
-       netmsg_init(&msg.netmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg.base, NULL, &curthread->td_msgport,
                    0, rtsearch_msghandler);
        msg.req = req;
        msg.rtinfo = rtinfo;
@@ -1673,13 +1670,13 @@ rtsearch_global(int req, struct rt_addrinfo *rtinfo,
        msg.arg = arg;
        msg.exact_match = exact_match;
        msg.found_cnt = 0;
-       return lwkt_domsg(rtable_portfn(0), &msg.netmsg.nm_lmsg, 0);
+       return lwkt_domsg(rtable_portfn(0), &msg.base.lmsg, 0);
 }
 
 static void
-rtsearch_msghandler(struct netmsg *netmsg)
+rtsearch_msghandler(netmsg_t msg)
 {
-       struct netmsg_rts *msg = (void *)netmsg;
+       struct netmsg_rts *rmsg = (void *)msg;
        struct rt_addrinfo rtinfo;
        struct radix_node_head *rnh;
        struct rtentry *rt;
@@ -1691,7 +1688,7 @@ rtsearch_msghandler(struct netmsg *netmsg)
         * _not_ be changed; else the next CPU on the netmsg forwarding
         * path will see a different rtinfo than what this CPU has seen.
         */
-       rtinfo = *msg->rtinfo;
+       rtinfo = *rmsg->rtinfo;
 
        /*
         * Find the correct routing tree to use for this Address Family
@@ -1699,7 +1696,7 @@ rtsearch_msghandler(struct netmsg *netmsg)
        if ((rnh = rt_tables[mycpuid][rtinfo.rti_dst->sa_family]) == NULL) {
                if (mycpuid != 0)
                        panic("partially initialized routing tables\n");
-               lwkt_replymsg(&msg->netmsg.nm_lmsg, EAFNOSUPPORT);
+               lwkt_replymsg(&rmsg->base.lmsg, EAFNOSUPPORT);
                return;
        }
 
@@ -1720,7 +1717,7 @@ rtsearch_msghandler(struct netmsg *netmsg)
         * that host route searching got a host route while a network
         * route searching got a network route.
         */
-       if (rt != NULL && msg->exact_match &&
+       if (rt != NULL && rmsg->exact_match &&
            ((rt->rt_flags ^ rtinfo.rti_flags) & RTF_HOST))
                rt = NULL;
 
@@ -1733,22 +1730,22 @@ rtsearch_msghandler(struct netmsg *netmsg)
                 */
                error = 0;
        } else {
-               msg->found_cnt++;
+               rmsg->found_cnt++;
 
                rt->rt_refcnt++;
-               error = msg->callback(msg->req, &rtinfo, rt, msg->arg,
-                                     msg->found_cnt);
+               error = rmsg->callback(rmsg->req, &rtinfo, rt, rmsg->arg,
+                                     rmsg->found_cnt);
                rt->rt_refcnt--;
 
                if (error == EJUSTRETURN) {
-                       lwkt_replymsg(&msg->netmsg.nm_lmsg, 0);
+                       lwkt_replymsg(&rmsg->base.lmsg, 0);
                        return;
                }
        }
 
        nextcpu = mycpuid + 1;
        if (error) {
-               KKASSERT(msg->found_cnt > 0);
+               KKASSERT(rmsg->found_cnt > 0);
 
                /*
                 * Under following cases, unrecoverable error has
@@ -1757,32 +1754,32 @@ rtsearch_msghandler(struct netmsg *netmsg)
                 * o  The first time that we find the route, but the
                 *    modification fails.
                 */
-               if (msg->req != RTM_GET && msg->found_cnt > 1) {
+               if (rmsg->req != RTM_GET && rmsg->found_cnt > 1) {
                        panic("rtsearch_msghandler: unrecoverable error "
                              "cpu %d", mycpuid);
                }
-               lwkt_replymsg(&msg->netmsg.nm_lmsg, error);
+               lwkt_replymsg(&rmsg->base.lmsg, error);
        } else if (nextcpu < ncpus) {
-               lwkt_forwardmsg(rtable_portfn(nextcpu), &msg->netmsg.nm_lmsg);
+               lwkt_forwardmsg(rtable_portfn(nextcpu), &rmsg->base.lmsg);
        } else {
-               if (msg->found_cnt == 0) {
+               if (rmsg->found_cnt == 0) {
                        /* The requested route was never seen ... */
                        error = ESRCH;
                }
-               lwkt_replymsg(&msg->netmsg.nm_lmsg, error);
+               lwkt_replymsg(&rmsg->base.lmsg, error);
        }
 }
 
 int
 rtmask_add_global(struct sockaddr *mask)
 {
-       struct netmsg nmsg;
+       struct netmsg_base msg;
 
-       netmsg_init(&nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&msg, NULL, &curthread->td_msgport,
                    0, rtmask_add_msghandler);
-       nmsg.nm_lmsg.u.ms_resultp = mask;
+       msg.lmsg.u.ms_resultp = mask;
 
-       return lwkt_domsg(rtable_portfn(0), &nmsg.nm_lmsg, 0);
+       return lwkt_domsg(rtable_portfn(0), &msg.lmsg, 0);
 }
 
 struct sockaddr *
@@ -1804,9 +1801,9 @@ _rtmask_lookup(struct sockaddr *mask, boolean_t search)
 }
 
 static void
-rtmask_add_msghandler(struct netmsg *nmsg)
+rtmask_add_msghandler(netmsg_t msg)
 {
-       struct lwkt_msg *lmsg = &nmsg->nm_lmsg;
+       struct lwkt_msg *lmsg = &msg->lmsg;
        struct sockaddr *mask = lmsg->u.ms_resultp;
        int error = 0, nextcpu;
 
index 2783b81..ee6ab7f 100644 (file)
@@ -129,27 +129,31 @@ static void       rt_setmetrics (u_long, struct rt_metrics *,
  * It really doesn't make any sense at all for this code to share much
  * with raw_usrreq.c, since its functionality is so restricted.  XXX
  */
-static int
-rts_abort(struct socket *so)
+static void
+rts_abort(netmsg_t msg)
 {
-       int error;
-
        crit_enter();
-       error = raw_usrreqs.pru_abort(so);
+       raw_usrreqs.pru_abort(msg);
+       /* msg invalid now */
        crit_exit();
-       return error;
 }
 
 /* pru_accept is EOPNOTSUPP */
 
-static int
-rts_attach(struct socket *so, int proto, struct pru_attach_info *ai)
+static void
+rts_attach(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
+       struct pru_attach_info *ai = msg->attach.nm_ai;
        struct rawcb *rp;
+       int proto = msg->attach.nm_proto;
        int error;
 
-       if (sotorawcb(so) != NULL)
-               return EISCONN; /* XXX panic? */
+       crit_enter();
+       if (sotorawcb(so) != NULL) {
+               error = EISCONN;
+               goto done;
+       }
 
        rp = kmalloc(sizeof *rp, M_PCB, M_WAITOK | M_ZERO);
 
@@ -160,15 +164,13 @@ rts_attach(struct socket *so, int proto, struct pru_attach_info *ai)
         * Probably we should try to do more of this work beforehand and
         * eliminate the critical section.
         */
-       crit_enter();
        so->so_pcb = rp;
        soreference(so);        /* so_pcb assignment */
        error = raw_attach(so, proto, ai->sb_rlimit);
        rp = sotorawcb(so);
        if (error) {
-               crit_exit();
                kfree(rp, M_PCB);
-               return error;
+               goto done;
        }
        switch(rp->rcb_proto.sp_protocol) {
        case AF_INET:
@@ -188,40 +190,38 @@ rts_attach(struct socket *so, int proto, struct pru_attach_info *ai)
        route_cb.any_count++;
        soisconnected(so);
        so->so_options |= SO_USELOOPBACK;
+       error = 0;
+done:
        crit_exit();
-       return 0;
+       lwkt_replymsg(&msg->lmsg, error);
 }
 
-static int
-rts_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
+static void
+rts_bind(netmsg_t msg)
 {
-       int error;
-
        crit_enter();
-       error = raw_usrreqs.pru_bind(so, nam, td); /* xxx just EINVAL */
+       raw_usrreqs.pru_bind(msg); /* xxx just EINVAL */
+       /* msg invalid now */
        crit_exit();
-       return error;
 }
 
-static int
-rts_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
+static void
+rts_connect(netmsg_t msg)
 {
-       int error;
-
        crit_enter();
-       error = raw_usrreqs.pru_connect(so, nam, td); /* XXX just EINVAL */
+       raw_usrreqs.pru_connect(msg); /* XXX just EINVAL */
+       /* msg invalid now */
        crit_exit();
-       return error;
 }
 
 /* pru_connect2 is EOPNOTSUPP */
 /* pru_control is EOPNOTSUPP */
 
-static int
-rts_detach(struct socket *so)
+static void
+rts_detach(netmsg_t msg)
 {
+       struct socket *so = msg->base.nm_so;
        struct rawcb *rp = sotorawcb(so);
-       int error;
 
        crit_enter();
        if (rp != NULL) {
@@ -241,88 +241,77 @@ rts_detach(struct socket *so)
                }
                route_cb.any_count--;
        }
-       error = raw_usrreqs.pru_detach(so);
+       raw_usrreqs.pru_detach(msg);
+       /* msg invalid now */
        crit_exit();
-       return error;
 }
 
-static int
-rts_disconnect(struct socket *so)
+static void
+rts_disconnect(netmsg_t msg)
 {
-       int error;
-
        crit_enter();
-       error = raw_usrreqs.pru_disconnect(so);
+       raw_usrreqs.pru_disconnect(msg);
+       /* msg invalid now */
        crit_exit();
-       return error;
 }
 
 /* pru_listen is EOPNOTSUPP */
 
-static int
-rts_peeraddr(struct socket *so, struct sockaddr **nam)
+static void
+rts_peeraddr(netmsg_t msg)
 {
-       int error;
-
        crit_enter();
-       error = raw_usrreqs.pru_peeraddr(so, nam);
+       raw_usrreqs.pru_peeraddr(msg);
+       /* msg invalid now */
        crit_exit();
-       return error;
 }
 
 /* pru_rcvd is EOPNOTSUPP */
 /* pru_rcvoob is EOPNOTSUPP */
 
-static int
-rts_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
-        struct mbuf *control, struct thread *td)
+static void
+rts_send(netmsg_t msg)
 {
-       int error;
-
        crit_enter();
-       error = raw_usrreqs.pru_send(so, flags, m, nam, control, td);
+       raw_usrreqs.pru_send(msg);
+       /* msg invalid now */
        crit_exit();
-       return error;
 }
 
 /* pru_sense is null */
 
-static int
-rts_shutdown(struct socket *so)
+static void
+rts_shutdown(netmsg_t msg)
 {
-       int error;
-
        crit_enter();
-       error = raw_usrreqs.pru_shutdown(so);
+       raw_usrreqs.pru_shutdown(msg);
+       /* msg invalid now */
        crit_exit();
-       return error;
 }
 
-static int
-rts_sockaddr(struct socket *so, struct sockaddr **nam)
+static void
+rts_sockaddr(netmsg_t msg)
 {
-       int error;
-
        crit_enter();
-       error = raw_usrreqs.pru_sockaddr(so, nam);
+       raw_usrreqs.pru_sockaddr(msg);
+       /* msg invalid now */
        crit_exit();
-       return error;
 }
 
 static struct pr_usrreqs route_usrreqs = {
        .pru_abort = rts_abort,
-       .pru_accept = pru_accept_notsupp,
+       .pru_accept = pr_generic_notsupp,
        .pru_attach = rts_attach,
        .pru_bind = rts_bind,
        .pru_connect = rts_connect,
-       .pru_connect2 = pru_connect2_notsupp,
-       .pru_control = pru_control_notsupp,
+       .pru_connect2 = pr_generic_notsupp,
+       .pru_control = pr_generic_notsupp,
        .pru_detach = rts_detach,
        .pru_disconnect = rts_disconnect,
-       .pru_listen = pru_listen_notsupp,
+       .pru_listen = pr_generic_notsupp,
        .pru_peeraddr = rts_peeraddr,
-       .pru_rcvd = pru_rcvd_notsupp,
-       .pru_rcvoob = pru_rcvoob_notsupp,
+       .pru_rcvd = pr_generic_notsupp,
+       .pru_rcvoob = pr_generic_notsupp,
        .pru_send = rts_send,
        .pru_sense = pru_sense_null,
        .pru_shutdown = rts_shutdown,
@@ -345,17 +334,16 @@ familyof(struct sockaddr *sa)
  * can send a message to the routing socket.
  */
 static void
-rts_input_handler(struct netmsg *msg)
+rts_input_handler(netmsg_t msg)
 {
        static const struct sockaddr route_dst = { 2, PF_ROUTE, };
        struct sockproto route_proto;
-       struct netmsg_packet *pmsg;
+       struct netmsg_packet *pmsg = &msg->packet;
        struct mbuf *m;
        sa_family_t family;
        struct rawcb *skip;
 
-       pmsg = (void *)msg;
-       family = pmsg->nm_netmsg.nm_lmsg.u.ms_result;
+       family = pmsg->base.lmsg.u.ms_result;
        route_proto.sp_family = PF_ROUTE;
        route_proto.sp_protocol = family;
 
@@ -376,14 +364,14 @@ rts_input_skip(struct mbuf *m, sa_family_t family, struct rawcb *skip)
 
        M_ASSERTPKTHDR(m);
 
-       port = cpu0_soport(NULL, NULL, NULL); /* same as for routing socket */
+       port = cpu_portfn(0);   /* XXX same as for routing socket */
        pmsg = &m->m_hdr.mh_netmsg;
-       netmsg_init(&pmsg->nm_netmsg, NULL, &netisr_apanic_rport,
+       netmsg_init(&pmsg->base, NULL, &netisr_apanic_rport,
                    0, rts_input_handler);
        pmsg->nm_packet = m;
-       pmsg->nm_netmsg.nm_lmsg.u.ms_result = family;
+       pmsg->base.lmsg.u.ms_result = family;
        m->m_pkthdr.header = skip; /* XXX steal field in pkthdr */
-       lwkt_sendmsg(port, &pmsg->nm_netmsg.nm_lmsg);
+       lwkt_sendmsg(port, &pmsg->base.lmsg);
 }
 
 static __inline void
@@ -1459,12 +1447,20 @@ SYSCTL_NODE(_net, PF_ROUTE, routetable, CTLFLAG_RD, sysctl_rtsock, "");
 static struct domain routedomain;              /* or at least forward */
 
 static struct protosw routesw[] = {
-{ SOCK_RAW,    &routedomain,   0,              PR_ATOMIC|PR_ADDR,
-  0,           route_output,   raw_ctlinput,   0,
-  cpu0_soport, cpu0_ctlport,
-  raw_init,    0,              0,              0,
-  &route_usrreqs
-}
+    {
+       .pr_type = SOCK_RAW,
+       .pr_domain = &routedomain,
+       .pr_protocol = 0,
+       .pr_flags = PR_ATOMIC|PR_ADDR,
+       .pr_input = NULL,
+       .pr_output = route_output,
+       .pr_ctlinput = raw_ctlinput,
+       .pr_ctloutput = NULL,
+       .pr_ctlport = cpu0_ctlport,
+
+       .pr_init = raw_init,
+       .pr_usrreqs = &route_usrreqs
+    }
 };
 
 static struct domain routedomain = {
index 5d6d2b2..1386c58 100644 (file)
@@ -135,12 +135,19 @@ static int ip_stf_ttl = 40;
 
 extern  struct domain inetdomain;
 struct protosw in_stf_protosw =
-{ SOCK_RAW,    &inetdomain,    IPPROTO_IPV6,   PR_ATOMIC|PR_ADDR,
-  in_stf_input, rip_output,    0,              rip_ctloutput,
-  NULL,                NULL,
-  0,            0,              0,              0,
-  &rip_usrreqs
-};
+    {
+       .pr_type = SOCK_RAW,
+       .pr_domain = &inetdomain,
+       .pr_protocol = IPPROTO_IPV6,
+       .pr_flags = PR_ATOMIC|PR_ADDR,
+
+       .pr_input = in_stf_input,
+       .pr_output = rip_output,
+       .pr_ctlinput = NULL,
+       .pr_ctloutput = rip_ctloutput,
+
+       .pr_usrreqs = &rip_usrreqs
+    };
 
 static int stfmodevent (module_t, int, void *);
 static int stf_encapcheck (const struct mbuf *, int, int, void *);
@@ -503,26 +510,24 @@ stf_checkaddr6(struct stf_softc *sc, struct in6_addr *in6, struct ifnet *inifp)
        return 0;
 }
 
-void
-in_stf_input(struct mbuf *m, ...)
+int
+in_stf_input(struct mbuf **mp, int *offp, int proto)
 {
+       struct mbuf *m;
        struct stf_softc *sc;
        struct ip *ip;
        struct ip6_hdr *ip6;
        u_int8_t otos, itos;
        struct ifnet *ifp;
-       int off, proto;
+       int off;
        static const uint32_t af = AF_INET6;
-       __va_list ap;
 
-       __va_start(ap, m);
-       off = __va_arg(ap, int);
-       proto = __va_arg(ap, int);
-       __va_end(ap);
+       m = *mp;
+       off = *offp;
 
        if (proto != IPPROTO_IPV6) {
                m_freem(m);
-               return;
+               return(IPPROTO_DONE);
        }
 
        ip = mtod(m, struct ip *);
@@ -531,7 +536,7 @@ in_stf_input(struct mbuf *m, ...)
 
        if (sc == NULL || (sc->sc_if.if_flags & IFF_UP) == 0) {
                m_freem(m);
-               return;
+               return(IPPROTO_DONE);
        }
 
        ifp = &sc->sc_if;
@@ -543,7 +548,7 @@ in_stf_input(struct mbuf *m, ...)
        if (stf_checkaddr4(sc, &ip->ip_dst, NULL) < 0 ||
            stf_checkaddr4(sc, &ip->ip_src, m->m_pkthdr.rcvif) < 0) {
                m_freem(m);
-               return;
+               return(IPPROTO_DONE);
        }
 
        otos = ip->ip_tos;
@@ -552,7 +557,7 @@ in_stf_input(struct mbuf *m, ...)
        if (m->m_len < sizeof(*ip6)) {
                m = m_pullup(m, sizeof(*ip6));
                if (!m)
-                       return;
+                       return(IPPROTO_DONE);
        }
        ip6 = mtod(m, struct ip6_hdr *);
 
@@ -563,7 +568,7 @@ in_stf_input(struct mbuf *m, ...)
        if (stf_checkaddr6(sc, &ip6->ip6_dst, NULL) < 0 ||
            stf_checkaddr6(sc, &ip6->ip6_src, m->m_pkthdr.rcvif) < 0) {
                m_freem(m);
-               return;
+               return(IPPROTO_DONE);
        }
 
        itos = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
@@ -588,6 +593,7 @@ in_stf_input(struct mbuf *m, ...)
        ifp->if_ipackets++;
        ifp->if_ibytes += m->m_pkthdr.len;
        netisr_queue(NETISR_IPV6, m);
+       return(IPPROTO_DONE);
 }
 
 /* ARGSUSED */
index 130e856..0134fc7 100644 (file)
@@ -34,6 +34,6 @@
 #ifndef _NET_IF_STF_H_
 #define _NET_IF_STF_H_
 
-void in_stf_input (struct mbuf *, ...);
+int in_stf_input (struct mbuf **, int *, int);
 
 #endif /* _NET_IF_STF_H_ */
index d505c43..cdbcb5f 100644 (file)
@@ -111,7 +111,7 @@ struct vlan_trunk {
 };
 
 struct netmsg_vlan {
-       struct netmsg   nv_nmsg;
+       struct netmsg_base base;
        struct ifvlan   *nv_ifv;
        struct ifnet    *nv_ifp_p;
        const char      *nv_parent_name;
@@ -148,13 +148,13 @@ static int        vlan_unconfig(struct ifvlan *);
 static void    vlan_link(struct ifvlan *, struct ifnet *);
 static void    vlan_unlink(struct ifvlan *, struct ifnet *);
 
-static void    vlan_config_dispatch(struct netmsg *);
-static void    vlan_unconfig_dispatch(struct netmsg *);
-static void    vlan_link_dispatch(struct netmsg *);
-static void    vlan_unlink_dispatch(struct netmsg *);
-static void    vlan_multi_dispatch(struct netmsg *);
-static void    vlan_flags_dispatch(struct netmsg *);
-static void    vlan_ifdetach_dispatch(struct netmsg *);
+static void    vlan_config_dispatch(netmsg_t);
+static void    vlan_unconfig_dispatch(netmsg_t);
+static void    vlan_link_dispatch(netmsg_t);
+static void    vlan_unlink_dispatch(netmsg_t);
+static void    vlan_multi_dispatch(netmsg_t);
+static void    vlan_flags_dispatch(netmsg_t);
+static void    vlan_ifdetach_dispatch(netmsg_t);
 
 /* Special flags we should propagate to parent */
 static struct {
@@ -343,9 +343,9 @@ static moduledata_t vlan_mod = {
 DECLARE_MODULE(if_vlan, vlan_mod, SI_SUB_PSEUDO, SI_ORDER_ANY);
 
 static void
-vlan_ifdetach_dispatch(struct netmsg *nmsg)
+vlan_ifdetach_dispatch(netmsg_t msg)
 {
-       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)nmsg;
+       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)msg;
        struct ifnet *ifp_p = vmsg->nv_ifp_p;
        struct vlan_trunk *vlantrunks, *trunk;
        struct vlan_entry *ifve;
@@ -359,25 +359,23 @@ vlan_ifdetach_dispatch(struct netmsg *nmsg)
               (ifve = LIST_FIRST(&trunk->vlan_list)) != NULL)
                vlan_unconfig(ifve->ifv);
 reply:
-       lwkt_replymsg(&nmsg->nm_lmsg, 0);
+       lwkt_replymsg(&vmsg->base.lmsg, 0);
 }
 
 static void
 vlan_ifdetach(void *arg __unused, struct ifnet *ifp)
 {
        struct netmsg_vlan vmsg;
-       struct netmsg *nmsg;
 
        ASSERT_IFNET_NOT_SERIALIZED_ALL(ifp);
 
        bzero(&vmsg, sizeof(vmsg));
-       nmsg = &vmsg.nv_nmsg;
 
-       netmsg_init(nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&vmsg.base, NULL, &curthread->td_msgport,
                    0, vlan_ifdetach_dispatch);
        vmsg.nv_ifp_p = ifp;
 
-       lwkt_domsg(cpu_portfn(0), &nmsg->nm_lmsg, 0);
+       lwkt_domsg(cpu_portfn(0), &vmsg.base.lmsg, 0);
 }
 
 static int
@@ -465,7 +463,6 @@ vlan_start(struct ifnet *ifp)
 
        for (;;) {
                struct netmsg_packet *nmp;
-               struct netmsg *nmsg;
                struct lwkt_port *port;
 
                m = ifq_dequeue(&ifp->if_snd, NULL);
@@ -496,15 +493,14 @@ vlan_start(struct ifnet *ifp)
                m->m_flags |= M_VLANTAG;
 
                nmp = &m->m_hdr.mh_netmsg;
-               nmsg = &nmp->nm_netmsg;
 
-               netmsg_init(nmsg, NULL, &netisr_apanic_rport,
+               netmsg_init(&nmp->base, NULL, &netisr_apanic_rport,
                            0, vlan_start_dispatch);
                nmp->nm_packet = m;
-               nmsg->nm_lmsg.u.ms_resultp = ifp_p;
+               nmp->base.lmsg.u.ms_resultp = ifp_p;
 
                port = cpu_portfn(ifp_p->if_index % ncpus /* XXX */);
-               lwkt_sendmsg(port, &nmp->nm_netmsg.nm_lmsg);
+               lwkt_sendmsg(port, &nmp->base.lmsg);
                ifp->if_opackets++;
        }
 }
@@ -559,9 +555,9 @@ vlan_input(struct mbuf *m)
 }
 
 static void
-vlan_link_dispatch(struct netmsg *nmsg)
+vlan_link_dispatch(netmsg_t msg)
 {
-       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)nmsg;
+       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)msg;
        struct ifvlan *ifv = vmsg->nv_ifv;
        struct ifnet *ifp_p = vmsg->nv_ifp_p;
        struct vlan_entry *entry;
@@ -579,14 +575,13 @@ vlan_link_dispatch(struct netmsg *nmsg)
        LIST_INSERT_HEAD(&trunk->vlan_list, entry, ifv_link);
        crit_exit();
 
-       ifnet_forwardmsg(&nmsg->nm_lmsg, cpu + 1);
+       ifnet_forwardmsg(&vmsg->base.lmsg, cpu + 1);
 }
 
 static void
 vlan_link(struct ifvlan *ifv, struct ifnet *ifp_p)
 {
        struct netmsg_vlan vmsg;
-       struct netmsg *nmsg;
 
        /* Assert in netisr0 */
        ASSERT_IFNET_NOT_SERIALIZED_ALL(&ifv->ifv_if);
@@ -604,20 +599,19 @@ vlan_link(struct ifvlan *ifv, struct ifnet *ifp_p)
        }
 
        bzero(&vmsg, sizeof(vmsg));
-       nmsg = &vmsg.nv_nmsg;
 
-       netmsg_init(nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&vmsg.base, NULL, &curthread->td_msgport,
                    0, vlan_link_dispatch);
        vmsg.nv_ifv = ifv;
        vmsg.nv_ifp_p = ifp_p;
 
-       ifnet_domsg(&nmsg->nm_lmsg, 0);
+       ifnet_domsg(&vmsg.base.lmsg, 0);
 }
 
 static void
-vlan_config_dispatch(struct netmsg *nmsg)
+vlan_config_dispatch(netmsg_t msg)
 {
-       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)nmsg;
+       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)msg;
        struct ifvlan *ifv;
        struct ifnet *ifp_p, *ifp;
        struct sockaddr_dl *sdl1, *sdl2;
@@ -702,33 +696,31 @@ vlan_config_dispatch(struct netmsg *nmsg)
        ifv->ifv_p = ifp_p;
        error = 0;
 reply:
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       lwkt_replymsg(&vmsg->base.lmsg, error);
 }
 
 static int
 vlan_config(struct ifvlan *ifv, const char *parent_name, uint16_t vlantag)
 {
        struct netmsg_vlan vmsg;
-       struct netmsg *nmsg;
 
        ASSERT_IFNET_NOT_SERIALIZED_ALL(&ifv->ifv_if);
 
        bzero(&vmsg, sizeof(vmsg));
-       nmsg = &vmsg.nv_nmsg;
 
-       netmsg_init(nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&vmsg.base, NULL, &curthread->td_msgport,
                    0, vlan_config_dispatch);
        vmsg.nv_ifv = ifv;
        vmsg.nv_parent_name = parent_name;
        vmsg.nv_vlantag = vlantag;
 
-       return lwkt_domsg(cpu_portfn(0), &nmsg->nm_lmsg, 0);
+       return lwkt_domsg(cpu_portfn(0), &vmsg.base.lmsg, 0);
 }
 
 static void
-vlan_unlink_dispatch(struct netmsg *nmsg)
+vlan_unlink_dispatch(netmsg_t msg)
 {
-       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)nmsg;
+       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)msg;
        struct ifvlan *ifv = vmsg->nv_ifv;
        struct vlan_entry *entry;
        int cpu = mycpuid;
@@ -741,7 +733,7 @@ vlan_unlink_dispatch(struct netmsg *nmsg)
        LIST_REMOVE(entry, ifv_link);
        crit_exit();
 
-       ifnet_forwardmsg(&nmsg->nm_lmsg, cpu + 1);
+       ifnet_forwardmsg(&vmsg->base.lmsg, cpu + 1);
 }
 
 static void
@@ -749,7 +741,6 @@ vlan_unlink(struct ifvlan *ifv, struct ifnet *ifp_p)
 {
        struct vlan_trunk *vlantrunks = ifp_p->if_vlantrunks;
        struct netmsg_vlan vmsg;
-       struct netmsg *nmsg;
 
        /* Assert in netisr0 */
        ASSERT_IFNET_NOT_SERIALIZED_ALL(&ifv->ifv_if);
@@ -758,14 +749,13 @@ vlan_unlink(struct ifvlan *ifv, struct ifnet *ifp_p)
                ("vlan trunk has not been initialized yet\n"));
 
        bzero(&vmsg, sizeof(vmsg));
-       nmsg = &vmsg.nv_nmsg;
 
-       netmsg_init(nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&vmsg.base, NULL, &curthread->td_msgport,
                    0, vlan_unlink_dispatch);
        vmsg.nv_ifv = ifv;
        vmsg.nv_ifp_p = ifp_p;
 
-       ifnet_domsg(&nmsg->nm_lmsg, 0);
+       ifnet_domsg(&vmsg.base.lmsg, 0);
 
        crit_enter();
        if (LIST_EMPTY(&vlantrunks[mycpuid].vlan_list)) {
@@ -781,9 +771,9 @@ vlan_unlink(struct ifvlan *ifv, struct ifnet *ifp_p)
 }
 
 static void
-vlan_unconfig_dispatch(struct netmsg *nmsg)
+vlan_unconfig_dispatch(netmsg_t msg)
 {
-       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)nmsg;
+       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)msg;
        struct sockaddr_dl *sdl;
        struct ifvlan *ifv;
        struct ifnet *ifp_p, *ifp;
@@ -846,25 +836,23 @@ vlan_unconfig_dispatch(struct netmsg *nmsg)
                vlan_unlink(ifv, ifp_p);
 
        error = 0;
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       lwkt_replymsg(&vmsg->base.lmsg, error);
 }
 
 static int
 vlan_unconfig(struct ifvlan *ifv)
 {
        struct netmsg_vlan vmsg;
-       struct netmsg *nmsg;
 
        ASSERT_IFNET_NOT_SERIALIZED_ALL(&ifv->ifv_if);
 
        bzero(&vmsg, sizeof(vmsg));
-       nmsg = &vmsg.nv_nmsg;
 
-       netmsg_init(nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&vmsg.base, NULL, &curthread->td_msgport,
                    0, vlan_unconfig_dispatch);
        vmsg.nv_ifv = ifv;
 
-       return lwkt_domsg(cpu_portfn(0), &nmsg->nm_lmsg, 0);
+       return lwkt_domsg(cpu_portfn(0), &vmsg.base.lmsg, 0);
 }
 
 static int
@@ -978,9 +966,9 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
 }
 
 static void
-vlan_multi_dispatch(struct netmsg *nmsg)
+vlan_multi_dispatch(netmsg_t msg)
 {
-       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)nmsg;
+       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)msg;
        struct ifvlan *ifv = vmsg->nv_ifv;
        int error = 0;
 
@@ -990,31 +978,29 @@ vlan_multi_dispatch(struct netmsg *nmsg)
         */
        if (ifv->ifv_p != NULL)
                error = vlan_setmulti(ifv, ifv->ifv_p);
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       lwkt_replymsg(&vmsg->base.lmsg, error);
 }
 
 static int
 vlan_config_multi(struct ifvlan *ifv)
 {
        struct netmsg_vlan vmsg;
-       struct netmsg *nmsg;
 
        ASSERT_IFNET_NOT_SERIALIZED_ALL(&ifv->ifv_if);
 
        bzero(&vmsg, sizeof(vmsg));
-       nmsg = &vmsg.nv_nmsg;
 
-       netmsg_init(nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&vmsg.base, NULL, &curthread->td_msgport,
                    0, vlan_multi_dispatch);
        vmsg.nv_ifv = ifv;
 
-       return lwkt_domsg(cpu_portfn(0), &nmsg->nm_lmsg, 0);
+       return lwkt_domsg(cpu_portfn(0), &vmsg.base.lmsg, 0);
 }
 
 static void
-vlan_flags_dispatch(struct netmsg *nmsg)
+vlan_flags_dispatch(netmsg_t msg)
 {
-       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)nmsg;
+       struct netmsg_vlan *vmsg = (struct netmsg_vlan *)msg;
        struct ifvlan *ifv = vmsg->nv_ifv;
        int error = 0;
 
@@ -1024,23 +1010,21 @@ vlan_flags_dispatch(struct netmsg *nmsg)
         */
        if (ifv->ifv_p != NULL)
                error = vlan_setflags(ifv, ifv->ifv_p, 1);
-       lwkt_replymsg(&nmsg->nm_lmsg, error);
+       lwkt_replymsg(&vmsg->base.lmsg, error);
 }
 
 static int
 vlan_config_flags(struct ifvlan *ifv)
 {
        struct netmsg_vlan vmsg;
-       struct netmsg *nmsg;
 
        ASSERT_IFNET_NOT_SERIALIZED_ALL(&ifv->ifv_if);
 
        bzero(&vmsg, sizeof(vmsg));
-       nmsg = &vmsg.nv_nmsg;
 
-       netmsg_init(nmsg, NULL, &curthread->td_msgport,
+       netmsg_init(&vmsg.base, NULL, &curthread->td_msgport,
                    0, vlan_flags_dispatch);
        vmsg.nv_ifv = ifv;
 
-       return lwkt_domsg(cpu_portfn(0), &nmsg->nm_lmsg, 0);
+       return lwkt_domsg(cpu_portfn(0), &vmsg.base.lmsg, 0);
 }
index bac789d..1e82042 100644 (file)
 #include <net/vlan/if_vlan_ether.h>
 
 void
-vlan_start_dispatch(struct netmsg *nmsg)
+vlan_start_dispatch(netmsg_t msg)
 {
-       struct netmsg_packet *nmp = (struct netmsg_packet *)nmsg;
+       struct netmsg_packet *nmp = &msg->packet;
        struct mbuf *m;
        struct ifnet *ifp;
        struct altq_pktattr pktattr;
 
        m = nmp->nm_packet;
-       ifp = nmsg->nm_lmsg.u.ms_resultp;
+       ifp = msg->lmsg.u.ms_resultp;
 
        M_ASSERTPKTHDR(m);
        KASSERT(m->m_flags & M_VLANTAG, ("mbuf has not been vlan tagged!\n"));
index 13d1860..dcf5a60 100644 (file)
 
 #ifdef _KERNEL
 
-struct netmsg;
+union netmsg;
 struct bpf_if;
 struct mbuf;
 
-void   vlan_start_dispatch(struct netmsg *);
+void   vlan_start_dispatch(union netmsg *);
 void   vlan_ether_ptap(struct bpf_if *, struct mbuf *, uint16_t);
 void   vlan_ether_decap(struct mbuf **);
 
index 92ce6f5..3e580b0 100644 (file)
@@ -29,7 +29,7 @@
 #include <netbt/hci.h>
 
 void
-btintr(struct netmsg *msg)
+btintr(netmsg_t msg)
 {
        struct hci_unit *unit;
 
index 2ccfca5..9aede9a 100644 (file)
@@ -77,7 +77,6 @@ struct protosw btsw[] = {
                .pr_output = 0,
                .pr_ctlinput = 0,
                .pr_ctloutput = hci_ctloutput,
-               .pr_mport = cpu0_soport,
                .pr_ctlport = NULL,
                .pr_init = 0,
                .pr_fasttimo =  0,
@@ -94,7 +93,6 @@ struct protosw btsw[] = {
                .pr_output = 0,
                .pr_ctlinput = 0,
                .pr_ctloutput = sco_ctloutput,
-               .pr_mport = cpu0_soport,
                .pr_ctlport = NULL,
                .pr_init = 0,
                .pr_fasttimo =  0,
@@ -112,7 +110,6 @@ struct protosw btsw[] = {
                .pr_output = 0,
                .pr_ctlinput = 0,
                .pr_ctloutput = l2cap_ctloutput,
-               .pr_mport = cpu0_soport,
    &nbs