Implementation of the NetworkSocketAPI for LWIP
Dependencies: lwip-eth lwip-sys lwip
Dependents: HelloLWIPInterface HelloLWIPInterfaceNonBlocking LWIPInterfaceTests SimpleHTTPExample ... more
Diff: LWIPInterface.h
- Revision:
- 12:899403b675fe
- Parent:
- 8:cef01e812975
- Child:
- 13:57d9e1721826
--- a/LWIPInterface.h Fri Apr 01 17:18:39 2016 +0000 +++ b/LWIPInterface.h Tue Apr 05 19:20:42 2016 +0000 @@ -14,7 +14,8 @@ * limitations under the License. */ -#ifndef LWIP_INTERFACE_H +#if 0 +//#ifndef LWIP_INTERFACE_H #define LWIP_INTERFACE_H #include "EthernetInterface.h" @@ -28,36 +29,185 @@ class LWIPInterface : public EthernetInterface { public: + virtual ~NetworkInterface() {}; - // Implementation of EthernetInterface - virtual int32_t connect(); - virtual int32_t disconnect(); + /** Get the internally stored IP address + /return IP address of the interface or null if not yet connected + */ + virtual const char *get_ip_address() = 0; + + /** Get the internally stored MAC address + /return MAC address of the interface + */ + virtual const char *get_mac_address() = 0; + + /** Get the current status of the interface + /return true if connected + */ + virtual bool is_connected() { + return get_ip_address() != NULL; + } + + /** Looks up the specified host's IP address + /param name Hostname to lookup + /param dest Destination for IP address, must have space for SocketAddress::IP_SIZE + /return 0 on success, negative on failure + */ + virtual int gethostbyname(const char *name, char *dest); + +protected: + friend class Socket; + friend class UDPSocket; + friend class TCPSocket; + friend class TCPServer; + + /** Enum of socket protocols + /enum protocol_t + */ + enum protocol_t { + TCP, /*!< Socket is of TCP type */ + UDP, /*!< Socket is of UDP type */ + }; - // Implementation of NetworkInterface - virtual const char *getIPAddress(); - virtual const char *getMACAddress(); + /** Create a socket + /param proto The type of socket to open, TCP or UDP + /return The alocated socket or null on failure + */ + virtual void *socket_create(protocol_t proto) = 0; + + /** Destroy a socket + /param socket Previously allocated socket + */ + virtual void socket_destroy(void *handle) = 0; + + /** Set socket options + \param handle Socket handle + \param optname Option ID + \param optval Option value + \param optlen Length of the option value + \return 0 on success, negative on failure + */ + virtual int socket_set_option(void *handle, int optname, const void *optval, unsigned int optlen) = 0; - virtual SocketInterface *createSocket(ns_protocol_t proto); - virtual void destroySocket(SocketInterface *socket); + /** Get socket options + \param handle Socket handle + \param optname Option ID + \param optval Buffer pointer where to write the option value + \param optlen Length of the option value + \return 0 on success, negative on failure + */ + virtual int socket_get_option(void *handle, int optname, void *optval, unsigned int *optlen) = 0; -private: + /** Bind a server socket to a specific port + \param handle Socket handle + \param port The port to listen for incoming connections on + \return 0 on success, negative on failure. + */ + virtual int socket_bind(void *handle, int port) = 0; + + /** Start listening for incoming connections + \param handle Socket handle + \param backlog Number of pending connections that can be queued up at any + one time [Default: 1] + \return 0 on success, negative on failure + */ + virtual int socket_listen(void *handle, int backlog) = 0; - // Implementation of the TCP SocketInterface for LWIP - class LWIPSocket : public SocketInterface - { - public: + /** Connects this TCP socket to the server + \param handle Socket handle + \param address SocketAddress to connect to + \return 0 on success, negative on failure + */ + virtual int socket_connect(void *handle, const SocketAddress &address) = 0; + + /** Check if the socket is connected + \param handle Socket handle + \return true if connected, false otherwise + */ + virtual bool socket_is_connected(void *handle) = 0; - LWIPSocket(int fd) : fd(fd) {} - int fd; + /** Accept a new connection. + \param handle Socket handle + \param socket A TCPSocket instance that will handle the incoming connection. + \return 0 on success, negative on failure. + \note This call is not-blocking, if this call would block, must + immediately return NSAPI_ERROR_WOULD_WAIT + */ + virtual int socket_accept(void *handle, void **connection) = 0; + + /** Send data to the remote host + \param handle Socket handle + \param data The buffer to send to the host + \param size The length of the buffer to send + \return Number of written bytes on success, negative on failure + \note This call is not-blocking, if this call would block, must + immediately return NSAPI_ERROR_WOULD_WAIT + */ + virtual int socket_send(void *handle, const void *data, unsigned size) = 0; + + /** Receive data from the remote host + \param handle Socket handle + \param data The buffer in which to store the data received from the host + \param size The maximum length of the buffer + \return Number of received bytes on success, negative on failure + \note This call is not-blocking, if this call would block, must + immediately return NSAPI_ERROR_WOULD_WAIT + */ + virtual int socket_recv(void *handle, void *data, unsigned size) = 0; - // Implementation of SocketInterface - virtual int32_t open(const char *ip, uint16_t port); - virtual int32_t close(); + /** Send a packet to a remote endpoint + \param handle Socket handle + \param address The remote SocketAddress + \param data The packet to be sent + \param size The length of the packet to be sent + \return the number of written bytes on success, negative on failure + \note This call is not-blocking, if this call would block, must + immediately return NSAPI_ERROR_WOULD_WAIT + */ + virtual int socket_sendto(void *handle, const SocketAddress &address, const void *data, unsigned size) = 0; + + /** Receive a packet from a remote endpoint + \param handle Socket handle + \param address Destination for the remote SocketAddress or null + \param buffer The buffer for storing the incoming packet data + If a packet is too long to fit in the supplied buffer, + excess bytes are discarded + \param size The length of the buffer + \return the number of received bytes on success, negative on failure + \note This call is not-blocking, if this call would block, must + immediately return NSAPI_ERROR_WOULD_WAIT + */ + virtual int socket_recvfrom(void *handle, SocketAddress *address, void *buffer, unsigned size) = 0; - virtual int32_t send(const void *data, uint32_t size); - virtual int32_t recv(void *data, uint32_t size); - }; + /** Close the socket + \param handle Socket handle + \param shutdown free the left-over data in message queues + */ + virtual int socket_close(void *handle, bool shutdown) = 0; + + /** Register a callback on when a new connection is ready + \param handle Socket handle + \param callback Function to call when accept will succeed, may be called in + interrupt context. + \param id Argument to pass to callback + */ + virtual void socket_attach_accept(void *handle, void (*callback)(void *), void *id) = 0; + + /** Register a callback on when send is ready + \param handle Socket handle + \param callback Function to call when accept will succeed, may be called in + interrupt context. + \param id Argument to pass to callback + */ + virtual void socket_attach_send(void *handle, void (*callback)(void *), void *id) = 0; + + /** Register a callback on when recv is ready + \param handle Socket handle + \param callback Function to call when accept will succeed, may be called in + interrupt context. + \param id Argument to pass to callback + */ + virtual void socket_attach_recv(void *handle, void (*callback)(void *), void *id) = 0; }; - #endif