[PATCH] Implement disconnect functionality
Eugene Krasnikov
k.eugene.e at gmail.com
Tue May 14 12:58:19 EDT 2013
To disconnect driver must tell hardware delete_sta,
delete_bss and then set link to idle.
Signed-off-by: Eugene Krasnikov <k.eugene.e at gmail.com>
---
hal.h | 16 ++++++++--------
main.c | 10 ++++++++--
smd.c | 30 ++++++++++++++++++++++++++++--
smd.h | 2 ++
start.sh | 9 +++++++--
5 files changed, 53 insertions(+), 14 deletions(-)
mode change 100644 => 100755 start.sh
diff --git a/hal.h b/hal.h
index 241caa9..27a79b4 100644
--- a/hal.h
+++ b/hal.h
@@ -1392,16 +1392,16 @@ struct wcn36xx_hal_config_sta_rsp_msg {
} __packed;
/* Delete STA Request message */
-struct delete_sta_req_msg {
+struct wcn36xx_hal_delete_sta_req_msg {
struct wcn36xx_hal_msg_header header;
/* Index of STA to delete */
u8 sta_index;
-};
+} __packed;
/* Delete STA Response message */
-struct delete_sta_rsp_msg {
+struct wcn36xx_hal_delete_sta_rsp_msg {
struct wcn36xx_hal_msg_header header;
/* success or failure */
@@ -1409,7 +1409,7 @@ struct delete_sta_rsp_msg {
/* Index of STA deleted */
u8 sta_id;
-};
+} __packed;
/* 12 Bytes long because this structure can be used to represent rate and
* extended rate set IEs. The parser assume this to be at least 12 */
@@ -1823,15 +1823,15 @@ struct wcn36xx_hal_config_bss_rsp_msg {
struct wcn36xx_hal_config_bss_rsp_params bss_rsp_params;
} __packed;
-struct delete_bss_req_msg {
+struct wcn36xx_hal_delete_bss_req_msg {
struct wcn36xx_hal_msg_header header;
/* BSS index to be deleted */
u8 bss_index;
-};
+} __packed;
-struct delete_bss_rsp_msg {
+struct wcn36xx_hal_delete_bss_rsp_msg {
struct wcn36xx_hal_msg_header header;
/* Success or Failure */
@@ -1840,7 +1840,7 @@ struct delete_bss_rsp_msg {
/* BSS index that has been deleted */
u8 bss_index;
-};
+} __packed;
struct wcn36xx_hal_join_req_msg {
struct wcn36xx_hal_msg_header header;
diff --git a/main.c b/main.c
index 6fcd8b9..c324836 100644
--- a/main.c
+++ b/main.c
@@ -197,8 +197,10 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,
if(changed & BSS_CHANGED_BSSID) {
wcn36xx_info("wcn36xx_bss_info_changed BSS_CHANGED_BSSID=%pM", bss_conf->bssid);
- wcn36xx_smd_join(wcn, (u8*)bss_conf->bssid, vif->addr, wcn->ch);
- wcn36xx_smd_config_bss(wcn, true, (u8*)bss_conf->bssid, 0);
+ if(!is_zero_ether_addr(bss_conf->bssid)) {
+ wcn36xx_smd_join(wcn, (u8*)bss_conf->bssid, vif->addr, wcn->ch);
+ wcn36xx_smd_config_bss(wcn, true, (u8*)bss_conf->bssid, 0);
+ }
} else if (changed & BSS_CHANGED_BEACON_ENABLED){
if(!wcn->beacon_enable) {
wcn->beacon_enable = true;
@@ -305,7 +307,11 @@ static int wcn36xx_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
static int wcn36xx_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct ieee80211_sta *sta)
{
+ struct wcn36xx *wcn = hw->priv;
ENTER();
+ wcn36xx_smd_delete_sta(wcn);
+ wcn36xx_smd_delete_bss(wcn);
+ wcn36xx_smd_set_link_st(wcn, sta->addr, vif->addr, WCN36XX_HAL_LINK_IDLE_STATE);
return 0;
}
diff --git a/smd.c b/smd.c
index db9a898..98b7f08 100644
--- a/smd.c
+++ b/smd.c
@@ -238,7 +238,19 @@ int wcn36xx_smd_add_sta_self(struct wcn36xx *wcn, struct mac_address addr, u32 s
return wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
}
+int wcn36xx_smd_delete_sta(struct wcn36xx *wcn)
+{
+ struct wcn36xx_hal_delete_sta_req_msg msg_body;
+
+ INIT_HAL_MSG(msg_body, WCN36XX_HAL_DELETE_STA_REQ)
+ printk("wcn36xx_smd_delete_sta %d, %d", msg_body.header.len, sizeof(msg_body));
+ msg_body.sta_index = 1;
+
+ PREPARE_HAL_BUF(wcn->smd_buf, msg_body)
+ return wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
+
+}
int wcn36xx_smd_join(struct wcn36xx *wcn, u8 *bssid, u8 *vif, u8 ch)
{
struct wcn36xx_hal_join_req_msg msg_body;
@@ -384,6 +396,18 @@ int wcn36xx_smd_config_bss(struct wcn36xx *wcn, bool sta_mode, u8 *bssid, u8 upd
return wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
}
+int wcn36xx_smd_delete_bss(struct wcn36xx *wcn)
+{
+ struct wcn36xx_hal_delete_bss_req_msg msg_body;
+
+ INIT_HAL_MSG(msg_body, WCN36XX_HAL_DELETE_BSS_REQ)
+
+ msg_body.bss_index = 0;
+
+ PREPARE_HAL_BUF(wcn->smd_buf, msg_body)
+
+ return wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
+}
int wcn36xx_smd_send_beacon(struct wcn36xx *wcn, struct sk_buff *skb_beacon, u16 tim_off, u16 p2p_off){
struct wcn36xx_hal_send_beacon_req_msg msg_body;
INIT_HAL_MSG(msg_body, WCN36XX_HAL_SEND_BEACON_REQ)
@@ -441,15 +465,17 @@ static void wcn36xx_smd_rsp_process (void *buf, size_t len)
wcn36xx_smd_start_rsp(buf, len);
break;
case WCN36XX_HAL_ADD_STA_SELF_RSP:
+ case WCN36XX_HAL_DELETE_STA_RSP:
case WCN36XX_HAL_INIT_SCAN_RSP:
case WCN36XX_HAL_START_SCAN_RSP:
case WCN36XX_HAL_END_SCAN_RSP:
case WCN36XX_HAL_FINISH_SCAN_RSP:
case WCN36XX_HAL_DOWNLOAD_NV_RSP:
case WCN36XX_HAL_CONFIG_BSS_RSP:
+ case WCN36XX_HAL_DELETE_BSS_RSP:
case WCN36XX_HAL_CONFIG_STA_RSP:
- case WCN36XX_HAL_SEND_BEACON_REQ:
-
+ case WCN36XX_HAL_SEND_BEACON_RSP:
+ case WCN36XX_HAL_SET_LINK_ST_RSP:
if(wcn36xx_smd_rsp_status_check(buf, len)) {
wcn36xx_error("response failed");
}
diff --git a/smd.h b/smd.h
index 7635cfe..ca2cbad 100644
--- a/smd.h
+++ b/smd.h
@@ -55,9 +55,11 @@ int wcn36xx_smd_end_scan(struct wcn36xx *wcn, u8 ch);
int wcn36xx_smd_finish_scan(struct wcn36xx *wcn);
int wcn36xx_smd_update_scan_params(struct wcn36xx *wcn);
int wcn36xx_smd_add_sta_self(struct wcn36xx *wcn, struct mac_address addr, u32 status);
+int wcn36xx_smd_delete_sta(struct wcn36xx *wcn);
int wcn36xx_smd_join(struct wcn36xx *wcn, u8 *bssid, u8 *vif, u8 ch);
int wcn36xx_smd_set_link_st(struct wcn36xx *wcn, u8 *bssid, u8 *sta_mac, enum wcn36xx_hal_link_state state);
int wcn36xx_smd_config_bss(struct wcn36xx *wcn, bool sta_mode, u8 *bssid, u8 update);
+int wcn36xx_smd_delete_bss(struct wcn36xx *wcn);
int wcn36xx_smd_config_sta(struct wcn36xx *wcn, u8 *bssid, u16 ass_id, u8 *sta_mac);
int wcn36xx_smd_send_beacon(struct wcn36xx *wcn, struct sk_buff *skb_beacon, u16 tim_off, u16 p2p_off);
diff --git a/start.sh b/start.sh
old mode 100644
new mode 100755
index cbf2286..e7938be
--- a/start.sh
+++ b/start.sh
@@ -1,4 +1,5 @@
-adb shell "insmod /system/lib/modules/cfg80211.ko"
+adb shell "insmod /data/compat.ko"
+adb shell "insmod /data/cfg80211.ko"
adb shell "insmod /data/mac80211.ko"
adb shell "insmod /data/wcn36xx.ko"
@@ -19,4 +20,8 @@ adb shell "netcfg wlan0 up"
#adb shell "iw dev wlan0 scan freq 2412"
#adb shell "iw dev wlan0 scan"
#adb shell "iw dev wlan0 connect kosmoskatten 2437 00:18:e7:8a:7d:9c"
-adb shell "iw dev wlan0 connect ost3 2412 00:25:9c:42:0a:bf"
+adb shell "iw dev wlan0 connect ASUS_24GHz4 2452 54:04:a6:8f:e9:ce"
+adb shell "iw dev wlan0 disconnect"
+sleep 15
+adb shell "iw dev wlan0 connect ASUS_24GHz4 2452 54:04:a6:8f:e9:ce"
+adb shell "dhcpcd wlan0"
--
1.7.11.3
More information about the wcn36xx
mailing list