aboutsummaryrefslogtreecommitdiffstats
path: root/net/xfrm/xfrm_interface.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-09-15 08:17:27 -0400
committerDavid S. Miller <davem@davemloft.net>2019-09-15 08:17:27 -0400
commitaa2eaa8c272a3211dec07ce9c6c863a7e355c10e (patch)
tree8454a23d36b2ff36133c276ee0ba80eabc00850e /net/xfrm/xfrm_interface.c
parenta3d3c74da49c65fc63a937fa559186b0e16adca3 (diff)
parent1609d7604b847a9820e63393d1a3b6cac7286d40 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Minor overlapping changes in the btusb and ixgbe drivers. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/xfrm/xfrm_interface.c')
-rw-r--r--net/xfrm/xfrm_interface.c56
1 files changed, 25 insertions, 31 deletions
diff --git a/net/xfrm/xfrm_interface.c b/net/xfrm/xfrm_interface.c
index 74868f9d81fb..2ab4859df55a 100644
--- a/net/xfrm/xfrm_interface.c
+++ b/net/xfrm/xfrm_interface.c
@@ -145,8 +145,6 @@ static int xfrmi_create(struct net_device *dev)
145 if (err < 0) 145 if (err < 0)
146 goto out; 146 goto out;
147 147
148 strcpy(xi->p.name, dev->name);
149
150 dev_hold(dev); 148 dev_hold(dev);
151 xfrmi_link(xfrmn, xi); 149 xfrmi_link(xfrmn, xi);
152 150
@@ -177,7 +175,6 @@ static void xfrmi_dev_uninit(struct net_device *dev)
177 struct xfrmi_net *xfrmn = net_generic(xi->net, xfrmi_net_id); 175 struct xfrmi_net *xfrmn = net_generic(xi->net, xfrmi_net_id);
178 176
179 xfrmi_unlink(xfrmn, xi); 177 xfrmi_unlink(xfrmn, xi);
180 dev_put(xi->phydev);
181 dev_put(dev); 178 dev_put(dev);
182} 179}
183 180
@@ -294,7 +291,7 @@ xfrmi_xmit2(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)
294 if (tdev == dev) { 291 if (tdev == dev) {
295 stats->collisions++; 292 stats->collisions++;
296 net_warn_ratelimited("%s: Local routing loop detected!\n", 293 net_warn_ratelimited("%s: Local routing loop detected!\n",
297 xi->p.name); 294 dev->name);
298 goto tx_err_dst_release; 295 goto tx_err_dst_release;
299 } 296 }
300 297
@@ -364,7 +361,7 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, struct net_device *dev)
364 goto tx_err; 361 goto tx_err;
365 } 362 }
366 363
367 fl.flowi_oif = xi->phydev->ifindex; 364 fl.flowi_oif = xi->p.link;
368 365
369 ret = xfrmi_xmit2(skb, dev, &fl); 366 ret = xfrmi_xmit2(skb, dev, &fl);
370 if (ret < 0) 367 if (ret < 0)
@@ -505,7 +502,7 @@ static int xfrmi_change(struct xfrm_if *xi, const struct xfrm_if_parms *p)
505 502
506static int xfrmi_update(struct xfrm_if *xi, struct xfrm_if_parms *p) 503static int xfrmi_update(struct xfrm_if *xi, struct xfrm_if_parms *p)
507{ 504{
508 struct net *net = dev_net(xi->dev); 505 struct net *net = xi->net;
509 struct xfrmi_net *xfrmn = net_generic(net, xfrmi_net_id); 506 struct xfrmi_net *xfrmn = net_generic(net, xfrmi_net_id);
510 int err; 507 int err;
511 508
@@ -550,7 +547,7 @@ static int xfrmi_get_iflink(const struct net_device *dev)
550{ 547{
551 struct xfrm_if *xi = netdev_priv(dev); 548 struct xfrm_if *xi = netdev_priv(dev);
552 549
553 return xi->phydev->ifindex; 550 return xi->p.link;
554} 551}
555 552
556 553
@@ -576,12 +573,14 @@ static void xfrmi_dev_setup(struct net_device *dev)
576 dev->needs_free_netdev = true; 573 dev->needs_free_netdev = true;
577 dev->priv_destructor = xfrmi_dev_free; 574 dev->priv_destructor = xfrmi_dev_free;
578 netif_keep_dst(dev); 575 netif_keep_dst(dev);
576
577 eth_broadcast_addr(dev->broadcast);
579} 578}
580 579
581static int xfrmi_dev_init(struct net_device *dev) 580static int xfrmi_dev_init(struct net_device *dev)
582{ 581{
583 struct xfrm_if *xi = netdev_priv(dev); 582 struct xfrm_if *xi = netdev_priv(dev);
584 struct net_device *phydev = xi->phydev; 583 struct net_device *phydev = __dev_get_by_index(xi->net, xi->p.link);
585 int err; 584 int err;
586 585
587 dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); 586 dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
@@ -596,13 +595,19 @@ static int xfrmi_dev_init(struct net_device *dev)
596 595
597 dev->features |= NETIF_F_LLTX; 596 dev->features |= NETIF_F_LLTX;
598 597
599 dev->needed_headroom = phydev->needed_headroom; 598 if (phydev) {
600 dev->needed_tailroom = phydev->needed_tailroom; 599 dev->needed_headroom = phydev->needed_headroom;
600 dev->needed_tailroom = phydev->needed_tailroom;
601 601
602 if (is_zero_ether_addr(dev->dev_addr)) 602 if (is_zero_ether_addr(dev->dev_addr))
603 eth_hw_addr_inherit(dev, phydev); 603 eth_hw_addr_inherit(dev, phydev);
604 if (is_zero_ether_addr(dev->broadcast)) 604 if (is_zero_ether_addr(dev->broadcast))
605 memcpy(dev->broadcast, phydev->broadcast, dev->addr_len); 605 memcpy(dev->broadcast, phydev->broadcast,
606 dev->addr_len);
607 } else {
608 eth_hw_addr_random(dev);
609 eth_broadcast_addr(dev->broadcast);
610 }
606 611
607 return 0; 612 return 0;
608} 613}
@@ -638,12 +643,6 @@ static int xfrmi_newlink(struct net *src_net, struct net_device *dev,
638 int err; 643 int err;
639 644
640 xfrmi_netlink_parms(data, &p); 645 xfrmi_netlink_parms(data, &p);
641
642 if (!tb[IFLA_IFNAME])
643 return -EINVAL;
644
645 nla_strlcpy(p.name, tb[IFLA_IFNAME], IFNAMSIZ);
646
647 xi = xfrmi_locate(net, &p); 646 xi = xfrmi_locate(net, &p);
648 if (xi) 647 if (xi)
649 return -EEXIST; 648 return -EEXIST;
@@ -652,13 +651,8 @@ static int xfrmi_newlink(struct net *src_net, struct net_device *dev,
652 xi->p = p; 651 xi->p = p;
653 xi->net = net; 652 xi->net = net;
654 xi->dev = dev; 653 xi->dev = dev;
655 xi->phydev = dev_get_by_index(net, p.link);
656 if (!xi->phydev)
657 return -ENODEV;
658 654
659 err = xfrmi_create(dev); 655 err = xfrmi_create(dev);
660 if (err < 0)
661 dev_put(xi->phydev);
662 return err; 656 return err;
663} 657}
664 658
@@ -672,11 +666,11 @@ static int xfrmi_changelink(struct net_device *dev, struct nlattr *tb[],
672 struct netlink_ext_ack *extack) 666 struct netlink_ext_ack *extack)
673{ 667{
674 struct xfrm_if *xi = netdev_priv(dev); 668 struct xfrm_if *xi = netdev_priv(dev);
675 struct net *net = dev_net(dev); 669 struct net *net = xi->net;
676 670 struct xfrm_if_parms p;
677 xfrmi_netlink_parms(data, &xi->p);
678 671
679 xi = xfrmi_locate(net, &xi->p); 672 xfrmi_netlink_parms(data, &p);
673 xi = xfrmi_locate(net, &p);
680 if (!xi) { 674 if (!xi) {
681 xi = netdev_priv(dev); 675 xi = netdev_priv(dev);
682 } else { 676 } else {
@@ -684,7 +678,7 @@ static int xfrmi_changelink(struct net_device *dev, struct nlattr *tb[],
684 return -EEXIST; 678 return -EEXIST;
685 } 679 }
686 680
687 return xfrmi_update(xi, &xi->p); 681 return xfrmi_update(xi, &p);
688} 682}
689 683
690static size_t xfrmi_get_size(const struct net_device *dev) 684static size_t xfrmi_get_size(const struct net_device *dev)
@@ -715,7 +709,7 @@ static struct net *xfrmi_get_link_net(const struct net_device *dev)
715{ 709{
716 struct xfrm_if *xi = netdev_priv(dev); 710 struct xfrm_if *xi = netdev_priv(dev);
717 711
718 return dev_net(xi->phydev); 712 return xi->net;
719} 713}
720 714
721static const struct nla_policy xfrmi_policy[IFLA_XFRM_MAX + 1] = { 715static const struct nla_policy xfrmi_policy[IFLA_XFRM_MAX + 1] = {