From 6e6e435c65d77cac1b8e9c8d5f1729803463f5de Mon Sep 17 00:00:00 2001 From: "Martine S. Lenders" Date: Wed, 11 Mar 2020 11:40:00 +0100 Subject: [PATCH] sock_async: add optional callback argument --- pkg/lwip/contrib/sock/lwip_sock.c | 2 +- pkg/lwip/include/sock_types.h | 3 ++- sys/include/net/sock/async/event.h | 6 +++-- sys/include/net/sock/async/types.h | 25 ++++++++++++++++----- sys/net/application_layer/gcoap/gcoap.c | 5 +++-- sys/net/gnrc/sock/gnrc_sock.c | 2 +- sys/net/gnrc/sock/include/sock_types.h | 3 ++- sys/net/gnrc/sock/ip/gnrc_sock_ip.c | 3 ++- sys/net/gnrc/sock/udp/gnrc_sock_udp.c | 3 ++- sys/net/sock/async/event/sock_async_ctx.h | 5 ++++- sys/net/sock/async/event/sock_async_event.c | 18 ++++++++++----- tests/gnrc_sock_async_event/main.c | 6 +++-- tests/lwip/ip.c | 3 ++- tests/lwip/tcp.c | 7 ++++-- tests/lwip/udp.c | 3 ++- 15 files changed, 66 insertions(+), 28 deletions(-) diff --git a/pkg/lwip/contrib/sock/lwip_sock.c b/pkg/lwip/contrib/sock/lwip_sock.c index 9be9951c49..f5748a05c0 100644 --- a/pkg/lwip/contrib/sock/lwip_sock.c +++ b/pkg/lwip/contrib/sock/lwip_sock.c @@ -312,7 +312,7 @@ static void _netconn_cb(struct netconn *conn, enum netconn_evt evt, break; } if (flags && sock->async_cb.gen) { - sock->async_cb.gen(sock, flags); + sock->async_cb.gen(sock, flags, NULL); } } #else diff --git a/pkg/lwip/include/sock_types.h b/pkg/lwip/include/sock_types.h index 2f7126a04e..9c516c52f0 100644 --- a/pkg/lwip/include/sock_types.h +++ b/pkg/lwip/include/sock_types.h @@ -40,7 +40,8 @@ typedef struct lwip_sock_base lwip_sock_base_t; * @internal */ typedef void (*lwip_sock_cb_t)(lwip_sock_base_t *sock, - sock_async_flags_t flags); + sock_async_flags_t flags, + void *arg); #endif /* SOCK_HAS_ASYNC */ /** diff --git a/sys/include/net/sock/async/event.h b/sys/include/net/sock/async/event.h index 5047686df8..c1eb1d7108 100644 --- a/sys/include/net/sock/async/event.h +++ b/sys/include/net/sock/async/event.h @@ -36,8 +36,9 @@ * event_queue_t queue; * uint8_t buf[128]; * - * void handler(sock_udp_t *sock, sock_async_flags_t type) + * void handler(sock_udp_t *sock, sock_async_flags_t type, void *arg) * { + * (void)arg; * if (type & SOCK_ASYNC_MSG_RECV) { * sock_udp_ep_t remote; * ssize_t res; @@ -101,8 +102,9 @@ * send, we print an according message: * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.c} - * void handler(sock_udp_t *sock, sock_async_flags_t type) + * void handler(sock_udp_t *sock, sock_async_flags_t type, void *arg) * { + * (void)arg; * if (type & SOCK_ASYNC_MSG_RECV) { * sock_udp_ep_t remote; * ssize_t res; diff --git a/sys/include/net/sock/async/types.h b/sys/include/net/sock/async/types.h index 7a17718e45..9d80376bc7 100644 --- a/sys/include/net/sock/async/types.h +++ b/sys/include/net/sock/async/types.h @@ -54,8 +54,11 @@ typedef struct sock_dtls sock_dtls_t; /**< forward declare for async */ * - @ref SOCK_ASYNC_MSG_SENT, * - @ref SOCK_ASYNC_PATH_PROP, or * - a combination of them. + * @param[in] arg Argument provided when setting the callback using + * @ref sock_dtls_set_cb(). May be NULL. */ -typedef void (*sock_dtls_cb_t)(sock_dtls_t *sock, sock_async_flags_t flags); +typedef void (*sock_dtls_cb_t)(sock_dtls_t *sock, sock_async_flags_t flags, + void *arg); #endif /* defined(MODULE_SOCK_DTLS) || defined(DOXYGEN) */ #if defined(MODULE_SOCK_IP) || defined(DOXYGEN) @@ -74,8 +77,11 @@ typedef struct sock_ip sock_ip_t; /**< forward declare for async */ * - @ref SOCK_ASYNC_MSG_SENT, * - @ref SOCK_ASYNC_PATH_PROP, or * - a combination of them. + * @param[in] arg Argument provided when setting the callback using + * @ref sock_ip_set_cb(). May be NULL. */ -typedef void (*sock_ip_cb_t)(sock_ip_t *sock, sock_async_flags_t flags); +typedef void (*sock_ip_cb_t)(sock_ip_t *sock, sock_async_flags_t flags, + void *arg); #endif /* defined(MODULE_SOCK_IP) || defined(DOXYGEN) */ #if defined(MODULE_SOCK_TCP) || defined(DOXYGEN) @@ -97,8 +103,11 @@ typedef struct sock_tcp_queue sock_tcp_queue_t;/**< forward declare for async */ * - @ref SOCK_ASYNC_MSG_SENT, * - @ref SOCK_ASYNC_PATH_PROP, or * - a combination of them. + * @param[in] arg Argument provided when setting the callback using + * @ref sock_tcp_set_cb(). May be NULL. */ -typedef void (*sock_tcp_cb_t)(sock_tcp_t *sock, sock_async_flags_t flags); +typedef void (*sock_tcp_cb_t)(sock_tcp_t *sock, sock_async_flags_t flags, + void *arg); /** * @brief Event callback for @ref sock_tcp_queue_t @@ -110,9 +119,12 @@ typedef void (*sock_tcp_cb_t)(sock_tcp_t *sock, sock_async_flags_t flags); * @param[in] queue The TCP listening queue the event happened on * @param[in] flags The event flags. The only expected value is @ref * SOCK_ASYNC_CONN_RECV. + * @param[in] arg Argument provided when setting the callback using + * @ref sock_tcp_queue_set_cb(). May be NULL. */ typedef void (*sock_tcp_queue_cb_t)(sock_tcp_queue_t *queue, - sock_async_flags_t flags); + sock_async_flags_t flags, + void *arg); #endif /* defined(MODULE_SOCK_TCP) || defined(DOXYGEN) */ #if defined(MODULE_SOCK_UDP) || defined(DOXYGEN) @@ -131,8 +143,11 @@ typedef struct sock_udp sock_udp_t; /**< forward declare for async */ * - @ref SOCK_ASYNC_MSG_SENT, * - @ref SOCK_ASYNC_PATH_PROP, or * - a combination of them. + * @param[in] arg Argument provided when setting the callback using + * @ref sock_udp_set_cb(). May be NULL. */ -typedef void (*sock_udp_cb_t)(sock_udp_t *sock, sock_async_flags_t type); +typedef void (*sock_udp_cb_t)(sock_udp_t *sock, sock_async_flags_t type, + void *arg); #endif /* defined(MODULE_SOCK_UDP) || defined(DOXYGEN) */ #ifdef SOCK_HAS_ASYNC_CTX diff --git a/sys/net/application_layer/gcoap/gcoap.c b/sys/net/application_layer/gcoap/gcoap.c index 3a2f5b6264..24edc953c9 100644 --- a/sys/net/application_layer/gcoap/gcoap.c +++ b/sys/net/application_layer/gcoap/gcoap.c @@ -46,7 +46,7 @@ /* Internal functions */ static void *_event_loop(void *arg); -static void _on_sock_evt(sock_udp_t *sock, sock_async_flags_t type); +static void _on_sock_evt(sock_udp_t *sock, sock_async_flags_t type, void *arg); static ssize_t _well_known_core_handler(coap_pkt_t* pdu, uint8_t *buf, size_t len, void *ctx); static size_t _handle_req(coap_pkt_t *pdu, uint8_t *buf, size_t len, sock_udp_ep_t *remote); @@ -128,12 +128,13 @@ static void *_event_loop(void *arg) } /* Handles sock events from the event queue. */ -static void _on_sock_evt(sock_udp_t *sock, sock_async_flags_t type) +static void _on_sock_evt(sock_udp_t *sock, sock_async_flags_t type, void *arg) { coap_pkt_t pdu; sock_udp_ep_t remote; gcoap_request_memo_t *memo = NULL; + (void)arg; if (type & SOCK_ASYNC_MSG_RECV) { ssize_t res = sock_udp_recv(sock, _listen_buf, sizeof(_listen_buf), 0, &remote); diff --git a/sys/net/gnrc/sock/gnrc_sock.c b/sys/net/gnrc/sock/gnrc_sock.c index 22355d64c0..feaf829e07 100644 --- a/sys/net/gnrc/sock/gnrc_sock.c +++ b/sys/net/gnrc/sock/gnrc_sock.c @@ -58,7 +58,7 @@ static void _netapi_cb(uint16_t cmd, gnrc_pktsnip_t *pkt, void *ctx) (void *)®->mbox); } if (reg->async_cb.generic) { - reg->async_cb.generic(reg, SOCK_ASYNC_MSG_RECV); + reg->async_cb.generic(reg, SOCK_ASYNC_MSG_RECV, NULL); } } } diff --git a/sys/net/gnrc/sock/include/sock_types.h b/sys/net/gnrc/sock/include/sock_types.h index 76e43ee5bb..d5488b5765 100644 --- a/sys/net/gnrc/sock/include/sock_types.h +++ b/sys/net/gnrc/sock/include/sock_types.h @@ -55,7 +55,8 @@ typedef struct gnrc_sock_reg gnrc_sock_reg_t; * @internal */ typedef void (*gnrc_sock_reg_cb_t)(gnrc_sock_reg_t *sock, - sock_async_flags_t flags); + sock_async_flags_t flags, + void *arg); #endif /* SOCK_HAS_ASYNC */ /** diff --git a/sys/net/gnrc/sock/ip/gnrc_sock_ip.c b/sys/net/gnrc/sock/ip/gnrc_sock_ip.c index 44719ff777..a4afa40674 100644 --- a/sys/net/gnrc/sock/ip/gnrc_sock_ip.c +++ b/sys/net/gnrc/sock/ip/gnrc_sock_ip.c @@ -197,7 +197,8 @@ ssize_t sock_ip_send(sock_ip_t *sock, const void *data, size_t len, } #ifdef SOCK_HAS_ASYNC if ((sock != NULL) && (sock->reg.async_cb.ip)) { - sock->reg.async_cb.ip(sock, SOCK_ASYNC_MSG_SENT); + sock->reg.async_cb.ip(sock, SOCK_ASYNC_MSG_SENT, + NULL); } #endif /* SOCK_HAS_ASYNC */ return res; diff --git a/sys/net/gnrc/sock/udp/gnrc_sock_udp.c b/sys/net/gnrc/sock/udp/gnrc_sock_udp.c index 72eba92c6a..7ef69e67c2 100644 --- a/sys/net/gnrc/sock/udp/gnrc_sock_udp.c +++ b/sys/net/gnrc/sock/udp/gnrc_sock_udp.c @@ -319,7 +319,8 @@ ssize_t sock_udp_send(sock_udp_t *sock, const void *data, size_t len, } #ifdef SOCK_HAS_ASYNC if ((sock != NULL) && (sock->reg.async_cb.udp)) { - sock->reg.async_cb.udp(sock, SOCK_ASYNC_MSG_SENT); + sock->reg.async_cb.udp(sock, SOCK_ASYNC_MSG_SENT, + NULL); } #endif /* SOCK_HAS_ASYNC */ return res; diff --git a/sys/net/sock/async/event/sock_async_ctx.h b/sys/net/sock/async/event/sock_async_ctx.h index 1ecc7d39ce..48aa049ed1 100644 --- a/sys/net/sock/async/event/sock_async_ctx.h +++ b/sys/net/sock/async/event/sock_async_ctx.h @@ -28,7 +28,10 @@ extern "C" { * @brief Generalized callback type */ typedef union { - void (*generic)(void *, sock_async_flags_t); /**< anything goes */ + /** + * @brief anything goes + */ + void (*generic)(void *, sock_async_flags_t, void *); #ifdef MODULE_SOCK_DTLS sock_dtls_cb_t dtls; /**< DTLS callback */ #endif diff --git a/sys/net/sock/async/event/sock_async_event.c b/sys/net/sock/async/event/sock_async_event.c index d0954d2986..8f670c5947 100644 --- a/sys/net/sock/async/event/sock_async_event.c +++ b/sys/net/sock/async/event/sock_async_event.c @@ -25,7 +25,7 @@ static void _event_handler(event_t *ev) event->type = 0; irq_restore(state); if (_type) { - event->cb.generic(event->sock, _type); + event->cb.generic(event->sock, _type, NULL); } } @@ -46,8 +46,9 @@ static void _set_ctx(sock_async_ctx_t *ctx, event_queue_t *ev_queue) } #ifdef MODULE_SOCK_DTLS -static void _dtls_cb(sock_dtls_t *sock, sock_async_flags_t type) +static void _dtls_cb(sock_dtls_t *sock, sock_async_flags_t type, void *arg) { + (void)arg; _cb(sock, type, sock_dtls_get_async_ctx(sock)); } @@ -63,8 +64,9 @@ void sock_dtls_event_init(sock_dtls_t *sock, event_queue_t *ev_queue, #endif /* MODULE_SOCK_DTLS */ #ifdef MODULE_SOCK_IP -static void _ip_cb(sock_ip_t *sock, sock_async_flags_t type) +static void _ip_cb(sock_ip_t *sock, sock_async_flags_t type, void *arg) { + (void)arg; _cb(sock, type, sock_ip_get_async_ctx(sock)); } @@ -80,8 +82,9 @@ void sock_ip_event_init(sock_ip_t *sock, event_queue_t *ev_queue, #endif /* MODULE_SOCK_IP */ #ifdef MODULE_SOCK_TCP -static void _tcp_cb(sock_tcp_t *sock, sock_async_flags_t type) +static void _tcp_cb(sock_tcp_t *sock, sock_async_flags_t type, void *arg) { + (void)arg; _cb(sock, type, sock_tcp_get_async_ctx(sock)); } @@ -95,8 +98,10 @@ void sock_tcp_event_init(sock_tcp_t *sock, event_queue_t *ev_queue, sock_tcp_set_cb(sock, _tcp_cb); } -static void _tcp_queue_cb(sock_tcp_queue_t *queue, sock_async_flags_t type) +static void _tcp_queue_cb(sock_tcp_queue_t *queue, sock_async_flags_t type, + void *arg) { + (void)arg; _cb(queue, type, sock_tcp_queue_get_async_ctx(queue)); } @@ -113,8 +118,9 @@ void sock_tcp_queue_event_init(sock_tcp_queue_t *queue, #endif /* MODULE_SOCK_TCP */ #ifdef MODULE_SOCK_UDP -static void _udp_cb(sock_udp_t *sock, sock_async_flags_t type) +static void _udp_cb(sock_udp_t *sock, sock_async_flags_t type, void *arg) { + (void)arg; _cb(sock, type, sock_udp_get_async_ctx(sock)); } diff --git a/tests/gnrc_sock_async_event/main.c b/tests/gnrc_sock_async_event/main.c index e77233200f..0492ee87c2 100644 --- a/tests/gnrc_sock_async_event/main.c +++ b/tests/gnrc_sock_async_event/main.c @@ -69,8 +69,9 @@ ipv6_hdr_t *gnrc_ipv6_get_header(gnrc_pktsnip_t *pkt) return ((ipv6_hdr_t*) tmp->data); } -static void _recv_udp(sock_udp_t *sock, sock_async_flags_t flags) +static void _recv_udp(sock_udp_t *sock, sock_async_flags_t flags, void *arg) { + (void)arg; printf("UDP event triggered: %04X\n", flags); if (flags & SOCK_ASYNC_MSG_RECV) { sock_udp_ep_t remote; @@ -90,8 +91,9 @@ static void _recv_udp(sock_udp_t *sock, sock_async_flags_t flags) } } -static void _recv_ip(sock_ip_t *sock, sock_async_flags_t flags) +static void _recv_ip(sock_ip_t *sock, sock_async_flags_t flags, void *arg) { + (void)arg; printf("IP event triggered: %04X\n", flags); if (flags & SOCK_ASYNC_MSG_RECV) { sock_ip_ep_t remote; diff --git a/tests/lwip/ip.c b/tests/lwip/ip.c index 3292ac90d2..e2914d48ea 100644 --- a/tests/lwip/ip.c +++ b/tests/lwip/ip.c @@ -44,8 +44,9 @@ static sock_ip_t server_sock; static char server_stack[THREAD_STACKSIZE_DEFAULT]; static msg_t server_msg_queue[SERVER_MSG_QUEUE_SIZE]; -static void _ip_recv(sock_ip_t *sock, sock_async_flags_t flags) +static void _ip_recv(sock_ip_t *sock, sock_async_flags_t flags, void *arg) { + (void)arg; if (flags & SOCK_ASYNC_MSG_RECV) { sock_ip_ep_t src; int res; diff --git a/tests/lwip/tcp.c b/tests/lwip/tcp.c index 5bfdab0a46..00bc356077 100644 --- a/tests/lwip/tcp.c +++ b/tests/lwip/tcp.c @@ -47,10 +47,11 @@ static msg_t server_msg_queue[SERVER_MSG_QUEUE_SIZE]; static char _addr_str[IPV6_ADDR_MAX_STR_LEN]; static event_queue_t _ev_queue; -static void _tcp_recv(sock_tcp_t *sock, sock_async_flags_t flags) +static void _tcp_recv(sock_tcp_t *sock, sock_async_flags_t flags, void *arg) { sock_tcp_ep_t client; + (void)arg; if (sock_tcp_get_remote(sock, &client) < 0) { /* socket was disconnected between event firing and this handler */ return; @@ -85,8 +86,10 @@ static void _tcp_recv(sock_tcp_t *sock, sock_async_flags_t flags) } } -static void _tcp_accept(sock_tcp_queue_t *queue, sock_async_flags_t flags) +static void _tcp_accept(sock_tcp_queue_t *queue, sock_async_flags_t flags, + void *arg) { + (void)arg; if (flags & SOCK_ASYNC_CONN_RECV) { sock_tcp_t *sock = NULL; int res; diff --git a/tests/lwip/udp.c b/tests/lwip/udp.c index d0e15bcb6e..c456f61376 100644 --- a/tests/lwip/udp.c +++ b/tests/lwip/udp.c @@ -44,8 +44,9 @@ static sock_udp_t server_sock; static char server_stack[THREAD_STACKSIZE_DEFAULT]; static msg_t server_msg_queue[SERVER_MSG_QUEUE_SIZE]; -static void _udp_recv(sock_udp_t *sock, sock_async_flags_t flags) +static void _udp_recv(sock_udp_t *sock, sock_async_flags_t flags, void *arg) { + (void)arg; if (flags & SOCK_ASYNC_MSG_RECV) { sock_udp_ep_t src; int res;