Fix "use of GNU empty initializer extension" warning.
[tinc] / src / net_packet.c
index 5709d49..c8f48d3 100644 (file)
@@ -30,6 +30,7 @@
 #include LZO1X_H
 #endif
 
+#include "address_cache.h"
 #include "cipher.h"
 #include "conf.h"
 #include "connection.h"
@@ -138,7 +139,8 @@ static void send_udp_probe_reply(node_t *n, vpn_packet_t *packet, length_t len)
 static void udp_probe_h(node_t *n, vpn_packet_t *packet, length_t len) {
        if(!DATA(packet)[0]) {
                logger(DEBUG_TRAFFIC, LOG_INFO, "Got UDP probe request %d from %s (%s)", packet->len, n->name, n->hostname);
-               return send_udp_probe_reply(n, packet, len);
+               send_udp_probe_reply(n, packet, len);
+               return;
        }
 
        if(DATA(packet)[0] == 2) {
@@ -153,7 +155,13 @@ static void udp_probe_h(node_t *n, vpn_packet_t *packet, length_t len) {
        /* It's a valid reply: now we know bidirectional communication
           is possible using the address and socket that the reply
           packet used. */
-       n->status.udp_confirmed = true;
+       if(!n->status.udp_confirmed) {
+               n->status.udp_confirmed = true;
+               fprintf(stderr, "Updating address cache...\n");
+               if (!n->address_cache)
+                       n->address_cache = open_address_cache(n);
+               reset_address_cache(n->address_cache, &n->address);
+       }
 
        // Reset the UDP ping timer.
        n->udp_ping_sent = now;
@@ -680,7 +688,8 @@ static void send_udppacket(node_t *n, vpn_packet_t *origpkt) {
        }
 
        if(n->status.sptps) {
-               return send_sptps_packet(n, origpkt);
+               send_sptps_packet(n, origpkt);
+               return;
        }
 
 #ifdef DISABLE_LEGACY
@@ -773,7 +782,7 @@ static void send_udppacket(node_t *n, vpn_packet_t *origpkt) {
                listen_socket[sock].priority = origpriority;
 
                switch(sa->sa.sa_family) {
-#if defined(IPPROTO_IP) && defined(IP_TOS)
+#if defined(IP_TOS)
 
                case AF_INET:
                        logger(DEBUG_TRAFFIC, LOG_DEBUG, "Setting IPv4 outgoing packet priority to %d", origpriority);
@@ -784,7 +793,7 @@ static void send_udppacket(node_t *n, vpn_packet_t *origpkt) {
 
                        break;
 #endif
-#if defined(IPPROTO_IPV6) & defined(IPV6_TCLASS)
+#if defined(IPV6_TCLASS)
 
                case AF_INET6:
                        logger(DEBUG_TRAFFIC, LOG_DEBUG, "Setting IPv6 outgoing packet priority to %d", origpriority);
@@ -832,12 +841,12 @@ bool send_sptps_data(node_t *to, node_t *from, int type, const void *data, size_
 
        if(type == SPTPS_HANDSHAKE || tcponly || (!direct && !relay_supported) || (type != PKT_PROBE && (len - SPTPS_DATAGRAM_OVERHEAD) > relay->minmtu)) {
                if(type != SPTPS_HANDSHAKE && (to->nexthop->connection->options >> 24) >= 7) {
-                       char buf[len + sizeof(to->id) + sizeof from->id];
+                       char buf[len + sizeof(to->id) + sizeof(from->id)];
                        char *buf_ptr = buf;
                        memcpy(buf_ptr, &to->id, sizeof(to->id));
-                       buf_ptr += sizeof to->id;
+                       buf_ptr += sizeof(to->id);
                        memcpy(buf_ptr, &from->id, sizeof(from->id));
-                       buf_ptr += sizeof from->id;
+                       buf_ptr += sizeof(from->id);
                        memcpy(buf_ptr, data, len);
                        logger(DEBUG_TRAFFIC, LOG_INFO, "Sending packet from %s (%s) to %s (%s) via %s (%s) (TCP)", from->name, from->hostname, to->name, to->hostname, to->nexthop->name, to->nexthop->hostname);
                        return send_sptps_tcppacket(to->nexthop->connection, buf, sizeof(buf));
@@ -860,7 +869,7 @@ bool send_sptps_data(node_t *to, node_t *from, int type, const void *data, size_
        size_t overhead = 0;
 
        if(relay_supported) {
-               overhead += sizeof(to->id) + sizeof from->id;
+               overhead += sizeof(to->id) + sizeof(from->id);
        }
 
        char buf[len + overhead];
@@ -869,16 +878,16 @@ bool send_sptps_data(node_t *to, node_t *from, int type, const void *data, size_
        if(relay_supported) {
                if(direct) {
                        /* Inform the recipient that this packet was sent directly. */
-                       node_id_t nullid = {};
+                       node_id_t nullid = {{0}};
                        memcpy(buf_ptr, &nullid, sizeof(nullid));
-                       buf_ptr += sizeof nullid;
+                       buf_ptr += sizeof(nullid);
                } else {
                        memcpy(buf_ptr, &to->id, sizeof(to->id));
-                       buf_ptr += sizeof to->id;
+                       buf_ptr += sizeof(to->id);
                }
 
                memcpy(buf_ptr, &from->id, sizeof(from->id));
-               buf_ptr += sizeof from->id;
+               buf_ptr += sizeof(from->id);
 
        }
 
@@ -929,7 +938,7 @@ bool receive_sptps_record(void *handle, uint8_t type, const void *data, uint16_t
                if(!from->status.validkey) {
                        from->status.validkey = true;
                        from->status.waitingforkey = false;
-                       logger(DEBUG_META, LOG_INFO, "SPTPS key exchange with %s (%s) succesful", from->name, from->hostname);
+                       logger(DEBUG_META, LOG_INFO, "SPTPS key exchange with %s (%s) successful", from->name, from->hostname);
                }
 
                return true;
@@ -1347,7 +1356,8 @@ static void try_tx_sptps(node_t *n, bool mtu) {
                        return;
                }
 
-               return try_tx(via, mtu);
+               try_tx(via, mtu);
+               return;
        }
 
        /* Otherwise, try to establish UDP connectivity. */
@@ -1569,7 +1579,7 @@ static node_t *try_harder(const sockaddr_t *from, const vpn_packet_t *pkt) {
 
 static void handle_incoming_vpn_packet(listen_socket_t *ls, vpn_packet_t *pkt, sockaddr_t *addr) {
        char *hostname;
-       node_id_t nullid = {};
+       node_id_t nullid = {{0}};
        node_t *from, *to;
        bool direct = false;