Lines Matching refs:in_dev

136 #define IGMP_V1_SEEN(in_dev) \  argument
137 (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 1 || \
138 IN_DEV_CONF_GET((in_dev), FORCE_IGMP_VERSION) == 1 || \
139 ((in_dev)->mr_v1_seen && \
140 time_before(jiffies, (in_dev)->mr_v1_seen)))
141 #define IGMP_V2_SEEN(in_dev) \ argument
142 (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 2 || \
143 IN_DEV_CONF_GET((in_dev), FORCE_IGMP_VERSION) == 2 || \
144 ((in_dev)->mr_v2_seen && \
145 time_before(jiffies, (in_dev)->mr_v2_seen)))
147 static int unsolicited_report_interval(struct in_device *in_dev) in unsolicited_report_interval() argument
151 if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev)) in unsolicited_report_interval()
153 in_dev, in unsolicited_report_interval()
157 in_dev, in unsolicited_report_interval()
170 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im);
171 static void igmpv3_del_delrec(struct in_device *in_dev, __be32 multiaddr);
172 static void igmpv3_clear_delrec(struct in_device *in_dev);
177 static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
188 #define for_each_pmc_rcu(in_dev, pmc) \ argument
189 for (pmc = rcu_dereference(in_dev->mc_list); \
193 #define for_each_pmc_rtnl(in_dev, pmc) \ argument
194 for (pmc = rtnl_dereference(in_dev->mc_list); \
225 static void igmp_gq_start_timer(struct in_device *in_dev) in igmp_gq_start_timer() argument
227 int tv = prandom_u32() % in_dev->mr_maxdelay; in igmp_gq_start_timer()
229 in_dev->mr_gq_running = 1; in igmp_gq_start_timer()
230 if (!mod_timer(&in_dev->mr_gq_timer, jiffies+tv+2)) in igmp_gq_start_timer()
231 in_dev_hold(in_dev); in igmp_gq_start_timer()
234 static void igmp_ifc_start_timer(struct in_device *in_dev, int delay) in igmp_ifc_start_timer() argument
238 if (!mod_timer(&in_dev->mr_ifc_timer, jiffies+tv+2)) in igmp_ifc_start_timer()
239 in_dev_hold(in_dev); in igmp_ifc_start_timer()
542 static int igmpv3_send_report(struct in_device *in_dev, struct ip_mc_list *pmc) in igmpv3_send_report() argument
549 for_each_pmc_rcu(in_dev, pmc) { in igmpv3_send_report()
599 static void igmpv3_send_cr(struct in_device *in_dev) in igmpv3_send_cr() argument
606 spin_lock_bh(&in_dev->mc_tomb_lock); in igmpv3_send_cr()
610 for (pmc = in_dev->mc_tomb; pmc; pmc = pmc_next) { in igmpv3_send_cr()
633 in_dev->mc_tomb = pmc_next; in igmpv3_send_cr()
639 spin_unlock_bh(&in_dev->mc_tomb_lock); in igmpv3_send_cr()
642 for_each_pmc_rcu(in_dev, pmc) { in igmpv3_send_cr()
672 static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc, in igmp_send_report() argument
679 struct net_device *dev = in_dev->dev; in igmp_send_report()
687 return igmpv3_send_report(in_dev, pmc); in igmp_send_report()
746 struct in_device *in_dev = (struct in_device *)data; in igmp_gq_timer_expire() local
748 in_dev->mr_gq_running = 0; in igmp_gq_timer_expire()
749 igmpv3_send_report(in_dev, NULL); in igmp_gq_timer_expire()
750 in_dev_put(in_dev); in igmp_gq_timer_expire()
755 struct in_device *in_dev = (struct in_device *)data; in igmp_ifc_timer_expire() local
757 igmpv3_send_cr(in_dev); in igmp_ifc_timer_expire()
758 if (in_dev->mr_ifc_count) { in igmp_ifc_timer_expire()
759 in_dev->mr_ifc_count--; in igmp_ifc_timer_expire()
760 igmp_ifc_start_timer(in_dev, in igmp_ifc_timer_expire()
761 unsolicited_report_interval(in_dev)); in igmp_ifc_timer_expire()
763 in_dev_put(in_dev); in igmp_ifc_timer_expire()
766 static void igmp_ifc_event(struct in_device *in_dev) in igmp_ifc_event() argument
768 if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev)) in igmp_ifc_event()
770 in_dev->mr_ifc_count = in_dev->mr_qrv ?: sysctl_igmp_qrv; in igmp_ifc_event()
771 igmp_ifc_start_timer(in_dev, 1); in igmp_ifc_event()
778 struct in_device *in_dev = im->interface; in igmp_timer_expire() local
785 igmp_start_timer(im, unsolicited_report_interval(in_dev)); in igmp_timer_expire()
790 if (IGMP_V1_SEEN(in_dev)) in igmp_timer_expire()
791 igmp_send_report(in_dev, im, IGMP_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
792 else if (IGMP_V2_SEEN(in_dev)) in igmp_timer_expire()
793 igmp_send_report(in_dev, im, IGMPV2_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
795 igmp_send_report(in_dev, im, IGMPV3_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
857 static bool igmp_heard_report(struct in_device *in_dev, __be32 group) in igmp_heard_report() argument
869 for_each_pmc_rcu(in_dev, im) { in igmp_heard_report()
880 static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb, in igmp_heard_query() argument
896 in_dev->mr_v1_seen = jiffies + in igmp_heard_query()
902 in_dev->mr_v2_seen = jiffies + in igmp_heard_query()
906 in_dev->mr_ifc_count = 0; in igmp_heard_query()
907 if (del_timer(&in_dev->mr_ifc_timer)) in igmp_heard_query()
908 __in_dev_put(in_dev); in igmp_heard_query()
910 igmpv3_clear_delrec(in_dev); in igmp_heard_query()
913 } else if (IGMP_V1_SEEN(in_dev)) { in igmp_heard_query()
917 } else if (IGMP_V2_SEEN(in_dev)) { in igmp_heard_query()
942 in_dev->mr_maxdelay = max_delay; in igmp_heard_query()
944 in_dev->mr_qrv = ih3->qrv; in igmp_heard_query()
948 igmp_gq_start_timer(in_dev); in igmp_heard_query()
966 for_each_pmc_rcu(in_dev, im) { in igmp_heard_query()
996 struct in_device *in_dev = __in_dev_get_rcu(skb->dev); in igmp_rcv() local
1000 if (!in_dev) in igmp_rcv()
1012 dropped = igmp_heard_query(in_dev, skb, len); in igmp_rcv()
1022 dropped = igmp_heard_report(in_dev, ih->group); in igmp_rcv()
1054 static void ip_mc_filter_add(struct in_device *in_dev, __be32 addr) in ip_mc_filter_add() argument
1057 struct net_device *dev = in_dev->dev; in ip_mc_filter_add()
1074 static void ip_mc_filter_del(struct in_device *in_dev, __be32 addr) in ip_mc_filter_del() argument
1077 struct net_device *dev = in_dev->dev; in ip_mc_filter_del()
1087 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im) in igmpv3_add_delrec() argument
1102 in_dev_hold(in_dev); in igmpv3_add_delrec()
1104 pmc->crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; in igmpv3_add_delrec()
1117 spin_lock_bh(&in_dev->mc_tomb_lock); in igmpv3_add_delrec()
1118 pmc->next = in_dev->mc_tomb; in igmpv3_add_delrec()
1119 in_dev->mc_tomb = pmc; in igmpv3_add_delrec()
1120 spin_unlock_bh(&in_dev->mc_tomb_lock); in igmpv3_add_delrec()
1123 static void igmpv3_del_delrec(struct in_device *in_dev, __be32 multiaddr) in igmpv3_del_delrec() argument
1128 spin_lock_bh(&in_dev->mc_tomb_lock); in igmpv3_del_delrec()
1130 for (pmc = in_dev->mc_tomb; pmc; pmc = pmc->next) { in igmpv3_del_delrec()
1139 in_dev->mc_tomb = pmc->next; in igmpv3_del_delrec()
1141 spin_unlock_bh(&in_dev->mc_tomb_lock); in igmpv3_del_delrec()
1152 static void igmpv3_clear_delrec(struct in_device *in_dev) in igmpv3_clear_delrec() argument
1156 spin_lock_bh(&in_dev->mc_tomb_lock); in igmpv3_clear_delrec()
1157 pmc = in_dev->mc_tomb; in igmpv3_clear_delrec()
1158 in_dev->mc_tomb = NULL; in igmpv3_clear_delrec()
1159 spin_unlock_bh(&in_dev->mc_tomb_lock); in igmpv3_clear_delrec()
1169 for_each_pmc_rcu(in_dev, pmc) { in igmpv3_clear_delrec()
1187 struct in_device *in_dev = im->interface; in igmp_group_dropped() local
1194 ip_mc_filter_del(in_dev, im->multiaddr); in igmp_group_dropped()
1206 if (!in_dev->dead) { in igmp_group_dropped()
1207 if (IGMP_V1_SEEN(in_dev)) in igmp_group_dropped()
1209 if (IGMP_V2_SEEN(in_dev)) { in igmp_group_dropped()
1211 igmp_send_report(in_dev, im, IGMP_HOST_LEAVE_MESSAGE); in igmp_group_dropped()
1215 igmpv3_add_delrec(in_dev, im); in igmp_group_dropped()
1217 igmp_ifc_event(in_dev); in igmp_group_dropped()
1224 struct in_device *in_dev = im->interface; in igmp_group_added() local
1228 ip_mc_filter_add(in_dev, im->multiaddr); in igmp_group_added()
1237 if (in_dev->dead) in igmp_group_added()
1239 if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev)) { in igmp_group_added()
1247 im->crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; in igmp_group_added()
1248 igmp_ifc_event(in_dev); in igmp_group_added()
1262 static void ip_mc_hash_add(struct in_device *in_dev, in ip_mc_hash_add() argument
1268 mc_hash = rtnl_dereference(in_dev->mc_hash); in ip_mc_hash_add()
1277 if (in_dev->mc_count < 4) in ip_mc_hash_add()
1285 for_each_pmc_rtnl(in_dev, im) { in ip_mc_hash_add()
1291 rcu_assign_pointer(in_dev->mc_hash, mc_hash); in ip_mc_hash_add()
1294 static void ip_mc_hash_remove(struct in_device *in_dev, in ip_mc_hash_remove() argument
1297 struct ip_mc_list __rcu **mc_hash = rtnl_dereference(in_dev->mc_hash); in ip_mc_hash_remove()
1313 void ip_mc_inc_group(struct in_device *in_dev, __be32 addr) in ip_mc_inc_group() argument
1319 for_each_pmc_rtnl(in_dev, im) { in ip_mc_inc_group()
1322 ip_mc_add_src(in_dev, &addr, MCAST_EXCLUDE, 0, NULL, 0); in ip_mc_inc_group()
1332 im->interface = in_dev; in ip_mc_inc_group()
1333 in_dev_hold(in_dev); in ip_mc_inc_group()
1345 im->next_rcu = in_dev->mc_list; in ip_mc_inc_group()
1346 in_dev->mc_count++; in ip_mc_inc_group()
1347 rcu_assign_pointer(in_dev->mc_list, im); in ip_mc_inc_group()
1349 ip_mc_hash_add(in_dev, im); in ip_mc_inc_group()
1352 igmpv3_del_delrec(in_dev, im->multiaddr); in ip_mc_inc_group()
1355 if (!in_dev->dead) in ip_mc_inc_group()
1356 ip_rt_multicast_event(in_dev); in ip_mc_inc_group()
1530 static void ip_mc_rejoin_groups(struct in_device *in_dev) in ip_mc_rejoin_groups() argument
1538 for_each_pmc_rtnl(in_dev, im) { in ip_mc_rejoin_groups()
1548 if (IGMP_V1_SEEN(in_dev)) in ip_mc_rejoin_groups()
1550 else if (IGMP_V2_SEEN(in_dev)) in ip_mc_rejoin_groups()
1554 igmp_send_report(in_dev, im, type); in ip_mc_rejoin_groups()
1563 void ip_mc_dec_group(struct in_device *in_dev, __be32 addr) in ip_mc_dec_group() argument
1570 for (ip = &in_dev->mc_list; in ip_mc_dec_group()
1575 ip_mc_hash_remove(in_dev, i); in ip_mc_dec_group()
1577 in_dev->mc_count--; in ip_mc_dec_group()
1581 if (!in_dev->dead) in ip_mc_dec_group()
1582 ip_rt_multicast_event(in_dev); in ip_mc_dec_group()
1595 void ip_mc_unmap(struct in_device *in_dev) in ip_mc_unmap() argument
1601 for_each_pmc_rtnl(in_dev, pmc) in ip_mc_unmap()
1605 void ip_mc_remap(struct in_device *in_dev) in ip_mc_remap() argument
1611 for_each_pmc_rtnl(in_dev, pmc) in ip_mc_remap()
1617 void ip_mc_down(struct in_device *in_dev) in ip_mc_down() argument
1623 for_each_pmc_rtnl(in_dev, pmc) in ip_mc_down()
1627 in_dev->mr_ifc_count = 0; in ip_mc_down()
1628 if (del_timer(&in_dev->mr_ifc_timer)) in ip_mc_down()
1629 __in_dev_put(in_dev); in ip_mc_down()
1630 in_dev->mr_gq_running = 0; in ip_mc_down()
1631 if (del_timer(&in_dev->mr_gq_timer)) in ip_mc_down()
1632 __in_dev_put(in_dev); in ip_mc_down()
1633 igmpv3_clear_delrec(in_dev); in ip_mc_down()
1636 ip_mc_dec_group(in_dev, IGMP_ALL_HOSTS); in ip_mc_down()
1639 void ip_mc_init_dev(struct in_device *in_dev) in ip_mc_init_dev() argument
1644 setup_timer(&in_dev->mr_gq_timer, igmp_gq_timer_expire, in ip_mc_init_dev()
1645 (unsigned long)in_dev); in ip_mc_init_dev()
1646 setup_timer(&in_dev->mr_ifc_timer, igmp_ifc_timer_expire, in ip_mc_init_dev()
1647 (unsigned long)in_dev); in ip_mc_init_dev()
1648 in_dev->mr_qrv = sysctl_igmp_qrv; in ip_mc_init_dev()
1651 spin_lock_init(&in_dev->mc_tomb_lock); in ip_mc_init_dev()
1656 void ip_mc_up(struct in_device *in_dev) in ip_mc_up() argument
1663 in_dev->mr_qrv = sysctl_igmp_qrv; in ip_mc_up()
1665 ip_mc_inc_group(in_dev, IGMP_ALL_HOSTS); in ip_mc_up()
1667 for_each_pmc_rtnl(in_dev, pmc) in ip_mc_up()
1675 void ip_mc_destroy_dev(struct in_device *in_dev) in ip_mc_destroy_dev() argument
1682 ip_mc_down(in_dev); in ip_mc_destroy_dev()
1684 while ((i = rtnl_dereference(in_dev->mc_list)) != NULL) { in ip_mc_destroy_dev()
1685 in_dev->mc_list = i->next_rcu; in ip_mc_destroy_dev()
1686 in_dev->mc_count--; in ip_mc_destroy_dev()
1757 struct in_device *in_dev = pmc->interface; in ip_mc_del1_src() local
1767 !IGMP_V1_SEEN(in_dev) && !IGMP_V2_SEEN(in_dev)) { in ip_mc_del1_src()
1768 psf->sf_crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; in ip_mc_del1_src()
1783 static int ip_mc_del_src(struct in_device *in_dev, __be32 *pmca, int sfmode, in ip_mc_del_src() argument
1790 if (!in_dev) in ip_mc_del_src()
1793 for_each_pmc_rcu(in_dev, pmc) { in ip_mc_del_src()
1831 pmc->crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; in ip_mc_del_src()
1832 in_dev->mr_ifc_count = pmc->crcount; in ip_mc_del_src()
1954 static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode, in ip_mc_add_src() argument
1961 if (!in_dev) in ip_mc_add_src()
1964 for_each_pmc_rcu(in_dev, pmc) { in ip_mc_add_src()
1998 in_dev = pmc->interface; in ip_mc_add_src()
2009 pmc->crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; in ip_mc_add_src()
2010 in_dev->mr_ifc_count = pmc->crcount; in ip_mc_add_src()
2013 igmp_ifc_event(in_dev); in ip_mc_add_src()
2015 igmp_ifc_event(in_dev); in ip_mc_add_src()
2048 struct in_device *in_dev; in ip_mc_join_group() local
2060 in_dev = ip_mc_find_dev(net, imr); in ip_mc_join_group()
2062 if (!in_dev) { in ip_mc_join_group()
2087 ip_mc_inc_group(in_dev, addr); in ip_mc_join_group()
2095 struct in_device *in_dev) in ip_mc_leave_src() argument
2102 return ip_mc_del_src(in_dev, &iml->multi.imr_multiaddr.s_addr, in ip_mc_leave_src()
2105 err = ip_mc_del_src(in_dev, &iml->multi.imr_multiaddr.s_addr, in ip_mc_leave_src()
2119 struct in_device *in_dev; in ip_mc_leave_group() local
2127 in_dev = ip_mc_find_dev(net, imr); in ip_mc_leave_group()
2128 if (!imr->imr_ifindex && !imr->imr_address.s_addr && !in_dev) { in ip_mc_leave_group()
2145 (void) ip_mc_leave_src(sk, iml, in_dev); in ip_mc_leave_group()
2149 if (in_dev) in ip_mc_leave_group()
2150 ip_mc_dec_group(in_dev, group); in ip_mc_leave_group()
2169 struct in_device *in_dev = NULL; in ip_mc_source() local
2184 in_dev = ip_mc_find_dev(net, &imr); in ip_mc_source()
2186 if (!in_dev) { in ip_mc_source()
2210 ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 0, NULL, 0); in ip_mc_source()
2211 ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, pmc->sfmode, 0, in ip_mc_source()
2237 ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, omode, 1, in ip_mc_source()
2290 ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 1, in ip_mc_source()
2304 struct in_device *in_dev; in ip_mc_msfilter() local
2321 in_dev = ip_mc_find_dev(net, &imr); in ip_mc_msfilter()
2323 if (!in_dev) { in ip_mc_msfilter()
2353 err = ip_mc_add_src(in_dev, &msf->imsf_multiaddr, in ip_mc_msfilter()
2361 (void) ip_mc_add_src(in_dev, &msf->imsf_multiaddr, in ip_mc_msfilter()
2366 (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode, in ip_mc_msfilter()
2372 (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode, in ip_mc_msfilter()
2390 struct in_device *in_dev; in ip_mc_msfget() local
2403 in_dev = ip_mc_find_dev(net, &imr); in ip_mc_msfget()
2405 if (!in_dev) { in ip_mc_msfget()
2553 struct in_device *in_dev; in ip_mc_drop_socket() local
2556 in_dev = inetdev_by_index(net, iml->multi.imr_ifindex); in ip_mc_drop_socket()
2557 (void) ip_mc_leave_src(sk, iml, in_dev); in ip_mc_drop_socket()
2558 if (in_dev) in ip_mc_drop_socket()
2559 ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr); in ip_mc_drop_socket()
2568 int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u8 proto) in ip_check_mc_rcu() argument
2575 mc_hash = rcu_dereference(in_dev->mc_hash); in ip_check_mc_rcu()
2586 for_each_pmc_rcu(in_dev, im) { in ip_check_mc_rcu()
2615 struct in_device *in_dev; member
2626 state->in_dev = NULL; in igmp_mc_get_first()
2628 struct in_device *in_dev; in igmp_mc_get_first() local
2630 in_dev = __in_dev_get_rcu(state->dev); in igmp_mc_get_first()
2631 if (!in_dev) in igmp_mc_get_first()
2633 im = rcu_dereference(in_dev->mc_list); in igmp_mc_get_first()
2635 state->in_dev = in_dev; in igmp_mc_get_first()
2650 state->in_dev = NULL; in igmp_mc_get_next()
2653 state->in_dev = __in_dev_get_rcu(state->dev); in igmp_mc_get_next()
2654 if (!state->in_dev) in igmp_mc_get_next()
2656 im = rcu_dereference(state->in_dev->mc_list); in igmp_mc_get_next()
2693 state->in_dev = NULL; in igmp_mc_seq_stop()
2710 querier = IGMP_V1_SEEN(state->in_dev) ? "V1" : in igmp_mc_seq_show()
2711 IGMP_V2_SEEN(state->in_dev) ? "V2" : in igmp_mc_seq_show()
2717 if (rcu_access_pointer(state->in_dev->mc_list) == im) { in igmp_mc_seq_show()
2719 state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier); in igmp_mc_seq_show()
2948 struct in_device *in_dev; in igmp_netdev_event() local
2952 in_dev = __in_dev_get_rtnl(dev); in igmp_netdev_event()
2953 if (in_dev) in igmp_netdev_event()
2954 ip_mc_rejoin_groups(in_dev); in igmp_netdev_event()