Lines Matching refs:ma

72 static void igmp6_join_group(struct ifmcaddr6 *ma);
73 static void igmp6_leave_group(struct ifmcaddr6 *ma);
947 struct ifmcaddr6 *ma, **map; in __ipv6_dev_mc_dec() local
952 for (map = &idev->mc_list; (ma = *map) != NULL; map = &ma->next) { in __ipv6_dev_mc_dec()
953 if (ipv6_addr_equal(&ma->mca_addr, addr)) { in __ipv6_dev_mc_dec()
954 if (--ma->mca_users == 0) { in __ipv6_dev_mc_dec()
955 *map = ma->next; in __ipv6_dev_mc_dec()
958 igmp6_group_dropped(ma); in __ipv6_dev_mc_dec()
959 ip6_mc_clear_src(ma); in __ipv6_dev_mc_dec()
961 ma_put(ma); in __ipv6_dev_mc_dec()
1082 static void igmp6_group_queried(struct ifmcaddr6 *ma, unsigned long resptime) in igmp6_group_queried() argument
1087 if (ipv6_addr_is_ll_all_nodes(&ma->mca_addr) || in igmp6_group_queried()
1088 IPV6_ADDR_MC_SCOPE(&ma->mca_addr) < IPV6_ADDR_SCOPE_LINKLOCAL) in igmp6_group_queried()
1091 if (del_timer(&ma->mca_timer)) { in igmp6_group_queried()
1092 refcount_dec(&ma->mca_refcnt); in igmp6_group_queried()
1093 delay = ma->mca_timer.expires - jiffies; in igmp6_group_queried()
1099 ma->mca_timer.expires = jiffies + delay; in igmp6_group_queried()
1100 if (!mod_timer(&ma->mca_timer, jiffies + delay)) in igmp6_group_queried()
1101 refcount_inc(&ma->mca_refcnt); in igmp6_group_queried()
1102 ma->mca_flags |= MAF_TIMER_RUNNING; in igmp6_group_queried()
1339 struct ifmcaddr6 *ma; in igmp6_event_query() local
1422 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_query()
1423 spin_lock_bh(&ma->mca_lock); in igmp6_event_query()
1424 igmp6_group_queried(ma, max_delay); in igmp6_event_query()
1425 spin_unlock_bh(&ma->mca_lock); in igmp6_event_query()
1428 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_query()
1429 if (!ipv6_addr_equal(group, &ma->mca_addr)) in igmp6_event_query()
1431 spin_lock_bh(&ma->mca_lock); in igmp6_event_query()
1432 if (ma->mca_flags & MAF_TIMER_RUNNING) { in igmp6_event_query()
1435 ma->mca_flags &= ~MAF_GSQUERY; in igmp6_event_query()
1439 ma->mca_flags |= MAF_GSQUERY; in igmp6_event_query()
1441 ma->mca_flags &= ~MAF_GSQUERY; in igmp6_event_query()
1443 if (!(ma->mca_flags & MAF_GSQUERY) || in igmp6_event_query()
1444 mld_marksources(ma, ntohs(mlh2->mld2q_nsrcs), mlh2->mld2q_srcs)) in igmp6_event_query()
1445 igmp6_group_queried(ma, max_delay); in igmp6_event_query()
1446 spin_unlock_bh(&ma->mca_lock); in igmp6_event_query()
1458 struct ifmcaddr6 *ma; in igmp6_event_report() local
1492 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_report()
1493 if (ipv6_addr_equal(&ma->mca_addr, &mld->mld_mca)) { in igmp6_event_report()
1494 spin_lock(&ma->mca_lock); in igmp6_event_report()
1495 if (del_timer(&ma->mca_timer)) in igmp6_event_report()
1496 refcount_dec(&ma->mca_refcnt); in igmp6_event_report()
1497 ma->mca_flags &= ~(MAF_LAST_REPORTER|MAF_TIMER_RUNNING); in igmp6_event_report()
1498 spin_unlock(&ma->mca_lock); in igmp6_event_report()
2410 static void igmp6_join_group(struct ifmcaddr6 *ma) in igmp6_join_group() argument
2414 if (ma->mca_flags & MAF_NOREPORT) in igmp6_join_group()
2417 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_join_group()
2419 delay = prandom_u32() % unsolicited_report_interval(ma->idev); in igmp6_join_group()
2421 spin_lock_bh(&ma->mca_lock); in igmp6_join_group()
2422 if (del_timer(&ma->mca_timer)) { in igmp6_join_group()
2423 refcount_dec(&ma->mca_refcnt); in igmp6_join_group()
2424 delay = ma->mca_timer.expires - jiffies; in igmp6_join_group()
2427 if (!mod_timer(&ma->mca_timer, jiffies + delay)) in igmp6_join_group()
2428 refcount_inc(&ma->mca_refcnt); in igmp6_join_group()
2429 ma->mca_flags |= MAF_TIMER_RUNNING | MAF_LAST_REPORTER; in igmp6_join_group()
2430 spin_unlock_bh(&ma->mca_lock); in igmp6_join_group()
2452 static void igmp6_leave_group(struct ifmcaddr6 *ma) in igmp6_leave_group() argument
2454 if (mld_in_v1_mode(ma->idev)) { in igmp6_leave_group()
2455 if (ma->mca_flags & MAF_LAST_REPORTER) in igmp6_leave_group()
2456 igmp6_send(&ma->mca_addr, ma->idev->dev, in igmp6_leave_group()
2459 mld_add_delrec(ma->idev, ma); in igmp6_leave_group()
2460 mld_ifc_event(ma->idev); in igmp6_leave_group()
2497 struct ifmcaddr6 *ma = from_timer(ma, t, mca_timer); in igmp6_timer_handler() local
2499 if (mld_in_v1_mode(ma->idev)) in igmp6_timer_handler()
2500 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_timer_handler()
2502 mld_send_report(ma->idev, ma); in igmp6_timer_handler()
2504 spin_lock(&ma->mca_lock); in igmp6_timer_handler()
2505 ma->mca_flags |= MAF_LAST_REPORTER; in igmp6_timer_handler()
2506 ma->mca_flags &= ~MAF_TIMER_RUNNING; in igmp6_timer_handler()
2507 spin_unlock(&ma->mca_lock); in igmp6_timer_handler()
2508 ma_put(ma); in igmp6_timer_handler()