mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-27 12:04:28 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			40 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- a/net80211/ieee80211_input.c
 | |
| +++ b/net80211/ieee80211_input.c
 | |
| @@ -1197,6 +1197,7 @@ ieee80211_deliver_data(struct ieee80211_
 | |
|  		}
 | |
|  		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));
 | |
| @@ -1204,7 +1205,12 @@ ieee80211_deliver_data(struct ieee80211_
 | |
|  			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);
 | |
| +
 | |
| +			else 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
 | |
| @@ -324,9 +324,10 @@ void ieee80211_parent_queue_xmit(struct 
 | |
|  	/* 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++;
 | |
| -
 | |
|  }
 | |
|  
 | |
|  /*
 |