Add interface and sequence flags to packet format

This commit is contained in:
Jeremy Lakeman 2012-12-14 17:00:54 +10:30
parent 8d5862d599
commit f41830ebfb
5 changed files with 40 additions and 13 deletions

View File

@ -338,7 +338,7 @@ int overlay_send_probe(struct subscriber *peer, struct sockaddr_in addr, overlay
frame->queue=OQ_MESH_MANAGEMENT; frame->queue=OQ_MESH_MANAGEMENT;
frame->destination_resolved=1; frame->destination_resolved=1;
frame->recvaddr=addr; frame->recvaddr=addr;
frame->flags=PACKET_UNICAST; frame->unicast=1;
frame->interface=interface; frame->interface=interface;
frame->payload = ob_new(); frame->payload = ob_new();
frame->source_full = 1; frame->source_full = 1;

View File

@ -23,8 +23,6 @@
#include "overlay_address.h" #include "overlay_address.h"
#include "serval.h" #include "serval.h"
#define PACKET_UNICAST (1<<0)
struct overlay_frame { struct overlay_frame {
struct overlay_frame *prev; struct overlay_frame *prev;
struct overlay_frame *next; struct overlay_frame *next;
@ -54,7 +52,7 @@ struct overlay_frame {
int destination_resolved; int destination_resolved;
struct sockaddr_in recvaddr; struct sockaddr_in recvaddr;
overlay_interface *interface; overlay_interface *interface;
int flags; char unicast;
/* Actual payload */ /* Actual payload */
struct overlay_buffer *payload; struct overlay_buffer *payload;

View File

@ -28,15 +28,37 @@ struct sockaddr_in loopback;
unsigned char magic_header[]={0x00, 0x01}; 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, 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)) if (ob_append_bytes(buff,magic_header,sizeof magic_header))
return -1; return -1;
if (overlay_address_append(context, buff, my_subscriber)) if (overlay_address_append(context, buff, my_subscriber))
return -1; return -1;
context->sender = my_subscriber; 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); 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; return 0;
} }
@ -205,9 +227,15 @@ int packetOkOverlay(struct overlay_interface *interface,unsigned char *packet, s
WHY("Unable to parse sender"); WHY("Unable to parse sender");
} }
ob_get(b); // sequence number, not implemented yet
int packet_flags = ob_get(b); 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){
if (context.sender->reachable==REACHABLE_SELF){ if (context.sender->reachable==REACHABLE_SELF){

View File

@ -248,18 +248,18 @@ int overlay_payload_enqueue(struct overlay_frame *p)
} }
static void 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){ overlay_interface *interface, struct sockaddr_in addr, int tick){
packet->interface = interface; packet->interface = interface;
packet->i = (interface - overlay_interfaces); packet->i = (interface - overlay_interfaces);
packet->dest=addr; packet->dest=addr;
packet->buffer=ob_new(); packet->buffer=ob_new();
packet->add_advertisements=1; packet->add_advertisements=1;
if (flags & PACKET_UNICAST) if (unicast)
packet->unicast_subscriber = destination; packet->unicast_subscriber = destination;
ob_limitsize(packet->buffer, packet->interface->mtu); 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); packet->header_length = ob_position(packet->buffer);
if (tick){ if (tick){
/* 1. Send announcement about ourselves, including one SID that we host if we host more than one SID /* 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){ if(r&REACHABLE_UNICAST){
frame->recvaddr = frame->next_hop->address; frame->recvaddr = frame->next_hop->address;
frame->flags = PACKET_UNICAST; frame->unicast = 1;
// ignore resend logic for unicast packets, where wifi gives better resilience // ignore resend logic for unicast packets, where wifi gives better resilience
frame->send_copies=1; frame->send_copies=1;
}else }else
@ -406,7 +406,7 @@ overlay_stuff_packet(struct outgoing_packet *packet, overlay_txqueue *queue, tim
if (!packet->buffer){ if (!packet->buffer){
if (frame->source_full) if (frame->source_full)
my_subscriber->send_full=1; 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{ }else{
// is this packet going our way? // is this packet going our way?
if (frame->interface!=packet->interface || memcmp(&packet->dest, &frame->recvaddr, sizeof(packet->dest))!=0){ if (frame->interface!=packet->interface || memcmp(&packet->dest, &frame->recvaddr, sizeof(packet->dest))!=0){

View File

@ -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, 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 overlay_packet_init_header(struct decode_context *context, struct overlay_buffer *buff, 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 overlay_frame_build_header(struct decode_context *context, struct overlay_buffer *buff,
int queue, int type, int modifiers, int ttl, int queue, int type, int modifiers, int ttl,
struct broadcast *broadcast, struct subscriber *next_hop, struct broadcast *broadcast, struct subscriber *next_hop,