Fix rts_input() which is the only procedure which calls raw_input(). As
authorMatthew Dillon <dillon@dragonflybsd.org>
Sun, 24 Jun 2007 20:00:00 +0000 (20:00 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sun, 24 Jun 2007 20:00:00 +0000 (20:00 +0000)
with other packet input routines, the mbuf must be demuxed and forwarded
to the correct protocol thread so it can be cpu-localized for processing.

This allow anyone, including interrupt code, to write to the routing
socket.

Reported-by: "Sepherosa Ziehau" <sepherosa@gmail.com>
sys/net/raw_usrreq.c
sys/net/rtsock.c

index 284c0fa..48e2335 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)raw_usrreq.c        8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/raw_usrreq.c,v 1.18 1999/08/28 00:48:28 peter Exp $
- * $DragonFly: src/sys/net/raw_usrreq.c,v 1.13 2007/04/22 01:13:11 dillon Exp $
+ * $DragonFly: src/sys/net/raw_usrreq.c,v 1.14 2007/06/24 20:00:00 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -54,14 +54,17 @@ raw_init(void)
        LIST_INIT(&rawcb_list);
 }
 
+/************************************************************************
+ *                      RAW PROTOCOL INTERFACE                         *
+ ************************************************************************/
 
 /*
- * Raw protocol input routine.  Find the socket
- * associated with the packet(s) and move them over.  If
- * nothing exists for this packet, drop it.
- */
-/*
- * Raw protocol interface.
+ * Raw protocol input routine.  Find the socket associated with the packet(s)
+ * and move them over.  If nothing exists for this packet, drop it.  This
+ * routine is indirect called via rts_input() and will be serialized on
+ * cpu 0.
+ *
+ * Most other raw protocol interface functions are also serialized XXX.
  */
 void
 raw_input(struct mbuf *m0, struct sockproto *proto, const struct sockaddr *src,
index c672971..71a1002 100644 (file)
@@ -64,7 +64,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.38 2007/04/21 02:26:47 dillon Exp $
+ * $DragonFly: src/sys/net/rtsock.c,v 1.39 2007/06/24 20:00:00 dillon Exp $
  */
 
 #include "opt_sctp.h"
@@ -85,6 +85,7 @@
 #include <net/if.h>
 #include <net/route.h>
 #include <net/raw_cb.h>
+#include <net/netmsg2.h>
 
 #ifdef SCTP
 extern void sctp_add_ip_address(struct ifaddr *ifa);
@@ -335,15 +336,46 @@ familyof(struct sockaddr *sa)
        return (sa != NULL ? sa->sa_family : 0);
 }
 
+/*
+ * Routing socket input function.  The packet must be serialized onto cpu 0.
+ * We use the cpu0_soport() netisr processing loop to handle it.
+ *
+ * This looks messy but it means that anyone, including interrupt code,
+ * can send a message to the routing socket.
+ */
 static void
-rts_input(struct mbuf *m, sa_family_t family)
+rts_input_handler(struct netmsg *msg)
 {
        static const struct sockaddr route_dst = { 2, PF_ROUTE, };
-       struct sockproto route_proto = { PF_ROUTE, family };
+       struct sockproto route_proto;
+       struct netmsg_packet *pmsg;
+       struct mbuf *m;
+       sa_family_t family;
+
+       pmsg = (void *)msg;
+       m = pmsg->nm_packet;
+       family = pmsg->nm_netmsg.nm_lmsg.u.ms_result;
+       route_proto.sp_family = PF_ROUTE;
+       route_proto.sp_protocol = family;
 
        raw_input(m, &route_proto, &route_src, &route_dst);
 }
 
+static void
+rts_input(struct mbuf *m, sa_family_t family)
+{
+       struct netmsg_packet *pmsg;
+       lwkt_port_t port;
+
+       port = cpu0_soport(NULL, NULL, 0);
+       pmsg = &m->m_hdr.mh_netmsg;
+       netmsg_init(&pmsg->nm_netmsg, &netisr_apanic_rport, 
+                   0, rts_input_handler);
+       pmsg->nm_packet = m;
+       pmsg->nm_netmsg.nm_lmsg.u.ms_result = family;
+       lwkt_sendmsg(port, &pmsg->nm_netmsg.nm_lmsg);
+}
+
 static void *
 reallocbuf(void *ptr, size_t len, size_t olen)
 {
@@ -1334,3 +1366,4 @@ static struct domain routedomain = {
 };
 
 DOMAIN_SET(route);
+