return isr;
}
+static void
+ether_demux_handler(netmsg_t nmsg)
+{
+ struct netmsg_packet *nmp = &nmsg->packet; /* actual size */
+ struct ifnet *ifp;
+ struct mbuf *m;
+
+ m = nmp->nm_packet;
+ M_ASSERTPKTHDR(m);
+ ifp = m->m_pkthdr.rcvif;
+
+ ether_demux_oncpu(ifp, m);
+}
+
+void
+ether_demux(struct mbuf *m)
+{
+ struct netmsg_packet *pmsg;
+ int isr;
+
+ isr = ether_characterize(&m);
+ if (m == NULL)
+ return;
+
+ KKASSERT(m->m_flags & M_HASH);
+ pmsg = &m->m_hdr.mh_netmsg;
+ netmsg_init(&pmsg->base, NULL, &netisr_apanic_rport,
+ 0, ether_demux_handler);
+ pmsg->nm_packet = m;
+ pmsg->base.lmsg.u.ms_result = isr;
+
+ lwkt_sendmsg(cpu_portfn(m->m_pkthdr.hash), &pmsg->base.lmsg);
+}
+
MODULE_VERSION(ether, 1);
void ether_ifattach_bpf(struct ifnet *, uint8_t *, u_int, u_int,
struct lwkt_serialize *);
void ether_ifdetach(struct ifnet *);
+void ether_demux(struct mbuf *);
void ether_demux_oncpu(struct ifnet *, struct mbuf *);
void ether_reinput_oncpu(struct ifnet *, struct mbuf *, int);
void ether_input_chain(struct ifnet *, struct mbuf *,
m->m_pkthdr.rcvif = priv->ifp;
- /*
- * XXX
- * Since frame processing is run in netisr0,
- * 'm' may _not_ even on its target CPU.
- */
/* Route packet back in */
- ether_demux_oncpu(priv->ifp, m);
+ ether_demux(m);
return (0);
}