mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-02-21 09:51:50 +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))
|
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");
|
||||||
|
@ -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;
|
||||||
|
2
serval.h
2
serval.h
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user