X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet_packet.c;h=a8c8b03619924bfe0e18e493c8e8f221a6891942;hb=752526ca2fd3a0c5b730d1d96540118ff54c462b;hp=41e2521df386a18c2770e2678d0a715a6067950d;hpb=8f8d796e645653f5620322f3f1f37552c01db86e;p=meshlink diff --git a/src/net_packet.c b/src/net_packet.c index 41e2521d..a8c8b036 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -30,6 +30,7 @@ #include "digest.h" #include "graph.h" #include "logger.h" +#include "meshlink_internal.h" #include "net.h" #include "netutl.h" #include "protocol.h" @@ -42,8 +43,6 @@ int keylifetime = 0; static void send_udppacket(node_t *, vpn_packet_t *); unsigned replaywin = 16; -bool localdiscovery = false; -sockaddr_t localdiscovery_address; #define MAX_SEQNO 1073741824 @@ -111,7 +110,7 @@ static void send_mtu_probe_handler(void *data) { timeout = pingtimeout; } - for(int i = 0; i < 4 + localdiscovery; i++) { + for(int i = 0; i < 4 + mesh->localdiscovery; i++) { int len; if(i == 0) { @@ -387,13 +386,13 @@ static void choose_udp_address(const node_t *n, const sockaddr_t **sa, int *sock if(candidate) { *sa = &candidate->address; - *sock = rand() % listen_sockets; + *sock = rand() % mesh->listen_sockets; } /* Make sure we have a suitable socket for the chosen address */ - if(listen_socket[*sock].sa.sa.sa_family != (*sa)->sa.sa_family) { - for(int i = 0; i < listen_sockets; i++) { - if(listen_socket[i].sa.sa.sa_family == (*sa)->sa.sa_family) { + if(mesh->listen_socket[*sock].sa.sa.sa_family != (*sa)->sa.sa_family) { + for(int i = 0; i < mesh->listen_sockets; i++) { + if(mesh->listen_socket[i].sa.sa.sa_family == (*sa)->sa.sa_family) { *sock = i; break; } @@ -418,21 +417,21 @@ static void choose_broadcast_address(const node_t *n, const sockaddr_t **sa, int } }; - *sock = rand() % listen_sockets; + *sock = rand() % mesh->listen_sockets; - if(listen_socket[*sock].sa.sa.sa_family == AF_INET6) { - if(localdiscovery_address.sa.sa_family == AF_INET6) { - localdiscovery_address.in6.sin6_port = n->prevedge->address.in.sin_port; - *sa = &localdiscovery_address; + if(mesh->listen_socket[*sock].sa.sa.sa_family == AF_INET6) { + if(mesh->localdiscovery_address.sa.sa_family == AF_INET6) { + mesh->localdiscovery_address.in6.sin6_port = n->prevedge->address.in.sin_port; + *sa = &mesh->localdiscovery_address; } else { broadcast_ipv6.in6.sin6_port = n->prevedge->address.in.sin_port; - broadcast_ipv6.in6.sin6_scope_id = listen_socket[*sock].sa.in6.sin6_scope_id; + broadcast_ipv6.in6.sin6_scope_id = mesh->listen_socket[*sock].sa.in6.sin6_scope_id; *sa = &broadcast_ipv6; } } else { - if(localdiscovery_address.sa.sa_family == AF_INET) { - localdiscovery_address.in.sin_port = n->prevedge->address.in.sin_port; - *sa = &localdiscovery_address; + if(mesh->localdiscovery_address.sa.sa_family == AF_INET) { + mesh->localdiscovery_address.in.sin_port = n->prevedge->address.in.sin_port; + *sa = &mesh->localdiscovery_address; } else { broadcast_ipv4.in.sin_port = n->prevedge->address.in.sin_port; *sa = &broadcast_ipv4; @@ -462,16 +461,16 @@ bool send_sptps_data(void *handle, uint8_t type, const char *data, size_t len) { /* Send it via TCP if it is a handshake packet, TCPOnly is in use, or this packet is larger than the MTU. */ - if(type >= SPTPS_HANDSHAKE || ((myself->options | to->options) & OPTION_TCPONLY) || (type != PKT_PROBE && len > to->minmtu)) { + if(type >= SPTPS_HANDSHAKE || ((mesh->self->options | to->options) & OPTION_TCPONLY) || (type != PKT_PROBE && len > to->minmtu)) { char buf[len * 4 / 3 + 5]; b64encode(data, buf, len); /* If no valid key is known yet, send the packets using ANS_KEY requests, to ensure we get to learn the reflexive UDP address. */ if(!to->status.validkey) { - to->incompression = myself->incompression; - return send_request(to->nexthop->connection, "%d %s %s %s -1 -1 -1 %d", ANS_KEY, myself->name, to->name, buf, to->incompression); + to->incompression = mesh->self->incompression; + return send_request(to->nexthop->connection, "%d %s %s %s -1 -1 -1 %d", ANS_KEY, mesh->self->name, to->name, buf, to->incompression); } else { - return send_request(to->nexthop->connection, "%d %s %s %d %s", REQ_KEY, myself->name, to->name, REQ_SPTPS, buf); + return send_request(to->nexthop->connection, "%d %s %s %d %s", REQ_KEY, mesh->self->name, to->name, REQ_SPTPS, buf); } } @@ -485,7 +484,7 @@ bool send_sptps_data(void *handle, uint8_t type, const char *data, size_t len) { else choose_udp_address(to, &sa, &sock); - if(sendto(listen_socket[sock].udp.fd, data, len, 0, &sa->sa, SALEN(sa->sa)) < 0 && !sockwouldblock(sockerrno)) { + if(sendto(mesh->listen_socket[sock].udp.fd, data, len, 0, &sa->sa, SALEN(sa->sa)) < 0 && !sockwouldblock(sockerrno)) { if(sockmsgsize(sockerrno)) { if(to->maxmtu >= len) to->maxmtu = len - 1; @@ -558,7 +557,7 @@ bool receive_sptps_record(void *handle, uint8_t type, const char *data, uint16_t void send_packet(node_t *n, vpn_packet_t *packet) { node_t *via; - if(n == myself) { + if(n == mesh->self) { n->out_packets++; n->out_bytes += packet->len; // TODO: send to application @@ -585,13 +584,13 @@ void send_packet(node_t *n, vpn_packet_t *packet) { void broadcast_packet(const node_t *from, vpn_packet_t *packet) { // Always give ourself a copy of the packet. - if(from != myself) - send_packet(myself, packet); + if(from != mesh->self) + send_packet(mesh->self, packet); logger(DEBUG_TRAFFIC, LOG_INFO, "Broadcasting packet of %d bytes from %s (%s)", packet->len, from->name, from->hostname); - for list_each(connection_t, c, connection_list) + for list_each(connection_t, c, mesh->connections) if(c->status.active && c->status.mst && c != from->nexthop->connection) send_packet(c->node, packet); } @@ -601,8 +600,8 @@ static node_t *try_harder(const sockaddr_t *from, const vpn_packet_t *pkt) { bool hard = false; static time_t last_hard_try = 0; - for splay_each(edge_t, e, edge_weight_tree) { - if(!e->to->status.reachable || e->to == myself) + for splay_each(edge_t, e, mesh->edges) { + if(!e->to->status.reachable || e->to == mesh->self) continue; if(sockaddrcmp_noport(from, &e->address)) { @@ -662,7 +661,7 @@ void handle_incoming_vpn_data(void *data, int flags) { return; } - n->sock = ls - listen_socket; + n->sock = ls - mesh->listen_socket; receive_udppacket(n, &pkt); }