diff options
-rw-r--r-- | Documentation/networking/ip-sysctl.txt | 18 | ||||
-rw-r--r-- | include/linux/ipv6.h | 2 | ||||
-rw-r--r-- | include/uapi/linux/ipv6.h | 2 | ||||
-rw-r--r-- | net/ipv6/addrconf.c | 25 | ||||
-rw-r--r-- | net/ipv6/mcast.c | 17 |
5 files changed, 61 insertions, 3 deletions
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index 36be26b2ef7a..debfe857d8f9 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
@@ -1039,7 +1039,15 @@ disable_policy - BOOLEAN | |||
1039 | disable_xfrm - BOOLEAN | 1039 | disable_xfrm - BOOLEAN |
1040 | Disable IPSEC encryption on this interface, whatever the policy | 1040 | Disable IPSEC encryption on this interface, whatever the policy |
1041 | 1041 | ||
1042 | igmpv2_unsolicited_report_interval - INTEGER | ||
1043 | The interval in milliseconds in which the next unsolicited | ||
1044 | IGMPv1 or IGMPv2 report retransmit will take place. | ||
1045 | Default: 10000 (10 seconds) | ||
1042 | 1046 | ||
1047 | igmpv3_unsolicited_report_interval - INTEGER | ||
1048 | The interval in milliseconds in which the next unsolicited | ||
1049 | IGMPv3 report retransmit will take place. | ||
1050 | Default: 1000 (1 seconds) | ||
1043 | 1051 | ||
1044 | tag - INTEGER | 1052 | tag - INTEGER |
1045 | Allows you to write a number, which can be used as required. | 1053 | Allows you to write a number, which can be used as required. |
@@ -1331,6 +1339,16 @@ ndisc_notify - BOOLEAN | |||
1331 | 1 - Generate unsolicited neighbour advertisements when device is brought | 1339 | 1 - Generate unsolicited neighbour advertisements when device is brought |
1332 | up or hardware address changes. | 1340 | up or hardware address changes. |
1333 | 1341 | ||
1342 | mldv1_unsolicited_report_interval - INTEGER | ||
1343 | The interval in milliseconds in which the next unsolicited | ||
1344 | MLDv1 report retransmit will take place. | ||
1345 | Default: 10000 (10 seconds) | ||
1346 | |||
1347 | mldv2_unsolicited_report_interval - INTEGER | ||
1348 | The interval in milliseconds in which the next unsolicited | ||
1349 | MLDv2 report retransmit will take place. | ||
1350 | Default: 1000 (1 second) | ||
1351 | |||
1334 | icmp/*: | 1352 | icmp/*: |
1335 | ratelimit - INTEGER | 1353 | ratelimit - INTEGER |
1336 | Limit the maximal rates for sending ICMPv6 packets. | 1354 | Limit the maximal rates for sending ICMPv6 packets. |
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 850e95bc766c..77a478462d8e 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
@@ -19,6 +19,8 @@ struct ipv6_devconf { | |||
19 | __s32 rtr_solicit_interval; | 19 | __s32 rtr_solicit_interval; |
20 | __s32 rtr_solicit_delay; | 20 | __s32 rtr_solicit_delay; |
21 | __s32 force_mld_version; | 21 | __s32 force_mld_version; |
22 | __s32 mldv1_unsolicited_report_interval; | ||
23 | __s32 mldv2_unsolicited_report_interval; | ||
22 | #ifdef CONFIG_IPV6_PRIVACY | 24 | #ifdef CONFIG_IPV6_PRIVACY |
23 | __s32 use_tempaddr; | 25 | __s32 use_tempaddr; |
24 | __s32 temp_valid_lft; | 26 | __s32 temp_valid_lft; |
diff --git a/include/uapi/linux/ipv6.h b/include/uapi/linux/ipv6.h index 4bda4cf5b0f5..d07ac6903e59 100644 --- a/include/uapi/linux/ipv6.h +++ b/include/uapi/linux/ipv6.h | |||
@@ -160,6 +160,8 @@ enum { | |||
160 | DEVCONF_ACCEPT_DAD, | 160 | DEVCONF_ACCEPT_DAD, |
161 | DEVCONF_FORCE_TLLAO, | 161 | DEVCONF_FORCE_TLLAO, |
162 | DEVCONF_NDISC_NOTIFY, | 162 | DEVCONF_NDISC_NOTIFY, |
163 | DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL, | ||
164 | DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL, | ||
163 | DEVCONF_MAX | 165 | DEVCONF_MAX |
164 | }; | 166 | }; |
165 | 167 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 7fd8572bac80..ad12f7c43f25 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -177,6 +177,8 @@ static struct ipv6_devconf ipv6_devconf __read_mostly = { | |||
177 | .accept_redirects = 1, | 177 | .accept_redirects = 1, |
178 | .autoconf = 1, | 178 | .autoconf = 1, |
179 | .force_mld_version = 0, | 179 | .force_mld_version = 0, |
180 | .mldv1_unsolicited_report_interval = 10 * HZ, | ||
181 | .mldv2_unsolicited_report_interval = HZ, | ||
180 | .dad_transmits = 1, | 182 | .dad_transmits = 1, |
181 | .rtr_solicits = MAX_RTR_SOLICITATIONS, | 183 | .rtr_solicits = MAX_RTR_SOLICITATIONS, |
182 | .rtr_solicit_interval = RTR_SOLICITATION_INTERVAL, | 184 | .rtr_solicit_interval = RTR_SOLICITATION_INTERVAL, |
@@ -211,6 +213,9 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = { | |||
211 | .accept_ra = 1, | 213 | .accept_ra = 1, |
212 | .accept_redirects = 1, | 214 | .accept_redirects = 1, |
213 | .autoconf = 1, | 215 | .autoconf = 1, |
216 | .force_mld_version = 0, | ||
217 | .mldv1_unsolicited_report_interval = 10 * HZ, | ||
218 | .mldv2_unsolicited_report_interval = HZ, | ||
214 | .dad_transmits = 1, | 219 | .dad_transmits = 1, |
215 | .rtr_solicits = MAX_RTR_SOLICITATIONS, | 220 | .rtr_solicits = MAX_RTR_SOLICITATIONS, |
216 | .rtr_solicit_interval = RTR_SOLICITATION_INTERVAL, | 221 | .rtr_solicit_interval = RTR_SOLICITATION_INTERVAL, |
@@ -4179,6 +4184,10 @@ static inline void ipv6_store_devconf(struct ipv6_devconf *cnf, | |||
4179 | array[DEVCONF_RTR_SOLICIT_DELAY] = | 4184 | array[DEVCONF_RTR_SOLICIT_DELAY] = |
4180 | jiffies_to_msecs(cnf->rtr_solicit_delay); | 4185 | jiffies_to_msecs(cnf->rtr_solicit_delay); |
4181 | array[DEVCONF_FORCE_MLD_VERSION] = cnf->force_mld_version; | 4186 | array[DEVCONF_FORCE_MLD_VERSION] = cnf->force_mld_version; |
4187 | array[DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL] = | ||
4188 | jiffies_to_msecs(cnf->mldv1_unsolicited_report_interval); | ||
4189 | array[DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL] = | ||
4190 | jiffies_to_msecs(cnf->mldv2_unsolicited_report_interval); | ||
4182 | #ifdef CONFIG_IPV6_PRIVACY | 4191 | #ifdef CONFIG_IPV6_PRIVACY |
4183 | array[DEVCONF_USE_TEMPADDR] = cnf->use_tempaddr; | 4192 | array[DEVCONF_USE_TEMPADDR] = cnf->use_tempaddr; |
4184 | array[DEVCONF_TEMP_VALID_LFT] = cnf->temp_valid_lft; | 4193 | array[DEVCONF_TEMP_VALID_LFT] = cnf->temp_valid_lft; |
@@ -4862,6 +4871,22 @@ static struct addrconf_sysctl_table | |||
4862 | .mode = 0644, | 4871 | .mode = 0644, |
4863 | .proc_handler = proc_dointvec, | 4872 | .proc_handler = proc_dointvec, |
4864 | }, | 4873 | }, |
4874 | { | ||
4875 | .procname = "mldv1_unsolicited_report_interval", | ||
4876 | .data = | ||
4877 | &ipv6_devconf.mldv1_unsolicited_report_interval, | ||
4878 | .maxlen = sizeof(int), | ||
4879 | .mode = 0644, | ||
4880 | .proc_handler = proc_dointvec_ms_jiffies, | ||
4881 | }, | ||
4882 | { | ||
4883 | .procname = "mldv2_unsolicited_report_interval", | ||
4884 | .data = | ||
4885 | &ipv6_devconf.mldv2_unsolicited_report_interval, | ||
4886 | .maxlen = sizeof(int), | ||
4887 | .mode = 0644, | ||
4888 | .proc_handler = proc_dointvec_ms_jiffies, | ||
4889 | }, | ||
4865 | #ifdef CONFIG_IPV6_PRIVACY | 4890 | #ifdef CONFIG_IPV6_PRIVACY |
4866 | { | 4891 | { |
4867 | .procname = "use_tempaddr", | 4892 | .procname = "use_tempaddr", |
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index db25b8eb62bd..6c76df9909bf 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -108,7 +108,6 @@ static int ip6_mc_leave_src(struct sock *sk, struct ipv6_mc_socklist *iml, | |||
108 | struct inet6_dev *idev); | 108 | struct inet6_dev *idev); |
109 | 109 | ||
110 | 110 | ||
111 | #define IGMP6_UNSOLICITED_IVAL (10*HZ) | ||
112 | #define MLD_QRV_DEFAULT 2 | 111 | #define MLD_QRV_DEFAULT 2 |
113 | 112 | ||
114 | #define MLD_V1_SEEN(idev) (dev_net((idev)->dev)->ipv6.devconf_all->force_mld_version == 1 || \ | 113 | #define MLD_V1_SEEN(idev) (dev_net((idev)->dev)->ipv6.devconf_all->force_mld_version == 1 || \ |
@@ -129,6 +128,18 @@ int sysctl_mld_max_msf __read_mostly = IPV6_MLD_MAX_MSF; | |||
129 | pmc != NULL; \ | 128 | pmc != NULL; \ |
130 | pmc = rcu_dereference(pmc->next)) | 129 | pmc = rcu_dereference(pmc->next)) |
131 | 130 | ||
131 | static int unsolicited_report_interval(struct inet6_dev *idev) | ||
132 | { | ||
133 | int iv; | ||
134 | |||
135 | if (MLD_V1_SEEN(idev)) | ||
136 | iv = idev->cnf.mldv1_unsolicited_report_interval; | ||
137 | else | ||
138 | iv = idev->cnf.mldv2_unsolicited_report_interval; | ||
139 | |||
140 | return iv > 0 ? iv : 1; | ||
141 | } | ||
142 | |||
132 | int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr) | 143 | int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr) |
133 | { | 144 | { |
134 | struct net_device *dev = NULL; | 145 | struct net_device *dev = NULL; |
@@ -2158,7 +2169,7 @@ static void igmp6_join_group(struct ifmcaddr6 *ma) | |||
2158 | 2169 | ||
2159 | igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); | 2170 | igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); |
2160 | 2171 | ||
2161 | delay = net_random() % IGMP6_UNSOLICITED_IVAL; | 2172 | delay = net_random() % unsolicited_report_interval(ma->idev); |
2162 | 2173 | ||
2163 | spin_lock_bh(&ma->mca_lock); | 2174 | spin_lock_bh(&ma->mca_lock); |
2164 | if (del_timer(&ma->mca_timer)) { | 2175 | if (del_timer(&ma->mca_timer)) { |
@@ -2325,7 +2336,7 @@ void ipv6_mc_init_dev(struct inet6_dev *idev) | |||
2325 | setup_timer(&idev->mc_dad_timer, mld_dad_timer_expire, | 2336 | setup_timer(&idev->mc_dad_timer, mld_dad_timer_expire, |
2326 | (unsigned long)idev); | 2337 | (unsigned long)idev); |
2327 | idev->mc_qrv = MLD_QRV_DEFAULT; | 2338 | idev->mc_qrv = MLD_QRV_DEFAULT; |
2328 | idev->mc_maxdelay = IGMP6_UNSOLICITED_IVAL; | 2339 | idev->mc_maxdelay = unsolicited_report_interval(idev); |
2329 | idev->mc_v1_seen = 0; | 2340 | idev->mc_v1_seen = 0; |
2330 | write_unlock_bh(&idev->lock); | 2341 | write_unlock_bh(&idev->lock); |
2331 | } | 2342 | } |