Skip to content

Commit

Permalink
rtlwifi: Add encryption argument in rtl_is_special_data for checking …
Browse files Browse the repository at this point in the history
…DHCP packet.

rtl8192cu can't connect to AP after physical reconnect.
according to dmesg, that problem's cause was DHCP timeout.

rtl_is_special_data function checks packet type for adjusting rate.
when that function is called from _rtl_rc_get_highest_rix, it can not
calculate offset correctly. so i add argument is_encn in rtl_is_special_data.
is_enc variable mean that iv header is added in skb parameter.

i test only rtl8192cu chipset. because i doesn't have other rtlwifi chipsets.

Signed-off-by: Taehee Yoo <ap420073@gmail.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
  • Loading branch information
Taehee Yoo authored and Kalle Valo committed Apr 7, 2015
1 parent 00ca180 commit cad737d
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 6 deletions.
7 changes: 5 additions & 2 deletions drivers/net/wireless/rtlwifi/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -1315,7 +1315,8 @@ static void setup_arp_tx(struct rtl_priv *rtlpriv, struct rtl_ps_ctl *ppsc)
}

/*should call before software enc*/
u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx,
bool is_enc)
{
struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
Expand Down Expand Up @@ -1344,7 +1345,9 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
break;
}

offset = mac_hdr_len + SNAP_SIZE + encrypt_header_len;
offset = mac_hdr_len + SNAP_SIZE;
if (is_enc)
offset += encrypt_header_len;
ether_type = be16_to_cpup((__be16 *)(skb->data + offset));

if (ETH_P_IP == ether_type) {
Expand Down
3 changes: 2 additions & 1 deletion drivers/net/wireless/rtlwifi/base.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@ bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx);
int rtlwifi_rate_mapping(struct ieee80211_hw *hw, bool isht,
bool isvht, u8 desc_rate);
bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb);
u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx);
u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx,
bool is_enc);

void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb);
int rtl_tx_agg_start(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/rtlwifi/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -887,7 +887,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
unicast = true;
rtlpriv->stats.rxbytesunicast += skb->len;
}
rtl_is_special_data(hw, skb, false);
rtl_is_special_data(hw, skb, false, true);

if (ieee80211_is_data(fc)) {
rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX);
Expand Down
5 changes: 3 additions & 2 deletions drivers/net/wireless/rtlwifi/rc.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ static u8 _rtl_rc_get_highest_rix(struct rtl_priv *rtlpriv,
wireless_mode = sta_entry->wireless_mode;
}

if (rtl_is_special_data(rtlpriv->mac80211.hw, skb, true) || not_data) {
if (rtl_is_special_data(rtlpriv->mac80211.hw, skb, true, false) ||
not_data) {
return 0;
} else {
if (rtlhal->current_bandtype == BAND_ON_2_4G) {
Expand Down Expand Up @@ -201,7 +202,7 @@ static void rtl_tx_status(void *ppriv,
if (!priv_sta || !ieee80211_is_data(fc))
return;

if (rtl_is_special_data(mac->hw, skb, true))
if (rtl_is_special_data(mac->hw, skb, true, true))
return;

if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
Expand Down

0 comments on commit cad737d

Please sign in to comment.