X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet_packet.c;h=d9a73f6f36c06debb1a9842c2da2f625a8469bed;hb=2c424175639d62ea806b79173dfe6f554cf3ceb9;hp=5631a939716cdfb064aa724c821dfab256cf78d3;hpb=11bf251190cb84a9d127bd8b940279413c5313b4;p=meshlink diff --git a/src/net_packet.c b/src/net_packet.c index 5631a939..d9a73f6f 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -23,13 +23,12 @@ #include #endif -#include "cipher.h" #include "conf.h" #include "connection.h" #include "crypto.h" -#include "digest.h" #include "graph.h" #include "logger.h" +#include "meshlink_internal.h" #include "net.h" #include "netutl.h" #include "protocol.h" @@ -42,8 +41,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 +108,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) { @@ -128,6 +125,7 @@ static void send_mtu_probe_handler(void *data) { len = 64; vpn_packet_t packet; + packet.probe = true; memset(packet.data, 0, 14); randomize(packet.data + 14, len - 14); packet.len = len; @@ -163,7 +161,7 @@ void send_mtu_probe(node_t *n) { send_mtu_probe_handler(n); } -static void mtu_probe_h(node_t *n, vpn_packet_t *packet, length_t len) { +static void mtu_probe_h(node_t *n, vpn_packet_t *packet, uint16_t len) { logger(DEBUG_TRAFFIC, LOG_INFO, "Got MTU probe length %d from %s (%s)", packet->len, n->name, n->hostname); if(!packet->data[0]) { @@ -230,7 +228,7 @@ static void mtu_probe_h(node_t *n, vpn_packet_t *packet, length_t len) { } } -static length_t compress_packet(uint8_t *dest, const uint8_t *source, length_t len, int level) { +static uint16_t compress_packet(uint8_t *dest, const uint8_t *source, uint16_t len, int level) { if(level == 0) { memcpy(dest, source, len); return len; @@ -251,7 +249,7 @@ static length_t compress_packet(uint8_t *dest, const uint8_t *source, length_t l return -1; } -static length_t uncompress_packet(uint8_t *dest, const uint8_t *source, length_t len, int level) { +static uint16_t uncompress_packet(uint8_t *dest, const uint8_t *source, uint16_t len, int level) { if(level == 0) { memcpy(dest, source, len); return len; @@ -387,13 +385,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 +416,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 +460,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 +483,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; @@ -535,7 +533,7 @@ bool receive_sptps_record(void *handle, uint8_t type, const char *data, uint16_t } if(type & PKT_COMPRESSED) { - length_t ulen = uncompress_packet(inpkt.data, (const uint8_t *)data, len, from->incompression); + uint16_t ulen = uncompress_packet(inpkt.data, (const uint8_t *)data, len, from->incompression); if(ulen < 0) { return false; } else { @@ -558,7 +556,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 +583,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 +599,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)) { @@ -652,7 +650,7 @@ void handle_incoming_vpn_data(void *data, int flags) { n = try_harder(&from, &pkt); if(n) update_node_udp(n, &from); - else if(debug_level >= DEBUG_PROTOCOL) { + else if(mesh->debug_level >= DEBUG_PROTOCOL) { hostname = sockaddr2hostname(&from); logger(DEBUG_PROTOCOL, LOG_WARNING, "Received UDP packet from unknown source %s", hostname); free(hostname); @@ -662,7 +660,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); }