sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig* pstrM2MAPConfig) { sint8 ret = M2M_SUCCESS; #if defined(M2M_WILC1000) && defined(COMPUTE_PMK_IN_HOST) if(pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_WPA_PSK) { tstrM2MAPConfig strTempM2MAPConfig; m2m_memcpy((uint8 *)&strTempM2MAPConfig, (uint8 *)pstrM2MAPConfig, sizeof(tstrM2MAPConfig)); strTempM2MAPConfig.u8IsPMKUsed = 1; pbkdf2_sha1((uint8 *)pstrM2MAPConfig->au8PSK,m2m_strlen((uint8 *)pstrM2MAPConfig->au8PSK), (uint8 *)pstrM2MAPConfig->au8SSID,m2m_strlen((uint8 *)pstrM2MAPConfig->au8SSID),strTempM2MAPConfig.au8PMK); pstrM2MAPConfig = &strTempM2MAPConfig; } #elif defined(M2M_WILC1000) && !defined(COMPUTE_PMK_IN_HOST) if(pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_WPA_PSK) { tstrM2MAPConfig strTempM2MAPConfig; strTempM2MAPConfig.u8IsPMKUsed = 0; m2m_memcpy((uint8*)&strTempM2MAPConfig,(uint8*)pstrM2MAPConfig,sizeof(tstrM2MAPConfig)); pstrM2MAPConfig = &strTempM2MAPConfig; } #endif ret = hif_send(M2M_REQ_GRP_WIFI, M2M_WIFI_REQ_ENABLE_AP, (uint8 *)pstrM2MAPConfig, sizeof(tstrM2MAPConfig), NULL, 0, 0); return ret; }
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_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, uint8 bEnableHttpRedirect) { sint8 s8Ret = M2M_ERR_FAIL; if((pstrAPConfig != NULL)) { tstrM2MProvisionModeConfig strProvConfig; if(M2M_SUCCESS == m2m_validate_ap_parameters(pstrAPConfig)) { m2m_memcpy((uint8*)&strProvConfig.strApConfig, (uint8*)pstrAPConfig, sizeof(tstrM2MAPConfig)); if((m2m_strlen((uint8 *)pcHttpServerDomainName) <= 0) || (NULL == pcHttpServerDomainName)) { M2M_ERR("INVALID DOMAIN NAME\n"); goto ERR1; } m2m_memcpy((uint8*)strProvConfig.acHttpServerDomainName, (uint8*)pcHttpServerDomainName, 64); strProvConfig.u8EnableRedirect = bEnableHttpRedirect; /* Stop Scan if it is ongoing. */ gu8scanInProgress = 0; s8Ret = hif_send(M2M_REQ_GRP_WIFI, M2M_WIFI_REQ_START_PROVISION_MODE | M2M_REQ_DATA_PKT, (uint8*)&strProvConfig, sizeof(tstrM2MProvisionModeConfig), NULL, 0, 0); } else { /*goto ERR1;*/ } } ERR1: return s8Ret; }
/*! @fn \ NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl); @brief Request OTA start update using the downloaded url @param [in] u8DownloadUrl The download firmware url, you get it from device info @return The function SHALL return 0 for success and a negative value otherwise. */ NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl) { sint8 ret = M2M_SUCCESS; uint16 u16DurlSize = m2m_strlen(u8DownloadUrl) + 1; /*Todo: we may change it to data pkt but we need to give it higer priority but the priorty is not implemnted yet in data pkt */ ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_START_UPDATE,u8DownloadUrl,u16DurlSize,NULL,0,0); return ret; }
static void set_dev_name_to_mac(uint8_t *name, uint8_t *mac_addr) { /* Name must be in the format WINC1500_00:00 */ uint16 len; len = m2m_strlen(name); if (len >= 5) { name[len - 1] = MAIN_HEX2ASCII((mac_addr[5] >> 0) & 0x0f); name[len - 2] = MAIN_HEX2ASCII((mac_addr[5] >> 4) & 0x0f); name[len - 4] = MAIN_HEX2ASCII((mac_addr[4] >> 0) & 0x0f); name[len - 5] = MAIN_HEX2ASCII((mac_addr[4] >> 4) & 0x0f); }
/********************************************************************* Function gethostbyname Description Return None. Author Ahmed Ezzat Version 1.0 Date 4 June 2012 *********************************************************************/ sint8 gethostbyname(uint8 * pcHostName) { sint8 s8Err = SOCK_ERR_INVALID_ARG; uint8 u8HostNameSize = (uint8)m2m_strlen(pcHostName); if(u8HostNameSize <= HOSTNAME_MAX_SIZE) { s8Err = SOCKET_REQUEST(SOCKET_CMD_DNS_RESOLVE|M2M_REQ_DATA_PKT, (uint8*)pcHostName, u8HostNameSize + 1, NULL,0, 0); if(s8Err != SOCK_ERR_NO_ERROR) { s8Err = SOCK_ERR_INVALID; } } return s8Err; }
int WiFiClient::connect(IPAddress ip, uint16_t port, uint8_t opt, const uint8_t *hostname) { struct sockaddr_in addr; // Initialize socket address structure: addr.sin_family = AF_INET; addr.sin_port = _htons(port); addr.sin_addr.s_addr = ip; // Create TCP socket: _flag = 0; _head = 0; _tail = 0; if ((_socket = socket(AF_INET, SOCK_STREAM, opt)) < 0) { return 0; } if (opt & SOCKET_FLAGS_SSL && hostname) { setsockopt(_socket, SOL_SSL_SOCKET, SO_SSL_SNI, hostname, m2m_strlen((uint8_t *)hostname)); } // Add socket buffer handler: socketBufferRegister(_socket, &_flag, &_head, &_tail, (uint8 *)_buffer); // Connect to remote host: if (connectSocket(_socket, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { close(_socket); _socket = -1; return 0; } // Wait for connection or timeout: unsigned long start = millis(); while (!IS_CONNECTED && millis() - start < 20000) { m2m_wifi_handle_events(NULL); } if (!IS_CONNECTED) { close(_socket); _socket = -1; return 0; } WiFi._client[_socket] = this; return 1; }
sint8 m2m_wifi_connect(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch) { sint8 ret = M2M_SUCCESS; tstrM2mWifiConnect strConnect; tstrM2MWifiSecInfo *pstrAuthInfo; if(u8SecType != M2M_WIFI_SEC_OPEN) { if((pvAuthInfo == NULL)||(m2m_strlen(pvAuthInfo)<=0)||(m2m_strlen(pvAuthInfo)>=M2M_MAX_PSK_LEN)) { M2M_ERR("PSK LEN INVALID\n"); ret = M2M_ERR_FAIL; goto ERR1; } } if((u8SsidLen<=0)||(u8SsidLen>=M2M_MAX_SSID_LEN)) { M2M_ERR("SSID LEN INVALID\n"); ret = M2M_ERR_FAIL; goto ERR1; } if(u16Ch>M2M_WIFI_CH_14) { if(u16Ch!=M2M_WIFI_CH_ALL) { M2M_ERR("CH INVALID\n"); ret = M2M_ERR_FAIL; goto ERR1; } } m2m_memcpy(strConnect.au8SSID, (uint8*)pcSsid, u8SsidLen); strConnect.au8SSID[u8SsidLen] = 0; strConnect.u16Ch = NM_BSP_B_L_16(u16Ch); pstrAuthInfo = &strConnect.strSec; pstrAuthInfo->u8SecType = u8SecType; if(u8SecType == M2M_WIFI_SEC_WEP) { tstrM2mWifiWepParams * pstrWepParams = (tstrM2mWifiWepParams*)pvAuthInfo; tstrM2mWifiWepParams *pstrWep = &pstrAuthInfo->uniAuth.strWepInfo; pstrWep->u8KeyIndx =pstrWepParams->u8KeyIndx-1; if(pstrWep->u8KeyIndx >= WEP_KEY_MAX_INDEX) { M2M_ERR("Invalid Wep key index %d\n", pstrWep->u8KeyIndx); ret = M2M_ERR_FAIL; goto ERR1; } pstrWep->u8KeySz = pstrWepParams->u8KeySz-1; if ((pstrWep->u8KeySz != WEP_40_KEY_STRING_SIZE)&& (pstrWep->u8KeySz != WEP_104_KEY_STRING_SIZE)) { M2M_ERR("Invalid Wep key length %d\n", pstrWep->u8KeySz); ret = M2M_ERR_FAIL; goto ERR1; } m2m_memcpy((uint8*)pstrWep->au8WepKey,(uint8*)pstrWepParams->au8WepKey, pstrWepParams->u8KeySz); pstrWep->au8WepKey[pstrWepParams->u8KeySz] = 0; } else if(u8SecType == M2M_WIFI_SEC_WPA_PSK) { uint8 u8KeyLen = m2m_strlen((uint8*)pvAuthInfo) + 1; m2m_memcpy(pstrAuthInfo->uniAuth.au8PSK, (uint8*)pvAuthInfo, u8KeyLen); } else if(u8SecType == M2M_WIFI_SEC_802_1X) { m2m_memcpy((uint8*)&pstrAuthInfo->uniAuth.strCred1x, (uint8*)pvAuthInfo, sizeof(tstr1xAuthCredentials)); } else if(u8SecType == M2M_WIFI_SEC_OPEN) { } else { M2M_ERR("undefined sec type\n"); ret = M2M_ERR_FAIL; goto ERR1; } ret = hif_send(M2M_REQ_GRP_WIFI, M2M_WIFI_REQ_CONNECT, (uint8*)&strConnect, sizeof(tstrM2mWifiConnect),NULL, 0,0); ERR1: return ret; }
static sint8 m2m_validate_ap_parameters(CONST tstrM2MAPConfig* pstrM2MAPConfig) { sint8 s8Ret = M2M_SUCCESS; /* Check for incoming pointer */ if(pstrM2MAPConfig == NULL) { M2M_ERR("INVALID POINTER\n"); s8Ret = M2M_ERR_FAIL; goto ERR1; } /* Check for SSID */ if((m2m_strlen((uint8 *)pstrM2MAPConfig->au8SSID) <= 0) || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8SSID) >= M2M_MAX_SSID_LEN)) { M2M_ERR("INVALID SSID\n"); s8Ret = M2M_ERR_FAIL; goto ERR1; } /* Check for Channel */ if(pstrM2MAPConfig->u8ListenChannel > M2M_WIFI_CH_14 || pstrM2MAPConfig->u8ListenChannel < M2M_WIFI_CH_1) { M2M_ERR("INVALID CH\n"); s8Ret = M2M_ERR_FAIL; goto ERR1; } /* Check for DHCP Server IP address */ if(!(pstrM2MAPConfig->au8DHCPServerIP[0] || pstrM2MAPConfig->au8DHCPServerIP[1])) { if(!(pstrM2MAPConfig->au8DHCPServerIP[2])) { M2M_ERR("INVALID DHCP SERVER IP\n"); s8Ret = M2M_ERR_FAIL; goto ERR1; } } /* Check for Security */ if(pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_OPEN) { goto ERR1; } else if(pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_WEP) { /* Check for WEP Key index */ if((pstrM2MAPConfig->u8KeyIndx <= 0) || (pstrM2MAPConfig->u8KeyIndx > WEP_KEY_MAX_INDEX)) { M2M_ERR("INVALID KEY INDEX\n"); s8Ret = M2M_ERR_FAIL; goto ERR1; } /* Check for WEP Key size */ if( (pstrM2MAPConfig->u8KeySz != WEP_40_KEY_STRING_SIZE) && (pstrM2MAPConfig->u8KeySz != WEP_104_KEY_STRING_SIZE) ) { M2M_ERR("INVALID KEY SIZE\n"); s8Ret = M2M_ERR_FAIL; goto ERR1; } /* Check for WEP Key */ if((pstrM2MAPConfig->au8WepKey == NULL) || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8WepKey) <= 0) || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8WepKey) > WEP_104_KEY_STRING_SIZE)) { M2M_ERR("INVALID WEP KEY\n"); s8Ret = M2M_ERR_FAIL; goto ERR1; } } else { M2M_ERR("INVALID AUTHENTICATION MODE\n"); s8Ret = M2M_ERR_FAIL; goto ERR1; } ERR1: return s8Ret; }
sint8 m2m_wifi_connect_sc(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch, uint8 u8NoSaveCred) { sint8 ret = M2M_SUCCESS; tstrM2mWifiConnect strConnect; tstrM2MWifiSecInfo *pstrAuthInfo; if(u8SecType != M2M_WIFI_SEC_OPEN) { if(pvAuthInfo == NULL) { M2M_ERR("Key is not valid\n"); ret = M2M_ERR_FAIL; goto ERR1; } if((u8SecType == M2M_WIFI_SEC_WPA_PSK) && (m2m_strlen(pvAuthInfo) == (M2M_MAX_PSK_LEN-1))) { uint8 i = 0; uint8* pu8Psk = (uint8*)pvAuthInfo; while(i < (M2M_MAX_PSK_LEN-1)) { if(pu8Psk[i]<'0' || (pu8Psk[i]>'9' && pu8Psk[i] < 'A')|| (pu8Psk[i]>'F' && pu8Psk[i] < 'a') || pu8Psk[i] > 'f') { M2M_ERR("Invalid Key\n"); ret = M2M_ERR_FAIL; goto ERR1; } i++; } } } if((u8SsidLen<=0)||(u8SsidLen>=M2M_MAX_SSID_LEN)) { M2M_ERR("SSID LEN INVALID\n"); ret = M2M_ERR_FAIL; goto ERR1; } if(u16Ch>M2M_WIFI_CH_14) { if(u16Ch!=M2M_WIFI_CH_ALL) { M2M_ERR("CH INVALID\n"); ret = M2M_ERR_FAIL; goto ERR1; } } m2m_memcpy(strConnect.au8SSID, (uint8*)pcSsid, u8SsidLen); strConnect.au8SSID[u8SsidLen] = 0; strConnect.u16Ch = NM_BSP_B_L_16(u16Ch); /* Credentials will be Not be saved if u8NoSaveCred is set */ strConnect.u8NoSaveCred = u8NoSaveCred ? 1:0; pstrAuthInfo = &strConnect.strSec; pstrAuthInfo->u8SecType = u8SecType; if(u8SecType == M2M_WIFI_SEC_WEP) { tstrM2mWifiWepParams * pstrWepParams = (tstrM2mWifiWepParams*)pvAuthInfo; tstrM2mWifiWepParams *pstrWep = &pstrAuthInfo->uniAuth.strWepInfo; pstrWep->u8KeyIndx =pstrWepParams->u8KeyIndx-1; if(pstrWep->u8KeyIndx >= WEP_KEY_MAX_INDEX) { M2M_ERR("Invalid Wep key index %d\n", pstrWep->u8KeyIndx); ret = M2M_ERR_FAIL; goto ERR1; } pstrWep->u8KeySz = pstrWepParams->u8KeySz-1; if ((pstrWep->u8KeySz != WEP_40_KEY_STRING_SIZE)&& (pstrWep->u8KeySz != WEP_104_KEY_STRING_SIZE)) { M2M_ERR("Invalid Wep key length %d\n", pstrWep->u8KeySz); ret = M2M_ERR_FAIL; goto ERR1; } m2m_memcpy((uint8*)pstrWep->au8WepKey,(uint8*)pstrWepParams->au8WepKey, pstrWepParams->u8KeySz); pstrWep->au8WepKey[pstrWepParams->u8KeySz] = 0; } else if(u8SecType == M2M_WIFI_SEC_WPA_PSK) { uint16 u16KeyLen = m2m_strlen((uint8*)pvAuthInfo); if((u16KeyLen <= 0)||(u16KeyLen >= M2M_MAX_PSK_LEN)) { M2M_ERR("Incorrect PSK key length\n"); ret = M2M_ERR_FAIL; goto ERR1; } m2m_memcpy(pstrAuthInfo->uniAuth.au8PSK, (uint8*)pvAuthInfo, u16KeyLen + 1); } else if(u8SecType == M2M_WIFI_SEC_802_1X) { m2m_memcpy((uint8*)&pstrAuthInfo->uniAuth.strCred1x, (uint8*)pvAuthInfo, sizeof(tstr1xAuthCredentials)); } else if(u8SecType == M2M_WIFI_SEC_OPEN) { } else { M2M_ERR("undefined sec type\n"); ret = M2M_ERR_FAIL; goto ERR1; } ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, (uint8*)&strConnect, sizeof(tstrM2mWifiConnect),NULL, 0,0); ERR1: return ret; }