Lines Matching refs:imo

289 imo_grow(struct ip_moptions *imo, size_t newmax)
298 IMO_LOCK_ASSERT_HELD(imo);
302 omships = imo->imo_membership;
303 omfilters = imo->imo_mfilters;
304 oldmax = imo->imo_max_memberships;
316 imo->imo_membership = nmships;
323 imo->imo_mfilters = nmfilters;
329 imo->imo_max_memberships = newmax;
340 imo_match_group(const struct ip_moptions *imo, const struct ifnet *ifp,
348 IMO_LOCK_ASSERT_HELD(IMO_CAST_TO_NONCONST(imo));
353 if (imo->imo_membership == NULL || imo->imo_num_memberships == 0)
356 nmships = imo->imo_num_memberships;
358 pinm = imo->imo_membership[idx];
376 * Find an IPv4 multicast source entry for this imo which matches
383 imo_match_source(const struct ip_moptions *imo, const size_t gidx,
391 IMO_LOCK_ASSERT_HELD(IMO_CAST_TO_NONCONST(imo));
394 VERIFY(gidx != (size_t)-1 && gidx < imo->imo_num_memberships);
397 if (imo->imo_mfilters == NULL)
399 imf = &imo->imo_mfilters[gidx];
416 imo_multi_filter(const struct ip_moptions *imo, const struct ifnet *ifp,
423 IMO_LOCK_ASSERT_HELD(IMO_CAST_TO_NONCONST(imo));
426 gidx = imo_match_group(imo, ifp, group);
439 mode = imo->imo_mfilters[gidx].imf_st[1];
440 ims = imo_match_source(imo, gidx, src);
1437 struct ip_moptions *imo;
1529 imo = inp_findmoptions(inp);
1530 if (imo == NULL)
1533 IMO_LOCK(imo);
1534 idx = imo_match_group(imo, ifp, &gsa->sa);
1535 if (idx == (size_t)-1 || imo->imo_mfilters == NULL) {
1540 VERIFY(imo->imo_mfilters != NULL);
1541 imf = &imo->imo_mfilters[idx];
1542 inm = imo->imo_membership[idx];
1560 ims = imo_match_source(imo, idx, &ssa->sa);
1615 IMO_UNLOCK(imo);
1616 IMO_REMREF(imo); /* from inp_findmoptions() */
1624 * extra reference held on the imo, upon a successful return.
1629 struct ip_moptions *imo;
1634 if ((imo = inp->inp_moptions) != NULL) {
1635 IMO_ADDREF(imo); /* for caller */
1636 return (imo);
1639 imo = ip_allocmoptions(M_WAITOK);
1640 if (imo == NULL)
1646 IMO_REMREF(imo);
1654 IMO_REMREF(imo);
1658 imo->imo_multicast_ifp = NULL;
1659 imo->imo_multicast_addr.s_addr = INADDR_ANY;
1660 imo->imo_multicast_vif = -1;
1661 imo->imo_multicast_ttl = IP_DEFAULT_MULTICAST_TTL;
1662 imo->imo_multicast_loop = in_mcast_loop;
1663 imo->imo_num_memberships = 0;
1664 imo->imo_max_memberships = IP_MIN_MEMBERSHIPS;
1665 imo->imo_membership = immp;
1671 imo->imo_mfilters = imfp;
1672 inp->inp_moptions = imo; /* keep reference from ip_allocmoptions() */
1673 IMO_ADDREF(imo); /* for caller */
1675 return (imo);
1687 struct ip_moptions *imo;
1698 imo = inp->inp_moptions;
1699 VERIFY(imo != NULL);
1738 IMO_LOCK(imo);
1743 idx = imo_match_group(imo, ifp, &gsa->sa);
1744 if (idx == (size_t)-1 || imo->imo_mfilters == NULL) {
1745 IMO_UNLOCK(imo);
1748 imf = &imo->imo_mfilters[idx];
1754 IMO_UNLOCK(imo);
1777 IMO_UNLOCK(imo);
1807 IMO_UNLOCK(imo);
1845 struct ip_moptions *imo;
1852 imo = inp->inp_moptions;
1867 if (imo != NULL) {
1868 IMO_LOCK(imo);
1869 optval = imo->imo_multicast_vif;
1870 IMO_UNLOCK(imo);
1879 if (imo != NULL) {
1880 IMO_LOCK(imo);
1881 ifp = imo->imo_multicast_ifp;
1882 if (!in_nullhost(imo->imo_multicast_addr)) {
1883 mreqn.imr_address = imo->imo_multicast_addr;
1895 IMO_UNLOCK(imo);
1907 if (imo != NULL)
1908 IMO_LOCK(imo);
1909 if (imo == NULL || imo->imo_multicast_ifp == NULL) {
1912 ifindex = imo->imo_multicast_ifp->if_index;
1914 if (imo != NULL)
1915 IMO_UNLOCK(imo);
1920 if (imo == NULL)
1923 IMO_LOCK(imo);
1924 optval = coptval = imo->imo_multicast_ttl;
1925 IMO_UNLOCK(imo);
1934 if (imo == 0)
1937 IMO_LOCK(imo);
1938 optval = coptval = imo->imo_multicast_loop;
1939 IMO_UNLOCK(imo);
1948 if (imo == NULL) {
2051 struct ip_moptions *imo;
2169 imo = inp_findmoptions(inp);
2170 if (imo == NULL)
2173 IMO_LOCK(imo);
2174 idx = imo_match_group(imo, ifp, &gsa->sa);
2178 inm = imo->imo_membership[idx];
2179 imf = &imo->imo_mfilters[idx];
2206 lims = imo_match_source(imo, idx, &ssa->sa);
2240 if (imo->imo_num_memberships == imo->imo_max_memberships) {
2241 error = imo_grow(imo, 0);
2250 idx = imo->imo_num_memberships;
2251 imo->imo_membership[idx] = NULL;
2252 imo->imo_num_memberships++;
2253 VERIFY(imo->imo_mfilters != NULL);
2254 imf = &imo->imo_mfilters[idx];
2297 imo->imo_membership[idx] = inm; /* from in_joingroup() */
2332 imo->imo_membership[idx] = NULL;
2333 --imo->imo_num_memberships;
2337 IMO_UNLOCK(imo);
2338 IMO_REMREF(imo); /* from inp_findmoptions() */
2356 struct ip_moptions *imo;
2467 imo = inp_findmoptions(inp);
2468 if (imo == NULL)
2471 IMO_LOCK(imo);
2472 idx = imo_match_group(imo, ifp, &gsa->sa);
2477 inm = imo->imo_membership[idx];
2478 imf = &imo->imo_mfilters[idx];
2501 ims = imo_match_source(imo, idx, &ssa->sa);
2524 * the membership points. Reference held in imo
2557 VERIFY(inm == imo->imo_membership[idx]);
2558 imo->imo_membership[idx] = NULL;
2560 for (++idx; idx < imo->imo_num_memberships; ++idx) {
2561 imo->imo_membership[idx-1] = imo->imo_membership[idx];
2562 imo->imo_mfilters[idx-1] = imo->imo_mfilters[idx];
2564 imo->imo_num_memberships--;
2568 IMO_UNLOCK(imo);
2569 IMO_REMREF(imo); /* from inp_findmoptions() */
2587 struct ip_moptions *imo;
2646 imo = inp_findmoptions(inp);
2647 if (imo == NULL)
2650 IMO_LOCK(imo);
2651 imo->imo_multicast_ifp = ifp;
2653 imo->imo_multicast_addr = addr;
2655 imo->imo_multicast_addr.s_addr = INADDR_ANY;
2656 IMO_UNLOCK(imo);
2657 IMO_REMREF(imo); /* from inp_findmoptions() */
2673 struct ip_moptions *imo;
2732 imo = inp_findmoptions(inp);
2733 if (imo == NULL)
2736 IMO_LOCK(imo);
2737 idx = imo_match_group(imo, ifp, &gsa->sa);
2738 if (idx == (size_t)-1 || imo->imo_mfilters == NULL) {
2742 inm = imo->imo_membership[idx];
2743 imf = &imo->imo_mfilters[idx];
2853 IMO_UNLOCK(imo);
2854 IMO_REMREF(imo); /* from inp_findmoptions() */
2874 struct ip_moptions *imo;
2909 imo = inp_findmoptions(inp);
2910 if (imo == NULL) {
2914 IMO_LOCK(imo);
2915 imo->imo_multicast_vif = vifi;
2916 IMO_UNLOCK(imo);
2917 IMO_REMREF(imo); /* from inp_findmoptions() */
2934 imo = inp_findmoptions(inp);
2935 if (imo == NULL) {
2945 IMO_LOCK(imo);
2946 imo->imo_multicast_ifp = NULL;
2947 IMO_UNLOCK(imo);
2948 IMO_REMREF(imo); /* from inp_findmoptions() */
2956 IMO_REMREF(imo); /* from inp_findmoptions() */
2965 IMO_REMREF(imo); /* from inp_findmoptions() */
2969 IMO_LOCK(imo);
2970 imo->imo_multicast_ifp = ifp;
2978 imo->imo_multicast_addr.s_addr = INADDR_ANY;
2979 IMO_UNLOCK(imo);
2980 IMO_REMREF(imo); /* from inp_findmoptions() */
3010 imo = inp_findmoptions(inp);
3011 if (imo == NULL) {
3015 IMO_LOCK(imo);
3016 imo->imo_multicast_ttl = ttl;
3017 IMO_UNLOCK(imo);
3018 IMO_REMREF(imo); /* from inp_findmoptions() */
3045 imo = inp_findmoptions(inp);
3046 if (imo == NULL) {
3050 IMO_LOCK(imo);
3051 imo->imo_multicast_loop = !!loop;
3052 IMO_UNLOCK(imo);
3053 IMO_REMREF(imo); /* from inp_findmoptions() */