Only send one packet per alarm with single encapsulation

This commit is contained in:
Jeremy Lakeman 2013-07-15 15:29:14 +09:30
parent aa87168d7d
commit a73814571d
3 changed files with 13 additions and 54 deletions

View File

@ -110,9 +110,11 @@ int overlay_frame_append_payload(struct decode_context *context, overlay_interfa
p->destination, p->source)) p->destination, p->source))
goto cleanup; goto cleanup;
if (ob_append_ui16(b, ob_position(p->payload))) if (interface->encapsulation == ENCAP_OVERLAY){
if (ob_append_ui16(b, ob_position(p->payload)))
goto cleanup; goto cleanup;
}
if (ob_append_bytes(b, ob_ptr(p->payload), ob_position(p->payload))) { if (ob_append_bytes(b, ob_ptr(p->payload), ob_position(p->payload))) {
WHY("could not append payload"); WHY("could not append payload");
goto cleanup; goto cleanup;
@ -125,35 +127,6 @@ cleanup:
return -1; return -1;
} }
int single_packet_encapsulation(struct overlay_buffer *b, struct overlay_frame *frame){
overlay_interface *interface=frame->interface;
int interface_number = interface - overlay_interfaces;
struct decode_context context;
bzero(&context, sizeof(struct decode_context));
if (frame->source_full)
my_subscriber->send_full=1;
int seq = interface->sequence_number++;
if (overlay_packet_init_header(frame->packet_version, ENCAP_SINGLE, &context, b, NULL, 0, interface_number, seq))
return WHY("Failed to init header");
struct broadcast *broadcast=NULL;
if ((!frame->destination) && !is_all_matching(frame->broadcast_id.id,BROADCAST_LEN,0))
broadcast = &frame->broadcast_id;
if (overlay_frame_build_header(frame->packet_version, &context, b,
frame->queue, frame->type,
frame->modifiers, frame->ttl, frame->mdp_sequence & 0xFF,
broadcast, frame->next_hop,
frame->destination, frame->source))
return WHY("Failed to build header");
if (ob_append_buffer(b, frame->payload))
return WHY("Failed to append payload");
return 0;
}
int op_free(struct overlay_frame *p) int op_free(struct overlay_frame *p)
{ {
if (!p) return WHY("Asked to free NULL"); if (!p) return WHY("Asked to free NULL");

View File

@ -276,13 +276,14 @@ overlay_init_packet(struct outgoing_packet *packet, struct subscriber *destinati
packet->buffer=ob_new(); packet->buffer=ob_new();
packet->seq=-1; packet->seq=-1;
packet->packet_version = packet_version; packet->packet_version = packet_version;
if (unicast) if (unicast)
packet->unicast_subscriber = destination; packet->unicast_subscriber = destination;
else else
packet->seq = interface->sequence_number = (interface->sequence_number + 1)&0xFFFF; packet->seq = interface->sequence_number = (interface->sequence_number + 1)&0xFFFF;
ob_limitsize(packet->buffer, packet->interface->mtu); ob_limitsize(packet->buffer, packet->interface->mtu);
overlay_packet_init_header(packet_version, ENCAP_OVERLAY, &packet->context, packet->buffer, overlay_packet_init_header(packet_version, interface->encapsulation, &packet->context, packet->buffer,
destination, unicast, packet->i, packet->seq); destination, unicast, packet->i, packet->seq);
packet->header_length = ob_position(packet->buffer); packet->header_length = ob_position(packet->buffer);
if (config.debug.overlayframes) if (config.debug.overlayframes)
@ -496,12 +497,12 @@ overlay_stuff_packet(struct outgoing_packet *packet, overlay_txqueue *queue, tim
if (frame->source_full) if (frame->source_full)
my_subscriber->send_full=1; my_subscriber->send_full=1;
if (frame->interface->encapsulation!=ENCAP_SINGLE) overlay_init_packet(packet, frame->next_hop, frame->unicast, frame->packet_version, frame->interface, frame->recvaddr);
overlay_init_packet(packet, frame->next_hop, frame->unicast, frame->packet_version, frame->interface, frame->recvaddr);
}else{ }else{
// is this packet going our way? // is this packet going our way?
if (frame->interface!=packet->interface || if (frame->interface!=packet->interface ||
frame->interface->encapsulation==ENCAP_SINGLE ||
frame->packet_version!=packet->packet_version || frame->packet_version!=packet->packet_version ||
memcmp(&packet->dest, &frame->recvaddr, sizeof(packet->dest))!=0){ memcmp(&packet->dest, &frame->recvaddr, sizeof(packet->dest))!=0){
goto skip; goto skip;
@ -530,25 +531,10 @@ overlay_stuff_packet(struct outgoing_packet *packet, overlay_txqueue *queue, tim
DEBUGF("Retransmitting frame %p mdp seq %d, from packet seq %d in seq %d", frame, frame->mdp_sequence, frame->interface_sent_sequence[packet->i], packet->seq); DEBUGF("Retransmitting frame %p mdp seq %d, from packet seq %d in seq %d", frame, frame->mdp_sequence, frame->interface_sent_sequence[packet->i], packet->seq);
} }
if (frame->interface->encapsulation==ENCAP_SINGLE){ if (overlay_frame_append_payload(&packet->context, packet->interface, frame, packet->buffer)){
// send MDP packets without aggregating them together // payload was not queued, delay the next attempt slightly
struct overlay_buffer *buff = ob_new(); frame->dont_send_until = now + 5;
goto skip;
int ret=single_packet_encapsulation(buff, frame);
if (!ret){
ret=overlay_broadcast_ensemble(frame->interface, &frame->recvaddr, ob_ptr(buff), ob_position(buff));
}
ob_free(buff);
if (ret)
goto skip;
}else{
if (overlay_frame_append_payload(&packet->context, packet->interface, frame, packet->buffer)){
// payload was not queued, delay the next attempt slightly
frame->dont_send_until = now + 5;
goto skip;
}
} }
frame->interface_sent_sequence[packet->i] = packet->seq; frame->interface_sent_sequence[packet->i] = packet->seq;

View File

@ -403,6 +403,7 @@ typedef struct overlay_interface {
char prefer_unicast; char prefer_unicast;
// can we use this interface for routes to addresses in other subnets? // can we use this interface for routes to addresses in other subnets?
int default_route; int default_route;
char debug;
/* Number of milli-seconds per tick for this interface, which is basically related to the /* Number of milli-seconds per tick for this interface, which is basically related to the
the typical TX range divided by the maximum expected speed of nodes in the network. the typical TX range divided by the maximum expected speed of nodes in the network.
@ -513,7 +514,6 @@ time_ms_t overlay_time_until_next_tick();
int overlay_frame_append_payload(struct decode_context *context, overlay_interface *interface, int overlay_frame_append_payload(struct decode_context *context, overlay_interface *interface,
struct overlay_frame *p, struct overlay_buffer *b); struct overlay_frame *p, struct overlay_buffer *b);
int single_packet_encapsulation(struct overlay_buffer *b, struct overlay_frame *frame);
int overlay_packet_init_header(int packet_version, int encapsulation, int overlay_packet_init_header(int packet_version, int encapsulation,
struct decode_context *context, struct overlay_buffer *buff, struct decode_context *context, struct overlay_buffer *buff,
struct subscriber *destination, struct subscriber *destination,