Lines Matching refs:in_dev

122 #define IGMP_V1_SEEN(in_dev) \
123 (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 1 || \
124 IN_DEV_CONF_GET((in_dev), FORCE_IGMP_VERSION) == 1 || \
125 ((in_dev)->mr_v1_seen && \
126 time_before(jiffies, (in_dev)->mr_v1_seen)))
127 #define IGMP_V2_SEEN(in_dev) \
128 (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 2 || \
129 IN_DEV_CONF_GET((in_dev), FORCE_IGMP_VERSION) == 2 || \
130 ((in_dev)->mr_v2_seen && \
131 time_before(jiffies, (in_dev)->mr_v2_seen)))
133 static int unsolicited_report_interval(struct in_device *in_dev)
137 if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev))
139 in_dev,
143 in_dev,
156 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im,
158 static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im);
159 static void igmpv3_clear_delrec(struct in_device *in_dev);
164 static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
175 #define for_each_pmc_rcu(in_dev, pmc) \
176 for (pmc = rcu_dereference(in_dev->mc_list); \
180 #define for_each_pmc_rtnl(in_dev, pmc) \
181 for (pmc = rtnl_dereference(in_dev->mc_list); \
225 static void igmp_gq_start_timer(struct in_device *in_dev)
227 int tv = prandom_u32() % in_dev->mr_maxdelay;
230 if (in_dev->mr_gq_running &&
231 time_after_eq(exp, (in_dev->mr_gq_timer).expires))
234 in_dev->mr_gq_running = 1;
235 if (!mod_timer(&in_dev->mr_gq_timer, exp))
236 in_dev_hold(in_dev);
239 static void igmp_ifc_start_timer(struct in_device *in_dev, int delay)
243 if (!mod_timer(&in_dev->mr_ifc_timer, jiffies+tv+2))
244 in_dev_hold(in_dev);
334 struct in_device *in_dev = __in_dev_get_rcu(dev);
337 if (!in_dev)
340 in_dev_for_each_ifa_rcu(ifa, in_dev) {
588 static int igmpv3_send_report(struct in_device *in_dev, struct ip_mc_list *pmc)
591 struct net *net = dev_net(in_dev->dev);
596 for_each_pmc_rcu(in_dev, pmc) {
653 static void igmpv3_send_cr(struct in_device *in_dev)
660 spin_lock_bh(&in_dev->mc_tomb_lock);
664 for (pmc = in_dev->mc_tomb; pmc; pmc = pmc_next) {
687 in_dev->mc_tomb = pmc_next;
693 spin_unlock_bh(&in_dev->mc_tomb_lock);
696 for_each_pmc_rcu(in_dev, pmc) {
726 static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
733 struct net_device *dev = in_dev->dev;
741 return igmpv3_send_report(in_dev, pmc);
801 struct in_device *in_dev = from_timer(in_dev, t, mr_gq_timer);
803 in_dev->mr_gq_running = 0;
804 igmpv3_send_report(in_dev, NULL);
805 in_dev_put(in_dev);
810 struct in_device *in_dev = from_timer(in_dev, t, mr_ifc_timer);
813 igmpv3_send_cr(in_dev);
815 mr_ifc_count = READ_ONCE(in_dev->mr_ifc_count);
818 if (cmpxchg(&in_dev->mr_ifc_count,
822 igmp_ifc_start_timer(in_dev,
823 unsolicited_report_interval(in_dev));
825 in_dev_put(in_dev);
828 static void igmp_ifc_event(struct in_device *in_dev)
830 struct net *net = dev_net(in_dev->dev);
831 if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev))
833 WRITE_ONCE(in_dev->mr_ifc_count, in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv));
834 igmp_ifc_start_timer(in_dev, 1);
841 struct in_device *in_dev = im->interface;
847 igmp_start_timer(im, unsolicited_report_interval(in_dev));
852 if (IGMP_V1_SEEN(in_dev))
853 igmp_send_report(in_dev, im, IGMP_HOST_MEMBERSHIP_REPORT);
854 else if (IGMP_V2_SEEN(in_dev))
855 igmp_send_report(in_dev, im, IGMPV2_HOST_MEMBERSHIP_REPORT);
857 igmp_send_report(in_dev, im, IGMPV3_HOST_MEMBERSHIP_REPORT);
919 static bool igmp_heard_report(struct in_device *in_dev, __be32 group)
922 struct net *net = dev_net(in_dev->dev);
933 for_each_pmc_rcu(in_dev, im) {
944 static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
953 struct net *net = dev_net(in_dev->dev);
961 in_dev->mr_v1_seen = jiffies +
962 (in_dev->mr_qrv * in_dev->mr_qi) +
963 in_dev->mr_qri;
968 in_dev->mr_v2_seen = jiffies +
969 (in_dev->mr_qrv * in_dev->mr_qi) +
970 in_dev->mr_qri;
973 WRITE_ONCE(in_dev->mr_ifc_count, 0);
974 if (del_timer(&in_dev->mr_ifc_timer))
975 __in_dev_put(in_dev);
977 igmpv3_clear_delrec(in_dev);
980 } else if (IGMP_V1_SEEN(in_dev)) {
984 } else if (IGMP_V2_SEEN(in_dev)) {
1009 in_dev->mr_maxdelay = max_delay;
1015 in_dev->mr_qrv = ih3->qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv);
1016 in_dev->mr_qi = IGMPV3_QQIC(ih3->qqic)*HZ ?: IGMP_QUERY_INTERVAL;
1022 if (in_dev->mr_qri >= in_dev->mr_qi)
1023 in_dev->mr_qri = (in_dev->mr_qi/HZ - 1)*HZ;
1028 igmp_gq_start_timer(in_dev);
1046 for_each_pmc_rcu(in_dev, im) {
1077 struct in_device *in_dev;
1087 in_dev = __in_dev_get_rcu(dev);
1088 if (!in_dev)
1100 dropped = igmp_heard_query(in_dev, skb, len);
1110 dropped = igmp_heard_report(in_dev, ih->group);
1142 static void ip_mc_filter_add(struct in_device *in_dev, __be32 addr)
1145 struct net_device *dev = in_dev->dev;
1162 static void ip_mc_filter_del(struct in_device *in_dev, __be32 addr)
1165 struct net_device *dev = in_dev->dev;
1175 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im,
1179 struct net *net = dev_net(in_dev->dev);
1193 in_dev_hold(in_dev);
1195 pmc->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv);
1208 spin_lock_bh(&in_dev->mc_tomb_lock);
1209 pmc->next = in_dev->mc_tomb;
1210 in_dev->mc_tomb = pmc;
1211 spin_unlock_bh(&in_dev->mc_tomb_lock);
1217 static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im)
1221 struct net *net = dev_net(in_dev->dev);
1224 spin_lock_bh(&in_dev->mc_tomb_lock);
1226 for (pmc = in_dev->mc_tomb; pmc; pmc = pmc->next) {
1235 in_dev->mc_tomb = pmc->next;
1237 spin_unlock_bh(&in_dev->mc_tomb_lock);
1246 psf->sf_crcount = in_dev->mr_qrv ?:
1249 im->crcount = in_dev->mr_qrv ?:
1261 static void igmpv3_clear_delrec(struct in_device *in_dev)
1265 spin_lock_bh(&in_dev->mc_tomb_lock);
1266 pmc = in_dev->mc_tomb;
1267 in_dev->mc_tomb = NULL;
1268 spin_unlock_bh(&in_dev->mc_tomb_lock);
1278 for_each_pmc_rcu(in_dev, pmc) {
1293 struct in_device *in_dev = im->interface;
1295 struct net *net = dev_net(in_dev->dev);
1301 ip_mc_filter_del(in_dev, im->multiaddr);
1314 if (!in_dev->dead) {
1315 if (IGMP_V1_SEEN(in_dev))
1317 if (IGMP_V2_SEEN(in_dev)) {
1319 igmp_send_report(in_dev, im, IGMP_HOST_LEAVE_MESSAGE);
1323 igmpv3_add_delrec(in_dev, im, gfp);
1325 igmp_ifc_event(in_dev);
1337 struct in_device *in_dev = im->interface;
1339 struct net *net = dev_net(in_dev->dev);
1344 ip_mc_filter_add(in_dev, im->multiaddr);
1354 if (in_dev->dead)
1358 if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev)) {
1371 im->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv);
1373 igmp_ifc_event(in_dev);
1387 static void ip_mc_hash_add(struct in_device *in_dev,
1393 mc_hash = rtnl_dereference(in_dev->mc_hash);
1402 if (in_dev->mc_count < 4)
1410 for_each_pmc_rtnl(in_dev, im) {
1416 rcu_assign_pointer(in_dev->mc_hash, mc_hash);
1419 static void ip_mc_hash_remove(struct in_device *in_dev,
1422 struct ip_mc_list __rcu **mc_hash = rtnl_dereference(in_dev->mc_hash);
1437 static void ____ip_mc_inc_group(struct in_device *in_dev, __be32 addr,
1444 for_each_pmc_rtnl(in_dev, im) {
1447 ip_mc_add_src(in_dev, &addr, mode, 0, NULL, 0);
1457 im->interface = in_dev;
1458 in_dev_hold(in_dev);
1469 im->next_rcu = in_dev->mc_list;
1470 in_dev->mc_count++;
1471 rcu_assign_pointer(in_dev->mc_list, im);
1473 ip_mc_hash_add(in_dev, im);
1476 igmpv3_del_delrec(in_dev, im);
1479 if (!in_dev->dead)
1480 ip_rt_multicast_event(in_dev);
1485 void __ip_mc_inc_group(struct in_device *in_dev, __be32 addr, gfp_t gfp)
1487 ____ip_mc_inc_group(in_dev, addr, MCAST_EXCLUDE, gfp);
1491 void ip_mc_inc_group(struct in_device *in_dev, __be32 addr)
1493 __ip_mc_inc_group(in_dev, addr, GFP_KERNEL);
1642 static void ip_mc_rejoin_groups(struct in_device *in_dev)
1647 struct net *net = dev_net(in_dev->dev);
1651 for_each_pmc_rtnl(in_dev, im) {
1661 if (IGMP_V1_SEEN(in_dev))
1663 else if (IGMP_V2_SEEN(in_dev))
1667 igmp_send_report(in_dev, im, type);
1676 void __ip_mc_dec_group(struct in_device *in_dev, __be32 addr, gfp_t gfp)
1683 for (ip = &in_dev->mc_list;
1688 ip_mc_hash_remove(in_dev, i);
1690 in_dev->mc_count--;
1694 if (!in_dev->dead)
1695 ip_rt_multicast_event(in_dev);
1708 void ip_mc_unmap(struct in_device *in_dev)
1714 for_each_pmc_rtnl(in_dev, pmc)
1718 void ip_mc_remap(struct in_device *in_dev)
1724 for_each_pmc_rtnl(in_dev, pmc) {
1726 igmpv3_del_delrec(in_dev, pmc);
1734 void ip_mc_down(struct in_device *in_dev)
1740 for_each_pmc_rtnl(in_dev, pmc)
1744 WRITE_ONCE(in_dev->mr_ifc_count, 0);
1745 if (del_timer(&in_dev->mr_ifc_timer))
1746 __in_dev_put(in_dev);
1747 in_dev->mr_gq_running = 0;
1748 if (del_timer(&in_dev->mr_gq_timer))
1749 __in_dev_put(in_dev);
1752 ip_mc_dec_group(in_dev, IGMP_ALL_HOSTS);
1756 static void ip_mc_reset(struct in_device *in_dev)
1758 struct net *net = dev_net(in_dev->dev);
1760 in_dev->mr_qi = IGMP_QUERY_INTERVAL;
1761 in_dev->mr_qri = IGMP_QUERY_RESPONSE_INTERVAL;
1762 in_dev->mr_qrv = READ_ONCE(net->ipv4.sysctl_igmp_qrv);
1765 static void ip_mc_reset(struct in_device *in_dev)
1770 void ip_mc_init_dev(struct in_device *in_dev)
1775 timer_setup(&in_dev->mr_gq_timer, igmp_gq_timer_expire, 0);
1776 timer_setup(&in_dev->mr_ifc_timer, igmp_ifc_timer_expire, 0);
1778 ip_mc_reset(in_dev);
1780 spin_lock_init(&in_dev->mc_tomb_lock);
1785 void ip_mc_up(struct in_device *in_dev)
1791 ip_mc_reset(in_dev);
1792 ip_mc_inc_group(in_dev, IGMP_ALL_HOSTS);
1794 for_each_pmc_rtnl(in_dev, pmc) {
1796 igmpv3_del_delrec(in_dev, pmc);
1806 void ip_mc_destroy_dev(struct in_device *in_dev)
1813 ip_mc_down(in_dev);
1815 igmpv3_clear_delrec(in_dev);
1818 while ((i = rtnl_dereference(in_dev->mc_list)) != NULL) {
1819 in_dev->mc_list = i->next_rcu;
1820 in_dev->mc_count--;
1884 struct in_device *in_dev = pmc->interface;
1885 struct net *net = dev_net(in_dev->dev);
1895 !IGMP_V1_SEEN(in_dev) && !IGMP_V2_SEEN(in_dev)) {
1896 psf->sf_crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv);
1911 static int ip_mc_del_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
1918 if (!in_dev)
1921 for_each_pmc_rcu(in_dev, pmc) {
1954 struct net *net = dev_net(in_dev->dev);
1960 pmc->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv);
1961 WRITE_ONCE(in_dev->mr_ifc_count, pmc->crcount);
2083 static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
2090 if (!in_dev)
2093 for_each_pmc_rcu(in_dev, pmc) {
2128 in_dev = pmc->interface;
2139 pmc->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv);
2140 WRITE_ONCE(in_dev->mr_ifc_count, pmc->crcount);
2143 igmp_ifc_event(in_dev);
2145 igmp_ifc_event(in_dev);
2177 struct in_device *in_dev;
2189 in_dev = ip_mc_find_dev(net, imr);
2191 if (!in_dev) {
2216 ____ip_mc_inc_group(in_dev, addr, mode, GFP_KERNEL);
2239 struct in_device *in_dev)
2246 return ip_mc_del_src(in_dev, &iml->multi.imr_multiaddr.s_addr,
2249 err = ip_mc_del_src(in_dev, &iml->multi.imr_multiaddr.s_addr,
2263 struct in_device *in_dev;
2271 in_dev = ip_mc_find_dev(net, imr);
2272 if (!imr->imr_ifindex && !imr->imr_address.s_addr && !in_dev) {
2289 (void) ip_mc_leave_src(sk, iml, in_dev);
2293 if (in_dev)
2294 ip_mc_dec_group(in_dev, group);
2313 struct in_device *in_dev = NULL;
2328 in_dev = ip_mc_find_dev(net, &imr);
2330 if (!in_dev) {
2354 ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 0, NULL, 0);
2355 ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, pmc->sfmode, 0,
2381 ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, omode, 1,
2435 ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 1,
2449 struct in_device *in_dev;
2466 in_dev = ip_mc_find_dev(net, &imr);
2468 if (!in_dev) {
2498 err = ip_mc_add_src(in_dev, &msf->imsf_multiaddr,
2506 (void) ip_mc_add_src(in_dev, &msf->imsf_multiaddr,
2511 (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
2516 (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
2537 struct in_device *in_dev;
2550 in_dev = ip_mc_find_dev(net, &imr);
2552 if (!in_dev) {
2694 struct in_device *in_dev;
2697 in_dev = inetdev_by_index(net, iml->multi.imr_ifindex);
2698 (void) ip_mc_leave_src(sk, iml, in_dev);
2699 if (in_dev)
2700 ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr);
2709 int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u8 proto)
2716 mc_hash = rcu_dereference(in_dev->mc_hash);
2727 for_each_pmc_rcu(in_dev, im) {
2758 struct in_device *in_dev;
2769 state->in_dev = NULL;
2771 struct in_device *in_dev;
2773 in_dev = __in_dev_get_rcu(state->dev);
2774 if (!in_dev)
2776 im = rcu_dereference(in_dev->mc_list);
2778 state->in_dev = in_dev;
2793 state->in_dev = NULL;
2796 state->in_dev = __in_dev_get_rcu(state->dev);
2797 if (!state->in_dev)
2799 im = rcu_dereference(state->in_dev->mc_list);
2836 state->in_dev = NULL;
2853 querier = IGMP_V1_SEEN(state->in_dev) ? "V1" :
2854 IGMP_V2_SEEN(state->in_dev) ? "V2" :
2860 if (rcu_access_pointer(state->in_dev->mc_list) == im) {
2862 state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier);
3064 struct in_device *in_dev;
3068 in_dev = __in_dev_get_rtnl(dev);
3069 if (in_dev)
3070 ip_mc_rejoin_groups(in_dev);