mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			review and dynamic alloc (#3)
* Review fixes. Changed apn, username and password to be dynamically allocated.pull/6082/head
							parent
							
								
									4457e361ac
								
							
						
					
					
						commit
						ef14aef823
					
				| 
						 | 
				
			
			@ -503,11 +503,7 @@ CellularNetwork* CellularConnectionUtil::get_network()
 | 
			
		|||
 | 
			
		||||
CellularDevice* CellularConnectionUtil::get_device()
 | 
			
		||||
{
 | 
			
		||||
    if (_cellularDevice) {
 | 
			
		||||
        return _cellularDevice;
 | 
			
		||||
    } else {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    return _cellularDevice;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
NetworkStack *CellularConnectionUtil::get_stack()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,7 +35,7 @@
 | 
			
		|||
#include CELLULAR_STRINGIFY(CELLULAR_DEVICE.h)
 | 
			
		||||
 | 
			
		||||
namespace mbed {
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
const int PIN_SIZE = 8;
 | 
			
		||||
 | 
			
		||||
/** CellularConnectionUtil class
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +80,7 @@ public:
 | 
			
		|||
     *  @param status_callback function to call on state changes
 | 
			
		||||
     */
 | 
			
		||||
    void set_callback(mbed::Callback<bool(int, int)> status_callback);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /** Get event queue that can be chained to main event queue (or use start_dispatch)
 | 
			
		||||
     *  @return event queue
 | 
			
		||||
     */
 | 
			
		||||
| 
						 | 
				
			
			@ -94,7 +94,7 @@ public:
 | 
			
		|||
    /** Stop event queue dispatching and close cellular interfaces
 | 
			
		||||
     */
 | 
			
		||||
    void stop();
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /** Get cellular network interface
 | 
			
		||||
     *  @return network interface, NULL on failure
 | 
			
		||||
     */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,11 +31,6 @@
 | 
			
		|||
 | 
			
		||||
namespace mbed {
 | 
			
		||||
 | 
			
		||||
static CellularConnectionUtil cellularConnection;
 | 
			
		||||
static rtos::Semaphore cellularSemaphore(0);
 | 
			
		||||
static UARTSerial cellularSerial(MDMTXD, MDMRXD, MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool EasyCellularConnection::cellular_status(int state, int next_state)
 | 
			
		||||
{
 | 
			
		||||
    tr_info("cellular_status %d=>%d", state, next_state);
 | 
			
		||||
| 
						 | 
				
			
			@ -45,7 +40,7 @@ bool EasyCellularConnection::cellular_status(int state, int next_state)
 | 
			
		|||
        } else {
 | 
			
		||||
            _is_connected = false;
 | 
			
		||||
        }
 | 
			
		||||
        MBED_ASSERT(cellularSemaphore.release() == osOK);
 | 
			
		||||
        MBED_ASSERT(_cellularSemaphore.release() == osOK);
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
| 
						 | 
				
			
			@ -54,28 +49,35 @@ bool EasyCellularConnection::cellular_status(int state, int next_state)
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EasyCellularConnection::EasyCellularConnection() :  _is_connected(false), _target_state(CellularConnectionUtil::STATE_POWER_ON)
 | 
			
		||||
EasyCellularConnection::EasyCellularConnection() :  _is_connected(false), _is_initialized(false),
 | 
			
		||||
        _target_state(CellularConnectionUtil::STATE_POWER_ON),
 | 
			
		||||
        _cellularSerial(MDMTXD, MDMRXD, MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE),
 | 
			
		||||
        _cellularSemaphore(0), _cellularConnectionUtil(), _credentials_err(NSAPI_ERROR_OK)
 | 
			
		||||
{
 | 
			
		||||
    tr_info("EasyCellularConnection()");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EasyCellularConnection::~EasyCellularConnection()
 | 
			
		||||
{
 | 
			
		||||
    cellularConnection.stop();
 | 
			
		||||
    _cellularConnectionUtil.stop();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nsapi_error_t EasyCellularConnection::init()
 | 
			
		||||
{
 | 
			
		||||
    nsapi_error_t err = NSAPI_ERROR_OK;
 | 
			
		||||
    if (!_is_initialized) {
 | 
			
		||||
#if defined (MDMRTS) && defined (MDMCTS)
 | 
			
		||||
    cellularSerial.set_flow_control(SerialBase::RTSCTS, MDMRTS, MDMCTS);
 | 
			
		||||
    _cellularSerial.set_flow_control(SerialBase::RTSCTS, MDMRTS, MDMCTS);
 | 
			
		||||
#endif
 | 
			
		||||
    cellularConnection.set_serial(&cellularSerial);
 | 
			
		||||
    cellularConnection.set_callback(callback(this, &EasyCellularConnection::cellular_status));
 | 
			
		||||
        _cellularConnectionUtil.set_serial(&_cellularSerial);
 | 
			
		||||
        _cellularConnectionUtil.set_callback(callback(this, &EasyCellularConnection::cellular_status));
 | 
			
		||||
 | 
			
		||||
   nsapi_error_t err = cellularConnection.init();
 | 
			
		||||
       err = _cellularConnectionUtil.init();
 | 
			
		||||
 | 
			
		||||
    if (err == NSAPI_ERROR_OK) {
 | 
			
		||||
        err = cellularConnection.start_dispatch();
 | 
			
		||||
        if (err == NSAPI_ERROR_OK) {
 | 
			
		||||
            err = _cellularConnectionUtil.start_dispatch();
 | 
			
		||||
        }
 | 
			
		||||
        _is_initialized = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return err;
 | 
			
		||||
| 
						 | 
				
			
			@ -83,9 +85,14 @@ nsapi_error_t EasyCellularConnection::init()
 | 
			
		|||
 | 
			
		||||
void EasyCellularConnection::set_credentials(const char *apn, const char *uname, const char *pwd)
 | 
			
		||||
{
 | 
			
		||||
    CellularNetwork * network = cellularConnection.get_network();
 | 
			
		||||
    _credentials_err = init();
 | 
			
		||||
 | 
			
		||||
    if (_credentials_err) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    CellularNetwork * network = _cellularConnectionUtil.get_network();
 | 
			
		||||
    if (network) {
 | 
			
		||||
        network->set_credentials(apn, uname, pwd);
 | 
			
		||||
        _credentials_err = network->set_credentials(apn, uname, pwd);
 | 
			
		||||
    } else {
 | 
			
		||||
        tr_error("NO Network...");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -93,22 +100,59 @@ void EasyCellularConnection::set_credentials(const char *apn, const char *uname,
 | 
			
		|||
 | 
			
		||||
void EasyCellularConnection::set_sim_pin(const char *sim_pin)
 | 
			
		||||
{
 | 
			
		||||
    cellularConnection.set_sim_pin(sim_pin);
 | 
			
		||||
    if (sim_pin) {
 | 
			
		||||
        _cellularConnectionUtil.set_sim_pin(sim_pin);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nsapi_error_t EasyCellularConnection::connect(const char *sim_pin, const char *apn, const char *uname, const char *pwd)
 | 
			
		||||
{
 | 
			
		||||
    cellularConnection.set_sim_pin(sim_pin);
 | 
			
		||||
    cellularConnection.get_network()->set_credentials(apn, uname, pwd);
 | 
			
		||||
    nsapi_error_t err = check_connect();
 | 
			
		||||
    if (err) {
 | 
			
		||||
        return err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (sim_pin) {
 | 
			
		||||
        _cellularConnectionUtil.set_sim_pin(sim_pin);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    err = _cellularConnectionUtil.get_network()->set_credentials(apn, uname, pwd);
 | 
			
		||||
    if (err) {
 | 
			
		||||
        return err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return connect();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nsapi_error_t EasyCellularConnection::check_connect()
 | 
			
		||||
{
 | 
			
		||||
    if (_is_connected) {
 | 
			
		||||
        return NSAPI_ERROR_IS_CONNECTED;
 | 
			
		||||
    }
 | 
			
		||||
    nsapi_error_t err = init();
 | 
			
		||||
    if (err) {
 | 
			
		||||
        return err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return NSAPI_ERROR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nsapi_error_t EasyCellularConnection::connect()
 | 
			
		||||
{
 | 
			
		||||
    // there was an error while setting credentials but it's a void function so check error here...
 | 
			
		||||
    if (_credentials_err) {
 | 
			
		||||
        return _credentials_err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    nsapi_error_t err = check_connect();
 | 
			
		||||
    if (err) {
 | 
			
		||||
        return err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _target_state = CellularConnectionUtil::STATE_CONNECTED;
 | 
			
		||||
    nsapi_error_t err = cellularConnection.continue_to_state(_target_state);
 | 
			
		||||
    err = _cellularConnectionUtil.continue_to_state(_target_state);
 | 
			
		||||
    if (err == NSAPI_ERROR_OK) {
 | 
			
		||||
        int ret_wait = cellularSemaphore.wait(10*60*1000); // cellular network searching may take several minutes
 | 
			
		||||
        int ret_wait = _cellularSemaphore.wait(10*60*1000); // cellular network searching may take several minutes
 | 
			
		||||
        if (ret_wait != 1) {
 | 
			
		||||
            tr_info("No cellular connection");
 | 
			
		||||
            err = NSAPI_ERROR_NO_CONNECTION;
 | 
			
		||||
| 
						 | 
				
			
			@ -120,11 +164,12 @@ nsapi_error_t EasyCellularConnection::connect()
 | 
			
		|||
 | 
			
		||||
nsapi_error_t EasyCellularConnection::disconnect()
 | 
			
		||||
{
 | 
			
		||||
    _credentials_err = NSAPI_ERROR_OK;
 | 
			
		||||
    _is_connected = false;
 | 
			
		||||
    if (!cellularConnection.get_network()) {
 | 
			
		||||
    if (!_cellularConnectionUtil.get_network()) {
 | 
			
		||||
        return NSAPI_ERROR_NO_CONNECTION;
 | 
			
		||||
    }
 | 
			
		||||
    return cellularConnection.get_network()->disconnect();
 | 
			
		||||
    return _cellularConnectionUtil.get_network()->disconnect();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool EasyCellularConnection::is_connected()
 | 
			
		||||
| 
						 | 
				
			
			@ -134,27 +179,36 @@ bool EasyCellularConnection::is_connected()
 | 
			
		|||
 | 
			
		||||
const char *EasyCellularConnection::get_ip_address()
 | 
			
		||||
{
 | 
			
		||||
    CellularNetwork * network = cellularConnection.get_network();
 | 
			
		||||
    if (network) {
 | 
			
		||||
        return cellularConnection.get_network()->get_ip_address();
 | 
			
		||||
    } else {
 | 
			
		||||
    CellularNetwork *network = _cellularConnectionUtil.get_network();
 | 
			
		||||
    if (!network) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    return _cellularConnectionUtil.get_network()->get_ip_address();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char *EasyCellularConnection::get_netmask()
 | 
			
		||||
{
 | 
			
		||||
    return cellularConnection.get_network()->get_netmask();
 | 
			
		||||
    CellularNetwork *network = _cellularConnectionUtil.get_network();
 | 
			
		||||
    if (!network) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return network->get_netmask();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char *EasyCellularConnection::get_gateway()
 | 
			
		||||
{
 | 
			
		||||
    return cellularConnection.get_network()->get_gateway();
 | 
			
		||||
    CellularNetwork *network = _cellularConnectionUtil.get_network();
 | 
			
		||||
    if (!network) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return network->get_gateway();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void EasyCellularConnection::attach(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb)
 | 
			
		||||
{
 | 
			
		||||
    CellularNetwork * network = cellularConnection.get_network();
 | 
			
		||||
    CellularNetwork *network = _cellularConnectionUtil.get_network();
 | 
			
		||||
    if (network) {
 | 
			
		||||
        network->attach(status_cb);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -162,11 +216,7 @@ void EasyCellularConnection::attach(mbed::Callback<void(nsapi_event_t, intptr_t)
 | 
			
		|||
 | 
			
		||||
NetworkStack *EasyCellularConnection::get_stack()
 | 
			
		||||
{
 | 
			
		||||
#if NSAPI_PPP_AVAILABLE
 | 
			
		||||
    return nsapi_ppp_get_stack();
 | 
			
		||||
#else
 | 
			
		||||
    return cellularConnection.get_stack();
 | 
			
		||||
#endif // #if NSAPI_PPP_AVAILABLE
 | 
			
		||||
    return _cellularConnectionUtil.get_stack();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,12 +36,6 @@ public:
 | 
			
		|||
    virtual ~EasyCellularConnection();
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    /** Create cellular power and start dispatcher
 | 
			
		||||
     *  @remark Must be called before any other methods
 | 
			
		||||
     *  @return see nsapi_error_t, 0 on success
 | 
			
		||||
     */
 | 
			
		||||
    nsapi_error_t init();
 | 
			
		||||
 | 
			
		||||
    /** Set the Cellular network credentials
 | 
			
		||||
     *
 | 
			
		||||
     *  Please check documentation of connect() for default behaviour of APN settings.
 | 
			
		||||
| 
						 | 
				
			
			@ -137,9 +131,18 @@ private:
 | 
			
		|||
     *  @return true to continue state machine
 | 
			
		||||
     */
 | 
			
		||||
    bool cellular_status(int state, int next_state);
 | 
			
		||||
    nsapi_error_t init();
 | 
			
		||||
    nsapi_error_t check_connect();
 | 
			
		||||
 | 
			
		||||
    bool _is_connected;
 | 
			
		||||
    bool _is_initialized;
 | 
			
		||||
    CellularConnectionUtil::CellularState _target_state;
 | 
			
		||||
 | 
			
		||||
    UARTSerial _cellularSerial;
 | 
			
		||||
    rtos::Semaphore _cellularSemaphore;
 | 
			
		||||
    CellularConnectionUtil _cellularConnectionUtil;
 | 
			
		||||
 | 
			
		||||
    nsapi_error_t _credentials_err;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,19 +37,32 @@ static const at_reg_t at_reg[] = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
AT_CellularNetwork::AT_CellularNetwork(ATHandler &atHandler) : AT_CellularBase(atHandler),
 | 
			
		||||
    _stack(NULL), _uname(NULL), _pwd(NULL), _ip_stack_type_requested(DEFAULT_STACK), _ip_stack_type(DEFAULT_STACK), _cid(-1),
 | 
			
		||||
    _stack(NULL), _apn(NULL), _uname(NULL), _pwd(NULL), _ip_stack_type_requested(DEFAULT_STACK), _ip_stack_type(DEFAULT_STACK), _cid(-1),
 | 
			
		||||
    _connection_status_cb(NULL), _op_act(operator_t::RAT_UNKNOWN), _authentication_type(CHAP), _last_reg_type(C_REG),
 | 
			
		||||
    _connect_status(NSAPI_STATUS_DISCONNECTED)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    _at.set_urc_handler("NO CARRIER", callback(this, &AT_CellularNetwork::urc_no_carrier));
 | 
			
		||||
 | 
			
		||||
    memset(_apn, 0, MAX_ACCESSPOINT_NAME_LENGTH);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AT_CellularNetwork::~AT_CellularNetwork()
 | 
			
		||||
{
 | 
			
		||||
    free_credentials();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AT_CellularNetwork::free_credentials()
 | 
			
		||||
{
 | 
			
		||||
    if (_uname) {
 | 
			
		||||
        free(_uname);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (_pwd) {
 | 
			
		||||
        free(_pwd);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (_apn) {
 | 
			
		||||
        free(_apn);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AT_CellularNetwork::urc_no_carrier()
 | 
			
		||||
| 
						 | 
				
			
			@ -63,9 +76,36 @@ void AT_CellularNetwork::urc_no_carrier()
 | 
			
		|||
nsapi_error_t AT_CellularNetwork::set_credentials(const char *apn,
 | 
			
		||||
        const char *username, const char *password)
 | 
			
		||||
{
 | 
			
		||||
    strncpy(_apn, apn, MAX_ACCESSPOINT_NAME_LENGTH);
 | 
			
		||||
    _uname = username;
 | 
			
		||||
    _pwd = password;
 | 
			
		||||
    size_t len;
 | 
			
		||||
    if (apn) {
 | 
			
		||||
        len = strlen(apn);
 | 
			
		||||
        _apn = (char*)malloc(len*sizeof(char)+1);
 | 
			
		||||
        if (_apn) {
 | 
			
		||||
            memcpy(_apn, apn, len);
 | 
			
		||||
        } else {
 | 
			
		||||
            return NSAPI_ERROR_NO_MEMORY;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (username) {
 | 
			
		||||
        len = strlen(username);
 | 
			
		||||
        _uname = (char*)malloc(len*sizeof(char)+1);
 | 
			
		||||
        if (_uname) {
 | 
			
		||||
            memcpy(_uname, username, len);
 | 
			
		||||
        } else {
 | 
			
		||||
            return NSAPI_ERROR_NO_MEMORY;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (password) {
 | 
			
		||||
        len = strlen(password);
 | 
			
		||||
        _pwd = (char*)malloc(len*sizeof(char)+1);
 | 
			
		||||
        if (_pwd) {
 | 
			
		||||
            memcpy(_pwd, password, len);
 | 
			
		||||
        } else {
 | 
			
		||||
            return NSAPI_ERROR_NO_MEMORY;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return NSAPI_ERROR_OK;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -73,9 +113,11 @@ nsapi_error_t AT_CellularNetwork::set_credentials(const char *apn,
 | 
			
		|||
nsapi_error_t AT_CellularNetwork::set_credentials(const char *apn,
 | 
			
		||||
        AuthenticationType type, const char *username, const char *password)
 | 
			
		||||
{
 | 
			
		||||
    strncpy(_apn, apn, MAX_ACCESSPOINT_NAME_LENGTH);
 | 
			
		||||
    _uname = username;
 | 
			
		||||
    _pwd = password;
 | 
			
		||||
    nsapi_error_t err = set_credentials(apn, username, password);
 | 
			
		||||
    if (err) {
 | 
			
		||||
        return err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _authentication_type = type;
 | 
			
		||||
 | 
			
		||||
    return NSAPI_ERROR_OK;
 | 
			
		||||
| 
						 | 
				
			
			@ -84,9 +126,10 @@ nsapi_error_t AT_CellularNetwork::set_credentials(const char *apn,
 | 
			
		|||
nsapi_error_t AT_CellularNetwork::connect(const char *apn,
 | 
			
		||||
        const char *username, const char *password)
 | 
			
		||||
{
 | 
			
		||||
    strncpy(_apn, apn, MAX_ACCESSPOINT_NAME_LENGTH);
 | 
			
		||||
    _uname = username;
 | 
			
		||||
    _pwd = password;
 | 
			
		||||
    nsapi_error_t err = set_credentials(apn, username, password);
 | 
			
		||||
    if (err) {
 | 
			
		||||
        return err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return connect();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -335,7 +378,7 @@ bool AT_CellularNetwork::get_context(nsapi_ip_stack_t requested_stack)
 | 
			
		|||
    _at.resp_start("+CGDCONT:");
 | 
			
		||||
    _cid = -1;
 | 
			
		||||
    int cid_max = 0; // needed when creating new context
 | 
			
		||||
    char apn[MAX_ACCESSPOINT_NAME_LENGTH] = {0};
 | 
			
		||||
    char apn[MAX_ACCESSPOINT_NAME_LENGTH];
 | 
			
		||||
    int apn_len = 0;
 | 
			
		||||
 | 
			
		||||
    while (_at.info_resp()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -348,7 +391,7 @@ bool AT_CellularNetwork::get_context(nsapi_ip_stack_t requested_stack)
 | 
			
		|||
        if (pdp_type_len > 0) {
 | 
			
		||||
            apn_len = _at.read_string(apn, sizeof(apn) - 1);
 | 
			
		||||
            if (apn_len >= 0) {
 | 
			
		||||
                if (strlen(_apn) && strcmp(apn, _apn) != 0 ) {
 | 
			
		||||
                if (_apn && strcmp(apn, _apn) != 0 ) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                nsapi_ip_stack_t pdp_stack = string_to_stack_type(pdp_type_from_context);
 | 
			
		||||
| 
						 | 
				
			
			@ -390,8 +433,13 @@ bool AT_CellularNetwork::get_context(nsapi_ip_stack_t requested_stack)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    // save the apn
 | 
			
		||||
    if (apn_len > 0 && !strlen(_apn)) {
 | 
			
		||||
        strncpy(_apn, apn, MAX_ACCESSPOINT_NAME_LENGTH);
 | 
			
		||||
    if (apn_len > 0 && !_apn) {
 | 
			
		||||
        _apn = (char*)malloc(apn_len*sizeof(char)+1);
 | 
			
		||||
        if (_apn) {
 | 
			
		||||
            memcpy(_apn, apn, apn_len);
 | 
			
		||||
        } else {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    tr_debug("Context id %d", _cid);
 | 
			
		||||
| 
						 | 
				
			
			@ -591,7 +639,7 @@ nsapi_error_t AT_CellularNetwork::get_backoff_time(int &backoffTime)
 | 
			
		|||
    _at.lock();
 | 
			
		||||
 | 
			
		||||
    // If apn is set
 | 
			
		||||
    if (strlen(_apn)) {
 | 
			
		||||
    if (_apn) {
 | 
			
		||||
        _at.cmd_start("AT+CABTRDP=");
 | 
			
		||||
        _at.write_string(_apn);
 | 
			
		||||
        _at.cmd_stop();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,8 @@ public:
 | 
			
		|||
 | 
			
		||||
    AT_CellularNetwork(ATHandler &atHandler);
 | 
			
		||||
    virtual ~AT_CellularNetwork();
 | 
			
		||||
    // declare friend so it can access stack
 | 
			
		||||
    friend class AT_CellularDevice;
 | 
			
		||||
 | 
			
		||||
public: // NetworkInterface
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -84,6 +86,7 @@ public: // NetworkInterface
 | 
			
		|||
     */
 | 
			
		||||
    virtual nsapi_error_t disconnect();
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    /** Provide access to the NetworkStack object
 | 
			
		||||
     *
 | 
			
		||||
     *  @return The underlying NetworkStack object
 | 
			
		||||
| 
						 | 
				
			
			@ -290,6 +293,8 @@ private:
 | 
			
		|||
    nsapi_error_t set_context_to_be_activated();
 | 
			
		||||
    nsapi_ip_stack_t string_to_stack_type(const char* pdp_type);
 | 
			
		||||
 | 
			
		||||
    void free_credentials();
 | 
			
		||||
 | 
			
		||||
    nsapi_error_t open_data_channel();
 | 
			
		||||
    bool get_context(nsapi_ip_stack_t supported_stack);
 | 
			
		||||
    bool set_new_context(nsapi_ip_stack_t stack, int cid);
 | 
			
		||||
| 
						 | 
				
			
			@ -300,9 +305,9 @@ private:
 | 
			
		|||
 | 
			
		||||
protected:
 | 
			
		||||
    NetworkStack *_stack;
 | 
			
		||||
    char _apn[MAX_ACCESSPOINT_NAME_LENGTH];
 | 
			
		||||
    const char *_uname;
 | 
			
		||||
    const char *_pwd;
 | 
			
		||||
    char *_apn;
 | 
			
		||||
    char *_uname;
 | 
			
		||||
    char *_pwd;
 | 
			
		||||
    nsapi_ip_stack_t _ip_stack_type_requested;
 | 
			
		||||
    nsapi_ip_stack_t _ip_stack_type;
 | 
			
		||||
    int _cid;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue