Lines Matching refs:in_dev

133 #define IGMP_V1_SEEN(in_dev) \  argument
134 (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 1 || \
135 IN_DEV_CONF_GET((in_dev), FORCE_IGMP_VERSION) == 1 || \
136 ((in_dev)->mr_v1_seen && \
137 time_before(jiffies, (in_dev)->mr_v1_seen)))
138 #define IGMP_V2_SEEN(in_dev) \ argument
139 (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 2 || \
140 IN_DEV_CONF_GET((in_dev), FORCE_IGMP_VERSION) == 2 || \
141 ((in_dev)->mr_v2_seen && \
142 time_before(jiffies, (in_dev)->mr_v2_seen)))
144 static int unsolicited_report_interval(struct in_device *in_dev) in unsolicited_report_interval() argument
148 if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev)) in unsolicited_report_interval()
150 in_dev, in unsolicited_report_interval()
154 in_dev, in unsolicited_report_interval()
167 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im);
168 static void igmpv3_del_delrec(struct in_device *in_dev, __be32 multiaddr);
169 static void igmpv3_clear_delrec(struct in_device *in_dev);
174 static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
185 #define for_each_pmc_rcu(in_dev, pmc) \ argument
186 for (pmc = rcu_dereference(in_dev->mc_list); \
190 #define for_each_pmc_rtnl(in_dev, pmc) \ argument
191 for (pmc = rtnl_dereference(in_dev->mc_list); \
222 static void igmp_gq_start_timer(struct in_device *in_dev) in igmp_gq_start_timer() argument
224 int tv = prandom_u32() % in_dev->mr_maxdelay; in igmp_gq_start_timer()
226 in_dev->mr_gq_running = 1; in igmp_gq_start_timer()
227 if (!mod_timer(&in_dev->mr_gq_timer, jiffies+tv+2)) in igmp_gq_start_timer()
228 in_dev_hold(in_dev); in igmp_gq_start_timer()
231 static void igmp_ifc_start_timer(struct in_device *in_dev, int delay) in igmp_ifc_start_timer() argument
235 if (!mod_timer(&in_dev->mr_ifc_timer, jiffies+tv+2)) in igmp_ifc_start_timer()
236 in_dev_hold(in_dev); in igmp_ifc_start_timer()
538 static int igmpv3_send_report(struct in_device *in_dev, struct ip_mc_list *pmc) in igmpv3_send_report() argument
545 for_each_pmc_rcu(in_dev, pmc) { in igmpv3_send_report()
592 static void igmpv3_send_cr(struct in_device *in_dev) in igmpv3_send_cr() argument
599 spin_lock_bh(&in_dev->mc_tomb_lock); in igmpv3_send_cr()
603 for (pmc = in_dev->mc_tomb; pmc; pmc = pmc_next) { in igmpv3_send_cr()
626 in_dev->mc_tomb = pmc_next; in igmpv3_send_cr()
632 spin_unlock_bh(&in_dev->mc_tomb_lock); in igmpv3_send_cr()
635 for_each_pmc_rcu(in_dev, pmc) { in igmpv3_send_cr()
665 static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc, in igmp_send_report() argument
672 struct net_device *dev = in_dev->dev; in igmp_send_report()
680 return igmpv3_send_report(in_dev, pmc); in igmp_send_report()
735 struct in_device *in_dev = (struct in_device *)data; in igmp_gq_timer_expire() local
737 in_dev->mr_gq_running = 0; in igmp_gq_timer_expire()
738 igmpv3_send_report(in_dev, NULL); in igmp_gq_timer_expire()
739 in_dev_put(in_dev); in igmp_gq_timer_expire()
744 struct in_device *in_dev = (struct in_device *)data; in igmp_ifc_timer_expire() local
746 igmpv3_send_cr(in_dev); in igmp_ifc_timer_expire()
747 if (in_dev->mr_ifc_count) { in igmp_ifc_timer_expire()
748 in_dev->mr_ifc_count--; in igmp_ifc_timer_expire()
749 igmp_ifc_start_timer(in_dev, in igmp_ifc_timer_expire()
750 unsolicited_report_interval(in_dev)); in igmp_ifc_timer_expire()
752 in_dev_put(in_dev); in igmp_ifc_timer_expire()
755 static void igmp_ifc_event(struct in_device *in_dev) in igmp_ifc_event() argument
757 if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev)) in igmp_ifc_event()
759 in_dev->mr_ifc_count = in_dev->mr_qrv ?: sysctl_igmp_qrv; in igmp_ifc_event()
760 igmp_ifc_start_timer(in_dev, 1); in igmp_ifc_event()
767 struct in_device *in_dev = im->interface; in igmp_timer_expire() local
774 igmp_start_timer(im, unsolicited_report_interval(in_dev)); in igmp_timer_expire()
779 if (IGMP_V1_SEEN(in_dev)) in igmp_timer_expire()
780 igmp_send_report(in_dev, im, IGMP_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
781 else if (IGMP_V2_SEEN(in_dev)) in igmp_timer_expire()
782 igmp_send_report(in_dev, im, IGMPV2_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
784 igmp_send_report(in_dev, im, IGMPV3_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
846 static bool igmp_heard_report(struct in_device *in_dev, __be32 group) in igmp_heard_report() argument
856 for_each_pmc_rcu(in_dev, im) { in igmp_heard_report()
867 static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb, in igmp_heard_query() argument
883 in_dev->mr_v1_seen = jiffies + in igmp_heard_query()
889 in_dev->mr_v2_seen = jiffies + in igmp_heard_query()
893 in_dev->mr_ifc_count = 0; in igmp_heard_query()
894 if (del_timer(&in_dev->mr_ifc_timer)) in igmp_heard_query()
895 __in_dev_put(in_dev); in igmp_heard_query()
897 igmpv3_clear_delrec(in_dev); in igmp_heard_query()
900 } else if (IGMP_V1_SEEN(in_dev)) { in igmp_heard_query()
904 } else if (IGMP_V2_SEEN(in_dev)) { in igmp_heard_query()
929 in_dev->mr_maxdelay = max_delay; in igmp_heard_query()
931 in_dev->mr_qrv = ih3->qrv; in igmp_heard_query()
935 igmp_gq_start_timer(in_dev); in igmp_heard_query()
953 for_each_pmc_rcu(in_dev, im) { in igmp_heard_query()
980 struct in_device *in_dev = __in_dev_get_rcu(skb->dev); in igmp_rcv() local
984 if (!in_dev) in igmp_rcv()
996 dropped = igmp_heard_query(in_dev, skb, len); in igmp_rcv()
1006 dropped = igmp_heard_report(in_dev, ih->group); in igmp_rcv()
1038 static void ip_mc_filter_add(struct in_device *in_dev, __be32 addr) in ip_mc_filter_add() argument
1041 struct net_device *dev = in_dev->dev; in ip_mc_filter_add()
1058 static void ip_mc_filter_del(struct in_device *in_dev, __be32 addr) in ip_mc_filter_del() argument
1061 struct net_device *dev = in_dev->dev; in ip_mc_filter_del()
1071 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im) in igmpv3_add_delrec() argument
1086 in_dev_hold(in_dev); in igmpv3_add_delrec()
1088 pmc->crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; in igmpv3_add_delrec()
1101 spin_lock_bh(&in_dev->mc_tomb_lock); in igmpv3_add_delrec()
1102 pmc->next = in_dev->mc_tomb; in igmpv3_add_delrec()
1103 in_dev->mc_tomb = pmc; in igmpv3_add_delrec()
1104 spin_unlock_bh(&in_dev->mc_tomb_lock); in igmpv3_add_delrec()
1107 static void igmpv3_del_delrec(struct in_device *in_dev, __be32 multiaddr) in igmpv3_del_delrec() argument
1112 spin_lock_bh(&in_dev->mc_tomb_lock); in igmpv3_del_delrec()
1114 for (pmc = in_dev->mc_tomb; pmc; pmc = pmc->next) { in igmpv3_del_delrec()
1123 in_dev->mc_tomb = pmc->next; in igmpv3_del_delrec()
1125 spin_unlock_bh(&in_dev->mc_tomb_lock); in igmpv3_del_delrec()
1136 static void igmpv3_clear_delrec(struct in_device *in_dev) in igmpv3_clear_delrec() argument
1140 spin_lock_bh(&in_dev->mc_tomb_lock); in igmpv3_clear_delrec()
1141 pmc = in_dev->mc_tomb; in igmpv3_clear_delrec()
1142 in_dev->mc_tomb = NULL; in igmpv3_clear_delrec()
1143 spin_unlock_bh(&in_dev->mc_tomb_lock); in igmpv3_clear_delrec()
1153 for_each_pmc_rcu(in_dev, pmc) { in igmpv3_clear_delrec()
1171 struct in_device *in_dev = im->interface; in igmp_group_dropped() local
1178 ip_mc_filter_del(in_dev, im->multiaddr); in igmp_group_dropped()
1188 if (!in_dev->dead) { in igmp_group_dropped()
1189 if (IGMP_V1_SEEN(in_dev)) in igmp_group_dropped()
1191 if (IGMP_V2_SEEN(in_dev)) { in igmp_group_dropped()
1193 igmp_send_report(in_dev, im, IGMP_HOST_LEAVE_MESSAGE); in igmp_group_dropped()
1197 igmpv3_add_delrec(in_dev, im); in igmp_group_dropped()
1199 igmp_ifc_event(in_dev); in igmp_group_dropped()
1206 struct in_device *in_dev = im->interface; in igmp_group_added() local
1210 ip_mc_filter_add(in_dev, im->multiaddr); in igmp_group_added()
1217 if (in_dev->dead) in igmp_group_added()
1219 if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev)) { in igmp_group_added()
1227 im->crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; in igmp_group_added()
1228 igmp_ifc_event(in_dev); in igmp_group_added()
1242 static void ip_mc_hash_add(struct in_device *in_dev, in ip_mc_hash_add() argument
1248 mc_hash = rtnl_dereference(in_dev->mc_hash); in ip_mc_hash_add()
1257 if (in_dev->mc_count < 4) in ip_mc_hash_add()
1265 for_each_pmc_rtnl(in_dev, im) { in ip_mc_hash_add()
1271 rcu_assign_pointer(in_dev->mc_hash, mc_hash); in ip_mc_hash_add()
1274 static void ip_mc_hash_remove(struct in_device *in_dev, in ip_mc_hash_remove() argument
1277 struct ip_mc_list __rcu **mc_hash = rtnl_dereference(in_dev->mc_hash); in ip_mc_hash_remove()
1293 void ip_mc_inc_group(struct in_device *in_dev, __be32 addr) in ip_mc_inc_group() argument
1299 for_each_pmc_rtnl(in_dev, im) { in ip_mc_inc_group()
1302 ip_mc_add_src(in_dev, &addr, MCAST_EXCLUDE, 0, NULL, 0); in ip_mc_inc_group()
1312 im->interface = in_dev; in ip_mc_inc_group()
1313 in_dev_hold(in_dev); in ip_mc_inc_group()
1325 im->next_rcu = in_dev->mc_list; in ip_mc_inc_group()
1326 in_dev->mc_count++; in ip_mc_inc_group()
1327 rcu_assign_pointer(in_dev->mc_list, im); in ip_mc_inc_group()
1329 ip_mc_hash_add(in_dev, im); in ip_mc_inc_group()
1332 igmpv3_del_delrec(in_dev, im->multiaddr); in ip_mc_inc_group()
1335 if (!in_dev->dead) in ip_mc_inc_group()
1336 ip_rt_multicast_event(in_dev); in ip_mc_inc_group()
1345 static void ip_mc_rejoin_groups(struct in_device *in_dev) in ip_mc_rejoin_groups() argument
1353 for_each_pmc_rtnl(in_dev, im) { in ip_mc_rejoin_groups()
1360 if (IGMP_V1_SEEN(in_dev)) in ip_mc_rejoin_groups()
1362 else if (IGMP_V2_SEEN(in_dev)) in ip_mc_rejoin_groups()
1366 igmp_send_report(in_dev, im, type); in ip_mc_rejoin_groups()
1375 void ip_mc_dec_group(struct in_device *in_dev, __be32 addr) in ip_mc_dec_group() argument
1382 for (ip = &in_dev->mc_list; in ip_mc_dec_group()
1387 ip_mc_hash_remove(in_dev, i); in ip_mc_dec_group()
1389 in_dev->mc_count--; in ip_mc_dec_group()
1393 if (!in_dev->dead) in ip_mc_dec_group()
1394 ip_rt_multicast_event(in_dev); in ip_mc_dec_group()
1407 void ip_mc_unmap(struct in_device *in_dev) in ip_mc_unmap() argument
1413 for_each_pmc_rtnl(in_dev, pmc) in ip_mc_unmap()
1417 void ip_mc_remap(struct in_device *in_dev) in ip_mc_remap() argument
1423 for_each_pmc_rtnl(in_dev, pmc) in ip_mc_remap()
1429 void ip_mc_down(struct in_device *in_dev) in ip_mc_down() argument
1435 for_each_pmc_rtnl(in_dev, pmc) in ip_mc_down()
1439 in_dev->mr_ifc_count = 0; in ip_mc_down()
1440 if (del_timer(&in_dev->mr_ifc_timer)) in ip_mc_down()
1441 __in_dev_put(in_dev); in ip_mc_down()
1442 in_dev->mr_gq_running = 0; in ip_mc_down()
1443 if (del_timer(&in_dev->mr_gq_timer)) in ip_mc_down()
1444 __in_dev_put(in_dev); in ip_mc_down()
1445 igmpv3_clear_delrec(in_dev); in ip_mc_down()
1448 ip_mc_dec_group(in_dev, IGMP_ALL_HOSTS); in ip_mc_down()
1451 void ip_mc_init_dev(struct in_device *in_dev) in ip_mc_init_dev() argument
1456 setup_timer(&in_dev->mr_gq_timer, igmp_gq_timer_expire, in ip_mc_init_dev()
1457 (unsigned long)in_dev); in ip_mc_init_dev()
1458 setup_timer(&in_dev->mr_ifc_timer, igmp_ifc_timer_expire, in ip_mc_init_dev()
1459 (unsigned long)in_dev); in ip_mc_init_dev()
1460 in_dev->mr_qrv = sysctl_igmp_qrv; in ip_mc_init_dev()
1463 spin_lock_init(&in_dev->mc_tomb_lock); in ip_mc_init_dev()
1468 void ip_mc_up(struct in_device *in_dev) in ip_mc_up() argument
1475 in_dev->mr_qrv = sysctl_igmp_qrv; in ip_mc_up()
1477 ip_mc_inc_group(in_dev, IGMP_ALL_HOSTS); in ip_mc_up()
1479 for_each_pmc_rtnl(in_dev, pmc) in ip_mc_up()
1487 void ip_mc_destroy_dev(struct in_device *in_dev) in ip_mc_destroy_dev() argument
1494 ip_mc_down(in_dev); in ip_mc_destroy_dev()
1496 while ((i = rtnl_dereference(in_dev->mc_list)) != NULL) { in ip_mc_destroy_dev()
1497 in_dev->mc_list = i->next_rcu; in ip_mc_destroy_dev()
1498 in_dev->mc_count--; in ip_mc_destroy_dev()
1569 struct in_device *in_dev = pmc->interface; in ip_mc_del1_src() local
1579 !IGMP_V1_SEEN(in_dev) && !IGMP_V2_SEEN(in_dev)) { in ip_mc_del1_src()
1580 psf->sf_crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; in ip_mc_del1_src()
1595 static int ip_mc_del_src(struct in_device *in_dev, __be32 *pmca, int sfmode, in ip_mc_del_src() argument
1602 if (!in_dev) in ip_mc_del_src()
1605 for_each_pmc_rcu(in_dev, pmc) { in ip_mc_del_src()
1643 pmc->crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; in ip_mc_del_src()
1644 in_dev->mr_ifc_count = pmc->crcount; in ip_mc_del_src()
1766 static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode, in ip_mc_add_src() argument
1773 if (!in_dev) in ip_mc_add_src()
1776 for_each_pmc_rcu(in_dev, pmc) { in ip_mc_add_src()
1810 in_dev = pmc->interface; in ip_mc_add_src()
1821 pmc->crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; in ip_mc_add_src()
1822 in_dev->mr_ifc_count = pmc->crcount; in ip_mc_add_src()
1825 igmp_ifc_event(in_dev); in ip_mc_add_src()
1827 igmp_ifc_event(in_dev); in ip_mc_add_src()
1860 struct in_device *in_dev; in ip_mc_join_group() local
1872 in_dev = ip_mc_find_dev(net, imr); in ip_mc_join_group()
1874 if (!in_dev) { in ip_mc_join_group()
1899 ip_mc_inc_group(in_dev, addr); in ip_mc_join_group()
1907 struct in_device *in_dev) in ip_mc_leave_src() argument
1914 return ip_mc_del_src(in_dev, &iml->multi.imr_multiaddr.s_addr, in ip_mc_leave_src()
1917 err = ip_mc_del_src(in_dev, &iml->multi.imr_multiaddr.s_addr, in ip_mc_leave_src()
1931 struct in_device *in_dev; in ip_mc_leave_group() local
1939 in_dev = ip_mc_find_dev(net, imr); in ip_mc_leave_group()
1940 if (!in_dev) { in ip_mc_leave_group()
1957 (void) ip_mc_leave_src(sk, iml, in_dev); in ip_mc_leave_group()
1961 ip_mc_dec_group(in_dev, group); in ip_mc_leave_group()
1980 struct in_device *in_dev = NULL; in ip_mc_source() local
1995 in_dev = ip_mc_find_dev(net, &imr); in ip_mc_source()
1997 if (!in_dev) { in ip_mc_source()
2021 ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 0, NULL, 0); in ip_mc_source()
2022 ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, pmc->sfmode, 0, in ip_mc_source()
2048 ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, omode, 1, in ip_mc_source()
2101 ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 1, in ip_mc_source()
2115 struct in_device *in_dev; in ip_mc_msfilter() local
2132 in_dev = ip_mc_find_dev(net, &imr); in ip_mc_msfilter()
2134 if (!in_dev) { in ip_mc_msfilter()
2164 err = ip_mc_add_src(in_dev, &msf->imsf_multiaddr, in ip_mc_msfilter()
2172 (void) ip_mc_add_src(in_dev, &msf->imsf_multiaddr, in ip_mc_msfilter()
2177 (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode, in ip_mc_msfilter()
2183 (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode, in ip_mc_msfilter()
2201 struct in_device *in_dev; in ip_mc_msfget() local
2214 in_dev = ip_mc_find_dev(net, &imr); in ip_mc_msfget()
2216 if (!in_dev) { in ip_mc_msfget()
2368 struct in_device *in_dev; in ip_mc_drop_socket() local
2371 in_dev = inetdev_by_index(net, iml->multi.imr_ifindex); in ip_mc_drop_socket()
2372 (void) ip_mc_leave_src(sk, iml, in_dev); in ip_mc_drop_socket()
2373 if (in_dev) in ip_mc_drop_socket()
2374 ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr); in ip_mc_drop_socket()
2383 int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u16 proto) in ip_check_mc_rcu() argument
2390 mc_hash = rcu_dereference(in_dev->mc_hash); in ip_check_mc_rcu()
2401 for_each_pmc_rcu(in_dev, im) { in ip_check_mc_rcu()
2430 struct in_device *in_dev; member
2441 state->in_dev = NULL; in igmp_mc_get_first()
2443 struct in_device *in_dev; in igmp_mc_get_first() local
2445 in_dev = __in_dev_get_rcu(state->dev); in igmp_mc_get_first()
2446 if (!in_dev) in igmp_mc_get_first()
2448 im = rcu_dereference(in_dev->mc_list); in igmp_mc_get_first()
2450 state->in_dev = in_dev; in igmp_mc_get_first()
2465 state->in_dev = NULL; in igmp_mc_get_next()
2468 state->in_dev = __in_dev_get_rcu(state->dev); in igmp_mc_get_next()
2469 if (!state->in_dev) in igmp_mc_get_next()
2471 im = rcu_dereference(state->in_dev->mc_list); in igmp_mc_get_next()
2508 state->in_dev = NULL; in igmp_mc_seq_stop()
2525 querier = IGMP_V1_SEEN(state->in_dev) ? "V1" : in igmp_mc_seq_show()
2526 IGMP_V2_SEEN(state->in_dev) ? "V2" : in igmp_mc_seq_show()
2532 if (rcu_access_pointer(state->in_dev->mc_list) == im) { in igmp_mc_seq_show()
2534 state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); in igmp_mc_seq_show()
2763 struct in_device *in_dev; in igmp_netdev_event() local
2767 in_dev = __in_dev_get_rtnl(dev); in igmp_netdev_event()
2768 if (in_dev) in igmp_netdev_event()
2769 ip_mc_rejoin_groups(in_dev); in igmp_netdev_event()