From 577fbb34db54580dc3e89bfc89d218d0ec194e40 Mon Sep 17 00:00:00 2001 From: Jeremy Lakeman Date: Mon, 20 Nov 2017 10:39:32 +1030 Subject: [PATCH] Don't attempt to calculate the next alarm if the interface just went down --- overlay_interface.c | 17 +++++++++++++---- overlay_queue.c | 7 ++----- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/overlay_interface.c b/overlay_interface.c index a6da3748..5d595ae0 100644 --- a/overlay_interface.c +++ b/overlay_interface.c @@ -432,6 +432,8 @@ static int overlay_interface_init_any(int port) static void calc_next_tick(struct overlay_interface *interface) { int interval; + if (interface->state!=INTERFACE_STATE_UP) + return; if (link_interface_has_neighbours(interface)) interval = interface->destination->ifconfig.tick_ms; else @@ -828,6 +830,9 @@ static void overlay_interface_poll(struct sched_ent *alarm) && now >= interface->destination->last_tx+interface->destination->ifconfig.tick_ms) overlay_send_tick_packet(interface->destination); + }else{ + // If we can't bind the interface now, make sure we don't keep trying to send a tick packet. + interface->destination->last_tx = now; } calc_next_tick(interface); } @@ -964,10 +969,9 @@ int overlay_broadcast_ensemble(struct network_destination *destination, struct o alloca_tohex(bytes, len>64?64:len) ); - interface->tx_count++; - switch(interface->ifconfig.socket_type){ case SOCK_STREAM: + interface->tx_count++; return radio_link_queue_packet(interface, buffer); case SOCK_FILE: @@ -1016,19 +1020,23 @@ int overlay_broadcast_ensemble(struct network_destination *destination, struct o return WHY_perror("write"); if (nwrite != sizeof(packet)) return WHYF("only wrote %d of %d bytes", (int)nwrite, (int)sizeof(packet)); + interface->tx_count++; return 0; } case SOCK_EXT: { mdp_send_external_packet(interface, &destination->address, bytes, (size_t)len); ob_free(buffer); + interface->tx_count++; return 0; } case SOCK_DGRAM: { // check that we have bound the interface - if (overlay_bind_interface(interface)==-1) + if (overlay_bind_interface(interface)==-1){ + ob_free(buffer); return -1; + } set_nonblock(interface->alarm.poll.fd); if (destination->address.addr.sa_family == AF_UNIX @@ -1048,7 +1056,7 @@ int overlay_broadcast_ensemble(struct network_destination *destination, struct o alloca_socket_address(&destination->address), interface->name ); - + // if we had any error while sending broadcast packets, // it could be because the interface is coming down // or there might be some socket error that we can't fix. @@ -1063,6 +1071,7 @@ int overlay_broadcast_ensemble(struct network_destination *destination, struct o } } ob_free(buffer); + interface->tx_count++; return 0; } diff --git a/overlay_queue.c b/overlay_queue.c index 25911f11..390d1604 100644 --- a/overlay_queue.c +++ b/overlay_queue.c @@ -540,11 +540,10 @@ overlay_stuff_packet(struct outgoing_packet *packet, overlay_txqueue *queue, tim } // fill a packet from our outgoing queues and send it -static int +static void overlay_fill_send_packet(struct outgoing_packet *packet, time_ms_t now, strbuf debug) { IN(); int i; - int ret=0; // while we're looking at queues, work out when to schedule another packet unschedule(&next_packet); @@ -562,13 +561,11 @@ overlay_fill_send_packet(struct outgoing_packet *packet, time_ms_t now, strbuf d strbuf_sprintf(debug, "]"); _DEBUGF("%s", strbuf_str(debug)); } - + overlay_broadcast_ensemble(packet->destination, packet->buffer); - ret=1; } if (packet->destination) release_destination_ref(packet->destination); - RETURN(ret); OUT(); }