diff options
-rw-r--r-- | Kbuild | 4 | ||||
-rw-r--r-- | dhd_flowring.h | 3 | ||||
-rw-r--r-- | dhd_linux.c | 11 | ||||
-rw-r--r-- | dhd_msgbuf.c | 6 | ||||
-rw-r--r-- | wl_android.c | 74 | ||||
-rw-r--r-- | wl_android.h | 4 | ||||
-rw-r--r-- | wl_cfg80211.c | 34 | ||||
-rwxr-xr-x | wl_cfgvendor.c | 10 |
8 files changed, 124 insertions, 22 deletions
@@ -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; |