aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-light/src/hicn/io
diff options
context:
space:
mode:
authorAngelo Mantellini <manangel@cisco.com>2019-07-12 08:48:59 -0700
committerAngelo Mantellini <manangel@cisco.com>2019-07-12 09:39:35 -0700
commita621d4843592cdf3fe758fc06ab19af299278ca7 (patch)
tree755c07d1a0f4fc79eca2f1ce994627906e4479c1 /hicn-light/src/hicn/io
parent63422dfdcb1cd6827e76440cc147c9eac415952a (diff)
[HICN-245] Bind of the listener to the device
Change-Id: I4d8cd95ba74c5d24d4c49975e7798440fe3e34d1 Signed-off-by: Angelo Mantellini <manangel@cisco.com>
Diffstat (limited to 'hicn-light/src/hicn/io')
-rw-r--r--hicn-light/src/hicn/io/udpListener.c19
-rw-r--r--hicn-light/src/hicn/io/udpListener.h7
2 files changed, 26 insertions, 0 deletions
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);
diff --git a/hicn-light/src/hicn/io/udpListener.h b/hicn-light/src/hicn/io/udpListener.h
index 1ad3f77fe..81d191eab 100644
--- a/hicn-light/src/hicn/io/udpListener.h
+++ b/hicn-light/src/hicn/io/udpListener.h
@@ -27,9 +27,16 @@
struct udp_listener;
typedef struct udp_listener UdpListener;
+#ifdef __linux__
+ListenerOps *udpListener_CreateInet6(Forwarder *forwarder,
+ struct sockaddr_in6 sin6, const char *if_bind);
+ListenerOps *udpListener_CreateInet(Forwarder *forwarder,
+ struct sockaddr_in sin, const char *if_bind);
+#else
ListenerOps *udpListener_CreateInet6(Forwarder *forwarder,
struct sockaddr_in6 sin6);
ListenerOps *udpListener_CreateInet(Forwarder *forwarder,
struct sockaddr_in sin);
+#endif
// void udpListener_SetPacketType(ListenerOps *ops, MessagePacketType type);
#endif // udpListener_h