Base class for IP Based Networking Libraries

Dependencies:   DnsQuery

Dependents:   TempTower BSDInterfaceTests HelloBSDInterface ESP8266InterfaceTests ... more

For a complete getting started guide see the wiki...

Network Socket API

The Network Socket API provides a common interface for using sockets on network devices. The API provides a simple class-based interface that should be familiar to users experienced with other socket APIs. Additionally, the API provides a simple interface for implementing network devices, making it easy to connect hardware agnostic programs to new devices.

Network Interfaces

The NetworkInterface provides an abstract class for network devices that support sockets. Devices should provide a DeviceInterface class that inherits this interface and adds implementation specific methods for using the device. A NetworkInterface must be provided to a Socket constructor to open a socket on the interface. Currently two subclasses are defined for common devices, EthernetInterface and WiFiInterface.

Sockets

The Socket class is used for managing network sockets. Once opened, the socket provides a pipe through which data can sent and recieved to a specific endpoint. The socket class can be instantiated as either a TCPSocket or a UDPSocket which defines the protocol used for the connection.

Committer:
Christopher Haster
Date:
Wed Apr 20 11:07:19 2016 -0500
Revision:
114:964eba6394bc
Parent:
112:e0cbb3e43c20
Child:
123:556a038fdf63
Move get_mac_address into Interface interface

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Christopher Haster 105:2fd212f8da61 1 /* NetworkStack
Christopher Haster 105:2fd212f8da61 2 * Copyright (c) 2015 ARM Limited
Christopher Haster 105:2fd212f8da61 3 *
Christopher Haster 105:2fd212f8da61 4 * Licensed under the Apache License, Version 2.0 (the "License");
Christopher Haster 105:2fd212f8da61 5 * you may not use this file except in compliance with the License.
Christopher Haster 105:2fd212f8da61 6 * You may obtain a copy of the License at
Christopher Haster 105:2fd212f8da61 7 *
Christopher Haster 105:2fd212f8da61 8 * http://www.apache.org/licenses/LICENSE-2.0
Christopher Haster 105:2fd212f8da61 9 *
Christopher Haster 105:2fd212f8da61 10 * Unless required by applicable law or agreed to in writing, software
Christopher Haster 105:2fd212f8da61 11 * distributed under the License is distributed on an "AS IS" BASIS,
Christopher Haster 105:2fd212f8da61 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Christopher Haster 105:2fd212f8da61 13 * See the License for the specific language governing permissions and
Christopher Haster 105:2fd212f8da61 14 * limitations under the License.
Christopher Haster 105:2fd212f8da61 15 */
Christopher Haster 105:2fd212f8da61 16
Christopher Haster 105:2fd212f8da61 17 #ifndef NETWORK_INTERFACE_H
Christopher Haster 105:2fd212f8da61 18 #define NETWORK_INTERFACE_H
Christopher Haster 105:2fd212f8da61 19
Christopher Haster 105:2fd212f8da61 20 #include "mbed.h"
Christopher Haster 105:2fd212f8da61 21 #include "SocketAddress.h"
Christopher Haster 105:2fd212f8da61 22
Christopher Haster 105:2fd212f8da61 23
Christopher Haster 105:2fd212f8da61 24 /** Enum of standardized error codes
Christopher Haster 105:2fd212f8da61 25 *
Christopher Haster 105:2fd212f8da61 26 * Valid error codes have negative values and may
Christopher Haster 105:2fd212f8da61 27 * be returned by any network operation.
Christopher Haster 105:2fd212f8da61 28 *
Christopher Haster 105:2fd212f8da61 29 * @enum nsapi_error_t
Christopher Haster 105:2fd212f8da61 30 */
Christopher Haster 105:2fd212f8da61 31 enum nsapi_error_t {
Christopher Haster 105:2fd212f8da61 32 NSAPI_ERROR_WOULD_BLOCK = -3001, /*!< no data is not available but call is non-blocking */
Christopher Haster 105:2fd212f8da61 33 NSAPI_ERROR_UNSUPPORTED = -3002, /*!< unsupported configuration */
Christopher Haster 105:2fd212f8da61 34 NSAPI_ERROR_NO_CONNECTION = -3003, /*!< not connected to a network */
Christopher Haster 105:2fd212f8da61 35 NSAPI_ERROR_NO_SOCKET = -3004, /*!< socket not available for use */
Christopher Haster 105:2fd212f8da61 36 NSAPI_ERROR_NO_ADDRESS = -3005, /*!< IP address is not known */
Christopher Haster 105:2fd212f8da61 37 NSAPI_ERROR_NO_MEMORY = -3006, /*!< memory resource not available */
Christopher Haster 105:2fd212f8da61 38 NSAPI_ERROR_DNS_FAILURE = -3007, /*!< DNS failed to complete successfully */
Christopher Haster 105:2fd212f8da61 39 NSAPI_ERROR_DHCP_FAILURE = -3008, /*!< DHCP failed to complete successfully */
Christopher Haster 105:2fd212f8da61 40 NSAPI_ERROR_AUTH_FAILURE = -3009, /*!< connection to access point faield */
Christopher Haster 105:2fd212f8da61 41 NSAPI_ERROR_DEVICE_ERROR = -3010, /*!< failure interfacing with the network procesor */
Christopher Haster 105:2fd212f8da61 42 };
Christopher Haster 105:2fd212f8da61 43
Christopher Haster 105:2fd212f8da61 44 /** Enum of socket protocols
Christopher Haster 105:2fd212f8da61 45 *
Christopher Haster 105:2fd212f8da61 46 * The socket protocol specifies a particular protocol to
Christopher Haster 105:2fd212f8da61 47 * be used with a newly created socket.
Christopher Haster 105:2fd212f8da61 48 *
Christopher Haster 105:2fd212f8da61 49 * @enum nsapi_protocol_t
Christopher Haster 105:2fd212f8da61 50 */
Christopher Haster 105:2fd212f8da61 51 enum nsapi_protocol_t {
Christopher Haster 105:2fd212f8da61 52 NSAPI_TCP, /*!< Socket is of TCP type */
Christopher Haster 105:2fd212f8da61 53 NSAPI_UDP, /*!< Socket is of UDP type */
Christopher Haster 105:2fd212f8da61 54 };
Christopher Haster 105:2fd212f8da61 55
Christopher Haster 112:e0cbb3e43c20 56 /* Enum of standardized stack option levels
Christopher Haster 112:e0cbb3e43c20 57 *
Christopher Haster 112:e0cbb3e43c20 58 * @enum nsapi_level_t
Christopher Haster 112:e0cbb3e43c20 59 */
Christopher Haster 112:e0cbb3e43c20 60 enum nsapi_level_t {
Christopher Haster 112:e0cbb3e43c20 61 NSAPI_STACK, /*!< Stack option level */
Christopher Haster 112:e0cbb3e43c20 62 NSAPI_SOCKET, /*!< Socket option level */
Christopher Haster 112:e0cbb3e43c20 63 };
Christopher Haster 112:e0cbb3e43c20 64
Christopher Haster 112:e0cbb3e43c20 65 /* Enum of standardized stack options
Christopher Haster 112:e0cbb3e43c20 66 *
Christopher Haster 112:e0cbb3e43c20 67 * These options may not be supported on all stacks, in which
Christopher Haster 112:e0cbb3e43c20 68 * case NSAPI_ERROR_UNSUPPORTED may be returned from setsockopt.
Christopher Haster 112:e0cbb3e43c20 69 *
Christopher Haster 112:e0cbb3e43c20 70 * @enum nsapi_option_t
Christopher Haster 112:e0cbb3e43c20 71 */
Christopher Haster 112:e0cbb3e43c20 72 enum nsapi_option_t {
Christopher Haster 112:e0cbb3e43c20 73 NSAPI_REUSEADDR, /*!< Allow bind to reuse local addresses */
Christopher Haster 112:e0cbb3e43c20 74 NSAPI_KEEPALIVE, /*!< Enables sending of keepalive messages */
Christopher Haster 112:e0cbb3e43c20 75 NSAPI_LINGER, /*!< Keeps close from returning until queues empty */
Christopher Haster 112:e0cbb3e43c20 76 NSAPI_SNDBUF, /*!< Sets send buffer size */
Christopher Haster 112:e0cbb3e43c20 77 NSAPI_RCVBUF, /*!< Sets recv buffer size */
Christopher Haster 112:e0cbb3e43c20 78 };
Christopher Haster 112:e0cbb3e43c20 79
Christopher Haster 105:2fd212f8da61 80
Christopher Haster 105:2fd212f8da61 81 /** NetworkStack class
Christopher Haster 105:2fd212f8da61 82 *
Christopher Haster 105:2fd212f8da61 83 * Common interface that is shared between hardware that
Christopher Haster 105:2fd212f8da61 84 * can connect to a network over IP. By implementing the
Christopher Haster 105:2fd212f8da61 85 * NetworkStack, a network stack can be used as a target
Christopher Haster 105:2fd212f8da61 86 * for instantiating network sockets.
Christopher Haster 105:2fd212f8da61 87 */
Christopher Haster 105:2fd212f8da61 88 class NetworkStack
Christopher Haster 105:2fd212f8da61 89 {
Christopher Haster 105:2fd212f8da61 90 public:
Christopher Haster 105:2fd212f8da61 91 virtual ~NetworkStack() {};
Christopher Haster 105:2fd212f8da61 92
Christopher Haster 105:2fd212f8da61 93 /** Get the local IP address
Christopher Haster 105:2fd212f8da61 94 *
Christopher Haster 105:2fd212f8da61 95 * @return Null-terminated representation of the local IP address
Christopher Haster 105:2fd212f8da61 96 * or null if not yet connected
Christopher Haster 105:2fd212f8da61 97 */
Christopher Haster 105:2fd212f8da61 98 virtual const char *get_ip_address() = 0;
Christopher Haster 105:2fd212f8da61 99
Christopher Haster 105:2fd212f8da61 100 /** Translates a hostname to an IP address
Christopher Haster 105:2fd212f8da61 101 *
Christopher Haster 105:2fd212f8da61 102 * The hostname may be either a domain name or an IP address. If the
Christopher Haster 105:2fd212f8da61 103 * hostname is an IP address, no network transactions will be performed.
Christopher Haster 105:2fd212f8da61 104 *
Christopher Haster 105:2fd212f8da61 105 * If no stack-specific DNS resolution is provided, the hostname
Christopher Haster 105:2fd212f8da61 106 * will be resolve using a UDP socket on the stack.
Christopher Haster 105:2fd212f8da61 107 *
Christopher Haster 105:2fd212f8da61 108 * @param address Destination for the host SocketAddress
Christopher Haster 105:2fd212f8da61 109 * @param host Hostname to resolve
Christopher Haster 105:2fd212f8da61 110 * @return 0 on success, negative error code on failure
Christopher Haster 105:2fd212f8da61 111 */
Christopher Haster 105:2fd212f8da61 112 virtual int gethostbyname(SocketAddress *address, const char *host);
Christopher Haster 105:2fd212f8da61 113
Christopher Haster 105:2fd212f8da61 114 /* Set stack-specific stack options
Christopher Haster 105:2fd212f8da61 115 *
Christopher Haster 105:2fd212f8da61 116 * The setstackopt allow an application to pass stack-specific hints
Christopher Haster 105:2fd212f8da61 117 * to the underlying stack. For unsupported options,
Christopher Haster 105:2fd212f8da61 118 * NSAPI_ERROR_UNSUPPORTED is returned and the stack is unmodified.
Christopher Haster 105:2fd212f8da61 119 *
Christopher Haster 105:2fd212f8da61 120 * @param level Stack-specific protocol level
Christopher Haster 105:2fd212f8da61 121 * @param optname Stack-specific option identifier
Christopher Haster 105:2fd212f8da61 122 * @param optval Option value
Christopher Haster 105:2fd212f8da61 123 * @param optlen Length of the option value
Christopher Haster 105:2fd212f8da61 124 * @return 0 on success, negative error code on failure
Christopher Haster 105:2fd212f8da61 125 */
Christopher Haster 105:2fd212f8da61 126 virtual int setstackopt(int level, int optname, const void *optval, unsigned optlen);
Christopher Haster 105:2fd212f8da61 127
Christopher Haster 105:2fd212f8da61 128 /* Get stack-specific stack options
Christopher Haster 105:2fd212f8da61 129 *
Christopher Haster 105:2fd212f8da61 130 * The getstackopt allow an application to retrieve stack-specific hints
Christopher Haster 105:2fd212f8da61 131 * from the underlying stack. For unsupported options,
Christopher Haster 105:2fd212f8da61 132 * NSAPI_ERROR_UNSUPPORTED is returned and optval is unmodified.
Christopher Haster 105:2fd212f8da61 133 *
Christopher Haster 105:2fd212f8da61 134 * @param level Stack-specific protocol level
Christopher Haster 105:2fd212f8da61 135 * @param optname Stack-specific option identifier
Christopher Haster 105:2fd212f8da61 136 * @param optval Destination for option value
Christopher Haster 105:2fd212f8da61 137 * @param optlen Length of the option value
Christopher Haster 105:2fd212f8da61 138 * @return 0 on success, negative error code on failure
Christopher Haster 105:2fd212f8da61 139 */
Christopher Haster 105:2fd212f8da61 140 virtual int getstackopt(int level, int optname, void *optval, unsigned *optlen);
Christopher Haster 105:2fd212f8da61 141
Christopher Haster 105:2fd212f8da61 142 protected:
Christopher Haster 105:2fd212f8da61 143 friend class Socket;
Christopher Haster 105:2fd212f8da61 144 friend class UDPSocket;
Christopher Haster 105:2fd212f8da61 145 friend class TCPSocket;
Christopher Haster 105:2fd212f8da61 146 friend class TCPServer;
Christopher Haster 105:2fd212f8da61 147
Christopher Haster 105:2fd212f8da61 148 /** Opens a socket
Christopher Haster 105:2fd212f8da61 149 *
Christopher Haster 105:2fd212f8da61 150 * Creates a network socket and stores it in the specified handle.
Christopher Haster 105:2fd212f8da61 151 * The handle must be passed to following calls on the socket.
Christopher Haster 105:2fd212f8da61 152 *
Christopher Haster 105:2fd212f8da61 153 * A stack may have a finite number of sockets, in this case
Christopher Haster 105:2fd212f8da61 154 * NSAPI_ERROR_NO_SOCKET is returned if no socket is available.
Christopher Haster 105:2fd212f8da61 155 *
Christopher Haster 105:2fd212f8da61 156 * @param handle Destination for the handle to a newly created socket
Christopher Haster 105:2fd212f8da61 157 * @param proto Protocol of socket to open, NSAPI_TCP or NSAPI_UDP
Christopher Haster 105:2fd212f8da61 158 * @return 0 on success, negative error code on failure
Christopher Haster 105:2fd212f8da61 159 */
Christopher Haster 105:2fd212f8da61 160 virtual int socket_open(void **handle, nsapi_protocol_t proto) = 0;
Christopher Haster 105:2fd212f8da61 161
Christopher Haster 105:2fd212f8da61 162 /** Close the socket
Christopher Haster 105:2fd212f8da61 163 *
Christopher Haster 105:2fd212f8da61 164 * Closes any open connection and deallocates any memory associated
Christopher Haster 105:2fd212f8da61 165 * with the socket.
Christopher Haster 105:2fd212f8da61 166 *
Christopher Haster 105:2fd212f8da61 167 * @param handle Socket handle
Christopher Haster 105:2fd212f8da61 168 * @return 0 on success, negative error code on failure
Christopher Haster 105:2fd212f8da61 169 */
Christopher Haster 105:2fd212f8da61 170 virtual int socket_close(void *handle) = 0;
Christopher Haster 105:2fd212f8da61 171
Christopher Haster 105:2fd212f8da61 172 /** Bind a specific address to a socket
Christopher Haster 105:2fd212f8da61 173 *
Christopher Haster 105:2fd212f8da61 174 * Binding a socket specifies the address and port on which to recieve
Christopher Haster 105:2fd212f8da61 175 * data. If the IP address is zeroed, only the port is bound.
Christopher Haster 105:2fd212f8da61 176 *
Christopher Haster 105:2fd212f8da61 177 * @param handle Socket handle
Christopher Haster 105:2fd212f8da61 178 * @param address Local address to bind
Christopher Haster 105:2fd212f8da61 179 * @return 0 on success, negative error code on failure.
Christopher Haster 105:2fd212f8da61 180 */
Christopher Haster 105:2fd212f8da61 181 virtual int socket_bind(void *handle, const SocketAddress &address) = 0;
Christopher Haster 105:2fd212f8da61 182
Christopher Haster 105:2fd212f8da61 183 /** Listen for connections on a TCP socket
Christopher Haster 105:2fd212f8da61 184 *
Christopher Haster 105:2fd212f8da61 185 * Marks the socket as a passive socket that can be used to accept
Christopher Haster 105:2fd212f8da61 186 * incoming connections.
Christopher Haster 105:2fd212f8da61 187 *
Christopher Haster 105:2fd212f8da61 188 * @param handle Socket handle
Christopher Haster 105:2fd212f8da61 189 * @param backlog Number of pending connections that can be queued
Christopher Haster 105:2fd212f8da61 190 * simultaneously
Christopher Haster 105:2fd212f8da61 191 * @return 0 on success, negative error code on failure
Christopher Haster 105:2fd212f8da61 192 */
Christopher Haster 105:2fd212f8da61 193 virtual int socket_listen(void *handle, int backlog) = 0;
Christopher Haster 105:2fd212f8da61 194
Christopher Haster 105:2fd212f8da61 195 /** Connects TCP socket to a remote host
Christopher Haster 105:2fd212f8da61 196 *
Christopher Haster 105:2fd212f8da61 197 * Initiates a connection to a remote server specified by the
Christopher Haster 105:2fd212f8da61 198 * indicated address.
Christopher Haster 105:2fd212f8da61 199 *
Christopher Haster 105:2fd212f8da61 200 * @param handle Socket handle
Christopher Haster 105:2fd212f8da61 201 * @param address The SocketAddress of the remote host
Christopher Haster 105:2fd212f8da61 202 * @return 0 on success, negative error code on failure
Christopher Haster 105:2fd212f8da61 203 */
Christopher Haster 105:2fd212f8da61 204 virtual int socket_connect(void *handle, const SocketAddress &address) = 0;
Christopher Haster 105:2fd212f8da61 205
Christopher Haster 105:2fd212f8da61 206 /** Accepts a connection on a TCP socket
Christopher Haster 105:2fd212f8da61 207 *
Christopher Haster 105:2fd212f8da61 208 * The server socket must be bound and set to listen for connections.
Christopher Haster 105:2fd212f8da61 209 * On a new connection, creates a network socket and stores it in the
Christopher Haster 105:2fd212f8da61 210 * specified handle. The handle must be passed to following calls on
Christopher Haster 105:2fd212f8da61 211 * the socket.
Christopher Haster 105:2fd212f8da61 212 *
Christopher Haster 105:2fd212f8da61 213 * A stack may have a finite number of sockets, in this case
Christopher Haster 105:2fd212f8da61 214 * NSAPI_ERROR_NO_SOCKET is returned if no socket is available.
Christopher Haster 105:2fd212f8da61 215 *
Christopher Haster 105:2fd212f8da61 216 * This call is non-blocking. If accept would block,
Christopher Haster 105:2fd212f8da61 217 * NSAPI_ERROR_WOULD_BLOCK is returned immediately.
Christopher Haster 105:2fd212f8da61 218 *
Christopher Haster 105:2fd212f8da61 219 * @param handle Destination for a handle to the newly created sockey
Christopher Haster 105:2fd212f8da61 220 * @param server Socket handle to server to accept from
Christopher Haster 105:2fd212f8da61 221 * @return 0 on success, negative error code on failure
Christopher Haster 105:2fd212f8da61 222 */
Christopher Haster 105:2fd212f8da61 223 virtual int socket_accept(void **handle, void *server) = 0;
Christopher Haster 105:2fd212f8da61 224
Christopher Haster 105:2fd212f8da61 225 /** Send data over a TCP socket
Christopher Haster 105:2fd212f8da61 226 *
Christopher Haster 105:2fd212f8da61 227 * The socket must be connected to a remote host. Returns the number of
Christopher Haster 105:2fd212f8da61 228 * bytes sent from the buffer.
Christopher Haster 105:2fd212f8da61 229 *
Christopher Haster 105:2fd212f8da61 230 * This call is non-blocking. If send would block,
Christopher Haster 105:2fd212f8da61 231 * NSAPI_ERROR_WOULD_BLOCK is returned immediately.
Christopher Haster 105:2fd212f8da61 232 *
Christopher Haster 105:2fd212f8da61 233 * @param handle Socket handle
Christopher Haster 105:2fd212f8da61 234 * @param data Buffer of data to send to the host
Christopher Haster 105:2fd212f8da61 235 * @param size Size of the buffer in bytes
Christopher Haster 105:2fd212f8da61 236 * @return Number of sent bytes on success, negative error
Christopher Haster 105:2fd212f8da61 237 * code on failure
Christopher Haster 105:2fd212f8da61 238 */
Christopher Haster 105:2fd212f8da61 239 virtual int socket_send(void *handle, const void *data, unsigned size) = 0;
Christopher Haster 105:2fd212f8da61 240
Christopher Haster 105:2fd212f8da61 241 /** Receive data over a TCP socket
Christopher Haster 105:2fd212f8da61 242 *
Christopher Haster 105:2fd212f8da61 243 * The socket must be connected to a remote host. Returns the number of
Christopher Haster 105:2fd212f8da61 244 * bytes received into the buffer.
Christopher Haster 105:2fd212f8da61 245 *
Christopher Haster 105:2fd212f8da61 246 * This call is non-blocking. If recv would block,
Christopher Haster 105:2fd212f8da61 247 * NSAPI_ERROR_WOULD_BLOCK is returned immediately.
Christopher Haster 105:2fd212f8da61 248 *
Christopher Haster 105:2fd212f8da61 249 * @param handle Socket handle
Christopher Haster 105:2fd212f8da61 250 * @param data Destination buffer for data received from the host
Christopher Haster 105:2fd212f8da61 251 * @param size Size of the buffer in bytes
Christopher Haster 105:2fd212f8da61 252 * @return Number of received bytes on success, negative error
Christopher Haster 105:2fd212f8da61 253 * code on failure
Christopher Haster 105:2fd212f8da61 254 */
Christopher Haster 105:2fd212f8da61 255 virtual int socket_recv(void *handle, void *data, unsigned size) = 0;
Christopher Haster 105:2fd212f8da61 256
Christopher Haster 105:2fd212f8da61 257 /** Send a packet over a UDP socket
Christopher Haster 105:2fd212f8da61 258 *
Christopher Haster 105:2fd212f8da61 259 * Sends data to the specified address. Returns the number of bytes
Christopher Haster 105:2fd212f8da61 260 * sent from the buffer.
Christopher Haster 105:2fd212f8da61 261 *
Christopher Haster 105:2fd212f8da61 262 * This call is non-blocking. If sendto would block,
Christopher Haster 105:2fd212f8da61 263 * NSAPI_ERROR_WOULD_BLOCK is returned immediately.
Christopher Haster 105:2fd212f8da61 264 *
Christopher Haster 105:2fd212f8da61 265 * @param handle Socket handle
Christopher Haster 105:2fd212f8da61 266 * @param address The SocketAddress of the remote host
Christopher Haster 105:2fd212f8da61 267 * @param data Buffer of data to send to the host
Christopher Haster 105:2fd212f8da61 268 * @param size Size of the buffer in bytes
Christopher Haster 105:2fd212f8da61 269 * @return Number of sent bytes on success, negative error
Christopher Haster 105:2fd212f8da61 270 * code on failure
Christopher Haster 105:2fd212f8da61 271 */
Christopher Haster 105:2fd212f8da61 272 virtual int socket_sendto(void *handle, const SocketAddress &address, const void *data, unsigned size) = 0;
Christopher Haster 105:2fd212f8da61 273
Christopher Haster 105:2fd212f8da61 274 /** Receive a packet over a UDP socket
Christopher Haster 105:2fd212f8da61 275 *
Christopher Haster 105:2fd212f8da61 276 * Receives data and stores the source address in address if address
Christopher Haster 105:2fd212f8da61 277 * is not NULL. Returns the number of bytes received into the buffer.
Christopher Haster 105:2fd212f8da61 278 *
Christopher Haster 105:2fd212f8da61 279 * This call is non-blocking. If recvfrom would block,
Christopher Haster 105:2fd212f8da61 280 * NSAPI_ERROR_WOULD_BLOCK is returned immediately.
Christopher Haster 105:2fd212f8da61 281 *
Christopher Haster 105:2fd212f8da61 282 * @param handle Socket handle
Christopher Haster 105:2fd212f8da61 283 * @param address Destination for the source address or NULL
Christopher Haster 105:2fd212f8da61 284 * @param data Destination buffer for data received from the host
Christopher Haster 105:2fd212f8da61 285 * @param size Size of the buffer in bytes
Christopher Haster 105:2fd212f8da61 286 * @return Number of received bytes on success, negative error
Christopher Haster 105:2fd212f8da61 287 * code on failure
Christopher Haster 105:2fd212f8da61 288 */
Christopher Haster 105:2fd212f8da61 289 virtual int socket_recvfrom(void *handle, SocketAddress *address, void *buffer, unsigned size) = 0;
Christopher Haster 105:2fd212f8da61 290
Christopher Haster 105:2fd212f8da61 291 /** Register a callback on state change of the socket
Christopher Haster 105:2fd212f8da61 292 *
Christopher Haster 105:2fd212f8da61 293 * The specified callback will be called on state changes such as when
Christopher Haster 105:2fd212f8da61 294 * the socket can recv/send/accept successfully and on when an error
Christopher Haster 105:2fd212f8da61 295 * occurs. The callback may also be called spuriously without reason.
Christopher Haster 105:2fd212f8da61 296 *
Christopher Haster 105:2fd212f8da61 297 * The callback may be called in an interrupt context and should not
Christopher Haster 105:2fd212f8da61 298 * perform expensive operations such as recv/send calls.
Christopher Haster 105:2fd212f8da61 299 *
Christopher Haster 105:2fd212f8da61 300 * @param handle Socket handle
Christopher Haster 105:2fd212f8da61 301 * @param callback Function to call on state change
Christopher Haster 105:2fd212f8da61 302 * @param data Argument to pass to callback
Christopher Haster 105:2fd212f8da61 303 */
Christopher Haster 105:2fd212f8da61 304 virtual void socket_attach(void *handle, void (*callback)(void *), void *data) = 0;
Christopher Haster 105:2fd212f8da61 305
Christopher Haster 105:2fd212f8da61 306 /* Set stack-specific socket options
Christopher Haster 105:2fd212f8da61 307 *
Christopher Haster 105:2fd212f8da61 308 * The setsockopt allow an application to pass stack-specific hints
Christopher Haster 105:2fd212f8da61 309 * to the underlying stack. For unsupported options,
Christopher Haster 105:2fd212f8da61 310 * NSAPI_ERROR_UNSUPPORTED is returned and the socket is unmodified.
Christopher Haster 105:2fd212f8da61 311 *
Christopher Haster 105:2fd212f8da61 312 * @param handle Socket handle
Christopher Haster 105:2fd212f8da61 313 * @param level Stack-specific protocol level
Christopher Haster 105:2fd212f8da61 314 * @param optname Stack-specific option identifier
Christopher Haster 105:2fd212f8da61 315 * @param optval Option value
Christopher Haster 105:2fd212f8da61 316 * @param optlen Length of the option value
Christopher Haster 105:2fd212f8da61 317 * @return 0 on success, negative error code on failure
Christopher Haster 105:2fd212f8da61 318 */
Christopher Haster 105:2fd212f8da61 319 virtual int setsockopt(void *handle, int level, int optname, const void *optval, unsigned optlen);
Christopher Haster 105:2fd212f8da61 320
Christopher Haster 105:2fd212f8da61 321 /* Get stack-specific socket options
Christopher Haster 105:2fd212f8da61 322 *
Christopher Haster 105:2fd212f8da61 323 * The getstackopt allow an application to retrieve stack-specific hints
Christopher Haster 105:2fd212f8da61 324 * from the underlying stack. For unsupported options,
Christopher Haster 105:2fd212f8da61 325 * NSAPI_ERROR_UNSUPPORTED is returned and optval is unmodified.
Christopher Haster 105:2fd212f8da61 326 *
Christopher Haster 105:2fd212f8da61 327 * @param handle Socket handle
Christopher Haster 105:2fd212f8da61 328 * @param level Stack-specific protocol level
Christopher Haster 105:2fd212f8da61 329 * @param optname Stack-specific option identifier
Christopher Haster 105:2fd212f8da61 330 * @param optval Destination for option value
Christopher Haster 105:2fd212f8da61 331 * @param optlen Length of the option value
Christopher Haster 105:2fd212f8da61 332 * @return 0 on success, negative error code on failure
Christopher Haster 105:2fd212f8da61 333 */
Christopher Haster 105:2fd212f8da61 334 virtual int getsockopt(void *handle, int level, int optname, void *optval, unsigned *optlen);
Christopher Haster 105:2fd212f8da61 335 };
Christopher Haster 105:2fd212f8da61 336
Christopher Haster 105:2fd212f8da61 337 #endif