From a621d4843592cdf3fe758fc06ab19af299278ca7 Mon Sep 17 00:00:00 2001 From: Angelo Mantellini Date: Fri, 12 Jul 2019 08:48:59 -0700 Subject: [HICN-245] Bind of the listener to the device Change-Id: I4d8cd95ba74c5d24d4c49975e7798440fe3e34d1 Signed-off-by: Angelo Mantellini --- hicn-light/src/hicn/io/udpListener.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'hicn-light/src/hicn/io/udpListener.c') diff --git a/hicn-light/src/hicn/io/udpListener.c b/hicn-light/src/hicn/io/udpListener.c index 3d3455f41..3dd4b466c 100644 --- a/hicn-light/src/hicn/io/udpListener.c +++ b/hicn-light/src/hicn/io/udpListener.c @@ -70,8 +70,13 @@ static ListenerOps udpTemplate = {.context = NULL, static void _readcb(int fd, PARCEventType what, void *udpVoid); +#ifdef __linux__ +ListenerOps *udpListener_CreateInet6(Forwarder *forwarder, + struct sockaddr_in6 sin6, const char *interfaceName) { +#else ListenerOps *udpListener_CreateInet6(Forwarder *forwarder, struct sockaddr_in6 sin6) { +#endif ListenerOps *ops = NULL; UdpListener *udp = parcMemory_AllocateAndClear(sizeof(UdpListener)); @@ -112,7 +117,12 @@ ListenerOps *udpListener_CreateInet6(Forwarder *forwarder, parcAssertFalse(failure, "failed to set REUSEADDR on socket(%d)", errno); failure = bind(udp->udp_socket, (struct sockaddr *)&sin6, sizeof(sin6)); + if (failure == 0) { +#ifdef __linux__ + setsockopt(udp->udp_socket, SOL_SOCKET, SO_BINDTODEVICE, + interfaceName, strlen(interfaceName) + 1); +#endif udp->udp_event = dispatcher_CreateNetworkEvent(forwarder_GetDispatcher(forwarder), true, _readcb, (void *)udp, udp->udp_socket); @@ -153,8 +163,13 @@ ListenerOps *udpListener_CreateInet6(Forwarder *forwarder, return ops; } +#ifdef __linux__ +ListenerOps *udpListener_CreateInet(Forwarder *forwarder, + struct sockaddr_in sin, const char *interfaceName) { +#else ListenerOps *udpListener_CreateInet(Forwarder *forwarder, struct sockaddr_in sin) { +#endif ListenerOps *ops = NULL; UdpListener *udp = parcMemory_AllocateAndClear(sizeof(UdpListener)); @@ -195,6 +210,10 @@ ListenerOps *udpListener_CreateInet(Forwarder *forwarder, failure = bind(udp->udp_socket, (struct sockaddr *)&sin, sizeof(sin)); if (failure == 0) { +#ifdef __linux__ + setsockopt(udp->udp_socket, SOL_SOCKET, SO_BINDTODEVICE, + interfaceName, strlen(interfaceName) + 1); +#endif udp->udp_event = dispatcher_CreateNetworkEvent(forwarder_GetDispatcher(forwarder), true, _readcb, (void *)udp, udp->udp_socket); -- cgit 1.2.3-korg