diff --git a/overlay_payload.c b/overlay_payload.c index a15b3bc8..a138652e 100644 --- a/overlay_payload.c +++ b/overlay_payload.c @@ -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"); diff --git a/overlay_queue.c b/overlay_queue.c index 6bb7c03d..1a87fc0a 100644 --- a/overlay_queue.c +++ b/overlay_queue.c @@ -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; diff --git a/serval.h b/serval.h index 291993f2..6ea16dba 100644 --- a/serval.h +++ b/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,