Enterprise mode + wifi configuraiton api

pull/10454/head
aqin 2019-05-08 17:52:04 +05:00
parent 46603f831e
commit 43759c0c4b
11 changed files with 646 additions and 41 deletions

View File

@ -20,4 +20,8 @@
#ifndef MBEDTLS_DEVICE_H
#define MBEDTLS_DEVICE_H
#ifdef TARGET_UBLOX_EVK_ODIN_W2
#define MBEDTLS_MPI_WINDOW_SIZE 3 /**< Maximum windows size used. */
#endif
#endif /* MBEDTLS_DEVICE_H */

View File

@ -125,6 +125,8 @@ typedef enum nsapi_security {
NSAPI_SECURITY_WPA_WPA2 = 0x4, /*!< phrase conforms to WPA/WPA2 */
NSAPI_SECURITY_PAP = 0x5, /*!< phrase conforms to PPP authentication context */
NSAPI_SECURITY_CHAP = 0x6, /*!< phrase conforms to PPP authentication context */
NSAPI_SECURITY_EAP_TLS = 0x7, /*!< phrase conforms to EAP-TLS */
NSAPI_SECURITY_PEAP = 0x8, /*!< phrase conforms to PEAP */
NSAPI_SECURITY_UNKNOWN = 0xFF, /*!< unknown/unsupported security in scan results */
} nsapi_security_t;

View File

@ -18,9 +18,16 @@
#include "cb_main.h"
#include "cb_wlan.h"
#include "cb_wlan_types.h"
#include "cb_wlan_driver_config.h"
#include "wifi_emac.h"
#include "netsocket/WiFiAccessPoint.h"
#include "enterprise_handle.h"
#define VALIDATE_CERT(X) \
if(strlen(X) > cbSECMNG_MAX_CERTIFICATE_SIZE){ \
return NSAPI_ERROR_PARAMETER; \
} \
#define ODIN_WIFI_BSSID_CACHE (5)
#define ODIN_WIFI_STA_DEFAULT_CONN_TMO (20000)
@ -51,8 +58,11 @@ struct user_connect_s {
const char *ssid;
const char *passwd;
uint8_t channel;
auth_cert_s *cert_handle;
nsapi_security_t security;
unsigned int timeout;
const char *user_name;
const char *user_passwd;
};
struct user_scan_s {
@ -112,6 +122,8 @@ static void set_wpa_rsn_cipher(
cbWLAN_CipherSuite &rsn_ciphers);
static bool is_valid_AP_channel(cbWLAN_Channel channel);
static cbTARGET_ConfigParams map_odin_config(target_config_params_e parameter);
static cbTARGET_PowerSaveMode convertPowerSaveAtToIoctl(target_power_save_mode_e powerSaveMode);
// Friend declared C-functions that calls corresponding wi-fi object member function
struct wlan_callb_s {
@ -230,6 +242,31 @@ nsapi_error_t OdinWiFiInterface::set_credentials(const char *ssid, const char *p
return NSAPI_ERROR_OK;
}
nsapi_error_t OdinWiFiInterface::set_certificates(const char *client_cert, const char *client_pvt_key , const char *ca_cert )
{
int size;
/* Check if client certificate is valid */
if((client_cert != NULL) && (*client_cert != '\0')) {
VALIDATE_CERT(client_cert);
_certs.client_cert = client_cert;
/* Check if private key is valid in case passed separately from client_cert */
if (client_pvt_key!= NULL){
VALIDATE_CERT(client_pvt_key);
}
/* If private key is passed as part of client cert it could be NULL */
_certs.client_prvt_key = client_pvt_key;
}
/* Check if ca certificate is valid */
if((ca_cert != NULL) || (*ca_cert != '\0' )) {
VALIDATE_CERT(ca_cert);
_certs.ca_cert = ca_cert;
}
return NSAPI_ERROR_OK;
}
nsapi_error_t OdinWiFiInterface::set_channel(uint8_t channel)
{
if (channel > 165 || (channel > 11 && channel < 36)){
@ -327,6 +364,82 @@ nsapi_error_t OdinWiFiInterface::connect(
return error_code;
}
nsapi_error_t OdinWiFiInterface::connect(
const char *ssid,
const char *pass,
nsapi_security_t security,
auth_cert_s *cert_handle,
const char *username,
const char *user_pswd,
uint8_t channel)
{
nsapi_error_t error_code = NSAPI_ERROR_OK;
osStatus ok;
if(ssid == NULL || *ssid == NULL || cert_handle == NULL) {
return NSAPI_ERROR_PARAMETER;
}
if((security == NSAPI_SECURITY_PEAP) && (username == NULL || user_pswd == NULL)) {
return NSAPI_ERROR_PARAMETER;
}
if((security == NSAPI_SECURITY_EAP_TLS) && (cert_handle->client_cert == NULL)) {
return NSAPI_ERROR_PARAMETER;
}
if((pass == NULL || *pass == NULL) && (security == NSAPI_SECURITY_WEP || security == NSAPI_SECURITY_WPA
|| security == NSAPI_SECURITY_WPA2 || security == NSAPI_SECURITY_WPA_WPA2)) {
return NSAPI_ERROR_PARAMETER;
}
// Allocate and initialize user_connect message
struct odin_wifi_msg_s* msg = _msg_pool->alloc();
MBED_ASSERT(msg != NULL);
msg->type = ODIN_WIFI_MSG_USER_CONNECT;
msg->data.user_connect.ssid = ssid; // Must be valid until task is completed
msg->data.user_connect.passwd = pass; // Must be valid until task is completed
msg->data.user_connect.security = security;
msg->data.user_connect.channel = channel;
msg->data.user_connect.cert_handle = cert_handle;
msg->data.user_connect.user_name = username;
msg->data.user_connect.user_passwd = user_pswd;
// Put user_connect message in input queue or cache queue
switch(_state) {
case S_STARTED:
ok = _in_queue.put(msg, 0);
MBED_ASSERT(ok == osOK);
break;
case S_WAIT_START:
ok = _cache_queue.put(msg, 0); // handle once we are started
MBED_ASSERT(ok == osOK);
break;
default:
MBED_ASSERT(false);
break;
}
// To synchronize, wait until response message is available
osEvent evt = _out_queue.get();
MBED_ASSERT(evt.status == osEventMessage);
msg = (odin_wifi_msg_s*)evt.value.p;
MBED_ASSERT(msg != 0);
MBED_ASSERT(msg->type == ODIN_WIFI_MSG_USER_CONNECT);
// Return the result of the connect call
error_code = msg->data.user_response.error;
ok = _msg_pool->free(msg);
MBED_ASSERT(ok == osOK);
return error_code;
}
nsapi_error_t OdinWiFiInterface::disconnect()
{
nsapi_error_t error_code = NSAPI_ERROR_OK;
@ -411,7 +524,35 @@ int OdinWiFiInterface::scan(WiFiAccessPoint *res_list, unsigned count)
return found_aps;
}
#if DEVICE_WIFI_AP
void OdinWiFiInterface::set_config(void *setting, cb_uint32 value) {
cbTARGET_ConfigParams param;
target_config_params_e configuration = *(target_config_params_e*)setting;
param = map_odin_config(configuration);
wlan_set_gParams(param, value);
}
void OdinWiFiInterface::wlan_set_gParams(cbTARGET_ConfigParams setting, cb_uint32 value) {
cbMAIN_driverLock();
cbTARGET_configure(cbTARGET_targetResolve(_target_id), setting, (void*)value);
cbMAIN_driverUnlock();
}
unsigned int OdinWiFiInterface::get_config(void *setting) {
cbTARGET_ConfigParams param;
target_config_params_e configuration = *(target_config_params_e*)setting;
param = map_odin_config(configuration);
return wlan_get_gParams(param);
}
unsigned int OdinWiFiInterface::wlan_get_gParams(cbTARGET_ConfigParams setting) {
cb_uint32 value = 0xFF;
cbMAIN_driverLock();
cbTARGET_configure(cbTARGET_targetResolve(_target_id), setting, (void*)&value);
cbMAIN_driverUnlock();
return value;
}
#ifdef DEVICE_WIFI_AP
nsapi_error_t OdinWiFiInterface::set_ap_network(const char *ip_address, const char *netmask, const char *gateway)
{
@ -869,7 +1010,10 @@ void OdinWiFiInterface::handle_user_connect(user_connect_s *user_connect)
error_code = wlan_set_channel(user_connect->channel);
if (error_code == NSAPI_ERROR_OK) {
error_code = wlan_connect(user_connect->ssid, user_connect->passwd, user_connect->security);
if((user_connect->security == NSAPI_SECURITY_PEAP) || (user_connect->security == NSAPI_SECURITY_EAP_TLS))
error_code = wlan_connect(user_connect->ssid, user_connect->passwd, user_connect->security, user_connect->cert_handle, user_connect->user_name, user_connect->user_passwd, user_connect->channel);
else
error_code = wlan_connect(user_connect->ssid, user_connect->passwd, user_connect->security);
}
}
else {
@ -1152,6 +1296,7 @@ void OdinWiFiInterface::handle_wlan_status_connected(wlan_status_connected_s *wl
MBED_ASSERT(wlan_connect != 0);
switch(_state_sta) {
case S_STA_CONNECTED:
case S_STA_WAIT_CONNECT:
_timer.stop();
@ -1255,14 +1400,11 @@ void OdinWiFiInterface::handle_wlan_status_disconnected(void)
_state_sta = S_STA_IDLE;
switch(_wlan_status_disconnected_info) {
case cbWLAN_STATUS_DISCONNECTED_NO_BSSID_FOUND:
error_code = NSAPI_ERROR_NO_SSID;
break;
case cbWLAN_STATUS_DISCONNECTED_AUTH_TIMEOUT:
case cbWLAN_STATUS_DISCONNECTED_MIC_FAILURE:
error_code = NSAPI_ERROR_AUTH_FAILURE;
break;
case cbWLAN_STATUS_DISCONNECTED_NO_BSSID_FOUND:
case cbWLAN_STATUS_DISCONNECTED_UNKNOWN:
error_code = NSAPI_ERROR_NO_CONNECTION;
break;
@ -1493,12 +1635,18 @@ nsapi_error_t OdinWiFiInterface::wlan_set_channel(uint8_t channel)
nsapi_error_t OdinWiFiInterface::wlan_connect(
const char *ssid,
const char *passwd,
nsapi_security_t security)
nsapi_security_t security,
auth_cert_s *cert_handle,
const char *username,
const char *user_pswd,
uint8_t channel)
{
nsapi_error_t error_code = NSAPI_ERROR_OK;
cbRTSL_Status status = cbSTATUS_OK;
cbWLAN_CommonConnectParameters connect_params;
nsapi_error_t error_code = NSAPI_ERROR_OK;
cbRTSL_Status status = cbSTATUS_OK;
cbWLAN_CommonConnectParameters connect_params;
cbWLAN_EnterpriseConnectParameters enterpriseParams;
memset(&enterpriseParams, 0, sizeof(cbWLAN_EnterpriseConnectParameters));
memset(&connect_params, 0, sizeof(cbWLAN_CommonConnectParameters));
strncpy((char*)connect_params.ssid.ssid, ssid, cbWLAN_SSID_MAX_LENGTH);
@ -1506,34 +1654,59 @@ nsapi_error_t OdinWiFiInterface::wlan_connect(
switch (security)
{
case NSAPI_SECURITY_NONE:
cbMAIN_driverLock();
status = cbWLAN_connectOpen(&connect_params);
cbMAIN_driverUnlock();
break;
case NSAPI_SECURITY_WPA:
case NSAPI_SECURITY_WPA2:
case NSAPI_SECURITY_WPA_WPA2:
char temp_passphrase[cbWLAN_MAX_PASSPHRASE_LENGTH];
cbWLAN_WPAPSKConnectParameters wpa_connect_params;
case NSAPI_SECURITY_NONE:
cbMAIN_driverLock();
status = cbWLAN_connectOpen(&connect_params);
cbMAIN_driverUnlock();
break;
case NSAPI_SECURITY_WPA:
case NSAPI_SECURITY_WPA2:
case NSAPI_SECURITY_WPA_WPA2:
char temp_passphrase[cbWLAN_MAX_PASSPHRASE_LENGTH];
cbWLAN_WPAPSKConnectParameters wpa_connect_params;
memset(temp_passphrase, 0, cbWLAN_MAX_PASSPHRASE_LENGTH);
strncpy(temp_passphrase, passwd, cbWLAN_MAX_PASSPHRASE_LENGTH);
memset(temp_passphrase, 0, cbWLAN_MAX_PASSPHRASE_LENGTH);
strncpy(temp_passphrase, passwd, cbWLAN_MAX_PASSPHRASE_LENGTH);
cbMAIN_driverLock();
status = cbWLAN_Util_PSKFromPWD(temp_passphrase, connect_params.ssid, wpa_connect_params.psk.key);
cbMAIN_driverLock();
status = cbWLAN_Util_PSKFromPWD(temp_passphrase, connect_params.ssid, wpa_connect_params.psk.key);
if (status == cbSTATUS_OK) {
status = cbWLAN_connectWPAPSK(&connect_params, &wpa_connect_params);
}
cbMAIN_driverUnlock();
if(_debug) {printf("cbWLAN_connect: %d\r\n", status);}
break;
if (status == cbSTATUS_OK) {
status = cbWLAN_connectWPAPSK(&connect_params, &wpa_connect_params);
}
cbMAIN_driverUnlock();
if(_debug) {printf("cbWLAN_connect: %d\r\n", status);}
break;
case NSAPI_SECURITY_WEP:
default:
status = cbSTATUS_ERROR;
break;
case NSAPI_SECURITY_EAP_TLS:
cbMAIN_driverLock();
enterpriseParams.authMode = cbWLAN_ENTERPRISE_MODE_EAPTLS;
if((cert_handle->client_cert == NULL) && _debug)
{
printf("No client certificate found in root \r\n");
}
status = cb_eap_conn_handler(cert_handle->client_cert, cert_handle->client_prvt_key, &connect_params, &enterpriseParams);
cbMAIN_driverUnlock();
if(_debug) {printf("cbWLAN_connect: %d\r\n", status);}
break;
case NSAPI_SECURITY_PEAP:
cbMAIN_driverLock();
enterpriseParams.authMode = cbWLAN_ENTERPRISE_MODE_PEAP;
strncpy((char*)enterpriseParams.username, username, cbWLAN_MAX_USERNAME_LENGTH);
strncpy((char*)enterpriseParams.passphrase, user_pswd, cbWLAN_MAX_USERNAME_LENGTH);
/* cert_handle->ca_cert could be NULL if client don;t need to verify server */
status = cb_eap_conn_handler(cert_handle->ca_cert, NULL, &connect_params, &enterpriseParams);
cbMAIN_driverUnlock();
if(_debug) {printf("cbWLAN_connect: %d\r\n", status);}
break;
case NSAPI_SECURITY_WEP:
default:
status = cbSTATUS_ERROR;
break;
}
if(status != cbSTATUS_OK) {
@ -1839,3 +2012,83 @@ static bool is_valid_AP_channel(cbWLAN_Channel channel)
return ok;
}
static cbTARGET_ConfigParams map_odin_config(target_config_params_e parameter)
{
switch (parameter) {
case ODIN_CFG_SET_POWER_SAVE_MODE: return cbTARGET_CFG_SET_POWER_SAVE_MODE;
case ODIN_CFG_GET_POWER_SAVE_MODE: return cbTARGET_CFG_GET_POWER_SAVE_MODE;
case ODIN_CFG_SET_LISTEN_INTERVAL: return cbTARGET_CFG_SET_LISTEN_INTERVAL;
case ODIN_CFG_GET_LISTEN_INTERVAL: return cbTARGET_CFG_GET_LISTEN_INTERVAL;
case ODIN_CFG_SET_MIN_SCAN_TIME: return cbTARGET_CFG_SET_MIN_SCAN_TIME;
case ODIN_CFG_GET_MIN_SCAN_TIME: return cbTARGET_CFG_GET_MIN_SCAN_TIME;
case ODIN_CFG_SET_MAX_SCAN_TIME: return cbTARGET_CFG_SET_MAX_SCAN_TIME;
case ODIN_CFG_GET_MAX_SCAN_TIME: return cbTARGET_CFG_GET_MAX_SCAN_TIME;
case ODIN_CFG_SET_SCAN_TYPE: return cbTARGET_CFG_SET_SCAN_TYPE;
case ODIN_CFG_GET_SCAN_TYPE: return cbTARGET_CFG_GET_SCAN_TYPE;
case ODIN_CFG_SET_DTIM_ENABLE: return cbTARGET_CFG_SET_DTIM_ENABLE;
case ODIN_CFG_GET_DTIM_ENABLE: return cbTARGET_CFG_GET_DTIM_ENABLE;
case ODIN_CFG_SET_QOS_ENABLE: return cbTARGET_CFG_SET_QOS_ENABLE;
case ODIN_CFG_GET_QOS_ENABLE: return cbTARGET_CFG_GET_QOS_ENABLE;
case ODIN_CFG_SET_RTS_THRESHOLD: return cbTARGET_CFG_SET_RTS_THRESHOLD;
case ODIN_CFG_GET_RTS_THRESHOLD: return cbTARGET_CFG_GET_RTS_THRESHOLD;
case ODIN_CFG_SET_TX_POWER: return cbTARGET_CFG_SET_TX_POWER;
case ODIN_CFG_GET_TX_POWER: return cbTARGET_CFG_GET_TX_POWER;
case ODIN_CFG_SET_MAX_PASSIVE_SCAN_TIME: return cbTARGET_CFG_SET_MAX_PASSIVE_SCAN_TIME;
case ODIN_CFG_GET_MAX_PASSIVE_SCAN_TIME: return cbTARGET_CFG_GET_MAX_PASSIVE_SCAN_TIME;
case ODIN_CFG_SET_SCAN_LISTEN_INTERVAL: return cbTARGET_CFG_SET_SCAN_LISTEN_INTERVAL;
case ODIN_CFG_GET_SCAN_LISTEN_INTERVAL: return cbTARGET_CFG_GET_SCAN_LISTEN_INTERVAL;
case ODIN_CFG_SET_DOT11_SHORT_RETRY_LIMIT: return cbTARGET_CFG_SET_DOT11_SHORT_RETRY_LIMIT;
case ODIN_CFG_GET_DOT11_SHORT_RETRY_LIMIT: return cbTARGET_CFG_GET_DOT11_SHORT_RETRY_LIMIT;
case ODIN_CFG_SET_DOT11_LONG_RETRY_LIMIT: return cbTARGET_CFG_SET_DOT11_LONG_RETRY_LIMIT;
case ODIN_CFG_GET_DOT11_LONG_RETRY_LIMIT: return cbTARGET_CFG_GET_DOT11_LONG_RETRY_LIMIT;
case ODIN_CFG_SET_AP_DOT11_SHORT_RETRY_LIMIT: return cbTARGET_CFG_SET_AP_DOT11_SHORT_RETRY_LIMIT;
case ODIN_CFG_GET_AP_DOT11_SHORT_RETRY_LIMIT: return cbTARGET_CFG_GET_AP_DOT11_SHORT_RETRY_LIMIT;
case ODIN_CFG_SET_AP_DOT11_LONG_RETRY_LIMIT: return cbTARGET_CFG_SET_AP_DOT11_LONG_RETRY_LIMIT;
case ODIN_CFG_GET_AP_DOT11_LONG_RETRY_LIMIT: return cbTARGET_CFG_GET_AP_DOT11_LONG_RETRY_LIMIT;
case ODIN_CFG_SET_REMAIN_ON_CHANNEL: return cbTARGET_CFG_SET_REMAIN_ON_CHANNEL;
case ODIN_CFG_GET_REMAIN_ON_CHANNEL: return cbTARGET_CFG_GET_REMAIN_ON_CHANNEL;
case ODIN_CFG_SET_STA_TX_RATE_MASK: return cbTARGET_CFG_SET_STA_TX_RATE_MASK;
case ODIN_CFG_GET_STA_TX_RATE_MASK: return cbTARGET_CFG_GET_STA_TX_RATE_MASK;
case ODIN_CFG_SET_RSSI_GOOD: return cbTARGET_CFG_SET_RSSI_GOOD;
case ODIN_CFG_GET_RSSI_GOOD: return cbTARGET_CFG_GET_RSSI_GOOD;
case ODIN_CFG_SET_RSSI_BAD: return cbTARGET_CFG_SET_RSSI_BAD;
case ODIN_CFG_GET_RSSI_BAD: return cbTARGET_CFG_GET_RSSI_BAD;
case ODIN_CFG_SET_SLEEP_TIMEOUT: return cbTARGET_CFG_SET_SLEEP_TIMEOUT;
case ODIN_CFG_GET_SLEEP_TIMEOUT: return cbTARGET_CFG_GET_SLEEP_TIMEOUT;
case ODIN_CFG_SET_GOOD_RSSI_YIELD_TMO: return cbTARGET_CFG_SET_GOOD_RSSI_YIELD_TMO;
case ODIN_CFG_GET_GOOD_RSSI_YIELD_TMO: return cbTARGET_CFG_GET_GOOD_RSSI_YIELD_TMO;
case ODIN_CFG_SET_BAD_RSSI_YIELD_TMO: return cbTARGET_CFG_SET_BAD_RSSI_YIELD_TMO;
case ODIN_CFG_GET_BAD_RSSI_YIELD_TMO: return cbTARGET_CFG_GET_BAD_RSSI_YIELD_TMO;
case ODIN_CFG_SET_FORCE_WORLD_MODE: return cbTARGET_CFG_SET_FORCE_WORLD_MODE;
case ODIN_CFG_GET_FORCE_WORLD_MODE: return cbTARGET_CFG_GET_FORCE_WORLD_MODE;
case ODIN_CFG_GET_TX_PACKET_ACK_TIMEOUT_WD: return cbTARGET_CFG_SET_TX_PACKET_ACK_TIMEOUT_WD;
case ODIN_CFG_SET_TX_PACKET_ACK_TIMEOUT_WD: return cbTARGET_CFG_GET_TX_PACKET_ACK_TIMEOUT_WD;
case ODIN_CFG_SET_CTS_PROTECTION: return cbTARGET_CFG_SET_CTS_PROTECTION;
case ODIN_CFG_GET_CTS_PROTECTION: return cbTARGET_CFG_GET_CTS_PROTECTION;
case ODIN_CFG_SET_HIDDEN_SSID: return cbTARGET_CFG_SET_HIDDEN_SSID;
case ODIN_CFG_GET_HIDDEN_SSID: return cbTARGET_CFG_GET_HIDDEN_SSID;
case ODIN_CFG_SET_AP_STA_INACTIVITY_TIMEOUT: return cbTARGET_CFG_SET_AP_STA_INACTIVITY_TIMEOUT;
case ODIN_CFG_GET_AP_STA_INACTIVITY_TIMEOUT: return cbTARGET_CFG_GET_AP_STA_INACTIVITY_TIMEOUT;
case ODIN_CFG_SET_ROAMING_AREA_HYSTERESIS: return cbTARGET_CFG_SET_ROAMING_AREA_HYSTERESIS;
case ODIN_CFG_GET_ROAMING_AREA_HYSTERESIS: return cbTARGET_CFG_GET_ROAMING_AREA_HYSTERESIS;
case ODIN_CFG_SET_PMF_STA: return cbTARGET_CFG_SET_PMF_STA;
case ODIN_CFG_GET_PMF_STA: return cbTARGET_CFG_GET_PMF_STA;
case ODIN_CFG_SET_FT_MODE: return cbTARGET_CFG_SET_FT_MODE;
case ODIN_CFG_GET_FT_MODE: return cbTARGET_CFG_GET_FT_MODE;
default:
MBED_ASSERT(false);
}
}
static cbTARGET_PowerSaveMode convertPowerSaveAtToIoctl(target_power_save_mode_e powerSaveMode)
{
switch (powerSaveMode) {
case ODIN_POWER_SAVE_MODE_OFF: return cbTARGET_POWER_SAVE_MODE_OFF;
case ODIN_POWER_SAVE_MODE_SLEEP: return cbTARGET_POWER_SAVE_MODE_SLEEP;
case ODIN_POWER_SAVE_MODE_DEEP_SLEEP: return cbTARGET_POWER_SAVE_MODE_DEEP_SLEEP;
default:
MBED_ASSERT(false);
}
}

View File

@ -22,6 +22,7 @@
#include "UbloxWiFiSoftAPInterface.h"
#endif
#include "UbloxWiFiConfigInterface.h"
#include "mbed.h"
#include "netsocket/WiFiAccessPoint.h"
#include "netsocket/EMACInterface.h"
@ -29,6 +30,7 @@
#include "lwip/netif.h"
#include "rtos.h"
#include "cb_wlan.h"
#include "odin_drv_conf.h"
#include "wifi_emac.h"
#define ODIN_WIFI_MAX_MAC_ADDR_STR (18)
@ -43,6 +45,12 @@ struct wlan_status_connected_s;
struct wlan_status_connection_failure_s;
struct wlan_scan_indication_s;
typedef struct {
const char *client_cert;
const char *client_prvt_key;
const char *ca_cert;
}auth_cert_s;
/** OdinWiFiInterface class
* Implementation of the WiFiInterface for the ODIN-W2 module
*/
@ -70,7 +78,16 @@ public:
* @return 0 on success, or error code on failure
*/
virtual nsapi_error_t set_credentials(const char *ssid, const char *pass, nsapi_security_t security = NSAPI_SECURITY_NONE);
/** Set the WiFi network credentials
*
* @param client_cert Pointer to client certificate
* @param client_pvt_key Pointer to client private key
* @param ca_cert Pointer to ca certificate
* @return 0 on success, or error code on failure
*/
nsapi_error_t set_certificates(const char *client_cert, const char *client_pvt_key , const char *ca_cert );
/** Set the WiFi network channel
*
* @param channel Channel on which the connection is to be made, or 0 for any (Default: 0)
@ -89,10 +106,32 @@ public:
* @return 0 on success, or error code on failure
*/
virtual nsapi_error_t connect(
const char *ssid,
const char *pass,
nsapi_security_t security = NSAPI_SECURITY_NONE,
uint8_t channel = 0);
const char *ssid,
const char *pass,
nsapi_security_t security = NSAPI_SECURITY_NONE,
uint8_t channel = 0);
/** Start the interface [local interface]
*
* Attempt to connect to a Wi-Fi network using EAP (EAP_TLS and PEAP).
*
* @param ssid Name of the network to connect to.
* @param pass Security passphrase to connect to the network.
* @param security Type of encryption for connection (Default: NSAPI_SECURITY_NONE).
* @param channel Channel to make the connection, or 0 for any (Default: 0).
* @param auth_cert_s struct contains pointer to client_certificate, client_private_key and ca_certificate (Default: NULL).
* @param username name of client registered with authentication server (Default: NULL).
* @param password password against user registered with authentication server (Default: NULL).
* @return NSAPI_ERROR_OK on success, or error code on failure.
*/
nsapi_error_t connect(
const char *ssid,
const char *pass,
nsapi_security_t security,
auth_cert_s *cert_handle,
const char *username = NULL,
const char *user_pswd = NULL,
uint8_t channel = 0);
/** Start the interface
*
@ -141,7 +180,22 @@ public:
*/
virtual nsapi_error_t set_timeout(int ms);
#if DEVICE_WIFI_AP
/** Get general settings and tuning parameters
*
*
* @param setting setting to read.
* @return parameter value
*/
virtual unsigned int get_config(void *setting);
/**
* Set general tuning parameter.
*
* @param setting setting to modify.
* @param value value to set.
*/
virtual void set_config(void *setting, cb_uint32 value);
#ifdef DEVICE_WIFI_AP
/** Set IP config for access point
*
@ -326,12 +380,19 @@ private:
void handle_wlan_status_ap_up();
void handle_wlan_status_ap_down();
unsigned int wlan_get_gParams(cbTARGET_ConfigParams setting);
void wlan_set_gParams(cbTARGET_ConfigParams setting, cb_uint32 value);
void init(bool debug);
nsapi_error_t wlan_set_channel(uint8_t channel);
nsapi_error_t wlan_connect(
const char *ssid,
const char *passwd,
nsapi_security_t security);
nsapi_security_t security,
auth_cert_s *cert_handle = NULL,
const char *username = NULL,
const char *user_pswd = NULL,
uint8_t channel = 0);
nsapi_error_t wlan_ap_start(
const char *ssid,
const char *pass,
@ -354,6 +415,7 @@ private:
struct sta_s _sta;
struct ap_s _ap;
auth_cert_s _certs;
char _mac_addr_str[ODIN_WIFI_MAX_MAC_ADDR_STR];
cbWLAN_StatusConnectedInfo _wlan_status_connected_info;

View File

@ -0,0 +1,53 @@
/*---------------------------------------------------------------------------
* Copyright (c) 2019, u-blox Malmö, All Rights Reserved
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef UBLOX_WIFI_CONFIGAPINTERFACE_H
#define UBLOX_WIFI_CONFIGAPINTERFACE_H
#include <string.h>
#include "cb_wlan_driver_config.h"
/** UbloxWiFiConfigInterface class
*
* Common interface that is shared between WiFi devices supporting SoftAP mode
*/
class UbloxWiFiConfigInterface
{
public:
/** UbloxWiFiConfigInterface lifetime
*/
virtual ~UbloxWiFiConfigInterface() {};
/** Get general settings and tuning parameters
*
*
* @param setting setting to read.
* @return parameter value
*/
virtual unsigned int get_config(void *setting) = 0;
/**
* Set general tuning parameter.
*
* @param setting setting to modify.
* @param value value to set.
*/
virtual void set_config(void *setting, cb_uint32 value) = 0;
};
#endif

View File

@ -118,6 +118,50 @@ typedef enum targetConfigParams {
cbTARGET_CFG_GET_BAD_RSSI_YIELD_TMO, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_BLACKLIST_LAST_BSSID_TIMEOUT, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_BLACKLIST_LAST_BSSID_TIMEOUT, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_PMF_STA, //!< Set PMF option
cbTARGET_CFG_GET_PMF_STA, //!< Get PMF option
cbTARGET_CFG_SET_FT_MODE, //!< Set fast transition option
cbTARGET_CFG_GET_FT_MODE, //!< Get fast transition option
cbTARGET_CFG_SET_MIN_SCAN_TIME, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_MIN_SCAN_TIME, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_MAX_SCAN_TIME, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_MAX_SCAN_TIME, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_SCAN_TYPE, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_SCAN_TYPE, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_QOS_ENABLE, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_QOS_ENABLE, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_RTS_THRESHOLD, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_RTS_THRESHOLD, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_TX_POWER, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_TX_POWER, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_MAX_PASSIVE_SCAN_TIME, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_MAX_PASSIVE_SCAN_TIME, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_SCAN_LISTEN_INTERVAL, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_SCAN_LISTEN_INTERVAL, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_DOT11_SHORT_RETRY_LIMIT, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_DOT11_SHORT_RETRY_LIMIT, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_DOT11_LONG_RETRY_LIMIT, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_DOT11_LONG_RETRY_LIMIT, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_AP_DOT11_SHORT_RETRY_LIMIT, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_AP_DOT11_SHORT_RETRY_LIMIT, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_AP_DOT11_LONG_RETRY_LIMIT, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_AP_DOT11_LONG_RETRY_LIMIT, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_REMAIN_ON_CHANNEL, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_REMAIN_ON_CHANNEL, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_STA_TX_RATE_MASK, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_STA_TX_RATE_MASK, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_FORCE_WORLD_MODE, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_FORCE_WORLD_MODE, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_TX_PACKET_ACK_TIMEOUT_WD, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_TX_PACKET_ACK_TIMEOUT_WD, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_CTS_PROTECTION, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_CTS_PROTECTION, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_HIDDEN_SSID, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_HIDDEN_SSID, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_AP_STA_INACTIVITY_TIMEOUT, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_AP_STA_INACTIVITY_TIMEOUT, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_SET_ROAMING_AREA_HYSTERESIS, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_GET_ROAMING_AREA_HYSTERESIS, //!< SEE CORRESPONDING GSETTING
cbTARGET_CFG_LAST,
cbTARGET_CFG_SET_GSETTING = 1000, //!< Pipe to @ref cbWM_gSet.
cbTARGET_CFG_SET_TSETTING = 2000, //!< Pipe to @ref cbWM_tSet.

View File

@ -0,0 +1,69 @@
/*---------------------------------------------------------------------------
* Copyright (c) 2016, u-blox Malmö, All Rights Reserved
* SPDX-License-Identifier: LicenseRef-PBL
*
* This file and the related binary are licensed under the
* Permissive Binary License, Version 1.0 (the "License");
* you may not use these files except in compliance with the License.
*
* You may obtain a copy of the License here:
* LICENSE-permissive-binary-license-1.0.txt and at
* https://www.mbed.com/licenses/PBL-1.0
*
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Component : WIFI
* File : enterprize_handle.h
*
* Description :
*-------------------------------------------------------------------------*/
#include <string.h>
#include "cb_comdefs.h"
#include <string.h>
#include <stdlib.h>
#include "cb_cert_utils.h"
#include "cb_wlan.h"
#include "cb_hw.h"
/*===========================================================================
* DEFINES
*=========================================================================*/
#define cbSECMNG_MAX_CERTIFICATE_SIZE 4096
#define cbSECMNG_MAX_DER_FILE_SIZE (4096 + 3) // we need to make room for the 3 size bytes
#define cbSECMNG_MD5_LEN 16
#define cbSECMNG_MD5_STRING_LEN ((cbSECMNG_MD5_LEN * 2) + 1)
#define cbSECMNG_MAX_CERTIFICATE_NAME_LEN 32
#define cbSECMNG_MAX_CERTIFICATE_PASSWORD_LEN 64
/*===========================================================================
* TYPES
*=========================================================================*/
typedef enum {
cbSECMNG_TYPE_ALL = -1,
cbSECMNG_TRUSTED_ROOT,
cbSECMNG_CLIENT_CERT,
cbSECMNG_CLIENT_PRIVATE_KEY,
} cbSECMNG_Type;
/*===========================================================================
* DECLARATIONS
*=========================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
/** Call eap connection handler
*
* @param cert Reference to certificate e.g client or CA server certificate
* @param pvt_key Reference to private key in case if private key is inside cert reference it can be passed as NULL.
In case of EAP_TLS we need private key along with client certificate and not require in case of PEAP so NULL can be passed.
* @param commonParams Connection parameters.
* @param enterpriseParams Enterprise parameters.
* @return 0 on success, or error code on failure
*/
cbRTSL_Status cb_eap_conn_handler(cb_char const* cert, cb_char const* pvt_key, cbWLAN_CommonConnectParameters *commonParams, cbWLAN_EnterpriseConnectParameters *enterpriseParams);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,118 @@
/*---------------------------------------------------------------------------
* Copyright (c) 2019, u-blox Malmö, All Rights Reserved
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ODIN_DRV_CONFIG_H
#define ODIN_DRV_CONFIG_H
/** Enum of WiFi Configuration types
*
* The configuration type specifies a particular parameter of
* a WiFi interface. And will be used particular configuration to
* use when initializing a WiFi network e.g. 802.11r, 802.11w
* SEE CORRESPONDING GSETTING
*
*/
typedef enum target_config_params_e {
ODIN_CFG_FIRST,
ODIN_CFG_SET_POWER_SAVE_MODE = ODIN_CFG_FIRST,
ODIN_CFG_GET_POWER_SAVE_MODE,
ODIN_CFG_SET_MIN_SCAN_TIME,
ODIN_CFG_GET_MIN_SCAN_TIME,
ODIN_CFG_SET_MAX_SCAN_TIME,
ODIN_CFG_GET_MAX_SCAN_TIME,
ODIN_CFG_SET_SCAN_TYPE,
ODIN_CFG_GET_SCAN_TYPE,
ODIN_CFG_SET_LISTEN_INTERVAL,
ODIN_CFG_GET_LISTEN_INTERVAL,
ODIN_CFG_SET_DTIM_ENABLE,
ODIN_CFG_GET_DTIM_ENABLE,
ODIN_CFG_SET_QOS_ENABLE,
ODIN_CFG_GET_QOS_ENABLE,
ODIN_CFG_SET_RTS_THRESHOLD,
ODIN_CFG_GET_RTS_THRESHOLD,
ODIN_CFG_SET_TX_POWER,
ODIN_CFG_GET_TX_POWER,
ODIN_CFG_SET_MAX_PASSIVE_SCAN_TIME,
ODIN_CFG_GET_MAX_PASSIVE_SCAN_TIME,
ODIN_CFG_SET_SCAN_LISTEN_INTERVAL,
ODIN_CFG_GET_SCAN_LISTEN_INTERVAL,
ODIN_CFG_SET_DOT11_SHORT_RETRY_LIMIT,
ODIN_CFG_GET_DOT11_SHORT_RETRY_LIMIT,
ODIN_CFG_SET_DOT11_LONG_RETRY_LIMIT,
ODIN_CFG_GET_DOT11_LONG_RETRY_LIMIT,
ODIN_CFG_SET_AP_DOT11_SHORT_RETRY_LIMIT,
ODIN_CFG_GET_AP_DOT11_SHORT_RETRY_LIMIT,
ODIN_CFG_SET_AP_DOT11_LONG_RETRY_LIMIT,
ODIN_CFG_GET_AP_DOT11_LONG_RETRY_LIMIT,
ODIN_CFG_SET_REMAIN_ON_CHANNEL,
ODIN_CFG_GET_REMAIN_ON_CHANNEL,
ODIN_CFG_SET_STA_TX_RATE_MASK,
ODIN_CFG_GET_STA_TX_RATE_MASK,
ODIN_CFG_SET_RSSI_GOOD,
ODIN_CFG_GET_RSSI_GOOD,
ODIN_CFG_SET_RSSI_BAD,
ODIN_CFG_GET_RSSI_BAD,
ODIN_CFG_SET_SLEEP_TIMEOUT,
ODIN_CFG_GET_SLEEP_TIMEOUT,
ODIN_CFG_SET_GOOD_RSSI_YIELD_TMO,
ODIN_CFG_GET_GOOD_RSSI_YIELD_TMO,
ODIN_CFG_SET_BAD_RSSI_YIELD_TMO,
ODIN_CFG_GET_BAD_RSSI_YIELD_TMO,
ODIN_CFG_SET_FORCE_WORLD_MODE,
ODIN_CFG_GET_FORCE_WORLD_MODE,
ODIN_CFG_SET_TX_PACKET_ACK_TIMEOUT_WD,
ODIN_CFG_GET_TX_PACKET_ACK_TIMEOUT_WD,
ODIN_CFG_SET_CTS_PROTECTION,
ODIN_CFG_GET_CTS_PROTECTION,
ODIN_CFG_SET_HIDDEN_SSID,
ODIN_CFG_GET_HIDDEN_SSID,
ODIN_CFG_SET_AP_STA_INACTIVITY_TIMEOUT,
ODIN_CFG_GET_AP_STA_INACTIVITY_TIMEOUT,
ODIN_CFG_SET_ROAMING_AREA_HYSTERESIS,
ODIN_CFG_GET_ROAMING_AREA_HYSTERESIS,
ODIN_CFG_SET_RSSI_MIN,
ODIN_CFG_GET_RSSI_MIN,
ODIN_CFG_SET_ROAM_BAD_CHANNEL_RSSI_HYSTERESIS,
ODIN_CFG_GET_ROAM_BAD_CHANNEL_RSSI_HYSTERESIS,
ODIN_CFG_SET_ROAM_NO_ROAM_TMO,
ODIN_CFG_GET_ROAM_NO_ROAM_TMO,
ODIN_CFG_SET_ROAM_WAIT_TIMEOUT,
ODIN_CFG_GET_ROAM_WAIT_TIMEOUT,
ODIN_CFG_SET_SHORT_GI,
ODIN_CFG_GET_SHORT_GI,
ODIN_CFG_SET_WIRELESS_ISOLATION,
ODIN_CFG_GET_WIRELESS_ISOLATION,
ODIN_CFG_SET_PMF_STA,
ODIN_CFG_GET_PMF_STA,
ODIN_CFG_SET_FT_MODE,
ODIN_CFG_GET_FT_MODE,
ODIN_CFG_LAST,
} target_config_params_e;
/**
* Power save modes set using @ref cbWLAN_ioctl
*
* @ingroup wlan
*/
typedef enum {
ODIN_POWER_SAVE_MODE_OFF,
ODIN_POWER_SAVE_MODE_SLEEP,
ODIN_POWER_SAVE_MODE_DEEP_SLEEP
} target_power_save_mode_e;
#endif