Don't lookup subscribers twice for route announcements

This commit is contained in:
Jeremy Lakeman 2012-11-26 14:42:26 +10:30
parent e0878644fe
commit 5a5853f38a
3 changed files with 9 additions and 23 deletions

View File

@ -208,7 +208,7 @@ int overlay_route_saw_advertisements(int i, struct overlay_frame *f, struct deco
} }
/* File it */ /* File it */
overlay_route_record_link(now, subscriber->sid, f->source->sid, overlay_route_record_link(now, subscriber, f->source,
i, i,
/* time range that this advertisement covers. /* time range that this advertisement covers.
XXX - Make it up for now. */ XXX - Make it up for now. */

View File

@ -193,16 +193,6 @@ overlay_node *get_node(struct subscriber *subscriber, int create){
return subscriber->node; return subscriber->node;
} }
overlay_node *overlay_route_find_node(const unsigned char *sid, int prefixLen, int createP)
{
if (*sid==0){
INFOF("Sid %s/%d cannot ever become a node!", alloca_tohex_sid(sid), prefixLen);
return NULL;
}
return get_node(find_subscriber(sid, prefixLen, createP), createP);
}
int overlay_route_ack_selfannounce(struct overlay_frame *f, int overlay_route_ack_selfannounce(struct overlay_frame *f,
unsigned int s1,unsigned int s2, unsigned int s1,unsigned int s2,
int interface, int interface,
@ -723,15 +713,15 @@ int overlay_route_saw_selfannounce_ack(struct overlay_frame *f,long long now)
/* if to and via are the same, then this is evidence that we can get to the /* if to and via are the same, then this is evidence that we can get to the
node directly. */ node directly. */
int overlay_route_record_link(time_ms_t now, unsigned char *to, int overlay_route_record_link(time_ms_t now, struct subscriber *to,
unsigned char *via,int sender_interface, struct subscriber *via,int sender_interface,
unsigned int s1,unsigned int s2,int score, unsigned int s1,unsigned int s2,int score,
int gateways_en_route) int gateways_en_route)
{ {
IN(); IN();
if (debug & DEBUG_OVERLAYROUTING) if (debug & DEBUG_OVERLAYROUTING)
DEBUGF("to=%s, via=%s, sender_interface=%d, s1=%d, s2=%d score=%d gateways_en_route=%d", DEBUGF("to=%s, via=%s, sender_interface=%d, s1=%d, s2=%d score=%d gateways_en_route=%d",
alloca_tohex_sid(to), alloca_tohex_sid(via), sender_interface, s1, s2, alloca_tohex_sid(to->sid), alloca_tohex_sid(via->sid), sender_interface, s1, s2,
score, gateways_en_route score, gateways_en_route
); );
@ -741,14 +731,10 @@ int overlay_route_record_link(time_ms_t now, unsigned char *to,
RETURN(0); RETURN(0);
} }
overlay_node *n = overlay_route_find_node(to, SID_SIZE, 1 /* create node if missing */); overlay_node *n = get_node(to,1);
if (!n) if (!n)
RETURN(WHY("Could not create entry for node")); RETURN(WHY("Could not create entry for node"));
struct subscriber *sender = find_subscriber(via, SID_SIZE, 1);
if (!sender)
RETURN(WHY("Could not create subscriber"));
int slot = -1; int slot = -1;
int i; int i;
for (i = 0; i < OVERLAY_MAX_OBSERVATIONS; ++i) { for (i = 0; i < OVERLAY_MAX_OBSERVATIONS; ++i) {
@ -757,7 +743,7 @@ int overlay_route_record_link(time_ms_t now, unsigned char *to,
slot = i; slot = i;
/* If the intermediate host ("via") address and interface numbers match, then overwrite old /* If the intermediate host ("via") address and interface numbers match, then overwrite old
observation with new one */ observation with new one */
if (n->observations[i].sender == sender) { if (n->observations[i].sender == via) {
slot = i; slot = i;
break; break;
} }
@ -783,7 +769,7 @@ int overlay_route_record_link(time_ms_t now, unsigned char *to,
n->observations[slot].observed_score=0; n->observations[slot].observed_score=0;
n->observations[slot].gateways_en_route=gateways_en_route; n->observations[slot].gateways_en_route=gateways_en_route;
n->observations[slot].rx_time=now; n->observations[slot].rx_time=now;
n->observations[slot].sender = sender; n->observations[slot].sender = via;
n->observations[slot].observed_score=score; n->observations[slot].observed_score=score;
n->observations[slot].interface=sender_interface; n->observations[slot].interface=sender_interface;

View File

@ -495,8 +495,8 @@ overlay_node *overlay_route_find_node(const unsigned char *sid,int prefixLen,int
int overlayServerMode(); int overlayServerMode();
int overlay_payload_enqueue(struct overlay_frame *p); int overlay_payload_enqueue(struct overlay_frame *p);
int overlay_route_record_link( time_ms_t now,unsigned char *to, int overlay_route_record_link( time_ms_t now, struct subscriber *to,
unsigned char *via,int sender_interface, struct subscriber *via,int sender_interface,
unsigned int s1,unsigned int s2,int score,int gateways_en_route); unsigned int s1,unsigned int s2,int score,int gateways_en_route);
int overlay_route_dump(); int overlay_route_dump();
int overlay_route_add_advertisements(struct decode_context *context, overlay_interface *interface, struct overlay_buffer *e); int overlay_route_add_advertisements(struct decode_context *context, overlay_interface *interface, struct overlay_buffer *e);