mac80211: add helpers for frame control testing
PATCH v2 1/11 mac80211: add helpers for frame control testing
A few general categories:
1) ieee80211_has_* tests if particular fctl bits are set, the helpers are de in the same order as the fctl defines:
A combined _has_a4 was also added to test when both FROMDS and TODS are set.
2) ieee80211_is_* is meant to test whether the frame control is of a certain ftype - data, mgmt, ctl, and two special helpers _is_data_qos, _is_data_pres which also test a subset of the stype space.
When testing for a particular stype applicable only to one ftype, functions like ieee80211_is_ack have been added. Note that the ftype is also being checked in these helpers. They have been added for all mgmt and ctl stypes in the same order as the STYPE defines.
3) ieee80211_get_* is meant to take a struct ieee80211_hdr * and returns a pointer to somewhere in the struct, see get_SA, get_DA, get_qos_ctl.
The intel wireless drivers had helpers that used this namespace, convert the all to use the new helpers and remove the byteshifting as they were defined in cpu-order rather than little-endian.
---
I think this series is ready for wireless-testing.
drivers/net/wireless/iwlwifi/iwl-3945.c | 36 ++-- drivers/net/wireless/iwlwifi/iwl-4965-rs.c | 17 +- drivers/net/wireless/iwlwifi/iwl-4965.c | 28 +- drivers/net/wireless/iwlwifi/iwl-helpers.h | 109 -------- drivers/net/wireless/iwlwifi/iwl-tx.c | 49 ++-- drivers/net/wireless/iwlwifi/iwl3945-base.c | 33 +-- include/linux/ieee80211.h | 392 +++++++++++++++++++++++++-- 7 files changed, 455 insertions(+), 209 deletions(-)
drivers/net/wireless/iwlwifi/iwl-3945.c +18 -18
@@ -388,7 +388,7 @@ static void iwl3945_dbg_report_frame(struct iwl3945_priv *priv,u32 print_dump =0 ;/* set to 1 to dump all frames' contents */ u32 hundred =0 ;u32 dataframe =0 ; -u16 fc; +__le16 fc;u16 seq_ctl;u16 channel;u16 phy_flags;
@@ -407,7 +407,7 @@ static void iwl3945_dbg_report_frame(struct iwl3945_priv *priv,u8 *data =IWL_RX_DATA (pkt);/* MAC header */ - fc =le16_to_cpu (header->frame_control); + fc = header->frame_control; seq_ctl =le16_to_cpu (header->seq_ctrl);/* metadata */
@@ -431,8 +431,8 @@ static void iwl3945_dbg_report_frame(struct iwl3945_priv *priv,/* if data frame is to us and all is good, * (optionally) print summary for only 1 out of every 100 */ -if (to_us && (fc & ~IEEE80211_FCTL_PROTECTED ) == - (IEEE80211_FCTL_FROMDS |IEEE80211_FTYPE_DATA )) { +if (to_us && (fc & ~cpu_to_le16 (IEEE80211_FCTL_PROTECTED )) == +cpu_to_le16 (IEEE80211_FCTL_FROMDS |IEEE80211_FTYPE_DATA )) { dataframe =1 ;if (!group100) print_summary =1 ;/* print each frame */
@@ -455,13 +455,13 @@ static void iwl3945_dbg_report_frame(struct iwl3945_priv *priv,if (hundred) title ="100Frames" ; -else if (fc &IEEE80211_FCTL_RETRY ) +else if (ieee80211_has_retry (fc)) title ="Retry" ; -else if (ieee80211_is_assoc_response (fc)) +else if (ieee80211_is_assoc_resp (fc)) title ="AscRsp" ; -else if (ieee80211_is_reassoc_response (fc)) +else if (ieee80211_is_reassoc_resp (fc)) title ="RasRsp" ; -else if (ieee80211_is_probe_response (fc)) { +else if (ieee80211_is_probe_resp (fc)) { title ="PrbRsp" ; print_dump =1 ;/* dump frame contents */ }else if (ieee80211_is_beacon (fc)) {
@@ -490,14 +490,14 @@ static void iwl3945_dbg_report_frame(struct iwl3945_priv *priv,if (dataframe)IWL_DEBUG_RX ("%s: mhd=0x%04x, dst=0x%02x, " "len=%u, rssi=%d, chnl=%d, rate=%u, \n" , - title, fc, header->addr1[5 ], + title,le16_to_cpu (fc), header->addr1[5 ], length, rssi, channel, rate);else {/* src/dst addresses assume managed mode */ IWL_DEBUG_RX ("%s: 0x%04x, dst=0x%02x, " "src=0x%02x, rssi=%u, tim=%lu usec, " "phy=0x%02x, chnl=%d\n" , - title, fc, header->addr1[5 ], + title,le16_to_cpu (fc), header->addr1[5 ], header->addr3[5 ], rssi, tsf_low - priv->scan_start_tsf, phy_flags, channel);
@@ -971,7 +971,7 @@ void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv,u8 rts_retry_limit;u8 data_retry_limit;__le32 tx_flags; -u16 fc =le16_to_cpu (hdr->frame_control); +__le16 fc = hdr->frame_control; rate = iwl3945_rates[rate_index].plcp; tx_flags = cmd->cmd.tx.tx_flags;
@@ -996,7 +996,7 @@ void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv,else rts_retry_limit =7 ; -if (ieee80211_is_probe_response (fc)) { +if (ieee80211_is_probe_resp (fc)) { data_retry_limit =3 ;if (data_retry_limit < rts_retry_limit) rts_retry_limit = data_retry_limit;
@@ -1006,12 +1006,12 @@ void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv,if (priv->data_retry_limit !=-1 ) data_retry_limit = priv->data_retry_limit; -if ((fc &IEEE80211_FCTL_FTYPE ) ==IEEE80211_FTYPE_MGMT ) { -switch (fc &IEEE80211_FCTL_STYPE ) { -case IEEE80211_STYPE_AUTH : -case IEEE80211_STYPE_DEAUTH : -case IEEE80211_STYPE_ASSOC_REQ : -case IEEE80211_STYPE_REASSOC_REQ : +if (ieee80211_is_mgmt (fc)) { +switch (fc &cpu_to_le16 (IEEE80211_FCTL_STYPE )) { +case cpu_to_le16 (IEEE80211_STYPE_AUTH ): +case cpu_to_le16 (IEEE80211_STYPE_DEAUTH ): +case cpu_to_le16 (IEEE80211_STYPE_ASSOC_REQ ): +case cpu_to_le16 (IEEE80211_STYPE_REASSOC_REQ ):if (tx_flags &TX_CMD_FLG_RTS_MSK ) { tx_flags &= ~TX_CMD_FLG_RTS_MSK ; tx_flags |=TX_CMD_FLG_CTS_MSK ;
drivers/net/wireless/iwlwifi/iwl-4965-rs.c +9 -8
@@ -289,11 +289,11 @@ static void rs_tl_add_packet(struct iwl4965_lq_sta *lq_data,u32 time_diff;s32 index;struct iwl4965_traffic_load *tl =NULL ; -u16 fc =le16_to_cpu (hdr->frame_control); +__le16 fc = hdr->frame_control;u8 tid; -if (ieee80211_is_qos_data (fc)) { -u8 *qc =ieee80211_get_qos_ctrl (hdr,ieee80211_get_hdrlen (fc)); +if (ieee80211_is_data_qos (fc)) { +u8 *qc =ieee80211_get_qos_ctl (hdr); tid = qc[0 ] &0xf ; }else return ;
@@ -804,7 +804,7 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev,struct iwl4965_scale_tbl_info tbl_type;struct iwl4965_scale_tbl_info *curr_tbl, *search_tbl;u8 active_index =0 ; -u16 fc =le16_to_cpu (hdr->frame_control); +__le16 fc = hdr->frame_control;s32 tpt =0 ;IWL_DEBUG_RATE_LIMIT ("get frame ack response, update rate scale window\n" );
@@ -1678,7 +1678,8 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,int high_tpt =IWL_INVALID_VALUE ;u32 fail_count;s8 scale_action =0 ; -u16 fc, rate_mask; +__le16 fc; +u16 rate_mask;u8 update_lq =0 ;struct iwl4965_lq_sta *lq_sta;struct iwl4965_scale_tbl_info *tbl, *tbl1;
@@ -1695,7 +1696,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,IWL_DEBUG_RATE ("rate scale calculate new rate for skb\n" ); - fc =le16_to_cpu (hdr->frame_control); + fc = hdr->frame_control;if (!ieee80211_is_data (fc) ||is_multicast_ether_addr (hdr->addr1)) {/* Send management frames and broadcast/multicast data using * lowest rate. */
@@ -2136,7 +2137,7 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev,struct ieee80211_conf *conf = &local->hw.conf;struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;struct sta_info *sta; -u16 fc; +__le16 fc;struct iwl_priv *priv = (struct iwl_priv *)priv_rate;struct iwl4965_lq_sta *lq_sta;
@@ -2148,7 +2149,7 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev,/* Send management frames and broadcast/multicast data using lowest * rate. */ - fc =le16_to_cpu (hdr->frame_control); + fc = hdr->frame_control;if (!ieee80211_is_data (fc) ||is_multicast_ether_addr (hdr->addr1) || !sta || !sta->rate_ctrl_priv) { sel->rate_idx =rate_lowest_index (local, sband, sta);
drivers/net/wireless/iwlwifi/iwl-4965.c +14 -14
@@ -2552,7 +2552,7 @@ static void iwl4965_dbg_report_frame(struct iwl_priv *priv,u32 print_dump =0 ;/* set to 1 to dump all frames' contents */ u32 hundred =0 ;u32 dataframe =0 ; -u16 fc; +__le16 fc;u16 seq_ctl;u16 channel;u16 phy_flags;
@@ -2575,7 +2575,7 @@ static void iwl4965_dbg_report_frame(struct iwl_priv *priv,return ;/* MAC header */ - fc =le16_to_cpu (header->frame_control); + fc = header->frame_control; seq_ctl =le16_to_cpu (header->seq_ctrl);/* metadata */
@@ -2600,8 +2600,8 @@ static void iwl4965_dbg_report_frame(struct iwl_priv *priv,/* if data frame is to us and all is good, * (optionally) print summary for only 1 out of every 100 */ -if (to_us && (fc & ~IEEE80211_FCTL_PROTECTED ) == - (IEEE80211_FCTL_FROMDS |IEEE80211_FTYPE_DATA )) { +if (to_us && (fc & ~cpu_to_le16 (IEEE80211_FCTL_PROTECTED )) == +cpu_to_le16 (IEEE80211_FCTL_FROMDS |IEEE80211_FTYPE_DATA )) { dataframe =1 ;if (!group100) print_summary =1 ;/* print each frame */
@@ -2625,13 +2625,13 @@ static void iwl4965_dbg_report_frame(struct iwl_priv *priv,if (hundred) title ="100Frames" ; -else if (fc &IEEE80211_FCTL_RETRY ) +else if (ieee80211_has_retry (fc)) title ="Retry" ; -else if (ieee80211_is_assoc_response (fc)) +else if (ieee80211_is_assoc_resp (fc)) title ="AscRsp" ; -else if (ieee80211_is_reassoc_response (fc)) +else if (ieee80211_is_reassoc_resp (fc)) title ="RasRsp" ; -else if (ieee80211_is_probe_response (fc)) { +else if (ieee80211_is_probe_resp (fc)) { title ="PrbRsp" ; print_dump =1 ;/* dump frame contents */ }else if (ieee80211_is_beacon (fc)) {
@@ -2660,14 +2660,14 @@ static void iwl4965_dbg_report_frame(struct iwl_priv *priv,if (dataframe)IWL_DEBUG_RX ("%s: mhd=0x%04x, dst=0x%02x, " "len=%u, rssi=%d, chnl=%d, rate=%u, \n" , - title, fc, header->addr1[5 ], + title,le16_to_cpu (fc), header->addr1[5 ], length, rssi, channel, bitrate);else {/* src/dst addresses assume managed mode */ IWL_DEBUG_RX ("%s: 0x%04x, dst=0x%02x, " "src=0x%02x, rssi=%u, tim=%lu usec, " "phy=0x%02x, chnl=%d\n" , - title, fc, header->addr1[5 ], + title,le16_to_cpu (fc), header->addr1[5 ], header->addr3[5 ], rssi, tsf_low - priv->scan_start_tsf, phy_flags, channel);
@@ -3406,7 +3406,7 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,u32 status =le32_to_cpu (tx_resp->status);#ifdef CONFIG_IWL4965_HT int tid =MAX_TID_COUNT , sta_id =IWL_INVALID_STATION ; -u16 fc; +__le16 fc;struct ieee80211_hdr *hdr;u8 *qc =NULL ;#endif
@@ -3424,9 +3424,9 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,#ifdef CONFIG_IWL4965_HT hdr =iwl_tx_queue_get_hdr (priv, txq_id, index); - fc =le16_to_cpu (hdr->frame_control); -if (ieee80211_is_qos_data (fc)) { - qc =ieee80211_get_qos_ctrl (hdr,ieee80211_get_hdrlen (fc)); + fc = hdr->frame_control; +if (ieee80211_is_data_qos (fc)) { + qc =ieee80211_get_qos_ctl (hdr); tid = qc[0 ] &0xf ; }
drivers/net/wireless/iwlwifi/iwl-helpers.h +0 -109
115 lines not on this page · raw message
drivers/net/wireless/iwlwifi/iwl-tx.c +24 -25
136 lines not on this page · raw message
drivers/net/wireless/iwlwifi/iwl3945-base.c +16 -17
@@ -2431,15 +2431,15 @@ static void iwl3945_build_tx_cmd_basic(struct iwl3945_priv *priv,struct ieee80211_hdr *hdr, int is_unicast, u8 std_id) { - u16 fc = le16_to_cpu(hdr->frame_control); + __le16 fc = hdr->frame_control;__le32 tx_flags = cmd->cmd.tx.tx_flags; cmd->cmd.tx.stop_time.life_time =TX_CMD_LIFE_TIME_INFINITE ;if (!(info->flags &IEEE80211_TX_CTL_NO_ACK )) { tx_flags |=TX_CMD_FLG_ACK_MSK ; -if ((fc &IEEE80211_FCTL_FTYPE ) ==IEEE80211_FTYPE_MGMT ) +if (ieee80211_is_mgmt (fc)) tx_flags |=TX_CMD_FLG_SEQ_CTL_MSK ; -if (ieee80211_is_probe_response (fc) && +if (ieee80211_is_probe_resp (fc) && !(le16_to_cpu (hdr->seq_ctrl) &0xf )) tx_flags |=TX_CMD_FLG_TSF_MSK ; }else {
@@ -2451,8 +2451,8 @@ static void iwl3945_build_tx_cmd_basic(struct iwl3945_priv *priv,if (ieee80211_get_morefrag (hdr)) tx_flags |=TX_CMD_FLG_MORE_FRAG_MSK ; -if (ieee80211_is_qos_data (fc)) { -u8 *qc =ieee80211_get_qos_ctrl (hdr,ieee80211_get_hdrlen (fc)); +if (ieee80211_is_data_qos (fc)) { +u8 *qc =ieee80211_get_qos_ctl (hdr); cmd->cmd.tx.tid_tspec = qc[0 ] &0xf ; tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK ; }else {
@@ -2471,9 +2471,8 @@ static void iwl3945_build_tx_cmd_basic(struct iwl3945_priv *priv, tx_flags |=TX_CMD_FLG_FULL_TXOP_PROT_MSK ; tx_flags &= ~(TX_CMD_FLG_ANT_SEL_MSK ); -if ((fc &IEEE80211_FCTL_FTYPE ) ==IEEE80211_FTYPE_MGMT ) { -if ((fc &IEEE80211_FCTL_STYPE ) ==IEEE80211_STYPE_ASSOC_REQ || - (fc &IEEE80211_FCTL_STYPE ) ==IEEE80211_STYPE_REASSOC_REQ ) +if (ieee80211_is_mgmt (fc)) { +if (ieee80211_is_assoc_req (fc) ||ieee80211_is_reassoc_req (fc)) cmd->cmd.tx.timeout.pm_frame_timeout =cpu_to_le16 (3 );else cmd->cmd.tx.timeout.pm_frame_timeout =cpu_to_le16 (2 );
@@ -2564,7 +2563,7 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb)u8 sta_id;u8 tid =0 ;u16 seq_number =0 ; -u16 fc; +__le16 fc;u8 wait_write_ptr =0 ;u8 *qc =NULL ;unsigned long flags;
@@ -2589,28 +2588,28 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb) unicast = !is_multicast_ether_addr (hdr->addr1); id =0 ; - fc =le16_to_cpu (hdr->frame_control); + fc = hdr->frame_control;#ifdef CONFIG_IWL3945_DEBUG if (ieee80211_is_auth (fc))IWL_DEBUG_TX ("Sending AUTH frame\n" ); -else if (ieee80211_is_assoc_request (fc)) +else if (ieee80211_is_assoc_req (fc))IWL_DEBUG_TX ("Sending ASSOC frame\n" ); -else if (ieee80211_is_reassoc_request (fc)) +else if (ieee80211_is_reassoc_req (fc))IWL_DEBUG_TX ("Sending REASSOC frame\n" );#endif /* drop all data frame if we are not associated */ if ((!iwl3945_is_associated (priv) || ((priv->iw_mode ==IEEE80211_IF_TYPE_STA ) && !priv->assoc_id)) && - ((fc &IEEE80211_FCTL_FTYPE ) ==IEEE80211_FTYPE_DATA )) { +ieee80211_is_data (fc)) {IWL_DEBUG_DROP ("Dropping - !iwl3945_is_associated\n" ); goto drop_unlock; }spin_unlock_irqrestore (&priv->lock, flags); - hdr_len =ieee80211_get_hdrlen (fc); + hdr_len =ieee80211_get_hdrlen (le16_to_cpu (fc));/* Find (or create) index into station table for destination station */ sta_id =iwl3945_get_sta_id (priv, hdr);
@@ -2624,8 +2623,8 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb)IWL_DEBUG_RATE ("station Id %d\n" , sta_id); -if (ieee80211_is_qos_data (fc)) { - qc =ieee80211_get_qos_ctrl (hdr, hdr_len); +if (ieee80211_is_data_qos (fc)) { + qc =ieee80211_get_qos_ctl (hdr); tid = qc[0 ] &0xf ; seq_number = priv->stations[sta_id].tid[tid].seq_number &IEEE80211_SCTL_SEQ ;
@@ -2746,7 +2745,7 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb) sizeof(out_cmd->cmd.tx));iwl3945_print_hex_dump (IWL_DL_TX , (u8 *)out_cmd->cmd.tx.hdr, -ieee80211_get_hdrlen (fc)); +ieee80211_get_hdrlen (le16_to_cpu (fc)));/* Tell device the write index *just past* this latest filled TFD */ q->write_ptr =iwl_queue_inc_wrap (q->write_ptr, q->n_bd);
include/linux/ieee80211.h +374 -18
434 lines not on this page · raw message
Signature · 1 line
1.5.6.rc2.261.ga8fbe