DHDAXCW-Rockchip-OpenWrt/package/kernel/mac80211/patches/subsys/999-mac80211-nss-classify-tx.patch
2021-07-09 17:39:01 +08:00

46 lines
1.3 KiB
Diff

--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -38,6 +38,11 @@
#include "wme.h"
#include "rate.h"
+#ifdef CPTCFG_MAC80211_NSS_SUPPORT
+#include <net/ip.h>
+#include <net/dsfield.h>
+#endif
+
/* misc utils */
static inline void ieee80211_tx_stats(struct net_device *dev, u32 len)
@@ -3561,6 +3566,30 @@ void __ieee80211_subif_start_xmit(struct
netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
struct net_device *dev)
{
+#ifdef CPTCFG_MAC80211_NSS_SUPPORT
+ /* Packets from NSS does not have valid protocol, priority and other
+ * network stack values. Derive required parameters (priority
+ * and network_header) from payload for QoS header.
+ * XXX: Here the assumption is that packet are in 802.3 format.
+ * As of now priority is handled only for IPv4 and IPv6.
+ */
+ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+
+ if (sdata->nssctx && likely(!skb->protocol)) {
+ skb_set_network_header(skb, 14);
+ switch (((struct ethhdr *)skb->data)->h_proto) {
+ case htons(ETH_P_IP):
+ skb->priority = (ipv4_get_dsfield(ip_hdr(skb)) &
+ 0xfc) >> 5;
+ break;
+ case htons(ETH_P_IPV6):
+ skb->priority = (ipv6_get_dsfield(ipv6_hdr(skb)) &
+ 0xfc) >> 5;
+ break;
+ }
+ }
+#endif
+
if (unlikely(ieee80211_multicast_to_unicast(skb, dev))) {
struct sk_buff_head queue;