|
@@ -559,9 +559,9 @@ static netdev_tx_t macvlan_start_xmit(struct sk_buff *skb,
|
|
|
if (unlikely(netpoll_tx_running(dev)))
|
|
|
return macvlan_netpoll_send_skb(vlan, skb);
|
|
|
|
|
|
- if (vlan->fwd_priv) {
|
|
|
+ if (vlan->accel_priv) {
|
|
|
skb->dev = vlan->lowerdev;
|
|
|
- ret = dev_queue_xmit_accel(skb, vlan->fwd_priv);
|
|
|
+ ret = dev_queue_xmit_accel(skb, vlan->accel_priv);
|
|
|
} else {
|
|
|
ret = macvlan_queue_xmit(skb, dev);
|
|
|
}
|
|
@@ -613,16 +613,23 @@ static int macvlan_open(struct net_device *dev)
|
|
|
goto hash_add;
|
|
|
}
|
|
|
|
|
|
+ err = -EBUSY;
|
|
|
+ if (macvlan_addr_busy(vlan->port, dev->dev_addr))
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ /* Attempt to populate accel_priv which is used to offload the L2
|
|
|
+ * forwarding requests for unicast packets.
|
|
|
+ */
|
|
|
if (lowerdev->features & NETIF_F_HW_L2FW_DOFFLOAD) {
|
|
|
- vlan->fwd_priv =
|
|
|
+ vlan->accel_priv =
|
|
|
lowerdev->netdev_ops->ndo_dfwd_add_station(lowerdev, dev);
|
|
|
|
|
|
/* If we get a NULL pointer back, or if we get an error
|
|
|
* then we should just fall through to the non accelerated path
|
|
|
*/
|
|
|
- if (IS_ERR_OR_NULL(vlan->fwd_priv)) {
|
|
|
- vlan->fwd_priv = NULL;
|
|
|
- } else
|
|
|
+ if (IS_ERR_OR_NULL(vlan->accel_priv))
|
|
|
+ vlan->accel_priv = NULL;
|
|
|
+ else
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -655,10 +662,10 @@ clear_multi:
|
|
|
del_unicast:
|
|
|
dev_uc_del(lowerdev, dev->dev_addr);
|
|
|
out:
|
|
|
- if (vlan->fwd_priv) {
|
|
|
+ if (vlan->accel_priv) {
|
|
|
lowerdev->netdev_ops->ndo_dfwd_del_station(lowerdev,
|
|
|
- vlan->fwd_priv);
|
|
|
- vlan->fwd_priv = NULL;
|
|
|
+ vlan->accel_priv);
|
|
|
+ vlan->accel_priv = NULL;
|
|
|
}
|
|
|
return err;
|
|
|
}
|
|
@@ -668,10 +675,10 @@ static int macvlan_stop(struct net_device *dev)
|
|
|
struct macvlan_dev *vlan = netdev_priv(dev);
|
|
|
struct net_device *lowerdev = vlan->lowerdev;
|
|
|
|
|
|
- if (vlan->fwd_priv) {
|
|
|
+ if (vlan->accel_priv) {
|
|
|
lowerdev->netdev_ops->ndo_dfwd_del_station(lowerdev,
|
|
|
- vlan->fwd_priv);
|
|
|
- vlan->fwd_priv = NULL;
|
|
|
+ vlan->accel_priv);
|
|
|
+ vlan->accel_priv = NULL;
|
|
|
return 0;
|
|
|
}
|
|
|
|