Lines Matching defs:imo

286 imo_grow(struct ip_moptions *imo, size_t newmax)
295 IMO_LOCK_ASSERT_HELD(imo);
299 omships = imo->imo_membership;
300 omfilters = imo->imo_mfilters;
301 oldmax = imo->imo_max_memberships;
313 imo->imo_membership = nmships;
320 imo->imo_mfilters = nmfilters;
326 imo->imo_max_memberships = newmax;
337 imo_match_group(const struct ip_moptions *imo, const struct ifnet *ifp,
345 IMO_LOCK_ASSERT_HELD(__DECONST(struct ip_moptions *, imo));
350 if (imo->imo_membership == NULL || imo->imo_num_memberships == 0)
353 nmships = imo->imo_num_memberships;
355 pinm = imo->imo_membership[idx];
373 * Find an IPv4 multicast source entry for this imo which matches
380 imo_match_source(const struct ip_moptions *imo, const size_t gidx,
388 IMO_LOCK_ASSERT_HELD(__DECONST(struct ip_moptions *, imo));
391 VERIFY(gidx != (size_t)-1 && gidx < imo->imo_num_memberships);
394 if (imo->imo_mfilters == NULL)
396 imf = &imo->imo_mfilters[gidx];
413 imo_multi_filter(const struct ip_moptions *imo, const struct ifnet *ifp,
420 IMO_LOCK_ASSERT_HELD(__DECONST(struct ip_moptions *, imo));
423 gidx = imo_match_group(imo, ifp, group);
436 mode = imo->imo_mfilters[gidx].imf_st[1];
437 ims = imo_match_source(imo, gidx, src);
1461 struct ip_moptions *imo;
1556 imo = inp_findmoptions(inp);
1557 if (imo == NULL)
1560 IMO_LOCK(imo);
1561 idx = imo_match_group(imo, ifp, &gsa->sa);
1562 if (idx == (size_t)-1 || imo->imo_mfilters == NULL) {
1567 VERIFY(imo->imo_mfilters != NULL);
1568 imf = &imo->imo_mfilters[idx];
1569 inm = imo->imo_membership[idx];
1587 ims = imo_match_source(imo, idx, &ssa->sa);
1643 IMO_UNLOCK(imo);
1644 IMO_REMREF(imo); /* from inp_findmoptions() */
1656 * extra reference held on the imo, upon a successful return.
1661 struct ip_moptions *imo;
1666 if ((imo = inp->inp_moptions) != NULL) {
1667 IMO_ADDREF(imo); /* for caller */
1668 return (imo);
1671 imo = ip_allocmoptions(M_WAITOK);
1672 if (imo == NULL)
1678 IMO_REMREF(imo);
1686 IMO_REMREF(imo);
1690 imo->imo_multicast_ifp = NULL;
1691 imo->imo_multicast_addr.s_addr = INADDR_ANY;
1692 imo->imo_multicast_vif = -1;
1693 imo->imo_multicast_ttl = IP_DEFAULT_MULTICAST_TTL;
1694 imo->imo_multicast_loop = in_mcast_loop;
1695 imo->imo_num_memberships = 0;
1696 imo->imo_max_memberships = IP_MIN_MEMBERSHIPS;
1697 imo->imo_membership = immp;
1703 imo->imo_mfilters = imfp;
1704 inp->inp_moptions = imo; /* keep reference from ip_allocmoptions() */
1705 IMO_ADDREF(imo); /* for caller */
1707 return (imo);
1719 struct ip_moptions *imo;
1730 imo = inp->inp_moptions;
1731 VERIFY(imo != NULL);
1770 IMO_LOCK(imo);
1775 idx = imo_match_group(imo, ifp, &gsa->sa);
1776 if (idx == (size_t)-1 || imo->imo_mfilters == NULL) {
1777 IMO_UNLOCK(imo);
1780 imf = &imo->imo_mfilters[idx];
1786 IMO_UNLOCK(imo);
1809 IMO_UNLOCK(imo);
1839 IMO_UNLOCK(imo);
1877 struct ip_moptions *imo;
1884 imo = inp->inp_moptions;
1899 if (imo != NULL) {
1900 IMO_LOCK(imo);
1901 ifp = imo->imo_multicast_ifp;
1902 if (!in_nullhost(imo->imo_multicast_addr)) {
1903 mreqn.imr_address = imo->imo_multicast_addr;
1915 IMO_UNLOCK(imo);
1927 if (imo != NULL)
1928 IMO_LOCK(imo);
1929 if (imo == NULL || imo->imo_multicast_ifp == NULL) {
1932 ifindex = imo->imo_multicast_ifp->if_index;
1934 if (imo != NULL)
1935 IMO_UNLOCK(imo);
1940 if (imo == NULL)
1943 IMO_LOCK(imo);
1944 optval = coptval = imo->imo_multicast_ttl;
1945 IMO_UNLOCK(imo);
1954 if (imo == 0)
1957 IMO_LOCK(imo);
1958 optval = coptval = imo->imo_multicast_loop;
1959 IMO_UNLOCK(imo);
1968 if (imo == NULL) {
2071 struct ip_moptions *imo;
2192 imo = inp_findmoptions(inp);
2193 if (imo == NULL)
2196 IMO_LOCK(imo);
2197 idx = imo_match_group(imo, ifp, &gsa->sa);
2201 inm = imo->imo_membership[idx];
2202 imf = &imo->imo_mfilters[idx];
2229 lims = imo_match_source(imo, idx, &ssa->sa);
2263 if (imo->imo_num_memberships == imo->imo_max_memberships) {
2264 error = imo_grow(imo, 0);
2273 idx = imo->imo_num_memberships;
2274 imo->imo_membership[idx] = NULL;
2275 imo->imo_num_memberships++;
2276 VERIFY(imo->imo_mfilters != NULL);
2277 imf = &imo->imo_mfilters[idx];
2320 imo->imo_membership[idx] = inm; /* from in_joingroup() */
2355 imo->imo_membership[idx] = NULL;
2356 --imo->imo_num_memberships;
2360 IMO_UNLOCK(imo);
2361 IMO_REMREF(imo); /* from inp_findmoptions() */
2383 struct ip_moptions *imo;
2497 imo = inp_findmoptions(inp);
2498 if (imo == NULL)
2501 IMO_LOCK(imo);
2502 idx = imo_match_group(imo, ifp, &gsa->sa);
2507 inm = imo->imo_membership[idx];
2508 imf = &imo->imo_mfilters[idx];
2531 ims = imo_match_source(imo, idx, &ssa->sa);
2555 * the membership points. Reference held in imo
2588 VERIFY(inm == imo->imo_membership[idx]);
2589 imo->imo_membership[idx] = NULL;
2591 for (++idx; idx < imo->imo_num_memberships; ++idx) {
2592 imo->imo_membership[idx-1] = imo->imo_membership[idx];
2593 imo->imo_mfilters[idx-1] = imo->imo_mfilters[idx];
2595 imo->imo_num_memberships--;
2599 IMO_UNLOCK(imo);
2600 IMO_REMREF(imo); /* from inp_findmoptions() */
2622 struct ip_moptions *imo;
2683 imo = inp_findmoptions(inp);
2684 if (imo == NULL)
2687 IMO_LOCK(imo);
2688 imo->imo_multicast_ifp = ifp;
2690 imo->imo_multicast_addr = addr;
2692 imo->imo_multicast_addr.s_addr = INADDR_ANY;
2693 IMO_UNLOCK(imo);
2694 IMO_REMREF(imo); /* from inp_findmoptions() */
2710 struct ip_moptions *imo;
2772 imo = inp_findmoptions(inp);
2773 if (imo == NULL)
2776 IMO_LOCK(imo);
2777 idx = imo_match_group(imo, ifp, &gsa->sa);
2778 if (idx == (size_t)-1 || imo->imo_mfilters == NULL) {
2782 inm = imo->imo_membership[idx];
2783 imf = &imo->imo_mfilters[idx];
2893 IMO_UNLOCK(imo);
2894 IMO_REMREF(imo); /* from inp_findmoptions() */
2914 struct ip_moptions *imo;
2944 imo = inp_findmoptions(inp);
2945 if (imo == NULL) {
2955 IMO_LOCK(imo);
2956 imo->imo_multicast_ifp = NULL;
2957 IMO_UNLOCK(imo);
2958 IMO_REMREF(imo); /* from inp_findmoptions() */
2966 IMO_REMREF(imo); /* from inp_findmoptions() */
2975 IMO_REMREF(imo); /* from inp_findmoptions() */
2979 IMO_LOCK(imo);
2980 imo->imo_multicast_ifp = ifp;
2988 imo->imo_multicast_addr.s_addr = INADDR_ANY;
2989 IMO_UNLOCK(imo);
2990 IMO_REMREF(imo); /* from inp_findmoptions() */
3020 imo = inp_findmoptions(inp);
3021 if (imo == NULL) {
3025 IMO_LOCK(imo);
3026 imo->imo_multicast_ttl = ttl;
3027 IMO_UNLOCK(imo);
3028 IMO_REMREF(imo); /* from inp_findmoptions() */
3055 imo = inp_findmoptions(inp);
3056 if (imo == NULL) {
3060 IMO_LOCK(imo);
3061 imo->imo_multicast_loop = !!loop;
3062 IMO_UNLOCK(imo);
3063 IMO_REMREF(imo); /* from inp_findmoptions() */