network-socket: Optionally return peer address from accept().

Fixes issue #2399 by optionally returning a SocketAddress from
TCPServer::accept().

This entails changes to underlying NetworkStack and nsapi.  This
commit deals only with lwip and higher level APIs; other users of
NetworkStack and nsapi may be affected.  Currently lwip is the only
in-tree user of nsapi.
pull/2434/head
Colin Hogben 2016-08-12 10:50:52 +01:00
parent 58d9926c0c
commit 36bf4827c7
6 changed files with 28 additions and 10 deletions

View File

@ -292,7 +292,7 @@ static int lwip_socket_connect(nsapi_stack_t *stack, nsapi_socket_t handle, nsap
return lwip_err_remap(err); return lwip_err_remap(err);
} }
static int lwip_socket_accept(nsapi_stack_t *stack, nsapi_socket_t *handle, nsapi_socket_t server) static int lwip_socket_accept(nsapi_stack_t *stack, nsapi_socket_t server, nsapi_socket_t *handle, nsapi_addr_t *addr, uint16_t *port)
{ {
struct lwip_socket *s = (struct lwip_socket *)server; struct lwip_socket *s = (struct lwip_socket *)server;
struct lwip_socket *ns = lwip_arena_alloc(); struct lwip_socket *ns = lwip_arena_alloc();
@ -304,6 +304,10 @@ static int lwip_socket_accept(nsapi_stack_t *stack, nsapi_socket_t *handle, nsap
} }
*(struct lwip_socket **)handle = ns; *(struct lwip_socket **)handle = ns;
(void) netconn_peer(ns->conn, (ip_addr_t *)addr->bytes, port);
addr->version = NSAPI_IPv4;
return 0; return 0;
} }

View File

@ -159,13 +159,23 @@ protected:
return _stack_api()->socket_connect(_stack(), socket, address.get_addr(), address.get_port()); return _stack_api()->socket_connect(_stack(), socket, address.get_addr(), address.get_port());
} }
virtual int socket_accept(nsapi_socket_t *socket, nsapi_socket_t server) virtual int socket_accept(nsapi_socket_t *socket, nsapi_socket_t server, SocketAddress *address)
{ {
if (!_stack_api()->socket_accept) { if (!_stack_api()->socket_accept) {
return NSAPI_ERROR_UNSUPPORTED; return NSAPI_ERROR_UNSUPPORTED;
} }
return _stack_api()->socket_accept(_stack(), socket, server); nsapi_addr_t addr = {NSAPI_IPv4, 0};
uint16_t port = 0;
int err = _stack_api()->socket_accept(_stack(), server, socket, &addr, &port);
if (address) {
address->set_addr(addr);
address->set_port(port);
}
return err;
} }
virtual int socket_send(nsapi_socket_t socket, const void *data, unsigned size) virtual int socket_send(nsapi_socket_t socket, const void *data, unsigned size)

View File

@ -160,11 +160,12 @@ protected:
* This call is non-blocking. If accept would block, * This call is non-blocking. If accept would block,
* NSAPI_ERROR_WOULD_BLOCK is returned immediately. * NSAPI_ERROR_WOULD_BLOCK is returned immediately.
* *
* @param handle Destination for a handle to the newly created sockey * @param handle Destination for a handle to the newly created socket
* @param server Socket handle to server to accept from * @param server Socket handle to server to accept from
* @param address Destination for the remote address or NULL
* @return 0 on success, negative error code on failure * @return 0 on success, negative error code on failure
*/ */
virtual int socket_accept(nsapi_socket_t *handle, nsapi_socket_t server) = 0; virtual int socket_accept(nsapi_socket_t *handle, nsapi_socket_t server, SocketAddress *address=0) = 0;
/** Send data over a TCP socket /** Send data over a TCP socket
* *

View File

@ -47,7 +47,7 @@ int TCPServer::listen(int backlog)
return ret; return ret;
} }
int TCPServer::accept(TCPSocket *connection) int TCPServer::accept(TCPSocket *connection, SocketAddress *address)
{ {
_lock.lock(); _lock.lock();
int ret; int ret;
@ -60,7 +60,7 @@ int TCPServer::accept(TCPSocket *connection)
_pending = 0; _pending = 0;
void *socket; void *socket;
ret = _stack->socket_accept(&socket, _socket); ret = _stack->socket_accept(&socket, _socket, address);
if (0 == ret) { if (0 == ret) {
connection->_lock.lock(); connection->_lock.lock();

View File

@ -78,9 +78,10 @@ public:
* immediately. * immediately.
* *
* @param socket TCPSocket instance that will handle the incoming connection. * @param socket TCPSocket instance that will handle the incoming connection.
* @param address Destination for the remote address or NULL
* @return 0 on success, negative error code on failure * @return 0 on success, negative error code on failure
*/ */
int accept(TCPSocket *connection); int accept(TCPSocket *connection, SocketAddress *address = NULL);
protected: protected:
virtual nsapi_protocol_t get_proto(); virtual nsapi_protocol_t get_proto();

View File

@ -310,11 +310,13 @@ typedef struct nsapi_stack_api
* NSAPI_ERROR_WOULD_BLOCK is returned immediately. * NSAPI_ERROR_WOULD_BLOCK is returned immediately.
* *
* @param stack Stack handle * @param stack Stack handle
* @param socket Destination for a handle to the newly created sockey
* @param server Socket handle to server to accept from * @param server Socket handle to server to accept from
* @param socket Destination for a handle to the newly created socket
* @param addr Destination for the address of the remote host
* @param port Destination for the port of the remote host
* @return 0 on success, negative error code on failure * @return 0 on success, negative error code on failure
*/ */
int (*socket_accept)(nsapi_stack_t *stack, nsapi_socket_t *socket, nsapi_socket_t server); int (*socket_accept)(nsapi_stack_t *stack, nsapi_socket_t server, nsapi_socket_t *socket, nsapi_addr_t *addr, uint16_t *port);
/** Send data over a TCP socket /** Send data over a TCP socket
* *