From 9eeaa8a9b2a1c684975b92b00ce4f3ee6107ddcc Mon Sep 17 00:00:00 2001 From: Jeffrey Hsu Date: Sat, 6 Mar 2004 01:59:52 +0000 Subject: [PATCH] Dispatch upper-half protocol request handling. --- sys/bus/usb/usb_ethersubr.c | 7 +- sys/conf/files | 3 +- sys/kern/kern_poll.c | 11 +- sys/kern/lwkt_msgport.c | 5 +- sys/kern/uipc_msg.c | 658 ++++++++++++++++++++++++++++++++ sys/kern/uipc_proto.c | 8 +- sys/kern/uipc_socket2.c | 3 +- sys/net/dummynet/ip_dummynet.c | 10 +- sys/net/gre/if_gre.c | 6 +- sys/net/netisr.c | 53 +-- sys/net/netisr.h | 72 +++- sys/net/ppp/if_ppp.c | 7 +- sys/net/rtsock.c | 4 +- sys/netgraph/netgraph/ng_base.c | 7 +- sys/netgraph/socket/ng_socket.c | 8 +- sys/netinet/if_ether.c | 7 +- sys/netinet/in_gif.c | 4 +- sys/netinet/in_proto.c | 48 +-- sys/netinet/in_var.h | 6 +- sys/netinet/ip_demux.c | 122 ++++-- sys/netinet/ip_divert.c | 8 +- sys/netinet/ip_input.c | 5 +- sys/netinet/ip_output.c | 7 +- sys/netinet/tcp_var.h | 4 +- sys/netinet/udp_var.h | 18 +- sys/netinet6/in6_gif.c | 4 +- sys/netinet6/in6_proto.c | 38 +- sys/netinet6/ip6_input.c | 6 +- sys/netinet6/ip6_var.h | 5 +- sys/netinet6/ip6protosw.h | 9 +- sys/netproto/atalk/aarp.c | 7 +- sys/netproto/atalk/at_extern.h | 9 +- sys/netproto/atalk/at_proto.c | 5 +- sys/netproto/atalk/ddp_input.c | 9 +- sys/netproto/atm/atm_proto.c | 4 +- sys/netproto/atm/atm_subr.c | 7 +- sys/netproto/atm/atm_usrreq.c | 3 +- sys/netproto/ipsec/keysock.c | 4 +- sys/netproto/ipsec/xform_ipip.c | 6 +- sys/netproto/ipx/ipx_input.c | 7 +- sys/netproto/ipx/ipx_proto.c | 14 +- sys/netproto/key/keysock.c | 4 +- sys/netproto/natm/natm.c | 9 +- sys/netproto/natm/natm_proto.c | 8 +- sys/netproto/ns/ns_input.c | 7 +- sys/sys/msgport.h | 8 +- sys/sys/protosw.h | 53 ++- sys/sys/socketops.h | 39 +- 48 files changed, 1129 insertions(+), 227 deletions(-) create mode 100644 sys/kern/uipc_msg.c diff --git a/sys/bus/usb/usb_ethersubr.c b/sys/bus/usb/usb_ethersubr.c index f2f5f15bcd..366004c699 100644 --- a/sys/bus/usb/usb_ethersubr.c +++ b/sys/bus/usb/usb_ethersubr.c @@ -31,7 +31,7 @@ * * * $FreeBSD: src/sys/dev/usb/usb_ethersubr.c,v 1.17 2003/11/14 11:09:45 johan Exp $ - * $DragonFly: src/sys/bus/usb/usb_ethersubr.c,v 1.6 2003/12/30 01:01:44 dillon Exp $ + * $DragonFly: src/sys/bus/usb/usb_ethersubr.c,v 1.7 2004/03/06 01:58:54 hsu Exp $ */ /* @@ -73,10 +73,9 @@ Static struct ifqueue usbq_rx; Static struct ifqueue usbq_tx; Static int mtx_inited = 0; -Static void usbintr(struct mbuf *m); - -Static void usbintr(struct mbuf *m) /* dummy mbuf */ +Static void usbintr(struct netmsg *msg) { + struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet; struct ether_header *eh; struct usb_qdat *q; struct ifnet *ifp; diff --git a/sys/conf/files b/sys/conf/files index c4b4b791e4..71b7ac90b4 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1,5 +1,5 @@ # $FreeBSD: src/sys/conf/files,v 1.340.2.137 2003/06/04 17:10:30 sam Exp $ -# $DragonFly: src/sys/conf/files,v 1.54 2004/02/27 11:56:12 joerg Exp $ +# $DragonFly: src/sys/conf/files,v 1.55 2004/03/06 01:58:54 hsu Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -693,6 +693,7 @@ kern/uipc_accf.c optional inet kern/uipc_domain.c standard kern/uipc_mbuf.c standard kern/uipc_mbuf2.c standard +kern/uipc_msg.c standard kern/uipc_proto.c standard kern/uipc_socket.c standard kern/uipc_socket2.c standard diff --git a/sys/kern/kern_poll.c b/sys/kern/kern_poll.c index aaad339a84..2dd0c55f50 100644 --- a/sys/kern/kern_poll.c +++ b/sys/kern/kern_poll.c @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/kern/kern_poll.c,v 1.2.2.4 2002/06/27 23:26:33 luigi Exp $ - * $DragonFly: src/sys/kern/kern_poll.c,v 1.7 2004/01/30 05:42:17 dillon Exp $ + * $DragonFly: src/sys/kern/kern_poll.c,v 1.8 2004/03/06 01:58:54 hsu Exp $ */ #include @@ -45,8 +45,9 @@ #endif #endif -static void netisr_poll(struct mbuf *); /* the two netisr handlers */ -static void netisr_pollmore(struct mbuf *); +/* the two netisr handlers */ +static void netisr_poll(struct netmsg *); +static void netisr_pollmore(struct netmsg *); void init_device_poll(void); /* init routine */ void hardclock_device_poll(void); /* hook from hardclock */ @@ -299,7 +300,7 @@ static struct timeval poll_start_t; /* ARGSUSED */ static void -netisr_pollmore(struct mbuf *dummy __unused) +netisr_pollmore(struct netmsg *dummy __unused) { struct timeval t; int kern_load; @@ -350,7 +351,7 @@ netisr_pollmore(struct mbuf *dummy __unused) */ /* ARGSUSED */ static void -netisr_poll(struct mbuf *dummy __unused) +netisr_poll(struct netmsg *dummy __unused) { static int reg_frac_count; int i, cycles; diff --git a/sys/kern/lwkt_msgport.c b/sys/kern/lwkt_msgport.c index 3299ffb955..66e52e34da 100644 --- a/sys/kern/lwkt_msgport.c +++ b/sys/kern/lwkt_msgport.c @@ -26,7 +26,7 @@ * NOTE! This file may be compiled for userland libraries as well as for * the kernel. * - * $DragonFly: src/sys/kern/lwkt_msgport.c,v 1.14 2004/02/12 06:57:48 dillon Exp $ + * $DragonFly: src/sys/kern/lwkt_msgport.c,v 1.15 2004/03/06 01:58:54 hsu Exp $ */ #ifdef _KERNEL @@ -61,6 +61,9 @@ #include #endif +#include +MALLOC_DEFINE(M_LWKTMSG, "lwkt message", "lwkt message"); + #else #include diff --git a/sys/kern/uipc_msg.c b/sys/kern/uipc_msg.c new file mode 100644 index 0000000000..183936cde5 --- /dev/null +++ b/sys/kern/uipc_msg.c @@ -0,0 +1,658 @@ +/* + * Copyright (c) 2003, 2004 Jeffrey Hsu. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Jeffrey M. Hsu. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $DragonFly: src/sys/kern/uipc_msg.c,v 1.1 2004/03/06 01:59:52 hsu Exp $ + */ + +#if defined(SMP) || defined(ALWAYS_MSG) + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +static void netmsg_pru_dispatcher(struct netmsg *msg); + +int +so_pru_abort(struct socket *so) +{ + int error; + struct netmsg_pru_abort msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_abort)(so)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_ABORT); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_abort; + msg.nm_so = so; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_accept(struct socket *so, struct sockaddr **nam) +{ + int error; + struct netmsg_pru_accept msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_accept)(so, nam)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_ACCEPT); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_accept; + msg.nm_so = so; + msg.nm_nam = nam; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_attach(struct socket *so, int proto, struct pru_attach_info *ai) +{ + int error; + struct netmsg_pru_attach msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_attach)(so, proto, ai)); + + port = so->so_proto->pr_mport(NULL, NULL); + + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_ATTACH); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_attach; + msg.nm_so = so; + msg.nm_proto = proto; + msg.nm_ai = ai; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_bind(struct socket *so, struct sockaddr *nam, struct thread *td) +{ + int error; + struct netmsg_pru_bind msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_bind)(so, nam, td)); + + /* Send mesg to thread for new address. */ + port = so->so_proto->pr_mport(NULL, nam); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_BIND); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_bind; + msg.nm_so = so; + msg.nm_nam = nam; + msg.nm_td = td; /* used only for prison_ip() XXX JH */ + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_connect(struct socket *so, struct sockaddr *nam, struct thread *td) +{ + int error; + struct netmsg_pru_connect msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_connect)(so, nam, td)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_CONNECT); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_connect; + msg.nm_so = so; + msg.nm_nam = nam; + msg.nm_td = td; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_connect2(struct socket *so1, struct socket *so2) +{ + int error; + struct netmsg_pru_connect2 msg; + lwkt_port_t port; + + if (!so1->so_proto->pr_mport) + return ((*so1->so_proto->pr_usrreqs->pru_connect2)(so1, so2)); + + /* + * Actually, connect2() is only called for Unix domain sockets + * and we currently short-circuit that above, so the following + * code is never reached. + */ + panic("connect2 on socket type %d", so1->so_type); + port = so1->so_proto->pr_mport(so1, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_CONNECT2); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so1->so_proto->pr_usrreqs->pru_connect2; + msg.nm_so1 = so1; + msg.nm_so2 = so2; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, + struct thread *td) +{ + int error; + struct netmsg_pru_control msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_control)(so, cmd, data, + ifp, td)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_CONTROL); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_control; + msg.nm_so = so; + msg.nm_cmd = cmd; + msg.nm_data = data; + msg.nm_ifp = ifp; + msg.nm_td = td; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_detach(struct socket *so) +{ + int error; + struct netmsg_pru_detach msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_detach)(so)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_DETACH); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_detach; + msg.nm_so = so; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_disconnect(struct socket *so) +{ + int error; + struct netmsg_pru_disconnect msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_disconnect)(so)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_DISCONNECT); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_disconnect; + msg.nm_so = so; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_listen(struct socket *so, struct thread *td) +{ + int error; + struct netmsg_pru_listen msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_listen)(so, td)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_LISTEN); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_listen; + msg.nm_so = so; + msg.nm_td = td; /* used only for prison_ip() XXX JH */ + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_peeraddr(struct socket *so, struct sockaddr **nam) +{ + int error; + struct netmsg_pru_peeraddr msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_peeraddr)(so, nam)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_PEERADDR); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_peeraddr; + msg.nm_so = so; + msg.nm_nam = nam; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_rcvd(struct socket *so, int flags) +{ + int error; + struct netmsg_pru_rcvd msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_rcvd)(so, flags)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_RCVD); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_rcvd; + msg.nm_so = so; + msg.nm_flags = flags; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_rcvoob(struct socket *so, struct mbuf *m, int flags) +{ + int error; + struct netmsg_pru_rcvoob msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_rcvoob)(so, m, flags)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_RCVOOB); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_rcvoob; + msg.nm_so = so; + msg.nm_m = m; + msg.nm_flags = flags; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +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; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_send)(so, flags, m, + addr, control, td)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_SEND); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_send; + msg.nm_so = so; + 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_lmsg); + return (error); +} + +int +so_pru_sense(struct socket *so, struct stat *sb) +{ + int error; + struct netmsg_pru_sense msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_sense)(so, sb)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_SENSE); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_sense; + msg.nm_so = so; + msg.nm_stat = sb; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_shutdown(struct socket *so) +{ + int error; + struct netmsg_pru_shutdown msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_shutdown)(so)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_SHUTDOWN); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_shutdown; + msg.nm_so = so; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_sockaddr(struct socket *so, struct sockaddr **nam) +{ + int error; + struct netmsg_pru_sockaddr msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_sockaddr)(so, nam)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_SOCKADDR); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_sockaddr; + msg.nm_so = so; + msg.nm_nam = nam; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pru_sopoll(struct socket *so, int events, struct ucred *cred, + struct thread *td) +{ + int error; + struct netmsg_pru_sopoll msg; + lwkt_port_t port; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_usrreqs->pru_sopoll)(so, events, + cred, td)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PRU_SOPOLL); + msg.nm_handler = netmsg_pru_dispatcher; + msg.nm_prufn = so->so_proto->pr_usrreqs->pru_sopoll; + msg.nm_so = so; + msg.nm_events = events; + msg.nm_cred = cred; + msg.nm_td = td; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +} + +int +so_pr_ctloutput(struct socket *so, struct sockopt *sopt) +{ + return ((*so->so_proto->pr_ctloutput)(so, sopt)); +#ifdef gag /* does copyin and copyout deep inside stack XXX JH */ + struct netmsg_pr_ctloutput msg; + lwkt_port_t port; + int error; + + if (!so->so_proto->pr_mport) + return ((*so->so_proto->pr_ctloutput)(so, sopt)); + + port = so->so_proto->pr_mport(so, NULL); + lwkt_initmsg(&msg.nm_lmsg, port, CMD_NETMSG_PR_CTLOUTPUT); + msg.nm_handler = netmsg_pr_dispatcher; + msg.nm_prfn = so->so_proto->pr_ctloutput; + msg.nm_so = so; + msg.nm_sopt = sopt; + error = lwkt_domsg(port, &msg.nm_lmsg); + return (error); +#endif +} + +/* + * If we convert all the pru_usrreq functions for all the protocols + * to take a message directly, this layer can go away. + */ +static void +netmsg_pru_dispatcher(struct netmsg *msg) +{ + int error; + + switch (msg->nm_lmsg.ms_cmd) { + case CMD_NETMSG_PRU_ABORT: + { + struct netmsg_pru_abort *nm = (struct netmsg_pru_abort *)msg; + + error = nm->nm_prufn(nm->nm_so); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_ACCEPT: + { + struct netmsg_pru_accept *nm = (struct netmsg_pru_accept *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_nam); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_ATTACH: + { + struct netmsg_pru_attach *nm = (struct netmsg_pru_attach *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_proto, nm->nm_ai); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_BIND: + { + struct netmsg_pru_bind *nm = (struct netmsg_pru_bind *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_nam, nm->nm_td); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_CONNECT: + { + struct netmsg_pru_connect *nm = + (struct netmsg_pru_connect *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_nam, nm->nm_td); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_CONNECT2: + { + struct netmsg_pru_connect2 *nm = + (struct netmsg_pru_connect2 *)msg; + + error = nm->nm_prufn(nm->nm_so1, nm->nm_so2); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_CONTROL: + { + struct netmsg_pru_control *nm = + (struct netmsg_pru_control *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_cmd, nm->nm_data, + nm->nm_ifp, nm->nm_td); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_DETACH: + { + struct netmsg_pru_detach *nm = (struct netmsg_pru_detach *)msg; + + error = nm->nm_prufn(nm->nm_so); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_DISCONNECT: + { + struct netmsg_pru_disconnect *nm = + (struct netmsg_pru_disconnect *)msg; + + error = nm->nm_prufn(nm->nm_so); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_LISTEN: + { + struct netmsg_pru_listen *nm = (struct netmsg_pru_listen *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_td); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_PEERADDR: + { + struct netmsg_pru_peeraddr *nm = + (struct netmsg_pru_peeraddr *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_nam); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_RCVD: + { + struct netmsg_pru_rcvd *nm = (struct netmsg_pru_rcvd *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_flags); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_RCVOOB: + { + struct netmsg_pru_rcvoob *nm = (struct netmsg_pru_rcvoob *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_m, nm->nm_flags); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_SEND: + { + struct netmsg_pru_send *nm = (struct netmsg_pru_send *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_flags, nm->nm_m, + nm->nm_addr, nm->nm_control, nm->nm_td); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_SENSE: + { + struct netmsg_pru_sense *nm = (struct netmsg_pru_sense *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_stat); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_SHUTDOWN: + { + struct netmsg_pru_shutdown *nm = + (struct netmsg_pru_shutdown *)msg; + + error = nm->nm_prufn(nm->nm_so); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_SOCKADDR: + { + struct netmsg_pru_sockaddr *nm = + (struct netmsg_pru_sockaddr *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_nam); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PRU_SOPOLL: + { + struct netmsg_pru_sopoll *nm = + (struct netmsg_pru_sopoll *)msg; + + error = nm->nm_prufn(nm->nm_so, nm->nm_events, nm->nm_cred, + nm->nm_td); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + default: + panic("unknown netmsg %d", msg->nm_lmsg.ms_cmd); + break; + } +} + +/* + * If we convert all the protosw pr_ functions for all the protocols + * to take a message directly, this layer can go away. + */ +void +netmsg_pr_dispatcher(struct netmsg *msg) +{ + switch (msg->nm_lmsg.ms_cmd) { + case CMD_NETMSG_PR_CTLOUTPUT: + { + struct netmsg_pr_ctloutput *nm = + (struct netmsg_pr_ctloutput *)msg; + int error; + + error = nm->nm_prfn(nm->nm_so, nm->nm_sopt); + lwkt_replymsg(&msg->nm_lmsg, error); + break; + } + case CMD_NETMSG_PR_TIMEOUT: + { + struct netmsg_pr_timeout *nm = (struct netmsg_pr_timeout *)msg; + + nm->nm_prfn(); + break; + } + default: + panic("unknown netmsg %d", msg->nm_lmsg.ms_cmd); + break; + } +} + +#endif diff --git a/sys/kern/uipc_proto.c b/sys/kern/uipc_proto.c index b5869ff61f..89089cdb4e 100644 --- a/sys/kern/uipc_proto.c +++ b/sys/kern/uipc_proto.c @@ -32,7 +32,7 @@ * * @(#)uipc_proto.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/kern/uipc_proto.c,v 1.21.2.1 2002/03/09 05:22:23 dd Exp $ - * $DragonFly: src/sys/kern/uipc_proto.c,v 1.2 2003/06/17 04:28:41 dillon Exp $ + * $DragonFly: src/sys/kern/uipc_proto.c,v 1.3 2004/03/06 01:58:54 hsu Exp $ */ #include @@ -53,19 +53,19 @@ static struct protosw localsw[] = { { SOCK_STREAM, &localdomain, 0, PR_CONNREQUIRED|PR_WANTRCVD|PR_RIGHTS, 0, 0, 0, &uipc_ctloutput, - 0, + NULL, 0, 0, 0, 0, &uipc_usrreqs }, { SOCK_DGRAM, &localdomain, 0, PR_ATOMIC|PR_ADDR|PR_RIGHTS, 0, 0, 0, 0, - 0, + NULL, 0, 0, 0, 0, &uipc_usrreqs }, { 0, 0, 0, 0, 0, 0, raw_ctlinput, 0, - 0, + NULL, raw_init, 0, 0, 0, &raw_usrreqs } diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c index 47708f7c23..5899544092 100644 --- a/sys/kern/uipc_socket2.c +++ b/sys/kern/uipc_socket2.c @@ -32,7 +32,7 @@ * * @(#)uipc_socket2.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/kern/uipc_socket2.c,v 1.55.2.17 2002/08/31 19:04:55 dwmalone Exp $ - * $DragonFly: src/sys/kern/uipc_socket2.c,v 1.7 2004/03/05 16:57:15 hsu Exp $ + * $DragonFly: src/sys/kern/uipc_socket2.c,v 1.8 2004/03/06 01:58:54 hsu Exp $ */ #include "opt_param.h" @@ -195,6 +195,7 @@ sonewconn(struct socket *head, int connstatus) ai.p_ucred = NULL; ai.fd_rdir = NULL; /* jail code cruft XXX JH */ if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat, NULL) || + /* Directly call function since we're already at protocol level. */ (*so->so_proto->pr_usrreqs->pru_attach)(so, 0, &ai)) { sodealloc(so); return ((struct socket *)0); diff --git a/sys/net/dummynet/ip_dummynet.c b/sys/net/dummynet/ip_dummynet.c index 458210b950..d4d03f6510 100644 --- a/sys/net/dummynet/ip_dummynet.c +++ b/sys/net/dummynet/ip_dummynet.c @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/netinet/ip_dummynet.c,v 1.24.2.22 2003/05/13 09:31:06 maxim Exp $ - * $DragonFly: src/sys/net/dummynet/ip_dummynet.c,v 1.5 2004/02/13 17:45:49 joerg Exp $ + * $DragonFly: src/sys/net/dummynet/ip_dummynet.c,v 1.6 2004/03/06 01:58:55 hsu Exp $ */ #if !defined(KLD_MODULE) @@ -80,6 +80,7 @@ #include #include #include +#include #include "ip_dummynet.h" #include @@ -432,8 +433,13 @@ transmit_event(struct dn_pipe *pipe) break ; case DN_TO_IP_IN : - ip_input((struct mbuf *)pkt) ; + { + struct netmsg_packet msg; + + msg.nm_packet = (struct mbuf *)&pkt; + ip_input((struct netmsg *)&msg) ; break ; + } case DN_TO_BDG_FWD : if (!BDG_LOADED) { diff --git a/sys/net/gre/if_gre.c b/sys/net/gre/if_gre.c index 37a1b6d88a..3fd937bcca 100644 --- a/sys/net/gre/if_gre.c +++ b/sys/net/gre/if_gre.c @@ -1,6 +1,6 @@ /* $NetBSD: if_gre.c,v 1.42 2002/08/14 00:23:27 itojun Exp $ */ /* $FreeBSD: src/sys/net/if_gre.c,v 1.9.2.3 2003/01/23 21:06:44 sam Exp $ */ -/* $DragonFly: src/sys/net/gre/if_gre.c,v 1.7 2004/01/06 01:40:51 dillon Exp $ */ +/* $DragonFly: src/sys/net/gre/if_gre.c,v 1.8 2004/03/06 01:58:55 hsu Exp $ */ /* * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -116,14 +116,14 @@ 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, - 0, + cpu0_soport, 0, 0, 0, 0, &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, - 0, + cpu0_soport, 0, 0, 0, 0, &rip_usrreqs }; diff --git a/sys/net/netisr.c b/sys/net/netisr.c index 38568a3854..e0e7a179b1 100644 --- a/sys/net/netisr.c +++ b/sys/net/netisr.c @@ -3,12 +3,13 @@ * Copyright (c) 2003 Jonathan Lemon * Copyright (c) 2003 Matthew Dillon * - * $DragonFly: src/sys/net/netisr.c,v 1.7 2003/11/23 00:28:01 dillon Exp $ + * $DragonFly: src/sys/net/netisr.c,v 1.8 2004/03/06 01:58:54 hsu Exp $ */ #include #include #include +#include #include #include #include @@ -21,15 +22,6 @@ #include #include -struct netmsg { - struct lwkt_msg nm_lmsg; - struct mbuf *nm_packet; - netisr_fn_t nm_handler; -}; - -#define CMD_NETMSG_NEWPKT (MSG_CMD_NETMSG | 0x0001) -#define CMD_NETMSG_POLL (MSG_CMD_NETMSG | 0x0002) - static struct netisr netisrs[NETISR_MAX]; /* Per-CPU thread to handle any protocol. */ @@ -54,18 +46,9 @@ netmsg_service_loop(void *arg) struct netmsg *msg; while ((msg = lwkt_waitport(&curthread->td_msgport, NULL))) { - struct mbuf *m = msg->nm_packet; - netisr_fn_t handler = msg->nm_handler; - - if (handler) { - handler(m); - } else if (m) { - while (m->m_type == MT_TAG) - m = m->m_next; - KKASSERT(m != NULL); - m_freem(m); - } - free(msg, M_TEMP); + msg->nm_handler(msg); + if (msg->nm_lmsg.ms_flags & MSGF_ASYNC) + free(msg, M_LWKTMSG); } } @@ -89,7 +72,7 @@ int netisr_queue(int num, struct mbuf *m) { struct netisr *ni; - struct netmsg *pmsg; + struct netmsg_packet *pmsg; lwkt_port_t port; KASSERT((num > 0 && num <= (sizeof(netisrs)/sizeof(netisrs[0]))), @@ -98,15 +81,15 @@ netisr_queue(int num, struct mbuf *m) ni = &netisrs[num]; if (ni->ni_handler == NULL) { printf("netisr_queue: unregistered isr %d\n", num); - return EIO; + return (EIO); } - /* use better message allocation system with limits later XXX JH */ - if (!(pmsg = malloc(sizeof(struct netmsg), M_TEMP, M_NOWAIT))) - return ENOBUFS; - if (!(port = ni->ni_mport(m))) - return EIO; + return (EIO); + + /* use better message allocation system with limits later XXX JH */ + if (!(pmsg = malloc(sizeof(struct netmsg_packet), M_LWKTMSG, M_NOWAIT))) + return (ENOBUFS); lwkt_initmsg(&pmsg->nm_lmsg, port, CMD_NETMSG_NEWPKT); pmsg->nm_packet = m; @@ -144,10 +127,16 @@ cpu0_portfn(struct mbuf *m) return (&netisr_cpu[0].td_msgport); } +/* ARGSUSED */ +lwkt_port_t +cpu0_soport(struct socket *so __unused, struct sockaddr *nam __unused) +{ + return (&netisr_cpu[0].td_msgport); +} + /* * This function is used to call the netisr handler from the appropriate - * netisr thread for polling and other purposes. pmsg->nm_packet will be - * undefined. At the moment operation is restricted to non-packet ISRs only. + * netisr thread for polling and other purposes. */ void schednetisr(int num) @@ -159,7 +148,7 @@ schednetisr(int num) KASSERT((num > 0 && num <= (sizeof(netisrs)/sizeof(netisrs[0]))), ("schednetisr: bad isr %d", num)); - if (!(pmsg = malloc(sizeof(struct netmsg), M_TEMP, M_NOWAIT))) + if (!(pmsg = malloc(sizeof(struct netmsg), M_LWKTMSG, M_NOWAIT))) return; lwkt_initmsg(&pmsg->nm_lmsg, port, CMD_NETMSG_POLL); diff --git a/sys/net/netisr.h b/sys/net/netisr.h index 89ceb6a980..8d6135b140 100644 --- a/sys/net/netisr.h +++ b/sys/net/netisr.h @@ -32,7 +32,7 @@ * * @(#)netisr.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/net/netisr.h,v 1.21.2.5 2002/02/09 23:02:39 luigi Exp $ - * $DragonFly: src/sys/net/netisr.h,v 1.7 2003/11/23 20:22:59 dillon Exp $ + * $DragonFly: src/sys/net/netisr.h,v 1.8 2004/03/06 01:58:54 hsu Exp $ */ #ifndef _NET_NETISR_H_ @@ -75,9 +75,73 @@ #ifdef _KERNEL -struct mbuf; +#include + +struct netmsg; + +typedef void (*netisr_fn_t)(struct netmsg *); + +/* + * Base class. All net messages must start with the same fields. + */ +struct netmsg { + struct lwkt_msg nm_lmsg; + netisr_fn_t nm_handler; +}; + +struct netmsg_packet { + struct lwkt_msg nm_lmsg; + netisr_fn_t nm_handler; + struct mbuf *nm_packet; +}; + +struct netmsg_pr_ctloutput { + struct lwkt_msg nm_lmsg; + netisr_fn_t nm_handler; + int (*nm_prfn) (struct socket *, struct sockopt *); + struct socket *nm_so; + struct sockopt *nm_sopt; +}; + +struct netmsg_pr_timeout { + struct lwkt_msg nm_lmsg; + netisr_fn_t nm_handler; + void (*nm_prfn) (void); +}; + +/* + * for dispatching pr_ functions, + * until they can be converted to message-passing + */ +void netmsg_pr_dispatcher(struct netmsg *); + +#define CMD_NETMSG_NEWPKT (MSG_CMD_NETMSG | 0x0001) +#define CMD_NETMSG_POLL (MSG_CMD_NETMSG | 0x0002) + +#define CMD_NETMSG_PRU_ABORT (MSG_CMD_NETMSG | 0x0003) +#define CMD_NETMSG_PRU_ACCEPT (MSG_CMD_NETMSG | 0x0004) +#define CMD_NETMSG_PRU_ATTACH (MSG_CMD_NETMSG | 0x0005) +#define CMD_NETMSG_PRU_BIND (MSG_CMD_NETMSG | 0x0006) +#define CMD_NETMSG_PRU_CONNECT (MSG_CMD_NETMSG | 0x0007) +#define CMD_NETMSG_PRU_CONNECT2 (MSG_CMD_NETMSG | 0x0008) +#define CMD_NETMSG_PRU_CONTROL (MSG_CMD_NETMSG | 0x0009) +#define CMD_NETMSG_PRU_DETACH (MSG_CMD_NETMSG | 0x000a) +#define CMD_NETMSG_PRU_DISCONNECT (MSG_CMD_NETMSG | 0x000b) +#define CMD_NETMSG_PRU_LISTEN (MSG_CMD_NETMSG | 0x000c) +#define CMD_NETMSG_PRU_PEERADDR (MSG_CMD_NETMSG | 0x000d) +#define CMD_NETMSG_PRU_RCVD (MSG_CMD_NETMSG | 0x000e) +#define CMD_NETMSG_PRU_RCVOOB (MSG_CMD_NETMSG | 0x000f) +#define CMD_NETMSG_PRU_SEND (MSG_CMD_NETMSG | 0x0010) +#define CMD_NETMSG_PRU_SENSE (MSG_CMD_NETMSG | 0x0011) +#define CMD_NETMSG_PRU_SHUTDOWN (MSG_CMD_NETMSG | 0x0012) +#define CMD_NETMSG_PRU_SOCKADDR (MSG_CMD_NETMSG | 0x0013) +#define CMD_NETMSG_PRU_SOSEND (MSG_CMD_NETMSG | 0x0014) +#define CMD_NETMSG_PRU_SORECEIVE (MSG_CMD_NETMSG | 0x0015) +#define CMD_NETMSG_PRU_SOPOLL (MSG_CMD_NETMSG | 0x0016) + +#define CMD_NETMSG_PR_CTLOUTPUT (MSG_CMD_NETMSG | 0x0017) +#define CMD_NETMSG_PR_TIMEOUT (MSG_CMD_NETMSG | 0x0018) -typedef void (*netisr_fn_t)(struct mbuf *); typedef lwkt_port_t (*lwkt_portfn_t)(struct mbuf *); struct netisr { @@ -94,6 +158,6 @@ int netisr_unregister(int); void netmsg_service_loop(void *arg); void schednetisr(int); -#endif +#endif /* KERNEL */ #endif /* _NET_NETISR_H_ */ diff --git a/sys/net/ppp/if_ppp.c b/sys/net/ppp/if_ppp.c index ca1d93702b..f8135471b7 100644 --- a/sys/net/ppp/if_ppp.c +++ b/sys/net/ppp/if_ppp.c @@ -70,7 +70,7 @@ */ /* $FreeBSD: src/sys/net/if_ppp.c,v 1.67.2.4 2002/04/14 21:41:48 luigi Exp $ */ -/* $DragonFly: src/sys/net/ppp/if_ppp.c,v 1.11 2004/01/06 03:17:26 dillon Exp $ */ +/* $DragonFly: src/sys/net/ppp/if_ppp.c,v 1.12 2004/03/06 01:58:55 hsu Exp $ */ /* from if_sl.c,v 1.11 84/10/04 12:54:47 rick Exp */ /* from NetBSD: if_ppp.c,v 1.15.2.2 1994/07/28 05:17:58 cgd Exp */ @@ -139,7 +139,7 @@ static void pppattach (void *); PSEUDO_SET(pppattach, if_ppp); static int pppsioctl (struct ifnet *ifp, u_long cmd, caddr_t data); -static void pppintr (struct mbuf *m); +static void pppintr (struct netmsg *msg); static void ppp_requeue (struct ppp_softc *); static void ppp_ccp (struct ppp_softc *, struct mbuf *m, int rcvd); @@ -1057,8 +1057,9 @@ ppp_dequeue(sc) * Software interrupt routine, called at spl[soft]net. */ static void -pppintr(struct mbuf *m) +pppintr(struct netmsg *msg) { + struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet; struct ppp_softc *sc; int i, s; diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 0cbed1a992..13d4fdf845 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -32,7 +32,7 @@ * * @(#)rtsock.c 8.7 (Berkeley) 10/12/95 * $FreeBSD: src/sys/net/rtsock.c,v 1.44.2.11 2002/12/04 14:05:41 ru Exp $ - * $DragonFly: src/sys/net/rtsock.c,v 1.9 2004/03/05 16:57:15 hsu Exp $ + * $DragonFly: src/sys/net/rtsock.c,v 1.10 2004/03/06 01:58:54 hsu Exp $ */ @@ -1060,7 +1060,7 @@ extern 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, - 0, + cpu0_soport, raw_init, 0, 0, 0, &route_usrreqs } diff --git a/sys/netgraph/netgraph/ng_base.c b/sys/netgraph/netgraph/ng_base.c index b2a5599aea..0c0109d189 100644 --- a/sys/netgraph/netgraph/ng_base.c +++ b/sys/netgraph/netgraph/ng_base.c @@ -38,7 +38,7 @@ * Archie Cobbs * * $FreeBSD: src/sys/netgraph/ng_base.c,v 1.11.2.17 2002/07/02 23:44:02 archie Exp $ - * $DragonFly: src/sys/netgraph/netgraph/ng_base.c,v 1.9 2003/11/08 07:57:50 dillon Exp $ + * $DragonFly: src/sys/netgraph/netgraph/ng_base.c,v 1.10 2004/03/06 01:58:55 hsu Exp $ * $Whistle: ng_base.c,v 1.39 1999/01/28 23:54:53 julian Exp $ */ @@ -84,7 +84,7 @@ static int ng_generic_msg(node_p here, struct ng_mesg *msg, const char *retaddr, struct ng_mesg ** resp); static ng_ID_t ng_decodeidname(const char *name); static int ngb_mod_event(module_t mod, int event, void *data); -static void ngintr(struct mbuf *); +static void ngintr(struct netmsg *); /* Our own netgraph malloc type */ MALLOC_DEFINE(M_NETGRAPH, "netgraph", "netgraph structures and ctrl messages"); @@ -1983,8 +1983,9 @@ ng_queue_msg(node_p here, struct ng_mesg *msg, const char *address) * Should be running at splnet. */ static void -ngintr(struct mbuf *m) +ngintr(struct netmsg *pmsg) { + struct mbuf *m = ((struct netmsg_packet *)pmsg)->nm_packet; hook_p hook; struct ng_queue_entry *ngq; meta_p meta; diff --git a/sys/netgraph/socket/ng_socket.c b/sys/netgraph/socket/ng_socket.c index 786e5ffcec..0c269bb283 100644 --- a/sys/netgraph/socket/ng_socket.c +++ b/sys/netgraph/socket/ng_socket.c @@ -37,7 +37,7 @@ * Author: Julian Elischer * * $FreeBSD: src/sys/netgraph/ng_socket.c,v 1.11.2.6 2002/07/02 22:17:18 archie Exp $ - * $DragonFly: src/sys/netgraph/socket/ng_socket.c,v 1.6 2004/03/05 16:57:15 hsu Exp $ + * $DragonFly: src/sys/netgraph/socket/ng_socket.c,v 1.7 2004/03/06 01:58:55 hsu Exp $ * $Whistle: ng_socket.c,v 1.28 1999/11/01 09:24:52 julian Exp $ */ @@ -283,7 +283,7 @@ ngc_connect(struct socket *so, struct sockaddr *nam, struct thread *td) ***************************************************************/ static int -ngd_attach(struct socket *so, int proto, struct thread *td) +ngd_attach(struct socket *so, int proto, struct pru_attach_info *ai) { struct ngpcb *const pcbp = sotongpcb(so); @@ -947,7 +947,7 @@ static struct protosw ngsw[] = { NG_CONTROL, PR_ATOMIC | PR_ADDR /* | PR_RIGHTS */, 0, 0, 0, 0, - NULL, + cpu0_soport, 0, 0, 0, 0, &ngc_usrreqs }, @@ -957,7 +957,7 @@ static struct protosw ngsw[] = { NG_DATA, PR_ATOMIC | PR_ADDR, 0, 0, 0, 0, - NULL, + cpu0_soport, 0, 0, 0, 0, &ngd_usrreqs } diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index 7e38b57936..dc9a7a07f9 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -32,7 +32,7 @@ * * @(#)if_ether.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netinet/if_ether.c,v 1.64.2.23 2003/04/11 07:23:15 fjoe Exp $ - * $DragonFly: src/sys/netinet/if_ether.c,v 1.9 2004/01/06 03:17:27 dillon Exp $ + * $DragonFly: src/sys/netinet/if_ether.c,v 1.10 2004/03/06 01:58:55 hsu Exp $ */ /* @@ -119,7 +119,7 @@ SYSCTL_INT(_net_link_ether_inet, OID_AUTO, proxyall, CTLFLAG_RW, static void arp_rtrequest (int, struct rtentry *, struct rt_addrinfo *); static void arprequest (struct ifnet *, struct in_addr *, struct in_addr *, u_char *); -static void arpintr(struct mbuf *); +static void arpintr(struct netmsg *); static void arptfree (struct llinfo_arp *); static void arptimer (void *); static struct llinfo_arp @@ -492,8 +492,9 @@ arpresolve(ifp, rt, m, dst, desten, rt0) * then the protocol-specific routine is called. */ static void -arpintr(struct mbuf *m) +arpintr(struct netmsg *msg) { + struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet; struct arphdr *ar; u_short ar_hrd; diff --git a/sys/netinet/in_gif.c b/sys/netinet/in_gif.c index 219801fc65..e9b47be919 100644 --- a/sys/netinet/in_gif.c +++ b/sys/netinet/in_gif.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netinet/in_gif.c,v 1.5.2.11 2003/01/23 21:06:45 sam Exp $ */ -/* $DragonFly: src/sys/netinet/in_gif.c,v 1.5 2003/08/23 11:18:00 rob Exp $ */ +/* $DragonFly: src/sys/netinet/in_gif.c,v 1.6 2004/03/06 01:58:55 hsu Exp $ */ /* $KAME: in_gif.c,v 1.54 2001/05/14 14:02:16 itojun Exp $ */ /* @@ -73,7 +73,7 @@ extern struct domain inetdomain; struct protosw in_gif_protosw = { SOCK_RAW, &inetdomain, 0/*IPPROTO_IPV[46]*/, PR_ATOMIC|PR_ADDR, in_gif_input, rip_output, 0, rip_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &rip_usrreqs }; diff --git a/sys/netinet/in_proto.c b/sys/netinet/in_proto.c index 3376084819..bf92069cf6 100644 --- a/sys/netinet/in_proto.c +++ b/sys/netinet/in_proto.c @@ -32,7 +32,7 @@ * * @(#)in_proto.c 8.2 (Berkeley) 2/9/95 * $FreeBSD: src/sys/netinet/in_proto.c,v 1.53.2.7 2003/08/24 08:24:38 hsu Exp $ - * $DragonFly: src/sys/netinet/in_proto.c,v 1.5 2003/08/24 23:07:07 hsu Exp $ + * $DragonFly: src/sys/netinet/in_proto.c,v 1.6 2004/03/06 01:58:55 hsu Exp $ */ #include "opt_ipdivert.h" @@ -96,71 +96,73 @@ #include #endif +#include /* for cpu0_soport */ + extern struct domain inetdomain; static struct pr_usrreqs nousrreqs; struct ipprotosw inetsw[] = { { 0, &inetdomain, 0, 0, 0, 0, 0, 0, - 0, + cpu0_soport, ip_init, 0, ip_slowtimo, ip_drain, &nousrreqs }, { SOCK_DGRAM, &inetdomain, IPPROTO_UDP, PR_ATOMIC|PR_ADDR, udp_input, 0, udp_ctlinput, ip_ctloutput, - 0, + udp_soport, udp_init, 0, 0, 0, &udp_usrreqs }, { SOCK_STREAM, &inetdomain, IPPROTO_TCP, PR_CONNREQUIRED|PR_IMPLOPCL|PR_WANTRCVD, tcp_input, 0, tcp_ctlinput, tcp_ctloutput, - 0, + tcp_soport, tcp_init, 0, tcp_slowtimo, tcp_drain, &tcp_usrreqs }, { SOCK_RAW, &inetdomain, IPPROTO_RAW, PR_ATOMIC|PR_ADDR, rip_input, 0, rip_ctlinput, rip_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &rip_usrreqs }, { SOCK_RAW, &inetdomain, IPPROTO_ICMP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, icmp_input, 0, 0, rip_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &rip_usrreqs }, { SOCK_RAW, &inetdomain, IPPROTO_IGMP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, igmp_input, 0, 0, rip_ctloutput, - 0, + cpu0_soport, igmp_init, igmp_fasttimo, igmp_slowtimo, 0, &rip_usrreqs }, { SOCK_RAW, &inetdomain, IPPROTO_RSVP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, rsvp_input, 0, 0, rip_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &rip_usrreqs }, #ifdef IPSEC { SOCK_RAW, &inetdomain, IPPROTO_AH, PR_ATOMIC|PR_ADDR, ah4_input, 0, 0, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &nousrreqs }, #ifdef IPSEC_ESP { SOCK_RAW, &inetdomain, IPPROTO_ESP, PR_ATOMIC|PR_ADDR, esp4_input, 0, 0, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &nousrreqs }, #endif { SOCK_RAW, &inetdomain, IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR, ipcomp4_input, 0, 0, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &nousrreqs }, @@ -168,45 +170,45 @@ struct ipprotosw inetsw[] = { #ifdef FAST_IPSEC { SOCK_RAW, &inetdomain, IPPROTO_AH, PR_ATOMIC|PR_ADDR, ipsec4_common_input, 0, 0, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &nousrreqs }, { SOCK_RAW, &inetdomain, IPPROTO_ESP, PR_ATOMIC|PR_ADDR, ipsec4_common_input, 0, 0, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &nousrreqs }, { SOCK_RAW, &inetdomain, IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR, ipsec4_common_input, 0, 0, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &nousrreqs }, #endif /* FAST_IPSEC */ { SOCK_RAW, &inetdomain, IPPROTO_IPV4, PR_ATOMIC|PR_ADDR|PR_LASTHDR, encap4_input, 0, 0, rip_ctloutput, - 0, + cpu0_soport, encap_init, 0, 0, 0, &rip_usrreqs }, { SOCK_RAW, &inetdomain, IPPROTO_MOBILE, PR_ATOMIC|PR_ADDR|PR_LASTHDR, encap4_input, 0, 0, rip_ctloutput, - 0, + cpu0_soport, encap_init, 0, 0, 0, &rip_usrreqs }, { SOCK_RAW, &inetdomain, IPPROTO_GRE, PR_ATOMIC|PR_ADDR|PR_LASTHDR, encap4_input, 0, 0, rip_ctloutput, - 0, + cpu0_soport, encap_init, 0, 0, 0, &rip_usrreqs }, # ifdef INET6 { SOCK_RAW, &inetdomain, IPPROTO_IPV6, PR_ATOMIC|PR_ADDR|PR_LASTHDR, encap4_input, 0, 0, rip_ctloutput, - 0, + cpu0_soport, encap_init, 0, 0, 0, &rip_usrreqs }, @@ -214,7 +216,7 @@ struct ipprotosw inetsw[] = { #ifdef IPDIVERT { SOCK_RAW, &inetdomain, IPPROTO_DIVERT, PR_ATOMIC|PR_ADDR, div_input, 0, 0, ip_ctloutput, - 0, + cpu0_soport, div_init, 0, 0, 0, &div_usrreqs, }, @@ -222,7 +224,7 @@ struct ipprotosw inetsw[] = { #ifdef IPXIP { SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, ipxip_input, 0, ipxip_ctlinput, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &rip_usrreqs }, @@ -230,7 +232,7 @@ struct ipprotosw inetsw[] = { #ifdef NSIP { SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR|PR_LASTHDR, idpip_input, 0, nsip_ctlinput, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &rip_usrreqs }, @@ -238,7 +240,7 @@ struct ipprotosw inetsw[] = { #ifdef PIM { SOCK_RAW, &inetdomain, IPPROTO_PIM, PR_ATOMIC|PR_ADDR|PR_LASTHDR, pim_input, 0, 0, rip_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &rip_usrreqs }, @@ -246,7 +248,7 @@ struct ipprotosw inetsw[] = { /* raw wildcard */ { SOCK_RAW, &inetdomain, 0, PR_ATOMIC|PR_ADDR, rip_input, 0, 0, rip_ctloutput, - 0, + cpu0_soport, rip_init, 0, 0, 0, &rip_usrreqs }, diff --git a/sys/netinet/in_var.h b/sys/netinet/in_var.h index a9915b429c..e46fae6b98 100644 --- a/sys/netinet/in_var.h +++ b/sys/netinet/in_var.h @@ -32,7 +32,7 @@ * * @(#)in_var.h 8.2 (Berkeley) 1/9/95 * $FreeBSD: src/sys/netinet/in_var.h,v 1.33.2.3 2001/12/14 20:09:34 jlemon Exp $ - * $DragonFly: src/sys/netinet/in_var.h,v 1.5 2003/09/15 23:38:14 hsu Exp $ + * $DragonFly: src/sys/netinet/in_var.h,v 1.6 2004/03/06 01:58:55 hsu Exp $ */ #ifndef _NETINET_IN_VAR_H_ @@ -223,12 +223,14 @@ do { \ } while(0) struct route; +struct netmsg; + struct in_multi *in_addmulti (struct in_addr *, struct ifnet *); void in_delmulti (struct in_multi *); int in_control (struct socket *, u_long, caddr_t, struct ifnet *, struct thread *); void in_rtqdrain (void); -void ip_input (struct mbuf *); +void ip_input (struct netmsg *); int in_ifadown (struct ifaddr *ifa, int); void in_ifscrub (struct ifnet *, struct in_ifaddr *); int ipflow_fastforward (struct mbuf *); diff --git a/sys/netinet/ip_demux.c b/sys/netinet/ip_demux.c index b129c1fb42..b3d3abf8ae 100644 --- a/sys/netinet/ip_demux.c +++ b/sys/netinet/ip_demux.c @@ -2,7 +2,7 @@ * Copyright (c) 2003 Jeffrey Hsu * All rights reserved. * - * $DragonFly: src/sys/netinet/ip_demux.c,v 1.5 2004/03/05 20:00:03 hsu Exp $ + * $DragonFly: src/sys/netinet/ip_demux.c,v 1.6 2004/03/06 01:58:55 hsu Exp $ */ #include "opt_inet.h" @@ -42,8 +42,8 @@ static int ip_mthread_enable = 0; SYSCTL_INT(_net_inet_ip, OID_AUTO, mthread_enable, CTLFLAG_RW, &ip_mthread_enable, 0, ""); -static int -INP_MPORT_HASH(in_addr_t src, in_addr_t dst, int sport, int dport) +static __inline int +INP_MPORT_HASH(in_addr_t src, in_addr_t dst, in_port_t sport, in_port_t dport) { /* * Use low order bytes. @@ -58,14 +58,19 @@ INP_MPORT_HASH(in_addr_t src, in_addr_t dst, int sport, int dport) #endif } +/* + * Map a packet to a protocol processing thread. + */ lwkt_port_t ip_mport(struct mbuf *m) { struct ip *ip = mtod(m, struct ip *); - int hlen; + int iphlen; struct tcphdr *th; struct udphdr *uh; + int off; lwkt_port_t port; + int cpu; if (ip_mthread_enable == 0) return (&netisr_cpu[0].td_msgport); @@ -82,30 +87,51 @@ ip_mport(struct mbuf *m) if (ntohs(ip->ip_off) & (IP_MF | IP_OFFMASK)) return (&netisr_cpu[0].td_msgport); - hlen = ip->ip_hl << 2; + iphlen = ip->ip_hl << 2; switch (ip->ip_p) { case IPPROTO_TCP: - if (m->m_len < sizeof(struct tcpiphdr) && - (m = m_pullup(m, sizeof(struct tcpiphdr))) == NULL) { + if (m->m_len < iphlen + sizeof(struct tcphdr) && + (m = m_pullup(m, iphlen + sizeof(struct tcphdr))) == NULL) { + tcpstat.tcps_rcvshort++; + return (NULL); + } + th = (struct tcphdr *)((caddr_t)ip + iphlen); + off = th->th_off << 2; + if (off < sizeof(struct tcphdr) || off > ip->ip_len) { + tcpstat.tcps_rcvbadoff++; + return (NULL); + } + if (m->m_len < sizeof(struct ip) + off) { + m = m_pullup(m, sizeof(struct ip) + off); + if (m == NULL) { tcpstat.tcps_rcvshort++; return (NULL); + } + ip = mtod(m, struct ip *); + th = (struct tcphdr *)((caddr_t)ip + iphlen); } - th = (struct tcphdr *)((caddr_t)ip + hlen); - port = &tcp_thread[INP_MPORT_HASH(ip->ip_src.s_addr, - ip->ip_dst.s_addr, th->th_sport, th->th_dport)].td_msgport; + cpu = INP_MPORT_HASH(ip->ip_src.s_addr, ip->ip_dst.s_addr, + th->th_sport, th->th_dport); + port = &tcp_thread[cpu].td_msgport; break; case IPPROTO_UDP: - if (m->m_len < hlen + sizeof(struct udphdr) && - (m = m_pullup(m, hlen + sizeof(struct udphdr))) == NULL) { + if (m->m_len < iphlen + sizeof(struct udphdr) && + (m = m_pullup(m, iphlen + sizeof(struct udphdr))) == NULL) { udpstat.udps_hdrops++; return (NULL); } - - uh = (struct udphdr *)((caddr_t)ip + hlen); - port = &udp_thread[INP_MPORT_HASH(ip->ip_src.s_addr, - ip->ip_dst.s_addr, uh->uh_sport, uh->uh_dport)].td_msgport; + uh = (struct udphdr *)((caddr_t)ip + iphlen); + + if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr)) || + in_broadcast(ip->ip_dst, m->m_pkthdr.rcvif)) { + cpu = 0; + } else { + cpu = INP_MPORT_HASH(ip->ip_src.s_addr, + ip->ip_dst.s_addr, uh->uh_sport, uh->uh_dport); + } + port = &udp_thread[cpu].td_msgport; break; default: port = &netisr_cpu[0].td_msgport; @@ -116,22 +142,74 @@ ip_mport(struct mbuf *m) return (port); } +/* + * Map a TCP socket to a protocol processing thread. + */ lwkt_port_t -tcp_soport(struct socket *so) +tcp_soport(struct socket *so, struct sockaddr *nam) { - struct inpcb *inp = sotoinpcb(so); + struct inpcb *inp; + + /* + * The following processing all take place on Protocol Thread 0: + * only bind() and connect() have a non-null nam parameter + * attach() has a null socket parameter + * Fast and slow timeouts pass in two NULLs + */ + if (nam != NULL || so == NULL) + return (&tcp_thread[0].td_msgport); + + /* + * Already bound and connected. For TCP connections, the + * (faddr, fport, laddr, lport) association cannot change now. + * + * Note: T/TCP code needs some reorganization to fit into + * this model. XXX JH + */ + inp = sotoinpcb(so); + if (!inp) /* connection reset by peer */ + return (&tcp_thread[0].td_msgport); + + /* + * Rely on type-stable memory and check in protocol handler + * to fix race condition here w/ deallocation of inp. XXX JH + */ return (&tcp_thread[INP_MPORT_HASH(inp->inp_laddr.s_addr, - inp->inp_faddr.s_addr, inp->inp_lport, inp->inp_fport)].td_msgport); + inp->inp_faddr.s_addr, inp->inp_lport, + inp->inp_fport)].td_msgport); } +/* + * Map a UDP socket to a protocol processing thread. + */ lwkt_port_t -udp_soport(struct socket *so) +udp_soport(struct socket *so, struct sockaddr *nam) { - struct inpcb *inp = sotoinpcb(so); + struct inpcb *inp; + + /* + * The following processing all take place on Protocol Thread 0: + * only bind() and connect() have a non-null nam parameter + * attach() has a null socket parameter + * Fast and slow timeouts pass in two NULLs + */ + if (nam != NULL || so == NULL) + return (&udp_thread[0].td_msgport); + + inp = sotoinpcb(so); + + if (IN_MULTICAST(ntohl(inp->inp_laddr.s_addr))) + return (&udp_thread[0].td_msgport); + + /* + * Rely on type-stable memory and check in protocol handler + * to fix race condition here w/ deallocation of inp. XXX JH + */ return (&udp_thread[INP_MPORT_HASH(inp->inp_laddr.s_addr, - inp->inp_faddr.s_addr, inp->inp_lport, inp->inp_fport)].td_msgport); + inp->inp_faddr.s_addr, inp->inp_lport, + inp->inp_fport)].td_msgport); } void diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c index b5b53e2dcd..8dfefb0aaa 100644 --- a/sys/netinet/ip_divert.c +++ b/sys/netinet/ip_divert.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/netinet/ip_divert.c,v 1.42.2.6 2003/01/23 21:06:45 sam Exp $ - * $DragonFly: src/sys/netinet/ip_divert.c,v 1.8 2004/03/05 16:57:15 hsu Exp $ + * $DragonFly: src/sys/netinet/ip_divert.c,v 1.9 2004/03/06 01:58:55 hsu Exp $ */ #include "opt_inet.h" @@ -57,6 +57,7 @@ #include #include +#include #include #include @@ -307,6 +308,8 @@ div_output(struct socket *so, struct mbuf *m, IP_ALLOWBROADCAST | IP_RAWOUTPUT, inp->inp_moptions, NULL); } else { + struct netmsg_packet msg; + if (m->m_pkthdr.rcvif == NULL) { /* * No luck with the name, check by IP address. @@ -325,7 +328,8 @@ div_output(struct socket *so, struct mbuf *m, m->m_pkthdr.rcvif = ifa->ifa_ifp; } /* Send packet to input processing */ - ip_input((struct mbuf *)&divert_tag); + msg.nm_packet = (struct mbuf *)&divert_tag; + ip_input((struct netmsg *)&msg); } return error; diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c index 673221e875..3064622e3a 100644 --- a/sys/netinet/ip_input.c +++ b/sys/netinet/ip_input.c @@ -32,7 +32,7 @@ * * @(#)ip_input.c 8.2 (Berkeley) 1/4/94 * $FreeBSD: src/sys/netinet/ip_input.c,v 1.130.2.52 2003/03/07 07:01:28 silby Exp $ - * $DragonFly: src/sys/netinet/ip_input.c,v 1.10 2004/02/14 21:12:39 dillon Exp $ + * $DragonFly: src/sys/netinet/ip_input.c,v 1.11 2004/03/06 01:58:55 hsu Exp $ */ #define _IP_VHL @@ -303,8 +303,9 @@ static struct sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET }; * try to reassemble. Process options. Pass to next level. */ void -ip_input(struct mbuf *m) +ip_input(struct netmsg *msg) { + struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet; struct ip *ip; struct ipq *fp; struct in_ifaddr *ia = NULL; diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c index 0e0312160a..9b0d3e0698 100644 --- a/sys/netinet/ip_output.c +++ b/sys/netinet/ip_output.c @@ -32,7 +32,7 @@ * * @(#)ip_output.c 8.3 (Berkeley) 1/21/94 * $FreeBSD: src/sys/netinet/ip_output.c,v 1.99.2.37 2003/04/15 06:44:45 silby Exp $ - * $DragonFly: src/sys/netinet/ip_output.c,v 1.10 2004/02/14 21:12:39 dillon Exp $ + * $DragonFly: src/sys/netinet/ip_output.c,v 1.11 2004/03/06 01:58:55 hsu Exp $ */ #define _IP_VHL @@ -59,6 +59,7 @@ #include #include +#include #ifdef PFIL_HOOKS #include #endif @@ -893,6 +894,7 @@ spd_done: } if (ia) { /* tell ip_input "dont filter" */ struct m_hdr tag; + struct netmsg_packet msg; tag.mh_type = MT_TAG; tag.mh_flags = PACKET_TAG_IPFORWARD; @@ -910,7 +912,8 @@ spd_done: CSUM_IP_CHECKED | CSUM_IP_VALID; ip->ip_len = htons(ip->ip_len); ip->ip_off = htons(ip->ip_off); - ip_input((struct mbuf *)&tag); + msg.nm_packet = (struct mbuf *)&tag; + ip_input((struct netmsg *)&msg); goto done; } /* Some of the logic for this was diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h index 99b1a95559..1dfcbc080d 100644 --- a/sys/netinet/tcp_var.h +++ b/sys/netinet/tcp_var.h @@ -32,7 +32,7 @@ * * @(#)tcp_var.h 8.4 (Berkeley) 5/24/95 * $FreeBSD: src/sys/netinet/tcp_var.h,v 1.56.2.13 2003/02/03 02:34:07 hsu Exp $ - * $DragonFly: src/sys/netinet/tcp_var.h,v 1.10 2004/03/02 20:41:13 rob Exp $ + * $DragonFly: src/sys/netinet/tcp_var.h,v 1.11 2004/03/06 01:58:55 hsu Exp $ */ #ifndef _NETINET_TCP_VAR_H_ @@ -492,7 +492,7 @@ struct tcptemp * tcp_maketemplate (struct tcpcb *); void tcp_fillheaders (struct tcpcb *, void *, void *); struct lwkt_port * - tcp_soport(struct socket *); + tcp_soport(struct socket *, struct sockaddr *nam); struct tcpcb * tcp_timers (struct tcpcb *, int); void tcp_trace (int, int, struct tcpcb *, void *, struct tcphdr *, diff --git a/sys/netinet/udp_var.h b/sys/netinet/udp_var.h index 74c78557c6..6894a0d96f 100644 --- a/sys/netinet/udp_var.h +++ b/sys/netinet/udp_var.h @@ -32,7 +32,7 @@ * * @(#)udp_var.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netinet/udp_var.h,v 1.22.2.1 2001/02/18 07:12:25 luigi Exp $ - * $DragonFly: src/sys/netinet/udp_var.h,v 1.4 2003/11/08 07:57:51 dillon Exp $ + * $DragonFly: src/sys/netinet/udp_var.h,v 1.5 2004/03/06 01:58:55 hsu Exp $ */ #ifndef _NETINET_UDP_VAR_H_ @@ -106,16 +106,14 @@ extern u_long udp_recvspace; extern struct udpstat udpstat; extern int log_in_vain; -void udp_ctlinput (int, struct sockaddr *, void *); -void udp_init (void); -void udp_thread_init (void); -void udp_input (struct mbuf *, int, int); +void udp_ctlinput (int, struct sockaddr *, void *); +void udp_init (void); +void udp_thread_init (void); +void udp_input (struct mbuf *, int, int); +void udp_notify (struct inpcb *inp, int errno); +int udp_shutdown (struct socket *so); +struct lwkt_port *udp_soport (struct socket *, struct sockaddr *nam); -void udp_notify (struct inpcb *inp, int errno); -int udp_shutdown (struct socket *so); - -struct lwkt_port * - udp_soport(struct socket *); #endif #endif diff --git a/sys/netinet6/in6_gif.c b/sys/netinet6/in6_gif.c index 80cfd1331c..fa891efb91 100644 --- a/sys/netinet6/in6_gif.c +++ b/sys/netinet6/in6_gif.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netinet6/in6_gif.c,v 1.2.2.7 2003/01/23 21:06:47 sam Exp $ */ -/* $DragonFly: src/sys/netinet6/in6_gif.c,v 1.4 2003/08/07 21:17:33 dillon Exp $ */ +/* $DragonFly: src/sys/netinet6/in6_gif.c,v 1.5 2004/03/06 01:58:56 hsu Exp $ */ /* $KAME: in6_gif.c,v 1.49 2001/05/14 14:02:17 itojun Exp $ */ /* @@ -78,7 +78,7 @@ extern struct domain6 inet6domain; struct ip6protosw in6_gif_protosw = { SOCK_RAW, &inet6domain, 0/*IPPROTO_IPV[46]*/, PR_ATOMIC|PR_ADDR, in6_gif_input, rip6_output, 0, rip6_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &rip6_usrreqs }; diff --git a/sys/netinet6/in6_proto.c b/sys/netinet6/in6_proto.c index 60ea03e05f..59639d3013 100644 --- a/sys/netinet6/in6_proto.c +++ b/sys/netinet6/in6_proto.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netinet6/in6_proto.c,v 1.6.2.9 2003/01/24 05:11:35 sam Exp $ */ -/* $DragonFly: src/sys/netinet6/in6_proto.c,v 1.4 2003/08/23 11:02:45 rob Exp $ */ +/* $DragonFly: src/sys/netinet6/in6_proto.c,v 1.5 2004/03/06 01:58:56 hsu Exp $ */ /* $KAME: in6_proto.c,v 1.91 2001/05/27 13:28:35 itojun Exp $ */ /* @@ -153,19 +153,19 @@ static struct pr_usrreqs nousrreqs; struct ip6protosw inet6sw[] = { { 0, &inet6domain, IPPROTO_IPV6, 0, 0, 0, 0, 0, - 0, + cpu0_soport, ip6_init, 0, frag6_slowtimo, frag6_drain, &nousrreqs, }, { SOCK_DGRAM, &inet6domain, IPPROTO_UDP, PR_ATOMIC|PR_ADDR, udp6_input, 0, udp6_ctlinput, ip6_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &udp6_usrreqs, }, { SOCK_STREAM, &inet6domain, IPPROTO_TCP, PR_CONNREQUIRED|PR_WANTRCVD|PR_LISTEN, tcp6_input, 0, tcp6_ctlinput, tcp_ctloutput, - 0, + cpu0_soport, #ifdef INET /* don't call initialization and timeout routines twice */ 0, 0, 0, tcp_drain, #else @@ -175,38 +175,38 @@ struct ip6protosw inet6sw[] = { }, { SOCK_RAW, &inet6domain, IPPROTO_RAW, PR_ATOMIC|PR_ADDR, rip6_input, rip6_output, rip6_ctlinput, rip6_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &rip6_usrreqs }, { SOCK_RAW, &inet6domain, IPPROTO_ICMPV6, PR_ATOMIC|PR_ADDR|PR_LASTHDR, icmp6_input, rip6_output, rip6_ctlinput, rip6_ctloutput, - 0, + cpu0_soport, icmp6_init, icmp6_fasttimo, 0, 0, &rip6_usrreqs }, -{ SOCK_RAW, &inet6domain, IPPROTO_DSTOPTS,PR_ATOMIC|PR_ADDR, +{ SOCK_RAW, &inet6domain, IPPROTO_DSTOPTS, PR_ATOMIC|PR_ADDR, dest6_input, 0, 0, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &nousrreqs }, -{ SOCK_RAW, &inet6domain, IPPROTO_ROUTING,PR_ATOMIC|PR_ADDR, +{ SOCK_RAW, &inet6domain, IPPROTO_ROUTING, PR_ATOMIC|PR_ADDR, route6_input, 0, 0, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &nousrreqs }, -{ SOCK_RAW, &inet6domain, IPPROTO_FRAGMENT,PR_ATOMIC|PR_ADDR, +{ SOCK_RAW, &inet6domain, IPPROTO_FRAGMENT, PR_ATOMIC|PR_ADDR, frag6_input, 0, 0, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &nousrreqs }, #ifdef IPSEC { SOCK_RAW, &inet6domain, IPPROTO_AH, PR_ATOMIC|PR_ADDR, ah6_input, 0, 0, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &nousrreqs, }, @@ -215,14 +215,14 @@ struct ip6protosw inet6sw[] = { esp6_input, 0, esp6_ctlinput, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &nousrreqs, }, #endif { SOCK_RAW, &inet6domain, IPPROTO_IPCOMP, PR_ATOMIC|PR_ADDR, ipcomp6_input, 0, 0, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &nousrreqs, }, @@ -230,27 +230,27 @@ struct ip6protosw inet6sw[] = { #ifdef INET { SOCK_RAW, &inet6domain, IPPROTO_IPV4, PR_ATOMIC|PR_ADDR|PR_LASTHDR, encap6_input, rip6_output, 0, rip6_ctloutput, - 0, + cpu0_soport, encap_init, 0, 0, 0, &rip6_usrreqs }, #endif /* INET */ { SOCK_RAW, &inet6domain, IPPROTO_IPV6, PR_ATOMIC|PR_ADDR|PR_LASTHDR, encap6_input, rip6_output, 0, rip6_ctloutput, - 0, + cpu0_soport, encap_init, 0, 0, 0, &rip6_usrreqs }, { SOCK_RAW, &inet6domain, IPPROTO_PIM, PR_ATOMIC|PR_ADDR|PR_LASTHDR, pim6_input, rip6_output, 0, rip6_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &rip6_usrreqs }, /* raw wildcard */ { SOCK_RAW, &inet6domain, 0, PR_ATOMIC|PR_ADDR, rip6_input, rip6_output, 0, rip6_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &rip6_usrreqs }, diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c index abb8c618c3..09f5f652b8 100644 --- a/sys/netinet6/ip6_input.c +++ b/sys/netinet6/ip6_input.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netinet6/ip6_input.c,v 1.11.2.15 2003/01/24 05:11:35 sam Exp $ */ -/* $DragonFly: src/sys/netinet6/ip6_input.c,v 1.11 2003/12/02 08:00:22 asmodai Exp $ */ +/* $DragonFly: src/sys/netinet6/ip6_input.c,v 1.12 2004/03/06 01:58:56 hsu Exp $ */ /* $KAME: ip6_input.c,v 1.259 2002/01/21 04:58:09 jinmei Exp $ */ /* @@ -244,9 +244,9 @@ SYSINIT(netinet6init2, SI_SUB_PROTO_DOMAIN, SI_ORDER_MIDDLE, ip6_init2, NULL); extern struct route_in6 ip6_forward_rt; void -ip6_input(m) - struct mbuf *m; +ip6_input(struct netmsg *msg) { + struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet; struct ip6_hdr *ip6; int off = sizeof(struct ip6_hdr), nest; u_int32_t plen; diff --git a/sys/netinet6/ip6_var.h b/sys/netinet6/ip6_var.h index 693bfe164b..cb0860e12b 100644 --- a/sys/netinet6/ip6_var.h +++ b/sys/netinet6/ip6_var.h @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netinet6/ip6_var.h,v 1.2.2.4 2003/01/23 21:06:47 sam Exp $ */ -/* $DragonFly: src/sys/netinet6/ip6_var.h,v 1.4 2003/12/02 08:00:22 asmodai Exp $ */ +/* $DragonFly: src/sys/netinet6/ip6_var.h,v 1.5 2004/03/06 01:58:56 hsu Exp $ */ /* $KAME: ip6_var.h,v 1.62 2001/05/03 14:51:48 itojun Exp $ */ /* @@ -300,7 +300,8 @@ int icmp6_ctloutput (struct socket *, struct sockopt *sopt); struct in6_ifaddr; void ip6_init (void); void ip6intr (void); -void ip6_input (struct mbuf *); +struct netmsg; +void ip6_input (struct netmsg *); struct in6_ifaddr *ip6_getdstifaddr (struct mbuf *); void ip6_freepcbopts (struct ip6_pktopts *); void ip6_freemoptions (struct ip6_moptions *); diff --git a/sys/netinet6/ip6protosw.h b/sys/netinet6/ip6protosw.h index d569b765c8..a1b2c2d177 100644 --- a/sys/netinet6/ip6protosw.h +++ b/sys/netinet6/ip6protosw.h @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netinet6/ip6protosw.h,v 1.2.2.4 2002/04/28 05:40:27 suz Exp $ */ -/* $DragonFly: src/sys/netinet6/ip6protosw.h,v 1.3 2003/08/23 11:02:45 rob Exp $ */ +/* $DragonFly: src/sys/netinet6/ip6protosw.h,v 1.4 2004/03/06 01:58:56 hsu Exp $ */ /* $KAME: ip6protosw.h,v 1.25 2001/09/26 06:13:03 keiichi Exp $ */ /* @@ -117,6 +117,8 @@ struct ip6ctlparam { u_int8_t ip6c_nxt; /* final next header field */ }; +struct lwkt_port; + struct ip6protosw { short pr_type; /* socket type used for */ struct domain *pr_domain; /* domain protocol a member of */ @@ -133,10 +135,7 @@ struct ip6protosw { int (*pr_ctloutput) /* control output (from above) */ (struct socket *, struct sockopt *); -/* user-protocol hook */ - int (*pr_usrreq) /* user request: see list below */ - (struct socket *, int, struct mbuf *, - struct mbuf *, struct mbuf *, struct proc *); + struct lwkt_port *(*pr_soport) (struct socket *, struct sockaddr *); /* utility hooks */ void (*pr_init) /* initialization hook */ diff --git a/sys/netproto/atalk/aarp.c b/sys/netproto/atalk/aarp.c index ac387eaea8..c21e29fbe6 100644 --- a/sys/netproto/atalk/aarp.c +++ b/sys/netproto/atalk/aarp.c @@ -3,7 +3,7 @@ * All Rights Reserved. * * $FreeBSD: src/sys/netatalk/aarp.c,v 1.12.2.2 2001/06/23 20:43:09 iedowse Exp $ - * $DragonFly: src/sys/netproto/atalk/aarp.c,v 1.6 2004/02/06 09:17:40 rob Exp $ + * $DragonFly: src/sys/netproto/atalk/aarp.c,v 1.7 2004/03/06 01:58:56 hsu Exp $ */ #include "opt_atalk.h" @@ -16,6 +16,7 @@ #include #include +#include #include #undef s_net @@ -254,9 +255,9 @@ aarpresolve( ac, m, destsat, desten ) } void -aarpintr( m ) - struct mbuf *m; +aarpintr(struct netmsg *msg) { + struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet; struct arphdr *ar; struct arpcom *ac; diff --git a/sys/netproto/atalk/at_extern.h b/sys/netproto/atalk/at_extern.h index 9de6775f65..19353ce36a 100644 --- a/sys/netproto/atalk/at_extern.h +++ b/sys/netproto/atalk/at_extern.h @@ -1,5 +1,5 @@ /* - * $DragonFly: src/sys/netproto/atalk/at_extern.h,v 1.4 2003/09/16 05:03:13 hsu Exp $ + * $DragonFly: src/sys/netproto/atalk/at_extern.h,v 1.5 2004/03/06 01:58:56 hsu Exp $ */ struct mbuf; struct sockaddr_at; @@ -18,12 +18,13 @@ extern void aarptfree (struct aarptab *); #endif struct ifnet; +struct netmsg; struct proc; struct socket; -extern void aarpintr (struct mbuf *); -extern void at1intr (struct mbuf *); -extern void at2intr (struct mbuf *); +extern void aarpintr (struct netmsg *); +extern void at1intr (struct netmsg *); +extern void at2intr (struct netmsg *); extern void aarp_clean (void); extern int at_control ( struct socket *so, u_long cmd, diff --git a/sys/netproto/atalk/at_proto.c b/sys/netproto/atalk/at_proto.c index 090fd54008..c1887f0aa1 100644 --- a/sys/netproto/atalk/at_proto.c +++ b/sys/netproto/atalk/at_proto.c @@ -20,7 +20,7 @@ * +1-313-763-0525 * netatalk@itd.umich.edu * - * $DragonFly: src/sys/netproto/atalk/at_proto.c,v 1.2 2003/08/07 21:17:33 dillon Exp $ + * $DragonFly: src/sys/netproto/atalk/at_proto.c,v 1.3 2004/03/06 01:58:56 hsu Exp $ */ #include @@ -51,8 +51,7 @@ static struct protosw atalksw[] = { * they be included in the kernel. */ 0, ddp_output, 0, 0, - /* socket-protocol interface. deprecated */ - NULL, + cpu0_soport, /* utility routines. */ ddp_init, 0, 0, 0, &ddp_usrreqs diff --git a/sys/netproto/atalk/ddp_input.c b/sys/netproto/atalk/ddp_input.c index 1179b6a906..cd60d306bf 100644 --- a/sys/netproto/atalk/ddp_input.c +++ b/sys/netproto/atalk/ddp_input.c @@ -3,7 +3,7 @@ * All Rights Reserved. See COPYRIGHT. * * $FreeBSD: src/sys/netatalk/ddp_input.c,v 1.12 2000/02/13 03:31:58 peter Exp $ - * $DragonFly: src/sys/netproto/atalk/ddp_input.c,v 1.5 2003/09/16 05:03:13 hsu Exp $ + * $DragonFly: src/sys/netproto/atalk/ddp_input.c,v 1.6 2004/03/06 01:58:56 hsu Exp $ */ #include @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -35,8 +36,9 @@ static void ddp_input(struct mbuf *, struct ifnet *, struct elaphdr *, int); * Could probably merge these two code segments a little better... */ void -at2intr(struct mbuf *m) +at2intr(struct netmsg *msg) { + struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet; /* * Phase 2 packet handling @@ -46,8 +48,9 @@ at2intr(struct mbuf *m) } void -at1intr(struct mbuf *m) +at1intr(struct netmsg *msg) { + struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet; struct elaphdr *elhp, elh; /* diff --git a/sys/netproto/atm/atm_proto.c b/sys/netproto/atm/atm_proto.c index 5779578d3b..45e02f61b4 100644 --- a/sys/netproto/atm/atm_proto.c +++ b/sys/netproto/atm/atm_proto.c @@ -24,7 +24,7 @@ * notice must be reproduced on all copies. * * @(#) $FreeBSD: src/sys/netatm/atm_proto.c,v 1.3 1999/08/28 00:48:36 peter Exp $ - * @(#) $DragonFly: src/sys/netproto/atm/atm_proto.c,v 1.5 2004/02/06 09:17:40 rob Exp $ + * @(#) $DragonFly: src/sys/netproto/atm/atm_proto.c,v 1.6 2004/03/06 01:58:56 hsu Exp $ */ /* @@ -46,7 +46,7 @@ struct protosw atmsw[] = { 0, /* pr_output */ 0, /* pr_ctlinput */ 0, /* pr_ctloutput */ - 0, /* pr_ousrreq */ + cpu0_soport, /* pr_soport */ 0, /* pr_init */ 0, /* pr_fasttimo */ 0, /* pr_slowtimo */ diff --git a/sys/netproto/atm/atm_subr.c b/sys/netproto/atm/atm_subr.c index 31d1745595..f8884067de 100644 --- a/sys/netproto/atm/atm_subr.c +++ b/sys/netproto/atm/atm_subr.c @@ -24,7 +24,7 @@ * notice must be reproduced on all copies. * * @(#) $FreeBSD: src/sys/netatm/atm_subr.c,v 1.7 2000/02/13 03:31:59 peter Exp $ - * @(#) $DragonFly: src/sys/netproto/atm/atm_subr.c,v 1.9 2004/02/06 09:17:40 rob Exp $ + * @(#) $DragonFly: src/sys/netproto/atm/atm_subr.c,v 1.10 2004/03/06 01:58:56 hsu Exp $ */ /* @@ -70,7 +70,7 @@ struct sp_info atm_attributes_pool = { */ static void atm_compact (struct atm_time *); static KTimeout_ret atm_timexp (void *); -static void atm_intr(struct mbuf *); +static void atm_intr(struct netmsg *); /* * Local variables @@ -880,8 +880,9 @@ atm_stack_drain() * */ static void -atm_intr(struct mbuf *m) +atm_intr(struct netmsg *msg) { + struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet; caddr_t cp; atm_intr_func_t func; void *token; diff --git a/sys/netproto/atm/atm_usrreq.c b/sys/netproto/atm/atm_usrreq.c index a933995594..82e485cf98 100644 --- a/sys/netproto/atm/atm_usrreq.c +++ b/sys/netproto/atm/atm_usrreq.c @@ -24,7 +24,7 @@ * notice must be reproduced on all copies. * * @(#) $FreeBSD: src/sys/netatm/atm_usrreq.c,v 1.6 1999/08/28 00:48:39 peter Exp $ - * @(#) $DragonFly: src/sys/netproto/atm/atm_usrreq.c,v 1.8 2004/03/05 16:57:16 hsu Exp $ + * @(#) $DragonFly: src/sys/netproto/atm/atm_usrreq.c,v 1.9 2004/03/06 01:58:56 hsu Exp $ */ /* @@ -46,7 +46,6 @@ static int atm_dgram_control (struct socket *, u_long, caddr_t, struct ifnet *, struct thread *); static int atm_dgram_info (caddr_t); - /* * New-style socket request routines */ diff --git a/sys/netproto/ipsec/keysock.c b/sys/netproto/ipsec/keysock.c index 9c7a42f644..7c5637cf35 100644 --- a/sys/netproto/ipsec/keysock.c +++ b/sys/netproto/ipsec/keysock.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netipsec/keysock.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $ */ -/* $DragonFly: src/sys/netproto/ipsec/keysock.c,v 1.5 2003/11/09 02:22:36 dillon Exp $ */ +/* $DragonFly: src/sys/netproto/ipsec/keysock.c,v 1.6 2004/03/06 01:58:56 hsu Exp $ */ /* $KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $ */ /* @@ -580,7 +580,7 @@ extern struct domain keydomain; struct protosw keysw[] = { { SOCK_RAW, &keydomain, PF_KEY_V2, PR_ATOMIC|PR_ADDR, 0, (pr_output_t *)key_output, raw_ctlinput, 0, - 0, + cpu0_soport, raw_init, 0, 0, 0, &key_usrreqs } diff --git a/sys/netproto/ipsec/xform_ipip.c b/sys/netproto/ipsec/xform_ipip.c index 6c7b218422..b84cc257cc 100644 --- a/sys/netproto/ipsec/xform_ipip.c +++ b/sys/netproto/ipsec/xform_ipip.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netipsec/xform_ipip.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $ */ -/* $DragonFly: src/sys/netproto/ipsec/xform_ipip.c,v 1.5 2003/11/09 02:22:36 dillon Exp $ */ +/* $DragonFly: src/sys/netproto/ipsec/xform_ipip.c,v 1.6 2004/03/06 01:58:56 hsu Exp $ */ /* $OpenBSD: ip_ipip.c,v 1.25 2002/06/10 18:04:55 itojun Exp $ */ /* * The authors of this code are John Ioannidis (ji@tla.org), @@ -657,7 +657,7 @@ static struct ipprotosw ipe4_protosw[] = { { SOCK_RAW, &inetdomain, IPPROTO_IPV4, PR_ATOMIC|PR_ADDR|PR_LASTHDR, (pr_in_input_t*) ip4_input, 0, 0, rip_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &rip_usrreqs }, @@ -665,7 +665,7 @@ static struct ipprotosw ipe4_protosw[] = { { SOCK_RAW, &inetdomain, IPPROTO_IPV6, PR_ATOMIC|PR_ADDR|PR_LASTHDR, (pr_in_input_t*) ip4_input, 0, 0, rip_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &rip_usrreqs } diff --git a/sys/netproto/ipx/ipx_input.c b/sys/netproto/ipx/ipx_input.c index 7494716524..072738cb21 100644 --- a/sys/netproto/ipx/ipx_input.c +++ b/sys/netproto/ipx/ipx_input.c @@ -34,7 +34,7 @@ * @(#)ipx_input.c * * $FreeBSD: src/sys/netipx/ipx_input.c,v 1.22.2.2 2001/02/22 09:44:18 bp Exp $ - * $DragonFly: src/sys/netproto/ipx/ipx_input.c,v 1.7 2004/02/24 19:17:08 joerg Exp $ + * $DragonFly: src/sys/netproto/ipx/ipx_input.c,v 1.8 2004/03/06 01:58:56 hsu Exp $ */ #include @@ -89,7 +89,7 @@ struct ipxpcb ipxrawpcb; long ipx_pexseq; -static void ipxintr(struct mbuf *); +static void ipxintr(struct netmsg *); static int ipx_do_route(struct ipx_addr *src, struct route *ro); static void ipx_undo_route(struct route *ro); static void ipx_forward(struct mbuf *m); @@ -122,8 +122,9 @@ ipx_init() * IPX input routine. Pass to next level. */ static void -ipxintr(struct mbuf *m) +ipxintr(struct netmsg *msg) { + struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet; struct ipx *ipx; struct ipxpcb *ipxp; struct ipx_ifaddr *ia; diff --git a/sys/netproto/ipx/ipx_proto.c b/sys/netproto/ipx/ipx_proto.c index 959a90621e..d41ce32edb 100644 --- a/sys/netproto/ipx/ipx_proto.c +++ b/sys/netproto/ipx/ipx_proto.c @@ -34,7 +34,7 @@ * @(#)ipx_proto.c * * $FreeBSD: src/sys/netipx/ipx_proto.c,v 1.15 1999/08/28 00:49:41 peter Exp $ - * $DragonFly: src/sys/netproto/ipx/ipx_proto.c,v 1.3 2003/08/07 21:17:37 dillon Exp $ + * $DragonFly: src/sys/netproto/ipx/ipx_proto.c,v 1.4 2004/03/06 01:58:56 hsu Exp $ */ #include "opt_ipx.h" @@ -63,31 +63,31 @@ static struct pr_usrreqs nousrreqs; static struct protosw ipxsw[] = { { 0, &ipxdomain, 0, 0, 0, 0, 0, 0, - 0, + cpu0_soport, ipx_init, 0, 0, 0, &nousrreqs }, { SOCK_DGRAM, &ipxdomain, 0, PR_ATOMIC|PR_ADDR, 0, 0, ipx_ctlinput, ipx_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &ipx_usrreqs }, { SOCK_STREAM, &ipxdomain, IPXPROTO_SPX, PR_CONNREQUIRED|PR_WANTRCVD, 0, 0, spx_ctlinput, spx_ctloutput, - 0, + cpu0_soport, spx_init, spx_fasttimo, spx_slowtimo, 0, &spx_usrreqs }, { SOCK_SEQPACKET,&ipxdomain, IPXPROTO_SPX, PR_CONNREQUIRED|PR_WANTRCVD|PR_ATOMIC, 0, 0, spx_ctlinput, spx_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &spx_usrreq_sps }, { SOCK_RAW, &ipxdomain, IPXPROTO_RAW, PR_ATOMIC|PR_ADDR, 0, 0, 0, ipx_ctloutput, - 0, + cpu0_soport, 0, 0, 0, 0, &ripx_usrreqs }, @@ -95,7 +95,7 @@ static struct protosw ipxsw[] = { #if 0 { SOCK_RAW, &ipxdomain, IPPROTO_IPX, PR_ATOMIC|PR_ADDR, iptun_input, rip_output, iptun_ctlinput, 0, - 0, + cpu0_soport, 0, 0, 0, 0, &rip_usrreqs }, diff --git a/sys/netproto/key/keysock.c b/sys/netproto/key/keysock.c index 85a73a7e10..248cff820e 100644 --- a/sys/netproto/key/keysock.c +++ b/sys/netproto/key/keysock.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netkey/keysock.c,v 1.1.2.4 2003/01/11 19:10:59 ume Exp $ */ -/* $DragonFly: src/sys/netproto/key/keysock.c,v 1.8 2004/03/05 16:57:16 hsu Exp $ */ +/* $DragonFly: src/sys/netproto/key/keysock.c,v 1.9 2004/03/06 01:58:56 hsu Exp $ */ /* $KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $ */ /* @@ -576,7 +576,7 @@ extern struct domain keydomain; struct protosw keysw[] = { { SOCK_RAW, &keydomain, PF_KEY_V2, PR_ATOMIC|PR_ADDR, 0, key_output, raw_ctlinput, 0, - 0, + cpu0_soport, raw_init, 0, 0, 0, &key_usrreqs } diff --git a/sys/netproto/natm/natm.c b/sys/netproto/natm/natm.c index 8c5fb4e1c7..cdcd41857d 100644 --- a/sys/netproto/natm/natm.c +++ b/sys/netproto/natm/natm.c @@ -1,6 +1,6 @@ /* $NetBSD: natm.c,v 1.5 1996/11/09 03:26:26 chuck Exp $ */ /* $FreeBSD: src/sys/netnatm/natm.c,v 1.12 2000/02/13 03:32:03 peter Exp $ */ -/* $DragonFly: src/sys/netproto/natm/natm.c,v 1.10 2004/03/05 16:57:16 hsu Exp $ */ +/* $DragonFly: src/sys/netproto/natm/natm.c,v 1.11 2004/03/06 01:58:57 hsu Exp $ */ /* * @@ -69,7 +69,7 @@ static u_long natm0_recvspace = 16*1024; /* * FreeBSD new usrreqs supersedes pr_usrreq. */ -static int natm_usr_attach (struct socket *, int, struct pru_attach_info *ai); +static int natm_usr_attach (struct socket *, int, struct pru_attach_info *); static int natm_usr_detach (struct socket *); static int natm_usr_connect (struct socket *, struct sockaddr *, struct thread *); @@ -719,7 +719,7 @@ int natm5_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, return (ENOPROTOOPT); } -static void natmintr(struct mbuf *); +static void natmintr(struct netmsg *); #if defined(__DragonFly__) static void @@ -747,8 +747,9 @@ natm_init() * we really need it. */ static void -natmintr(struct mbuf *m) +natmintr(struct netmsg *msg) { + struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet; int s; struct socket *so; struct natmpcb *npcb; diff --git a/sys/netproto/natm/natm_proto.c b/sys/netproto/natm/natm_proto.c index 828706aaf2..ca81f38d28 100644 --- a/sys/netproto/natm/natm_proto.c +++ b/sys/netproto/natm/natm_proto.c @@ -32,7 +32,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/netnatm/natm_proto.c,v 1.4.2.2 2000/08/03 18:56:28 peter Exp $ - * $DragonFly: src/sys/netproto/natm/natm_proto.c,v 1.6 2004/02/06 09:17:41 rob Exp $ + * $DragonFly: src/sys/netproto/natm/natm_proto.c,v 1.7 2004/03/06 01:58:57 hsu Exp $ */ /* @@ -59,7 +59,7 @@ static struct protosw natmsw[] = { { SOCK_STREAM, &natmdomain, PROTO_NATMAAL5, PR_CONNREQUIRED, 0, 0, 0, 0, #ifdef FREEBSD_USRREQS - 0, + cpu0_soport, #else natm_usrreq, #endif @@ -73,7 +73,7 @@ static struct protosw natmsw[] = { { SOCK_DGRAM, &natmdomain, PROTO_NATMAAL5, PR_CONNREQUIRED | PR_ATOMIC, 0, 0, 0, 0, #ifdef FREEBSD_USRREQS - 0, + cpu0_soport, #else natm_usrreq, #endif @@ -87,7 +87,7 @@ static struct protosw natmsw[] = { { SOCK_STREAM, &natmdomain, PROTO_NATMAAL0, PR_CONNREQUIRED, 0, 0, 0, 0, #ifdef FREEBSD_USRREQS - 0, + cpu0_soport, #else natm_usrreq, #endif diff --git a/sys/netproto/ns/ns_input.c b/sys/netproto/ns/ns_input.c index 88fe0589cb..126a9cfad7 100644 --- a/sys/netproto/ns/ns_input.c +++ b/sys/netproto/ns/ns_input.c @@ -32,7 +32,7 @@ * * @(#)ns_input.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/ns_input.c,v 1.13 2000/02/13 03:32:04 peter Exp $ - * $DragonFly: src/sys/netproto/ns/ns_input.c,v 1.8 2003/11/08 07:57:52 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/ns_input.c,v 1.9 2004/03/06 01:58:57 hsu Exp $ */ #include @@ -78,7 +78,7 @@ struct nspcb nsrawpcb; int idpcksum = 1; long ns_pexseq; -static void nsintr(struct mbuf *m); +static void nsintr(struct netmsg *msg); void ns_init() @@ -103,8 +103,9 @@ int nsintr_getpck = 0; int nsintr_swtch = 0; static void -nsintr(struct mbuf *m) +nsintr(struct netmsg *msg) { + struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet; struct idp *idp; struct nspcb *nsp; int i; diff --git a/sys/sys/msgport.h b/sys/sys/msgport.h index 8fa61aef72..7b5f20ffbe 100644 --- a/sys/sys/msgport.h +++ b/sys/sys/msgport.h @@ -3,7 +3,7 @@ * * Implements LWKT messages and ports. * - * $DragonFly: src/sys/sys/msgport.h,v 1.12 2004/01/18 12:29:50 dillon Exp $ + * $DragonFly: src/sys/sys/msgport.h,v 1.13 2004/03/06 01:58:57 hsu Exp $ */ #ifndef _SYS_MSGPORT_H_ @@ -74,6 +74,12 @@ typedef struct lwkt_msg { #define MSG_CMD_NETMSG 0x00040000 #define MSG_SUBCMD_MASK 0x0000FFFF +#ifdef _KERNEL +#ifdef MALLOC_DECLARE +MALLOC_DECLARE(M_LWKTMSG); +#endif +#endif + typedef struct lwkt_port { lwkt_msg_queue mp_msgq; int mp_flags; diff --git a/sys/sys/protosw.h b/sys/sys/protosw.h index 02eeda6103..2877246930 100644 --- a/sys/sys/protosw.h +++ b/sys/sys/protosw.h @@ -32,7 +32,7 @@ * * @(#)protosw.h 8.1 (Berkeley) 6/2/93 * $FreeBSD: src/sys/sys/protosw.h,v 1.28.2.2 2001/07/03 11:02:01 ume Exp $ - * $DragonFly: src/sys/sys/protosw.h,v 1.6 2004/03/05 16:57:16 hsu Exp $ + * $DragonFly: src/sys/sys/protosw.h,v 1.7 2004/03/06 01:58:57 hsu Exp $ */ #ifndef _SYS_PROTOSW_H_ @@ -83,7 +83,7 @@ struct protosw { int (*pr_ctloutput)(struct socket *, struct sockopt *); /* control output (from above) */ /* user-protocol hook */ - void *pr_ousrreq; + struct lwkt_port *(*pr_mport)(struct socket *, struct sockaddr *); /* utility hooks */ void (*pr_init) (void); /* initialization hook */ void (*pr_fasttimo) (void); @@ -237,17 +237,56 @@ struct pr_usrreqs { struct ucred *cred, struct thread *td); }; +typedef int (*pru_abort_fn_t) (struct socket *so); +typedef int (*pru_accept_fn_t) (struct socket *so, struct sockaddr **nam); +typedef int (*pru_attach_fn_t) (struct socket *so, int proto, + struct pru_attach_info *ai); +typedef int (*pru_bind_fn_t) (struct socket *so, struct sockaddr *nam, + struct thread *td); +typedef int (*pru_connect_fn_t) (struct socket *so, struct sockaddr *nam, + struct thread *td); +typedef int (*pru_connect2_fn_t) (struct socket *so1, struct socket *so2); +typedef int (*pru_control_fn_t) (struct socket *so, u_long cmd, caddr_t data, + struct ifnet *ifp, + struct thread *td); +typedef int (*pru_detach_fn_t) (struct socket *so); +typedef int (*pru_disconnect_fn_t) (struct socket *so); +typedef int (*pru_listen_fn_t) (struct socket *so, struct thread *td); +typedef int (*pru_peeraddr_fn_t) (struct socket *so, struct sockaddr **nam); +typedef int (*pru_rcvd_fn_t) (struct socket *so, int flags); +typedef int (*pru_rcvoob_fn_t) (struct socket *so, struct mbuf *m, int flags); +typedef int (*pru_send_fn_t) (struct socket *so, int flags, struct mbuf *m, + struct sockaddr *addr, + struct mbuf *control, + struct thread *td); +typedef int (*pru_sense_fn_t) (struct socket *so, struct stat *sb); +typedef int (*pru_shutdown_fn_t) (struct socket *so); +typedef int (*pru_sockaddr_fn_t) (struct socket *so, struct sockaddr **nam); +typedef int (*pru_sosend_fn_t) (struct socket *so, struct sockaddr *addr, + struct uio *uio, struct mbuf *top, + struct mbuf *control, int flags, + struct thread *td); +typedef int (*pru_soreceive_fn_t) (struct socket *so, struct sockaddr **paddr, + struct uio *uio, struct mbuf **mp0, + struct mbuf **controlp, + int *flagsp); +typedef int (*pru_sopoll_fn_t) (struct socket *so, int events, + struct ucred *cred, + struct thread *td); + int pru_accept_notsupp (struct socket *so, struct sockaddr **nam); int pru_connect_notsupp (struct socket *so, struct sockaddr *nam, - struct thread *td); + struct thread *td); int pru_connect2_notsupp (struct socket *so1, struct socket *so2); int pru_control_notsupp (struct socket *so, u_long cmd, caddr_t data, - struct ifnet *ifp, struct thread *td); + struct ifnet *ifp, struct thread *td); int pru_listen_notsupp (struct socket *so, struct thread *td); int pru_rcvd_notsupp (struct socket *so, int flags); int pru_rcvoob_notsupp (struct socket *so, struct mbuf *m, int flags); int pru_sense_null (struct socket *so, struct stat *sb); +struct lwkt_port *cpu0_soport(struct socket *, struct sockaddr *); + #endif /* _KERNEL */ /* @@ -258,7 +297,7 @@ int pru_sense_null (struct socket *so, struct stat *sb); */ #define PRC_IFDOWN 0 /* interface transition */ #define PRC_ROUTEDEAD 1 /* select new route if possible ??? */ -#define PRC_IFUP 2 /* interface has come back up */ +#define PRC_IFUP 2 /* interface has come back up */ #define PRC_QUENCH2 3 /* DEC congestion bit says slow down */ #define PRC_QUENCH 4 /* some one said to slow down */ #define PRC_MSGSIZE 5 /* message size forced drop */ @@ -324,6 +363,6 @@ void pfctlinput (int, struct sockaddr *); void pfctlinput2 (int, struct sockaddr *, void *); struct protosw *pffindproto (int family, int protocol, int type); struct protosw *pffindtype (int family, int type); -#endif +#endif /* _KERNEL */ -#endif +#endif /* _SYS_PROTOSW_H_ */ diff --git a/sys/sys/socketops.h b/sys/sys/socketops.h index a6024248ec..b17e1fe2ef 100644 --- a/sys/sys/socketops.h +++ b/sys/sys/socketops.h @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $DragonFly: src/sys/sys/socketops.h,v 1.2 2004/03/05 16:57:16 hsu Exp $ + * $DragonFly: src/sys/sys/socketops.h,v 1.3 2004/03/06 01:58:57 hsu Exp $ */ #ifndef _SOCKETOPS_H_ @@ -37,6 +37,11 @@ #include #include +/* + * sosend() and soreceive() can block and also calls other pru_usrreq functions. + * They should not really be usrreq functions. Always call them directly from + * the process context rather than passing a message to the protocol thread. + */ static __inline int so_pru_sosend(struct socket *so, struct sockaddr *addr, struct uio *uio, struct mbuf *top, struct mbuf *control, int flags, struct thread *td) @@ -53,6 +58,36 @@ so_pru_soreceive(struct socket *so, struct sockaddr **paddr, struct uio *uio, controlp, flagsp)); } +#if defined(SMP) || defined(ALWAYS_MSG) + +int so_pru_abort (struct socket *so); +int so_pru_accept (struct socket *so, struct sockaddr **nam); +int so_pru_attach (struct socket *so, int proto, struct pru_attach_info *ai); +int so_pru_bind (struct socket *so, struct sockaddr *nam, struct thread *td); +int so_pru_connect (struct socket *so, struct sockaddr *nam, struct thread *td); +int so_pru_connect2 (struct socket *so1, struct socket *so2); +int so_pru_control (struct socket *so, u_long cmd, caddr_t data, + struct ifnet *ifp, struct thread *td); +int so_pru_detach (struct socket *so); +int so_pru_disconnect (struct socket *so); +int so_pru_listen (struct socket *so, struct thread *td); +int so_pru_peeraddr (struct socket *so, struct sockaddr **nam); +int so_pru_rcvd (struct socket *so, int flags); +int so_pru_rcvoob (struct socket *so, struct mbuf *m, int flags); +int so_pru_send (struct socket *so, int flags, struct mbuf *m, + struct sockaddr *addr, struct mbuf *control, + struct thread *td); +int so_pru_sense (struct socket *so, struct stat *sb); +int so_pru_shutdown (struct socket *so); +int so_pru_sockaddr (struct socket *so, struct sockaddr **nam); +int so_pru_sopoll (struct socket *so, int events, struct ucred *cred, + struct thread *td); +int so_pr_ctloutput(struct socket *so, struct sockopt *sopt); + +#else + +#include + static __inline int so_pru_abort(struct socket *so) { @@ -174,4 +209,6 @@ so_pr_ctloutput(struct socket *so, struct sockopt *sopt) return ((*so->so_proto->pr_ctloutput)(so, sopt)); } +#endif /* defined(SMP) || defined(ALWAYS_MSG) */ + #endif -- 2.41.0