diff options
author | David S. Miller <davem@davemloft.net> | 2019-09-15 08:17:27 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-09-15 08:17:27 -0400 |
commit | aa2eaa8c272a3211dec07ce9c6c863a7e355c10e (patch) | |
tree | 8454a23d36b2ff36133c276ee0ba80eabc00850e /net/xfrm/xfrm_interface.c | |
parent | a3d3c74da49c65fc63a937fa559186b0e16adca3 (diff) | |
parent | 1609d7604b847a9820e63393d1a3b6cac7286d40 (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.c | 56 |
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 | ||
506 | static int xfrmi_update(struct xfrm_if *xi, struct xfrm_if_parms *p) | 503 | static 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 | ||
581 | static int xfrmi_dev_init(struct net_device *dev) | 580 | static 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 | ||
690 | static size_t xfrmi_get_size(const struct net_device *dev) | 684 | static 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 | ||
721 | static const struct nla_policy xfrmi_policy[IFLA_XFRM_MAX + 1] = { | 715 | static const struct nla_policy xfrmi_policy[IFLA_XFRM_MAX + 1] = { |