Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
/*
 * 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;
}