mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			40 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
--- a/net80211/ieee80211_input.c
 | 
						|
+++ b/net80211/ieee80211_input.c
 | 
						|
@@ -1183,6 +1183,7 @@
 | 
						|
 		}
 | 
						|
 		if (skb1 != NULL) {
 | 
						|
 			struct ieee80211_node *ni_tmp;
 | 
						|
+			int ret;
 | 
						|
 			skb1->dev = dev;
 | 
						|
 			skb_reset_mac_header(skb1);
 | 
						|
 			skb_set_network_header(skb1, sizeof(struct ether_header));
 | 
						|
@@ -1190,7 +1191,12 @@
 | 
						|
 			skb1->protocol = __constant_htons(ETH_P_802_2);
 | 
						|
 			/* XXX insert vlan tag before queue it? */
 | 
						|
 			ni_tmp = SKB_CB(skb1)->ni; /* remember node so we can free it */
 | 
						|
-			if (dev_queue_xmit(skb1) == NET_XMIT_DROP) {
 | 
						|
+			ret = dev->hard_start_xmit(skb1, dev);
 | 
						|
+
 | 
						|
+			if (ret == NETDEV_TX_BUSY)
 | 
						|
+				ieee80211_dev_kfree_skb(&skb1);
 | 
						|
+
 | 
						|
+			if (ret != NETDEV_TX_OK) {
 | 
						|
 				/* If queue dropped the packet because device was
 | 
						|
 				 * too busy */
 | 
						|
 				vap->iv_devstats.tx_dropped++;
 | 
						|
--- a/net80211/ieee80211_output.c
 | 
						|
+++ b/net80211/ieee80211_output.c
 | 
						|
@@ -329,9 +329,10 @@
 | 
						|
 	/* Dispatch the packet to the parent device */
 | 
						|
 	skb->dev = vap->iv_ic->ic_dev;
 | 
						|
 
 | 
						|
-	if (dev_queue_xmit(skb) == NET_XMIT_DROP)
 | 
						|
+	if (netif_queue_stopped(skb->dev))
 | 
						|
+		ieee80211_dev_kfree_skb(&skb);
 | 
						|
+	else if (dev_queue_xmit(skb) == NET_XMIT_DROP)
 | 
						|
 		vap->iv_devstats.tx_dropped++;
 | 
						|
-
 | 
						|
 }
 | 
						|
 
 | 
						|
 /*
 |