summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Kbuild4
-rw-r--r--dhd_flowring.h3
-rw-r--r--dhd_linux.c11
-rw-r--r--dhd_msgbuf.c6
-rw-r--r--wl_android.c74
-rw-r--r--wl_android.h4
-rw-r--r--wl_cfg80211.c34
-rwxr-xr-xwl_cfgvendor.c10
8 files changed, 124 insertions, 22 deletions
diff --git a/Kbuild b/Kbuild
index c36f095..629255c 100644
--- a/Kbuild
+++ b/Kbuild
@@ -298,12 +298,12 @@ DHDCFLAGS += -DDHD_HAL_RING_DUMP_MEMDUMP
DHDCFLAGS += -DDHD_DUMP_START_COMMAND
# Enable pktid logging
DHDCFLAGS += -DDHD_MAP_PKTID_LOGGING
+# Skip coredump for certain health check traps
+DHDCFLAGS += -DDHD_SKIP_COREDUMP_ON_HC
else
DHDCFLAGS += -DDHD_FILE_DUMP_EVENT
# The debug dump file path is blank in DHD, it is defined in HAL.
DHDCFLAGS += -DDHD_COMMON_DUMP_PATH="\"/\""
-# Skip coredump for certain health check traps
-DHDCFLAGS += -DDHD_SKIP_COREDUMP_ON_HC
endif
DHDCFLAGS := $(filter-out -DDHD_DUMP_FILE_WRITE_FROM_KERNEL ,$(DHDCFLAGS))
endif
diff --git a/dhd_flowring.h b/dhd_flowring.h
index 8f6222f..2fdb400 100644
--- a/dhd_flowring.h
+++ b/dhd_flowring.h
@@ -133,6 +133,9 @@
(DHD_IF_ROLE_AP(pub, idx) || DHD_IF_ROLE_P2PGO(pub, idx) ||\
DHD_IF_ROLE_NAN(pub, idx))
+#define DHD_FLOW_RING_INV_ID(dhdp, flowid) \
+ (flowid < FLOWID_RESERVED) || (flowid > (dhdp)->max_tx_flowid)
+
#define DHD_FLOW_RING(dhdp, flowid) \
(flow_ring_node_t *)&(((flow_ring_node_t *)((dhdp)->flow_ring_table))[flowid])
diff --git a/dhd_linux.c b/dhd_linux.c
index 665eeb5..68007f6 100644
--- a/dhd_linux.c
+++ b/dhd_linux.c
@@ -6405,6 +6405,9 @@ dhd_stop(struct net_device *net)
#ifdef WL_STATIC_IF
struct bcm_cfg80211 *cfg = wl_get_cfg(net);
#endif /* WL_STATIC_IF */
+#if defined(CONFIG_IPV6) && defined(IPV6_NDO_SUPPORT)
+ int ret = 0;
+#endif /* CONFIG_IPV6 && IPV6_NDO_SUPPORT */
#endif /* WL_CFG80211 */
dhd_info_t *dhd = DHD_DEV_INFO(net);
int timeleft = 0;
@@ -6530,6 +6533,14 @@ dhd_stop(struct net_device *net)
#endif /* ARP_OFFLOAD_SUPPORT */
#if defined(CONFIG_IPV6) && defined(IPV6_NDO_SUPPORT)
if (dhd_inet6addr_notifier_registered) {
+ ret = dhd_ndo_remove_ip(&dhd->pub, ifidx);
+ if (ret < 0) {
+ DHD_ERROR(("%s: clear host ipv6 for NDO failed%d\n",
+ __FUNCTION__, ret));
+ } else {
+ DHD_PRINT(("%s: cleared host ipv6 table for NDO \n",
+ __FUNCTION__));
+ }
dhd_inet6addr_notifier_registered = FALSE;
unregister_inet6addr_notifier(&dhd_inet6addr_notifier);
}
diff --git a/dhd_msgbuf.c b/dhd_msgbuf.c
index 4bc1d1a..94666e6 100644
--- a/dhd_msgbuf.c
+++ b/dhd_msgbuf.c
@@ -7914,6 +7914,12 @@ BCMFASTPATH(dhd_prot_txstatus_process)(dhd_pub_t *dhd, void *msg)
txstatus = (host_txbuf_cmpl_t *)msg;
flowid = txstatus->compl_hdr.flow_ring_id;
+ if (DHD_FLOW_RING_INV_ID(dhd, flowid)) {
+ DHD_ERROR(("%s: invalid flowid:%d alloc_max:%d fid_max:%d\n",
+ __FUNCTION__, flowid, dhd->num_h2d_rings, dhd->max_tx_flowid));
+ return;
+ }
+
flow_ring_node = DHD_FLOW_RING(dhd, flowid);
#ifdef AGG_H2D_DB
flow_ring = DHD_RING_IN_FLOWRINGS_POOL(prot, flowid);
diff --git a/wl_android.c b/wl_android.c
index 3aa7844..6569172 100644
--- a/wl_android.c
+++ b/wl_android.c
@@ -15094,3 +15094,77 @@ exit:
return bytes_written;
}
#endif /* SUPPORT_AP_INIT_BWCONF */
+
+s32
+wl_android_set_blacklist_bssid(struct net_device *dev, maclist_t *blacklist,
+ uint32 len, uint32 flush)
+{
+ s32 err;
+ s32 macmode;
+
+ if (blacklist) {
+ err = wldev_ioctl_set(dev, WLC_SET_MACLIST, (u8 *)blacklist, len);
+ if (err != BCME_OK) {
+ WL_ERR(("WLC_SET_MACLIST failed %d\n", err));
+ return err;
+ }
+ }
+ /* By default programming blacklist flushes out old values */
+ macmode = (flush && !blacklist) ? WLC_MACMODE_DISABLED : WLC_MACMODE_DENY;
+ err = wldev_ioctl_set(dev, WLC_SET_MACMODE, (u8 *)&macmode, sizeof(macmode));
+ if (err != BCME_OK) {
+ WL_ERR(("WLC_SET_MACMODE %d failed %d\n", macmode, err));
+ } else {
+ WL_INFORM_MEM(("WLC_SET_MACMODE %d applied\n", macmode));
+ }
+ return err;
+}
+
+s32
+wl_android_set_whitelist_ssid(struct net_device *dev, wl_ssid_whitelist_t *ssid_whitelist,
+ uint32 len, uint32 flush)
+{
+ s32 err;
+ u8 *buf;
+ u32 buf_len = WLC_IOCTL_MEDLEN;
+ wl_ssid_whitelist_t whitelist_ssid_flush;
+ struct bcm_cfg80211 *cfg = wl_get_cfg(dev);
+
+ if (!ssid_whitelist) {
+ if (flush) {
+ ssid_whitelist = &whitelist_ssid_flush;
+ ssid_whitelist->ssid_count = 0;
+ } else {
+ WL_ERR(("%s : Nothing to do here\n", __FUNCTION__));
+ return BCME_BADARG;
+ }
+ }
+
+ buf = (char *)MALLOC(cfg->osh, buf_len);
+ if (buf == NULL) {
+ WL_ERR(("failed to allocated memory %d bytes\n",
+ WLC_IOCTL_MEDLEN));
+ return -ENOMEM;
+ }
+
+ if ((len + strlen("roam_exp_ssid_whitelist")) >= buf_len) {
+ WL_ERR(("unexpected len for ssid blklist:%d\n", len));
+ err = -EINVAL;
+ goto exit;
+ }
+
+ ssid_whitelist->version = SSID_WHITELIST_VERSION_1;
+ ssid_whitelist->flags = flush ? ROAM_EXP_CLEAR_SSID_WHITELIST : 0;
+ err = wldev_iovar_setbuf(dev, "roam_exp_ssid_whitelist",
+ (u8 *)ssid_whitelist, len, buf, buf_len, NULL);
+ if (err != BCME_OK) {
+ if (err == BCME_UNSUPPORTED) {
+ WL_ERR(("roam_exp_bssid_pref, UNSUPPORTED \n"));
+ } else {
+ WL_ERR(("Failed to execute roam_exp_bssid_pref %d\n", err));
+ }
+ }
+exit:
+ MFREE(cfg->osh, buf, buf_len);
+ return err;
+}
diff --git a/wl_android.h b/wl_android.h
index 5e330f3..5120c41 100644
--- a/wl_android.h
+++ b/wl_android.h
@@ -156,6 +156,10 @@ s32 wl_netlink_send_msg(int pid, int type, int seq, const void *data, size_t siz
#define APCS_DEFAULT_5G_CH 149
#define APCS_DEFAULT_6G_CH 5
+extern int wl_android_set_whitelist_ssid(struct net_device *dev,
+ wl_ssid_whitelist_t *ssid_whitelist, uint32 len, uint32 flush);
+extern int wl_android_set_blacklist_bssid(struct net_device *dev, maclist_t *blacklist,
+ uint32 len, uint32 flush);
int wl_android_set_ap_mac_list(struct net_device *dev, int macmode, struct maclist *maclist);
#ifdef WL_BCNRECV
extern int wl_android_bcnrecv_config(struct net_device *ndev, char *data,
diff --git a/wl_cfg80211.c b/wl_cfg80211.c
index d655e1b..53d79bd 100644
--- a/wl_cfg80211.c
+++ b/wl_cfg80211.c
@@ -6132,17 +6132,6 @@ wl_do_preassoc_ops(struct bcm_cfg80211 *cfg,
wl_restore_ap_bw(cfg);
}
#endif /* SUPPORT_AP_BWCTRL */
-#if defined(ROAMEXP_SUPPORT)
- /* Clear Blacklist bssid and Whitelist ssid list before join issue
- * This is temporary fix since currently firmware roaming is not
- * disabled by android framework before SSID join from framework
- */
- /* Flush blacklist bssid content */
- dhd_dev_set_blacklist_bssid(dev, NULL, 0, true);
- /* Flush whitelist ssid content */
- dhd_dev_set_whitelist_ssid(dev, NULL, 0, true);
-#endif /* ROAMEXP_SUPPORT */
-
WL_DBG(("SME IE : len=%zu\n", sme->ie_len));
if (sme->ie != NULL && sme->ie_len > 0 && (wl_dbg_level & WL_DBG_DBG)) {
prhex(NULL, sme->ie, sme->ie_len);
@@ -12845,6 +12834,13 @@ wl_post_linkdown_ops(struct bcm_cfg80211 *cfg,
}
#endif /* SUPPORT_SET_TID */
+#if defined(ROAMEXP_SUPPORT)
+ /* Flush blacklist bssid content */
+ wl_android_set_blacklist_bssid(ndev, NULL, 0, TRUE);
+ /* Flush whitelist ssid content */
+ wl_android_set_whitelist_ssid(ndev, NULL, 0, TRUE);
+#endif /* ROAMEXP_SUPPORT */
+
return ret;
}
@@ -15306,10 +15302,6 @@ wl_notify_rx_mgmt_frame(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
#if defined(BCMDONGLEHOST) && defined(TDLS_MSG_ONLY_WFD) && defined(WLTDLS)
dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
#endif /* BCMDONGLEHOST && TDLS_MSG_ONLY_WFD && WLTDLS */
- if (ntoh32(e->datalen) < sizeof(wl_event_rx_frame_data_t)) {
- WL_ERR(("wrong datalen:%d\n", ntoh32(e->datalen)));
- return -EINVAL;
- }
rxframe = (wl_event_rx_frame_data_t *)data;
if (!rxframe) {
@@ -15319,9 +15311,19 @@ wl_notify_rx_mgmt_frame(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
/* Handle different versions of Rx frame data */
if (ntoh16(rxframe->version) == BCM_RX_FRAME_DATA_VERSION_1) {
+ if (ntoh32(e->datalen) < sizeof(wl_event_rx_frame_data_v1_t)) {
+ WL_ERR(("wrong datalen:%d for rxframe v1:%lu\n",
+ ntoh32(e->datalen), sizeof(wl_event_rx_frame_data_v1_t)));
+ return -EINVAL;
+ }
mgmt_frame_len = ntoh32(e->datalen) - (uint32)sizeof(wl_event_rx_frame_data_v1_t);
rx_event_data = (u8 *) ((wl_event_rx_frame_data_v1_t *)rxframe + 1);
} else if (ntoh16(rxframe->version) == BCM_RX_FRAME_DATA_VERSION_2) {
+ if (ntoh32(e->datalen) < sizeof(wl_event_rx_frame_data_v2_t)) {
+ WL_ERR(("wrong datalen:%d for rxframe v2:%lu\n",
+ ntoh32(e->datalen), sizeof(wl_event_rx_frame_data_v2_t)));
+ return -EINVAL;
+ }
mgmt_frame_len = ntoh32(e->datalen) - (uint32)sizeof(wl_event_rx_frame_data_v2_t);
rx_event_data = (u8 *) ((wl_event_rx_frame_data_v2_t *)rxframe + 1);
} else {
@@ -25722,7 +25724,7 @@ int wl_get_usable_channels(struct bcm_cfg80211 *cfg, usable_channel_info_t *u_in
}
/* Supplicant does scan passive channel but not for DFS channel */
- if (!(chaninfo & WL_CHAN_RADAR) && !ch_160mhz_5g &&
+ if (!restrict_chan && !ch_160mhz_5g &&
!CHSPEC_IS6G(chspec) && (!is_unii4)) {
mask |= (1 << WIFI_INTERFACE_P2P_CLIENT);
}
diff --git a/wl_cfgvendor.c b/wl_cfgvendor.c
index da8ee12..91bcbcc 100755
--- a/wl_cfgvendor.c
+++ b/wl_cfgvendor.c
@@ -2845,6 +2845,7 @@ wl_cfgvendor_set_bssid_blacklist(struct wiphy *wiphy,
err = -EINVAL;
goto exit;
}
+ WL_INFORM_MEM(("blacklist_flush:%d\n", flush));
break;
case GSCAN_ATTRIBUTE_BLACKLIST_BSSID:
if (num == 0 || !blacklist) {
@@ -2863,8 +2864,9 @@ wl_cfgvendor_set_bssid_blacklist(struct wiphy *wiphy,
err = -EINVAL;
goto exit;
}
- memcpy(&(blacklist->ea[blacklist->count]), nla_data(iter),
- ETHER_ADDR_LEN);
+ WL_INFORM_MEM(("blacklist mac_addr:" MACDBG "\n",
+ MAC2STRDBG(nla_data(iter))));
+ eacopy(nla_data(iter), &(blacklist->ea[blacklist->count]));
blacklist->count++;
break;
default:
@@ -2880,8 +2882,8 @@ wl_cfgvendor_set_bssid_blacklist(struct wiphy *wiphy,
goto exit;
}
- err = dhd_dev_set_blacklist_bssid(bcmcfg_to_prmry_ndev(cfg),
- blacklist, mem_needed, flush);
+ err = wl_android_set_blacklist_bssid(wdev_to_ndev(wdev), blacklist,
+ mem_needed, flush);
exit:
MFREE(cfg->osh, blacklist, mem_needed);
return err;