From 425b2dda61b00f6a92de3ce07d9d85d9ddf84515 Mon Sep 17 00:00:00 2001 From: goldsimon Date: Sun, 26 Mar 2017 22:26:40 +0200 Subject: [PATCH] altcp_get_ip: added altcp_get_ip(), added default functions that only defer a call to the inner_conn (moved from tls_mbedtls to generic altcp) --- src/apps/altcp_tls/altcp_tls_mbedtls.c | 91 ++--------------- src/core/altcp.c | 136 +++++++++++++++++++++++++ src/core/altcp_tcp.c | 19 +++- src/include/lwip/altcp.h | 1 + src/include/lwip/priv/altcp_priv.h | 49 ++++++--- 5 files changed, 198 insertions(+), 98 deletions(-) diff --git a/src/apps/altcp_tls/altcp_tls_mbedtls.c b/src/apps/altcp_tls/altcp_tls_mbedtls.c index eb35d410..12ea5006 100644 --- a/src/apps/altcp_tls/altcp_tls_mbedtls.c +++ b/src/apps/altcp_tls/altcp_tls_mbedtls.c @@ -779,15 +779,6 @@ altcp_mbedtls_recved(struct altcp_pcb *conn, u16_t len) altcp_recved(conn->inner_conn, lower_recved); } -static err_t -altcp_mbedtls_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port) -{ - if (conn == NULL) { - return ERR_VAL; - } - return altcp_bind(conn->inner_conn, ipaddr, port); -} - static err_t altcp_mbedtls_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected) { @@ -839,15 +830,6 @@ altcp_mbedtls_close(struct altcp_pcb *conn) return altcp_close(conn->inner_conn); } -static err_t -altcp_mbedtls_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx) -{ - if (conn == NULL) { - return ERR_VAL; - } - return altcp_shutdown(conn->inner_conn, shut_rx, shut_tx); -} - /** Write data to a TLS connection. Calls into mbedTLS, which in turn calls into * @ref altcp_mbedtls_bio_send() to send the encrypted data */ @@ -917,15 +899,6 @@ altcp_mbedtls_bio_send(void* ctx, const unsigned char* dataptr, size_t size) return written; } -static err_t -altcp_mbedtls_output(struct altcp_pcb *conn) -{ - if (conn == NULL) { - return ERR_VAL; - } - return altcp_output(conn->inner_conn); -} - static u16_t altcp_mbedtls_mss(struct altcp_pcb *conn) { @@ -936,32 +909,6 @@ altcp_mbedtls_mss(struct altcp_pcb *conn) return altcp_mss(conn->inner_conn); } -static u16_t -altcp_mbedtls_sndbuf(struct altcp_pcb *conn) -{ - if (conn == NULL) { - return 0; - } - return altcp_sndbuf(conn->inner_conn); -} - -static u16_t -altcp_mbedtls_sndqueuelen(struct altcp_pcb *conn) -{ - if (conn == NULL) { - return 0; - } - return altcp_sndqueuelen(conn->inner_conn); -} - -static void -altcp_mbedtls_setprio(struct altcp_pcb *conn, u8_t prio) -{ - if (conn != NULL) { - altcp_setprio(conn->inner_conn, prio); - } -} - static void altcp_mbedtls_dealloc(struct altcp_pcb *conn) { @@ -977,46 +924,26 @@ altcp_mbedtls_dealloc(struct altcp_pcb *conn) } } -static err_t -altcp_mbedtls_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port) -{ - if (conn) { - return altcp_get_tcp_addrinfo(conn->inner_conn, local, addr, port); - } - return ERR_VAL; -} - -#ifdef LWIP_DEBUG -static enum tcp_state -altcp_mbedtls_dbg_get_tcp_state(struct altcp_pcb *conn) -{ - if (conn) { - return altcp_dbg_get_tcp_state(conn->inner_conn); - } - return CLOSED; -} -#endif - - const struct altcp_functions altcp_mbedtls_functions = { altcp_mbedtls_set_poll, altcp_mbedtls_recved, - altcp_mbedtls_bind, + altcp_default_bind, altcp_mbedtls_connect, altcp_mbedtls_listen, altcp_mbedtls_abort, altcp_mbedtls_close, - altcp_mbedtls_shutdown, + altcp_default_shutdown, altcp_mbedtls_write, - altcp_mbedtls_output, + altcp_default_output, altcp_mbedtls_mss, - altcp_mbedtls_sndbuf, - altcp_mbedtls_sndqueuelen, - altcp_mbedtls_setprio, + altcp_default_sndbuf, + altcp_default_sndqueuelen, + altcp_default_setprio, altcp_mbedtls_dealloc, - altcp_mbedtls_get_tcp_addrinfo + altcp_default_get_tcp_addrinfo, + altcp_default_get_ip #ifdef LWIP_DEBUG - ,altcp_mbedtls_dbg_get_tcp_state + ,altcp_default_dbg_get_tcp_state #endif }; diff --git a/src/core/altcp.c b/src/core/altcp.c index 1e8d58b9..7e2e5501 100644 --- a/src/core/altcp.c +++ b/src/core/altcp.c @@ -329,6 +329,15 @@ altcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t return ERR_VAL; } +ip_addr_t * +altcp_get_ip(struct altcp_pcb *conn, int local) +{ + if (conn && conn->fns && conn->fns->getip) { + return conn->fns->getip(conn, local); + } + return NULL; +} + #ifdef LWIP_DEBUG enum tcp_state altcp_dbg_get_tcp_state(struct altcp_pcb *conn) @@ -340,4 +349,131 @@ altcp_dbg_get_tcp_state(struct altcp_pcb *conn) } #endif +/* Default implementations for the "virtual" functions */ + +void +altcp_mbedtls_set_poll(struct altcp_pcb *conn, u8_t interval) +{ + if (conn && conn->inner_conn) { + altcp_poll(conn->inner_conn, conn->poll, interval); + } +} + +void +altcp_default_recved(struct altcp_pcb *conn, u16_t len) +{ + if (conn && conn->inner_conn) { + altcp_recved(conn->inner_conn, len); + } +} + +err_t +altcp_default_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port) +{ + if (conn && conn->inner_conn) { + return altcp_bind(conn->inner_conn, ipaddr, port); + } + return ERR_VAL; +} + +err_t +altcp_default_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx) +{ + if (conn && conn->inner_conn) { + return altcp_shutdown(conn->inner_conn, shut_rx, shut_tx); + } + return ERR_VAL; +} + +err_t +altcp_default_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags) +{ + if (conn && conn->inner_conn) { + return altcp_write(conn->inner_conn, dataptr, len, apiflags); + } + return ERR_VAL; +} + +err_t +altcp_default_output(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + return altcp_output(conn->inner_conn); + } + return ERR_VAL; +} + +u16_t +altcp_default_mss(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + return altcp_mss(conn->inner_conn); + } + return 0; +} + +u16_t +altcp_default_sndbuf(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + return altcp_sndbuf(conn->inner_conn); + } + return 0; +} + +u16_t +altcp_default_sndqueuelen(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + return altcp_sndqueuelen(conn->inner_conn); + } + return 0; +} + +void +altcp_default_setprio(struct altcp_pcb *conn, u8_t prio) +{ + if (conn && conn->inner_conn) { + altcp_setprio(conn->inner_conn, prio); + } +} + +void +altcp_default_dealloc(struct altcp_pcb *conn) +{ + LWIP_UNUSED_ARG(conn); + /* nothing to do */ +} + +err_t +altcp_default_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port) +{ + if (conn && conn->inner_conn) { + return altcp_get_tcp_addrinfo(conn->inner_conn, local, addr, port); + } + return ERR_VAL; +} + +ip_addr_t * +altcp_default_get_ip(struct altcp_pcb *conn, int local) +{ + if (conn && conn->inner_conn) { + return altcp_get_ip(conn->inner_conn, local); + } + return NULL; +} + + +#ifdef LWIP_DEBUG +enum tcp_state +altcp_default_dbg_get_tcp_state(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + return altcp_dbg_get_tcp_state(conn->inner_conn); + } + return CLOSED; +} +#endif + + #endif /* LWIP_ALTCP */ diff --git a/src/core/altcp_tcp.c b/src/core/altcp_tcp.c index bcd6e934..2d672cf9 100644 --- a/src/core/altcp_tcp.c +++ b/src/core/altcp_tcp.c @@ -354,6 +354,22 @@ altcp_tcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u return ERR_VAL; } +static ip_addr_t * +altcp_tcp_get_ip(struct altcp_pcb *conn, int local) +{ + if (conn) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->inner_conn; + if (pcb) { + if (local) { + return &pcb->local_ip; + } else { + return &pcb->remote_ip; + } + } + } + return NULL; +} + #ifdef LWIP_DEBUG static enum tcp_state altcp_tcp_dbg_get_tcp_state(struct altcp_pcb *conn) @@ -383,7 +399,8 @@ const struct altcp_functions altcp_tcp_functions = { altcp_tcp_sndqueuelen, altcp_tcp_setprio, altcp_tcp_dealloc, - altcp_tcp_get_tcp_addrinfo + altcp_tcp_get_tcp_addrinfo, + altcp_tcp_get_ip #ifdef LWIP_DEBUG ,altcp_tcp_dbg_get_tcp_state #endif diff --git a/src/include/lwip/altcp.h b/src/include/lwip/altcp.h index 663cf5e6..c64d82cf 100644 --- a/src/include/lwip/altcp.h +++ b/src/include/lwip/altcp.h @@ -113,6 +113,7 @@ u16_t altcp_sndqueuelen(struct altcp_pcb *conn); void altcp_setprio(struct altcp_pcb *conn, u8_t prio); err_t altcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port); +ip_addr_t *altcp_get_ip(struct altcp_pcb *conn, int local); #ifdef LWIP_DEBUG enum tcp_state altcp_dbg_get_tcp_state(struct altcp_pcb *conn); diff --git a/src/include/lwip/priv/altcp_priv.h b/src/include/lwip/priv/altcp_priv.h index 4bcbd281..110c3c73 100644 --- a/src/include/lwip/priv/altcp_priv.h +++ b/src/include/lwip/priv/altcp_priv.h @@ -79,32 +79,51 @@ typedef void (*altcp_setprio_fn)(struct altcp_pcb *conn, u8_t prio); typedef void (*altcp_dealloc_fn)(struct altcp_pcb *conn); typedef err_t (*altcp_get_tcp_addrinfo_fn)(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port); +typedef ip_addr_t *(*altcp_get_ip_fn)(struct altcp_pcb *conn, int local); + #ifdef LWIP_DEBUG typedef enum tcp_state (*altcp_dbg_get_tcp_state_fn)(struct altcp_pcb *conn); #endif struct altcp_functions { - altcp_set_poll_fn set_poll; - altcp_recved_fn recved; - altcp_bind_fn bind; - altcp_connect_fn connect; - altcp_listen_fn listen; - altcp_abort_fn abort; - altcp_close_fn close; - altcp_shutdown_fn shutdown; - altcp_write_fn write; - altcp_output_fn output; - altcp_mss_fn mss; - altcp_sndbuf_fn sndbuf; - altcp_sndqueuelen_fn sndqueuelen; - altcp_setprio_fn setprio; - altcp_dealloc_fn dealloc; + altcp_set_poll_fn set_poll; + altcp_recved_fn recved; + altcp_bind_fn bind; + altcp_connect_fn connect; + altcp_listen_fn listen; + altcp_abort_fn abort; + altcp_close_fn close; + altcp_shutdown_fn shutdown; + altcp_write_fn write; + altcp_output_fn output; + altcp_mss_fn mss; + altcp_sndbuf_fn sndbuf; + altcp_sndqueuelen_fn sndqueuelen; + altcp_setprio_fn setprio; + altcp_dealloc_fn dealloc; altcp_get_tcp_addrinfo_fn addrinfo; + altcp_get_ip_fn getip; #ifdef LWIP_DEBUG altcp_dbg_get_tcp_state_fn dbg_get_tcp_state; #endif }; +void altcp_default_set_poll(struct altcp_pcb *conn, u8_t interval); +void altcp_default_recved(struct altcp_pcb *conn, u16_t len); +err_t altcp_default_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port); +err_t altcp_default_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx); +err_t altcp_default_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags); +err_t altcp_default_output(struct altcp_pcb *conn); +u16_t altcp_default_mss(struct altcp_pcb *conn); +u16_t altcp_default_sndbuf(struct altcp_pcb *conn); +u16_t altcp_default_sndqueuelen(struct altcp_pcb *conn); +void altcp_default_setprio(struct altcp_pcb *conn, u8_t prio); +void altcp_default_dealloc(struct altcp_pcb *conn); +err_t altcp_default_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port); +ip_addr_t *altcp_default_get_ip(struct altcp_pcb *conn, int local); +#ifdef LWIP_DEBUG +enum tcp_state altcp_default_dbg_get_tcp_state(struct altcp_pcb *conn); +#endif #ifdef __cplusplus }