diff options
Diffstat (limited to 'drivers/net/macvlan.c')
-rw-r--r-- | drivers/net/macvlan.c | 35 |
1 files changed, 11 insertions, 24 deletions
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 214a8cf2b708..99eed9f37c84 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
@@ -232,7 +232,7 @@ static int macvlan_open(struct net_device *dev) | |||
232 | if (macvlan_addr_busy(vlan->port, dev->dev_addr)) | 232 | if (macvlan_addr_busy(vlan->port, dev->dev_addr)) |
233 | goto out; | 233 | goto out; |
234 | 234 | ||
235 | err = dev_unicast_add(lowerdev, dev->dev_addr, ETH_ALEN); | 235 | err = dev_unicast_add(lowerdev, dev->dev_addr); |
236 | if (err < 0) | 236 | if (err < 0) |
237 | goto out; | 237 | goto out; |
238 | if (dev->flags & IFF_ALLMULTI) { | 238 | if (dev->flags & IFF_ALLMULTI) { |
@@ -244,7 +244,7 @@ static int macvlan_open(struct net_device *dev) | |||
244 | return 0; | 244 | return 0; |
245 | 245 | ||
246 | del_unicast: | 246 | del_unicast: |
247 | dev_unicast_delete(lowerdev, dev->dev_addr, ETH_ALEN); | 247 | dev_unicast_delete(lowerdev, dev->dev_addr); |
248 | out: | 248 | out: |
249 | return err; | 249 | return err; |
250 | } | 250 | } |
@@ -258,7 +258,7 @@ static int macvlan_stop(struct net_device *dev) | |||
258 | if (dev->flags & IFF_ALLMULTI) | 258 | if (dev->flags & IFF_ALLMULTI) |
259 | dev_set_allmulti(lowerdev, -1); | 259 | dev_set_allmulti(lowerdev, -1); |
260 | 260 | ||
261 | dev_unicast_delete(lowerdev, dev->dev_addr, ETH_ALEN); | 261 | dev_unicast_delete(lowerdev, dev->dev_addr); |
262 | 262 | ||
263 | macvlan_hash_del(vlan); | 263 | macvlan_hash_del(vlan); |
264 | return 0; | 264 | return 0; |
@@ -282,10 +282,11 @@ static int macvlan_set_mac_address(struct net_device *dev, void *p) | |||
282 | if (macvlan_addr_busy(vlan->port, addr->sa_data)) | 282 | if (macvlan_addr_busy(vlan->port, addr->sa_data)) |
283 | return -EBUSY; | 283 | return -EBUSY; |
284 | 284 | ||
285 | if ((err = dev_unicast_add(lowerdev, addr->sa_data, ETH_ALEN))) | 285 | err = dev_unicast_add(lowerdev, addr->sa_data); |
286 | if (err) | ||
286 | return err; | 287 | return err; |
287 | 288 | ||
288 | dev_unicast_delete(lowerdev, dev->dev_addr, ETH_ALEN); | 289 | dev_unicast_delete(lowerdev, dev->dev_addr); |
289 | 290 | ||
290 | macvlan_hash_change_addr(vlan, addr->sa_data); | 291 | macvlan_hash_change_addr(vlan, addr->sa_data); |
291 | } | 292 | } |
@@ -358,6 +359,7 @@ static int macvlan_init(struct net_device *dev) | |||
358 | (lowerdev->state & MACVLAN_STATE_MASK); | 359 | (lowerdev->state & MACVLAN_STATE_MASK); |
359 | dev->features = lowerdev->features & MACVLAN_FEATURES; | 360 | dev->features = lowerdev->features & MACVLAN_FEATURES; |
360 | dev->iflink = lowerdev->ifindex; | 361 | dev->iflink = lowerdev->ifindex; |
362 | dev->hard_header_len = lowerdev->hard_header_len; | ||
361 | 363 | ||
362 | macvlan_set_lockdep_class(dev); | 364 | macvlan_set_lockdep_class(dev); |
363 | 365 | ||
@@ -374,36 +376,20 @@ static void macvlan_ethtool_get_drvinfo(struct net_device *dev, | |||
374 | static u32 macvlan_ethtool_get_rx_csum(struct net_device *dev) | 376 | static u32 macvlan_ethtool_get_rx_csum(struct net_device *dev) |
375 | { | 377 | { |
376 | const struct macvlan_dev *vlan = netdev_priv(dev); | 378 | const struct macvlan_dev *vlan = netdev_priv(dev); |
377 | struct net_device *lowerdev = vlan->lowerdev; | 379 | return dev_ethtool_get_rx_csum(vlan->lowerdev); |
378 | |||
379 | if (lowerdev->ethtool_ops == NULL || | ||
380 | lowerdev->ethtool_ops->get_rx_csum == NULL) | ||
381 | return 0; | ||
382 | return lowerdev->ethtool_ops->get_rx_csum(lowerdev); | ||
383 | } | 380 | } |
384 | 381 | ||
385 | static int macvlan_ethtool_get_settings(struct net_device *dev, | 382 | static int macvlan_ethtool_get_settings(struct net_device *dev, |
386 | struct ethtool_cmd *cmd) | 383 | struct ethtool_cmd *cmd) |
387 | { | 384 | { |
388 | const struct macvlan_dev *vlan = netdev_priv(dev); | 385 | const struct macvlan_dev *vlan = netdev_priv(dev); |
389 | struct net_device *lowerdev = vlan->lowerdev; | 386 | return dev_ethtool_get_settings(vlan->lowerdev, cmd); |
390 | |||
391 | if (!lowerdev->ethtool_ops || | ||
392 | !lowerdev->ethtool_ops->get_settings) | ||
393 | return -EOPNOTSUPP; | ||
394 | |||
395 | return lowerdev->ethtool_ops->get_settings(lowerdev, cmd); | ||
396 | } | 387 | } |
397 | 388 | ||
398 | static u32 macvlan_ethtool_get_flags(struct net_device *dev) | 389 | static u32 macvlan_ethtool_get_flags(struct net_device *dev) |
399 | { | 390 | { |
400 | const struct macvlan_dev *vlan = netdev_priv(dev); | 391 | const struct macvlan_dev *vlan = netdev_priv(dev); |
401 | struct net_device *lowerdev = vlan->lowerdev; | 392 | return dev_ethtool_get_flags(vlan->lowerdev); |
402 | |||
403 | if (!lowerdev->ethtool_ops || | ||
404 | !lowerdev->ethtool_ops->get_flags) | ||
405 | return 0; | ||
406 | return lowerdev->ethtool_ops->get_flags(lowerdev); | ||
407 | } | 393 | } |
408 | 394 | ||
409 | static const struct ethtool_ops macvlan_ethtool_ops = { | 395 | static const struct ethtool_ops macvlan_ethtool_ops = { |
@@ -430,6 +416,7 @@ static void macvlan_setup(struct net_device *dev) | |||
430 | { | 416 | { |
431 | ether_setup(dev); | 417 | ether_setup(dev); |
432 | 418 | ||
419 | dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; | ||
433 | dev->netdev_ops = &macvlan_netdev_ops; | 420 | dev->netdev_ops = &macvlan_netdev_ops; |
434 | dev->destructor = free_netdev; | 421 | dev->destructor = free_netdev; |
435 | dev->header_ops = &macvlan_hard_header_ops, | 422 | dev->header_ops = &macvlan_hard_header_ops, |