diff --git a/CMakeLists.txt b/CMakeLists.txt index 37544fcd8..01a17e222 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -337,8 +337,10 @@ endif() if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") option(LWS_WITH_NETLINK "Monitor Netlink for Routing Table changes" ON) + option(LWS_WITH_BINDTODEVICE "Use bind to interface socket option" ON) else() set(LWS_WITH_NETLINK 0) + set(LWS_WITH_BINDTODEVICE 0) endif() option(LWS_WITH_MCUFONT_ENCODER "Build the ttf to mcufont encoder" OFF) diff --git a/cmake/lws_config.h.in b/cmake/lws_config.h.in index 8a93ad75c..69ab327b9 100644 --- a/cmake/lws_config.h.in +++ b/cmake/lws_config.h.in @@ -201,6 +201,7 @@ #cmakedefine LWS_WITH_MBEDTLS #cmakedefine LWS_WITH_MINIZ #cmakedefine LWS_WITH_NETLINK +#cmakedefine LWS_WITH_BINDTODEVICE #cmakedefine LWS_WITH_NETWORK #cmakedefine LWS_WITH_NO_LOGS #cmakedefine LWS_WITH_OTA diff --git a/lib/core-net/network.c b/lib/core-net/network.c index 8e2303d62..c59fd6efe 100644 --- a/lib/core-net/network.c +++ b/lib/core-net/network.c @@ -381,6 +381,16 @@ lws_socket_bind(struct lws_vhost *vhost, struct lws *wsi, /* just checking for the interface extant */ if (sockfd == LWS_SOCK_INVALID) return LWS_ITOSA_USABLE; +#if defined(LWS_WITH_BINDTODEVICE) + if (af != AF_UNIX && iface) { + if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, iface, (socklen_t)strlen(iface)) < 0) { + int _lws_errno = LWS_ERRNO; + lwsl_wsi_warn(wsi, "setsockopt bind to device %s error fd %d (%d)", + iface, sockfd, _lws_errno); + /* Root only, non-fatal, continue here. */ + } + } +#endif n = bind(sockfd, v, (socklen_t)n); #ifdef LWS_WITH_UNIX_SOCK