--- k/net/core/dev.c (mode:100644) +++ l/net/core/dev.c (mode:100644) @@ -1312,6 +1312,11 @@ int dev_queue_xmit(struct sk_buff *skb) HARD_TX_LOCK(dev, cpu); + if (unlikely(!netif_carrier_ok(dev))) { + HARD_TX_UNLOCK(dev); + goto out_no_carrier; + } + if (!netif_queue_stopped(dev)) { if (netdev_nit) dev_queue_xmit_nit(skb, dev); @@ -1335,6 +1340,7 @@ int dev_queue_xmit(struct sk_buff *skb) } } +out_no_carrier: rc = -ENETDOWN; local_bh_enable(); --- k/net/sched/sch_generic.c (mode:100644) +++ l/net/sched/sch_generic.c (mode:100644) @@ -134,6 +134,11 @@ int qdisc_restart(struct net_device *dev /* And release queue */ spin_unlock(&dev->queue_lock); + if (unlikely(!netif_carrier_ok(dev))) { + kfree_skb(skb); + goto out_no_carrier; + } + if (!netif_queue_stopped(dev)) { int ret; if (netdev_nit) @@ -141,6 +146,7 @@ int qdisc_restart(struct net_device *dev ret = dev->hard_start_xmit(skb, dev); if (ret == NETDEV_TX_OK) { +out_no_carrier: if (!nolock) { dev->xmit_lock_owner = -1; spin_unlock(&dev->xmit_lock);