X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/102fa2f087554901001abcd106160a4ea0668206..5d06f63eaa34a4bf0e116f3e2a1e4ef4e6434224:/server/peer.c diff --git a/server/peer.c b/server/peer.c index 03ed2ae3..ba8d7baf 100644 --- a/server/peer.c +++ b/server/peer.c @@ -27,11 +27,14 @@ #include "tripe.h" +/*----- Global state ------------------------------------------------------*/ + +sel_file udpsock[NADDRFAM]; + /*----- Static variables --------------------------------------------------*/ static sym_table byname; static addrmap byaddr; -static sel_file sock; static unsigned nmobile; /*----- Tunnel table ------------------------------------------------------*/ @@ -181,6 +184,7 @@ int p_updateaddr(peer *p, const addr *a) { peer *q; peer_byaddr *pa, *qa; + int ix; unsigned f; /* --- Figure out how to proceed --- * @@ -197,6 +201,7 @@ int p_updateaddr(peer *p, const addr *a) T( trace(T_PEER, "peer: updating address for `%s'", p_name(p)); ) am_remove(&byaddr, p->byaddr); p->byaddr = pa; p->spec.sa = *a; pa->p = p; + p->afix = afix(p->spec.sa.sa.sa_family); assert(p->afix >= 0); a_notify("NEWADDR", "?PEER", p, "?ADDR", a, A_END); return (0); } else { @@ -205,6 +210,7 @@ int p_updateaddr(peer *p, const addr *a) p_name(p), p_name(q)); ) q->byaddr = qa; qa->p = q; q->spec.sa = p->spec.sa; p->byaddr = pa; pa->p = p; p->spec.sa = *a; + ix = p->afix; p->afix = q->afix; q->afix = ix; a_notify("NEWADDR", "?PEER", p, "?ADDR", a, A_END); a_notify("NEWADDR", "?PEER", q, "?ADDR", &q->spec.sa, A_END); return (0); @@ -510,7 +516,7 @@ static int p_dotxend(peer *p) } IF_TRACING(T_PEER, trace_block(T_PACKET, "peer: sending packet", BBASE(&p->b), BLEN(&p->b)); ) - if (sendto(sock.fd, BBASE(&p->b), BLEN(&p->b), + if (sendto(udpsock[p->afix].fd, BBASE(&p->b), BLEN(&p->b), 0, &p->spec.sa.sa, sasz) < 0) { a_warn("PEER", "?PEER", p, "socket-write-error", "?ERRNO", A_END); return (0); @@ -802,8 +808,8 @@ void p_init(struct in_addr addr, unsigned port) strerror(errno)); } fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC); - sel_initfile(&sel, &sock, fd, SEL_READ, p_read, 0); - sel_addfile(&sock); + sel_initfile(&sel, &udpsock[AFIX_INET], fd, SEL_READ, p_read, 0); + sel_addfile(&udpsock[AFIX_INET]); T( trace(T_PEER, "peer: created socket"); ) sym_create(&byname); @@ -812,17 +818,17 @@ void p_init(struct in_addr addr, unsigned port) /* --- @p_port@ --- * * - * Arguments: --- + * Arguments: @int i@ = address family index to retrieve * * Returns: Port number used for socket. */ -unsigned p_port(void) +unsigned p_port(int i) { addr a; socklen_t sz = sizeof(addr); - if (getsockname(sock.fd, &a.sa, &sz)) + if (getsockname(udpsock[i].fd, &a.sa, &sz)) die(EXIT_FAILURE, "couldn't read port number: %s", strerror(errno)); assert(a.sa.sa_family == AF_INET); return (ntohs(a.sin.sin_port)); @@ -898,6 +904,7 @@ peer *p_create(peerspec *spec) p->ks = 0; p->pings = 0; p->ifname = 0; + p->afix = afix(p->spec.sa.sa.sa_family); assert(p->afix >= 0); memset(&p->st, 0, sizeof(stats)); p->st.t_start = time(0); if (!(tops->flags & TUNF_PRIVOPEN))