mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-02-20 09:26:37 +00:00
Add interface and sequence flags to packet format
This commit is contained in:
parent
8d5862d599
commit
f41830ebfb
@ -338,7 +338,7 @@ int overlay_send_probe(struct subscriber *peer, struct sockaddr_in addr, overlay
|
||||
frame->queue=OQ_MESH_MANAGEMENT;
|
||||
frame->destination_resolved=1;
|
||||
frame->recvaddr=addr;
|
||||
frame->flags=PACKET_UNICAST;
|
||||
frame->unicast=1;
|
||||
frame->interface=interface;
|
||||
frame->payload = ob_new();
|
||||
frame->source_full = 1;
|
||||
|
@ -23,8 +23,6 @@
|
||||
#include "overlay_address.h"
|
||||
#include "serval.h"
|
||||
|
||||
#define PACKET_UNICAST (1<<0)
|
||||
|
||||
struct overlay_frame {
|
||||
struct overlay_frame *prev;
|
||||
struct overlay_frame *next;
|
||||
@ -54,7 +52,7 @@ struct overlay_frame {
|
||||
int destination_resolved;
|
||||
struct sockaddr_in recvaddr;
|
||||
overlay_interface *interface;
|
||||
int flags;
|
||||
char unicast;
|
||||
|
||||
/* Actual payload */
|
||||
struct overlay_buffer *payload;
|
||||
|
@ -28,15 +28,37 @@ struct sockaddr_in loopback;
|
||||
|
||||
unsigned char magic_header[]={0x00, 0x01};
|
||||
|
||||
#define PACKET_UNICAST (1<<0)
|
||||
#define PACKET_INTERFACE (1<<1)
|
||||
#define PACKET_SEQ (1<<2)
|
||||
|
||||
int overlay_packet_init_header(struct decode_context *context, struct overlay_buffer *buff,
|
||||
struct subscriber *destination, int flags){
|
||||
struct subscriber *destination,
|
||||
char unicast, char interface, char seq){
|
||||
|
||||
if (ob_append_bytes(buff,magic_header,sizeof magic_header))
|
||||
return -1;
|
||||
if (overlay_address_append(context, buff, my_subscriber))
|
||||
return -1;
|
||||
context->sender = my_subscriber;
|
||||
ob_append_byte(buff,0);
|
||||
|
||||
int flags=0;
|
||||
|
||||
if (unicast)
|
||||
flags |= PACKET_UNICAST;
|
||||
if (interface)
|
||||
flags |= PACKET_INTERFACE;
|
||||
if (seq)
|
||||
flags |= PACKET_SEQ;
|
||||
|
||||
ob_append_byte(buff,flags);
|
||||
|
||||
if (flags & PACKET_INTERFACE)
|
||||
ob_append_byte(buff,interface);
|
||||
|
||||
if (flags & PACKET_SEQ)
|
||||
ob_append_byte(buff,seq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -205,9 +227,15 @@ int packetOkOverlay(struct overlay_interface *interface,unsigned char *packet, s
|
||||
WHY("Unable to parse sender");
|
||||
}
|
||||
|
||||
ob_get(b); // sequence number, not implemented yet
|
||||
int packet_flags = ob_get(b);
|
||||
|
||||
int sender_interface = 0;
|
||||
if (packet_flags & PACKET_INTERFACE)
|
||||
sender_interface = ob_get(b);
|
||||
|
||||
if (packet_flags & PACKET_SEQ)
|
||||
ob_get(b); // sequence number, not implemented yet
|
||||
|
||||
if (context.sender){
|
||||
|
||||
if (context.sender->reachable==REACHABLE_SELF){
|
||||
|
@ -248,18 +248,18 @@ int overlay_payload_enqueue(struct overlay_frame *p)
|
||||
}
|
||||
|
||||
static void
|
||||
overlay_init_packet(struct outgoing_packet *packet, struct subscriber *destination, int flags,
|
||||
overlay_init_packet(struct outgoing_packet *packet, struct subscriber *destination, int unicast,
|
||||
overlay_interface *interface, struct sockaddr_in addr, int tick){
|
||||
packet->interface = interface;
|
||||
packet->i = (interface - overlay_interfaces);
|
||||
packet->dest=addr;
|
||||
packet->buffer=ob_new();
|
||||
packet->add_advertisements=1;
|
||||
if (flags & PACKET_UNICAST)
|
||||
if (unicast)
|
||||
packet->unicast_subscriber = destination;
|
||||
ob_limitsize(packet->buffer, packet->interface->mtu);
|
||||
|
||||
overlay_packet_init_header(&packet->context, packet->buffer, destination, flags);
|
||||
overlay_packet_init_header(&packet->context, packet->buffer, destination, unicast, packet->i, 0);
|
||||
packet->header_length = ob_position(packet->buffer);
|
||||
if (tick){
|
||||
/* 1. Send announcement about ourselves, including one SID that we host if we host more than one SID
|
||||
@ -363,7 +363,7 @@ overlay_stuff_packet(struct outgoing_packet *packet, overlay_txqueue *queue, tim
|
||||
|
||||
if(r&REACHABLE_UNICAST){
|
||||
frame->recvaddr = frame->next_hop->address;
|
||||
frame->flags = PACKET_UNICAST;
|
||||
frame->unicast = 1;
|
||||
// ignore resend logic for unicast packets, where wifi gives better resilience
|
||||
frame->send_copies=1;
|
||||
}else
|
||||
@ -406,7 +406,7 @@ overlay_stuff_packet(struct outgoing_packet *packet, overlay_txqueue *queue, tim
|
||||
if (!packet->buffer){
|
||||
if (frame->source_full)
|
||||
my_subscriber->send_full=1;
|
||||
overlay_init_packet(packet, frame->next_hop, frame->flags, frame->interface, frame->recvaddr, 0);
|
||||
overlay_init_packet(packet, frame->next_hop, frame->unicast, frame->interface, frame->recvaddr, 0);
|
||||
}else{
|
||||
// is this packet going our way?
|
||||
if (frame->interface!=packet->interface || memcmp(&packet->dest, &frame->recvaddr, sizeof(packet->dest))!=0){
|
||||
|
3
serval.h
3
serval.h
@ -444,7 +444,8 @@ int overlay_add_selfannouncement(struct decode_context *context, int interface,s
|
||||
int overlay_frame_append_payload(struct decode_context *context, overlay_interface *interface,
|
||||
struct overlay_frame *p, struct overlay_buffer *b);
|
||||
int overlay_packet_init_header(struct decode_context *context, struct overlay_buffer *buff,
|
||||
struct subscriber *destination, int flags);
|
||||
struct subscriber *destination,
|
||||
char unicast, char interface, char seq);
|
||||
int overlay_frame_build_header(struct decode_context *context, struct overlay_buffer *buff,
|
||||
int queue, int type, int modifiers, int ttl,
|
||||
struct broadcast *broadcast, struct subscriber *next_hop,
|
||||
|
Loading…
x
Reference in New Issue
Block a user