Factor out 'curnetport'
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 27 Dec 2008 07:55:04 +0000 (15:55 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 27 Dec 2008 08:00:33 +0000 (16:00 +0800)
This macro returns the current thread's msgport, if the current thread
is a network protocol thread, else the current CPU's netisr msgport is
returned; the latter case should be fixed.

sys/net/bridge/if_bridge.c
sys/net/ipfw/ip_fw2.c
sys/net/netisr.c
sys/net/netisr.h
sys/netinet/if_ether.c

index 150632a..c7469c6 100644 (file)
@@ -1821,7 +1821,6 @@ void
 bridge_enqueue(struct ifnet *dst_ifp, struct mbuf *m)
 {
        struct netmsg_packet *nmp;
-       lwkt_port_t port;
 
        nmp = &m->m_hdr.mh_netmsg;
        netmsg_init(&nmp->nm_netmsg, &netisr_apanic_rport, 0,
@@ -1829,11 +1828,7 @@ bridge_enqueue(struct ifnet *dst_ifp, struct mbuf *m)
        nmp->nm_packet = m;
        nmp->nm_netmsg.nm_lmsg.u.ms_resultp = dst_ifp;
 
-       if (curthread->td_flags & TDF_NETWORK)
-               port = &curthread->td_msgport;
-       else
-               port = cpu_portfn(mycpuid);
-       lwkt_sendmsg(port, &nmp->nm_netmsg.nm_lmsg);
+       lwkt_sendmsg(curnetport, &nmp->nm_netmsg.nm_lmsg);
 }
 
 /*
index e17a2f6..afbc59b 100644 (file)
@@ -2482,20 +2482,7 @@ ipfw_dummynet_io(struct mbuf *m, int pipe_nr, int dir, struct ip_fw_args *fwa)
        pkt->pipe_nr = pipe_nr;
 
        pkt->cpuid = mycpuid;
-       if (curthread->td_flags & TDF_NETWORK) {
-               pkt->msgport = &curthread->td_msgport;
-       } else {
-               /*
-                * This could happen:
-                * - If a gratuitous arp request sent by us is going to
-                *   be added to dummynet(4) pipe/queue.
-                * - Other conditions ...
-                *
-                * We can't use current thread's msgport (since its
-                * behaviour is unknown), so netisrX's msgport is used.
-                */
-               pkt->msgport = cpu_portfn(pkt->cpuid);
-       }
+       pkt->msgport = curnetport;
 
        id = &fwa->f_id;
        fid = &pkt->id;
index b8d17ac..3b1c322 100644 (file)
@@ -421,6 +421,20 @@ cpu_portfn(int cpu)
     return (&netisr_cpu[cpu].td_msgport);
 }
 
+/*
+ * If the current thread is a network protocol thread (TDF_NETWORK),
+ * then return the current thread's message port.
+ * XXX Else, return the current CPU's netisr message port.
+ */
+lwkt_port_t
+cur_netport(void)
+{
+    if (curthread->td_flags & TDF_NETWORK)
+       return &curthread->td_msgport;
+    else
+       return cpu_portfn(mycpuid);
+}
+
 /* ARGSUSED */
 lwkt_port_t
 cpu0_soport(struct socket *so __unused, struct sockaddr *nam __unused,
index 029fc46..28dfe11 100644 (file)
@@ -223,6 +223,7 @@ extern lwkt_port netisr_apanic_rport;
 
 lwkt_port_t    cpu0_portfn(struct mbuf **mptr);
 lwkt_port_t    cpu_portfn(int cpu);
+lwkt_port_t    cur_netport(void);
 lwkt_port_t    netisr_find_port(int, struct mbuf **);
 void           netisr_dispatch(int, struct mbuf *);
 void           netisr_run(int, struct mbuf *);
@@ -235,6 +236,8 @@ int         netmsg_service(struct netmsg *, int, int);
 void           netmsg_service_sync(void);
 void           schednetisr(int);
 
+#define curnetport     cur_netport()
+
 #endif /* _KERNEL */
 
 #endif /* _NET_NETISR_H_ */
index 5fddc35..a8a0c8d 100644 (file)
@@ -524,10 +524,7 @@ arpresolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m,
        if (la->la_hold != NULL)
                m_freem(la->la_hold);
        la->la_hold = m;
-       if (curthread->td_flags & TDF_NETWORK)
-               la->la_msgport = &curthread->td_msgport;
-       else
-               la->la_msgport = cpu_portfn(mycpuid);
+       la->la_msgport = curnetport;
        if (rt->rt_expire || ((rt->rt_flags & RTF_STATIC) && !sdl->sdl_alen)) {
                rt->rt_flags &= ~RTF_REJECT;
                if (la->la_asked == 0 || rt->rt_expire != time_second) {