Lines Matching refs:ma
76 static void igmp6_join_group(struct ifmcaddr6 *ma);
77 static void igmp6_leave_group(struct ifmcaddr6 *ma);
911 struct ifmcaddr6 *ma, **map; in __ipv6_dev_mc_dec() local
916 for (map = &idev->mc_list; (ma = *map) != NULL; map = &ma->next) { in __ipv6_dev_mc_dec()
917 if (ipv6_addr_equal(&ma->mca_addr, addr)) { in __ipv6_dev_mc_dec()
918 if (--ma->mca_users == 0) { in __ipv6_dev_mc_dec()
919 *map = ma->next; in __ipv6_dev_mc_dec()
922 igmp6_group_dropped(ma); in __ipv6_dev_mc_dec()
924 ma_put(ma); in __ipv6_dev_mc_dec()
1044 static void igmp6_group_queried(struct ifmcaddr6 *ma, unsigned long resptime) in igmp6_group_queried() argument
1049 if (ipv6_addr_is_ll_all_nodes(&ma->mca_addr) || in igmp6_group_queried()
1050 IPV6_ADDR_MC_SCOPE(&ma->mca_addr) < IPV6_ADDR_SCOPE_LINKLOCAL) in igmp6_group_queried()
1053 if (del_timer(&ma->mca_timer)) { in igmp6_group_queried()
1054 atomic_dec(&ma->mca_refcnt); in igmp6_group_queried()
1055 delay = ma->mca_timer.expires - jiffies; in igmp6_group_queried()
1061 ma->mca_timer.expires = jiffies + delay; in igmp6_group_queried()
1062 if (!mod_timer(&ma->mca_timer, jiffies + delay)) in igmp6_group_queried()
1063 atomic_inc(&ma->mca_refcnt); in igmp6_group_queried()
1064 ma->mca_flags |= MAF_TIMER_RUNNING; in igmp6_group_queried()
1301 struct ifmcaddr6 *ma; in igmp6_event_query() local
1384 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_query()
1385 spin_lock_bh(&ma->mca_lock); in igmp6_event_query()
1386 igmp6_group_queried(ma, max_delay); in igmp6_event_query()
1387 spin_unlock_bh(&ma->mca_lock); in igmp6_event_query()
1390 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_query()
1391 if (!ipv6_addr_equal(group, &ma->mca_addr)) in igmp6_event_query()
1393 spin_lock_bh(&ma->mca_lock); in igmp6_event_query()
1394 if (ma->mca_flags & MAF_TIMER_RUNNING) { in igmp6_event_query()
1397 ma->mca_flags &= ~MAF_GSQUERY; in igmp6_event_query()
1401 ma->mca_flags |= MAF_GSQUERY; in igmp6_event_query()
1403 ma->mca_flags &= ~MAF_GSQUERY; in igmp6_event_query()
1405 if (!(ma->mca_flags & MAF_GSQUERY) || in igmp6_event_query()
1406 mld_marksources(ma, ntohs(mlh2->mld2q_nsrcs), mlh2->mld2q_srcs)) in igmp6_event_query()
1407 igmp6_group_queried(ma, max_delay); in igmp6_event_query()
1408 spin_unlock_bh(&ma->mca_lock); in igmp6_event_query()
1420 struct ifmcaddr6 *ma; in igmp6_event_report() local
1454 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_report()
1455 if (ipv6_addr_equal(&ma->mca_addr, &mld->mld_mca)) { in igmp6_event_report()
1456 spin_lock(&ma->mca_lock); in igmp6_event_report()
1457 if (del_timer(&ma->mca_timer)) in igmp6_event_report()
1458 atomic_dec(&ma->mca_refcnt); in igmp6_event_report()
1459 ma->mca_flags &= ~(MAF_LAST_REPORTER|MAF_TIMER_RUNNING); in igmp6_event_report()
1460 spin_unlock(&ma->mca_lock); in igmp6_event_report()
2358 static void igmp6_join_group(struct ifmcaddr6 *ma) in igmp6_join_group() argument
2362 if (ma->mca_flags & MAF_NOREPORT) in igmp6_join_group()
2365 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_join_group()
2367 delay = prandom_u32() % unsolicited_report_interval(ma->idev); in igmp6_join_group()
2369 spin_lock_bh(&ma->mca_lock); in igmp6_join_group()
2370 if (del_timer(&ma->mca_timer)) { in igmp6_join_group()
2371 atomic_dec(&ma->mca_refcnt); in igmp6_join_group()
2372 delay = ma->mca_timer.expires - jiffies; in igmp6_join_group()
2375 if (!mod_timer(&ma->mca_timer, jiffies + delay)) in igmp6_join_group()
2376 atomic_inc(&ma->mca_refcnt); in igmp6_join_group()
2377 ma->mca_flags |= MAF_TIMER_RUNNING | MAF_LAST_REPORTER; in igmp6_join_group()
2378 spin_unlock_bh(&ma->mca_lock); in igmp6_join_group()
2400 static void igmp6_leave_group(struct ifmcaddr6 *ma) in igmp6_leave_group() argument
2402 if (mld_in_v1_mode(ma->idev)) { in igmp6_leave_group()
2403 if (ma->mca_flags & MAF_LAST_REPORTER) in igmp6_leave_group()
2404 igmp6_send(&ma->mca_addr, ma->idev->dev, in igmp6_leave_group()
2407 mld_add_delrec(ma->idev, ma); in igmp6_leave_group()
2408 mld_ifc_event(ma->idev); in igmp6_leave_group()
2445 struct ifmcaddr6 *ma = (struct ifmcaddr6 *) data; in igmp6_timer_handler() local
2447 if (mld_in_v1_mode(ma->idev)) in igmp6_timer_handler()
2448 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_timer_handler()
2450 mld_send_report(ma->idev, ma); in igmp6_timer_handler()
2452 spin_lock(&ma->mca_lock); in igmp6_timer_handler()
2453 ma->mca_flags |= MAF_LAST_REPORTER; in igmp6_timer_handler()
2454 ma->mca_flags &= ~MAF_TIMER_RUNNING; in igmp6_timer_handler()
2455 spin_unlock(&ma->mca_lock); in igmp6_timer_handler()
2456 ma_put(ma); in igmp6_timer_handler()