aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/macvlan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/macvlan.c')
-rw-r--r--drivers/net/macvlan.c35
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
246del_unicast: 246del_unicast:
247 dev_unicast_delete(lowerdev, dev->dev_addr, ETH_ALEN); 247 dev_unicast_delete(lowerdev, dev->dev_addr);
248out: 248out:
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,
374static u32 macvlan_ethtool_get_rx_csum(struct net_device *dev) 376static 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
385static int macvlan_ethtool_get_settings(struct net_device *dev, 382static 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
398static u32 macvlan_ethtool_get_flags(struct net_device *dev) 389static 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
409static const struct ethtool_ops macvlan_ethtool_ops = { 395static 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,