mirror of https://github.com/ARMmbed/mbed-os.git
Finalizing the public API for Cellular
* state machine corrections * adding various standard API methods * Addition/revision/enhancement of the nsapi_ppp glue layer * Turning off debug by defaultpull/4119/head
parent
f602c936ff
commit
01088647b9
|
@ -7,6 +7,9 @@
|
|||
#include "cmsis_os.h"
|
||||
#include "mbed_interface.h"
|
||||
|
||||
// Check for Ethernet HAL being present
|
||||
#ifdef ETH_SUCCESS
|
||||
|
||||
#define RECV_TASK_PRI (osPriorityHigh)
|
||||
#define PHY_TASK_PRI (osPriorityLow)
|
||||
#define PHY_TASK_WAIT (200)
|
||||
|
@ -512,3 +515,6 @@ void mbed_default_mac_address(char *mac) {
|
|||
|
||||
return;
|
||||
}
|
||||
|
||||
#endif //ETH_SUCCESS
|
||||
|
||||
|
|
|
@ -510,7 +510,9 @@ nsapi_error_t mbed_lwip_bringup(bool dhcp, bool ppp, const char *ip, const char
|
|||
}
|
||||
|
||||
netif_inited = true;
|
||||
netif_is_ppp = ppp;
|
||||
if (ppp) {
|
||||
netif_is_ppp = ppp;
|
||||
}
|
||||
|
||||
netif_set_default(&lwip_netif);
|
||||
netif_set_link_callback(&lwip_netif, mbed_lwip_netif_link_irq);
|
||||
|
@ -565,6 +567,9 @@ nsapi_error_t mbed_lwip_bringup(bool dhcp, bool ppp, const char *ip, const char
|
|||
|
||||
if (!netif_is_link_up(&lwip_netif)) {
|
||||
if (sys_arch_sem_wait(&lwip_netif_linked, 15000) == SYS_ARCH_TIMEOUT) {
|
||||
if (ppp) {
|
||||
ppp_lwip_disconnect();
|
||||
}
|
||||
return NSAPI_ERROR_NO_CONNECTION;
|
||||
}
|
||||
}
|
||||
|
@ -588,6 +593,9 @@ nsapi_error_t mbed_lwip_bringup(bool dhcp, bool ppp, const char *ip, const char
|
|||
// If doesn't have address
|
||||
if (!mbed_lwip_get_ip_addr(true, &lwip_netif)) {
|
||||
if (sys_arch_sem_wait(&lwip_netif_has_addr, 15000) == SYS_ARCH_TIMEOUT) {
|
||||
if (ppp) {
|
||||
ppp_lwip_disconnect();
|
||||
}
|
||||
return NSAPI_ERROR_DHCP_FAILURE;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,15 +50,17 @@ using events::EventQueue;
|
|||
static EventQueue *event_queue;
|
||||
static Thread *event_thread;
|
||||
static volatile bool event_queued;
|
||||
static nsapi_error_t connect_error_code;
|
||||
|
||||
// Just one interface for now
|
||||
static FileHandle *my_stream;
|
||||
static ppp_pcb *my_ppp_pcb;
|
||||
static bool ppp_link_up = false;
|
||||
static bool ppp_active = false;
|
||||
static const char *login;
|
||||
static const char *pwd;
|
||||
static sys_sem_t ppp_close_sem;
|
||||
static void (*notify_ppp_link_down)(void) = 0;
|
||||
static void (*notify_ppp_link_down)(nsapi_error_t) = 0;
|
||||
|
||||
static EventQueue *prepare_event_queue()
|
||||
{
|
||||
|
@ -118,15 +120,18 @@ static u32_t ppp_output(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx)
|
|||
len -= ret;
|
||||
}
|
||||
|
||||
tr_debug("> %ld\n", (long) written);
|
||||
// /tr_debug("> %ld bytes of data written\n", (long) written);
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
static void ppp_link_status(ppp_pcb *pcb, int err_code, void *ctx)
|
||||
{
|
||||
nsapi_error_t mapped_err_code = NSAPI_ERROR_NO_CONNECTION;
|
||||
|
||||
switch(err_code) {
|
||||
case PPPERR_NONE: {
|
||||
mapped_err_code = NSAPI_ERROR_OK;
|
||||
tr_info("status_cb: Connected");
|
||||
#if PPP_IPV4_SUPPORT
|
||||
tr_debug(" our_ipaddr = %s", ipaddr_ntoa(&ppp_netif(pcb)->ip_addr));
|
||||
|
@ -171,10 +176,12 @@ static void ppp_link_status(ppp_pcb *pcb, int err_code, void *ctx)
|
|||
}
|
||||
case PPPERR_CONNECT: {
|
||||
tr_info("status_cb: Connection lost");
|
||||
mapped_err_code = NSAPI_ERROR_CONNECTION_LOST;
|
||||
break;
|
||||
}
|
||||
case PPPERR_AUTHFAIL: {
|
||||
tr_info("status_cb: Failed authentication challenge");
|
||||
mapped_err_code = NSAPI_ERROR_AUTH_FAILURE;
|
||||
break;
|
||||
}
|
||||
case PPPERR_PROTOCOL: {
|
||||
|
@ -183,6 +190,7 @@ static void ppp_link_status(ppp_pcb *pcb, int err_code, void *ctx)
|
|||
}
|
||||
case PPPERR_PEERDEAD: {
|
||||
tr_info("status_cb: Connection timeout");
|
||||
mapped_err_code = NSAPI_ERROR_CONNECTION_TIMEOUT;
|
||||
break;
|
||||
}
|
||||
case PPPERR_IDLETIMEOUT: {
|
||||
|
@ -211,13 +219,15 @@ static void ppp_link_status(ppp_pcb *pcb, int err_code, void *ctx)
|
|||
}
|
||||
|
||||
/* If some error happened, we need to properly shutdown the PPP interface */
|
||||
if (ppp_link_up) {
|
||||
if (ppp_active) {
|
||||
ppp_link_up = false;
|
||||
ppp_active = false;
|
||||
connect_error_code = mapped_err_code;
|
||||
sys_sem_signal(&ppp_close_sem);
|
||||
}
|
||||
|
||||
/* Alright, PPP interface is down, we need to notify upper layer */
|
||||
notify_ppp_link_down();
|
||||
notify_ppp_link_down(mapped_err_code);
|
||||
}
|
||||
|
||||
#if !PPP_INPROC_IRQ_SAFE
|
||||
|
@ -276,11 +286,13 @@ extern "C" err_t ppp_lwip_connect()
|
|||
#if PPP_AUTH_SUPPORT
|
||||
ppp_set_auth(my_ppp_pcb, PPPAUTHTYPE_ANY, login, pwd);
|
||||
#endif //PPP_AUTH_SUPPORT
|
||||
|
||||
ppp_active = true;
|
||||
err_t ret = ppp_connect(my_ppp_pcb, 0);
|
||||
// lwIP's ppp.txt says input must not be called until after connect
|
||||
if (ret == ERR_OK) {
|
||||
my_stream->sigio(callback(stream_cb));
|
||||
} else {
|
||||
ppp_active = false;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -326,7 +338,12 @@ extern "C" nsapi_error_t ppp_lwip_if_init(struct netif *netif)
|
|||
return NSAPI_ERROR_OK;
|
||||
}
|
||||
|
||||
nsapi_error_t nsapi_ppp_connect(FileHandle *stream, void (*ppp_link_down_cb)(void), const char *uname, const char *password)
|
||||
nsapi_error_t nsapi_ppp_error_code()
|
||||
{
|
||||
return connect_error_code;
|
||||
}
|
||||
|
||||
nsapi_error_t nsapi_ppp_connect(FileHandle *stream, void (*ppp_link_down_cb)(int), const char *uname, const char *password)
|
||||
{
|
||||
if (my_stream) {
|
||||
return NSAPI_ERROR_PARAMETER;
|
||||
|
@ -339,9 +356,14 @@ nsapi_error_t nsapi_ppp_connect(FileHandle *stream, void (*ppp_link_down_cb)(voi
|
|||
|
||||
// mustn't start calling input until after connect -
|
||||
// attach deferred until ppp_lwip_connect, called from mbed_lwip_bringup
|
||||
return mbed_lwip_bringup(false, true, NULL, NULL, NULL);
|
||||
}
|
||||
nsapi_error_t retcode = mbed_lwip_bringup(false, true, NULL, NULL, NULL);
|
||||
|
||||
if (retcode != NSAPI_ERROR_OK && connect_error_code != NSAPI_ERROR_OK) {
|
||||
return connect_error_code;
|
||||
} else {
|
||||
return retcode;
|
||||
}
|
||||
}
|
||||
|
||||
nsapi_error_t nsapi_ppp_disconnect(FileHandle *stream)
|
||||
{
|
||||
|
@ -353,6 +375,31 @@ NetworkStack *nsapi_ppp_get_stack()
|
|||
return nsapi_create_stack(&lwip_stack);
|
||||
}
|
||||
|
||||
char *nsapi_ppp_get_ip_addr(char *ip_addr, nsapi_size_t buflen)
|
||||
{
|
||||
if (mbed_lwip_get_ip_address(ip_addr, buflen)) {
|
||||
return ip_addr;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
char *nsapi_ppp_get_netmask(char *netmask, nsapi_size_t buflen)
|
||||
{
|
||||
if (mbed_lwip_get_netmask(netmask, buflen)) {
|
||||
return netmask;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
char *nsapi_ppp_get_gw_addr(char *default_gw_addr)
|
||||
{
|
||||
if (mbed_lwip_get_gateway(default_gw_addr, sizeof default_gw_addr)) {
|
||||
return default_gw_addr;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* LWIP_PPP_API */
|
||||
|
||||
} // namespace mbed
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
* Common interface that is shared between Cellular interfaces
|
||||
*/
|
||||
class CellularInterface: public NetworkInterface {
|
||||
|
||||
public:
|
||||
/** CellularInterface lifetime
|
||||
*/
|
||||
//virtual ~CellularInterface() {};
|
||||
|
@ -36,14 +38,14 @@ class CellularInterface: public NetworkInterface {
|
|||
* @param pwd optionally, password
|
||||
*/
|
||||
virtual void set_credentials(const char *apn,
|
||||
const char *uname = 0,
|
||||
const char *pwd = 0) = 0;
|
||||
const char *uname = 0,
|
||||
const char *pwd = 0) = 0;
|
||||
|
||||
/** Set the pin code for SIM card
|
||||
*
|
||||
* @param sim_pin PIN for the SIM card
|
||||
*/
|
||||
virtual void set_SIM_pin(const char *sim_pin) = 0;
|
||||
virtual void set_sim_pin(const char *sim_pin) = 0;
|
||||
|
||||
/** Start the interface
|
||||
*
|
||||
|
@ -73,6 +75,36 @@ class CellularInterface: public NetworkInterface {
|
|||
* @return 0 on success, or error code on failure
|
||||
*/
|
||||
virtual nsapi_error_t disconnect() = 0;
|
||||
|
||||
/** Check if the connection is currently established or not
|
||||
*
|
||||
* @return true/false If the cellular module have successfully acquired a carrier and is
|
||||
* connected to an external packet data network using PPP, isConnected()
|
||||
* API returns true and false otherwise.
|
||||
*/
|
||||
virtual bool is_connected() = 0;
|
||||
|
||||
/** Get the local IP address
|
||||
*
|
||||
* @return Null-terminated representation of the local IP address
|
||||
* or null if no IP address has been recieved
|
||||
*/
|
||||
virtual const char *get_ip_address() = 0;
|
||||
|
||||
/** Get the local network mask
|
||||
*
|
||||
* @return Null-terminated representation of the local network mask
|
||||
* or null if no network mask has been recieved
|
||||
*/
|
||||
virtual const char *get_netmask() = 0;
|
||||
|
||||
/** Get the local gateways
|
||||
*
|
||||
* @return Null-terminated representation of the local gateway
|
||||
* or null if no network mask has been recieved
|
||||
*/
|
||||
virtual const char *get_gateway() = 0;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -24,8 +24,11 @@
|
|||
namespace mbed {
|
||||
|
||||
NetworkStack *nsapi_ppp_get_stack();
|
||||
nsapi_error_t nsapi_ppp_connect(FileHandle *stream, void(*link_down_cb)(void)=0, const char *uname=0, const char *pwd=0);
|
||||
nsapi_error_t nsapi_ppp_connect(FileHandle *stream, void(*link_down_cb)(int)=0, const char *uname=0, const char *pwd=0);
|
||||
nsapi_error_t nsapi_ppp_disconnect(FileHandle *stream);
|
||||
char *nsapi_ppp_get_ip_addr(char *ip_addr, nsapi_size_t buflen);
|
||||
char *nsapi_ppp_get_netmask(char *netmask, nsapi_size_t buflen);
|
||||
char *nsapi_ppp_get_gw_addr(char *gateway_addr, nsapi_size_t buflen);
|
||||
} //namespace mbed
|
||||
|
||||
#endif /* NSAPI_PPP_H_ */
|
||||
|
|
|
@ -35,22 +35,24 @@ extern "C" {
|
|||
* @enum nsapi_error_t
|
||||
*/
|
||||
enum nsapi_error {
|
||||
NSAPI_ERROR_OK = 0, /*!< no error */
|
||||
NSAPI_ERROR_WOULD_BLOCK = -3001, /*!< no data is not available but call is non-blocking */
|
||||
NSAPI_ERROR_UNSUPPORTED = -3002, /*!< unsupported functionality */
|
||||
NSAPI_ERROR_PARAMETER = -3003, /*!< invalid configuration */
|
||||
NSAPI_ERROR_NO_CONNECTION = -3004, /*!< not connected to a network */
|
||||
NSAPI_ERROR_NO_SOCKET = -3005, /*!< socket not available for use */
|
||||
NSAPI_ERROR_NO_ADDRESS = -3006, /*!< IP address is not known */
|
||||
NSAPI_ERROR_NO_MEMORY = -3007, /*!< memory resource not available */
|
||||
NSAPI_ERROR_NO_SSID = -3008, /*!< ssid not found */
|
||||
NSAPI_ERROR_DNS_FAILURE = -3009, /*!< DNS failed to complete successfully */
|
||||
NSAPI_ERROR_DHCP_FAILURE = -3010, /*!< DHCP failed to complete successfully */
|
||||
NSAPI_ERROR_AUTH_FAILURE = -3011, /*!< connection to access point failed */
|
||||
NSAPI_ERROR_DEVICE_ERROR = -3012, /*!< failure interfacing with the network processor */
|
||||
NSAPI_ERROR_IN_PROGRESS = -3013, /*!< operation (eg connect) in progress */
|
||||
NSAPI_ERROR_ALREADY = -3014, /*!< operation (eg connect) already in progress */
|
||||
NSAPI_ERROR_IS_CONNECTED = -3015, /*!< socket is already connected */
|
||||
NSAPI_ERROR_OK = 0, /*!< no error */
|
||||
NSAPI_ERROR_WOULD_BLOCK = -3001, /*!< no data is not available but call is non-blocking */
|
||||
NSAPI_ERROR_UNSUPPORTED = -3002, /*!< unsupported functionality */
|
||||
NSAPI_ERROR_PARAMETER = -3003, /*!< invalid configuration */
|
||||
NSAPI_ERROR_NO_CONNECTION = -3004, /*!< not connected to a network */
|
||||
NSAPI_ERROR_NO_SOCKET = -3005, /*!< socket not available for use */
|
||||
NSAPI_ERROR_NO_ADDRESS = -3006, /*!< IP address is not known */
|
||||
NSAPI_ERROR_NO_MEMORY = -3007, /*!< memory resource not available */
|
||||
NSAPI_ERROR_NO_SSID = -3008, /*!< ssid not found */
|
||||
NSAPI_ERROR_DNS_FAILURE = -3009, /*!< DNS failed to complete successfully */
|
||||
NSAPI_ERROR_DHCP_FAILURE = -3010, /*!< DHCP failed to complete successfully */
|
||||
NSAPI_ERROR_AUTH_FAILURE = -3011, /*!< connection to access point failed */
|
||||
NSAPI_ERROR_DEVICE_ERROR = -3012, /*!< failure interfacing with the network processor */
|
||||
NSAPI_ERROR_IN_PROGRESS = -3013, /*!< operation (eg connect) in progress */
|
||||
NSAPI_ERROR_ALREADY = -3014, /*!< operation (eg connect) already in progress */
|
||||
NSAPI_ERROR_IS_CONNECTED = -3015, /*!< socket is already connected */
|
||||
NSAPI_ERROR_CONNECTION_LOST = -3016, /*!< connection lost */
|
||||
NSAPI_ERROR_CONNECTION_TIMEOUT = -3017, /*!< connection timed out */
|
||||
};
|
||||
|
||||
/** Type used to represent error codes
|
||||
|
@ -82,6 +84,8 @@ typedef enum nsapi_security {
|
|||
NSAPI_SECURITY_WPA = 0x2, /*!< phrase conforms to WPA */
|
||||
NSAPI_SECURITY_WPA2 = 0x3, /*!< phrase conforms to WPA2 */
|
||||
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_UNKNOWN = 0xFF, /*!< unknown/unsupported security in scan results */
|
||||
} nsapi_security_t;
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ public:
|
|||
* @param timeout timeout of the connection
|
||||
* @param debug turns on/off debug output for AT commands
|
||||
*/
|
||||
ATParser(FileHandle *fh, const char *output_delimiter="\r", int buffer_size = 256, int timeout = 8000, bool debug = true) :
|
||||
ATParser(FileHandle *fh, const char *output_delimiter="\r", int buffer_size = 256, int timeout = 8000, bool debug = false) :
|
||||
_fh(fh),
|
||||
_buffer_size(buffer_size),
|
||||
_in_prev(0),
|
||||
|
|
Loading…
Reference in New Issue