Lines Matching defs:imo

293 im6o_grow(struct ip6_moptions *imo, size_t newmax)
302 IM6O_LOCK_ASSERT_HELD(imo);
306 omships = imo->im6o_membership;
307 omfilters = imo->im6o_mfilters;
308 oldmax = imo->im6o_max_memberships;
320 imo->im6o_membership = nmships;
327 imo->im6o_mfilters = nmfilters;
333 imo->im6o_max_memberships = newmax;
344 im6o_match_group(const struct ip6_moptions *imo, const struct ifnet *ifp,
352 IM6O_LOCK_ASSERT_HELD(IM6O_CAST_TO_NONCONST(imo));
357 if (imo->im6o_membership == NULL || imo->im6o_num_memberships == 0)
360 nmships = imo->im6o_num_memberships;
362 pinm = imo->im6o_membership[idx];
381 * Find an IPv6 multicast source entry for this imo which matches
392 im6o_match_source(const struct ip6_moptions *imo, const size_t gidx,
400 IM6O_LOCK_ASSERT_HELD(IM6O_CAST_TO_NONCONST(imo));
403 VERIFY(gidx != (size_t)-1 && gidx < imo->im6o_num_memberships);
406 if (imo->im6o_mfilters == NULL)
408 imf = &imo->im6o_mfilters[gidx];
425 im6o_mc_filter(const struct ip6_moptions *imo, const struct ifnet *ifp,
432 IM6O_LOCK_ASSERT_HELD(IM6O_CAST_TO_NONCONST(imo));
435 gidx = im6o_match_group(imo, ifp, group);
448 mode = imo->im6o_mfilters[gidx].im6f_st[1];
449 ims = im6o_match_source(imo, gidx, src);
1393 struct ip6_moptions *imo;
1457 imo = in6p_findmoptions(inp);
1458 if (imo == NULL)
1461 IM6O_LOCK(imo);
1462 idx = im6o_match_group(imo, ifp, &gsa->sa);
1463 if (idx == (size_t)-1 || imo->im6o_mfilters == NULL) {
1468 VERIFY(imo->im6o_mfilters != NULL);
1469 imf = &imo->im6o_mfilters[idx];
1470 inm = imo->im6o_membership[idx];
1488 ims = im6o_match_source(imo, idx, &ssa->sa);
1544 IM6O_UNLOCK(imo);
1545 IM6O_REMREF(imo); /* from in6p_findmoptions() */
1557 struct ip6_moptions *imo;
1562 if ((imo = inp->in6p_moptions) != NULL) {
1563 IM6O_ADDREF(imo); /* for caller */
1564 return (imo);
1567 imo = ip6_allocmoptions(M_WAITOK);
1568 if (imo == NULL)
1574 IM6O_REMREF(imo);
1582 IM6O_REMREF(imo);
1586 imo->im6o_multicast_ifp = NULL;
1587 imo->im6o_multicast_hlim = ip6_defmcasthlim;
1588 imo->im6o_multicast_loop = in6_mcast_loop;
1589 imo->im6o_num_memberships = 0;
1590 imo->im6o_max_memberships = IPV6_MIN_MEMBERSHIPS;
1591 imo->im6o_membership = immp;
1597 imo->im6o_mfilters = imfp;
1598 inp->in6p_moptions = imo; /* keep reference from ip6_allocmoptions() */
1599 IM6O_ADDREF(imo); /* for caller */
1601 return (imo);
1615 struct ip6_moptions *imo;
1626 imo = inp->in6p_moptions;
1627 VERIFY(imo != NULL);
1675 IM6O_LOCK(imo);
1679 idx = im6o_match_group(imo, ifp, &gsa->sa);
1680 if (idx == (size_t)-1 || imo->im6o_mfilters == NULL) {
1681 IM6O_UNLOCK(imo);
1684 imf = &imo->im6o_mfilters[idx];
1690 IM6O_UNLOCK(imo);
1713 IM6O_UNLOCK(imo);
1743 IM6O_UNLOCK(imo);
1938 struct ip6_moptions *imo;
2094 imo = in6p_findmoptions(inp);
2095 if (imo == NULL)
2098 IM6O_LOCK(imo);
2099 idx = im6o_match_group(imo, ifp, &gsa->sa);
2103 inm = imo->im6o_membership[idx];
2104 imf = &imo->im6o_mfilters[idx];
2131 lims = im6o_match_source(imo, idx, &ssa->sa);
2165 if (imo->im6o_num_memberships == imo->im6o_max_memberships) {
2166 error = im6o_grow(imo, 0);
2175 idx = imo->im6o_num_memberships;
2176 imo->im6o_membership[idx] = NULL;
2177 imo->im6o_num_memberships++;
2178 VERIFY(imo->im6o_mfilters != NULL);
2179 imf = &imo->im6o_mfilters[idx];
2227 imo->im6o_membership[idx] = inm; /* from in6_mc_join() */
2262 imo->im6o_membership[idx] = NULL;
2263 --imo->im6o_num_memberships;
2267 IM6O_UNLOCK(imo);
2268 IM6O_REMREF(imo); /* from in6p_findmoptions() */
2283 struct ip6_moptions *imo;
2448 imo = in6p_findmoptions(inp);
2449 if (imo == NULL)
2452 IM6O_LOCK(imo);
2453 idx = im6o_match_group(imo, ifp, &gsa->sa);
2458 inm = imo->im6o_membership[idx];
2459 imf = &imo->im6o_mfilters[idx];
2479 ims = im6o_match_source(imo, idx, &ssa->sa);
2536 VERIFY(inm == imo->im6o_membership[idx]);
2537 imo->im6o_membership[idx] = NULL;
2539 for (++idx; idx < imo->im6o_num_memberships; ++idx) {
2540 imo->im6o_membership[idx-1] = imo->im6o_membership[idx];
2541 imo->im6o_mfilters[idx-1] = imo->im6o_mfilters[idx];
2543 imo->im6o_num_memberships--;
2547 IM6O_UNLOCK(imo);
2548 IM6O_REMREF(imo); /* from in6p_findmoptions() */
2564 struct ip6_moptions *imo;
2586 imo = in6p_findmoptions(inp);
2587 if (imo == NULL)
2590 IM6O_LOCK(imo);
2591 imo->im6o_multicast_ifp = ifp;
2592 IM6O_UNLOCK(imo);
2593 IM6O_REMREF(imo); /* from in6p_findmoptions() */
2610 struct ip6_moptions *imo;
2671 imo = in6p_findmoptions(inp);
2672 if (imo == NULL)
2675 IM6O_LOCK(imo);
2676 idx = im6o_match_group(imo, ifp, &gsa->sa);
2677 if (idx == (size_t)-1 || imo->im6o_mfilters == NULL) {
2681 inm = imo->im6o_membership[idx];
2682 imf = &imo->im6o_mfilters[idx];
2802 IM6O_UNLOCK(imo);
2803 IM6O_REMREF(imo); /* from in6p_findmoptions() */