summaryrefslogtreecommitdiffstats
path: root/net/ipv6
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-12-31 18:20:10 -0500
committerDavid S. Miller <davem@davemloft.net>2015-12-31 18:20:10 -0500
commitc07f30ad68053181b3e8a0e65b0630e12e844f91 (patch)
tree8758968aabc844c435ff2a5d7d02c835fccd02a3 /net/ipv6
parent7b22a7788b0263f42f7232c5c05c503424ffa0ba (diff)
parent9c982e86dbdbaa3fb248dfc776dddda32cbc8927 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'net/ipv6')
-rw-r--r--net/ipv6/addrconf.c11
-rw-r--r--net/ipv6/addrlabel.c2
-rw-r--r--net/ipv6/ndisc.c4
-rw-r--r--net/ipv6/xfrm6_policy.c53
4 files changed, 45 insertions, 25 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 819b7777f3cb..8697551b16a8 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -5415,13 +5415,10 @@ static int addrconf_sysctl_stable_secret(struct ctl_table *ctl, int write,
5415 goto out; 5415 goto out;
5416 } 5416 }
5417 5417
5418 if (!write) { 5418 err = snprintf(str, sizeof(str), "%pI6", &secret->secret);
5419 err = snprintf(str, sizeof(str), "%pI6", 5419 if (err >= sizeof(str)) {
5420 &secret->secret); 5420 err = -EIO;
5421 if (err >= sizeof(str)) { 5421 goto out;
5422 err = -EIO;
5423 goto out;
5424 }
5425 } 5422 }
5426 5423
5427 err = proc_dostring(&lctl, write, buffer, lenp, ppos); 5424 err = proc_dostring(&lctl, write, buffer, lenp, ppos);
diff --git a/net/ipv6/addrlabel.c b/net/ipv6/addrlabel.c
index 882124ebb438..a8f6986dcbe5 100644
--- a/net/ipv6/addrlabel.c
+++ b/net/ipv6/addrlabel.c
@@ -552,7 +552,7 @@ static int ip6addrlbl_get(struct sk_buff *in_skb, struct nlmsghdr *nlh)
552 552
553 rcu_read_lock(); 553 rcu_read_lock();
554 p = __ipv6_addr_label(net, addr, ipv6_addr_type(addr), ifal->ifal_index); 554 p = __ipv6_addr_label(net, addr, ipv6_addr_type(addr), ifal->ifal_index);
555 if (p && ip6addrlbl_hold(p)) 555 if (p && !ip6addrlbl_hold(p))
556 p = NULL; 556 p = NULL;
557 lseq = ip6addrlbl_table.seq; 557 lseq = ip6addrlbl_table.seq;
558 rcu_read_unlock(); 558 rcu_read_unlock();
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index d6161e1c48c8..84afb9a77278 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -1183,7 +1183,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
1183 */ 1183 */
1184 if (!in6_dev->cnf.accept_ra_from_local && 1184 if (!in6_dev->cnf.accept_ra_from_local &&
1185 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, 1185 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
1186 NULL, 0)) { 1186 in6_dev->dev, 0)) {
1187 ND_PRINTK(2, info, 1187 ND_PRINTK(2, info,
1188 "RA from local address detected on dev: %s: default router ignored\n", 1188 "RA from local address detected on dev: %s: default router ignored\n",
1189 skb->dev->name); 1189 skb->dev->name);
@@ -1337,7 +1337,7 @@ skip_linkparms:
1337#ifdef CONFIG_IPV6_ROUTE_INFO 1337#ifdef CONFIG_IPV6_ROUTE_INFO
1338 if (!in6_dev->cnf.accept_ra_from_local && 1338 if (!in6_dev->cnf.accept_ra_from_local &&
1339 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, 1339 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
1340 NULL, 0)) { 1340 in6_dev->dev, 0)) {
1341 ND_PRINTK(2, info, 1341 ND_PRINTK(2, info,
1342 "RA from local address detected on dev: %s: router info ignored.\n", 1342 "RA from local address detected on dev: %s: router info ignored.\n",
1343 skb->dev->name); 1343 skb->dev->name);
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c
index 5643423fe67a..c074771a10f7 100644
--- a/net/ipv6/xfrm6_policy.c
+++ b/net/ipv6/xfrm6_policy.c
@@ -279,7 +279,7 @@ static void xfrm6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
279 xfrm_dst_ifdown(dst, dev); 279 xfrm_dst_ifdown(dst, dev);
280} 280}
281 281
282static struct dst_ops xfrm6_dst_ops = { 282static struct dst_ops xfrm6_dst_ops_template = {
283 .family = AF_INET6, 283 .family = AF_INET6,
284 .gc = xfrm6_garbage_collect, 284 .gc = xfrm6_garbage_collect,
285 .update_pmtu = xfrm6_update_pmtu, 285 .update_pmtu = xfrm6_update_pmtu,
@@ -293,7 +293,7 @@ static struct dst_ops xfrm6_dst_ops = {
293 293
294static struct xfrm_policy_afinfo xfrm6_policy_afinfo = { 294static struct xfrm_policy_afinfo xfrm6_policy_afinfo = {
295 .family = AF_INET6, 295 .family = AF_INET6,
296 .dst_ops = &xfrm6_dst_ops, 296 .dst_ops = &xfrm6_dst_ops_template,
297 .dst_lookup = xfrm6_dst_lookup, 297 .dst_lookup = xfrm6_dst_lookup,
298 .get_saddr = xfrm6_get_saddr, 298 .get_saddr = xfrm6_get_saddr,
299 .decode_session = _decode_session6, 299 .decode_session = _decode_session6,
@@ -325,7 +325,7 @@ static struct ctl_table xfrm6_policy_table[] = {
325 { } 325 { }
326}; 326};
327 327
328static int __net_init xfrm6_net_init(struct net *net) 328static int __net_init xfrm6_net_sysctl_init(struct net *net)
329{ 329{
330 struct ctl_table *table; 330 struct ctl_table *table;
331 struct ctl_table_header *hdr; 331 struct ctl_table_header *hdr;
@@ -353,7 +353,7 @@ err_alloc:
353 return -ENOMEM; 353 return -ENOMEM;
354} 354}
355 355
356static void __net_exit xfrm6_net_exit(struct net *net) 356static void __net_exit xfrm6_net_sysctl_exit(struct net *net)
357{ 357{
358 struct ctl_table *table; 358 struct ctl_table *table;
359 359
@@ -365,24 +365,52 @@ static void __net_exit xfrm6_net_exit(struct net *net)
365 if (!net_eq(net, &init_net)) 365 if (!net_eq(net, &init_net))
366 kfree(table); 366 kfree(table);
367} 367}
368#else /* CONFIG_SYSCTL */
369static int inline xfrm6_net_sysctl_init(struct net *net)
370{
371 return 0;
372}
373
374static void inline xfrm6_net_sysctl_exit(struct net *net)
375{
376}
377#endif
378
379static int __net_init xfrm6_net_init(struct net *net)
380{
381 int ret;
382
383 memcpy(&net->xfrm.xfrm6_dst_ops, &xfrm6_dst_ops_template,
384 sizeof(xfrm6_dst_ops_template));
385 ret = dst_entries_init(&net->xfrm.xfrm6_dst_ops);
386 if (ret)
387 return ret;
388
389 ret = xfrm6_net_sysctl_init(net);
390 if (ret)
391 dst_entries_destroy(&net->xfrm.xfrm6_dst_ops);
392
393 return ret;
394}
395
396static void __net_exit xfrm6_net_exit(struct net *net)
397{
398 xfrm6_net_sysctl_exit(net);
399 dst_entries_destroy(&net->xfrm.xfrm6_dst_ops);
400}
368 401
369static struct pernet_operations xfrm6_net_ops = { 402static struct pernet_operations xfrm6_net_ops = {
370 .init = xfrm6_net_init, 403 .init = xfrm6_net_init,
371 .exit = xfrm6_net_exit, 404 .exit = xfrm6_net_exit,
372}; 405};
373#endif
374 406
375int __init xfrm6_init(void) 407int __init xfrm6_init(void)
376{ 408{
377 int ret; 409 int ret;
378 410
379 dst_entries_init(&xfrm6_dst_ops);
380
381 ret = xfrm6_policy_init(); 411 ret = xfrm6_policy_init();
382 if (ret) { 412 if (ret)
383 dst_entries_destroy(&xfrm6_dst_ops);
384 goto out; 413 goto out;
385 }
386 ret = xfrm6_state_init(); 414 ret = xfrm6_state_init();
387 if (ret) 415 if (ret)
388 goto out_policy; 416 goto out_policy;
@@ -391,9 +419,7 @@ int __init xfrm6_init(void)
391 if (ret) 419 if (ret)
392 goto out_state; 420 goto out_state;
393 421
394#ifdef CONFIG_SYSCTL
395 register_pernet_subsys(&xfrm6_net_ops); 422 register_pernet_subsys(&xfrm6_net_ops);
396#endif
397out: 423out:
398 return ret; 424 return ret;
399out_state: 425out_state:
@@ -405,11 +431,8 @@ out_policy:
405 431
406void xfrm6_fini(void) 432void xfrm6_fini(void)
407{ 433{
408#ifdef CONFIG_SYSCTL
409 unregister_pernet_subsys(&xfrm6_net_ops); 434 unregister_pernet_subsys(&xfrm6_net_ops);
410#endif
411 xfrm6_protocol_fini(); 435 xfrm6_protocol_fini();
412 xfrm6_policy_fini(); 436 xfrm6_policy_fini();
413 xfrm6_state_fini(); 437 xfrm6_state_fini();
414 dst_entries_destroy(&xfrm6_dst_ops);
415} 438}