mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-02-20 09:26:37 +00:00
Only send one packet per alarm with single encapsulation
This commit is contained in:
parent
aa87168d7d
commit
a73814571d
@ -110,9 +110,11 @@ int overlay_frame_append_payload(struct decode_context *context, overlay_interfa
|
||||
p->destination, p->source))
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
if (ob_append_bytes(b, ob_ptr(p->payload), ob_position(p->payload))) {
|
||||
WHY("could not append payload");
|
||||
goto cleanup;
|
||||
@ -125,35 +127,6 @@ cleanup:
|
||||
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)
|
||||
{
|
||||
if (!p) return WHY("Asked to free NULL");
|
||||
|
@ -276,13 +276,14 @@ overlay_init_packet(struct outgoing_packet *packet, struct subscriber *destinati
|
||||
packet->buffer=ob_new();
|
||||
packet->seq=-1;
|
||||
packet->packet_version = packet_version;
|
||||
|
||||
if (unicast)
|
||||
packet->unicast_subscriber = destination;
|
||||
else
|
||||
packet->seq = interface->sequence_number = (interface->sequence_number + 1)&0xFFFF;
|
||||
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);
|
||||
packet->header_length = ob_position(packet->buffer);
|
||||
if (config.debug.overlayframes)
|
||||
@ -496,12 +497,12 @@ overlay_stuff_packet(struct outgoing_packet *packet, overlay_txqueue *queue, tim
|
||||
if (frame->source_full)
|
||||
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{
|
||||
// is this packet going our way?
|
||||
if (frame->interface!=packet->interface ||
|
||||
frame->interface->encapsulation==ENCAP_SINGLE ||
|
||||
frame->packet_version!=packet->packet_version ||
|
||||
memcmp(&packet->dest, &frame->recvaddr, sizeof(packet->dest))!=0){
|
||||
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);
|
||||
}
|
||||
|
||||
if (frame->interface->encapsulation==ENCAP_SINGLE){
|
||||
// send MDP packets without aggregating them together
|
||||
struct overlay_buffer *buff = ob_new();
|
||||
|
||||
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;
|
||||
}
|
||||
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;
|
||||
|
2
serval.h
2
serval.h
@ -403,6 +403,7 @@ typedef struct overlay_interface {
|
||||
char prefer_unicast;
|
||||
// can we use this interface for routes to addresses in other subnets?
|
||||
int default_route;
|
||||
char debug;
|
||||
|
||||
/* 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.
|
||||
@ -513,7 +514,6 @@ time_ms_t overlay_time_until_next_tick();
|
||||
|
||||
int overlay_frame_append_payload(struct decode_context *context, overlay_interface *interface,
|
||||
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,
|
||||
struct decode_context *context, struct overlay_buffer *buff,
|
||||
struct subscriber *destination,
|
||||
|
Loading…
x
Reference in New Issue
Block a user