static void listen_callback(evutil_socket_t fd, short ev, void *arg) { struct hub *hub = arg; ssize_t n; if (ev & EV_READ) { struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); if ((n = recvfrom(fd, mbuf, sizeof(mbuf), 0, (struct sockaddr *) &addr, &addrlen)) > 0) { struct peer *ptr = hub->peers; while (ptr) { if (!evutil_sockaddr_cmp((struct sockaddr *) &addr, ptr->addr, 0)) { ptr->received += n; printf("%zi bytes from %s (total %zi bytes)\n", n, ptr->name, ptr->received); break; } ptr = ptr->next; } n = tnt_tun_write(&hub->tun, mbuf, n); if (n > 0) hub->rx += n; } } }
int endpoint_cmp(struct endpoint const *a, struct endpoint const *b) { if (a->addrlen != b->addrlen) return -1; return evutil_sockaddr_cmp(endpoint_addr(a), endpoint_addr(b), 1); }
static int find_udppeer(struct udp_peer const *a, void *ctx) { struct sockaddr *s = ctx; return !evutil_sockaddr_cmp(endpoint_addr(&a->peer_addr), s, 0); }