Commit eec39c28 authored by Yann Garcia's avatar Yann Garcia
Browse files

Trying to fix listener issue

parent c9d4fd59
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk

PKG_NAME:=its_bridge
PKG_REFV:=2
PKG_VERSION:=0.0.1
PKG_VERSION:=0.0.12
PKG_RELEASE:=1

include $(INCLUDE_DIR)/package.mk
+29 −30
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ void sig_usr1_handler(int p_signal) {
}

int main(const int32_t p_argc, char* const p_argv[]) {
  fprintf(stderr, ">>> Version 12.\n");
  /* Sanity check */
  uid_t uid = getuid();
  if (geteuid() != uid) {
@@ -136,27 +137,33 @@ int main(const int32_t p_argc, char* const p_argv[]) {
      fprintf(stderr, "Failed to create UDP socket: %s.\n", strerror(errno));
      goto error;
    }
    /* allow multiple instances to receive copies of the multicast datagrams */
    /* Allow multiple instances to receive copies of the multicast datagrams */
    int32_t flags = 1;
    if (setsockopt(socket_hd, SOL_SOCKET, SO_REUSEADDR, (char *)&flags, sizeof(flags)) < 0) {
      fprintf(stderr, "Failed to set SO_REUSEADDR option: %s.\n", strerror(errno));
      close(socket_hd);
      goto error;
    }
    /* Bind it to the specified NIC Ethernet */
    /* Get interface address */
    memset(&ifr, 0, sizeof(ifr));
    ifr.ifr_addr.sa_family = AF_INET;
    snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", udp_nic);
#ifndef __APPLE__
/* FIXME To test
    if (setsockopt(socket_hd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr.ifr_name, strlen(ifr.ifr_name)) < 0) {
      fprintf(stderr, "Failed to bind to interface:%s.\n", strerror(errno));
    if (ioctl(socket_hd, SIOCGIFADDR, &ifr) < 0) {
      fprintf(stderr, "Failed to get interface address for %s.\n", ifr.ifr_name);
      close(socket_hd);
      goto error;
    }
    printf("Interface address for %s: %s\n", ifr.ifr_name, inet_ntoa(((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr));
    /* Bind it to the specified NIC Ethernet */
    struct sockaddr_in server_addr = {0};
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//inet_addr(inet_ntoa(((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr));
    server_addr.sin_port = htons(udp_port);
    if (bind(socket_hd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
      fprintf(stderr, "Failed to bind UDP broadcast socket: %s.\n", strerror(errno));
      close(socket_hd);
      goto error;
    }
    printf("Bound to device %s.\n", ifr.ifr_name);
*/
#endif
    /* Configure the udp_port and ip we want to receive from */
    if (udp_protocol != NULL) {
      if (strcmp(udp_protocol, "broadcast") == 0) {
@@ -167,20 +174,21 @@ int main(const int32_t p_argc, char* const p_argv[]) {
          goto error;
        }
      } else if (strcmp(udp_protocol, "multicast") == 0) {
        /* Get interface address */
        if (ioctl(socket_hd, SIOCGIFADDR, &ifr) < 0) {
          fprintf(stderr, "Failed to get interface address for %s.\n", ifr.ifr_name);
#ifndef __APPLE__
	if (setsockopt(socket_hd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr.ifr_name, strlen(ifr.ifr_name)) < 0) {
	  fprintf(stderr, "Failed to bind to interface:%s.\n", strerror(errno));
	  close(socket_hd);
	  goto error;
	}
        printf("Interface address for %s: %s\n", ifr.ifr_name, inet_ntoa(((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr));
	printf("Bound to device %s.\n", ifr.ifr_name);
#endif
	/* Join the multicast group */
        mreq = (struct ip_mreq**)malloc(num_addresses * sizeof(struct ip_mreq*));
        memset((void*)mreq, 0x00, num_addresses * sizeof(struct ip_mreq*));
        for (size_t i = 0; i < num_addresses; i++) {
          struct ip_mreq* mr = (struct ip_mreq*)malloc(sizeof(struct ip_mreq));
          *(mreq + i) = mr;
          mr->imr_interface.s_addr = inet_addr(inet_ntoa(((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr)); /* Local address */
          mr->imr_interface.s_addr = htonl(INADDR_ANY);//inet_addr(inet_ntoa(((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr)); /* Local address */
          mr->imr_multiaddr.s_addr = inet_addr(*(udp_addresses + i)); /* IP multicast address of group */
          printf("mreq.imr_interface.s_addr = %s.\n", inet_ntoa(mr->imr_interface));
          printf("mreq.imr_multiaddr.s_addr = %s.\n", inet_ntoa(mr->imr_multiaddr));
@@ -202,21 +210,12 @@ int main(const int32_t p_argc, char* const p_argv[]) {
    } else { /* Unicast */
      /* Nothing to do */
    }
    /* Configure the port and ip we want to send to */
    struct sockaddr_in server_addr = {0};
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(udp_port);
    if (bind(socket_hd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
      fprintf(stderr, "Failed to bind UDP broadcast socket: %s.\n", strerror(errno));
      close(socket_hd);
      goto error;
    }
    /* Start listening */
    running = true;
    uint8_t buffer[MAX_BUFFER_SIZE];
    int32_t addr_len;
    struct sockaddr_in addr;
    struct sockaddr_in addr = {0};
    int32_t addr_len = sizeof(addr);
    printf("Entering 'while' loop: state=%d.\n", state);
    while (running == true) {
      result = recvfrom(socket_hd, buffer, MAX_BUFFER_SIZE, 0, (struct sockaddr*)&addr, &addr_len);
      if (result < 0) {