Lines Matching defs:imo

290 im6o_grow(struct ip6_moptions *imo, size_t newmax)
299 IM6O_LOCK_ASSERT_HELD(imo);
303 omships = imo->im6o_membership;
304 omfilters = imo->im6o_mfilters;
305 oldmax = imo->im6o_max_memberships;
317 imo->im6o_membership = nmships;
324 imo->im6o_mfilters = nmfilters;
330 imo->im6o_max_memberships = newmax;
341 im6o_match_group(const struct ip6_moptions *imo, const struct ifnet *ifp,
349 IM6O_LOCK_ASSERT_HELD(__DECONST(struct ip6_moptions *, imo));
354 if (imo->im6o_membership == NULL || imo->im6o_num_memberships == 0)
357 nmships = imo->im6o_num_memberships;
359 pinm = imo->im6o_membership[idx];
378 * Find an IPv6 multicast source entry for this imo which matches
389 im6o_match_source(const struct ip6_moptions *imo, const size_t gidx,
397 IM6O_LOCK_ASSERT_HELD(__DECONST(struct ip6_moptions *, imo));
400 VERIFY(gidx != (size_t)-1 && gidx < imo->im6o_num_memberships);
403 if (imo->im6o_mfilters == NULL)
405 imf = &imo->im6o_mfilters[gidx];
422 im6o_mc_filter(const struct ip6_moptions *imo, const struct ifnet *ifp,
429 IM6O_LOCK_ASSERT_HELD(__DECONST(struct ip6_moptions *, imo));
432 gidx = im6o_match_group(imo, ifp, group);
445 mode = imo->im6o_mfilters[gidx].im6f_st[1];
446 ims = im6o_match_source(imo, gidx, src);
1409 struct ip6_moptions *imo;
1475 imo = in6p_findmoptions(inp);
1476 if (imo == NULL)
1479 IM6O_LOCK(imo);
1480 idx = im6o_match_group(imo, ifp, &gsa->sa);
1481 if (idx == (size_t)-1 || imo->im6o_mfilters == NULL) {
1486 VERIFY(imo->im6o_mfilters != NULL);
1487 imf = &imo->im6o_mfilters[idx];
1488 inm = imo->im6o_membership[idx];
1506 ims = im6o_match_source(imo, idx, &ssa->sa);
1562 IM6O_UNLOCK(imo);
1563 IM6O_REMREF(imo); /* from in6p_findmoptions() */
1579 struct ip6_moptions *imo;
1584 if ((imo = inp->in6p_moptions) != NULL) {
1585 IM6O_ADDREF(imo); /* for caller */
1586 return (imo);
1589 imo = ip6_allocmoptions(M_WAITOK);
1590 if (imo == NULL)
1596 IM6O_REMREF(imo);
1604 IM6O_REMREF(imo);
1608 imo->im6o_multicast_ifp = NULL;
1609 imo->im6o_multicast_hlim = ip6_defmcasthlim;
1610 imo->im6o_multicast_loop = in6_mcast_loop;
1611 imo->im6o_num_memberships = 0;
1612 imo->im6o_max_memberships = IPV6_MIN_MEMBERSHIPS;
1613 imo->im6o_membership = immp;
1619 imo->im6o_mfilters = imfp;
1620 inp->in6p_moptions = imo; /* keep reference from ip6_allocmoptions() */
1621 IM6O_ADDREF(imo); /* for caller */
1623 return (imo);
1637 struct ip6_moptions *imo;
1648 imo = inp->in6p_moptions;
1649 VERIFY(imo != NULL);
1697 IM6O_LOCK(imo);
1701 idx = im6o_match_group(imo, ifp, &gsa->sa);
1702 if (idx == (size_t)-1 || imo->im6o_mfilters == NULL) {
1703 IM6O_UNLOCK(imo);
1706 imf = &imo->im6o_mfilters[idx];
1712 IM6O_UNLOCK(imo);
1735 IM6O_UNLOCK(imo);
1765 IM6O_UNLOCK(imo);
1960 struct ip6_moptions *imo;
2119 imo = in6p_findmoptions(inp);
2120 if (imo == NULL)
2123 IM6O_LOCK(imo);
2124 idx = im6o_match_group(imo, ifp, &gsa->sa);
2128 inm = imo->im6o_membership[idx];
2129 imf = &imo->im6o_mfilters[idx];
2156 lims = im6o_match_source(imo, idx, &ssa->sa);
2190 if (imo->im6o_num_memberships == imo->im6o_max_memberships) {
2191 error = im6o_grow(imo, 0);
2200 idx = imo->im6o_num_memberships;
2201 imo->im6o_membership[idx] = NULL;
2202 imo->im6o_num_memberships++;
2203 VERIFY(imo->im6o_mfilters != NULL);
2204 imf = &imo->im6o_mfilters[idx];
2252 imo->im6o_membership[idx] = inm; /* from in6_mc_join() */
2287 imo->im6o_membership[idx] = NULL;
2288 --imo->im6o_num_memberships;
2292 IM6O_UNLOCK(imo);
2293 IM6O_REMREF(imo); /* from in6p_findmoptions() */
2312 struct ip6_moptions *imo;
2480 imo = in6p_findmoptions(inp);
2481 if (imo == NULL)
2484 IM6O_LOCK(imo);
2485 idx = im6o_match_group(imo, ifp, &gsa->sa);
2490 inm = imo->im6o_membership[idx];
2491 imf = &imo->im6o_mfilters[idx];
2511 ims = im6o_match_source(imo, idx, &ssa->sa);
2568 VERIFY(inm == imo->im6o_membership[idx]);
2569 imo->im6o_membership[idx] = NULL;
2571 for (++idx; idx < imo->im6o_num_memberships; ++idx) {
2572 imo->im6o_membership[idx-1] = imo->im6o_membership[idx];
2573 imo->im6o_mfilters[idx-1] = imo->im6o_mfilters[idx];
2575 imo->im6o_num_memberships--;
2579 IM6O_UNLOCK(imo);
2580 IM6O_REMREF(imo); /* from in6p_findmoptions() */
2600 struct ip6_moptions *imo;
2622 imo = in6p_findmoptions(inp);
2623 if (imo == NULL)
2626 IM6O_LOCK(imo);
2627 imo->im6o_multicast_ifp = ifp;
2628 IM6O_UNLOCK(imo);
2629 IM6O_REMREF(imo); /* from in6p_findmoptions() */
2646 struct ip6_moptions *imo;
2710 imo = in6p_findmoptions(inp);
2711 if (imo == NULL)
2714 IM6O_LOCK(imo);
2715 idx = im6o_match_group(imo, ifp, &gsa->sa);
2716 if (idx == (size_t)-1 || imo->im6o_mfilters == NULL) {
2720 inm = imo->im6o_membership[idx];
2721 imf = &imo->im6o_mfilters[idx];
2841 IM6O_UNLOCK(imo);
2842 IM6O_REMREF(imo); /* from in6p_findmoptions() */