|
@@ -508,23 +508,6 @@ void mgt_dispatcher(struct adapter *padapter, struct recv_frame *precv_frame)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
-static u32 p2p_listen_state_process(struct adapter *padapter, unsigned char *da)
|
|
|
-{
|
|
|
- bool response = true;
|
|
|
-
|
|
|
- /* do nothing if the device name is empty */
|
|
|
- if (!padapter->wdinfo.device_name_len)
|
|
|
- response = false;
|
|
|
-
|
|
|
- if (response)
|
|
|
- issue_probersp_p2p(padapter, da);
|
|
|
-
|
|
|
- return _SUCCESS;
|
|
|
-}
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
-
|
|
|
-
|
|
|
/****************************************************************************
|
|
|
|
|
|
Following are the callback functions for each subtype of the management frames
|
|
@@ -543,43 +526,6 @@ unsigned int OnProbeReq(struct adapter *padapter, struct recv_frame *precv_frame
|
|
|
uint len = precv_frame->len;
|
|
|
u8 is_valid_p2p_probereq = false;
|
|
|
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
- u8 wifi_test_chk_rate = 1;
|
|
|
-
|
|
|
- if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) &&
|
|
|
- !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE) &&
|
|
|
- !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) &&
|
|
|
- !rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH) &&
|
|
|
- !rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN)) {
|
|
|
- /* mcs_rate = 0 -> CCK 1M rate */
|
|
|
- /* mcs_rate = 1 -> CCK 2M rate */
|
|
|
- /* mcs_rate = 2 -> CCK 5.5M rate */
|
|
|
- /* mcs_rate = 3 -> CCK 11M rate */
|
|
|
- /* In the P2P mode, the driver should not support the CCK rate */
|
|
|
-
|
|
|
- /* Commented by Kurt 2012/10/16 */
|
|
|
- /* IOT issue: Google Nexus7 use 1M rate to send p2p_probe_req after GO nego completed and Nexus7 is client */
|
|
|
- if (wifi_test_chk_rate == 1) {
|
|
|
- is_valid_p2p_probereq = process_probe_req_p2p_ie(pwdinfo, pframe, len);
|
|
|
- if (is_valid_p2p_probereq) {
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) {
|
|
|
- /* FIXME */
|
|
|
- report_survey_event(padapter, precv_frame);
|
|
|
- p2p_listen_state_process(padapter, get_sa(pframe));
|
|
|
-
|
|
|
- return _SUCCESS;
|
|
|
- }
|
|
|
-
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
|
|
|
- goto _continue;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-_continue:
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
-
|
|
|
if (check_fwstate(pmlmepriv, WIFI_STATION_STATE))
|
|
|
return _SUCCESS;
|
|
|
|
|
@@ -611,48 +557,6 @@ _issue_probersp:
|
|
|
unsigned int OnProbeRsp(struct adapter *padapter, struct recv_frame *precv_frame)
|
|
|
{
|
|
|
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &padapter->wdinfo;
|
|
|
- u8 *pframe = precv_frame->rx_data;
|
|
|
-#endif
|
|
|
-
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) {
|
|
|
- if (pwdinfo->tx_prov_disc_info.benable) {
|
|
|
- if (!memcmp(pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr2Ptr(pframe), ETH_ALEN)) {
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) {
|
|
|
- pwdinfo->tx_prov_disc_info.benable = false;
|
|
|
- issue_p2p_provision_request(padapter,
|
|
|
- pwdinfo->tx_prov_disc_info.ssid.Ssid,
|
|
|
- pwdinfo->tx_prov_disc_info.ssid.SsidLength,
|
|
|
- pwdinfo->tx_prov_disc_info.peerDevAddr);
|
|
|
- } else if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
|
|
|
- pwdinfo->tx_prov_disc_info.benable = false;
|
|
|
- issue_p2p_provision_request(padapter, NULL, 0,
|
|
|
- pwdinfo->tx_prov_disc_info.peerDevAddr);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return _SUCCESS;
|
|
|
- } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) {
|
|
|
- if (pwdinfo->nego_req_info.benable) {
|
|
|
- DBG_88E("[%s] P2P State is GONEGO ING!\n", __func__);
|
|
|
- if (!memcmp(pwdinfo->nego_req_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN)) {
|
|
|
- pwdinfo->nego_req_info.benable = false;
|
|
|
- issue_p2p_GO_request(padapter, pwdinfo->nego_req_info.peerDevAddr);
|
|
|
- }
|
|
|
- }
|
|
|
- } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ)) {
|
|
|
- if (pwdinfo->invitereq_info.benable) {
|
|
|
- DBG_88E("[%s] P2P_STATE_TX_INVITE_REQ!\n", __func__);
|
|
|
- if (!memcmp(pwdinfo->invitereq_info.peer_macaddr, GetAddr2Ptr(pframe), ETH_ALEN)) {
|
|
|
- pwdinfo->invitereq_info.benable = false;
|
|
|
- issue_p2p_invitation_request(padapter, pwdinfo->invitereq_info.peer_macaddr);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
|
|
|
if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) {
|
|
|
report_survey_event(padapter, precv_frame);
|
|
@@ -717,7 +621,6 @@ unsigned int OnBeacon(struct adapter *padapter, struct recv_frame *precv_frame)
|
|
|
/* todo: the timer is used instead of the number of the beacon received */
|
|
|
if ((sta_rx_pkts(psta) & 0xf) == 0)
|
|
|
update_beacon_info(padapter, pframe, len, psta);
|
|
|
- process_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN));
|
|
|
}
|
|
|
} else if ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) {
|
|
|
psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));
|
|
@@ -1021,12 +924,6 @@ unsigned int OnAssocReq(struct adapter *padapter, struct recv_frame *precv_frame
|
|
|
struct sta_priv *pstapriv = &padapter->stapriv;
|
|
|
u8 *pframe = precv_frame->rx_data;
|
|
|
uint pkt_len = precv_frame->len;
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
- u8 p2p_status_code = P2P_STATUS_SUCCESS;
|
|
|
- u8 *p2pie;
|
|
|
- u32 p2pielen = 0;
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
|
|
|
if ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)
|
|
|
return _FAIL;
|
|
@@ -1356,23 +1253,6 @@ unsigned int OnAssocReq(struct adapter *padapter, struct recv_frame *precv_frame
|
|
|
if (status != _STATS_SUCCESSFUL_)
|
|
|
goto OnAssocReqFail;
|
|
|
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- pstat->is_p2p_device = false;
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
|
|
|
- p2pie = rtw_get_p2p_ie(pframe + WLAN_HDR_A3_LEN + ie_offset , pkt_len - WLAN_HDR_A3_LEN - ie_offset , NULL, &p2pielen);
|
|
|
- if (p2pie) {
|
|
|
- pstat->is_p2p_device = true;
|
|
|
- p2p_status_code = (u8)process_assoc_req_p2p_ie(pwdinfo, pframe, pkt_len, pstat);
|
|
|
- if (p2p_status_code > 0) {
|
|
|
- pstat->p2p_status_code = p2p_status_code;
|
|
|
- status = _STATS_CAP_FAIL_;
|
|
|
- goto OnAssocReqFail;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- pstat->p2p_status_code = p2p_status_code;
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
-
|
|
|
/* TODO: identify_proprietary_vendor_ie(); */
|
|
|
/* Realtek proprietary IE */
|
|
|
/* identify if this is Broadcom sta */
|
|
@@ -1566,22 +1446,12 @@ unsigned int OnDeAuth(struct adapter *padapter, struct recv_frame *precv_frame)
|
|
|
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
|
|
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
|
|
u8 *pframe = precv_frame->rx_data;
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
|
|
|
/* check A3 */
|
|
|
if (memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network),
|
|
|
ETH_ALEN))
|
|
|
return _SUCCESS;
|
|
|
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- if (pwdinfo->rx_invitereq_info.scan_op_ch_only) {
|
|
|
- del_timer_sync(&pwdinfo->reset_ch_sitesurvey);
|
|
|
- _set_timer(&pwdinfo->reset_ch_sitesurvey, 10);
|
|
|
- }
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
-
|
|
|
reason = le16_to_cpu(*(__le16 *)(pframe + WLAN_HDR_A3_LEN));
|
|
|
|
|
|
DBG_88E("%s Reason code(%d)\n", __func__, reason);
|
|
@@ -1630,22 +1500,12 @@ unsigned int OnDisassoc(struct adapter *padapter, struct recv_frame *precv_frame
|
|
|
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
|
|
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
|
|
u8 *pframe = precv_frame->rx_data;
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
|
|
|
/* check A3 */
|
|
|
if (memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network),
|
|
|
ETH_ALEN))
|
|
|
return _SUCCESS;
|
|
|
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- if (pwdinfo->rx_invitereq_info.scan_op_ch_only) {
|
|
|
- del_timer_sync(&pwdinfo->reset_ch_sitesurvey);
|
|
|
- _set_timer(&pwdinfo->reset_ch_sitesurvey, 10);
|
|
|
- }
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
-
|
|
|
reason = le16_to_cpu(*(__le16 *)(pframe + WLAN_HDR_A3_LEN));
|
|
|
|
|
|
DBG_88E("%s Reason code(%d)\n", __func__, reason);
|
|
@@ -1723,2139 +1583,102 @@ unsigned int on_action_spct(struct adapter *padapter, struct recv_frame *precv_f
|
|
|
case RTW_WLAN_ACTION_SPCT_CHL_SWITCH:
|
|
|
break;
|
|
|
default:
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
-exit:
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-unsigned int OnAction_qos(struct adapter *padapter, struct recv_frame *precv_frame)
|
|
|
-{
|
|
|
- return _SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-unsigned int OnAction_dls(struct adapter *padapter, struct recv_frame *precv_frame)
|
|
|
-{
|
|
|
- return _SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-unsigned int OnAction_back(struct adapter *padapter, struct recv_frame *precv_frame)
|
|
|
-{
|
|
|
- u8 *addr;
|
|
|
- struct sta_info *psta = NULL;
|
|
|
- struct recv_reorder_ctrl *preorder_ctrl;
|
|
|
- unsigned char *frame_body;
|
|
|
- unsigned char category, action;
|
|
|
- unsigned short tid, status, reason_code = 0;
|
|
|
- struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
|
|
- struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
|
|
- u8 *pframe = precv_frame->rx_data;
|
|
|
- struct sta_priv *pstapriv = &padapter->stapriv;
|
|
|
- /* check RA matches or not */
|
|
|
- if (memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe),
|
|
|
- ETH_ALEN))/* for if1, sta/ap mode */
|
|
|
- return _SUCCESS;
|
|
|
-
|
|
|
- DBG_88E("%s\n", __func__);
|
|
|
-
|
|
|
- if ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)
|
|
|
- if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS))
|
|
|
- return _SUCCESS;
|
|
|
-
|
|
|
- addr = GetAddr2Ptr(pframe);
|
|
|
- psta = rtw_get_stainfo(pstapriv, addr);
|
|
|
-
|
|
|
- if (psta == NULL)
|
|
|
- return _SUCCESS;
|
|
|
-
|
|
|
- frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
|
|
|
-
|
|
|
- category = frame_body[0];
|
|
|
- if (category == RTW_WLAN_CATEGORY_BACK) { /* representing Block Ack */
|
|
|
- if (!pmlmeinfo->HT_enable)
|
|
|
- return _SUCCESS;
|
|
|
- action = frame_body[1];
|
|
|
- DBG_88E("%s, action=%d\n", __func__, action);
|
|
|
- switch (action) {
|
|
|
- case RTW_WLAN_ACTION_ADDBA_REQ: /* ADDBA request */
|
|
|
- memcpy(&(pmlmeinfo->ADDBA_req), &(frame_body[2]), sizeof(struct ADDBA_request));
|
|
|
- process_addba_req(padapter, (u8 *)&(pmlmeinfo->ADDBA_req), addr);
|
|
|
-
|
|
|
- if (pmlmeinfo->bAcceptAddbaReq)
|
|
|
- issue_action_BA(padapter, addr, RTW_WLAN_ACTION_ADDBA_RESP, 0);
|
|
|
- else
|
|
|
- issue_action_BA(padapter, addr, RTW_WLAN_ACTION_ADDBA_RESP, 37);/* reject ADDBA Req */
|
|
|
- break;
|
|
|
- case RTW_WLAN_ACTION_ADDBA_RESP: /* ADDBA response */
|
|
|
- status = get_unaligned_le16(&frame_body[3]);
|
|
|
- tid = ((frame_body[5] >> 2) & 0x7);
|
|
|
- if (status == 0) { /* successful */
|
|
|
- DBG_88E("agg_enable for TID=%d\n", tid);
|
|
|
- psta->htpriv.agg_enable_bitmap |= 1 << tid;
|
|
|
- psta->htpriv.candidate_tid_bitmap &= ~BIT(tid);
|
|
|
- } else {
|
|
|
- psta->htpriv.agg_enable_bitmap &= ~BIT(tid);
|
|
|
- }
|
|
|
- break;
|
|
|
- case RTW_WLAN_ACTION_DELBA: /* DELBA */
|
|
|
- if ((frame_body[3] & BIT(3)) == 0) {
|
|
|
- psta->htpriv.agg_enable_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf));
|
|
|
- psta->htpriv.candidate_tid_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf));
|
|
|
- reason_code = get_unaligned_le16(&frame_body[4]);
|
|
|
- } else if ((frame_body[3] & BIT(3)) == BIT(3)) {
|
|
|
- tid = (frame_body[3] >> 4) & 0x0F;
|
|
|
- preorder_ctrl = &psta->recvreorder_ctrl[tid];
|
|
|
- preorder_ctrl->enable = false;
|
|
|
- preorder_ctrl->indicate_seq = 0xffff;
|
|
|
- }
|
|
|
- DBG_88E("%s(): DELBA: %x(%x)\n", __func__, pmlmeinfo->agg_enable_bitmap, reason_code);
|
|
|
- /* todo: how to notify the host while receiving DELETE BA */
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- return _SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
-
|
|
|
-static int get_reg_classes_full_count(struct p2p_channels *channel_list)
|
|
|
-{
|
|
|
- int cnt = 0;
|
|
|
- int i;
|
|
|
-
|
|
|
- for (i = 0; i < channel_list->reg_classes; i++) {
|
|
|
- cnt += channel_list->reg_class[i].channels;
|
|
|
- }
|
|
|
-
|
|
|
- return cnt;
|
|
|
-}
|
|
|
-
|
|
|
-void issue_p2p_GO_request(struct adapter *padapter, u8 *raddr)
|
|
|
-{
|
|
|
- unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
|
|
|
- u8 action = P2P_PUB_ACTION_ACTION;
|
|
|
- __be32 p2poui = cpu_to_be32(P2POUI);
|
|
|
- u8 oui_subtype = P2P_GO_NEGO_REQ;
|
|
|
- u8 wpsie[255] = { 0x00 }, p2pie[255] = { 0x00 };
|
|
|
- u8 wpsielen = 0, p2pielen = 0;
|
|
|
- u16 len_channellist_attr = 0;
|
|
|
- struct xmit_frame *pmgntframe;
|
|
|
- struct pkt_attrib *pattrib;
|
|
|
- unsigned char *pframe;
|
|
|
- struct rtw_ieee80211_hdr *pwlanhdr;
|
|
|
- __le16 *fctrl;
|
|
|
- struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
|
|
|
- struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-
|
|
|
- pmgntframe = alloc_mgtxmitframe(pxmitpriv);
|
|
|
- if (pmgntframe == NULL)
|
|
|
- return;
|
|
|
-
|
|
|
- DBG_88E("[%s] In\n", __func__);
|
|
|
- /* update attribute */
|
|
|
- pattrib = &pmgntframe->attrib;
|
|
|
- update_mgntframe_attrib(padapter, pattrib);
|
|
|
-
|
|
|
- memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
|
|
|
-
|
|
|
- pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
|
|
- pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
|
|
-
|
|
|
- fctrl = &(pwlanhdr->frame_ctl);
|
|
|
- *(fctrl) = 0;
|
|
|
-
|
|
|
- memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
|
|
|
-
|
|
|
- SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
|
|
|
- pmlmeext->mgnt_seq++;
|
|
|
- SetFrameSubType(pframe, WIFI_ACTION);
|
|
|
-
|
|
|
- pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
- pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
-
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&(p2poui), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
|
|
|
- pwdinfo->negotiation_dialog_token = 1; /* Initialize the dialog value */
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &pwdinfo->negotiation_dialog_token, &(pattrib->pktlen));
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- /* WPS Section */
|
|
|
- wpsielen = 0;
|
|
|
- /* WPS OUI */
|
|
|
- *(__be32 *)(wpsie) = cpu_to_be32(WPSOUI);
|
|
|
- wpsielen += 4;
|
|
|
-
|
|
|
- /* WPS version */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */
|
|
|
-
|
|
|
- /* Device Password ID */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
-
|
|
|
- if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN)
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_USER_SPEC);
|
|
|
- else if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN)
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_REGISTRAR_SPEC);
|
|
|
- else if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC)
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_PBC);
|
|
|
-
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *)wpsie, &pattrib->pktlen);
|
|
|
-
|
|
|
-
|
|
|
- /* P2P IE Section. */
|
|
|
-
|
|
|
- /* P2P OUI */
|
|
|
- p2pielen = 0;
|
|
|
- p2pie[p2pielen++] = 0x50;
|
|
|
- p2pie[p2pielen++] = 0x6F;
|
|
|
- p2pie[p2pielen++] = 0x9A;
|
|
|
- p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */
|
|
|
-
|
|
|
- /* Commented by Albert 20110306 */
|
|
|
- /* According to the P2P Specification, the group negotiation request frame should contain 9 P2P attributes */
|
|
|
- /* 1. P2P Capability */
|
|
|
- /* 2. Group Owner Intent */
|
|
|
- /* 3. Configuration Timeout */
|
|
|
- /* 4. Listen Channel */
|
|
|
- /* 5. Extended Listen Timing */
|
|
|
- /* 6. Intended P2P Interface Address */
|
|
|
- /* 7. Channel List */
|
|
|
- /* 8. P2P Device Info */
|
|
|
- /* 9. Operating Channel */
|
|
|
-
|
|
|
-
|
|
|
- /* P2P Capability */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Device Capability Bitmap, 1 byte */
|
|
|
- p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
|
|
|
-
|
|
|
- /* Group Capability Bitmap, 1 byte */
|
|
|
- if (pwdinfo->persistent_supported)
|
|
|
- p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;
|
|
|
- else
|
|
|
- p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN;
|
|
|
-
|
|
|
- /* Group Owner Intent */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_GO_INTENT;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Todo the tie breaker bit. */
|
|
|
- p2pie[p2pielen++] = ((pwdinfo->intent << 1) | BIT(0));
|
|
|
-
|
|
|
- /* Configuration Timeout */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P GO */
|
|
|
- p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P Client */
|
|
|
-
|
|
|
-
|
|
|
- /* Listen Channel */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_LISTEN_CH;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Country String */
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
-
|
|
|
- /* The third byte should be set to 0x04. */
|
|
|
- /* Described in the "Operating Channel Attribute" section. */
|
|
|
- p2pie[p2pielen++] = 0x04;
|
|
|
-
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = 0x51; /* Copy from SD7 */
|
|
|
-
|
|
|
- /* Channel Number */
|
|
|
- p2pie[p2pielen++] = pwdinfo->listen_channel; /* listening channel number */
|
|
|
-
|
|
|
-
|
|
|
- /* Extended Listen Timing ATTR */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0004);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Availability Period */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Availability Interval */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
-
|
|
|
- /* Intended P2P Interface Address */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_INTENTED_IF_ADDR;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
-
|
|
|
-
|
|
|
- /* Channel List */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- /* Country String(3) */
|
|
|
- /* + (Operating Class (1) + Number of Channels(1)) * Operation Classes (?) */
|
|
|
- /* + number of channels in all classes */
|
|
|
- len_channellist_attr = 3
|
|
|
- + (1 + 1) * (u16)(pmlmeext->channel_list.reg_classes)
|
|
|
- + get_reg_classes_full_count(&pmlmeext->channel_list);
|
|
|
-
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Country String */
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
-
|
|
|
- /* The third byte should be set to 0x04. */
|
|
|
- /* Described in the "Operating Channel Attribute" section. */
|
|
|
- p2pie[p2pielen++] = 0x04;
|
|
|
-
|
|
|
- /* Channel Entry List */
|
|
|
-
|
|
|
- {
|
|
|
- int i, j;
|
|
|
- for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
|
|
|
-
|
|
|
- /* Number of Channels */
|
|
|
- p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
|
|
|
-
|
|
|
- /* Channel List */
|
|
|
- for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
|
|
|
- p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* Device Info */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- /* 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */
|
|
|
- /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* P2P Device Address */
|
|
|
- memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
-
|
|
|
- /* Config Method */
|
|
|
- /* This field should be big endian. Noted by P2P specification. */
|
|
|
-
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm);
|
|
|
-
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Primary Device Type */
|
|
|
- /* Category ID */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* OUI */
|
|
|
- *(__be32 *)(p2pie + p2pielen) = cpu_to_be32(WPSOUI);
|
|
|
- p2pielen += 4;
|
|
|
-
|
|
|
- /* Sub Category ID */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Number of Secondary Device Types */
|
|
|
- p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */
|
|
|
-
|
|
|
- /* Device Name */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len);
|
|
|
- p2pielen += pwdinfo->device_name_len;
|
|
|
-
|
|
|
-
|
|
|
- /* Operating Channel */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Country String */
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
-
|
|
|
- /* The third byte should be set to 0x04. */
|
|
|
- /* Described in the "Operating Channel Attribute" section. */
|
|
|
- p2pie[p2pielen++] = 0x04;
|
|
|
-
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = 0x51;
|
|
|
-
|
|
|
- /* Channel Number */
|
|
|
- p2pie[p2pielen++] = pwdinfo->operating_channel; /* operating channel number */
|
|
|
-
|
|
|
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen);
|
|
|
-
|
|
|
- pattrib->last_txcmdsz = pattrib->pktlen;
|
|
|
-
|
|
|
- dump_mgntframe(padapter, pmgntframe);
|
|
|
-
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-static void issue_p2p_GO_response(struct adapter *padapter, u8 *raddr, u8 *frame_body, uint len, u8 result)
|
|
|
-{
|
|
|
- unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
|
|
|
- u8 action = P2P_PUB_ACTION_ACTION;
|
|
|
- __be32 p2poui = cpu_to_be32(P2POUI);
|
|
|
- u8 oui_subtype = P2P_GO_NEGO_RESP;
|
|
|
- u8 wpsie[255] = { 0x00 }, p2pie[255] = { 0x00 };
|
|
|
- u8 p2pielen = 0;
|
|
|
- uint wpsielen = 0;
|
|
|
- u16 wps_devicepassword_id = 0x0000;
|
|
|
- __be16 be_tmp;
|
|
|
- uint wps_devicepassword_id_len = 0;
|
|
|
- u16 len_channellist_attr = 0;
|
|
|
-
|
|
|
- struct xmit_frame *pmgntframe;
|
|
|
- struct pkt_attrib *pattrib;
|
|
|
- unsigned char *pframe;
|
|
|
- struct rtw_ieee80211_hdr *pwlanhdr;
|
|
|
- __le16 *fctrl;
|
|
|
- struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
|
|
|
- struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-
|
|
|
- pmgntframe = alloc_mgtxmitframe(pxmitpriv);
|
|
|
- if (pmgntframe == NULL)
|
|
|
- return;
|
|
|
-
|
|
|
- DBG_88E("[%s] In, result=%d\n", __func__, result);
|
|
|
- /* update attribute */
|
|
|
- pattrib = &pmgntframe->attrib;
|
|
|
- update_mgntframe_attrib(padapter, pattrib);
|
|
|
-
|
|
|
- memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
|
|
|
-
|
|
|
- pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
|
|
- pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
|
|
-
|
|
|
- fctrl = &(pwlanhdr->frame_ctl);
|
|
|
- *(fctrl) = 0;
|
|
|
-
|
|
|
- memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
|
|
|
-
|
|
|
- SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
|
|
|
- pmlmeext->mgnt_seq++;
|
|
|
- SetFrameSubType(pframe, WIFI_ACTION);
|
|
|
-
|
|
|
- pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
- pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
-
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&(p2poui), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
|
|
|
- pwdinfo->negotiation_dialog_token = frame_body[7]; /* The Dialog Token of provisioning discovery request frame. */
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen));
|
|
|
-
|
|
|
- /* Commented by Albert 20110328 */
|
|
|
- /* Try to get the device password ID from the WPS IE of group negotiation request frame */
|
|
|
- /* WiFi Direct test plan 5.1.15 */
|
|
|
- rtw_get_wps_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen);
|
|
|
- rtw_get_wps_attr_content(wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8 *)&be_tmp, &wps_devicepassword_id_len);
|
|
|
- wps_devicepassword_id = be16_to_cpu(be_tmp);
|
|
|
-
|
|
|
- memset(wpsie, 0x00, 255);
|
|
|
- wpsielen = 0;
|
|
|
-
|
|
|
- /* WPS Section */
|
|
|
- wpsielen = 0;
|
|
|
- /* WPS OUI */
|
|
|
- *(__be32 *)(wpsie) = cpu_to_be32(WPSOUI);
|
|
|
- wpsielen += 4;
|
|
|
-
|
|
|
- /* WPS version */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */
|
|
|
-
|
|
|
- /* Device Password ID */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- if (wps_devicepassword_id == WPS_DPID_USER_SPEC)
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_REGISTRAR_SPEC);
|
|
|
- else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC)
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_USER_SPEC);
|
|
|
- else
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_PBC);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Commented by Kurt 20120113 */
|
|
|
- /* If some device wants to do p2p handshake without sending prov_disc_req */
|
|
|
- /* We have to get peer_req_cm from here. */
|
|
|
- if (!memcmp(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3)) {
|
|
|
- if (wps_devicepassword_id == WPS_DPID_USER_SPEC)
|
|
|
- memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3);
|
|
|
- else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC)
|
|
|
- memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3);
|
|
|
- else
|
|
|
- memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3);
|
|
|
- }
|
|
|
-
|
|
|
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *)wpsie, &pattrib->pktlen);
|
|
|
-
|
|
|
-
|
|
|
- /* P2P IE Section. */
|
|
|
-
|
|
|
- /* P2P OUI */
|
|
|
- p2pielen = 0;
|
|
|
- p2pie[p2pielen++] = 0x50;
|
|
|
- p2pie[p2pielen++] = 0x6F;
|
|
|
- p2pie[p2pielen++] = 0x9A;
|
|
|
- p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */
|
|
|
-
|
|
|
- /* Commented by Albert 20100908 */
|
|
|
- /* According to the P2P Specification, the group negotiation response frame should contain 9 P2P attributes */
|
|
|
- /* 1. Status */
|
|
|
- /* 2. P2P Capability */
|
|
|
- /* 3. Group Owner Intent */
|
|
|
- /* 4. Configuration Timeout */
|
|
|
- /* 5. Operating Channel */
|
|
|
- /* 6. Intended P2P Interface Address */
|
|
|
- /* 7. Channel List */
|
|
|
- /* 8. Device Info */
|
|
|
- /* 9. Group ID (Only GO) */
|
|
|
-
|
|
|
-
|
|
|
- /* ToDo: */
|
|
|
-
|
|
|
- /* P2P Status */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_STATUS;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- p2pie[p2pielen++] = result;
|
|
|
-
|
|
|
- /* P2P Capability */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Device Capability Bitmap, 1 byte */
|
|
|
-
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) {
|
|
|
- /* Commented by Albert 2011/03/08 */
|
|
|
- /* According to the P2P specification */
|
|
|
- /* if the sending device will be client, the P2P Capability should be reserved of group negotiation response frame */
|
|
|
- p2pie[p2pielen++] = 0;
|
|
|
- } else {
|
|
|
- /* Be group owner or meet the error case */
|
|
|
- p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
|
|
|
- }
|
|
|
-
|
|
|
- /* Group Capability Bitmap, 1 byte */
|
|
|
- if (pwdinfo->persistent_supported) {
|
|
|
- p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;
|
|
|
- } else {
|
|
|
- p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN;
|
|
|
- }
|
|
|
-
|
|
|
- /* Group Owner Intent */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_GO_INTENT;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- if (pwdinfo->peer_intent & 0x01) {
|
|
|
- /* Peer's tie breaker bit is 1, our tie breaker bit should be 0 */
|
|
|
- p2pie[p2pielen++] = (pwdinfo->intent << 1);
|
|
|
- } else {
|
|
|
- /* Peer's tie breaker bit is 0, our tie breaker bit should be 1 */
|
|
|
- p2pie[p2pielen++] = ((pwdinfo->intent << 1) | BIT(0));
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /* Configuration Timeout */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P GO */
|
|
|
- p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P Client */
|
|
|
-
|
|
|
- /* Operating Channel */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Country String */
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
-
|
|
|
- /* The third byte should be set to 0x04. */
|
|
|
- /* Described in the "Operating Channel Attribute" section. */
|
|
|
- p2pie[p2pielen++] = 0x04;
|
|
|
-
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = 0x51;
|
|
|
-
|
|
|
- /* Channel Number */
|
|
|
- p2pie[p2pielen++] = pwdinfo->operating_channel; /* operating channel number */
|
|
|
-
|
|
|
- /* Intended P2P Interface Address */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_INTENTED_IF_ADDR;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
-
|
|
|
- /* Channel List */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
|
|
|
-
|
|
|
- /* Country String(3) */
|
|
|
- /* + (Operating Class (1) + Number of Channels(1)) * Operation Classes (?) */
|
|
|
- /* + number of channels in all classes */
|
|
|
- len_channellist_attr = 3
|
|
|
- + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes
|
|
|
- + get_reg_classes_full_count(&pmlmeext->channel_list);
|
|
|
-
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr);
|
|
|
-
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Country String */
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
-
|
|
|
- /* The third byte should be set to 0x04. */
|
|
|
- /* Described in the "Operating Channel Attribute" section. */
|
|
|
- p2pie[p2pielen++] = 0x04;
|
|
|
-
|
|
|
- /* Channel Entry List */
|
|
|
-
|
|
|
- {
|
|
|
- int i, j;
|
|
|
- for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
|
|
|
-
|
|
|
- /* Number of Channels */
|
|
|
- p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
|
|
|
-
|
|
|
- /* Channel List */
|
|
|
- for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
|
|
|
- p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* Device Info */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- /* 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */
|
|
|
- /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* P2P Device Address */
|
|
|
- memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
-
|
|
|
- /* Config Method */
|
|
|
- /* This field should be big endian. Noted by P2P specification. */
|
|
|
-
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm);
|
|
|
-
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Primary Device Type */
|
|
|
- /* Category ID */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* OUI */
|
|
|
- *(__be32 *)(p2pie + p2pielen) = cpu_to_be32(WPSOUI);
|
|
|
- p2pielen += 4;
|
|
|
-
|
|
|
- /* Sub Category ID */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Number of Secondary Device Types */
|
|
|
- p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */
|
|
|
-
|
|
|
- /* Device Name */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len);
|
|
|
- p2pielen += pwdinfo->device_name_len;
|
|
|
-
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
|
|
|
- /* Group ID Attribute */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_GROUP_ID;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN + pwdinfo->nego_ssidlen);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* p2P Device Address */
|
|
|
- memcpy(p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN);
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
-
|
|
|
- /* SSID */
|
|
|
- memcpy(p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen);
|
|
|
- p2pielen += pwdinfo->nego_ssidlen;
|
|
|
- }
|
|
|
-
|
|
|
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen);
|
|
|
-
|
|
|
- pattrib->last_txcmdsz = pattrib->pktlen;
|
|
|
-
|
|
|
- dump_mgntframe(padapter, pmgntframe);
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-static void issue_p2p_GO_confirm(struct adapter *padapter, u8 *raddr, u8 result)
|
|
|
-{
|
|
|
- unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
|
|
|
- u8 action = P2P_PUB_ACTION_ACTION;
|
|
|
- __be32 p2poui = cpu_to_be32(P2POUI);
|
|
|
- u8 oui_subtype = P2P_GO_NEGO_CONF;
|
|
|
- u8 p2pie[255] = { 0x00 };
|
|
|
- u8 p2pielen = 0;
|
|
|
-
|
|
|
- struct xmit_frame *pmgntframe;
|
|
|
- struct pkt_attrib *pattrib;
|
|
|
- unsigned char *pframe;
|
|
|
- struct rtw_ieee80211_hdr *pwlanhdr;
|
|
|
- __le16 *fctrl;
|
|
|
- struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
|
|
|
- struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-
|
|
|
- pmgntframe = alloc_mgtxmitframe(pxmitpriv);
|
|
|
- if (pmgntframe == NULL)
|
|
|
- return;
|
|
|
-
|
|
|
- DBG_88E("[%s] In\n", __func__);
|
|
|
- /* update attribute */
|
|
|
- pattrib = &pmgntframe->attrib;
|
|
|
- update_mgntframe_attrib(padapter, pattrib);
|
|
|
-
|
|
|
- memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
|
|
|
-
|
|
|
- pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
|
|
- pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
|
|
-
|
|
|
- fctrl = &(pwlanhdr->frame_ctl);
|
|
|
- *(fctrl) = 0;
|
|
|
-
|
|
|
- memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
|
|
|
-
|
|
|
- SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
|
|
|
- pmlmeext->mgnt_seq++;
|
|
|
- SetFrameSubType(pframe, WIFI_ACTION);
|
|
|
-
|
|
|
- pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
- pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
-
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&(p2poui), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen));
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- /* P2P IE Section. */
|
|
|
-
|
|
|
- /* P2P OUI */
|
|
|
- p2pielen = 0;
|
|
|
- p2pie[p2pielen++] = 0x50;
|
|
|
- p2pie[p2pielen++] = 0x6F;
|
|
|
- p2pie[p2pielen++] = 0x9A;
|
|
|
- p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */
|
|
|
-
|
|
|
- /* Commented by Albert 20110306 */
|
|
|
- /* According to the P2P Specification, the group negotiation request frame should contain 5 P2P attributes */
|
|
|
- /* 1. Status */
|
|
|
- /* 2. P2P Capability */
|
|
|
- /* 3. Operating Channel */
|
|
|
- /* 4. Channel List */
|
|
|
- /* 5. Group ID (if this WiFi is GO) */
|
|
|
-
|
|
|
- /* P2P Status */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_STATUS;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- p2pie[p2pielen++] = result;
|
|
|
-
|
|
|
- /* P2P Capability */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Device Capability Bitmap, 1 byte */
|
|
|
- p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
|
|
|
-
|
|
|
- /* Group Capability Bitmap, 1 byte */
|
|
|
- if (pwdinfo->persistent_supported)
|
|
|
- p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;
|
|
|
- else
|
|
|
- p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN;
|
|
|
-
|
|
|
- /* Operating Channel */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Country String */
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
-
|
|
|
- /* The third byte should be set to 0x04. */
|
|
|
- /* Described in the "Operating Channel Attribute" section. */
|
|
|
- p2pie[p2pielen++] = 0x04;
|
|
|
-
|
|
|
-
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) {
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = 0x51;
|
|
|
- p2pie[p2pielen++] = pwdinfo->peer_operating_ch;
|
|
|
- } else {
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = 0x51;
|
|
|
-
|
|
|
- /* Channel Number */
|
|
|
- p2pie[p2pielen++] = pwdinfo->operating_channel; /* Use the listen channel as the operating channel */
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /* Channel List */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(pwdinfo->channel_list_attr_len);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(p2pie + p2pielen, pwdinfo->channel_list_attr, pwdinfo->channel_list_attr_len);
|
|
|
- p2pielen += pwdinfo->channel_list_attr_len;
|
|
|
-
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
|
|
|
- /* Group ID Attribute */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_GROUP_ID;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN + pwdinfo->nego_ssidlen);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* p2P Device Address */
|
|
|
- memcpy(p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN);
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
-
|
|
|
- /* SSID */
|
|
|
- memcpy(p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen);
|
|
|
- p2pielen += pwdinfo->nego_ssidlen;
|
|
|
- }
|
|
|
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen);
|
|
|
- pattrib->last_txcmdsz = pattrib->pktlen;
|
|
|
- dump_mgntframe(padapter, pmgntframe);
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-void issue_p2p_invitation_request(struct adapter *padapter, u8 *raddr)
|
|
|
-{
|
|
|
- unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
|
|
|
- u8 action = P2P_PUB_ACTION_ACTION;
|
|
|
- __be32 p2poui = cpu_to_be32(P2POUI);
|
|
|
- u8 oui_subtype = P2P_INVIT_REQ;
|
|
|
- u8 p2pie[255] = { 0x00 };
|
|
|
- u8 p2pielen = 0;
|
|
|
- u8 dialogToken = 3;
|
|
|
- u16 len_channellist_attr = 0;
|
|
|
- struct xmit_frame *pmgntframe;
|
|
|
- struct pkt_attrib *pattrib;
|
|
|
- unsigned char *pframe;
|
|
|
- struct rtw_ieee80211_hdr *pwlanhdr;
|
|
|
- __le16 *fctrl;
|
|
|
- struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
|
|
|
- struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-
|
|
|
- pmgntframe = alloc_mgtxmitframe(pxmitpriv);
|
|
|
- if (pmgntframe == NULL)
|
|
|
- return;
|
|
|
-
|
|
|
- /* update attribute */
|
|
|
- pattrib = &pmgntframe->attrib;
|
|
|
- update_mgntframe_attrib(padapter, pattrib);
|
|
|
-
|
|
|
- memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
|
|
|
-
|
|
|
- pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
|
|
- pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
|
|
-
|
|
|
- fctrl = &(pwlanhdr->frame_ctl);
|
|
|
- *(fctrl) = 0;
|
|
|
-
|
|
|
- memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr3, raddr, ETH_ALEN);
|
|
|
-
|
|
|
- SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
|
|
|
- pmlmeext->mgnt_seq++;
|
|
|
- SetFrameSubType(pframe, WIFI_ACTION);
|
|
|
-
|
|
|
- pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
- pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
-
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&(p2poui), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));
|
|
|
-
|
|
|
- /* P2P IE Section. */
|
|
|
-
|
|
|
- /* P2P OUI */
|
|
|
- p2pielen = 0;
|
|
|
- p2pie[p2pielen++] = 0x50;
|
|
|
- p2pie[p2pielen++] = 0x6F;
|
|
|
- p2pie[p2pielen++] = 0x9A;
|
|
|
- p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */
|
|
|
-
|
|
|
- /* Commented by Albert 20101011 */
|
|
|
- /* According to the P2P Specification, the P2P Invitation request frame should contain 7 P2P attributes */
|
|
|
- /* 1. Configuration Timeout */
|
|
|
- /* 2. Invitation Flags */
|
|
|
- /* 3. Operating Channel (Only GO) */
|
|
|
- /* 4. P2P Group BSSID (Should be included if I am the GO) */
|
|
|
- /* 5. Channel List */
|
|
|
- /* 6. P2P Group ID */
|
|
|
- /* 7. P2P Device Info */
|
|
|
-
|
|
|
- /* Configuration Timeout */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P GO */
|
|
|
- p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P Client */
|
|
|
-
|
|
|
- /* Invitation Flags */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_INVITATION_FLAGS;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- p2pie[p2pielen++] = P2P_INVITATION_FLAGS_PERSISTENT;
|
|
|
-
|
|
|
-
|
|
|
- /* Operating Channel */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Country String */
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
-
|
|
|
- /* The third byte should be set to 0x04. */
|
|
|
- /* Described in the "Operating Channel Attribute" section. */
|
|
|
- p2pie[p2pielen++] = 0x04;
|
|
|
-
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = 0x51;
|
|
|
-
|
|
|
- /* Channel Number */
|
|
|
- p2pie[p2pielen++] = pwdinfo->invitereq_info.operating_ch; /* operating channel number */
|
|
|
-
|
|
|
- if (!memcmp(myid(&padapter->eeprompriv),
|
|
|
- pwdinfo->invitereq_info.go_bssid, ETH_ALEN)) {
|
|
|
- /* P2P Group BSSID */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_GROUP_BSSID;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* P2P Device Address for GO */
|
|
|
- memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN);
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
- }
|
|
|
-
|
|
|
- /* Channel List */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
|
|
|
-
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- /* Country String(3) */
|
|
|
- /* + (Operating Class (1) + Number of Channels(1)) * Operation Classes (?) */
|
|
|
- /* + number of channels in all classes */
|
|
|
- len_channellist_attr = 3
|
|
|
- + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes
|
|
|
- + get_reg_classes_full_count(&pmlmeext->channel_list);
|
|
|
-
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr);
|
|
|
-
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Country String */
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
-
|
|
|
- /* The third byte should be set to 0x04. */
|
|
|
- /* Described in the "Operating Channel Attribute" section. */
|
|
|
- p2pie[p2pielen++] = 0x04;
|
|
|
-
|
|
|
- /* Channel Entry List */
|
|
|
- {
|
|
|
- int i, j;
|
|
|
- for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
|
|
|
-
|
|
|
- /* Number of Channels */
|
|
|
- p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
|
|
|
-
|
|
|
- /* Channel List */
|
|
|
- for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
|
|
|
- p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /* P2P Group ID */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_GROUP_ID;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(6 + pwdinfo->invitereq_info.ssidlen);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* P2P Device Address for GO */
|
|
|
- memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN);
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
-
|
|
|
- /* SSID */
|
|
|
- memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_ssid, pwdinfo->invitereq_info.ssidlen);
|
|
|
- p2pielen += pwdinfo->invitereq_info.ssidlen;
|
|
|
-
|
|
|
-
|
|
|
- /* Device Info */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- /* 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */
|
|
|
- /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* P2P Device Address */
|
|
|
- memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
-
|
|
|
- /* Config Method */
|
|
|
- /* This field should be big endian. Noted by P2P specification. */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Primary Device Type */
|
|
|
- /* Category ID */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* OUI */
|
|
|
- *(__be32 *)(p2pie + p2pielen) = cpu_to_be32(WPSOUI);
|
|
|
- p2pielen += 4;
|
|
|
-
|
|
|
- /* Sub Category ID */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Number of Secondary Device Types */
|
|
|
- p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */
|
|
|
-
|
|
|
- /* Device Name */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len);
|
|
|
- p2pielen += pwdinfo->device_name_len;
|
|
|
-
|
|
|
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen);
|
|
|
-
|
|
|
- pattrib->last_txcmdsz = pattrib->pktlen;
|
|
|
-
|
|
|
- dump_mgntframe(padapter, pmgntframe);
|
|
|
-
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-void issue_p2p_invitation_response(struct adapter *padapter, u8 *raddr, u8 dialogToken, u8 status_code)
|
|
|
-{
|
|
|
- unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
|
|
|
- u8 action = P2P_PUB_ACTION_ACTION;
|
|
|
- __be32 p2poui = cpu_to_be32(P2POUI);
|
|
|
- u8 oui_subtype = P2P_INVIT_RESP;
|
|
|
- u8 p2pie[255] = { 0x00 };
|
|
|
- u8 p2pielen = 0;
|
|
|
- u16 len_channellist_attr = 0;
|
|
|
- struct xmit_frame *pmgntframe;
|
|
|
- struct pkt_attrib *pattrib;
|
|
|
- unsigned char *pframe;
|
|
|
- struct rtw_ieee80211_hdr *pwlanhdr;
|
|
|
- __le16 *fctrl;
|
|
|
- struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
|
|
|
- struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-
|
|
|
- pmgntframe = alloc_mgtxmitframe(pxmitpriv);
|
|
|
- if (pmgntframe == NULL)
|
|
|
- return;
|
|
|
-
|
|
|
- /* update attribute */
|
|
|
- pattrib = &pmgntframe->attrib;
|
|
|
- update_mgntframe_attrib(padapter, pattrib);
|
|
|
-
|
|
|
- memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
|
|
|
-
|
|
|
- pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
|
|
- pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
|
|
-
|
|
|
- fctrl = &(pwlanhdr->frame_ctl);
|
|
|
- *(fctrl) = 0;
|
|
|
-
|
|
|
- memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr3, raddr, ETH_ALEN);
|
|
|
-
|
|
|
- SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
|
|
|
- pmlmeext->mgnt_seq++;
|
|
|
- SetFrameSubType(pframe, WIFI_ACTION);
|
|
|
-
|
|
|
- pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
- pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
-
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&(p2poui), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));
|
|
|
-
|
|
|
- /* P2P IE Section. */
|
|
|
-
|
|
|
- /* P2P OUI */
|
|
|
- p2pielen = 0;
|
|
|
- p2pie[p2pielen++] = 0x50;
|
|
|
- p2pie[p2pielen++] = 0x6F;
|
|
|
- p2pie[p2pielen++] = 0x9A;
|
|
|
- p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */
|
|
|
-
|
|
|
- /* Commented by Albert 20101005 */
|
|
|
- /* According to the P2P Specification, the P2P Invitation response frame should contain 5 P2P attributes */
|
|
|
- /* 1. Status */
|
|
|
- /* 2. Configuration Timeout */
|
|
|
- /* 3. Operating Channel (Only GO) */
|
|
|
- /* 4. P2P Group BSSID (Only GO) */
|
|
|
- /* 5. Channel List */
|
|
|
-
|
|
|
- /* P2P Status */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_STATUS;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* When status code is P2P_STATUS_FAIL_INFO_UNAVAILABLE. */
|
|
|
- /* Sent the event receiving the P2P Invitation Req frame to DMP UI. */
|
|
|
- /* DMP had to compare the MAC address to find out the profile. */
|
|
|
- /* So, the WiFi driver will send the P2P_STATUS_FAIL_INFO_UNAVAILABLE to NB. */
|
|
|
- /* If the UI found the corresponding profile, the WiFi driver sends the P2P Invitation Req */
|
|
|
- /* to NB to rebuild the persistent group. */
|
|
|
- p2pie[p2pielen++] = status_code;
|
|
|
-
|
|
|
- /* Configuration Timeout */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P GO */
|
|
|
- p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P Client */
|
|
|
-
|
|
|
- if (status_code == P2P_STATUS_SUCCESS) {
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
|
|
|
- /* The P2P Invitation request frame asks this Wi-Fi device to be the P2P GO */
|
|
|
- /* In this case, the P2P Invitation response frame should carry the two more P2P attributes. */
|
|
|
- /* First one is operating channel attribute. */
|
|
|
- /* Second one is P2P Group BSSID attribute. */
|
|
|
-
|
|
|
- /* Operating Channel */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Country String */
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
-
|
|
|
- /* The third byte should be set to 0x04. */
|
|
|
- /* Described in the "Operating Channel Attribute" section. */
|
|
|
- p2pie[p2pielen++] = 0x04;
|
|
|
-
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = 0x51; /* Copy from SD7 */
|
|
|
-
|
|
|
- /* Channel Number */
|
|
|
- p2pie[p2pielen++] = pwdinfo->operating_channel; /* operating channel number */
|
|
|
-
|
|
|
-
|
|
|
- /* P2P Group BSSID */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_GROUP_BSSID;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* P2P Device Address for GO */
|
|
|
- memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
- }
|
|
|
-
|
|
|
- /* Channel List */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- /* Country String(3) */
|
|
|
- /* + (Operating Class (1) + Number of Channels(1)) * Operation Classes (?) */
|
|
|
- /* + number of channels in all classes */
|
|
|
- len_channellist_attr = 3
|
|
|
- + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes
|
|
|
- + get_reg_classes_full_count(&pmlmeext->channel_list);
|
|
|
-
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Country String */
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
-
|
|
|
- /* The third byte should be set to 0x04. */
|
|
|
- /* Described in the "Operating Channel Attribute" section. */
|
|
|
- p2pie[p2pielen++] = 0x04;
|
|
|
-
|
|
|
- /* Channel Entry List */
|
|
|
- {
|
|
|
- int i, j;
|
|
|
- for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
|
|
|
-
|
|
|
- /* Number of Channels */
|
|
|
- p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
|
|
|
-
|
|
|
- /* Channel List */
|
|
|
- for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
|
|
|
- p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen);
|
|
|
-
|
|
|
- pattrib->last_txcmdsz = pattrib->pktlen;
|
|
|
-
|
|
|
- dump_mgntframe(padapter, pmgntframe);
|
|
|
-
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-void issue_p2p_provision_request(struct adapter *padapter, u8 *pssid, u8 ussidlen, u8 *pdev_raddr)
|
|
|
-{
|
|
|
- unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
|
|
|
- u8 action = P2P_PUB_ACTION_ACTION;
|
|
|
- u8 dialogToken = 1;
|
|
|
- u8 oui_subtype = P2P_PROVISION_DISC_REQ;
|
|
|
- u8 wpsie[100] = { 0x00 };
|
|
|
- u8 wpsielen = 0;
|
|
|
- __be32 p2poui = cpu_to_be32(P2POUI);
|
|
|
- u32 p2pielen = 0;
|
|
|
- struct xmit_frame *pmgntframe;
|
|
|
- struct pkt_attrib *pattrib;
|
|
|
- unsigned char *pframe;
|
|
|
- struct rtw_ieee80211_hdr *pwlanhdr;
|
|
|
- __le16 *fctrl;
|
|
|
- struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
|
|
|
- struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-
|
|
|
- pmgntframe = alloc_mgtxmitframe(pxmitpriv);
|
|
|
- if (pmgntframe == NULL)
|
|
|
- return;
|
|
|
-
|
|
|
- DBG_88E("[%s] In\n", __func__);
|
|
|
- /* update attribute */
|
|
|
- pattrib = &pmgntframe->attrib;
|
|
|
- update_mgntframe_attrib(padapter, pattrib);
|
|
|
-
|
|
|
- memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
|
|
|
-
|
|
|
- pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
|
|
- pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
|
|
-
|
|
|
- fctrl = &(pwlanhdr->frame_ctl);
|
|
|
- *(fctrl) = 0;
|
|
|
-
|
|
|
- memcpy(pwlanhdr->addr1, pdev_raddr, ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr3, pdev_raddr, ETH_ALEN);
|
|
|
-
|
|
|
- SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
|
|
|
- pmlmeext->mgnt_seq++;
|
|
|
- SetFrameSubType(pframe, WIFI_ACTION);
|
|
|
-
|
|
|
- pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
- pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
-
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&(p2poui), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
|
|
|
- pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));
|
|
|
-
|
|
|
- p2pielen = build_prov_disc_request_p2p_ie(pwdinfo, pframe, pssid, ussidlen, pdev_raddr);
|
|
|
-
|
|
|
- pframe += p2pielen;
|
|
|
- pattrib->pktlen += p2pielen;
|
|
|
-
|
|
|
- wpsielen = 0;
|
|
|
- /* WPS OUI */
|
|
|
- *(__be32 *)(wpsie) = cpu_to_be32(WPSOUI);
|
|
|
- wpsielen += 4;
|
|
|
-
|
|
|
- /* WPS version */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */
|
|
|
-
|
|
|
- /* Config Method */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->tx_prov_disc_info.wps_config_method_request);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *)wpsie, &pattrib->pktlen);
|
|
|
-
|
|
|
- pattrib->last_txcmdsz = pattrib->pktlen;
|
|
|
-
|
|
|
- dump_mgntframe(padapter, pmgntframe);
|
|
|
-
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-static u8 is_matched_in_profilelist(u8 *peermacaddr, struct profile_info *profileinfo)
|
|
|
-{
|
|
|
- u8 i, match_result = 0;
|
|
|
-
|
|
|
- DBG_88E("[%s] peermac=%.2X %.2X %.2X %.2X %.2X %.2X\n", __func__,
|
|
|
- peermacaddr[0], peermacaddr[1], peermacaddr[2], peermacaddr[3], peermacaddr[4], peermacaddr[5]);
|
|
|
-
|
|
|
- for (i = 0; i < P2P_MAX_PERSISTENT_GROUP_NUM; i++, profileinfo++) {
|
|
|
- DBG_88E("[%s] profileinfo_mac=%.2X %.2X %.2X %.2X %.2X %.2X\n", __func__,
|
|
|
- profileinfo->peermac[0], profileinfo->peermac[1], profileinfo->peermac[2], profileinfo->peermac[3], profileinfo->peermac[4], profileinfo->peermac[5]);
|
|
|
- if (!memcmp(peermacaddr, profileinfo->peermac, ETH_ALEN)) {
|
|
|
- match_result = 1;
|
|
|
- DBG_88E("[%s] Match!\n", __func__);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- return match_result;
|
|
|
-}
|
|
|
-
|
|
|
-void issue_probersp_p2p(struct adapter *padapter, unsigned char *da)
|
|
|
-{
|
|
|
- struct xmit_frame *pmgntframe;
|
|
|
- struct pkt_attrib *pattrib;
|
|
|
- unsigned char *pframe;
|
|
|
- struct rtw_ieee80211_hdr *pwlanhdr;
|
|
|
- __le16 *fctrl;
|
|
|
- unsigned char *mac;
|
|
|
- struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
|
|
|
- struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
|
|
|
- u16 beacon_interval = 100;
|
|
|
- u16 capInfo = 0;
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
- u8 wpsie[255] = { 0x00 };
|
|
|
- u32 wpsielen = 0, p2pielen = 0;
|
|
|
-
|
|
|
- pmgntframe = alloc_mgtxmitframe(pxmitpriv);
|
|
|
- if (pmgntframe == NULL)
|
|
|
- return;
|
|
|
-
|
|
|
- /* update attribute */
|
|
|
- pattrib = &pmgntframe->attrib;
|
|
|
- update_mgntframe_attrib(padapter, pattrib);
|
|
|
-
|
|
|
- memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
|
|
|
-
|
|
|
- pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
|
|
- pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
|
|
-
|
|
|
- mac = myid(&(padapter->eeprompriv));
|
|
|
-
|
|
|
- fctrl = &(pwlanhdr->frame_ctl);
|
|
|
- *(fctrl) = 0;
|
|
|
- memcpy(pwlanhdr->addr1, da, ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
|
|
|
-
|
|
|
- /* Use the device address for BSSID field. */
|
|
|
- memcpy(pwlanhdr->addr3, mac, ETH_ALEN);
|
|
|
-
|
|
|
- SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
|
|
|
- pmlmeext->mgnt_seq++;
|
|
|
- SetFrameSubType(fctrl, WIFI_PROBERSP);
|
|
|
-
|
|
|
- pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
- pattrib->pktlen = pattrib->hdrlen;
|
|
|
- pframe += pattrib->hdrlen;
|
|
|
-
|
|
|
- /* timestamp will be inserted by hardware */
|
|
|
- pframe += 8;
|
|
|
- pattrib->pktlen += 8;
|
|
|
-
|
|
|
- /* beacon interval: 2 bytes */
|
|
|
- memcpy(pframe, (unsigned char *)&beacon_interval, 2);
|
|
|
- pframe += 2;
|
|
|
- pattrib->pktlen += 2;
|
|
|
-
|
|
|
- /* capability info: 2 bytes */
|
|
|
- /* ESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of WiFi Direct Spec) */
|
|
|
- capInfo |= cap_ShortPremble;
|
|
|
- capInfo |= cap_ShortSlot;
|
|
|
-
|
|
|
- memcpy(pframe, (unsigned char *)&capInfo, 2);
|
|
|
- pframe += 2;
|
|
|
- pattrib->pktlen += 2;
|
|
|
-
|
|
|
-
|
|
|
- /* SSID */
|
|
|
- pframe = rtw_set_ie(pframe, _SSID_IE_, 7, pwdinfo->p2p_wildcard_ssid, &pattrib->pktlen);
|
|
|
-
|
|
|
- /* supported rates... */
|
|
|
- /* Use the OFDM rate in the P2P probe response frame. (6(B), 9(B), 12, 18, 24, 36, 48, 54) */
|
|
|
- pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen);
|
|
|
-
|
|
|
- /* DS parameter set */
|
|
|
- pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pattrib->pktlen);
|
|
|
-
|
|
|
- /* Todo: WPS IE */
|
|
|
- /* Noted by Albert 20100907 */
|
|
|
- /* According to the WPS specification, all the WPS attribute is presented by Big Endian. */
|
|
|
-
|
|
|
- wpsielen = 0;
|
|
|
- /* WPS OUI */
|
|
|
- *(__be32 *)(wpsie) = cpu_to_be32(WPSOUI);
|
|
|
- wpsielen += 4;
|
|
|
-
|
|
|
- /* WPS version */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */
|
|
|
-
|
|
|
- /* WiFi Simple Config State */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_SIMPLE_CONF_STATE);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG; /* Not Configured. */
|
|
|
-
|
|
|
- /* Response Type */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_RESP_TYPE);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X;
|
|
|
-
|
|
|
- /* UUID-E */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_UUID_E);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0010);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(wpsie + wpsielen, myid(&padapter->eeprompriv), ETH_ALEN);
|
|
|
- wpsielen += 0x10;
|
|
|
-
|
|
|
- /* Manufacturer */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MANUFACTURER);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0007);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(wpsie + wpsielen, "Realtek", 7);
|
|
|
- wpsielen += 7;
|
|
|
-
|
|
|
- /* Model Name */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MODEL_NAME);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0006);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(wpsie + wpsielen, "8188EU", 6);
|
|
|
- wpsielen += 6;
|
|
|
-
|
|
|
- /* Model Number */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MODEL_NUMBER);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- wpsie[wpsielen++] = 0x31; /* character 1 */
|
|
|
-
|
|
|
- /* Serial Number */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_SERIAL_NUMBER);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(ETH_ALEN);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(wpsie + wpsielen, "123456" , ETH_ALEN);
|
|
|
- wpsielen += ETH_ALEN;
|
|
|
-
|
|
|
- /* Primary Device Type */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0008);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Category ID */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* OUI */
|
|
|
- *(__be32 *)(wpsie + wpsielen) = cpu_to_be32(WPSOUI);
|
|
|
- wpsielen += 4;
|
|
|
-
|
|
|
- /* Sub Category ID */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Device Name */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->device_name_len);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- if (pwdinfo->device_name_len) {
|
|
|
- memcpy(wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len);
|
|
|
- wpsielen += pwdinfo->device_name_len;
|
|
|
- }
|
|
|
-
|
|
|
- /* Config Method */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->supported_wps_cm);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
-
|
|
|
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *)wpsie, &pattrib->pktlen);
|
|
|
-
|
|
|
-
|
|
|
- p2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe);
|
|
|
- pframe += p2pielen;
|
|
|
- pattrib->pktlen += p2pielen;
|
|
|
-
|
|
|
- pattrib->last_txcmdsz = pattrib->pktlen;
|
|
|
-
|
|
|
- dump_mgntframe(padapter, pmgntframe);
|
|
|
-
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-static int _issue_probereq_p2p(struct adapter *padapter, u8 *da, int wait_ack)
|
|
|
-{
|
|
|
- int ret = _FAIL;
|
|
|
- struct xmit_frame *pmgntframe;
|
|
|
- struct pkt_attrib *pattrib;
|
|
|
- unsigned char *pframe;
|
|
|
- struct rtw_ieee80211_hdr *pwlanhdr;
|
|
|
- __le16 *fctrl;
|
|
|
- unsigned char *mac;
|
|
|
- struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
|
|
|
- struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
|
|
|
- u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
- u8 wpsie[255] = { 0x00 }, p2pie[255] = { 0x00 };
|
|
|
- u16 wpsielen = 0, p2pielen = 0;
|
|
|
- struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
|
|
-
|
|
|
- pmgntframe = alloc_mgtxmitframe(pxmitpriv);
|
|
|
- if (pmgntframe == NULL)
|
|
|
- goto exit;
|
|
|
-
|
|
|
- /* update attribute */
|
|
|
- pattrib = &pmgntframe->attrib;
|
|
|
- update_mgntframe_attrib(padapter, pattrib);
|
|
|
-
|
|
|
-
|
|
|
- memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
|
|
|
-
|
|
|
- pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
|
|
- pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
|
|
-
|
|
|
- mac = myid(&(padapter->eeprompriv));
|
|
|
-
|
|
|
- fctrl = &(pwlanhdr->frame_ctl);
|
|
|
- *(fctrl) = 0;
|
|
|
-
|
|
|
- if (da) {
|
|
|
- memcpy(pwlanhdr->addr1, da, ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr3, da, ETH_ALEN);
|
|
|
- } else {
|
|
|
- if ((pwdinfo->p2p_info.scan_op_ch_only) || (pwdinfo->rx_invitereq_info.scan_op_ch_only)) {
|
|
|
- /* This two flags will be set when this is only the P2P client mode. */
|
|
|
- memcpy(pwlanhdr->addr1, pwdinfo->p2p_peer_interface_addr, ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr3, pwdinfo->p2p_peer_interface_addr, ETH_ALEN);
|
|
|
- } else {
|
|
|
- /* broadcast probe request frame */
|
|
|
- memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
|
|
|
- memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN);
|
|
|
- }
|
|
|
- }
|
|
|
- memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
|
|
|
-
|
|
|
- SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
|
|
|
- pmlmeext->mgnt_seq++;
|
|
|
- SetFrameSubType(pframe, WIFI_PROBEREQ);
|
|
|
-
|
|
|
- pframe += sizeof (struct rtw_ieee80211_hdr_3addr);
|
|
|
- pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);
|
|
|
-
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ))
|
|
|
- pframe = rtw_set_ie(pframe, _SSID_IE_, pwdinfo->tx_prov_disc_info.ssid.SsidLength, pwdinfo->tx_prov_disc_info.ssid.Ssid, &(pattrib->pktlen));
|
|
|
- else
|
|
|
- pframe = rtw_set_ie(pframe, _SSID_IE_, P2P_WILDCARD_SSID_LEN, pwdinfo->p2p_wildcard_ssid, &(pattrib->pktlen));
|
|
|
-
|
|
|
- /* Use the OFDM rate in the P2P probe request frame. (6(B), 9(B), 12(B), 24(B), 36, 48, 54) */
|
|
|
- pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen);
|
|
|
-
|
|
|
-
|
|
|
- /* WPS IE */
|
|
|
- /* Noted by Albert 20110221 */
|
|
|
- /* According to the WPS specification, all the WPS attribute is presented by Big Endian. */
|
|
|
-
|
|
|
- wpsielen = 0;
|
|
|
- /* WPS OUI */
|
|
|
- *(__be32 *)(wpsie) = cpu_to_be32(WPSOUI);
|
|
|
- wpsielen += 4;
|
|
|
-
|
|
|
- /* WPS version */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */
|
|
|
-
|
|
|
- if (pmlmepriv->wps_probe_req_ie == NULL) {
|
|
|
- /* UUID-E */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_UUID_E);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0010);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(wpsie + wpsielen, myid(&padapter->eeprompriv), ETH_ALEN);
|
|
|
- wpsielen += 0x10;
|
|
|
-
|
|
|
- /* Config Method */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->supported_wps_cm);
|
|
|
- wpsielen += 2;
|
|
|
- }
|
|
|
-
|
|
|
- /* Device Name */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->device_name_len);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len);
|
|
|
- wpsielen += pwdinfo->device_name_len;
|
|
|
-
|
|
|
- /* Primary Device Type */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0008);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Category ID */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_CID_RTK_WIDI);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* OUI */
|
|
|
- *(__be32 *)(wpsie + wpsielen) = cpu_to_be32(WPSOUI);
|
|
|
- wpsielen += 4;
|
|
|
-
|
|
|
- /* Sub Category ID */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_SCID_RTK_DMP);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Device Password ID */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002);
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_REGISTRAR_SPEC); /* Registrar-specified */
|
|
|
- wpsielen += 2;
|
|
|
-
|
|
|
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *)wpsie, &pattrib->pktlen);
|
|
|
-
|
|
|
- /* P2P OUI */
|
|
|
- p2pielen = 0;
|
|
|
- p2pie[p2pielen++] = 0x50;
|
|
|
- p2pie[p2pielen++] = 0x6F;
|
|
|
- p2pie[p2pielen++] = 0x9A;
|
|
|
- p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */
|
|
|
-
|
|
|
- /* Commented by Albert 20110221 */
|
|
|
- /* According to the P2P Specification, the probe request frame should contain 5 P2P attributes */
|
|
|
- /* 1. P2P Capability */
|
|
|
- /* 2. P2P Device ID if this probe request wants to find the specific P2P device */
|
|
|
- /* 3. Listen Channel */
|
|
|
- /* 4. Extended Listen Timing */
|
|
|
- /* 5. Operating Channel if this WiFi is working as the group owner now */
|
|
|
-
|
|
|
- /* P2P Capability */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Device Capability Bitmap, 1 byte */
|
|
|
- p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
|
|
|
-
|
|
|
- /* Group Capability Bitmap, 1 byte */
|
|
|
- if (pwdinfo->persistent_supported)
|
|
|
- p2pie[p2pielen++] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;
|
|
|
- else
|
|
|
- p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT;
|
|
|
-
|
|
|
- /* Listen Channel */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_LISTEN_CH;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Country String */
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
-
|
|
|
- /* The third byte should be set to 0x04. */
|
|
|
- /* Described in the "Operating Channel Attribute" section. */
|
|
|
- p2pie[p2pielen++] = 0x04;
|
|
|
-
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = 0x51; /* Copy from SD7 */
|
|
|
-
|
|
|
- /* Channel Number */
|
|
|
- p2pie[p2pielen++] = pwdinfo->listen_channel; /* listen channel */
|
|
|
-
|
|
|
-
|
|
|
- /* Extended Listen Timing */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0004);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Availability Period */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Availability Interval */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
|
|
|
- /* Operating Channel (if this WiFi is working as the group owner now) */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Country String */
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
- p2pie[p2pielen++] = 'X';
|
|
|
-
|
|
|
- /* The third byte should be set to 0x04. */
|
|
|
- /* Described in the "Operating Channel Attribute" section. */
|
|
|
- p2pie[p2pielen++] = 0x04;
|
|
|
-
|
|
|
- /* Operating Class */
|
|
|
- p2pie[p2pielen++] = 0x51; /* Copy from SD7 */
|
|
|
-
|
|
|
- /* Channel Number */
|
|
|
- p2pie[p2pielen++] = pwdinfo->operating_channel; /* operating channel number */
|
|
|
- }
|
|
|
-
|
|
|
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen);
|
|
|
-
|
|
|
- if (pmlmepriv->wps_probe_req_ie != NULL) {
|
|
|
- /* WPS IE */
|
|
|
- memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len);
|
|
|
- pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len;
|
|
|
- pframe += pmlmepriv->wps_probe_req_ie_len;
|
|
|
- }
|
|
|
-
|
|
|
- pattrib->last_txcmdsz = pattrib->pktlen;
|
|
|
-
|
|
|
- RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("issuing probe_req, tx_len=%d\n", pattrib->last_txcmdsz));
|
|
|
-
|
|
|
- if (wait_ack) {
|
|
|
- ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);
|
|
|
- } else {
|
|
|
- dump_mgntframe(padapter, pmgntframe);
|
|
|
- ret = _SUCCESS;
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
exit:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-inline void issue_probereq_p2p(struct adapter *adapter, u8 *da)
|
|
|
+unsigned int OnAction_qos(struct adapter *padapter, struct recv_frame *precv_frame)
|
|
|
{
|
|
|
- _issue_probereq_p2p(adapter, da, false);
|
|
|
+ return _SUCCESS;
|
|
|
}
|
|
|
|
|
|
-int issue_probereq_p2p_ex(struct adapter *adapter, u8 *da, int try_cnt, int wait_ms)
|
|
|
+unsigned int OnAction_dls(struct adapter *padapter, struct recv_frame *precv_frame)
|
|
|
{
|
|
|
- int ret;
|
|
|
- int i = 0;
|
|
|
- u32 start = jiffies;
|
|
|
+ return _SUCCESS;
|
|
|
+}
|
|
|
|
|
|
- do {
|
|
|
- ret = _issue_probereq_p2p(adapter, da, wait_ms > 0 ? true : false);
|
|
|
+unsigned int OnAction_back(struct adapter *padapter, struct recv_frame *precv_frame)
|
|
|
+{
|
|
|
+ u8 *addr;
|
|
|
+ struct sta_info *psta = NULL;
|
|
|
+ struct recv_reorder_ctrl *preorder_ctrl;
|
|
|
+ unsigned char *frame_body;
|
|
|
+ unsigned char category, action;
|
|
|
+ unsigned short tid, status, reason_code = 0;
|
|
|
+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
|
|
+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
|
|
+ u8 *pframe = precv_frame->rx_data;
|
|
|
+ struct sta_priv *pstapriv = &padapter->stapriv;
|
|
|
+ /* check RA matches or not */
|
|
|
+ if (memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe),
|
|
|
+ ETH_ALEN))/* for if1, sta/ap mode */
|
|
|
+ return _SUCCESS;
|
|
|
|
|
|
- i++;
|
|
|
+ DBG_88E("%s\n", __func__);
|
|
|
|
|
|
- if (adapter->bDriverStopped || adapter->bSurpriseRemoved)
|
|
|
- break;
|
|
|
+ if ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)
|
|
|
+ if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS))
|
|
|
+ return _SUCCESS;
|
|
|
|
|
|
- if (i < try_cnt && wait_ms > 0 && ret == _FAIL)
|
|
|
- msleep(wait_ms);
|
|
|
- } while ((i < try_cnt) && ((ret == _FAIL) || (wait_ms == 0)));
|
|
|
+ addr = GetAddr2Ptr(pframe);
|
|
|
+ psta = rtw_get_stainfo(pstapriv, addr);
|
|
|
|
|
|
- if (ret != _FAIL) {
|
|
|
- ret = _SUCCESS;
|
|
|
- goto exit;
|
|
|
- }
|
|
|
+ if (psta == NULL)
|
|
|
+ return _SUCCESS;
|
|
|
|
|
|
- if (try_cnt && wait_ms) {
|
|
|
- if (da)
|
|
|
- DBG_88E(FUNC_ADPT_FMT" to %pM, ch:%u%s, %d/%d in %u ms\n",
|
|
|
- FUNC_ADPT_ARG(adapter), da, rtw_get_oper_ch(adapter),
|
|
|
- ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start));
|
|
|
- else
|
|
|
- DBG_88E(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n",
|
|
|
- FUNC_ADPT_ARG(adapter), rtw_get_oper_ch(adapter),
|
|
|
- ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start));
|
|
|
+ frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
|
|
|
+
|
|
|
+ category = frame_body[0];
|
|
|
+ if (category == RTW_WLAN_CATEGORY_BACK) { /* representing Block Ack */
|
|
|
+ if (!pmlmeinfo->HT_enable)
|
|
|
+ return _SUCCESS;
|
|
|
+ action = frame_body[1];
|
|
|
+ DBG_88E("%s, action=%d\n", __func__, action);
|
|
|
+ switch (action) {
|
|
|
+ case RTW_WLAN_ACTION_ADDBA_REQ: /* ADDBA request */
|
|
|
+ memcpy(&(pmlmeinfo->ADDBA_req), &(frame_body[2]), sizeof(struct ADDBA_request));
|
|
|
+ process_addba_req(padapter, (u8 *)&(pmlmeinfo->ADDBA_req), addr);
|
|
|
+
|
|
|
+ if (pmlmeinfo->bAcceptAddbaReq)
|
|
|
+ issue_action_BA(padapter, addr, RTW_WLAN_ACTION_ADDBA_RESP, 0);
|
|
|
+ else
|
|
|
+ issue_action_BA(padapter, addr, RTW_WLAN_ACTION_ADDBA_RESP, 37);/* reject ADDBA Req */
|
|
|
+ break;
|
|
|
+ case RTW_WLAN_ACTION_ADDBA_RESP: /* ADDBA response */
|
|
|
+ status = get_unaligned_le16(&frame_body[3]);
|
|
|
+ tid = ((frame_body[5] >> 2) & 0x7);
|
|
|
+ if (status == 0) { /* successful */
|
|
|
+ DBG_88E("agg_enable for TID=%d\n", tid);
|
|
|
+ psta->htpriv.agg_enable_bitmap |= 1 << tid;
|
|
|
+ psta->htpriv.candidate_tid_bitmap &= ~BIT(tid);
|
|
|
+ } else {
|
|
|
+ psta->htpriv.agg_enable_bitmap &= ~BIT(tid);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case RTW_WLAN_ACTION_DELBA: /* DELBA */
|
|
|
+ if ((frame_body[3] & BIT(3)) == 0) {
|
|
|
+ psta->htpriv.agg_enable_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf));
|
|
|
+ psta->htpriv.candidate_tid_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf));
|
|
|
+ reason_code = get_unaligned_le16(&frame_body[4]);
|
|
|
+ } else if ((frame_body[3] & BIT(3)) == BIT(3)) {
|
|
|
+ tid = (frame_body[3] >> 4) & 0x0F;
|
|
|
+ preorder_ctrl = &psta->recvreorder_ctrl[tid];
|
|
|
+ preorder_ctrl->enable = false;
|
|
|
+ preorder_ctrl->indicate_seq = 0xffff;
|
|
|
+ }
|
|
|
+ DBG_88E("%s(): DELBA: %x(%x)\n", __func__, pmlmeinfo->agg_enable_bitmap, reason_code);
|
|
|
+ /* todo: how to notify the host while receiving DELETE BA */
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
-exit:
|
|
|
- return ret;
|
|
|
+ return _SUCCESS;
|
|
|
}
|
|
|
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
-
|
|
|
static s32 rtw_action_public_decache(struct recv_frame *recv_frame, s32 token)
|
|
|
{
|
|
|
struct adapter *adapter = recv_frame->adapter;
|
|
@@ -3893,16 +1716,6 @@ static unsigned int on_action_public_p2p(struct recv_frame *precv_frame)
|
|
|
u8 *pframe = precv_frame->rx_data;
|
|
|
u8 *frame_body;
|
|
|
u8 dialogToken = 0;
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct adapter *padapter = precv_frame->adapter;
|
|
|
- uint len = precv_frame->len;
|
|
|
- u8 *p2p_ie;
|
|
|
- u32 p2p_ielen;
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
- u8 result = P2P_STATUS_SUCCESS;
|
|
|
- u8 empty_addr[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
-
|
|
|
frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
|
|
|
|
|
|
dialogToken = frame_body[7];
|
|
@@ -3910,272 +1723,6 @@ static unsigned int on_action_public_p2p(struct recv_frame *precv_frame)
|
|
|
if (rtw_action_public_decache(precv_frame, dialogToken) == _FAIL)
|
|
|
return _FAIL;
|
|
|
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- del_timer_sync(&pwdinfo->reset_ch_sitesurvey);
|
|
|
- /* Do nothing if the driver doesn't enable the P2P function. */
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
|
|
|
- return _SUCCESS;
|
|
|
-
|
|
|
- len -= sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
-
|
|
|
- switch (frame_body[6]) { /* OUI Subtype */
|
|
|
- case P2P_GO_NEGO_REQ:
|
|
|
- DBG_88E("[%s] Got GO Nego Req Frame\n", __func__);
|
|
|
- memset(&pwdinfo->groupid_info, 0x00, sizeof(struct group_id_info));
|
|
|
-
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ))
|
|
|
- rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
|
|
|
-
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) {
|
|
|
- /* Commented by Albert 20110526 */
|
|
|
- /* In this case, this means the previous nego fail doesn't be reset yet. */
|
|
|
- del_timer_sync(&pwdinfo->restore_p2p_state_timer);
|
|
|
- /* Restore the previous p2p state */
|
|
|
- rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
|
|
|
- DBG_88E("[%s] Restore the previous p2p state to %d\n", __func__, rtw_p2p_state(pwdinfo));
|
|
|
- }
|
|
|
-
|
|
|
- /* Commented by Kurt 20110902 */
|
|
|
- /* Add if statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */
|
|
|
- if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))
|
|
|
- rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
|
|
|
-
|
|
|
- /* Commented by Kurt 20120113 */
|
|
|
- /* Get peer_dev_addr here if peer doesn't issue prov_disc frame. */
|
|
|
- if (!memcmp(pwdinfo->rx_prov_disc_info.peerDevAddr, empty_addr,
|
|
|
- ETH_ALEN))
|
|
|
- memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN);
|
|
|
-
|
|
|
- result = process_p2p_group_negotation_req(pwdinfo, frame_body, len);
|
|
|
- issue_p2p_GO_response(padapter, GetAddr2Ptr(pframe), frame_body, len, result);
|
|
|
-
|
|
|
- /* Commented by Albert 20110718 */
|
|
|
- /* No matter negotiating or negotiation failure, the driver should set up the restore P2P state timer. */
|
|
|
- _set_timer(&pwdinfo->restore_p2p_state_timer, 5000);
|
|
|
- break;
|
|
|
- case P2P_GO_NEGO_RESP:
|
|
|
- DBG_88E("[%s] Got GO Nego Resp Frame\n", __func__);
|
|
|
-
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) {
|
|
|
- /* Commented by Albert 20110425 */
|
|
|
- /* The restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function. */
|
|
|
- del_timer_sync(&pwdinfo->restore_p2p_state_timer);
|
|
|
- pwdinfo->nego_req_info.benable = false;
|
|
|
- result = process_p2p_group_negotation_resp(pwdinfo, frame_body, len);
|
|
|
- issue_p2p_GO_confirm(pwdinfo->padapter, GetAddr2Ptr(pframe), result);
|
|
|
- if (P2P_STATUS_SUCCESS == result) {
|
|
|
- if (rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT) {
|
|
|
- pwdinfo->p2p_info.operation_ch[0] = pwdinfo->peer_operating_ch;
|
|
|
- pwdinfo->p2p_info.scan_op_ch_only = 1;
|
|
|
- _set_timer(&pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH);
|
|
|
- }
|
|
|
- }
|
|
|
- /* Reset the dialog token for group negotiation frames. */
|
|
|
- pwdinfo->negotiation_dialog_token = 1;
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))
|
|
|
- _set_timer(&pwdinfo->restore_p2p_state_timer, 5000);
|
|
|
- } else {
|
|
|
- DBG_88E("[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\n", __func__);
|
|
|
- }
|
|
|
- break;
|
|
|
- case P2P_GO_NEGO_CONF:
|
|
|
- DBG_88E("[%s] Got GO Nego Confirm Frame\n", __func__);
|
|
|
- result = process_p2p_group_negotation_confirm(pwdinfo, frame_body, len);
|
|
|
- if (P2P_STATUS_SUCCESS == result) {
|
|
|
- if (rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT) {
|
|
|
- pwdinfo->p2p_info.operation_ch[0] = pwdinfo->peer_operating_ch;
|
|
|
- pwdinfo->p2p_info.scan_op_ch_only = 1;
|
|
|
- _set_timer(&pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case P2P_INVIT_REQ:
|
|
|
- /* Added by Albert 2010/10/05 */
|
|
|
- /* Received the P2P Invite Request frame. */
|
|
|
-
|
|
|
- DBG_88E("[%s] Got invite request frame!\n", __func__);
|
|
|
- p2p_ie = rtw_get_p2p_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen);
|
|
|
- if (p2p_ie) {
|
|
|
- /* Parse the necessary information from the P2P Invitation Request frame. */
|
|
|
- /* For example: The MAC address of sending this P2P Invitation Request frame. */
|
|
|
- u32 attr_contentlen = 0;
|
|
|
- u8 status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
|
|
|
- struct group_id_info group_id;
|
|
|
- u8 invitation_flag = 0;
|
|
|
-
|
|
|
- rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, &invitation_flag, &attr_contentlen);
|
|
|
- if (attr_contentlen) {
|
|
|
- rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_BSSID, pwdinfo->p2p_peer_interface_addr, &attr_contentlen);
|
|
|
- /* Commented by Albert 20120510 */
|
|
|
- /* Copy to the pwdinfo->p2p_peer_interface_addr. */
|
|
|
- /* So that the WFD UI (or Sigma) can get the peer interface address by using the following command. */
|
|
|
- /* #> iwpriv wlan0 p2p_get peer_ifa */
|
|
|
- /* After having the peer interface address, the sigma can find the correct conf file for wpa_supplicant. */
|
|
|
-
|
|
|
- if (attr_contentlen) {
|
|
|
- DBG_88E("[%s] GO's BSSID = %.2X %.2X %.2X %.2X %.2X %.2X\n", __func__,
|
|
|
- pwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1],
|
|
|
- pwdinfo->p2p_peer_interface_addr[2], pwdinfo->p2p_peer_interface_addr[3],
|
|
|
- pwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5]);
|
|
|
- }
|
|
|
-
|
|
|
- if (invitation_flag & P2P_INVITATION_FLAGS_PERSISTENT) {
|
|
|
- /* Re-invoke the persistent group. */
|
|
|
-
|
|
|
- memset(&group_id, 0x00, sizeof(struct group_id_info));
|
|
|
- rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, (u8 *)&group_id, &attr_contentlen);
|
|
|
- if (attr_contentlen) {
|
|
|
- if (!memcmp(group_id.go_device_addr, myid(&padapter->eeprompriv), ETH_ALEN)) {
|
|
|
- /* The p2p device sending this p2p invitation request wants this Wi-Fi device to be the persistent GO. */
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_GO);
|
|
|
- rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
|
|
|
- status_code = P2P_STATUS_SUCCESS;
|
|
|
- } else {
|
|
|
- /* The p2p device sending this p2p invitation request wants to be the persistent GO. */
|
|
|
- if (is_matched_in_profilelist(pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[0])) {
|
|
|
- u8 operatingch_info[5] = { 0x00 };
|
|
|
- if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen)) {
|
|
|
- if (rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, (u32)operatingch_info[4])) {
|
|
|
- /* The operating channel is acceptable for this device. */
|
|
|
- pwdinfo->rx_invitereq_info.operation_ch[0] = operatingch_info[4];
|
|
|
- pwdinfo->rx_invitereq_info.scan_op_ch_only = 1;
|
|
|
- _set_timer(&pwdinfo->reset_ch_sitesurvey, P2P_RESET_SCAN_CH);
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH);
|
|
|
- rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
|
|
|
- status_code = P2P_STATUS_SUCCESS;
|
|
|
- } else {
|
|
|
- /* The operating channel isn't supported by this device. */
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH);
|
|
|
- rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
|
|
|
- status_code = P2P_STATUS_FAIL_NO_COMMON_CH;
|
|
|
- _set_timer(&pwdinfo->restore_p2p_state_timer, 3000);
|
|
|
- }
|
|
|
- } else {
|
|
|
- /* Commented by Albert 20121130 */
|
|
|
- /* Intel will use the different P2P IE to store the operating channel information */
|
|
|
- /* Workaround for Intel WiDi 3.5 */
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH);
|
|
|
- rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
|
|
|
- status_code = P2P_STATUS_SUCCESS;
|
|
|
- }
|
|
|
- } else {
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH);
|
|
|
- status_code = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP;
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- DBG_88E("[%s] P2P Group ID Attribute NOT FOUND!\n", __func__);
|
|
|
- status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
|
|
|
- }
|
|
|
- } else {
|
|
|
- /* Received the invitation to join a P2P group. */
|
|
|
-
|
|
|
- memset(&group_id, 0x00, sizeof(struct group_id_info));
|
|
|
- rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, (u8 *)&group_id, &attr_contentlen);
|
|
|
- if (attr_contentlen) {
|
|
|
- if (!memcmp(group_id.go_device_addr, myid(&padapter->eeprompriv), ETH_ALEN)) {
|
|
|
- /* In this case, the GO can't be myself. */
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH);
|
|
|
- status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
|
|
|
- } else {
|
|
|
- /* The p2p device sending this p2p invitation request wants to join an existing P2P group */
|
|
|
- /* Commented by Albert 2012/06/28 */
|
|
|
- /* In this case, this Wi-Fi device should use the iwpriv command to get the peer device address. */
|
|
|
- /* The peer device address should be the destination address for the provisioning discovery request. */
|
|
|
- /* Then, this Wi-Fi device should use the iwpriv command to get the peer interface address. */
|
|
|
- /* The peer interface address should be the address for WPS mac address */
|
|
|
- memcpy(pwdinfo->p2p_peer_device_addr, group_id.go_device_addr , ETH_ALEN);
|
|
|
- rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_JOIN);
|
|
|
- status_code = P2P_STATUS_SUCCESS;
|
|
|
- }
|
|
|
- } else {
|
|
|
- DBG_88E("[%s] P2P Group ID Attribute NOT FOUND!\n", __func__);
|
|
|
- status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- DBG_88E("[%s] P2P Invitation Flags Attribute NOT FOUND!\n", __func__);
|
|
|
- status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
|
|
|
- }
|
|
|
-
|
|
|
- DBG_88E("[%s] status_code = %d\n", __func__, status_code);
|
|
|
-
|
|
|
- pwdinfo->inviteresp_info.token = frame_body[7];
|
|
|
- issue_p2p_invitation_response(padapter, GetAddr2Ptr(pframe), pwdinfo->inviteresp_info.token, status_code);
|
|
|
- }
|
|
|
- break;
|
|
|
- case P2P_INVIT_RESP: {
|
|
|
- u8 attr_content = 0x00;
|
|
|
- u32 attr_contentlen = 0;
|
|
|
-
|
|
|
- DBG_88E("[%s] Got invite response frame!\n", __func__);
|
|
|
- del_timer_sync(&pwdinfo->restore_p2p_state_timer);
|
|
|
- p2p_ie = rtw_get_p2p_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen);
|
|
|
- if (p2p_ie) {
|
|
|
- rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);
|
|
|
-
|
|
|
- if (attr_contentlen == 1) {
|
|
|
- DBG_88E("[%s] Status = %d\n", __func__, attr_content);
|
|
|
- pwdinfo->invitereq_info.benable = false;
|
|
|
-
|
|
|
- if (attr_content == P2P_STATUS_SUCCESS) {
|
|
|
- if (!memcmp(pwdinfo->invitereq_info.go_bssid, myid(&padapter->eeprompriv), ETH_ALEN)) {
|
|
|
- rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
|
|
|
- } else {
|
|
|
- rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
|
|
|
- }
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_OK);
|
|
|
- } else {
|
|
|
- rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL);
|
|
|
- }
|
|
|
- } else {
|
|
|
- rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL);
|
|
|
- }
|
|
|
- } else {
|
|
|
- rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL);
|
|
|
- }
|
|
|
-
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL))
|
|
|
- _set_timer(&pwdinfo->restore_p2p_state_timer, 5000);
|
|
|
- break;
|
|
|
- }
|
|
|
- case P2P_DEVDISC_REQ:
|
|
|
- process_p2p_devdisc_req(pwdinfo, pframe, len);
|
|
|
- break;
|
|
|
- case P2P_DEVDISC_RESP:
|
|
|
- process_p2p_devdisc_resp(pwdinfo, pframe, len);
|
|
|
- break;
|
|
|
- case P2P_PROVISION_DISC_REQ:
|
|
|
- DBG_88E("[%s] Got Provisioning Discovery Request Frame\n", __func__);
|
|
|
- process_p2p_provdisc_req(pwdinfo, pframe, len);
|
|
|
- memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN);
|
|
|
-
|
|
|
- /* 20110902 Kurt */
|
|
|
- /* Add the following statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */
|
|
|
- if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ))
|
|
|
- rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
|
|
|
-
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ);
|
|
|
- _set_timer(&pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT);
|
|
|
- break;
|
|
|
- case P2P_PROVISION_DISC_RESP:
|
|
|
- /* Commented by Albert 20110707 */
|
|
|
- /* Should we check the pwdinfo->tx_prov_disc_info.bsent flag here?? */
|
|
|
- DBG_88E("[%s] Got Provisioning Discovery Response Frame\n", __func__);
|
|
|
- /* Commented by Albert 20110426 */
|
|
|
- /* The restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function. */
|
|
|
- del_timer_sync(&pwdinfo->restore_p2p_state_timer);
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP);
|
|
|
- process_p2p_provdisc_resp(pwdinfo, pframe);
|
|
|
- _set_timer(&pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT);
|
|
|
- break;
|
|
|
- }
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
-
|
|
|
return _SUCCESS;
|
|
|
}
|
|
|
|
|
@@ -4250,46 +1797,6 @@ unsigned int OnAction_wmm(struct adapter *padapter, struct recv_frame *precv_fra
|
|
|
|
|
|
unsigned int OnAction_p2p(struct adapter *padapter, struct recv_frame *precv_frame)
|
|
|
{
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- u8 *frame_body;
|
|
|
- u8 category, OUI_Subtype;
|
|
|
- u8 *pframe = precv_frame->rx_data;
|
|
|
- uint len = precv_frame->len;
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-
|
|
|
-
|
|
|
- DBG_88E("%s\n", __func__);
|
|
|
-
|
|
|
- /* check RA matches or not */
|
|
|
- if (memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))/* for if1, sta/ap mode */
|
|
|
- return _SUCCESS;
|
|
|
-
|
|
|
- frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
|
|
|
-
|
|
|
- category = frame_body[0];
|
|
|
- if (category != RTW_WLAN_CATEGORY_P2P)
|
|
|
- return _SUCCESS;
|
|
|
-
|
|
|
- if (be32_to_cpu(*((__be32 *)(frame_body + 1))) != P2POUI)
|
|
|
- return _SUCCESS;
|
|
|
-
|
|
|
- len -= sizeof(struct rtw_ieee80211_hdr_3addr);
|
|
|
- OUI_Subtype = frame_body[5];
|
|
|
-
|
|
|
- switch (OUI_Subtype) {
|
|
|
- case P2P_NOTICE_OF_ABSENCE:
|
|
|
- break;
|
|
|
- case P2P_PRESENCE_REQUEST:
|
|
|
- process_p2p_presence_req(pwdinfo, pframe, len);
|
|
|
- break;
|
|
|
- case P2P_PRESENCE_RESPONSE:
|
|
|
- break;
|
|
|
- case P2P_GO_DISC_REQUEST:
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
return _SUCCESS;
|
|
|
}
|
|
|
|
|
@@ -4487,9 +1994,6 @@ void issue_beacon(struct adapter *padapter, int timeout_ms)
|
|
|
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
|
|
struct wlan_bssid_ex *cur_network = &(pmlmeinfo->network);
|
|
|
u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
|
|
|
pmgntframe = alloc_mgtxmitframe(pxmitpriv);
|
|
|
if (pmgntframe == NULL) {
|
|
@@ -4526,108 +2030,26 @@ void issue_beacon(struct adapter *padapter, int timeout_ms)
|
|
|
pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);
|
|
|
|
|
|
if ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) {
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- /* for P2P : Primary Device Type & Device Name */
|
|
|
- u32 wpsielen = 0, insert_len = 0;
|
|
|
- u8 *wpsie = NULL;
|
|
|
- wpsie = rtw_get_wps_ie(cur_network->IEs+_FIXED_IE_LENGTH_, cur_network->IELength-_FIXED_IE_LENGTH_, NULL, &wpsielen);
|
|
|
-
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && wpsie && wpsielen > 0) {
|
|
|
- uint wps_offset, remainder_ielen;
|
|
|
- u8 *premainder_ie, *pframe_wscie;
|
|
|
-
|
|
|
- wps_offset = (uint)(wpsie - cur_network->IEs);
|
|
|
- premainder_ie = wpsie + wpsielen;
|
|
|
- remainder_ielen = cur_network->IELength - wps_offset - wpsielen;
|
|
|
- pframe_wscie = pframe + wps_offset;
|
|
|
- memcpy(pframe, cur_network->IEs, wps_offset+wpsielen);
|
|
|
- pframe += (wps_offset + wpsielen);
|
|
|
- pattrib->pktlen += (wps_offset + wpsielen);
|
|
|
-
|
|
|
- /* now pframe is end of wsc ie, insert Primary Device Type & Device Name */
|
|
|
- /* Primary Device Type */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(pframe + insert_len) = cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE);
|
|
|
- insert_len += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(pframe + insert_len) = cpu_to_be16(0x0008);
|
|
|
- insert_len += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Category ID */
|
|
|
- *(__be16 *)(pframe + insert_len) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
|
|
|
- insert_len += 2;
|
|
|
-
|
|
|
- /* OUI */
|
|
|
- *(__be32 *)(pframe + insert_len) = cpu_to_be32(WPSOUI);
|
|
|
- insert_len += 4;
|
|
|
-
|
|
|
- /* Sub Category ID */
|
|
|
- *(__be16 *)(pframe + insert_len) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
|
|
|
- insert_len += 2;
|
|
|
-
|
|
|
- /* Device Name */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(pframe + insert_len) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
|
|
|
- insert_len += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(pframe + insert_len) = cpu_to_be16(pwdinfo->device_name_len);
|
|
|
- insert_len += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len);
|
|
|
- insert_len += pwdinfo->device_name_len;
|
|
|
-
|
|
|
- /* update wsc ie length */
|
|
|
- *(pframe_wscie+1) = (wpsielen-2) + insert_len;
|
|
|
-
|
|
|
- /* pframe move to end */
|
|
|
- pframe += insert_len;
|
|
|
- pattrib->pktlen += insert_len;
|
|
|
-
|
|
|
- /* copy remainder_ie to pframe */
|
|
|
- memcpy(pframe, premainder_ie, remainder_ielen);
|
|
|
- pframe += remainder_ielen;
|
|
|
- pattrib->pktlen += remainder_ielen;
|
|
|
- } else
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
- {
|
|
|
- int len_diff;
|
|
|
- memcpy(pframe, cur_network->IEs, cur_network->IELength);
|
|
|
- len_diff = update_hidden_ssid(
|
|
|
- pframe+_BEACON_IE_OFFSET_
|
|
|
- , cur_network->IELength-_BEACON_IE_OFFSET_
|
|
|
- , pmlmeinfo->hidden_ssid_mode
|
|
|
+ int len_diff;
|
|
|
+ u8 *wps_ie;
|
|
|
+ uint wps_ielen;
|
|
|
+ u8 sr = 0;
|
|
|
+ memcpy(pframe, cur_network->IEs, cur_network->IELength);
|
|
|
+ len_diff = update_hidden_ssid(
|
|
|
+ pframe+_BEACON_IE_OFFSET_
|
|
|
+ , cur_network->IELength-_BEACON_IE_OFFSET_
|
|
|
+ , pmlmeinfo->hidden_ssid_mode
|
|
|
);
|
|
|
- pframe += (cur_network->IELength+len_diff);
|
|
|
- pattrib->pktlen += (cur_network->IELength+len_diff);
|
|
|
- }
|
|
|
-
|
|
|
- {
|
|
|
- u8 *wps_ie;
|
|
|
- uint wps_ielen;
|
|
|
- u8 sr = 0;
|
|
|
- wps_ie = rtw_get_wps_ie(pmgntframe->buf_addr+TXDESC_OFFSET+sizeof (struct rtw_ieee80211_hdr_3addr)+_BEACON_IE_OFFSET_,
|
|
|
- pattrib->pktlen-sizeof (struct rtw_ieee80211_hdr_3addr)-_BEACON_IE_OFFSET_, NULL, &wps_ielen);
|
|
|
- if (wps_ie && wps_ielen > 0)
|
|
|
- rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8 *)(&sr), NULL);
|
|
|
- if (sr != 0)
|
|
|
- set_fwstate(pmlmepriv, WIFI_UNDER_WPS);
|
|
|
- else
|
|
|
- _clr_fwstate_(pmlmepriv, WIFI_UNDER_WPS);
|
|
|
- }
|
|
|
-
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
|
|
|
- u32 len;
|
|
|
- len = build_beacon_p2p_ie(pwdinfo, pframe);
|
|
|
-
|
|
|
- pframe += len;
|
|
|
- pattrib->pktlen += len;
|
|
|
- }
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
+ pframe += (cur_network->IELength+len_diff);
|
|
|
+ pattrib->pktlen += (cur_network->IELength+len_diff);
|
|
|
+ wps_ie = rtw_get_wps_ie(pmgntframe->buf_addr+TXDESC_OFFSET+sizeof (struct rtw_ieee80211_hdr_3addr)+_BEACON_IE_OFFSET_,
|
|
|
+ pattrib->pktlen-sizeof (struct rtw_ieee80211_hdr_3addr)-_BEACON_IE_OFFSET_, NULL, &wps_ielen);
|
|
|
+ if (wps_ie && wps_ielen > 0)
|
|
|
+ rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8 *)(&sr), NULL);
|
|
|
+ if (sr != 0)
|
|
|
+ set_fwstate(pmlmepriv, WIFI_UNDER_WPS);
|
|
|
+ else
|
|
|
+ _clr_fwstate_(pmlmepriv, WIFI_UNDER_WPS);
|
|
|
|
|
|
goto _issue_bcn;
|
|
|
}
|
|
@@ -4717,9 +2139,6 @@ void issue_probersp(struct adapter *padapter, unsigned char *da, u8 is_valid_p2p
|
|
|
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
|
|
struct wlan_bssid_ex *cur_network = &(pmlmeinfo->network);
|
|
|
unsigned int rate_len;
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
|
|
|
pmgntframe = alloc_mgtxmitframe(pxmitpriv);
|
|
|
if (pmgntframe == NULL) {
|
|
@@ -4844,16 +2263,6 @@ void issue_probersp(struct adapter *padapter, unsigned char *da, u8 is_valid_p2p
|
|
|
/* todo:HT for adhoc */
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && is_valid_p2p_probereq) {
|
|
|
- u32 len;
|
|
|
- len = build_probe_resp_p2p_ie(pwdinfo, pframe);
|
|
|
-
|
|
|
- pframe += len;
|
|
|
- pattrib->pktlen += len;
|
|
|
- }
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
-
|
|
|
pattrib->last_txcmdsz = pattrib->pktlen;
|
|
|
|
|
|
dump_mgntframe(padapter, pmgntframe);
|
|
@@ -5153,9 +2562,6 @@ void issue_asocrsp(struct adapter *padapter, unsigned short status, struct sta_i
|
|
|
struct wlan_bssid_ex *pnetwork = &(pmlmeinfo->network);
|
|
|
u8 *ie = pnetwork->IEs;
|
|
|
__le16 lestatus, leval;
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
|
|
|
DBG_88E("%s\n", __func__);
|
|
|
|
|
@@ -5260,16 +2666,6 @@ void issue_asocrsp(struct adapter *padapter, unsigned short status, struct sta_i
|
|
|
pattrib->pktlen += pmlmepriv->wps_assoc_resp_ie_len;
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && (pstat->is_p2p_device)) {
|
|
|
- u32 len;
|
|
|
-
|
|
|
- len = build_assoc_resp_p2p_ie(pwdinfo, pframe, pstat->p2p_status_code);
|
|
|
-
|
|
|
- pframe += len;
|
|
|
- pattrib->pktlen += len;
|
|
|
- }
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
pattrib->last_txcmdsz = pattrib->pktlen;
|
|
|
dump_mgntframe(padapter, pmgntframe);
|
|
|
#endif
|
|
@@ -5293,11 +2689,6 @@ void issue_assocreq(struct adapter *padapter)
|
|
|
struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
|
|
|
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
|
|
int bssrate_len = 0, sta_bssrate_len = 0;
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
- u8 p2pie[255] = { 0x00 };
|
|
|
- u16 p2pielen = 0;
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
|
|
|
pmgntframe = alloc_mgtxmitframe(pxmitpriv);
|
|
|
if (pmgntframe == NULL)
|
|
@@ -5464,137 +2855,6 @@ void issue_assocreq(struct adapter *padapter)
|
|
|
if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK)
|
|
|
pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen));
|
|
|
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
-
|
|
|
- if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) {
|
|
|
- /* Should add the P2P IE in the association request frame. */
|
|
|
- /* P2P OUI */
|
|
|
-
|
|
|
- p2pielen = 0;
|
|
|
- p2pie[p2pielen++] = 0x50;
|
|
|
- p2pie[p2pielen++] = 0x6F;
|
|
|
- p2pie[p2pielen++] = 0x9A;
|
|
|
- p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */
|
|
|
-
|
|
|
- /* Commented by Albert 20101109 */
|
|
|
- /* According to the P2P Specification, the association request frame should contain 3 P2P attributes */
|
|
|
- /* 1. P2P Capability */
|
|
|
- /* 2. Extended Listen Timing */
|
|
|
- /* 3. Device Info */
|
|
|
- /* Commented by Albert 20110516 */
|
|
|
- /* 4. P2P Interface */
|
|
|
-
|
|
|
- /* P2P Capability */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Device Capability Bitmap, 1 byte */
|
|
|
- p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
|
|
|
-
|
|
|
- /* Group Capability Bitmap, 1 byte */
|
|
|
- if (pwdinfo->persistent_supported)
|
|
|
- p2pie[p2pielen++] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;
|
|
|
- else
|
|
|
- p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT;
|
|
|
-
|
|
|
- /* Extended Listen Timing */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0004);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* Availability Period */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Availability Interval */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Device Info */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- /* 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */
|
|
|
- /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- /* P2P Device Address */
|
|
|
- memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
-
|
|
|
- /* Config Method */
|
|
|
- /* This field should be big endian. Noted by P2P specification. */
|
|
|
- if ((pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN) ||
|
|
|
- (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN))
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY);
|
|
|
- else
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_PBC);
|
|
|
-
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Primary Device Type */
|
|
|
- /* Category ID */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* OUI */
|
|
|
- *(__be32 *)(p2pie + p2pielen) = cpu_to_be32(WPSOUI);
|
|
|
- p2pielen += 4;
|
|
|
-
|
|
|
- /* Sub Category ID */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Number of Secondary Device Types */
|
|
|
- p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */
|
|
|
-
|
|
|
- /* Device Name */
|
|
|
- /* Type: */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len);
|
|
|
- p2pielen += pwdinfo->device_name_len;
|
|
|
-
|
|
|
- /* P2P Interface */
|
|
|
- /* Type: */
|
|
|
- p2pie[p2pielen++] = P2P_ATTR_INTERFACE;
|
|
|
-
|
|
|
- /* Length: */
|
|
|
- *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x000D);
|
|
|
- p2pielen += 2;
|
|
|
-
|
|
|
- /* Value: */
|
|
|
- memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN); /* P2P Device Address */
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
-
|
|
|
- p2pie[p2pielen++] = 1; /* P2P Interface Address Count */
|
|
|
-
|
|
|
- memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN); /* P2P Interface Address List */
|
|
|
- p2pielen += ETH_ALEN;
|
|
|
-
|
|
|
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen);
|
|
|
- }
|
|
|
-
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
-
|
|
|
pattrib->last_txcmdsz = pattrib->pktlen;
|
|
|
dump_mgntframe(padapter, pmgntframe);
|
|
|
|
|
@@ -5859,16 +3119,6 @@ static int _issue_deauth(struct adapter *padapter, unsigned char *da, unsigned s
|
|
|
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
|
|
int ret = _FAIL;
|
|
|
__le16 le_tmp;
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
-
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- if (!(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) && (pwdinfo->rx_invitereq_info.scan_op_ch_only)) {
|
|
|
- del_timer_sync(&pwdinfo->reset_ch_sitesurvey);
|
|
|
- _set_timer(&pwdinfo->reset_ch_sitesurvey, 10);
|
|
|
- }
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
|
|
|
pmgntframe = alloc_mgtxmitframe(pxmitpriv);
|
|
|
if (pmgntframe == NULL)
|
|
@@ -6375,38 +3625,15 @@ void site_survey(struct adapter *padapter)
|
|
|
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
|
|
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
|
|
u32 initialgain = 0;
|
|
|
+ struct rtw_ieee80211_channel *ch;
|
|
|
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-
|
|
|
- if ((pwdinfo->rx_invitereq_info.scan_op_ch_only) || (pwdinfo->p2p_info.scan_op_ch_only)) {
|
|
|
- if (pwdinfo->rx_invitereq_info.scan_op_ch_only) {
|
|
|
- survey_channel = pwdinfo->rx_invitereq_info.operation_ch[pmlmeext->sitesurvey_res.channel_idx];
|
|
|
- } else {
|
|
|
- survey_channel = pwdinfo->p2p_info.operation_ch[pmlmeext->sitesurvey_res.channel_idx];
|
|
|
- }
|
|
|
- ScanType = SCAN_ACTIVE;
|
|
|
- } else if (rtw_p2p_findphase_ex_is_social(pwdinfo)) {
|
|
|
- /* Commented by Albert 2011/06/03 */
|
|
|
- /* The driver is in the find phase, it should go through the social channel. */
|
|
|
- int ch_set_idx;
|
|
|
- survey_channel = pwdinfo->social_chan[pmlmeext->sitesurvey_res.channel_idx];
|
|
|
- ch_set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, survey_channel);
|
|
|
- if (ch_set_idx >= 0)
|
|
|
- ScanType = pmlmeext->channel_set[ch_set_idx].ScanType;
|
|
|
- else
|
|
|
- ScanType = SCAN_ACTIVE;
|
|
|
- } else
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
- {
|
|
|
- struct rtw_ieee80211_channel *ch;
|
|
|
- if (pmlmeext->sitesurvey_res.channel_idx < pmlmeext->sitesurvey_res.ch_num) {
|
|
|
- ch = &pmlmeext->sitesurvey_res.ch[pmlmeext->sitesurvey_res.channel_idx];
|
|
|
- survey_channel = ch->hw_value;
|
|
|
- ScanType = (ch->flags & RTW_IEEE80211_CHAN_PASSIVE_SCAN) ? SCAN_PASSIVE : SCAN_ACTIVE;
|
|
|
- }
|
|
|
+ if (pmlmeext->sitesurvey_res.channel_idx < pmlmeext->sitesurvey_res.ch_num) {
|
|
|
+ ch = &pmlmeext->sitesurvey_res.ch[pmlmeext->sitesurvey_res.channel_idx];
|
|
|
+ survey_channel = ch->hw_value;
|
|
|
+ ScanType = (ch->flags & RTW_IEEE80211_CHAN_PASSIVE_SCAN) ? SCAN_PASSIVE : SCAN_ACTIVE;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
if (survey_channel != 0) {
|
|
|
/* PAUSE 4-AC Queue when site_survey */
|
|
|
/* rtw_hal_get_hwreg(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); */
|
|
@@ -6418,118 +3645,78 @@ void site_survey(struct adapter *padapter)
|
|
|
SelectChannel(padapter, survey_channel);
|
|
|
|
|
|
if (ScanType == SCAN_ACTIVE) { /* obey the channel plan setting... */
|
|
|
- #ifdef CONFIG_88EU_P2P
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) ||
|
|
|
- rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH)) {
|
|
|
- issue_probereq_p2p(padapter, NULL);
|
|
|
- issue_probereq_p2p(padapter, NULL);
|
|
|
- issue_probereq_p2p(padapter, NULL);
|
|
|
- } else
|
|
|
- #endif /* CONFIG_88EU_P2P */
|
|
|
- {
|
|
|
- int i;
|
|
|
- for (i = 0; i < RTW_SSID_SCAN_AMOUNT; i++) {
|
|
|
- if (pmlmeext->sitesurvey_res.ssid[i].SsidLength) {
|
|
|
- /* todo: to issue two probe req??? */
|
|
|
- issue_probereq(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL);
|
|
|
- /* msleep(SURVEY_TO>>1); */
|
|
|
- issue_probereq(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) {
|
|
|
+ int i;
|
|
|
+ for (i = 0; i < RTW_SSID_SCAN_AMOUNT; i++) {
|
|
|
+ if (pmlmeext->sitesurvey_res.ssid[i].SsidLength) {
|
|
|
/* todo: to issue two probe req??? */
|
|
|
- issue_probereq(padapter, NULL, NULL);
|
|
|
+ issue_probereq(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL);
|
|
|
/* msleep(SURVEY_TO>>1); */
|
|
|
- issue_probereq(padapter, NULL, NULL);
|
|
|
+ issue_probereq(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ if (pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) {
|
|
|
+ /* todo: to issue two probe req??? */
|
|
|
+ issue_probereq(padapter, NULL, NULL);
|
|
|
+ /* msleep(SURVEY_TO>>1); */
|
|
|
+ issue_probereq(padapter, NULL, NULL);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) {
|
|
|
+ /* todo: to issue two probe req??? */
|
|
|
+ issue_probereq(padapter, NULL, NULL);
|
|
|
+ /* msleep(SURVEY_TO>>1); */
|
|
|
+ issue_probereq(padapter, NULL, NULL);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
|
|
|
} else {
|
|
|
- /* channel number is 0 or this channel is not valid. */
|
|
|
-
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH)) {
|
|
|
- if ((pwdinfo->rx_invitereq_info.scan_op_ch_only) || (pwdinfo->p2p_info.scan_op_ch_only)) {
|
|
|
- /* Set the find_phase_state_exchange_cnt to P2P_FINDPHASE_EX_CNT. */
|
|
|
- /* This will let the following flow to run the scanning end. */
|
|
|
- rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_MAX);
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- if (rtw_p2p_findphase_ex_is_needed(pwdinfo)) {
|
|
|
- /* Set the P2P State to the listen state of find phase and set the current channel to the listen channel */
|
|
|
- set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
|
|
|
- rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_LISTEN);
|
|
|
- pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
|
|
|
-
|
|
|
- initialgain = 0xff; /* restore RX GAIN */
|
|
|
- rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
|
|
|
- /* turn on dynamic functions */
|
|
|
- Restore_DM_Func_Flag(padapter);
|
|
|
- /* Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, true); */
|
|
|
-
|
|
|
- _set_timer(&pwdinfo->find_phase_timer, (u32)((u32)(pwdinfo->listen_dwell) * 100));
|
|
|
- } else
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
- {
|
|
|
- /* 20100721:Interrupt scan operation here. */
|
|
|
- /* For SW antenna diversity before link, it needs to switch to another antenna and scan again. */
|
|
|
- /* It compares the scan result and select better one to do connection. */
|
|
|
- if (rtw_hal_antdiv_before_linked(padapter)) {
|
|
|
- pmlmeext->sitesurvey_res.bss_cnt = 0;
|
|
|
- pmlmeext->sitesurvey_res.channel_idx = -1;
|
|
|
- pmlmeext->chan_scan_time = SURVEY_TO / 2;
|
|
|
- set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
|
|
|
- return;
|
|
|
- }
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH))
|
|
|
- rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
|
|
|
- rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
+ /* 20100721:Interrupt scan operation here. */
|
|
|
+ /* For SW antenna diversity before link, it needs to switch to another antenna and scan again. */
|
|
|
+ /* It compares the scan result and select better one to do connection. */
|
|
|
+ if (rtw_hal_antdiv_before_linked(padapter)) {
|
|
|
+ pmlmeext->sitesurvey_res.bss_cnt = 0;
|
|
|
+ pmlmeext->sitesurvey_res.channel_idx = -1;
|
|
|
+ pmlmeext->chan_scan_time = SURVEY_TO / 2;
|
|
|
+ set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- pmlmeext->sitesurvey_res.state = SCAN_COMPLETE;
|
|
|
+ pmlmeext->sitesurvey_res.state = SCAN_COMPLETE;
|
|
|
|
|
|
- /* switch back to the original channel */
|
|
|
+ /* switch back to the original channel */
|
|
|
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN))
|
|
|
- set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
|
|
|
- else
|
|
|
- set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
+ set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
|
|
|
|
|
|
- /* flush 4-AC Queue after site_survey */
|
|
|
- /* val8 = 0; */
|
|
|
- /* rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); */
|
|
|
+ /* flush 4-AC Queue after site_survey */
|
|
|
+ /* val8 = 0; */
|
|
|
+ /* rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); */
|
|
|
|
|
|
- /* config MSR */
|
|
|
- Set_MSR(padapter, (pmlmeinfo->state & 0x3));
|
|
|
+ /* config MSR */
|
|
|
+ Set_MSR(padapter, (pmlmeinfo->state & 0x3));
|
|
|
|
|
|
- initialgain = 0xff; /* restore RX GAIN */
|
|
|
- rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
|
|
|
- /* turn on dynamic functions */
|
|
|
- Restore_DM_Func_Flag(padapter);
|
|
|
- /* Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, true); */
|
|
|
+ initialgain = 0xff; /* restore RX GAIN */
|
|
|
+ rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
|
|
|
+ /* turn on dynamic functions */
|
|
|
+ Restore_DM_Func_Flag(padapter);
|
|
|
+ /* Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, true); */
|
|
|
|
|
|
- if (is_client_associated_to_ap(padapter))
|
|
|
- issue_nulldata(padapter, NULL, 0, 3, 500);
|
|
|
+ if (is_client_associated_to_ap(padapter))
|
|
|
+ issue_nulldata(padapter, NULL, 0, 3, 500);
|
|
|
|
|
|
- val8 = 0; /* survey done */
|
|
|
- rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
|
|
|
+ val8 = 0; /* survey done */
|
|
|
+ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
|
|
|
|
|
|
- report_surveydone_event(padapter);
|
|
|
+ report_surveydone_event(padapter);
|
|
|
|
|
|
- pmlmeext->chan_scan_time = SURVEY_TO;
|
|
|
- pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
|
|
|
+ pmlmeext->chan_scan_time = SURVEY_TO;
|
|
|
+ pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
|
|
|
|
|
|
- issue_action_BSSCoexistPacket(padapter);
|
|
|
- issue_action_BSSCoexistPacket(padapter);
|
|
|
- issue_action_BSSCoexistPacket(padapter);
|
|
|
- }
|
|
|
+ issue_action_BSSCoexistPacket(padapter);
|
|
|
+ issue_action_BSSCoexistPacket(padapter);
|
|
|
+ issue_action_BSSCoexistPacket(padapter);
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
@@ -7555,9 +4742,6 @@ void linked_status_chk(struct adapter *padapter)
|
|
|
psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress);
|
|
|
if (psta != NULL) {
|
|
|
bool is_p2p_enable = false;
|
|
|
- #ifdef CONFIG_88EU_P2P
|
|
|
- is_p2p_enable = !rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE);
|
|
|
- #endif
|
|
|
|
|
|
if (!chk_ap_is_alive(padapter, psta))
|
|
|
rx_chk = _FAIL;
|
|
@@ -7655,9 +4839,6 @@ void survey_timer_hdl(struct adapter *padapter)
|
|
|
struct sitesurvey_parm *psurveyPara;
|
|
|
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
|
|
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
|
|
-#endif
|
|
|
|
|
|
/* issue rtw_sitesurvey_cmd */
|
|
|
if (pmlmeext->sitesurvey_res.state > SCAN_START) {
|
|
@@ -7665,22 +4846,9 @@ void survey_timer_hdl(struct adapter *padapter)
|
|
|
pmlmeext->sitesurvey_res.channel_idx++;
|
|
|
|
|
|
if (pmlmeext->scan_abort) {
|
|
|
- #ifdef CONFIG_88EU_P2P
|
|
|
- if (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE)) {
|
|
|
- rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_MAX);
|
|
|
- pmlmeext->sitesurvey_res.channel_idx = 3;
|
|
|
- DBG_88E("%s idx:%d, cnt:%u\n", __func__
|
|
|
- , pmlmeext->sitesurvey_res.channel_idx
|
|
|
- , pwdinfo->find_phase_state_exchange_cnt
|
|
|
- );
|
|
|
- } else
|
|
|
- #endif
|
|
|
- {
|
|
|
- pmlmeext->sitesurvey_res.channel_idx = pmlmeext->sitesurvey_res.ch_num;
|
|
|
- DBG_88E("%s idx:%d\n", __func__
|
|
|
- , pmlmeext->sitesurvey_res.channel_idx
|
|
|
- );
|
|
|
- }
|
|
|
+ pmlmeext->sitesurvey_res.channel_idx = pmlmeext->sitesurvey_res.ch_num;
|
|
|
+ DBG_88E("%s idx:%d\n", __func__
|
|
|
+ , pmlmeext->sitesurvey_res.channel_idx);
|
|
|
|
|
|
pmlmeext->scan_abort = false;/* reset */
|
|
|
}
|
|
@@ -8056,10 +5224,6 @@ u8 sitesurvey_cmd_hdl(struct adapter *padapter, u8 *pbuf)
|
|
|
u32 initialgain;
|
|
|
u32 i;
|
|
|
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- struct wifidirect_info *pwdinfo = &padapter->wdinfo;
|
|
|
-#endif
|
|
|
-
|
|
|
if (pmlmeext->sitesurvey_res.state == SCAN_DISABLE) {
|
|
|
/* for first time sitesurvey_cmd */
|
|
|
rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, NULL);
|
|
@@ -8105,14 +5269,7 @@ u8 sitesurvey_cmd_hdl(struct adapter *padapter, u8 *pbuf)
|
|
|
Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, false);
|
|
|
|
|
|
/* config the initial gain under scanning, need to write the BB registers */
|
|
|
-#ifdef CONFIG_88EU_P2P
|
|
|
- if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
|
|
|
- initialgain = 0x1E;
|
|
|
- else
|
|
|
- initialgain = 0x28;
|
|
|
-#else /* CONFIG_88EU_P2P */
|
|
|
initialgain = 0x1E;
|
|
|
-#endif /* CONFIG_88EU_P2P */
|
|
|
|
|
|
rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
|
|
|
|