/** * @fn m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr, uint8 grp) * @brief WiFi call back function * @param [in] u8OpCode * HIF Opcode type. * @param [in] u16DataSize * HIF data length. * @param [in] u32Addr * HIF address. * @param [in] grp * HIF group type. * @author * @date * @version 1.0 */ static void m2m_ota_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) { sint8 ret = M2M_SUCCESS; if(u8OpCode == M2M_OTA_RESP_NOTIF_UPDATE_INFO) { tstrOtaUpdateInfo strOtaUpdateInfo; m2m_memset((uint8*)&strOtaUpdateInfo,0,sizeof(tstrOtaUpdateInfo)); ret = hif_receive(u32Addr,(uint8*)&strOtaUpdateInfo,sizeof(tstrOtaUpdateInfo),0); if(ret == M2M_SUCCESS) { if(gpfOtaNotifCb) gpfOtaNotifCb(&strOtaUpdateInfo); } } else if (u8OpCode == M2M_OTA_RESP_UPDATE_STATUS) { tstrOtaUpdateStatusResp strOtaUpdateStatusResp; m2m_memset((uint8*)&strOtaUpdateStatusResp,0,sizeof(tstrOtaUpdateStatusResp)); ret = hif_receive(u32Addr, (uint8*) &strOtaUpdateStatusResp,sizeof(tstrOtaUpdateStatusResp), 0); if(ret == M2M_SUCCESS) { if(gpfOtaUpdateCb) gpfOtaUpdateCb(strOtaUpdateStatusResp.u8OtaUpdateStatusType,strOtaUpdateStatusResp.u8OtaUpdateStatus); } } else { M2M_ERR("Invaild OTA resp %d ?\n",u8OpCode); } }
/********************************************************************* Function close Description Return None. Author Ahmed Ezzat Version 1.0 Date 4 June 2012 *********************************************************************/ sint8 close(SOCKET sock) { sint8 s8Ret = SOCK_ERR_INVALID_ARG; if(sock >= 0 && (gastrSockets[sock].bIsUsed == 1)) { uint8 u8Cmd = SOCKET_CMD_CLOSE; tstrCloseCmd strclose; strclose.sock = sock; strclose.u16SessionID = gastrSockets[sock].u16SessionID; gastrSockets[sock].bIsUsed = 0; gastrSockets[sock].u16SessionID =0; if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) { u8Cmd = SOCKET_CMD_SSL_CLOSE; } s8Ret = SOCKET_REQUEST(u8Cmd, (uint8*)&strclose, sizeof(tstrCloseCmd), NULL,0, 0); if(s8Ret != SOCK_ERR_NO_ERROR) { s8Ret = SOCK_ERR_INVALID; } m2m_memset((uint8*)&gastrSockets[sock], 0, sizeof(tstrSocket)); } return s8Ret; }
sint8 nmi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid) { sint8 ret; uint32 u32RegValue; uint8 mac[6]; tstrGpRegs strgp = {0}; ret = nm_read_reg_with_ret(rNMI_GP_REG_2, &u32RegValue); if(ret != M2M_SUCCESS) goto _EXIT_ERR; ret = nm_read_block(u32RegValue|0x30000,(uint8*)&strgp,sizeof(tstrGpRegs)); if(ret != M2M_SUCCESS) goto _EXIT_ERR; u32RegValue = strgp.u32Mac_efuse_mib; if(!EFUSED_MAC(u32RegValue)) { M2M_DBG("Default MAC\n"); m2m_memset(pu8MacAddr, 0, 6); goto _EXIT_ERR; } M2M_DBG("OTP MAC\n"); u32RegValue >>=16; ret = nm_read_block(u32RegValue|0x30000, mac, 6); m2m_memcpy(pu8MacAddr,mac,6); if(pu8IsValid) *pu8IsValid = 1; return ret; _EXIT_ERR: if(pu8IsValid) *pu8IsValid = 0; return ret; }
/** * @fn NMI_API sint8 hif_deinit(void * arg); * @brief To De-initialize HIF layer. * @param [in] arg * Pointer to the arguments. * @return The function shall return ZERO for successful operation and a negative value otherwise. */ sint8 hif_deinit(void * arg) { sint8 ret = M2M_SUCCESS; ret = hif_chip_wake(); m2m_memset((uint8*)&gstrHifCxt,0,sizeof(tstrHifContext)); return ret; }
sint8 hif_init(void * arg) { m2m_memset((uint8*)&gstrHifCxt,0,sizeof(tstrHifContext)); nm_bsp_register_isr(isr); hif_register_cb(M2M_REQ_GROUP_HIF,m2m_hif_cb); return M2M_SUCCESS; }
sint8 nmi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid) { sint8 ret; uint32 u32RegValue; uint8 mac[6]; ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue); if(ret != M2M_SUCCESS) goto _EXIT_ERR; if(!EFUSED_MAC(u32RegValue)) { M2M_DBG("Default MAC\n"); m2m_memset(pu8MacAddr, 0, 6); goto _EXIT_ERR; } M2M_DBG("OTP MAC\n"); u32RegValue >>=16; nm_read_block(u32RegValue|0x30000, mac, 6); m2m_memcpy(pu8MacAddr,mac,6); if(pu8IsValid) *pu8IsValid = 1; return ret; _EXIT_ERR: if(pu8IsValid) *pu8IsValid = 0; return ret; }
/********************************************************************* Function sendto Description Return Author Ahmed Ezzat Version 1.0 Date 4 June 2012 *********************************************************************/ sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, uint8 u8AddrLen) { sint16 s16Ret = SOCK_ERR_INVALID_ARG; if((sock >= 0) && (pvSendBuffer != NULL) && (u16SendLength <= SOCKET_BUFFER_MAX_LENGTH)) { if(gastrSockets[sock].bIsUsed) { tstrSendCmd strSendTo; m2m_memset((uint8*)&strSendTo, 0, sizeof(tstrSendCmd)); strSendTo.sock = sock; strSendTo.u16DataSize = NM_BSP_B_L_16(u16SendLength); if(pstrDestAddr != NULL) { struct sockaddr_in *pstrAddr; pstrAddr = (void*)pstrDestAddr; strSendTo.strAddr.u16Family = pstrAddr->sin_family; strSendTo.strAddr.u16Port = pstrAddr->sin_port; strSendTo.strAddr.u32IPAddr = pstrAddr->sin_addr.s_addr; } s16Ret = SOCKET_REQUEST(SOCKET_CMD_SENDTO|M2M_REQ_DATA_PKT, (uint8*)&strSendTo, sizeof(tstrSendCmd), pvSendBuffer, u16SendLength, UDP_TX_PACKET_OFFSET); if(s16Ret != SOCK_ERR_NO_ERROR) { s16Ret = SOCK_ERR_BUFFER_FULL; } } } return s16Ret; }
sint8 m2m_wifi_request_scan_ssid(uint8 ch,char* pcssid) { sint8 s8Ret = M2M_ERR_SCAN_IN_PROGRESS; if(!gu8scanInProgress) { tstrM2MScan strtmp; m2m_memset((uint8*)&strtmp,0,sizeof(tstrM2MScan)); strtmp.u8ChNum = ch; if(pcssid) { uint8 len = m2m_strlen((uint8 *)pcssid); m2m_memcpy(strtmp.au8SSID,(uint8 *)pcssid,len+1); } s8Ret = hif_send(M2M_REQ_GRP_WIFI, M2M_WIFI_REQ_SCAN, (uint8*)&strtmp, sizeof(tstrM2MScan),NULL, 0,0); if(s8Ret == M2M_SUCCESS) { gu8scanInProgress = 1; } else { M2M_ERR("SCAN Failed Ret = %d\n",s8Ret); } } else { M2M_ERR("SCAN In Progress\n"); } return s8Ret; }
sint8 m2m_wifi_request_scan(uint8 ch) { sint8 s8Ret = M2M_ERR_SCAN_IN_PROGRESS; if(!gu8scanInProgress) { tstrM2MScan strtmp; m2m_memset((uint8*)&strtmp,0,sizeof(tstrM2MScan)); strtmp.u8ChNum = ch; s8Ret = hif_send(M2M_REQ_GRP_WIFI, M2M_WIFI_REQ_SCAN, (uint8*)&strtmp, sizeof(tstrM2MScan),NULL, 0,0); if(s8Ret == M2M_SUCCESS) { gu8scanInProgress = 1; } else { M2M_ERR("SCAN Failed Ret = %d\n",s8Ret); } } else { M2M_ERR("SCAN In Progress\n"); } return s8Ret; }
/********************************************************************* Function socketDeinit Description Return None. Author Samer Sarhan Version 1.0 Date 27 Feb 2015 *********************************************************************/ void socketDeinit(void) { m2m_memset((uint8*)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); hif_register_cb(M2M_REQ_GRP_IP, NULL); gpfAppSocketCb = NULL; gpfAppResolveCb = NULL; gbSocketInit = 0; }
/********************************************************************* Function socketInit Description Return None. Author Ahmed Ezzat Versio 1.0 Date 4 June 2012 *********************************************************************/ void socketInit(void) { if(gbSocketInit==0) { m2m_memset((uint8*)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); hif_register_cb(M2M_REQ_GRP_IP,m2m_ip_cb); gbSocketInit=1; } }
sint8 m2m_crypto_sha256_hash_init(tstrM2mSha256Ctxt *pstrSha256Ctxt) { tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt*)pstrSha256Ctxt; if(pstrSHA256 != NULL) { m2m_memset((uint8*)pstrSha256Ctxt, 0, sizeof(tstrM2mSha256Ctxt)); pstrSHA256->u8InitHashFlag = 1; } return 0; }
/********************************************************************* Function socket Description Creates a socket. Return - Negative value for error. - ZERO or positive value as a socket ID if successful. Author Ahmed Ezzat Version 1.0 Date 4 June 2012 *********************************************************************/ SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags) { SOCKET sock = -1; uint8 u8Count,u8SocketCount = MAX_SOCKET; volatile tstrSocket *pstrSock; /* The only supported family is the AF_INET for UDP and TCP transport layer protocols. */ if(u16Domain == AF_INET) { if(u8Type == SOCK_STREAM) { u8SocketCount = TCP_SOCK_MAX; u8Count = 0; } else if(u8Type == SOCK_DGRAM) { /*--- UDP SOCKET ---*/ u8SocketCount = MAX_SOCKET; u8Count = TCP_SOCK_MAX; } else return sock; for(;u8Count < u8SocketCount; u8Count ++) { pstrSock = &gastrSockets[u8Count]; if(pstrSock->bIsUsed == 0) { m2m_memset((uint8*)pstrSock, 0, sizeof(tstrSocket)); pstrSock->bIsUsed = 1; /* The session ID is used to distinguish different socket connections by comparing the assigned session ID to the one reported by the firmware*/ ++gu16SessionID; if(gu16SessionID == 0) ++gu16SessionID; pstrSock->u16SessionID = gu16SessionID; M2M_DBG("1 Socket %d session ID = %d\r\n",u8Count, gu16SessionID ); sock = (SOCKET)u8Count; if(u8Flags & SOCKET_FLAGS_SSL) { tstrSSLSocketCreateCmd strSSLCreate; strSSLCreate.sslSock = sock; pstrSock->u8SSLFlags = SSL_FLAGS_ACTIVE | SSL_FLAGS_NO_TX_COPY; SOCKET_REQUEST(SOCKET_CMD_SSL_CREATE, (uint8*)&strSSLCreate, sizeof(tstrSSLSocketCreateCmd), 0, 0, 0); } break; } } } return sock; }
/*! @fn \ sint8 m2m_crypto_init(); @brief crypto initialization @param[in] pfAppCryproCb */ sint8 m2m_crypto_init(tpfAppCryproCb pfAppCryproCb) { sint8 ret = M2M_ERR_FAIL; m2m_memset((uint8*)&gstrCryptoCtxt,0,sizeof(tstrCryptoCtxt)); if(pfAppCryproCb != NULL) { gstrCryptoCtxt.pfAppCryptoCb = pfAppCryproCb; ret = hif_register_cb(M2M_REQ_GROUP_CRYPTO,m2m_crypto_cb); } return ret; }
/********************************************************************* Function close Description Return None. Author Ahmed Ezzat Version 1.0 Date 4 June 2012 *********************************************************************/ sint8 close(SOCKET sock) { sint8 s8Ret = SOCK_ERR_INVALID_ARG; if(sock >= 0) { uint8 u8Cmd = SOCKET_CMD_CLOSE; tstrCloseCmd strclose; strclose.sock = sock; gastrSockets[sock].bIsUsed = 0; if(gastrSockets[sock].bIsSSLSock) { u8Cmd = SOCKET_CMD_SSL_CLOSE; } s8Ret = SOCKET_REQUEST(u8Cmd, (uint8*)&strclose, sizeof(tstrCloseCmd), NULL,0, 0); if(s8Ret != SOCK_ERR_NO_ERROR) { s8Ret = SOCK_ERR_INVALID; } m2m_memset((uint8*)&gastrSockets[sock], 0, sizeof(tstrSocket)); } return s8Ret; }
sint8 m2m_crypto_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, uint16 u16HashLength, uint8 *pu8RsaSignature) { sint8 s8Ret = M2M_RSA_SIGN_FAIL; if((pu8N != NULL) && (pu8d != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL)) { uint16 u16TLength, u16TEncodingLength; uint8 *pu8T; uint8 au8EM[512]; /* Selection of correct T Encoding based on the hash size. */ if(u16HashLength == MD5_DIGEST_SIZE) { pu8T = (uint8*)au8TEncodingMD5; u16TEncodingLength = sizeof(au8TEncodingMD5); } else if(u16HashLength == SHA1_DIGEST_SIZE) { pu8T = (uint8*)au8TEncodingSHA1; u16TEncodingLength = sizeof(au8TEncodingSHA1); } else { pu8T = (uint8*)au8TEncodingSHA2; u16TEncodingLength = sizeof(au8TEncodingSHA2); } u16TLength = u16TEncodingLength + 1 + u16HashLength; /* If emLen < tLen + 11. */ if(u16NSize >= (u16TLength + 11)) { uint16 u16PSLength = 0; uint16 u16Offset = 0; /* The calculated EM must match the following pattern. *======*======*======*======*======* * 0x00 || 0x01 || PS || 0x00 || T * *======*======*======*======*======* Where PS is all 0xFF T is defined based on the hash algorithm. */ au8EM[u16Offset ++] = 0; au8EM[u16Offset ++] = 1; u16PSLength = u16NSize - u16TLength - 3; m2m_memset(&au8EM[u16Offset], 0xFF, u16PSLength); u16Offset += u16PSLength; au8EM[u16Offset ++] = 0; m2m_memcpy(&au8EM[u16Offset], pu8T, u16TEncodingLength); u16Offset += u16TEncodingLength; au8EM[u16Offset ++] = u16HashLength; m2m_memcpy(&au8EM[u16Offset], pu8SignedMsgHash, u16HashLength); /* RSA Signature Generation */ BigInt_ModExp(au8EM, u16NSize, pu8d, u16dSize, pu8N, u16NSize, pu8RsaSignature, u16NSize); s8Ret = M2M_RSA_SIGN_OK; } } return s8Ret; }
void BigInt_ModExp ( uint8 *pu8X, uint16 u16XSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8M, uint16 u16MSize, uint8 *pu8R, uint16 u16RSize ) { uint32 u32Reg; uint8 au8Tmp[780] = {0}; uint32 u32XAddr = SHARED_MEM_BASE; uint32 u32MAddr; uint32 u32EAddr; uint32 u32RAddr; uint8 u8EMswBits = 32; uint32 u32Mprime = 0x7F; uint16 u16XSizeWords,u16ESizeWords; uint32 u32Exponent; u16XSizeWords = (u16XSize + 3) / 4; u16ESizeWords = (u16ESize + 3) / 4; u32MAddr = u32XAddr + (u16XSizeWords * 4); u32EAddr = u32MAddr + (u16XSizeWords * 4); u32RAddr = u32EAddr + (u16ESizeWords * 4); /* Reset the core. */ u32Reg = 0; u32Reg |= BIGINT_MISC_CTRL_CTL_RESET; u32Reg = nm_read_reg(BIGINT_MISC_CTRL); u32Reg &= ~BIGINT_MISC_CTRL_CTL_RESET; u32Reg = nm_read_reg(BIGINT_MISC_CTRL); nm_write_block(u32RAddr,au8Tmp, u16RSize); /* Write Input Operands to Chip Memory. */ /*------- X -------*/ FlipBuffer(pu8X,au8Tmp,u16XSize); nm_write_block(u32XAddr,au8Tmp,u16XSizeWords * 4); /*------- E -------*/ m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); FlipBuffer(pu8E, au8Tmp, u16ESize); nm_write_block(u32EAddr, au8Tmp, u16ESizeWords * 4); u32Exponent = GET_UINT32(au8Tmp, (u16ESizeWords * 4) - 4); while((u32Exponent & NBIT31)== 0) { u32Exponent <<= 1; u8EMswBits --; } /*------- M -------*/ m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); FlipBuffer(pu8M, au8Tmp, u16XSize); nm_write_block(u32MAddr, au8Tmp, u16XSizeWords * 4); /* Program the addresses of the input operands. */ nm_write_reg(BIGINT_ADDR_X, u32XAddr); nm_write_reg(BIGINT_ADDR_E, u32EAddr); nm_write_reg(BIGINT_ADDR_M, u32MAddr); nm_write_reg(BIGINT_ADDR_R, u32RAddr); /* Mprime. */ nm_write_reg(BIGINT_M_PRIME,u32Mprime); /* Length. */ u32Reg = (u16XSizeWords & 0xFF); u32Reg += ((u16ESizeWords & 0xFF) << 8); u32Reg += (u8EMswBits << 16); nm_write_reg(BIGINT_LENGTH,u32Reg); /* CTRL Register. */ u32Reg = nm_read_reg(BIGINT_MISC_CTRL); u32Reg ^= BIGINT_MISC_CTRL_CTL_START; u32Reg |= BIGINT_MISC_CTRL_CTL_FORCE_BARRETT; //u32Reg |= BIGINT_MISC_CTRL_CTL_M_PRIME_VALID; #if ENABLE_FLIPPING == 0 u32Reg |= BIGINT_MISC_CTRL_CTL_MSW_FIRST; #endif nm_write_reg(BIGINT_MISC_CTRL,u32Reg); /* Wait for computation to complete. */ while(1) { u32Reg = nm_read_reg(BIGINT_IRQ_STS); if(u32Reg & BIGINT_IRQ_STS_DONE) { break; } } nm_write_reg(BIGINT_IRQ_STS,0); m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); nm_read_block(u32RAddr, au8Tmp, u16RSize); FlipBuffer(au8Tmp, pu8R, u16RSize); }
sint8 m2m_crypto_sha256_hash_finish(tstrM2mSha256Ctxt *pstrSha256Ctxt, uint8 *pu8Sha256Digest) { sint8 s8Ret = M2M_ERR_FAIL; tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt*)pstrSha256Ctxt; if(pstrSHA256 != NULL) { uint32 u32ReadAddr; uint32 u32WriteAddr = SHARED_MEM_BASE; uint32 u32Addr = u32WriteAddr; uint16 u16Offset; uint16 u16PaddingLength; uint16 u16NBlocks = 1; uint32 u32RegVal = 0; uint32 u32Idx,u32ByteIdx; uint32 au32Digest[M2M_SHA256_DIGEST_LEN / 4]; uint8 u8IsDone = 0; nm_write_reg(SHA256_CTRL,u32RegVal); u32RegVal |= SHA256_CTRL_FORCE_SHA256_QUIT_MASK; nm_write_reg(SHA256_CTRL,u32RegVal); if(pstrSHA256->u8InitHashFlag) { pstrSHA256->u8InitHashFlag = 0; u32RegVal |= SHA256_CTRL_INIT_SHA256_STATE_MASK; } /* Calculate the offset of the last data byte in the current block. */ u16Offset = (uint16)(pstrSHA256->u32TotalLength % SHA_BLOCK_SIZE); /* Add the padding byte 0x80. */ pstrSHA256->au8CurrentBlock[u16Offset ++] = 0x80; /* Calculate the required padding to complete one Hash Block Size. */ u16PaddingLength = SHA_BLOCK_SIZE - u16Offset; m2m_memset(&pstrSHA256->au8CurrentBlock[u16Offset], 0, u16PaddingLength); /* If the padding count is not enough to hold 64-bit representation of the total input message length, one padding block is required. */ if(u16PaddingLength < 8) { nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); u32Addr += SHA_BLOCK_SIZE; m2m_memset(pstrSHA256->au8CurrentBlock, 0, SHA_BLOCK_SIZE); u16NBlocks ++; } /* pack the length at the end of the padding block */ PUTU32(pstrSHA256->u32TotalLength << 3, pstrSHA256->au8CurrentBlock, (SHA_BLOCK_SIZE - 4)); u32ReadAddr = u32WriteAddr + (u16NBlocks * SHA_BLOCK_SIZE); nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); nm_write_reg(SHA256_DATA_LENGTH, (u16NBlocks * SHA_BLOCK_SIZE)); nm_write_reg(SHA256_START_RD_ADDR, u32WriteAddr); nm_write_reg(SHA256_START_WR_ADDR, u32ReadAddr); u32RegVal |= SHA256_CTRL_START_CALC_MASK; u32RegVal |= SHA256_CTRL_WR_BACK_HASH_VALUE_MASK; u32RegVal &= ~(0x7UL << 8); u32RegVal |= (0x2UL << 8); nm_write_reg(SHA256_CTRL,u32RegVal); /* 5. Wait for done_intr */ while(!u8IsDone) { u32RegVal = nm_read_reg(SHA256_DONE_INTR_STS); u8IsDone = u32RegVal & NBIT0; } nm_read_block(u32ReadAddr, (uint8*)au32Digest, 32); /* Convert the output words to an array of bytes. */ u32ByteIdx = 0; for(u32Idx = 0; u32Idx < (M2M_SHA256_DIGEST_LEN / 4); u32Idx ++) { pu8Sha256Digest[u32ByteIdx ++] = BYTE_3(au32Digest[u32Idx]); pu8Sha256Digest[u32ByteIdx ++] = BYTE_2(au32Digest[u32Idx]); pu8Sha256Digest[u32ByteIdx ++] = BYTE_1(au32Digest[u32Idx]); pu8Sha256Digest[u32ByteIdx ++] = BYTE_0(au32Digest[u32Idx]); } s8Ret = M2M_SUCCESS; } return s8Ret; }
sint8 hif_init(void * arg) { m2m_memset((uint8*) &gstrAppReqList, 0, sizeof(gstrAppReqList)); return M2M_SUCCESS; }
/** * @fn m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr, uint8 grp) * @brief WiFi call back function * @param [in] u8OpCode * HIF Opcode type. * @param [in] u16DataSize * HIF data length. * @param [in] u32Addr * HIF address. * @param [in] grp * HIF group type. * @author * @date * @version 1.0 */ static void m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) { uint8 rx_buf[8]; if (u8OpCode == M2M_WIFI_RESP_CON_STATE_CHANGED) { tstrM2mWifiStateChanged strState; if (hif_receive(u32Addr, (uint8*) &strState,sizeof(tstrM2mWifiStateChanged), 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_CON_STATE_CHANGED, &strState); } } else if(u8OpCode == M2M_WIFI_RESP_CONN_INFO) { tstrM2MConnInfo strConnInfo; if(hif_receive(u32Addr, (uint8*)&strConnInfo, sizeof(tstrM2MConnInfo), 1) == M2M_SUCCESS) { if(gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_CONN_INFO, &strConnInfo); } } else if (u8OpCode == M2M_WIFI_RESP_MEMORY_RECOVER) { #if 0 if (hif_receive(u32Addr, rx_buf, 4, 1) == M2M_SUCCESS) { tstrM2mWifiStateChanged strState; m2m_memcpy((uint8*) &strState, rx_buf,sizeof(tstrM2mWifiStateChanged)); if (app_wifi_recover_cb) app_wifi_recover_cb(strState.u8CurrState); } #endif } else if (u8OpCode == M2M_WIFI_REQ_DHCP_CONF) { tstrM2MIPConfig strIpConfig; if (hif_receive(u32Addr, (uint8 *)&strIpConfig, sizeof(tstrM2MIPConfig), 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_REQ_DHCP_CONF, (uint8 *)&strIpConfig.u32StaticIP); } } else if (u8OpCode == M2M_WIFI_REQ_WPS) { tstrM2MWPSInfo strWps; m2m_memset((uint8*)&strWps,0,sizeof(tstrM2MWPSInfo)); if(hif_receive(u32Addr, (uint8*)&strWps, sizeof(tstrM2MWPSInfo), 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_REQ_WPS, &strWps); } } else if (u8OpCode == M2M_WIFI_RESP_IP_CONFLICT) { tstrM2MIPConfig strIpConfig; if(hif_receive(u32Addr, (uint8 *)&strIpConfig, sizeof(tstrM2MIPConfig), 0) == M2M_SUCCESS) { M2M_DBG("Conflicted IP\"%u.%u.%u.%u\"\n", ((uint8 *)&strIpConfig.u32StaticIP)[0], ((uint8 *)&strIpConfig.u32StaticIP)[1], ((uint8 *)&strIpConfig.u32StaticIP)[2], ((uint8 *)&strIpConfig.u32StaticIP)[3]); if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_IP_CONFLICT, NULL); } } else if (u8OpCode == M2M_WIFI_RESP_SCAN_DONE) { tstrM2mScanDone strState; gu8scanInProgress = 0; if(hif_receive(u32Addr, (uint8*)&strState, sizeof(tstrM2mScanDone), 0) == M2M_SUCCESS) { gu8ChNum = strState.u8NumofCh; if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_SCAN_DONE, &strState); } } else if (u8OpCode == M2M_WIFI_RESP_SCAN_RESULT) { tstrM2mWifiscanResult strScanResult; if(hif_receive(u32Addr, (uint8*)&strScanResult, sizeof(tstrM2mWifiscanResult), 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_SCAN_RESULT, &strScanResult); } } else if (u8OpCode == M2M_WIFI_RESP_CURRENT_RSSI) { if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_CURRENT_RSSI, rx_buf); } } else if (u8OpCode == M2M_WIFI_RESP_CLIENT_INFO) { if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_CLIENT_INFO, rx_buf); } } else if(u8OpCode == M2M_WIFI_RESP_PROVISION_INFO) { tstrM2MProvisionInfo strProvInfo; if(hif_receive(u32Addr, (uint8*)&strProvInfo, sizeof(tstrM2MProvisionInfo), 1) == M2M_SUCCESS) { if(gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_PROVISION_INFO, &strProvInfo); } } else if(u8OpCode == M2M_WIFI_RESP_DEFAULT_CONNECT) { tstrM2MDefaultConnResp strResp; if(hif_receive(u32Addr, (uint8*)&strResp, sizeof(tstrM2MDefaultConnResp), 1) == M2M_SUCCESS) { if(gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_DEFAULT_CONNECT, &strResp); } } #ifdef ETH_MODE else if(u8OpCode == M2M_WIFI_RESP_ETHERNET_RX_PACKET) { if(hif_receive(u32Addr, rx_buf ,sizeof(tstrM2mIpRsvdPkt), 0) == M2M_SUCCESS) { tstrM2mIpRsvdPkt * pstrM2MIpRxPkt = (tstrM2mIpRsvdPkt*)rx_buf; tstrM2mIpCtrlBuf strM2mIpCtrlBuf; uint16 u16Offset = pstrM2MIpRxPkt->u16PktOffset; strM2mIpCtrlBuf.u16RemainigDataSize = pstrM2MIpRxPkt->u16PktSz; if((gpfAppEthCb) &&(gau8ethRcvBuf)&& (gu16ethRcvBufSize > 0)) { while (strM2mIpCtrlBuf.u16RemainigDataSize > 0) { if(strM2mIpCtrlBuf.u16RemainigDataSize > gu16ethRcvBufSize) { strM2mIpCtrlBuf.u16DataSize = gu16ethRcvBufSize ; } else { strM2mIpCtrlBuf.u16DataSize = strM2mIpCtrlBuf.u16RemainigDataSize; } if(hif_receive(u32Addr+u16Offset, gau8ethRcvBuf, strM2mIpCtrlBuf.u16DataSize, 0) == M2M_SUCCESS) { strM2mIpCtrlBuf.u16RemainigDataSize -= strM2mIpCtrlBuf.u16DataSize; u16Offset += strM2mIpCtrlBuf.u16DataSize; gpfAppEthCb(M2M_WIFI_RESP_ETHERNET_RX_PACKET, gau8ethRcvBuf, &(strM2mIpCtrlBuf)); } else { break; } } } } } #endif #ifdef CONF_MGMT else if(u8OpCode == M2M_WIFI_RESP_WIFI_RX_PACKET) { tstrM2MWifiRxPacketInfo strRxPacketInfo; if(hif_receive(u32Addr, (uint8*)&strRxPacketInfo, sizeof(tstrM2MWifiRxPacketInfo), 0) == M2M_SUCCESS) { u16DataSize -= sizeof(tstrM2MWifiRxPacketInfo); if(gstrMgmtCtrl.pu8Buf != NULL) { if(u16DataSize > (gstrMgmtCtrl.u16Sz + gstrMgmtCtrl.u16Offset)) { u16DataSize = gstrMgmtCtrl.u16Sz; } u32Addr += sizeof(tstrM2MWifiRxPacketInfo) + gstrMgmtCtrl.u16Offset; if(hif_receive(u32Addr , gstrMgmtCtrl.pu8Buf, u16DataSize, 1) != M2M_SUCCESS) { u16DataSize = 0; } } if(gpfAppMonCb) gpfAppMonCb(&strRxPacketInfo, gstrMgmtCtrl.pu8Buf,u16DataSize); } } #endif else { M2M_ERR("REQ Not defined %d\n",u8OpCode); } }
/** * @fn m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr, uint8 grp) * @brief WiFi call back function * @param [in] u8OpCode * HIF Opcode type. * @param [in] u16DataSize * HIF data length. * @param [in] u32Addr * HIF address. * @param [in] grp * HIF group type. * @author * @date * @version 1.0 */ static void m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) { uint8 rx_buf[8]; if (u8OpCode == M2M_WIFI_RESP_CON_STATE_CHANGED) { tstrM2mWifiStateChanged strState; if (hif_receive(u32Addr, (uint8*) &strState,sizeof(tstrM2mWifiStateChanged), 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_CON_STATE_CHANGED, &strState); } } else if (u8OpCode == M2M_WIFI_RESP_GET_SYS_TIME) { tstrSystemTime strSysTime; if (hif_receive(u32Addr, (uint8*) &strSysTime,sizeof(tstrSystemTime), 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_GET_SYS_TIME, &strSysTime); } } else if(u8OpCode == M2M_WIFI_RESP_CONN_INFO) { tstrM2MConnInfo strConnInfo; if(hif_receive(u32Addr, (uint8*)&strConnInfo, sizeof(tstrM2MConnInfo), 1) == M2M_SUCCESS) { if(gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_CONN_INFO, &strConnInfo); } } else if (u8OpCode == M2M_WIFI_RESP_MEMORY_RECOVER) { #if 0 if (hif_receive(u32Addr, rx_buf, 4, 1) == M2M_SUCCESS) { tstrM2mWifiStateChanged strState; m2m_memcpy((uint8*) &strState, rx_buf,sizeof(tstrM2mWifiStateChanged)); if (app_wifi_recover_cb) app_wifi_recover_cb(strState.u8CurrState); } #endif } else if (u8OpCode == M2M_WIFI_REQ_DHCP_CONF) { tstrM2MIPConfig strIpConfig; if (hif_receive(u32Addr, (uint8 *)&strIpConfig, sizeof(tstrM2MIPConfig), 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_REQ_DHCP_CONF, (uint8 *)&strIpConfig); } } else if (u8OpCode == M2M_WIFI_REQ_WPS) { tstrM2MWPSInfo strWps; m2m_memset((uint8*)&strWps,0,sizeof(tstrM2MWPSInfo)); if(hif_receive(u32Addr, (uint8*)&strWps, sizeof(tstrM2MWPSInfo), 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_REQ_WPS, &strWps); } } else if (u8OpCode == M2M_WIFI_RESP_IP_CONFLICT) { uint32 u32ConflictedIP; if(hif_receive(u32Addr, (uint8 *)&u32ConflictedIP, sizeof(u32ConflictedIP), 0) == M2M_SUCCESS) { M2M_INFO("Conflicted IP \" %u.%u.%u.%u \" \n", BYTE_0(u32ConflictedIP),BYTE_1(u32ConflictedIP),BYTE_2(u32ConflictedIP),BYTE_3(u32ConflictedIP)); if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_IP_CONFLICT, NULL); } } else if (u8OpCode == M2M_WIFI_RESP_SCAN_DONE) { tstrM2mScanDone strState; gu8scanInProgress = 0; if(hif_receive(u32Addr, (uint8*)&strState, sizeof(tstrM2mScanDone), 0) == M2M_SUCCESS) { gu8ChNum = strState.u8NumofCh; if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_SCAN_DONE, &strState); } } else if (u8OpCode == M2M_WIFI_RESP_SCAN_RESULT) { tstrM2mWifiscanResult strScanResult; if(hif_receive(u32Addr, (uint8*)&strScanResult, sizeof(tstrM2mWifiscanResult), 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_SCAN_RESULT, &strScanResult); } } else if (u8OpCode == M2M_WIFI_RESP_CURRENT_RSSI) { if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_CURRENT_RSSI, rx_buf); } } else if (u8OpCode == M2M_WIFI_RESP_CLIENT_INFO) { if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) { if (gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_CLIENT_INFO, rx_buf); } } else if(u8OpCode == M2M_WIFI_RESP_PROVISION_INFO) { tstrM2MProvisionInfo strProvInfo; if(hif_receive(u32Addr, (uint8*)&strProvInfo, sizeof(tstrM2MProvisionInfo), 1) == M2M_SUCCESS) { if(gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_PROVISION_INFO, &strProvInfo); } } else if(u8OpCode == M2M_WIFI_RESP_DEFAULT_CONNECT) { tstrM2MDefaultConnResp strResp; if(hif_receive(u32Addr, (uint8*)&strResp, sizeof(tstrM2MDefaultConnResp), 1) == M2M_SUCCESS) { if(gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_DEFAULT_CONNECT, &strResp); } } else if(u8OpCode == M2M_WIFI_RESP_GET_PRNG) { tstrPrng strPrng; if(hif_receive(u32Addr, (uint8*)&strPrng,sizeof(tstrPrng), 0) == M2M_SUCCESS) { if(hif_receive(u32Addr + sizeof(tstrPrng),strPrng.pu8RngBuff,strPrng.u16PrngSize, 1) == M2M_SUCCESS) { if(gpfAppWifiCb) gpfAppWifiCb(M2M_WIFI_RESP_GET_PRNG,&strPrng); } } } #ifdef ETH_MODE else if(u8OpCode == M2M_WIFI_RESP_ETHERNET_RX_PACKET) { uint8 u8SetRxDone; tstrM2mIpRsvdPkt strM2mRsvd; if(hif_receive(u32Addr, &strM2mRsvd ,sizeof(tstrM2mIpRsvdPkt), 0) == M2M_SUCCESS) { tstrM2mIpCtrlBuf strM2mIpCtrlBuf; uint16 u16Offset = strM2mRsvd.u16PktOffset; strM2mIpCtrlBuf.u16RemainigDataSize = strM2mRsvd.u16PktSz; if((gpfAppEthCb) && (gau8ethRcvBuf) && (gu16ethRcvBufSize > 0)) { do { u8SetRxDone = 1; if(strM2mIpCtrlBuf.u16RemainigDataSize > gu16ethRcvBufSize) { u8SetRxDone = 0; strM2mIpCtrlBuf.u16DataSize = gu16ethRcvBufSize; } else { strM2mIpCtrlBuf.u16DataSize = strM2mIpCtrlBuf.u16RemainigDataSize; } if(hif_receive(u32Addr + u16Offset, gau8ethRcvBuf, strM2mIpCtrlBuf.u16DataSize, u8SetRxDone) == M2M_SUCCESS) { strM2mIpCtrlBuf.u16RemainigDataSize -= strM2mIpCtrlBuf.u16DataSize; u16Offset += strM2mIpCtrlBuf.u16DataSize; gpfAppEthCb(M2M_WIFI_RESP_ETHERNET_RX_PACKET, gau8ethRcvBuf, &(strM2mIpCtrlBuf)); } else { break; } }while (strM2mIpCtrlBuf.u16RemainigDataSize > 0); } } } #endif /* ETH_MODE */ #ifdef CONF_MGMT else if(u8OpCode == M2M_WIFI_RESP_WIFI_RX_PACKET) { tstrM2MWifiRxPacketInfo strRxPacketInfo; if(u16DataSize >= sizeof(tstrM2MWifiRxPacketInfo)) { if(hif_receive(u32Addr, (uint8*)&strRxPacketInfo, sizeof(tstrM2MWifiRxPacketInfo), 0) == M2M_SUCCESS) { u16DataSize -= sizeof(tstrM2MWifiRxPacketInfo); if(u16DataSize > 0 && gstrMgmtCtrl.pu8Buf != NULL) { if(u16DataSize > (gstrMgmtCtrl.u16Sz + gstrMgmtCtrl.u16Offset)) { u16DataSize = gstrMgmtCtrl.u16Sz; } u32Addr += sizeof(tstrM2MWifiRxPacketInfo) + gstrMgmtCtrl.u16Offset; if(hif_receive(u32Addr , gstrMgmtCtrl.pu8Buf, u16DataSize, 1) != M2M_SUCCESS) return; } if(gpfAppMonCb) gpfAppMonCb(&strRxPacketInfo, gstrMgmtCtrl.pu8Buf,u16DataSize); } } else { M2M_ERR("Incorrect mon data size %u\n", u16DataSize); } } #endif else { M2M_ERR("REQ Not defined %d\n",u8OpCode); } }