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->destination_resolved=1;
frame->recvaddr=addr;
frame->flags=PACKET_UNICAST;
frame->unicast=1;
frame->interface=interface;
frame->payload = ob_new();
frame->source_full = 1;

View File

@ -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;

View File

@ -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){

View File

@ -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){

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,
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,