INT Set_P2P_ProvisionByAddr_Proc( IN PRTMP_ADAPTER pAd, IN PSTRING arg) { POS_COOKIE pObj; UCHAR p2pindex = 0; UCHAR ConnAddr[6] = {0}; pObj = (POS_COOKIE) pAd->OS_Cookie; if (pObj->ioctl_if_type != INT_P2P) return 0; if (rtstrmactohex(arg, (PSTRING) &ConnAddr[0]) == FALSE) return FALSE; DBGPRINT(RT_DEBUG_TRACE, ("%s:: DevMac = %02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, PRINT_MAC(ConnAddr))); p2pindex = P2pGroupTabSearch(pAd, ConnAddr); if (p2pindex < pAd->P2pTable.ClientNumber) { P2pConnectPrepare(pAd, ConnAddr, P2PSTATE_PROVISION_COMMAND); } else DBGPRINT(RT_DEBUG_ERROR, ("Table Idx out of range!\n")); return TRUE; }
UCHAR P2pGroupTabDelete( IN PRTMP_ADAPTER pAd, IN UCHAR p2pindex, IN PUCHAR Addr) { UCHAR index = 0xff; PRT_P2P_CLIENT_ENTRY pP2pEntry; if ((p2pindex >= MAX_P2P_GROUP_SIZE) && (Addr != NULL)) index = P2pGroupTabSearch(pAd, Addr); else index = p2pindex; DBGPRINT(RT_DEBUG_TRACE,("P2pGroupTabDelete . index = %d. \n", index)); if (index < MAX_P2P_GROUP_SIZE) { pP2pEntry = &pAd->P2pTable.Client[index]; /* Before connected, there is WPS provisioning process. */ /* So maybe receive disassoc frame. but we can't delete p2p client entry . */ /* So need to check P2pClientState is connected, then we can delete the entry. */ DBGPRINT(RT_DEBUG_ERROR, ("P2pGroupTabDelete index %d. search addr[3~5] is %x %x %x\n", index, Addr[3],Addr[4],Addr[5])); RTMPZeroMemory(pP2pEntry->addr, MAC_ADDR_LEN); RTMPZeroMemory(pP2pEntry->bssid, MAC_ADDR_LEN); RTMPZeroMemory(pP2pEntry->InterfaceAddr, MAC_ADDR_LEN); /* Assign a strange address first. */ pP2pEntry->addr[3] = 0x55; pP2pEntry->bssid[3] = 0x55; pP2pEntry->InterfaceAddr[3] = 0x55; RTMPZeroMemory(pP2pEntry->PrimaryDevType, P2P_DEVICE_TYPE_LEN); RTMPZeroMemory(pP2pEntry->SecondaryDevType, P2P_DEVICE_TYPE_LEN); RTMPZeroMemory(pP2pEntry->DeviceName, P2P_DEVICE_NAME_LEN); pP2pEntry->NumSecondaryType = 0; pP2pEntry->DeviceNameLen = 0; pP2pEntry->ConfigMethod = 0; pP2pEntry->OpChannel = 0; pP2pEntry->ListenChannel = 0; pP2pEntry->Dpid = DEV_PASS_ID_NOSPEC; pP2pEntry->MyGOIndex = 0xff; pP2pEntry->Peerip = 0; pP2pEntry->ConfigTimeOut = 0; pP2pEntry->Rule = P2P_IS_CLIENT; RTMPZeroMemory(pP2pEntry->Ssid, MAX_LEN_OF_SSID); pP2pEntry->SsidLen = 0; pP2pEntry->GoIntent = 0; if ((pAd->P2pTable.ClientNumber > 0) && (pP2pEntry->P2pClientState != P2PSTATE_NONE)) pAd->P2pTable.ClientNumber--; pP2pEntry->P2pClientState = P2PSTATE_NONE; } return index; }
static VOID P2pSendProvisionCmd( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg; P2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState); PP2P_CMD_STRUCT pP2pCmd = (PP2P_CMD_STRUCT)Elem->Msg; UCHAR p2pIdx; ULONG FrameLen; USHORT PeerWscMethod; UCHAR Addr[6] = {0}; DBGPRINT(RT_DEBUG_ERROR, ("%s::\n", __FUNCTION__)); DBGPRINT(RT_DEBUG_ERROR, ("Addr = %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pP2pCmd->Addr))); p2pIdx = P2pGroupTabSearch(pAd, pP2pCmd->Addr); P2PPrintP2PEntry(pAd, p2pIdx); if (pAd->P2pTable.Client[p2pIdx].Rule == P2P_IS_GO) RTMPMoveMemory(&Addr, pAd->P2pTable.Client[p2pIdx].bssid, sizeof(Addr)); else RTMPMoveMemory(&Addr, pAd->P2pTable.Client[p2pIdx].addr, sizeof(Addr)); if (pAd->P2pCfg.Dpid != DEV_PASS_ID_NOSPEC) { if ((pAd->P2pCfg.Dpid == DEV_PASS_ID_USER) && ((pAd->P2pTable.Client[p2pIdx].ConfigMethod & WSC_CONFMET_DISPLAY) != 0)) { pAd->P2pTable.Client[p2pIdx].P2pClientState = P2PSTATE_SENT_PROVISION_REQ; P2PSendProvisionReq(pAd, WSC_CONFMET_DISPLAY, pAd->P2pTable.Client[p2pIdx].GeneralToken, Addr/*pAd->P2pTable.Client[p2pIdx].addr*/, &FrameLen); DBGPRINT(RT_DEBUG_ERROR, ("Request : CONFIG_METHOD_DISPLAY \n")); } else if ((pAd->P2pCfg.Dpid == DEV_PASS_ID_PBC) && ((pAd->P2pTable.Client[p2pIdx].ConfigMethod & WSC_CONFMET_PBC) != 0)) { pAd->P2pTable.Client[p2pIdx].P2pClientState = P2PSTATE_SENT_PROVISION_REQ; P2PSendProvisionReq(pAd, WSC_CONFMET_PBC, pAd->P2pTable.Client[p2pIdx].GeneralToken, Addr/*pAd->P2pTable.Client[p2pIdx].addr*/, &FrameLen); DBGPRINT(RT_DEBUG_TRACE, ("Request : CONFIG_METHOD_PUSHBUTTON \n")); } else if ((pAd->P2pCfg.Dpid == DEV_PASS_ID_REG) && ((pAd->P2pTable.Client[p2pIdx].ConfigMethod&WSC_CONFMET_KEYPAD) != 0)) { pAd->P2pTable.Client[p2pIdx].P2pClientState = P2PSTATE_SENT_PROVISION_REQ; P2PSendProvisionReq(pAd, WSC_CONFMET_KEYPAD, pAd->P2pTable.Client[p2pIdx].GeneralToken, Addr/*pAd->P2pTable.Client[p2pIdx].addr*/, &FrameLen); DBGPRINT(RT_DEBUG_ERROR, ("Request : CONFIG_METHOD_KEYPAD \n")); } else P2PSendProvisionReq(pAd, pAd->P2pTable.Client[p2pIdx].ConfigMethod, pAd->P2pTable.Client[p2pIdx].GeneralToken, Addr/*pAd->P2pTable.Client[p2pIdx].addr*/, &FrameLen); } else { P2P_SetWscRule(pAd, pP2pCmd->Idx, &PeerWscMethod); pAd->P2pTable.Client[p2pIdx].P2pClientState = P2PSTATE_SENT_PROVISION_REQ; P2PSendProvisionReq(pAd, PeerWscMethod, pAd->P2pTable.Client[p2pIdx].GeneralToken, pAd->P2pTable.Client[p2pIdx].addr, &FrameLen); DBGPRINT(RT_DEBUG_ERROR, ("Request : CONFIG_METHOD_KEYPAD \n")); } *pCurrState = P2P_WAIT_GO_FORM_PROV_RSP; }
static VOID P2pSendDevDiscCmd( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { P2P_GO_FORM_STATE *pCurrState = &(pAd->P2pCfg.GoFormCurrentState); PP2P_CMD_STRUCT pP2pCmd = (PP2P_CMD_STRUCT)Elem->Msg; UCHAR p2pIdx; DBGPRINT(RT_DEBUG_ERROR, ("%s::\n", __FUNCTION__)); DBGPRINT(RT_DEBUG_ERROR, ("Addr = %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pP2pCmd->Addr))); p2pIdx = P2pGroupTabSearch(pAd, pP2pCmd->Addr); P2PPrintP2PEntry(pAd, p2pIdx); P2pClientDiscovery(pAd, pAd->P2pTable.Client[p2pIdx].addr, p2pIdx); *pCurrState = P2P_WAIT_GO_FORM_DEV_DISC_RSP; }
/* ========================================================================== Description: left part of IEEE 802.11/1999 p.374 Parameters: Elem - MLME message containing the received frame ========================================================================== */ static VOID ApCliPeerDisassocAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Addr2[MAC_ADDR_LEN]; USHORT Reason; USHORT ifIndex = (USHORT)(Elem->Priv); if ((ifIndex >= MAX_APCLI_NUM) ) return; PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; if(PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) { if (MAC_ADDR_EQUAL(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Bssid, Addr2)) { #ifdef DPA_S #ifdef P2P_SUPPORT UCHAR p2pIndex = P2P_NOT_FOUND; #endif /* P2P_SUPPORT */ #endif /* DPA_S */ *pCurrState = APCLI_ASSOC_IDLE; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PEER_DISCONNECT_REQ, 0, NULL, ifIndex); #ifdef DPA_S #ifdef P2P_SUPPORT p2pIndex = P2pGroupTabSearch(pAd, Addr2); if (p2pIndex != P2P_NOT_FOUND) { PRT_P2P_CLIENT_ENTRY pP2pEntry = &pAd->P2pTable.Client[p2pIndex]; P2pSendSamsungEvent(pAd, P2P_NOTIF_SOFTAP_STA_DISASSOC, Addr2, pP2pEntry->DeviceName, pP2pEntry->DeviceNameLen); } else P2pSendSamsungEvent(pAd, P2P_NOTIF_SOFTAP_STA_DISASSOC, Addr2, NULL, 0); #endif /* P2P_SUPPORT */ #endif /* DPA_S */ } } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliPeerDisassocAction() sanity check fail\n")); } return; }
static VOID P2PDiscCanlAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { P2P_DISC_STATE *pCurrState = &(pAd->P2pCfg.DiscCurrentState); PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg; UCHAR channel = pP2PCtrl->ListenChannel; UCHAR p2pindex; BOOLEAN bGoBack = TRUE; /* Go back to working channel */ if (INFRA_ON(pAd) || (pAd->flg_p2p_OpStatusFlags != P2P_DISABLE)) { if ((pAd->CommonCfg.Channel != pAd->CommonCfg.CentralChannel) && (pAd->CommonCfg.BBPCurrentBW == BW_40)) channel = pAd->CommonCfg.CentralChannel; else channel = pAd->CommonCfg.Channel; } p2pindex = P2pGroupTabSearch(pAd, pAd->P2pCfg.ConnectingMAC); if (p2pindex != P2P_NOT_FOUND) { if (pAd->P2pTable.Client[p2pindex].P2pClientState > P2PSTATE_DISCOVERY_UNKNOWN) bGoBack = FALSE; } if (bGoBack && (channel != pAd->LatchRfRegs.Channel)) { if (pAd->CommonCfg.BBPCurrentBW == BW_40) rtmp_bbp_set_bw(pAd, BW_40); AsicSwitchChannel(pAd, channel, FALSE); AsicLockChannel(pAd, channel); DBGPRINT(RT_DEBUG_TRACE, ("P2PDiscCanlAction - Restore to channel %d\n",channel)); } *pCurrState = P2P_DISC_IDLE; }
static VOID P2PDiscCanlAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { P2P_DISC_STATE *pCurrState = &(pAd->P2pCfg.DiscCurrentState); PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg; UCHAR channel = pP2PCtrl->ListenChannel; UCHAR p2pindex; BOOLEAN bGoBack = TRUE; /* Go back to working channel */ if (INFRA_ON(pAd) || (pAd->flg_p2p_OpStatusFlags != P2P_DISABLE)) { if ((pAd->CommonCfg.Channel != pAd->CommonCfg.CentralChannel) && (pAd->CommonCfg.BBPCurrentBW == BW_40)) channel = pAd->CommonCfg.CentralChannel; else channel = pAd->CommonCfg.Channel; } p2pindex = P2pGroupTabSearch(pAd, pAd->P2pCfg.ConnectingMAC); if (p2pindex != P2P_NOT_FOUND) { if (pAd->P2pTable.Client[p2pindex].P2pClientState > P2PSTATE_DISCOVERY_UNKNOWN) bGoBack = FALSE; } if (bGoBack && (channel != pAd->LatchRfRegs.Channel)) { UINT32 Data = 0, macStatus; UINT32 MTxCycle, MRxCycle; /* Disable MAC Tx/Rx */ RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Data); Data &= (~0x0C); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Data); /* Check MAC Tx/Rx idle */ for (MTxCycle = 0; MTxCycle < 10000; MTxCycle++) { RTMP_IO_READ32(pAd, MAC_STATUS_CFG, &macStatus); if (macStatus & 0x3) RTMPusecDelay(50); else break; } AsicSwitchChannel(pAd, channel, FALSE); AsicLockChannel(pAd, channel); if (pAd->CommonCfg.BBPCurrentBW == BW_40) { UCHAR BBPValue = 0; RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); BBPValue &= (~0x18); BBPValue |= 0x10; RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); } //Enable MAC Tx/Rx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Data); Data |= 0x0C; RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Data); DBGPRINT(RT_DEBUG_TRACE, ("P2PDiscCanlAction - Restore to channel %d\n",channel)); } *pCurrState = P2P_DISC_IDLE; }
ULONG InsertWfdSubelmtTlv( IN PRTMP_ADAPTER pAd, IN UCHAR SubId, IN PUCHAR pInBuffer, IN PUCHAR pOutBuffer, IN UINT Action) { PRT_WFD_CONFIG pWFDCtrl = &pAd->StaCfg.WfdCfg; PUCHAR pDest; ULONG Length, tmpValue = 0; USHORT EidLen = 0; pDest = pOutBuffer; RTMPZeroMemory(pDest, 255); *pDest = SubId; pDest += 1; Length = 0; switch (SubId) { case SUBID_WFD_DEVICE_INFO: { WFD_DEVICE_INFO DevInfo; PUSHORT pDevInfo = &DevInfo; RTMPZeroMemory(&DevInfo, sizeof(WFD_DEVICE_INFO)); EidLen = SUBID_WFD_DEVICE_INFO_LEN; tmpValue = cpu2be16(EidLen); RTMPMoveMemory(pDest, &tmpValue, 2); DevInfo.DeviceType = pWFDCtrl->DeviceType; DevInfo.SourceCoupled = pWFDCtrl->SourceCoupled; DevInfo.SinkCoupled = pWFDCtrl->SinkCoupled; DevInfo.SessionAvail = pWFDCtrl->SessionAvail; DevInfo.WSD = pWFDCtrl->WSD; if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd))) DevInfo.PC = pWFDCtrl->PC; else DevInfo.PC = WFD_PC_P2P; DevInfo.CP = pWFDCtrl->CP; DevInfo.TimeSync = pWFDCtrl->TimeSync; /* RTMPMoveMemory(pDest + 1, &DevInfo, sizeof(WFD_DEVICE_INFO)); */ tmpValue = cpu2be16(*pDevInfo); RTMPMoveMemory((pDest + 2), &tmpValue, 2); tmpValue = cpu2be16(pWFDCtrl->RtspPort); RTMPMoveMemory((pDest + 4), &tmpValue, 2); tmpValue = cpu2be16(pWFDCtrl->MaxThroughput); RTMPMoveMemory((pDest + 6), &tmpValue, 2); Length = 9; break; } case SUBID_WFD_ASSOCIATED_BSSID: { UCHAR AllZero[MAC_ADDR_LEN] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; if ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP)) { EidLen = SUBID_WFD_ASSOCIATED_BSSID_LEN; tmpValue = cpu2be16(EidLen); RTMPMoveMemory(pDest, &tmpValue, 2); Length = EidLen + 3; if (!NdisEqualMemory(AllZero, pAd->CommonCfg.Bssid, MAC_ADDR_LEN) && (Action == ACTION_GAS_INITIAL_RSP)) { RTMPMoveMemory(pDest + 2, pAd->CommonCfg.Bssid, MAC_ADDR_LEN); } } else { if (!NdisEqualMemory(AllZero, pAd->CommonCfg.Bssid, MAC_ADDR_LEN)) { EidLen = SUBID_WFD_ASSOCIATED_BSSID_LEN; tmpValue = cpu2be16(EidLen); RTMPMoveMemory(pDest, &tmpValue, 2); RTMPMoveMemory(pDest + 2, pAd->CommonCfg.Bssid, MAC_ADDR_LEN); Length = EidLen + 3; } } break; } case SUBID_WFD_AUDIO_FORMATS: { if ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP)) { EidLen = SUBID_WFD_AUDIO_FORMATS_LEN; tmpValue = cpu2be16(EidLen); RTMPMoveMemory(pDest, &tmpValue, 2); Length = EidLen + 3; } break; } case SUBID_WFD_VIDEO_FORMATS: { if ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP)) { EidLen = SUBID_WFD_VIDEO_FORMATS_LEN; tmpValue = cpu2be16(EidLen); RTMPMoveMemory(pDest, &tmpValue, 2); Length = EidLen + 3; } break; } case SUBID_WFD_3D_VIDEO_FORMATS: { if ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP)) { EidLen = SUBID_WFD_3D_VIDEO_FORMATS_LEN; tmpValue = cpu2be16(EidLen); RTMPMoveMemory(pDest, &tmpValue, 2); Length = EidLen + 3; } break; } case SUBID_WFD_CONTENT_PROTECTION: { if ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP)) { EidLen = SUBID_WFD_CONTENT_PROTECTION_LEN; tmpValue = cpu2be16(EidLen); RTMPMoveMemory(pDest, &tmpValue, 2); Length = EidLen + 3; } break; } case SUBID_WFD_COUPLED_SINK_INFO: { // if ((pWFDCtrl->DeviceType != WFD_SOURCE ) && (pWFDCtrl->SinkCoupled == WFD_COUPLED_SUPPORT)) { WFD_COUPLED_SINK_INFO SinkInfo; RTMPZeroMemory(&SinkInfo, sizeof(WFD_COUPLED_SINK_INFO)); EidLen = SUBID_WFD_COUPLED_SINK_INFO_LEN; tmpValue = cpu2be16(EidLen); RTMPMoveMemory(pDest, &tmpValue, 2); SinkInfo.CoupledStat = pWFDCtrl->CoupledSinkStatus.CoupledStat; RTMPMoveMemory(pDest + 2, &SinkInfo, sizeof(WFD_COUPLED_SINK_INFO)); Length = EidLen + 3; } break; } case SUBID_WFD_EXTENDED_CAP: { if ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP)) { EidLen = SUBID_WFD_EXTENDED_CAP_LEN; tmpValue = cpu2be16(EidLen); RTMPMoveMemory(pDest, &tmpValue, 2); Length = EidLen + 3; } break; } case SUBID_WFD_LOCAL_IP_ADDR: { if ((Action == ACTION_GAS_INITIAL_REQ) || (Action == ACTION_GAS_INITIAL_RSP)) { EidLen = SUBID_WFD_LOCAL_IP_ADDR_LEN; tmpValue = cpu2be16(EidLen); RTMPMoveMemory(pDest, &tmpValue, 2); Length = EidLen + 3; } else { EidLen = SUBID_WFD_LOCAL_IP_ADDR_LEN; tmpValue = cpu2be16(EidLen); RTMPMoveMemory(pDest, &tmpValue, 2); RTMPMoveMemory(pDest + 2, &pWFDCtrl->wfd_serv_disc_query_info.wfd_local_ip_ie, SUBID_WFD_LOCAL_IP_ADDR_LEN); Length = EidLen + 3; } break; } case SUBID_WFD_SESSION_INFO: { INT i = 0, NumOfDev = 0; UCHAR P2pIdx = P2P_NOT_FOUND; PRT_P2P_TABLE Tab = &pAd->P2pTable; if (P2P_GO_ON(pAd) #ifdef RT_CFG80211_SUPPORT || (pWFDCtrl->bSuppGoOn) #endif /* RT_CFG80211_SUPPORT */ ) { for (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) { MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i]; P2pIdx = P2pGroupTabSearch(pAd, pEntry->Addr); if ((P2pIdx < MAX_P2P_GROUP_SIZE) && (Tab->Client[P2pIdx].WfdEntryInfo.bWfdClient == TRUE)) NumOfDev++; } EidLen = 24*NumOfDev; tmpValue = cpu2be16(EidLen); RTMPMoveMemory(pDest, &tmpValue, 2); DBGPRINT(RT_DEBUG_INFO, ("%s:: NumOfDev = %d, Len = %d\n", __FUNCTION__, NumOfDev, *pDest)); pDest+=2; for (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) { MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i]; P2pIdx = P2pGroupTabSearch(pAd, pEntry->Addr); if ((P2pIdx < MAX_P2P_GROUP_SIZE) && (Tab->Client[P2pIdx].WfdEntryInfo.bWfdClient == TRUE)) { INT j = 0; WFD_SESSION_INFO SessionInfo; RTMPZeroMemory(&SessionInfo, sizeof(WFD_SESSION_INFO)); SessionInfo.Length = 23; RTMPMoveMemory(&SessionInfo.DeviceAddr[0], &pAd->P2pTable.Client[P2pIdx].addr[0], MAC_ADDR_LEN); RTMPMoveMemory(&SessionInfo.Bssid[0], &pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.assoc_addr[0], MAC_ADDR_LEN); /* Below is the WFD Device Information */ SessionInfo.WfdDevInfo.DeviceType = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.wfd_devive_type; SessionInfo.WfdDevInfo.SourceCoupled = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.source_coupled; SessionInfo.WfdDevInfo.SinkCoupled = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.sink_coupled; SessionInfo.WfdDevInfo.SessionAvail = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.session_avail; SessionInfo.WfdDevInfo.WSD = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.wfd_service_discovery; SessionInfo.WfdDevInfo.PC = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.wfd_PC; SessionInfo.WfdDevInfo.TimeSync = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.wfd_time_sync; SessionInfo.MaxThroughput = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.max_throughput; SessionInfo.CoupledSinkInfo = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.coupled_sink_status; /* So far we cannot know the address of coupled devices, the coupled address will be filled "0" until WiFi Display spec. is ready for this part. */ RTMPMoveMemory(&SessionInfo.CoupledPeerAddr[0], &pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.coupled_peer_addr[0], MAC_ADDR_LEN); RTMPMoveMemory(pDest, &SessionInfo, sizeof(WFD_SESSION_INFO)); for (j = 0; j < 24; j++) DBGPRINT(RT_DEBUG_INFO, ("%02x ", *(pDest+j))); DBGPRINT(RT_DEBUG_INFO, ("\n")); pDest += 24; } } Length = 24*NumOfDev + 3; } break; } case SUBID_WFD_ALTERNATE_MAC_ADDR: { UCHAR AllZero[MAC_ADDR_LEN] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; if (!NdisEqualMemory(AllZero, pAd->CurrentAddress, MAC_ADDR_LEN)) { EidLen = SUBID_WFD_ALTERNATE_MAC_ADDR_LEN; *((PUSHORT) (pDest)) = cpu2be16(EidLen); RTMPMoveMemory(pDest + 2, pAd->CurrentAddress, MAC_ADDR_LEN); Length = EidLen + 3; } break; } default: *pDest = 0; Length = 0; break; } return Length; }
INT Set_PeerRtspPort_Proc( IN PRTMP_ADAPTER pAd, IN PSTRING arg) { PRT_WFD_CONFIG pWFDCtrl = &pAd->StaCfg.WfdCfg; UINT32 ip_addr; MAC_TABLE_ENTRY *pEntry; USHORT RtspPort = WFD_RTSP_DEFAULT_PORT; UCHAR P2pIdx = P2P_NOT_FOUND; PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg; INT i; #ifdef DOT11Z_TDLS_SUPPORT i = -1; if (pAd->StaCfg.TdlsInfo.bTDLSCapable && pAd->StaCfg.WfdCfg.PC == WFD_PC_TDLS) { PRT_802_11_TDLS pTDLS = NULL; DBGPRINT(RT_DEBUG_TRACE, ("%s - TDLS peer rtsp port get...\n", __FUNCTION__)); for (i = MAX_NUM_OF_TDLS_ENTRY - 1; i >= 0; i--) { if ((pAd->StaCfg.TdlsInfo.TDLSEntry[i].Valid) && (pAd->StaCfg.TdlsInfo.TDLSEntry[i].Status == TDLS_MODE_CONNECTED)) { pTDLS = &pAd->StaCfg.TdlsInfo.TDLSEntry[i]; RtspPort = pTDLS->WfdEntryInfo.rtsp_port; DBGPRINT(RT_DEBUG_TRACE, ("TDLS Entry[%d][%02x:%02x:%02x:%02x:%02x:%02x]\n", i, PRINT_MAC(pTDLS->MacAddr))); DBGPRINT(RT_DEBUG_TRACE, ("RTSP_PORT = %d.\n", pTDLS->WfdEntryInfo.rtsp_port)); break; } } if ((RtspPort == 0) && (pTDLS != NULL)) { DBGPRINT(RT_DEBUG_ERROR, ("TDLS peer rtsp port is zero, search P2P Entry!\n", RtspPort)); P2pIdx = P2pGroupTabSearch(pAd, pTDLS->MacAddr); if (P2pIdx != P2P_NOT_FOUND) { RtspPort = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.rtsp_port; DBGPRINT(RT_DEBUG_TRACE, ("P2P Entry[%d][%02x:%02x:%02x:%02x:%02x:%02x]\n", P2pIdx, PRINT_MAC(pTDLS->MacAddr))); DBGPRINT(RT_DEBUG_TRACE, ("RTSP_PORT = %d.\n", pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.rtsp_port)); if (RtspPort == 0) RtspPort = WFD_RTSP_DEFAULT_PORT; } else { RtspPort = WFD_RTSP_DEFAULT_PORT; DBGPRINT(RT_DEBUG_ERROR, ("OID_802_11_P2P_PEER_RTSP_PORT::P2P not found, use default RTSP port\n")); } } } if (i < 0) #endif /* DOT11Z_TDLS_SUPPORT */ { DBGPRINT(RT_DEBUG_TRACE, ("%s - P2P peer rtsp port get...\n", __FUNCTION__)); if (P2P_GO_ON(pAd) || P2P_CLI_ON(pAd)) { for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++) { pEntry = &pAd->MacTab.Content[i]; if (IS_P2P_GO_ENTRY(pEntry) || IS_P2P_CLI_ENTRY(pEntry)) { P2pIdx = P2pGroupTabSearch(pAd, pEntry->Addr); DBGPRINT(RT_DEBUG_TRACE, ("P2P Entry[%d][%02x:%02x:%02x:%02x:%02x:%02x]\n", pEntry->P2pInfo.p2pIndex, PRINT_MAC(pEntry->Addr))); DBGPRINT(RT_DEBUG_TRACE, ("RTSP_PORT = %d.\n", pAd->P2pTable.Client[pEntry->P2pInfo.p2pIndex].WfdEntryInfo.rtsp_port)); if (P2pIdx != P2P_NOT_FOUND) RtspPort = pAd->P2pTable.Client[P2pIdx].WfdEntryInfo.rtsp_port; else { RtspPort = WFD_RTSP_DEFAULT_PORT; DBGPRINT(RT_DEBUG_ERROR, ("OID_802_11_P2P_PEER_RTSP_PORT::P2P not found, use default RTSP port\n")); } if (pEntry->P2pInfo.p2pIndex < MAX_P2P_GROUP_SIZE) P2PPrintP2PEntry(pAd, pEntry->P2pInfo.p2pIndex); break; } } DBGPRINT(RT_DEBUG_TRACE, ("OID_802_11_P2P_PEER_RTSP_PORT bssid: %02x:%02x:%02x:%02x:%02x:%02x.\n", PRINT_MAC(pP2PCtrl->CurrentAddress))); } } DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_P2P_PEER_RTSP_PORT (=%d)\n", RtspPort)); return TRUE; }
/* ========================================================================== Description: peer sends assoc rsp back Parameters: Elme - MLME message containing the received frame ========================================================================== */ static VOID ApCliPeerAssocRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { BOOLEAN Cancelled; USHORT CapabilityInfo, Status, Aid; UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen; UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen; UCHAR Addr2[MAC_ADDR_LEN]; EDCA_PARM EdcaParm; UCHAR CkipFlag; APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; HT_CAPABILITY_IE HtCapability; ADD_HT_INFO_IE AddHtInfo; /* AP might use this additional ht info IE */ UCHAR HtCapabilityLen; UCHAR AddHtInfoLen; UCHAR NewExtChannelOffset = 0xff; USHORT ifIndex = (USHORT)(Elem->Priv); if (ifIndex >= MAX_APCLI_NUM) return; PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; PAPCLI_STRUCT pApCliEntry = NULL; ULONG P2PSubelementLen = 0; UCHAR *P2pSubelement; os_alloc_mem(NULL, (UCHAR **)&P2pSubelement, MAX_VIE_LEN); if (ApCliPeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status, &Aid, &P2PSubelementLen, P2pSubelement, SupRate, &SupRateLen, ExtRate, &ExtRateLen, &HtCapability, &AddHtInfo, &HtCapabilityLen,&AddHtInfoLen,&NewExtChannelOffset, &EdcaParm, &CkipFlag)) { /* The frame is for me ? */ if(MAC_ADDR_EQUAL(Addr2, pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Bssid)) { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - receive ASSOC_RSP to me (status=%d)\n", Status)); RTMPCancelTimer(&pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.ApCliAssocTimer, &Cancelled); pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; if (P2PSubelementLen > 0) { /*UCHAR P2pIdx = P2P_NOT_FOUND; ULONG TmpLen; PUCHAR pData;*/ pApCliEntry->bP2pClient = TRUE; } else pApCliEntry->bP2pClient = FALSE; DBGPRINT(RT_DEBUG_TRACE, ("%s:: recv peer ASSOC RSP from %02x:%02x:%02x:%02x:%02x:%02x. bP2pClient = %d\n", __FUNCTION__, PRINT_MAC(Addr2), pApCliEntry->bP2pClient)); if(Status == MLME_SUCCESS) { #ifdef DPA_S #ifdef P2P_SUPPORT UCHAR p2pIndex = P2P_NOT_FOUND; p2pIndex = P2pGroupTabSearch(pAd, pAd->ApCliMlmeAux.Bssid); if (p2pIndex != P2P_NOT_FOUND) { PRT_P2P_CLIENT_ENTRY pP2pEntry = &pAd->P2pTable.Client[p2pIndex]; P2pSendSamsungEvent(pAd, P2P_NOTIF_SOFTAP_STA_ASSOC, pAd->ApCliMlmeAux.Bssid, pP2pEntry->DeviceName, pP2pEntry->DeviceNameLen); } else P2pSendSamsungEvent(pAd, P2P_NOTIF_SOFTAP_STA_ASSOC, pAd->ApCliMlmeAux.Bssid, NULL, 0); #endif /* P2P_SUPPORT */ #endif /* DPA_S */ /* go to procedure listed on page 376 */ ApCliAssocPostProc(pAd, Addr2, CapabilityInfo, ifIndex, SupRate, SupRateLen, ExtRate, ExtRateLen, &EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo); pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Aid=Aid; ApCliCtrlMsg.Status = MLME_SUCCESS; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } else { ApCliCtrlMsg.Status = Status; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } *pCurrState = APCLI_ASSOC_IDLE; } } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliPeerAssocRspAction() sanity check fail\n")); } if (P2pSubelement != NULL) os_free_mem(NULL, P2pSubelement); return; }
INT Set_P2P_Cancel_Proc( IN PRTMP_ADAPTER pAd, IN PSTRING arg) { POS_COOKIE pObj; PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg; PWSC_CTRL pWscControl = NULL; INT val = (INT)simple_strtol(arg, 0, 10); pObj = (POS_COOKIE) pAd->OS_Cookie; if (pObj->ioctl_if_type != INT_P2P) return FALSE; if (val == 1) { pP2PCtrl->P2PConnectState = P2P_CONNECT_IDLE; if (!MAC_ADDR_EQUAL(&ZERO_MAC_ADDR[0], &pP2PCtrl->ConnectingMAC[0])) { UCHAR p2pindex; p2pindex = P2pGroupTabSearch(pAd, pP2PCtrl->ConnectingMAC); if (p2pindex < MAX_P2P_GROUP_SIZE) { if (pAd->P2pTable.Client[p2pindex].Rule == P2P_IS_GO) pAd->P2pTable.Client[p2pindex].P2pClientState = P2PSTATE_DISCOVERY_GO; else pAd->P2pTable.Client[p2pindex].P2pClientState = P2PSTATE_DISCOVERY; pAd->P2pTable.Client[p2pindex].StateCount = 0; } NdisZeroMemory(pP2PCtrl->ConnectingMAC, MAC_ADDR_LEN); } if (P2P_GO_ON(pAd)) { UINT32 i, p2pEntryCnt=0; MAC_TABLE_ENTRY *pEntry; INT IsAPConfigured; pWscControl = &pAd->ApCfg.MBSSID[MAIN_MBSSID].WscControl; IsAPConfigured = pWscControl->WscConfStatus; if (pWscControl->bWscTrigger) { WscStop(pAd, FALSE, pWscControl); pWscControl->WscPinCode = 0; WscBuildBeaconIE(pAd, IsAPConfigured, FALSE, 0, 0, MAIN_MBSSID, NULL, 0, AP_MODE); WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, FALSE, 0, 0, (MAIN_MBSSID | MIN_NET_DEVICE_FOR_P2P_GO), NULL, 0, AP_MODE); APUpdateBeaconFrame(pAd, pObj->ioctl_if); } for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++) { pEntry = &pAd->MacTab.Content[i]; if (IS_P2P_GO_ENTRY(pEntry) && (pEntry->WpaState == AS_PTKINITDONE)) p2pEntryCnt++; } DBGPRINT(RT_DEBUG_ERROR, ("%s:: Total= %d. p2pEntry = %d.\n", __FUNCTION__, pAd->MacTab.Size, p2pEntryCnt)); if ((p2pEntryCnt == 0) && (pAd->flg_p2p_OpStatusFlags == P2P_GO_UP)) { #ifdef RTMP_MAC_USB RTEnqueueInternalCmd(pAd, CMDTHREAD_SET_P2P_LINK_DOWN, NULL, 0); #endif /* RTMP_MAC_USB */ } } else if (P2P_CLI_ON(pAd)) { pWscControl = &pAd->ApCfg.MBSSID[MAIN_MBSSID].WscControl; pWscControl->WscPinCode = 0; if (pWscControl->bWscTrigger) WscStop(pAd, TRUE, pWscControl); P2pLinkDown(pAd, P2P_DISCONNECTED); } P2pStopScan(pAd); pP2PCtrl->bPeriodicListen = TRUE; /* Reset bConfirmByUI to its default value */ pP2PCtrl->bConfirmByUI = CONFIRM_BY_UI_DEFAULT; if (INFRA_ON(pAd) || P2P_GO_ON(pAd) || P2P_CLI_ON(pAd)) { INT ch; // TODO: shiang-6590, why we set bw as 40 when BBPCurrentBW == BW_40?? if (pAd->CommonCfg.BBPCurrentBW == BW_40) { rtmp_bbp_set_bw(pAd, BW_40); ch = pAd->CommonCfg.CentralChannel; } else { ch = pAd->CommonCfg.Channel; } AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); } } DBGPRINT(RT_DEBUG_TRACE, ("%s:: Cancel P2P action\n", __FUNCTION__)); return TRUE; }