void so_async_rcvd_drop(struct socket *so) { lwkt_msg_t lmsg = &so->so_rcvd_msg.base.lmsg; spin_lock(&so->so_rcvd_spin); if ((lmsg->ms_flags & MSGF_DONE) == 0) lwkt_dropmsg(lmsg); spin_unlock(&so->so_rcvd_spin); }
void so_async_rcvd_drop(struct socket *so) { lwkt_msg_t lmsg = &so->so_rcvd_msg.base.lmsg; /* * Spinlock safe, drop runs to degenerate lwkt_spin_dropmsg() */ spin_lock(&so->so_rcvd_spin); so->so_rcvd_msg.nm_pru_flags |= PRUR_DEAD; again: lwkt_dropmsg(lmsg); if ((lmsg->ms_flags & MSGF_DONE) == 0) { ++async_rcvd_drop_race; ssleep(so, &so->so_rcvd_spin, 0, "soadrop", 1); goto again; } spin_unlock(&so->so_rcvd_spin); }
/* * Disable multicast routing */ int ip6_mrouter_done(void) { mifi_t mifi; int i; struct ifnet *ifp; struct in6_ifreq ifr; struct mf6c *rt; struct rtdetq *rte; struct lwkt_msg *lmsg = &expire_upcalls_nmsg.lmsg; ASSERT_NETISR0; if (ip6_mrouter == NULL) return EINVAL; /* * For each phyint in use, disable promiscuous reception of all IPv6 * multicasts. */ #ifdef INET #ifdef MROUTING /* * If there is still IPv4 multicast routing daemon, * we remain interfaces to receive all muliticasted packets. * XXX: there may be an interface in which the IPv4 multicast * daemon is not interested... */ if (!ip_mrouter) #endif #endif { for (mifi = 0; mifi < nummifs; mifi++) { if (mif6table[mifi].m6_ifp && !(mif6table[mifi].m6_flags & MIFF_REGISTER)) { ifr.ifr_addr.sin6_family = AF_INET6; ifr.ifr_addr.sin6_addr = kin6addr_any; ifp = mif6table[mifi].m6_ifp; ifnet_serialize_all(ifp); ifp->if_ioctl(ifp, SIOCDELMULTI, (caddr_t)&ifr, NULL); ifnet_deserialize_all(ifp); } } } #ifdef notyet bzero((caddr_t)qtable, sizeof(qtable)); bzero((caddr_t)tbftable, sizeof(tbftable)); #endif bzero((caddr_t)mif6table, sizeof(mif6table)); nummifs = 0; pim6 = 0; /* used to stub out/in pim specific code */ callout_stop(&expire_upcalls_ch); crit_enter(); if ((lmsg->ms_flags & MSGF_DONE) == 0) lwkt_dropmsg(lmsg); crit_exit(); /* * Free all multicast forwarding cache entries. */ for (i = 0; i < MF6CTBLSIZ; i++) { rt = mf6ctable[i]; while (rt) { struct mf6c *frt; for (rte = rt->mf6c_stall; rte != NULL; ) { struct rtdetq *n = rte->next; m_freem(rte->m); kfree(rte, M_MRTABLE); rte = n; } frt = rt; rt = rt->mf6c_next; kfree(frt, M_MRTABLE); } } bzero((caddr_t)mf6ctable, sizeof(mf6ctable)); /* * Reset de-encapsulation cache */ reg_mif_num = -1; ip6_mrouter = NULL; ip6_mrouter_ver = 0; #ifdef MRT6DEBUG if (mrt6debug) log(LOG_DEBUG, "ip6_mrouter_done\n"); #endif return 0; }