• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/net/ipv6/

Lines Matching refs:idev

137 int __ipv6_dev_mc_dec(struct inet6_dev *idev, struct in6_addr *addr);
145 static void mld_ifc_event(struct inet6_dev *idev);
146 static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *pmc);
147 static void mld_del_delrec(struct inet6_dev *idev, struct in6_addr *addr);
148 static void mld_clear_delrec(struct inet6_dev *idev);
152 static int ip6_mc_del_src(struct inet6_dev *idev, struct in6_addr *pmca,
155 static int ip6_mc_add_src(struct inet6_dev *idev, struct in6_addr *pmca,
159 struct inet6_dev *idev);
165 #define MLD_V1_SEEN(idev) (ipv6_devconf.force_mld_version == 1 || \
166 (idev)->cnf.force_mld_version == 1 || \
167 ((idev)->mc_v1_seen && \
168 time_before(jiffies, (idev)->mc_v1_seen)))
276 struct inet6_dev *idev = in6_dev_get(dev);
278 (void) ip6_mc_leave_src(sk, mc_lst, idev);
279 if (idev) {
280 __ipv6_dev_mc_dec(idev, &mc_lst->addr);
281 in6_dev_put(idev);
298 struct inet6_dev *idev = NULL;
314 idev = in6_dev_get(dev);
315 if (!idev) {
319 read_lock_bh(&idev->lock);
320 if (idev->dead) {
321 read_unlock_bh(&idev->lock);
322 in6_dev_put(idev);
326 return idev;
343 struct inet6_dev *idev = in6_dev_get(dev);
345 (void) ip6_mc_leave_src(sk, mc_lst, idev);
346 if (idev) {
347 __ipv6_dev_mc_dec(idev, &mc_lst->addr);
348 in6_dev_put(idev);
367 struct inet6_dev *idev;
385 idev = ip6_mc_find_dev(group, pgsr->gsr_interface);
386 if (!idev)
388 dev = idev->dev;
411 ip6_mc_add_src(idev, group, omode, 0, NULL, 0);
412 ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0);
440 ip6_mc_del_src(idev, group, omode, 1, source, 1);
488 ip6_mc_add_src(idev, group, omode, 1, source, 1);
493 read_unlock_bh(&idev->lock);
494 in6_dev_put(idev);
506 struct inet6_dev *idev;
520 idev = ip6_mc_find_dev(group, gsf->gf_interface);
522 if (!idev)
524 dev = idev->dev;
558 err = ip6_mc_add_src(idev, group, gsf->gf_fmode,
566 (void) ip6_mc_add_src(idev, group, gsf->gf_fmode, 0, NULL, 0);
572 (void) ip6_mc_del_src(idev, group, pmc->sfmode,
576 (void) ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0);
583 read_unlock_bh(&idev->lock);
584 in6_dev_put(idev);
597 struct inet6_dev *idev;
607 idev = ip6_mc_find_dev(group, gsf->gf_interface);
609 if (!idev)
612 dev = idev->dev;
632 read_unlock_bh(&idev->lock);
633 in6_dev_put(idev);
659 read_unlock_bh(&idev->lock);
660 in6_dev_put(idev);
707 in6_dev_put(mc->idev);
714 struct net_device *dev = mc->idev->dev;
728 if (MLD_V1_SEEN(mc->idev)) {
734 mc->mca_crcount = mc->idev->mc_qrv;
735 mld_ifc_event(mc->idev);
740 struct net_device *dev = mc->idev->dev;
754 if (!mc->idev->dead)
768 static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *im)
784 pmc->idev = im->idev;
785 in6_dev_hold(idev);
787 pmc->mca_crcount = idev->mc_qrv;
800 write_lock_bh(&idev->mc_lock);
801 pmc->next = idev->mc_tomb;
802 idev->mc_tomb = pmc;
803 write_unlock_bh(&idev->mc_lock);
806 static void mld_del_delrec(struct inet6_dev *idev, struct in6_addr *pmca)
811 write_lock_bh(&idev->mc_lock);
813 for (pmc=idev->mc_tomb; pmc; pmc=pmc->next) {
822 idev->mc_tomb = pmc->next;
824 write_unlock_bh(&idev->mc_lock);
830 in6_dev_put(pmc->idev);
835 static void mld_clear_delrec(struct inet6_dev *idev)
839 write_lock_bh(&idev->mc_lock);
840 pmc = idev->mc_tomb;
841 idev->mc_tomb = NULL;
842 write_unlock_bh(&idev->mc_lock);
847 in6_dev_put(pmc->idev);
852 read_lock_bh(&idev->lock);
853 for (pmc=idev->mc_list; pmc; pmc=pmc->next) {
865 read_unlock_bh(&idev->lock);
875 struct inet6_dev *idev;
877 idev = in6_dev_get(dev);
879 if (idev == NULL)
882 write_lock_bh(&idev->lock);
883 if (idev->dead) {
884 write_unlock_bh(&idev->lock);
885 in6_dev_put(idev);
889 for (mc = idev->mc_list; mc; mc = mc->next) {
892 write_unlock_bh(&idev->lock);
893 ip6_mc_add_src(idev, &mc->mca_addr, MCAST_EXCLUDE, 0,
895 in6_dev_put(idev);
907 write_unlock_bh(&idev->lock);
908 in6_dev_put(idev);
917 mc->idev = idev;
932 mc->next = idev->mc_list;
933 idev->mc_list = mc;
934 write_unlock_bh(&idev->lock);
936 mld_del_delrec(idev, &mc->mca_addr);
945 int __ipv6_dev_mc_dec(struct inet6_dev *idev, struct in6_addr *addr)
949 write_lock_bh(&idev->lock);
950 for (map = &idev->mc_list; (ma=*map) != NULL; map = &ma->next) {
954 write_unlock_bh(&idev->lock);
961 write_unlock_bh(&idev->lock);
965 write_unlock_bh(&idev->lock);
972 struct inet6_dev *idev = in6_dev_get(dev);
975 if (!idev)
978 err = __ipv6_dev_mc_dec(idev, addr);
980 in6_dev_put(idev);
1018 struct inet6_dev *idev;
1022 idev = in6_dev_get(dev);
1023 if (idev) {
1024 read_lock_bh(&idev->lock);
1025 for (mc = idev->mc_list; mc; mc=mc->next) {
1048 read_unlock_bh(&idev->lock);
1049 in6_dev_put(idev);
1054 static void mld_gq_start_timer(struct inet6_dev *idev)
1056 int tv = net_random() % idev->mc_maxdelay;
1058 idev->mc_gq_running = 1;
1059 if (!mod_timer(&idev->mc_gq_timer, jiffies+tv+2))
1060 in6_dev_hold(idev);
1063 static void mld_ifc_start_timer(struct inet6_dev *idev, int delay)
1067 if (!mod_timer(&idev->mc_ifc_timer, jiffies+tv+2))
1068 in6_dev_hold(idev);
1167 struct inet6_dev *idev;
1184 idev = in6_dev_get(skb->dev);
1186 if (idev == NULL)
1195 in6_dev_put(idev);
1206 switchback = (idev->mc_qrv + 1) * max_delay;
1207 idev->mc_v1_seen = jiffies + switchback;
1210 idev->mc_ifc_count = 0;
1211 if (del_timer(&idev->mc_ifc_timer))
1212 __in6_dev_put(idev);
1214 mld_clear_delrec(idev);
1219 in6_dev_put(idev);
1226 idev->mc_maxdelay = max_delay;
1228 idev->mc_qrv = mlh2->qrv;
1231 in6_dev_put(idev);
1234 mld_gq_start_timer(idev);
1235 in6_dev_put(idev);
1242 in6_dev_put(idev);
1249 in6_dev_put(idev);
1253 read_lock_bh(&idev->lock);
1255 for (ma = idev->mc_list; ma; ma=ma->next) {
1261 for (ma = idev->mc_list; ma; ma=ma->next) {
1283 read_unlock_bh(&idev->lock);
1284 in6_dev_put(idev);
1294 struct inet6_dev *idev;
1320 idev = in6_dev_get(skb->dev);
1321 if (idev == NULL)
1328 read_lock_bh(&idev->lock);
1329 for (ma = idev->mc_list; ma; ma=ma->next) {
1339 read_unlock_bh(&idev->lock);
1340 in6_dev_put(idev);
1474 struct inet6_dev *idev = in6_dev_get(skb->dev);
1477 IP6_INC_STATS(idev, IPSTATS_MIB_OUTREQUESTS);
1488 ICMP6_INC_STATS(idev,ICMP6_MIB_OUTMSGS);
1489 IP6_INC_STATS(idev, IPSTATS_MIB_OUTMCASTPKTS);
1491 IP6_INC_STATS(idev, IPSTATS_MIB_OUTDISCARDS);
1493 if (likely(idev != NULL))
1494 in6_dev_put(idev);
1505 struct net_device *dev = pmc->idev->dev;
1530 struct net_device *dev = pmc->idev->dev;
1636 static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc)
1642 read_lock_bh(&idev->lock);
1643 for (pmc=idev->mc_list; pmc; pmc=pmc->next) {
1654 read_unlock_bh(&idev->lock);
1689 static void mld_send_cr(struct inet6_dev *idev)
1695 read_lock_bh(&idev->lock);
1696 write_lock_bh(&idev->mc_lock);
1700 for (pmc=idev->mc_tomb; pmc; pmc=pmc_next) {
1724 idev->mc_tomb = pmc_next;
1725 in6_dev_put(pmc->idev);
1730 write_unlock_bh(&idev->mc_lock);
1733 for (pmc=idev->mc_list; pmc; pmc=pmc->next) {
1756 read_unlock_bh(&idev->lock);
1765 struct inet6_dev *idev;
1826 idev = in6_dev_get(skb->dev);
1832 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTGROUPMEMBREDUCTIONS);
1834 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTGROUPMEMBRESPONSES);
1835 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTMSGS);
1836 IP6_INC_STATS(idev, IPSTATS_MIB_OUTMCASTPKTS);
1838 IP6_INC_STATS(idev, IPSTATS_MIB_OUTDISCARDS);
1840 if (likely(idev != NULL))
1841 in6_dev_put(idev);
1863 struct inet6_dev *idev = pmc->idev;
1871 !MLD_V1_SEEN(idev)) {
1872 psf->sf_crcount = idev->mc_qrv;
1882 static int ip6_mc_del_src(struct inet6_dev *idev, struct in6_addr *pmca,
1890 if (!idev)
1892 read_lock_bh(&idev->lock);
1893 for (pmc=idev->mc_list; pmc; pmc=pmc->next) {
1899 read_unlock_bh(&idev->lock);
1907 read_unlock_bh(&idev->lock);
1927 pmc->mca_crcount = idev->mc_qrv;
1928 idev->mc_ifc_count = pmc->mca_crcount;
1931 mld_ifc_event(pmc->idev);
1933 mld_ifc_event(pmc->idev);
1935 read_unlock_bh(&idev->lock);
1986 int qrv = pmc->idev->mc_qrv;
2047 static int ip6_mc_add_src(struct inet6_dev *idev, struct in6_addr *pmca,
2055 if (!idev)
2057 read_lock_bh(&idev->lock);
2058 for (pmc=idev->mc_list; pmc; pmc=pmc->next) {
2064 read_unlock_bh(&idev->lock);
2087 struct inet6_dev *idev = pmc->idev;
2097 pmc->mca_crcount = idev->mc_qrv;
2098 idev->mc_ifc_count = pmc->mca_crcount;
2101 mld_ifc_event(idev);
2103 mld_ifc_event(idev);
2105 read_unlock_bh(&idev->lock);
2136 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT);
2153 struct inet6_dev *idev)
2162 return ip6_mc_del_src(idev, &iml->addr, iml->sfmode, 0, NULL, 0);
2164 err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode,
2173 if (MLD_V1_SEEN(ma->idev)) {
2175 igmp6_send(&ma->mca_addr, ma->idev->dev,
2178 mld_add_delrec(ma->idev, ma);
2179 mld_ifc_event(ma->idev);
2185 struct inet6_dev *idev = (struct inet6_dev *)data;
2187 idev->mc_gq_running = 0;
2188 mld_send_report(idev, NULL);
2189 __in6_dev_put(idev);
2194 struct inet6_dev *idev = (struct inet6_dev *)data;
2200 if (!strcmp(idev->dev->name, lan_if_name) && !lan_dad_detected)
2201 mld_send_cr(idev);
2202 else if (!strcmp(idev->dev->name, wan_if_name) && !wan_dad_detected)
2203 mld_send_cr(idev);
2206 if (idev->mc_ifc_count) {
2207 idev->mc_ifc_count--;
2208 if (idev->mc_ifc_count)
2209 mld_ifc_start_timer(idev, idev->mc_maxdelay);
2211 __in6_dev_put(idev);
2214 static void mld_ifc_event(struct inet6_dev *idev)
2216 if (MLD_V1_SEEN(idev))
2218 idev->mc_ifc_count = idev->mc_qrv;
2219 mld_ifc_start_timer(idev, 1);
2227 if (MLD_V1_SEEN(ma->idev))
2228 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT);
2230 mld_send_report(ma->idev, ma);
2241 void ipv6_mc_down(struct inet6_dev *idev)
2247 read_lock_bh(&idev->lock);
2248 idev->mc_ifc_count = 0;
2249 if (del_timer(&idev->mc_ifc_timer))
2250 __in6_dev_put(idev);
2251 idev->mc_gq_running = 0;
2252 if (del_timer(&idev->mc_gq_timer))
2253 __in6_dev_put(idev);
2255 for (i = idev->mc_list; i; i=i->next)
2257 read_unlock_bh(&idev->lock);
2259 mld_clear_delrec(idev);
2265 void ipv6_mc_up(struct inet6_dev *idev)
2271 read_lock_bh(&idev->lock);
2272 for (i = idev->mc_list; i; i=i->next)
2274 read_unlock_bh(&idev->lock);
2279 void ipv6_mc_init_dev(struct inet6_dev *idev)
2281 write_lock_bh(&idev->lock);
2282 rwlock_init(&idev->mc_lock);
2283 idev->mc_gq_running = 0;
2284 init_timer(&idev->mc_gq_timer);
2285 idev->mc_gq_timer.data = (unsigned long) idev;
2286 idev->mc_gq_timer.function = &mld_gq_timer_expire;
2287 idev->mc_tomb = NULL;
2288 idev->mc_ifc_count = 0;
2289 init_timer(&idev->mc_ifc_timer);
2290 idev->mc_ifc_timer.data = (unsigned long) idev;
2291 idev->mc_ifc_timer.function = &mld_ifc_timer_expire;
2292 idev->mc_qrv = MLD_QRV_DEFAULT;
2293 idev->mc_maxdelay = IGMP6_UNSOLICITED_IVAL;
2294 idev->mc_v1_seen = 0;
2295 write_unlock_bh(&idev->lock);
2302 void ipv6_mc_destroy_dev(struct inet6_dev *idev)
2308 ipv6_mc_down(idev);
2317 __ipv6_dev_mc_dec(idev, &maddr);
2319 if (idev->cnf.forwarding) {
2321 __ipv6_dev_mc_dec(idev, &maddr);
2324 write_lock_bh(&idev->lock);
2325 while ((i = idev->mc_list) != NULL) {
2326 idev->mc_list = i->next;
2327 write_unlock_bh(&idev->lock);
2332 write_lock_bh(&idev->lock);
2334 write_unlock_bh(&idev->lock);
2340 struct inet6_dev *idev;
2350 state->idev = NULL;
2352 struct inet6_dev *idev;
2353 idev = in6_dev_get(state->dev);
2354 if (!idev)
2356 read_lock_bh(&idev->lock);
2357 im = idev->mc_list;
2359 state->idev = idev;
2362 read_unlock_bh(&idev->lock);
2363 in6_dev_put(idev);
2374 if (likely(state->idev != NULL)) {
2375 read_unlock_bh(&state->idev->lock);
2376 in6_dev_put(state->idev);
2380 state->idev = NULL;
2383 state->idev = in6_dev_get(state->dev);
2384 if (!state->idev)
2386 read_lock_bh(&state->idev->lock);
2387 im = state->idev->mc_list;
2418 if (likely(state->idev != NULL)) {
2419 read_unlock_bh(&state->idev->lock);
2420 in6_dev_put(state->idev);
2421 state->idev = NULL;
2481 struct inet6_dev *idev;
2493 state->idev = NULL;
2496 struct inet6_dev *idev;
2497 idev = in6_dev_get(state->dev);
2498 if (unlikely(idev == NULL))
2500 read_lock_bh(&idev->lock);
2501 im = idev->mc_list;
2507 state->idev = idev;
2512 read_unlock_bh(&idev->lock);
2513 in6_dev_put(idev);
2527 if (likely(state->idev != NULL)) {
2528 read_unlock_bh(&state->idev->lock);
2529 in6_dev_put(state->idev);
2533 state->idev = NULL;
2536 state->idev = in6_dev_get(state->dev);
2537 if (!state->idev)
2539 read_lock_bh(&state->idev->lock);
2540 state->im = state->idev->mc_list;
2584 if (likely(state->idev != NULL)) {
2585 read_unlock_bh(&state->idev->lock);
2586 in6_dev_put(state->idev);
2587 state->idev = NULL;