diff --git a/src/api/sockets.c b/src/api/sockets.c index 6779019c..ccb33335 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -2776,6 +2776,26 @@ lwip_getsockopt_callback(void *arg) } #endif /* LWIP_TCPIP_CORE_LOCKING */ +static int +lwip_sockopt_to_ipopt(int optname) +{ + /* Map SO_* values to our internal SOF_* values + * We should not rely on #defines in socket.h + * being in sync with ip.h. + */ + switch (optname) { + case SO_BROADCAST: + return SOF_BROADCAST; + case SO_KEEPALIVE: + return SOF_KEEPALIVE; + case SO_REUSEADDR: + return SOF_REUSEADDR; + default: + LWIP_ASSERT("Unknown socket option", 0); + return 0; + } +} + /** lwip_getsockopt_impl: the actual implementation of getsockopt: * same argument as lwip_getsockopt, either called directly or through callback */ @@ -2820,6 +2840,9 @@ lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *opt done_socket(sock); return ENOPROTOOPT; } + + optname = lwip_sockopt_to_ipopt(optname); + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int); *(int *)optval = ip_get_option(sock->conn->pcb.ip, optname); LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, optname=0x%x, ..) = %s\n", @@ -3219,6 +3242,9 @@ lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_ done_socket(sock); return ENOPROTOOPT; } + + optname = lwip_sockopt_to_ipopt(optname); + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int); if (*(const int *)optval) { ip_set_option(sock->conn->pcb.ip, optname);