Make LocalDiscovery work for SPTPS packets.

This commit is contained in:
Guus Sliepen 2013-11-21 22:13:14 +01:00
parent c1703ea917
commit 3d41e7d712
2 changed files with 10 additions and 9 deletions

View file

@ -143,16 +143,15 @@ static void send_mtu_probe_handler(void *data) {
memset(packet.data, 0, 14); memset(packet.data, 0, 14);
randomize(packet.data + 14, len - 14); randomize(packet.data + 14, len - 14);
packet.len = len; packet.len = len;
if(i >= 4 && n->mtuprobes <= 10)
packet.priority = -1;
else
packet.priority = 0; packet.priority = 0;
n->status.broadcast = i >= 4 && n->mtuprobes <= 10 && n->prevedge;
logger(DEBUG_TRAFFIC, LOG_INFO, "Sending MTU probe length %d to %s (%s)", len, n->name, n->hostname); logger(DEBUG_TRAFFIC, LOG_INFO, "Sending MTU probe length %d to %s (%s)", len, n->name, n->hostname);
send_udppacket(n, &packet); send_udppacket(n, &packet);
} }
n->status.broadcast = false;
n->probe_counter = 0; n->probe_counter = 0;
gettimeofday(&n->probe_time, NULL); gettimeofday(&n->probe_time, NULL);
@ -734,9 +733,7 @@ static void send_udppacket(node_t *n, vpn_packet_t *origpkt) {
const sockaddr_t *sa; const sockaddr_t *sa;
int sock; int sock;
/* Overloaded use of priority field: -1 means local broadcast */ if(n->status.broadcast)
if(origpriority == -1 && n->prevedge)
choose_broadcast_address(n, &sa, &sock); choose_broadcast_address(n, &sa, &sock);
else else
choose_udp_address(n, &sa, &sock); choose_udp_address(n, &sa, &sock);
@ -788,6 +785,9 @@ bool send_sptps_data(void *handle, uint8_t type, const char *data, size_t len) {
const sockaddr_t *sa; const sockaddr_t *sa;
int sock; int sock;
if(to->status.broadcast)
choose_broadcast_address(to, &sa, &sock);
else
choose_udp_address(to, &sa, &sock); 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(listen_socket[sock].udp.fd, data, len, 0, &sa->sa, SALEN(sa->sa)) < 0 && !sockwouldblock(sockerrno)) {

View file

@ -37,7 +37,8 @@ typedef struct node_status_t {
unsigned int indirect:1; /* 1 if this node is not directly reachable by us */ unsigned int indirect:1; /* 1 if this node is not directly reachable by us */
unsigned int sptps:1; /* 1 if this node supports SPTPS */ unsigned int sptps:1; /* 1 if this node supports SPTPS */
unsigned int udp_confirmed:1; /* 1 if the address is one that we received UDP traffic on */ unsigned int udp_confirmed:1; /* 1 if the address is one that we received UDP traffic on */
unsigned int unused:24; unsigned int broadcast:1; /* 1 if the next UDP packet should be broadcast to the local network */
unsigned int unused:23;
} node_status_t; } node_status_t;
typedef struct node_t { typedef struct node_t {