diff --git a/serial_forwarder.c b/serial_forwarder.c index 283e9bf..dd28013 100644 --- a/serial_forwarder.c +++ b/serial_forwarder.c @@ -22,8 +22,16 @@ #include "ping_pong.h" #include "gpio.h" -#define DEST_PORT 1234 -#define DEST_ADDR "fd00::1" +struct addr_port { + const char * addr; + const int port; +}; + +const struct addr_port dests[] = { + {"fd00::1", 1234}, + {"fd00::10", 1234}, +}; +const int dests_len = (sizeof (dests)) / (sizeof (dests[0])); #define PORT 4321 @@ -65,8 +73,8 @@ int handle_buf(int sockfd, } int handle_sockfd(int sockfd, - struct sockaddr_in6 * dest_addr, - struct link_state * link_state) + struct dest_addr dest_addr[], + struct link_state link_state[]) { struct sockaddr_in6 src_addr; socklen_t addrlen = (sizeof (struct sockaddr_in6)); @@ -88,10 +96,16 @@ int handle_sockfd(int sockfd, } } - //char src_addr_str[INET6_ADDRSTRLEN]; - //inet_ntop(AF_INET6, &src_addr.sin6_addr, src_addr_str, INET6_ADDRSTRLEN); - //printf("received packet from %s:%d\n", src_addr_str, ntohs(src_addr.sin6_port)); - //printf("length: %ld\n", recv_len); + char src_addr_str[INET6_ADDRSTRLEN]; + inet_ntop(AF_INET6, &src_addr.sin6_addr, src_addr_str, INET6_ADDRSTRLEN); + printf("received packet from %s:%d\n", src_addr_str, ntohs(src_addr.sin6_port)); + printf("length: %ld\n", recv_len); + + for (int i = 0; i < dests_len; i++) { + if (memcmp(src_addr.sin6_addr.s6_addr, dest_addr[i].sin6_addr.s6_addr, (sizeof (struct in6_addr))) == 0) { + printf("MATCH %d\n", i); + } + } int ret = handle_buf(sockfd, dest_addr, buf, recv_len, link_state); if (ret == -1) { @@ -387,15 +401,17 @@ int main(void) } } - struct sockaddr_in6 dest_addr; - dest_addr.sin6_family = AF_INET6; - dest_addr.sin6_port = htons(DEST_PORT); - ret = inet_pton(AF_INET6, DEST_ADDR, &dest_addr.sin6_addr); - assert(ret == 1); + struct sockaddr_in6 dest_addr[dests_len]; + for (int i = 0; i < dests_len; i++) { + dest_addr[i].sin6_family = AF_INET6; + dest_addr[i].sin6_port = htons(dests[i].port); + ret = inet_pton(AF_INET6, dests[i].addr, &dest_addr[i].sin6_addr); + assert(ret == 1); + } struct parser_state parser_state = {0}; struct timer_state timer_state = {0}; - struct link_state link_state = {0}; + struct link_state link_state[dests_len] = {0}; struct gpio_state gpio_state = {0}; gpio_open("/dev/gpiochip0", &gpio_state); @@ -410,13 +426,13 @@ int main(void) for (int n = 0; n < nfds; ++n) { if (events[n].data.fd == sockfd) { - ret = handle_sockfd(sockfd, &dest_addr, &link_state); + ret = handle_sockfd(sockfd, link_state); if (ret == -1) return -1; } else if (events[n].data.fd == timerfd) { ret = handle_timerfd(timerfd, sockfd, - &dest_addr, + dest_addr, &timer_state, &link_state, &gpio_state); @@ -426,7 +442,7 @@ int main(void) fprintf(stderr, "handle_serialfd\n"); ret = handle_serialfd(serialfd, sockfd, - &dest_addr, + dest_addr, &parser_state, &timer_state, &link_state,