提交 e56188ac 编写于 作者: H Holger Schurig 提交者: David S. Miller

[PATCH] libertas: clean up scan debug messages

* make scan debug output cleaner
* change some LBS_DEB_ASSOC messages to LBS_DEB_SCAN, which is more correct
* move helper functions together
* print function return value in the tracing code at one central location
Signed-off-by: NHolger Schurig <hs4233@mail.mn-solutions.de>
Acked-By: NDan Williams <dcbw@redhat.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 314a886f
......@@ -800,8 +800,6 @@ int libertas_ret_80211_associate(wlan_private * priv,
netif_wake_queue(priv->mesh_dev);
}
lbs_deb_join("ASSOC_RESP: Associated \n");
memcpy(wrqu.ap_addr.sa_data, adapter->curbssparams.bssid, ETH_ALEN);
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
......
......@@ -65,6 +65,15 @@
static const u8 zeromac[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static const u8 bcastmac[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
/*********************************************************************/
/* */
/* Misc helper functions */
/* */
/*********************************************************************/
static inline void clear_bss_descriptor (struct bss_descriptor * bss)
{
/* Don't blow away ->list, just BSS data */
......@@ -165,7 +174,7 @@ static int is_network_compatible(wlan_adapter * adapter,
{
int matched = 0;
lbs_deb_enter(LBS_DEB_ASSOC);
lbs_deb_enter(LBS_DEB_SCAN);
if (bss->mode != mode)
goto done;
......@@ -214,13 +223,41 @@ static int is_network_compatible(wlan_adapter * adapter,
(bss->capability & WLAN_CAPABILITY_PRIVACY));
done:
lbs_deb_leave(LBS_DEB_SCAN);
lbs_deb_leave_args(LBS_DEB_SCAN, "matched: %d", matched);
return matched;
}
/**
* @brief Compare two SSIDs
*
* @param ssid1 A pointer to ssid to compare
* @param ssid2 A pointer to ssid to compare
*
* @return 0--ssid is same, otherwise is different
*/
int libertas_ssid_cmp(u8 *ssid1, u8 ssid1_len, u8 *ssid2, u8 ssid2_len)
{
if (ssid1_len != ssid2_len)
return -1;
return memcmp(ssid1, ssid2, ssid1_len);
}
/*********************************************************************/
/* */
/* Main scanning support */
/* */
/*********************************************************************/
/**
* @brief Create a channel list for the driver to scan based on region info
*
* Only used from wlan_scan_setup_scan_config()
*
* Use the driver region/band information to construct a comprehensive list
* of channels to scan. This routine is used for any scan that is not
* provided a specific channel list to scan.
......@@ -248,6 +285,8 @@ static void wlan_scan_create_channel_list(wlan_private * priv,
int nextchan;
u8 scantype;
lbs_deb_enter_args(LBS_DEB_SCAN, "filteredscan %d", filteredscan);
chanidx = 0;
/* Set the default scan type to the user specified type, will later
......@@ -384,6 +423,8 @@ wlan_scan_setup_scan_config(wlan_private * priv,
int channel;
int radiotype;
lbs_deb_enter(LBS_DEB_SCAN);
pscancfgout = kzalloc(MAX_SCAN_CFG_ALLOC, GFP_KERNEL);
if (pscancfgout == NULL)
goto out;
......@@ -481,13 +522,12 @@ wlan_scan_setup_scan_config(wlan_private * priv,
if (!puserscanin || !puserscanin->chanlist[0].channumber) {
/* Create a default channel scan list */
lbs_deb_scan("Scan: Creating full region channel list\n");
lbs_deb_scan("creating full region channel list\n");
wlan_scan_create_channel_list(priv, pscanchanlist,
*pfilteredscan);
goto out;
}
lbs_deb_scan("Scan: Using supplied channel list\n");
for (chanidx = 0;
chanidx < WLAN_IOCTL_USER_SCAN_CHAN_MAX
&& puserscanin->chanlist[chanidx].channumber; chanidx++) {
......@@ -529,7 +569,7 @@ wlan_scan_setup_scan_config(wlan_private * priv,
(puserscanin->chanlist[0].channumber ==
priv->adapter->curbssparams.channel)) {
*pscancurrentonly = 1;
lbs_deb_scan("Scan: Scanning current channel only");
lbs_deb_scan("scanning current channel only");
}
out:
......@@ -539,6 +579,8 @@ wlan_scan_setup_scan_config(wlan_private * priv,
/**
* @brief Construct and send multiple scan config commands to the firmware
*
* Only used from wlan_scan_networks()
*
* Previous routines have created a wlan_scan_cmd_config with any requested
* TLVs. This function splits the channel TLV into maxchanperscan lists
* and sends the portion of the channel TLV along with the other TLVs
......@@ -576,12 +618,14 @@ static int wlan_scan_channel_list(wlan_private * priv,
int scanned = 0;
union iwreq_data wrqu;
lbs_deb_enter(LBS_DEB_ASSOC);
lbs_deb_enter_args(LBS_DEB_SCAN, "maxchanperscan %d, filteredscan %d, "
"full_scan %d", maxchanperscan, filteredscan, full_scan);
if (!pscancfgout || !pchantlvout || !pscanchanlist) {
lbs_deb_scan("Scan: Null detect: %p, %p, %p\n",
pscancfgout, pchantlvout, pscanchanlist);
return -1;
lbs_deb_scan("pscancfgout, pchantlvout or "
"pscanchanlist is NULL\n");
ret = -1;
goto out;
}
pchantlvout->header.type = cpu_to_le16(TLV_TYPE_CHANLIST);
......@@ -613,9 +657,10 @@ static int wlan_scan_channel_list(wlan_private * priv,
while (tlvidx < maxchanperscan && ptmpchan->channumber
&& !doneearly && scanned < 2) {
lbs_deb_scan("Scan: Chan(%3d), Radio(%d), mode(%d,%d), "
"Dur(%d)\n",
ptmpchan->channumber, ptmpchan->radiotype,
lbs_deb_scan("channel %d, radio %d, passive %d, "
"dischanflt %d, maxscantime %d\n",
ptmpchan->channumber,
ptmpchan->radiotype,
ptmpchan->chanscanmode.passivescan,
ptmpchan->chanscanmode.disablechanfilt,
ptmpchan->maxscantime);
......@@ -700,20 +745,25 @@ static int wlan_scan_channel_list(wlan_private * priv,
wireless_send_event(priv->dev, SIOCGIWSCAN, &wrqu, NULL);
}
out:
lbs_deb_leave_args(LBS_DEB_SCAN, "ret %d", ret);
return ret;
}
static void
clear_selected_scan_list_entries(wlan_adapter * adapter,
const struct wlan_ioctl_user_scan_cfg * scan_cfg)
/*
* Only used from wlan_scan_networks()
*/
static void clear_selected_scan_list_entries(wlan_adapter *adapter,
const struct wlan_ioctl_user_scan_cfg *scan_cfg)
{
struct bss_descriptor * bss;
struct bss_descriptor * safe;
struct bss_descriptor *bss;
struct bss_descriptor *safe;
u32 clear_ssid_flag = 0, clear_bssid_flag = 0;
lbs_deb_enter(LBS_DEB_SCAN);
if (!scan_cfg)
return;
goto out;
if (scan_cfg->clear_ssid && scan_cfg->ssid_len)
clear_ssid_flag = 1;
......@@ -725,7 +775,7 @@ clear_selected_scan_list_entries(wlan_adapter * adapter,
}
if (!clear_ssid_flag && !clear_bssid_flag)
return;
goto out;
mutex_lock(&adapter->lock);
list_for_each_entry_safe (bss, safe, &adapter->network_list, list) {
......@@ -748,12 +798,16 @@ clear_selected_scan_list_entries(wlan_adapter * adapter,
}
}
mutex_unlock(&adapter->lock);
out:
lbs_deb_leave(LBS_DEB_SCAN);
}
/**
* @brief Internal function used to start a scan based on an input config
*
* Also used from debugfs
*
* Use the input user scan configuration information when provided in
* order to send the appropriate scan commands to firmware to populate or
* update the internal driver scan table
......@@ -761,6 +815,7 @@ clear_selected_scan_list_entries(wlan_adapter * adapter,
* @param priv A pointer to wlan_private structure
* @param puserscanin Pointer to the input configuration for the requested
* scan.
* @param full_scan ???
*
* @return 0 or < 0 if error
*/
......@@ -782,7 +837,7 @@ int wlan_scan_networks(wlan_private * priv,
DECLARE_MAC_BUF(mac);
#endif
lbs_deb_enter(LBS_DEB_SCAN);
lbs_deb_enter_args(LBS_DEB_SCAN, "full_scan %d", full_scan);
/* Cancel any partial outstanding partial scans if this scan
* is a full scan.
......@@ -833,8 +888,9 @@ int wlan_scan_networks(wlan_private * priv,
#ifdef CONFIG_LIBERTAS_DEBUG
/* Dump the scan table */
mutex_lock(&adapter->lock);
lbs_deb_scan("The scan table contains:\n");
list_for_each_entry (iter_bss, &adapter->network_list, list) {
lbs_deb_scan("Scan:(%02d) %s, RSSI[%03d], SSID[%s]\n",
lbs_deb_scan("scan %02d, %s, RSSI, %d, SSID '%s'\n",
i++, print_mac(mac, iter_bss->bssid), (s32) iter_bss->rssi,
escape_essid(iter_bss->ssid, iter_bss->ssid_len));
}
......@@ -886,7 +942,7 @@ static int libertas_process_bss(struct bss_descriptor * bss,
u16 beaconsize = 0;
int ret;
lbs_deb_enter(LBS_DEB_ASSOC);
lbs_deb_enter(LBS_DEB_SCAN);
if (*bytesleft >= sizeof(beaconsize)) {
/* Extract & convert beacon size from the command buffer */
......@@ -898,7 +954,8 @@ static int libertas_process_bss(struct bss_descriptor * bss,
if (beaconsize == 0 || beaconsize > *bytesleft) {
*pbeaconinfo += *bytesleft;
*bytesleft = 0;
return -1;
ret = -1;
goto done;
}
/* Initialize the current working beacon pointer for this BSS iteration */
......@@ -915,7 +972,8 @@ static int libertas_process_bss(struct bss_descriptor * bss,
if ((end - pos) < 12) {
lbs_deb_scan("process_bss: Not enough bytes left\n");
return -1;
ret = -1;
goto done;
}
/*
......@@ -1090,39 +1148,27 @@ static int libertas_process_bss(struct bss_descriptor * bss,
return ret;
}
/**
* @brief Compare two SSIDs
*
* @param ssid1 A pointer to ssid to compare
* @param ssid2 A pointer to ssid to compare
*
* @return 0--ssid is same, otherwise is different
*/
int libertas_ssid_cmp(u8 *ssid1, u8 ssid1_len, u8 *ssid2, u8 ssid2_len)
{
if (ssid1_len != ssid2_len)
return -1;
return memcmp(ssid1, ssid2, ssid1_len);
}
/**
* @brief This function finds a specific compatible BSSID in the scan list
*
* Used in association code
*
* @param adapter A pointer to wlan_adapter
* @param bssid BSSID to find in the scan list
* @param mode Network mode: Infrastructure or IBSS
*
* @return index in BSSID list, or error return code (< 0)
*/
struct bss_descriptor * libertas_find_bssid_in_list(wlan_adapter * adapter,
struct bss_descriptor *libertas_find_bssid_in_list(wlan_adapter * adapter,
u8 * bssid, u8 mode)
{
struct bss_descriptor * iter_bss;
struct bss_descriptor * found_bss = NULL;
lbs_deb_enter(LBS_DEB_SCAN);
if (!bssid)
return NULL;
goto out;
lbs_deb_hex(LBS_DEB_SCAN, "looking for",
bssid, ETH_ALEN);
......@@ -1149,12 +1195,16 @@ struct bss_descriptor * libertas_find_bssid_in_list(wlan_adapter * adapter,
}
mutex_unlock(&adapter->lock);
out:
lbs_deb_leave_args(LBS_DEB_SCAN, "found_bss %p", found_bss);
return found_bss;
}
/**
* @brief This function finds ssid in ssid list.
*
* Used in association code
*
* @param adapter A pointer to wlan_adapter
* @param ssid SSID to find in the list
* @param bssid BSSID to qualify the SSID selection (if provided)
......@@ -1171,6 +1221,8 @@ struct bss_descriptor * libertas_find_ssid_in_list(wlan_adapter * adapter,
struct bss_descriptor * found_bss = NULL;
struct bss_descriptor * tmp_oldest = NULL;
lbs_deb_enter(LBS_DEB_SCAN);
mutex_lock(&adapter->lock);
list_for_each_entry (iter_bss, &adapter->network_list, list) {
......@@ -1215,6 +1267,7 @@ struct bss_descriptor * libertas_find_ssid_in_list(wlan_adapter * adapter,
out:
mutex_unlock(&adapter->lock);
lbs_deb_leave_args(LBS_DEB_SCAN, "found_bss %p", found_bss);
return found_bss;
}
......@@ -1235,6 +1288,8 @@ static struct bss_descriptor * libertas_find_best_ssid_in_list(wlan_adapter * ad
struct bss_descriptor * iter_bss;
struct bss_descriptor * best_bss = NULL;
lbs_deb_enter(LBS_DEB_SCAN);
mutex_lock(&adapter->lock);
list_for_each_entry (iter_bss, &adapter->network_list, list) {
......@@ -1259,12 +1314,15 @@ static struct bss_descriptor * libertas_find_best_ssid_in_list(wlan_adapter * ad
}
mutex_unlock(&adapter->lock);
lbs_deb_leave_args(LBS_DEB_SCAN, "best_bss %p", best_bss);
return best_bss;
}
/**
* @brief Find the AP with specific ssid in the scan list
*
* Used from association worker.
*
* @param priv A pointer to wlan_private structure
* @param pSSID A pointer to AP's ssid
*
......@@ -1277,11 +1335,11 @@ int libertas_find_best_network_ssid(wlan_private * priv,
int ret = -1;
struct bss_descriptor * found;
lbs_deb_enter(LBS_DEB_ASSOC);
lbs_deb_enter(LBS_DEB_SCAN);
wlan_scan_networks(priv, NULL, 1);
if (adapter->surpriseremoved)
return -1;
goto out;
wait_event_interruptible(adapter->cmd_pending, !adapter->nr_cmd_pending);
......@@ -1293,6 +1351,7 @@ int libertas_find_best_network_ssid(wlan_private * priv,
ret = 0;
}
out:
lbs_deb_leave_args(LBS_DEB_SCAN, "ret %d", ret);
return ret;
}
......@@ -1327,10 +1386,17 @@ int libertas_set_scan(struct net_device *dev, struct iw_request_info *info,
return 0;
}
/**
* @brief Send a scan command for all available channels filtered on a spec
*
* Used in association code and from debugfs
*
* @param priv A pointer to wlan_private structure
* @param ssid A pointer to the SSID to scan for
* @param ssid_len Length of the SSID
* @param clear_ssid Should existing scan results with this SSID
* be cleared?
* @param prequestedssid A pointer to AP's ssid
* @param keeppreviousscan Flag used to save/clear scan table before scan
*
......@@ -1343,7 +1409,8 @@ int libertas_send_specific_ssid_scan(wlan_private * priv,
struct wlan_ioctl_user_scan_cfg scancfg;
int ret = 0;
lbs_deb_enter(LBS_DEB_ASSOC);
lbs_deb_enter_args(LBS_DEB_SCAN, "SSID '%s', clear %d",
escape_essid(ssid, ssid_len), clear_ssid);
if (!ssid_len)
goto out;
......@@ -1354,15 +1421,26 @@ int libertas_send_specific_ssid_scan(wlan_private * priv,
scancfg.clear_ssid = clear_ssid;
wlan_scan_networks(priv, &scancfg, 1);
if (adapter->surpriseremoved)
return -1;
if (adapter->surpriseremoved) {
ret = -1;
goto out;
}
wait_event_interruptible(adapter->cmd_pending, !adapter->nr_cmd_pending);
out:
lbs_deb_leave(LBS_DEB_ASSOC);
lbs_deb_leave_args(LBS_DEB_SCAN, "ret %d", ret);
return ret;
}
/*********************************************************************/
/* */
/* Support for Wireless Extensions */
/* */
/*********************************************************************/
#define MAX_CUSTOM_LEN 64
static inline char *libertas_translate_scan(wlan_private *priv,
......@@ -1379,10 +1457,13 @@ static inline char *libertas_translate_scan(wlan_private *priv,
#define RSSI_DIFF ((u8)(PERFECT_RSSI - WORST_RSSI))
u8 rssi;
lbs_deb_enter(LBS_DEB_SCAN);
cfp = libertas_find_cfp_by_band_and_channel(adapter, 0, bss->channel);
if (!cfp) {
lbs_deb_scan("Invalid channel number %d\n", bss->channel);
return NULL;
start = NULL;
goto out;
}
/* First entry *MUST* be the AP BSSID */
......@@ -1510,11 +1591,13 @@ static inline char *libertas_translate_scan(wlan_private *priv,
start = iwe_stream_add_point(start, stop, &iwe, custom);
}
out:
lbs_deb_leave_args(LBS_DEB_SCAN, "start %p", start);
return start;
}
/**
* @brief Retrieve the scan table entries via wireless tools IOCTL call
* @brief Handle Retrieve scan table ioctl
*
* @param dev A pointer to net_device structure
* @param info A pointer to iw_request_info structure
......@@ -1535,7 +1618,7 @@ int libertas_get_scan(struct net_device *dev, struct iw_request_info *info,
struct bss_descriptor * iter_bss;
struct bss_descriptor * safe;
lbs_deb_enter(LBS_DEB_ASSOC);
lbs_deb_enter(LBS_DEB_SCAN);
/* Update RSSI if current BSS is a locally created ad-hoc BSS */
if ((adapter->mode == IW_MODE_ADHOC) && adapter->adhoccreate) {
......@@ -1577,19 +1660,27 @@ int libertas_get_scan(struct net_device *dev, struct iw_request_info *info,
dwrq->length = (ev - extra);
dwrq->flags = 0;
lbs_deb_leave(LBS_DEB_ASSOC);
lbs_deb_leave_args(LBS_DEB_SCAN, "ret %d", err);
return err;
}
/*********************************************************************/
/* */
/* Command execution */
/* */
/*********************************************************************/
/**
* @brief Prepare a scan command to be sent to the firmware
*
* Use the wlan_scan_cmd_config sent to the command processing module in
* the libertas_prepare_and_send_command to configure a cmd_ds_802_11_scan command
* struct to send to firmware.
* Called from libertas_prepare_and_send_command() in cmd.c
*
* The fixed fields specifying the BSS type and BSSID filters as well as a
* variable number/length of TLVs are sent in the command to firmware.
* Sends a fixed lenght data part (specifying the BSS type and BSSID filters)
* as well as a variable number/length of TLVs to the firmware.
*
* @param priv A pointer to wlan_private structure
* @param cmd A pointer to cmd_ds_command structure to be sent to
......@@ -1598,18 +1689,14 @@ int libertas_get_scan(struct net_device *dev, struct iw_request_info *info,
* to set the fields/TLVs for the command sent to firmware
*
* @return 0 or -1
*
* @sa wlan_scan_create_channel_list
*/
int libertas_cmd_80211_scan(wlan_private * priv,
struct cmd_ds_command *cmd, void *pdata_buf)
{
struct cmd_ds_802_11_scan *pscan = &cmd->params.scan;
struct wlan_scan_cmd_config *pscancfg;
lbs_deb_enter(LBS_DEB_ASSOC);
struct wlan_scan_cmd_config *pscancfg = pdata_buf;
pscancfg = pdata_buf;
lbs_deb_enter(LBS_DEB_SCAN);
/* Set fixed field variables in scan command */
pscan->bsstype = pscancfg->bsstype;
......@@ -1622,11 +1709,11 @@ int libertas_cmd_80211_scan(wlan_private * priv,
cmd->size = cpu_to_le16(sizeof(pscan->bsstype) + ETH_ALEN
+ pscancfg->tlvbufferlen + S_DS_GEN);
lbs_deb_scan("SCAN_CMD: command=%x, size=%x, seqnum=%x\n",
lbs_deb_scan("SCAN_CMD: command 0x%04x, size %d, seqnum %d\n",
le16_to_cpu(cmd->command), le16_to_cpu(cmd->size),
le16_to_cpu(cmd->seqnum));
lbs_deb_leave(LBS_DEB_ASSOC);
lbs_deb_leave(LBS_DEB_SCAN);
return 0;
}
......@@ -1645,6 +1732,8 @@ static inline int is_same_network(struct bss_descriptor *src,
/**
* @brief This function handles the command response of scan
*
* Called from handle_cmd_response() in cmdrespc.
*
* The response buffer for the scan command has the following
* memory layout:
*
......@@ -1679,7 +1768,7 @@ int libertas_ret_80211_scan(wlan_private * priv, struct cmd_ds_command *resp)
int tlvbufsize;
int ret;
lbs_deb_enter(LBS_DEB_ASSOC);
lbs_deb_enter(LBS_DEB_SCAN);
/* Prune old entries from scan table */
list_for_each_entry_safe (iter_bss, safe, &adapter->network_list, list) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册