Library that implements the CellularInterface using PPP and LWIP on the mbed MCU. May be used on the C027 and C030 (non-N2xx flavour) boards from mbed 5.5 onwards.

Dependents:   example-ublox-cellular-interface HelloMQTT example-ublox-cellular-interface_r410M example-ublox-mbed-client

Committer:
RobMeades
Date:
Wed Jun 14 09:27:55 2017 +0000
Revision:
0:44dd95724bc2
Child:
2:4c533665168c
Initial commit of u-blox PPP cellular interface, which implements a data connection using LWIP and PPP on the MCU.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RobMeades 0:44dd95724bc2 1 /* Copyright (c) 2017 ublox Limited
RobMeades 0:44dd95724bc2 2 *
RobMeades 0:44dd95724bc2 3 * Licensed under the Apache License, Version 2.0 (the "License");
RobMeades 0:44dd95724bc2 4 * you may not use this file except in compliance with the License.
RobMeades 0:44dd95724bc2 5 * You may obtain a copy of the License at
RobMeades 0:44dd95724bc2 6 *
RobMeades 0:44dd95724bc2 7 * http://www.apache.org/licenses/LICENSE-2.0
RobMeades 0:44dd95724bc2 8 *
RobMeades 0:44dd95724bc2 9 * Unless required by applicable law or agreed to in writing, software
RobMeades 0:44dd95724bc2 10 * distributed under the License is distributed on an "AS IS" BASIS,
RobMeades 0:44dd95724bc2 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
RobMeades 0:44dd95724bc2 12 * See the License for the specific language governing permissions and
RobMeades 0:44dd95724bc2 13 * limitations under the License.
RobMeades 0:44dd95724bc2 14 */
RobMeades 0:44dd95724bc2 15
RobMeades 0:44dd95724bc2 16 #include "cellular/onboard_modem_api.h"
RobMeades 0:44dd95724bc2 17 #include "nsapi_ppp.h"
RobMeades 0:44dd95724bc2 18 #include "utils/APN_db.h"
RobMeades 0:44dd95724bc2 19 #include "UbloxPPPCellularInterface.h"
RobMeades 0:44dd95724bc2 20 #ifdef FEATURE_COMMON_PAL
RobMeades 0:44dd95724bc2 21 #include "mbed_trace.h"
RobMeades 0:44dd95724bc2 22 #define TRACE_GROUP "UPCI"
RobMeades 0:44dd95724bc2 23 #else
RobMeades 0:44dd95724bc2 24 #define tr_debug(format, ...) debug_if(_debug_trace_on, format "\n", ## __VA_ARGS__)
RobMeades 0:44dd95724bc2 25 #define tr_info(format, ...) debug_if(_debug_trace_on, format "\n", ## __VA_ARGS__)
RobMeades 0:44dd95724bc2 26 #define tr_warn(format, ...) debug_if(_debug_trace_on, format "\n", ## __VA_ARGS__)
RobMeades 0:44dd95724bc2 27 #define tr_error(format, ...) debug_if(_debug_trace_on, format "\n", ## __VA_ARGS__)
RobMeades 0:44dd95724bc2 28 #endif
RobMeades 0:44dd95724bc2 29
RobMeades 0:44dd95724bc2 30 #if NSAPI_PPP_AVAILABLE
RobMeades 0:44dd95724bc2 31
RobMeades 0:44dd95724bc2 32 /**********************************************************************
RobMeades 0:44dd95724bc2 33 * PRIVATE METHODS
RobMeades 0:44dd95724bc2 34 **********************************************************************/
RobMeades 0:44dd95724bc2 35
RobMeades 0:44dd95724bc2 36 // Send the credentials to the modem.
RobMeades 0:44dd95724bc2 37 nsapi_error_t UbloxPPPCellularInterface::setup_context_and_credentials()
RobMeades 0:44dd95724bc2 38 {
RobMeades 0:44dd95724bc2 39 nsapi_error_t nsapi_error = NSAPI_ERROR_PARAMETER;
RobMeades 0:44dd95724bc2 40 const char *auth = _uname && _pwd ? "CHAP:" : "";
RobMeades 0:44dd95724bc2 41 LOCK();
RobMeades 0:44dd95724bc2 42
RobMeades 0:44dd95724bc2 43 if (_apn) {
RobMeades 0:44dd95724bc2 44 // TODO: IPV6
RobMeades 0:44dd95724bc2 45 if (_at->send("AT+CGDCONT=1,\"%s\",\"%s%s\"", "IP", auth, _apn) &&
RobMeades 0:44dd95724bc2 46 _at->recv("OK")) {
RobMeades 0:44dd95724bc2 47 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 48 // C030 needs a short delay before the connection is triggered
RobMeades 0:44dd95724bc2 49 wait_ms(100);
RobMeades 0:44dd95724bc2 50 }
RobMeades 0:44dd95724bc2 51 }
RobMeades 0:44dd95724bc2 52
RobMeades 0:44dd95724bc2 53 UNLOCK();
RobMeades 0:44dd95724bc2 54 return nsapi_error;
RobMeades 0:44dd95724bc2 55
RobMeades 0:44dd95724bc2 56 }
RobMeades 0:44dd95724bc2 57
RobMeades 0:44dd95724bc2 58 // Enter data mode.
RobMeades 0:44dd95724bc2 59 bool UbloxPPPCellularInterface::set_atd()
RobMeades 0:44dd95724bc2 60 {
RobMeades 0:44dd95724bc2 61 bool success;
RobMeades 0:44dd95724bc2 62 LOCK();
RobMeades 0:44dd95724bc2 63
RobMeades 0:44dd95724bc2 64 success = _at->send("ATD*99***1#") && _at->recv("CONNECT");
RobMeades 0:44dd95724bc2 65
RobMeades 0:44dd95724bc2 66 UNLOCK();
RobMeades 0:44dd95724bc2 67 return success;
RobMeades 0:44dd95724bc2 68 }
RobMeades 0:44dd95724bc2 69
RobMeades 0:44dd95724bc2 70 /**********************************************************************
RobMeades 0:44dd95724bc2 71 * PROTECTED METHODS
RobMeades 0:44dd95724bc2 72 **********************************************************************/
RobMeades 0:44dd95724bc2 73
RobMeades 0:44dd95724bc2 74 // Gain access to the underlying network stack.
RobMeades 0:44dd95724bc2 75 NetworkStack *UbloxPPPCellularInterface::get_stack()
RobMeades 0:44dd95724bc2 76 {
RobMeades 0:44dd95724bc2 77 return nsapi_ppp_get_stack();
RobMeades 0:44dd95724bc2 78 }
RobMeades 0:44dd95724bc2 79
RobMeades 0:44dd95724bc2 80 // Get the next set of credentials, based on IMSI.
RobMeades 0:44dd95724bc2 81 void UbloxPPPCellularInterface::get_next_credentials(const char * config)
RobMeades 0:44dd95724bc2 82 {
RobMeades 0:44dd95724bc2 83 if (config) {
RobMeades 0:44dd95724bc2 84 _apn = _APN_GET(config);
RobMeades 0:44dd95724bc2 85 _uname = _APN_GET(config);
RobMeades 0:44dd95724bc2 86 _pwd = _APN_GET(config);
RobMeades 0:44dd95724bc2 87 }
RobMeades 0:44dd95724bc2 88
RobMeades 0:44dd95724bc2 89 _apn = _apn ? _apn : "";
RobMeades 0:44dd95724bc2 90 _uname = _uname ? _uname : "";
RobMeades 0:44dd95724bc2 91 _pwd = _pwd ? _pwd : "";
RobMeades 0:44dd95724bc2 92 }
RobMeades 0:44dd95724bc2 93
RobMeades 0:44dd95724bc2 94 /**********************************************************************
RobMeades 0:44dd95724bc2 95 * PUBLIC METHODS
RobMeades 0:44dd95724bc2 96 **********************************************************************/
RobMeades 0:44dd95724bc2 97
RobMeades 0:44dd95724bc2 98 // Constructor.
RobMeades 0:44dd95724bc2 99 UbloxPPPCellularInterface::UbloxPPPCellularInterface(PinName tx,
RobMeades 0:44dd95724bc2 100 PinName rx,
RobMeades 0:44dd95724bc2 101 int baud,
RobMeades 0:44dd95724bc2 102 bool debug_on)
RobMeades 0:44dd95724bc2 103 {
RobMeades 0:44dd95724bc2 104 _apn = NULL;
RobMeades 0:44dd95724bc2 105 _uname = NULL;
RobMeades 0:44dd95724bc2 106 _pwd = NULL;
RobMeades 0:44dd95724bc2 107 _sim_pin_check_change_pending = false;
RobMeades 0:44dd95724bc2 108 _sim_pin_check_change_pending_enabled_value = false;
RobMeades 0:44dd95724bc2 109 _sim_pin_change_pending = false;
RobMeades 0:44dd95724bc2 110 _sim_pin_change_pending_new_pin_value = NULL;
RobMeades 0:44dd95724bc2 111 _ppp_connection_up = false;
RobMeades 0:44dd95724bc2 112 _connection_status_cb = NULL;
RobMeades 0:44dd95724bc2 113
RobMeades 0:44dd95724bc2 114 // Initialise the base class, which starts the AT parser`
RobMeades 0:44dd95724bc2 115 baseClassInit(tx, rx, baud, debug_on);
RobMeades 0:44dd95724bc2 116 }
RobMeades 0:44dd95724bc2 117
RobMeades 0:44dd95724bc2 118 // Destructor.
RobMeades 0:44dd95724bc2 119 UbloxPPPCellularInterface::~UbloxPPPCellularInterface()
RobMeades 0:44dd95724bc2 120 {
RobMeades 0:44dd95724bc2 121 if (_ppp_connection_up) {
RobMeades 0:44dd95724bc2 122 disconnect();
RobMeades 0:44dd95724bc2 123 }
RobMeades 0:44dd95724bc2 124 }
RobMeades 0:44dd95724bc2 125
RobMeades 0:44dd95724bc2 126 // Set APN, user name and password.
RobMeades 0:44dd95724bc2 127 void UbloxPPPCellularInterface::set_credentials(const char *apn,
RobMeades 0:44dd95724bc2 128 const char *uname,
RobMeades 0:44dd95724bc2 129 const char *pwd)
RobMeades 0:44dd95724bc2 130 {
RobMeades 0:44dd95724bc2 131 _apn = apn;
RobMeades 0:44dd95724bc2 132 _uname = uname;
RobMeades 0:44dd95724bc2 133 _pwd = pwd;
RobMeades 0:44dd95724bc2 134 }
RobMeades 0:44dd95724bc2 135
RobMeades 0:44dd95724bc2 136 // Set PIN.
RobMeades 0:44dd95724bc2 137 void UbloxPPPCellularInterface::set_sim_pin(const char *pin) {
RobMeades 0:44dd95724bc2 138 set_pin(pin);
RobMeades 0:44dd95724bc2 139 }
RobMeades 0:44dd95724bc2 140
RobMeades 0:44dd95724bc2 141 // Make a cellular connection.
RobMeades 0:44dd95724bc2 142 nsapi_error_t UbloxPPPCellularInterface::connect(const char *sim_pin,
RobMeades 0:44dd95724bc2 143 const char *apn,
RobMeades 0:44dd95724bc2 144 const char *uname,
RobMeades 0:44dd95724bc2 145 const char *pwd)
RobMeades 0:44dd95724bc2 146 {
RobMeades 0:44dd95724bc2 147 nsapi_error_t nsapi_error;
RobMeades 0:44dd95724bc2 148
RobMeades 0:44dd95724bc2 149 if (sim_pin != NULL) {
RobMeades 0:44dd95724bc2 150 set_pin(sim_pin);
RobMeades 0:44dd95724bc2 151 }
RobMeades 0:44dd95724bc2 152
RobMeades 0:44dd95724bc2 153 if (apn != NULL) {
RobMeades 0:44dd95724bc2 154 _apn = apn;
RobMeades 0:44dd95724bc2 155 }
RobMeades 0:44dd95724bc2 156
RobMeades 0:44dd95724bc2 157 if ((uname != NULL) && (pwd != NULL)) {
RobMeades 0:44dd95724bc2 158 _uname = uname;
RobMeades 0:44dd95724bc2 159 _pwd = pwd;
RobMeades 0:44dd95724bc2 160 } else {
RobMeades 0:44dd95724bc2 161 _uname = NULL;
RobMeades 0:44dd95724bc2 162 _pwd = NULL;
RobMeades 0:44dd95724bc2 163 }
RobMeades 0:44dd95724bc2 164
RobMeades 0:44dd95724bc2 165 nsapi_error = connect();
RobMeades 0:44dd95724bc2 166
RobMeades 0:44dd95724bc2 167 return nsapi_error;
RobMeades 0:44dd95724bc2 168 }
RobMeades 0:44dd95724bc2 169
RobMeades 0:44dd95724bc2 170 // Make a cellular connection
RobMeades 0:44dd95724bc2 171 nsapi_error_t UbloxPPPCellularInterface::connect()
RobMeades 0:44dd95724bc2 172 {
RobMeades 0:44dd95724bc2 173 nsapi_error_t nsapi_error = NSAPI_ERROR_IS_CONNECTED;
RobMeades 0:44dd95724bc2 174 const char * config = NULL;
RobMeades 0:44dd95724bc2 175
RobMeades 0:44dd95724bc2 176 if (!_ppp_connection_up) {
RobMeades 0:44dd95724bc2 177
RobMeades 0:44dd95724bc2 178 // Set up modem and then register with the network
RobMeades 0:44dd95724bc2 179 if (init()) {
RobMeades 0:44dd95724bc2 180 // Perform any pending SIM actions
RobMeades 0:44dd95724bc2 181 if (_sim_pin_check_change_pending) {
RobMeades 0:44dd95724bc2 182 if (!sim_pin_check_enable(_sim_pin_check_change_pending_enabled_value)) {
RobMeades 0:44dd95724bc2 183 nsapi_error = NSAPI_ERROR_AUTH_FAILURE;
RobMeades 0:44dd95724bc2 184 }
RobMeades 0:44dd95724bc2 185 _sim_pin_check_change_pending = false;
RobMeades 0:44dd95724bc2 186 }
RobMeades 0:44dd95724bc2 187 if (_sim_pin_change_pending) {
RobMeades 0:44dd95724bc2 188 if (!change_sim_pin(_sim_pin_change_pending_new_pin_value)) {
RobMeades 0:44dd95724bc2 189 nsapi_error = NSAPI_ERROR_AUTH_FAILURE;
RobMeades 0:44dd95724bc2 190 }
RobMeades 0:44dd95724bc2 191 _sim_pin_change_pending = false;
RobMeades 0:44dd95724bc2 192 }
RobMeades 0:44dd95724bc2 193
RobMeades 0:44dd95724bc2 194 if (nsapi_error != NSAPI_ERROR_AUTH_FAILURE) {
RobMeades 0:44dd95724bc2 195 nsapi_error = NSAPI_ERROR_NO_CONNECTION;
RobMeades 0:44dd95724bc2 196 for (int retries = 0; (nsapi_error == NSAPI_ERROR_NO_CONNECTION) && (retries < 3); retries++) {
RobMeades 0:44dd95724bc2 197 if (nwk_registration()) {
RobMeades 0:44dd95724bc2 198 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 199 }
RobMeades 0:44dd95724bc2 200 }
RobMeades 0:44dd95724bc2 201 }
RobMeades 0:44dd95724bc2 202 } else {
RobMeades 0:44dd95724bc2 203 nsapi_error = NSAPI_ERROR_DEVICE_ERROR;
RobMeades 0:44dd95724bc2 204 }
RobMeades 0:44dd95724bc2 205
RobMeades 0:44dd95724bc2 206 if (nsapi_error == NSAPI_ERROR_OK) {
RobMeades 0:44dd95724bc2 207 // If the caller hasn't entered an APN, try to find it
RobMeades 0:44dd95724bc2 208 if (_apn == NULL) {
RobMeades 0:44dd95724bc2 209 config = apnconfig(_dev_info.imsi);
RobMeades 0:44dd95724bc2 210 }
RobMeades 0:44dd95724bc2 211
RobMeades 0:44dd95724bc2 212 // Attempt to connect
RobMeades 0:44dd95724bc2 213 do {
RobMeades 0:44dd95724bc2 214 // Set up APN and IP protocol for external PDP context
RobMeades 0:44dd95724bc2 215 get_next_credentials(config);
RobMeades 0:44dd95724bc2 216 nsapi_error = setup_context_and_credentials();
RobMeades 0:44dd95724bc2 217
RobMeades 0:44dd95724bc2 218 // Attempt to enter data mode
RobMeades 0:44dd95724bc2 219 if ((nsapi_error == NSAPI_ERROR_OK) && set_atd()) {
RobMeades 0:44dd95724bc2 220 // Initialise PPP
RobMeades 0:44dd95724bc2 221 // nsapi_ppp_connect() is a blocking call, it will block until
RobMeades 0:44dd95724bc2 222 // connected, or timeout after 30 seconds
RobMeades 0:44dd95724bc2 223 nsapi_error = nsapi_ppp_connect(_fh, _connection_status_cb, _uname, _pwd);
RobMeades 0:44dd95724bc2 224 _ppp_connection_up = (nsapi_error == NSAPI_ERROR_OK);
RobMeades 0:44dd95724bc2 225 }
RobMeades 0:44dd95724bc2 226 } while (!_ppp_connection_up && config && *config);
RobMeades 0:44dd95724bc2 227 }
RobMeades 0:44dd95724bc2 228
RobMeades 0:44dd95724bc2 229 if (!_ppp_connection_up) {
RobMeades 0:44dd95724bc2 230 tr_error("Failed to connect, check your APN/username/password");
RobMeades 0:44dd95724bc2 231 }
RobMeades 0:44dd95724bc2 232 }
RobMeades 0:44dd95724bc2 233
RobMeades 0:44dd95724bc2 234 return nsapi_error;
RobMeades 0:44dd95724bc2 235 }
RobMeades 0:44dd95724bc2 236
RobMeades 0:44dd95724bc2 237 // User initiated disconnect.
RobMeades 0:44dd95724bc2 238 nsapi_error_t UbloxPPPCellularInterface::disconnect()
RobMeades 0:44dd95724bc2 239 {
RobMeades 0:44dd95724bc2 240 nsapi_error_t nsapi_error = NSAPI_ERROR_DEVICE_ERROR;
RobMeades 0:44dd95724bc2 241
RobMeades 0:44dd95724bc2 242 if (nsapi_ppp_disconnect(_fh) == NSAPI_ERROR_OK) {
RobMeades 0:44dd95724bc2 243 _ppp_connection_up = false;
RobMeades 0:44dd95724bc2 244 // Get the "NO CARRIER" response out of the modem
RobMeades 0:44dd95724bc2 245 // so as not to confuse subsequent AT commands
RobMeades 0:44dd95724bc2 246 _at->send("AT") && _at->recv("NO CARRIER");
RobMeades 0:44dd95724bc2 247
RobMeades 0:44dd95724bc2 248 if (nwk_deregistration()) {
RobMeades 0:44dd95724bc2 249 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 250 }
RobMeades 0:44dd95724bc2 251 }
RobMeades 0:44dd95724bc2 252
RobMeades 0:44dd95724bc2 253 return nsapi_error;
RobMeades 0:44dd95724bc2 254 }
RobMeades 0:44dd95724bc2 255
RobMeades 0:44dd95724bc2 256 // Enable or disable SIM PIN check lock.
RobMeades 0:44dd95724bc2 257 nsapi_error_t UbloxPPPCellularInterface::set_sim_pin_check(bool set,
RobMeades 0:44dd95724bc2 258 bool immediate,
RobMeades 0:44dd95724bc2 259 const char *sim_pin)
RobMeades 0:44dd95724bc2 260 {
RobMeades 0:44dd95724bc2 261 nsapi_error_t nsapi_error = NSAPI_ERROR_AUTH_FAILURE;
RobMeades 0:44dd95724bc2 262
RobMeades 0:44dd95724bc2 263 if (sim_pin != NULL) {
RobMeades 0:44dd95724bc2 264 _pin = sim_pin;
RobMeades 0:44dd95724bc2 265 }
RobMeades 0:44dd95724bc2 266
RobMeades 0:44dd95724bc2 267 if (immediate) {
RobMeades 0:44dd95724bc2 268 if (init()) {
RobMeades 0:44dd95724bc2 269 if (sim_pin_check_enable(set)) {
RobMeades 0:44dd95724bc2 270 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 271 }
RobMeades 0:44dd95724bc2 272 } else {
RobMeades 0:44dd95724bc2 273 nsapi_error = NSAPI_ERROR_DEVICE_ERROR;
RobMeades 0:44dd95724bc2 274 }
RobMeades 0:44dd95724bc2 275 } else {
RobMeades 0:44dd95724bc2 276 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 277 _sim_pin_check_change_pending = true;
RobMeades 0:44dd95724bc2 278 _sim_pin_check_change_pending_enabled_value = set;
RobMeades 0:44dd95724bc2 279 }
RobMeades 0:44dd95724bc2 280
RobMeades 0:44dd95724bc2 281 return nsapi_error;
RobMeades 0:44dd95724bc2 282 }
RobMeades 0:44dd95724bc2 283
RobMeades 0:44dd95724bc2 284 // Change the PIN code for the SIM card.
RobMeades 0:44dd95724bc2 285 nsapi_error_t UbloxPPPCellularInterface::set_new_sim_pin(const char *new_pin,
RobMeades 0:44dd95724bc2 286 bool immediate,
RobMeades 0:44dd95724bc2 287 const char *old_pin)
RobMeades 0:44dd95724bc2 288 {
RobMeades 0:44dd95724bc2 289 nsapi_error_t nsapi_error = NSAPI_ERROR_AUTH_FAILURE;
RobMeades 0:44dd95724bc2 290
RobMeades 0:44dd95724bc2 291 if (old_pin != NULL) {
RobMeades 0:44dd95724bc2 292 _pin = old_pin;
RobMeades 0:44dd95724bc2 293 }
RobMeades 0:44dd95724bc2 294
RobMeades 0:44dd95724bc2 295 if (immediate) {
RobMeades 0:44dd95724bc2 296 if (init()) {
RobMeades 0:44dd95724bc2 297 if (change_sim_pin(new_pin)) {
RobMeades 0:44dd95724bc2 298 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 299 }
RobMeades 0:44dd95724bc2 300 } else {
RobMeades 0:44dd95724bc2 301 nsapi_error = NSAPI_ERROR_DEVICE_ERROR;
RobMeades 0:44dd95724bc2 302 }
RobMeades 0:44dd95724bc2 303 } else {
RobMeades 0:44dd95724bc2 304 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 305 _sim_pin_change_pending = true;
RobMeades 0:44dd95724bc2 306 _sim_pin_change_pending_new_pin_value = new_pin;
RobMeades 0:44dd95724bc2 307 }
RobMeades 0:44dd95724bc2 308
RobMeades 0:44dd95724bc2 309 return nsapi_error;
RobMeades 0:44dd95724bc2 310 }
RobMeades 0:44dd95724bc2 311
RobMeades 0:44dd95724bc2 312 // Determine if PPP is up.
RobMeades 0:44dd95724bc2 313 bool UbloxPPPCellularInterface::is_connected()
RobMeades 0:44dd95724bc2 314 {
RobMeades 0:44dd95724bc2 315 return _ppp_connection_up;
RobMeades 0:44dd95724bc2 316 }
RobMeades 0:44dd95724bc2 317
RobMeades 0:44dd95724bc2 318 // Get our IP address.
RobMeades 0:44dd95724bc2 319 const char *UbloxPPPCellularInterface::get_ip_address()
RobMeades 0:44dd95724bc2 320 {
RobMeades 0:44dd95724bc2 321 return nsapi_ppp_get_ip_addr(_fh);
RobMeades 0:44dd95724bc2 322 }
RobMeades 0:44dd95724bc2 323
RobMeades 0:44dd95724bc2 324 // Get the local network mask.
RobMeades 0:44dd95724bc2 325 const char *UbloxPPPCellularInterface::get_netmask()
RobMeades 0:44dd95724bc2 326 {
RobMeades 0:44dd95724bc2 327 return nsapi_ppp_get_netmask(_fh);
RobMeades 0:44dd95724bc2 328 }
RobMeades 0:44dd95724bc2 329
RobMeades 0:44dd95724bc2 330 // Get the local gateways.
RobMeades 0:44dd95724bc2 331 const char *UbloxPPPCellularInterface::get_gateway()
RobMeades 0:44dd95724bc2 332 {
RobMeades 0:44dd95724bc2 333 return nsapi_ppp_get_ip_addr(_fh);
RobMeades 0:44dd95724bc2 334 }
RobMeades 0:44dd95724bc2 335
RobMeades 0:44dd95724bc2 336 // Set the callback to be called in case the connection is lost.
RobMeades 0:44dd95724bc2 337 void UbloxPPPCellularInterface::connection_status_cb(Callback<void(nsapi_error_t)> cb)
RobMeades 0:44dd95724bc2 338 {
RobMeades 0:44dd95724bc2 339 _connection_status_cb = cb;
RobMeades 0:44dd95724bc2 340 }
RobMeades 0:44dd95724bc2 341
RobMeades 0:44dd95724bc2 342 #endif // NSAPI_PPP_AVAILABLE
RobMeades 0:44dd95724bc2 343
RobMeades 0:44dd95724bc2 344 // End of File
RobMeades 0:44dd95724bc2 345