| From foo@baz Wed Aug 22 09:42:09 CEST 2018 |
| From: Hangbin Liu <liuhangbin@gmail.com> |
| Date: Thu, 21 Jun 2018 19:49:36 +0800 |
| Subject: ipv6: mcast: fix unsolicited report interval after receiving querys |
| |
| From: Hangbin Liu <liuhangbin@gmail.com> |
| |
| [ Upstream commit 6c6da92808442908287fae8ebb0ca041a52469f4 ] |
| |
| After recieving MLD querys, we update idev->mc_maxdelay with max_delay |
| from query header. This make the later unsolicited reports have the same |
| interval with mc_maxdelay, which means we may send unsolicited reports with |
| long interval time instead of default configured interval time. |
| |
| Also as we will not call ipv6_mc_reset() after device up. This issue will |
| be there even after leave the group and join other groups. |
| |
| Fixes: fc4eba58b4c14 ("ipv6: make unsolicited report intervals configurable for mld") |
| Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv6/mcast.c | 9 ++++++--- |
| 1 file changed, 6 insertions(+), 3 deletions(-) |
| |
| --- a/net/ipv6/mcast.c |
| +++ b/net/ipv6/mcast.c |
| @@ -2084,7 +2084,8 @@ void ipv6_mc_dad_complete(struct inet6_d |
| mld_send_initial_cr(idev); |
| idev->mc_dad_count--; |
| if (idev->mc_dad_count) |
| - mld_dad_start_timer(idev, idev->mc_maxdelay); |
| + mld_dad_start_timer(idev, |
| + unsolicited_report_interval(idev)); |
| } |
| } |
| |
| @@ -2096,7 +2097,8 @@ static void mld_dad_timer_expire(unsigne |
| if (idev->mc_dad_count) { |
| idev->mc_dad_count--; |
| if (idev->mc_dad_count) |
| - mld_dad_start_timer(idev, idev->mc_maxdelay); |
| + mld_dad_start_timer(idev, |
| + unsolicited_report_interval(idev)); |
| } |
| in6_dev_put(idev); |
| } |
| @@ -2454,7 +2456,8 @@ static void mld_ifc_timer_expire(unsigne |
| if (idev->mc_ifc_count) { |
| idev->mc_ifc_count--; |
| if (idev->mc_ifc_count) |
| - mld_ifc_start_timer(idev, idev->mc_maxdelay); |
| + mld_ifc_start_timer(idev, |
| + unsolicited_report_interval(idev)); |
| } |
| in6_dev_put(idev); |
| } |