Commit 65226ef8 authored by Jiri Benc's avatar Jiri Benc Committed by David S. Miller

vxlan: fix initialization with custom link parameters

Commit 0c867c9b ("vxlan: move Ethernet initialization to a separate
function") changed initialization order and as an unintended result, when the
user specifies additional link parameters (such as IFLA_ADDRESS) while
creating vxlan interface, those are overwritten by vxlan_ether_setup later.

It's necessary to call ether_setup from withing the ->setup callback. That
way, the correct parameters are set by rtnl_create_link later. This is done
also for VXLAN-GPE, as we don't know the interface type yet at that point,
and changed to the correct interface type later.

Fixes: 0c867c9b ("vxlan: move Ethernet initialization to a separate function")
Reported-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: default avatarJiri Benc <jbenc@redhat.com>
Tested-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 638af178
...@@ -2557,6 +2557,9 @@ static void vxlan_setup(struct net_device *dev) ...@@ -2557,6 +2557,9 @@ static void vxlan_setup(struct net_device *dev)
struct vxlan_dev *vxlan = netdev_priv(dev); struct vxlan_dev *vxlan = netdev_priv(dev);
unsigned int h; unsigned int h;
eth_hw_addr_random(dev);
ether_setup(dev);
dev->destructor = free_netdev; dev->destructor = free_netdev;
SET_NETDEV_DEVTYPE(dev, &vxlan_type); SET_NETDEV_DEVTYPE(dev, &vxlan_type);
...@@ -2592,8 +2595,6 @@ static void vxlan_setup(struct net_device *dev) ...@@ -2592,8 +2595,6 @@ static void vxlan_setup(struct net_device *dev)
static void vxlan_ether_setup(struct net_device *dev) static void vxlan_ether_setup(struct net_device *dev)
{ {
eth_hw_addr_random(dev);
ether_setup(dev);
dev->priv_flags &= ~IFF_TX_SKB_SHARING; dev->priv_flags &= ~IFF_TX_SKB_SHARING;
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
dev->netdev_ops = &vxlan_netdev_ether_ops; dev->netdev_ops = &vxlan_netdev_ether_ops;
...@@ -2601,11 +2602,10 @@ static void vxlan_ether_setup(struct net_device *dev) ...@@ -2601,11 +2602,10 @@ static void vxlan_ether_setup(struct net_device *dev)
static void vxlan_raw_setup(struct net_device *dev) static void vxlan_raw_setup(struct net_device *dev)
{ {
dev->header_ops = NULL;
dev->type = ARPHRD_NONE; dev->type = ARPHRD_NONE;
dev->hard_header_len = 0; dev->hard_header_len = 0;
dev->addr_len = 0; dev->addr_len = 0;
dev->mtu = ETH_DATA_LEN;
dev->tx_queue_len = 1000;
dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
dev->netdev_ops = &vxlan_netdev_raw_ops; dev->netdev_ops = &vxlan_netdev_raw_ops;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment