|
@@ -508,6 +508,18 @@ ieee80211_tx_h_ps_buf(struct ieee80211_tx_data *tx)
|
|
|
return ieee80211_tx_h_multicast_ps_buf(tx);
|
|
|
}
|
|
|
|
|
|
+static ieee80211_tx_result debug_noinline
|
|
|
+ieee80211_tx_h_check_control_port_protocol(struct ieee80211_tx_data *tx)
|
|
|
+{
|
|
|
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
|
|
+
|
|
|
+ if (unlikely(tx->sdata->control_port_protocol == tx->skb->protocol &&
|
|
|
+ tx->sdata->control_port_no_encrypt))
|
|
|
+ info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
|
|
|
+
|
|
|
+ return TX_CONTINUE;
|
|
|
+}
|
|
|
+
|
|
|
static ieee80211_tx_result debug_noinline
|
|
|
ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
|
|
|
{
|
|
@@ -527,7 +539,7 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
|
|
|
else if ((key = rcu_dereference(tx->sdata->default_key)))
|
|
|
tx->key = key;
|
|
|
else if (tx->sdata->drop_unencrypted &&
|
|
|
- (tx->skb->protocol != cpu_to_be16(ETH_P_PAE)) &&
|
|
|
+ (tx->skb->protocol != tx->sdata->control_port_protocol) &&
|
|
|
!(info->flags & IEEE80211_TX_CTL_INJECTED) &&
|
|
|
(!ieee80211_is_robust_mgmt_frame(hdr) ||
|
|
|
(ieee80211_is_action(hdr->frame_control) &&
|
|
@@ -1349,6 +1361,7 @@ static int invoke_tx_handlers(struct ieee80211_tx_data *tx)
|
|
|
CALL_TXH(ieee80211_tx_h_dynamic_ps);
|
|
|
CALL_TXH(ieee80211_tx_h_check_assoc);
|
|
|
CALL_TXH(ieee80211_tx_h_ps_buf);
|
|
|
+ CALL_TXH(ieee80211_tx_h_check_control_port_protocol);
|
|
|
CALL_TXH(ieee80211_tx_h_select_key);
|
|
|
if (!(tx->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL))
|
|
|
CALL_TXH(ieee80211_tx_h_rate_ctrl);
|
|
@@ -1826,7 +1839,8 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
|
|
|
#endif
|
|
|
case NL80211_IFTYPE_STATION:
|
|
|
memcpy(hdr.addr1, sdata->u.mgd.bssid, ETH_ALEN);
|
|
|
- if (sdata->u.mgd.use_4addr && ethertype != ETH_P_PAE) {
|
|
|
+ if (sdata->u.mgd.use_4addr &&
|
|
|
+ cpu_to_be16(ethertype) != sdata->control_port_protocol) {
|
|
|
fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS);
|
|
|
/* RA TA DA SA */
|
|
|
memcpy(hdr.addr2, sdata->vif.addr, ETH_ALEN);
|
|
@@ -1879,7 +1893,7 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
|
|
|
if (!ieee80211_vif_is_mesh(&sdata->vif) &&
|
|
|
unlikely(!is_multicast_ether_addr(hdr.addr1) &&
|
|
|
!(sta_flags & WLAN_STA_AUTHORIZED) &&
|
|
|
- !(ethertype == ETH_P_PAE &&
|
|
|
+ !(cpu_to_be16(ethertype) == sdata->control_port_protocol &&
|
|
|
compare_ether_addr(sdata->vif.addr,
|
|
|
skb->data + ETH_ALEN) == 0))) {
|
|
|
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
|