Refactor dna lookup requests to new interface

This commit is contained in:
Jeremy Lakeman 2014-01-31 10:38:52 +10:30
parent 20e2b2fdd7
commit 63db7b4513
5 changed files with 34 additions and 27 deletions

View File

@ -132,7 +132,8 @@ DECLARE_SCHED_ENT(reply_timeout, sched_timeout);
static char request_buffer[SID_STRLEN + DID_MAXSIZE + 4]; static char request_buffer[SID_STRLEN + DID_MAXSIZE + 4];
static char *request_bufptr = NULL; static char *request_bufptr = NULL;
static char *request_bufend = NULL; static char *request_bufend = NULL;
static overlay_mdp_data_frame request_mdp_data; static struct subscriber *request_source = NULL;
static mdp_port_t request_port = 0;
static char request_did[DID_MAXSIZE + 1]; static char request_did[DID_MAXSIZE + 1];
static int awaiting_reply = 0; static int awaiting_reply = 0;
@ -466,7 +467,7 @@ void handle_reply_line(const char *bufp, size_t len)
else { else {
if (config.debug.dnahelper) if (config.debug.dnahelper)
DEBUGF("DNAHELPER reply %s", alloca_toprint(-1, bufp, len)); DEBUGF("DNAHELPER reply %s", alloca_toprint(-1, bufp, len));
overlay_mdp_dnalookup_reply(&request_mdp_data.src, &my_subscriber->sid, uri, did, name); overlay_mdp_dnalookup_reply(request_source, request_port, &my_subscriber->sid, uri, did, name);
} }
} }
} else { } else {
@ -593,10 +594,10 @@ static void reply_timeout(struct sched_ent *alarm)
} }
int int
dna_helper_enqueue(overlay_mdp_frame *mdp, const char *did, const sid_t *requestorSidp) dna_helper_enqueue(struct subscriber *source, mdp_port_t source_port, const char *did)
{ {
if (config.debug.dnahelper) if (config.debug.dnahelper)
DEBUGF("DNAHELPER request did=%s sid=%s", did, alloca_tohex_sid_t(*requestorSidp)); DEBUGF("DNAHELPER request did=%s sid=%s", did, alloca_tohex_sid_t(source->sid));
if (dna_helper_pid == 0) if (dna_helper_pid == 0)
return 0; return 0;
// Only try to restart a DNA helper process if the previous one is well and truly gone. // Only try to restart a DNA helper process if the previous one is well and truly gone.
@ -624,7 +625,7 @@ dna_helper_enqueue(overlay_mdp_frame *mdp, const char *did, const sid_t *request
} }
char buffer[sizeof request_buffer]; char buffer[sizeof request_buffer];
strbuf b = strbuf_local(request_bufptr == request_buffer ? buffer : request_buffer, sizeof buffer); strbuf b = strbuf_local(request_bufptr == request_buffer ? buffer : request_buffer, sizeof buffer);
strbuf_tohex(b, SID_STRLEN, requestorSidp->binary); strbuf_tohex(b, SID_STRLEN, source->sid.binary);
strbuf_putc(b, '|'); strbuf_putc(b, '|');
strbuf_puts(b, did); strbuf_puts(b, did);
strbuf_putc(b, '|'); strbuf_putc(b, '|');
@ -640,7 +641,8 @@ dna_helper_enqueue(overlay_mdp_frame *mdp, const char *did, const sid_t *request
} }
request_bufptr = request_buffer; request_bufptr = request_buffer;
request_bufend = request_buffer + strbuf_len(b); request_bufend = request_buffer + strbuf_len(b);
request_mdp_data = mdp->out; request_source = source;
request_port = source_port;
strncpy(request_did, did, sizeof request_did); strncpy(request_did, did, sizeof request_did);
request_did[sizeof request_did - 1] = '\0'; request_did[sizeof request_did - 1] = '\0';
} }

View File

@ -464,17 +464,17 @@ static int monitor_lookup_match(const struct cli_parsed *parsed, struct cli_cont
if (!my_subscriber) if (!my_subscriber)
return monitor_write_error(c,"I don't know who I am"); return monitor_write_error(c,"I don't know who I am");
struct sockaddr_mdp addr={ mdp_port_t dest_port = atoi(parsed->args[3]);
.port = atoi(parsed->args[3]), sid_t dest;
}; if (str_to_sid_t(&dest, sid) == -1)
if (str_to_sid_t(&addr.sid, sid) == -1)
return monitor_write_error(c,"Invalid SID"); return monitor_write_error(c,"Invalid SID");
struct subscriber *destination = find_subscriber(dest.binary, sizeof(dest), 1);
char uri[256]; char uri[256];
snprintf(uri, sizeof(uri), "sid://%s/external/%s", alloca_tohex_sid_t(my_subscriber->sid), ext); snprintf(uri, sizeof(uri), "sid://%s/external/%s", alloca_tohex_sid_t(my_subscriber->sid), ext);
DEBUGF("Sending response to %s for %s", sid, uri); DEBUGF("Sending response to %s for %s", sid, uri);
overlay_mdp_dnalookup_reply(&addr, &my_subscriber->sid, uri, ext, name); overlay_mdp_dnalookup_reply(destination, dest_port, &my_subscriber->sid, uri, ext, name);
return 0; return 0;
} }

View File

@ -620,7 +620,8 @@ static int overlay_saw_mdp_frame(
OUT(); OUT();
} }
int overlay_mdp_dnalookup_reply(const sockaddr_mdp *dstaddr, const sid_t *resolved_sidp, const char *uri, const char *did, const char *name) int overlay_mdp_dnalookup_reply(struct subscriber *dest, mdp_port_t dest_port,
const sid_t *resolved_sidp, const char *uri, const char *did, const char *name)
{ {
if (config.debug.mdprequests) if (config.debug.mdprequests)
DEBUGF("MDP_PORT_DNALOOKUP resolved_sid=%s uri=%s did=%s name=%s", DEBUGF("MDP_PORT_DNALOOKUP resolved_sid=%s uri=%s did=%s name=%s",
@ -635,7 +636,9 @@ int overlay_mdp_dnalookup_reply(const sockaddr_mdp *dstaddr, const sid_t *resolv
mdpreply.out.queue=OQ_ORDINARY; mdpreply.out.queue=OQ_ORDINARY;
mdpreply.out.src.sid = *resolved_sidp; mdpreply.out.src.sid = *resolved_sidp;
mdpreply.out.src.port = MDP_PORT_DNALOOKUP; mdpreply.out.src.port = MDP_PORT_DNALOOKUP;
bcopy(dstaddr, &mdpreply.out.dst, sizeof(sockaddr_mdp)); mdpreply.out.dst.sid = dest->sid;
mdpreply.out.dst.port = dest_port;
/* build reply as TOKEN|URI|DID|NAME|<NUL> */ /* build reply as TOKEN|URI|DID|NAME|<NUL> */
strbuf b = strbuf_local((char *)mdpreply.out.payload, sizeof mdpreply.out.payload); strbuf b = strbuf_local((char *)mdpreply.out.payload, sizeof mdpreply.out.payload);
strbuf_tohex(b, SID_STRLEN, resolved_sidp->binary); strbuf_tohex(b, SID_STRLEN, resolved_sidp->binary);

View File

@ -165,17 +165,20 @@ int overlay_mdp_service_rhizomeresponse(struct internal_mdp_header *UNUSED(heade
OUT(); OUT();
} }
int overlay_mdp_service_dnalookup(overlay_mdp_frame *mdp) int overlay_mdp_service_dnalookup(struct internal_mdp_header *header, struct overlay_buffer *payload)
{ {
IN(); IN();
unsigned cn=0, in=0, kp=0; unsigned cn=0, in=0, kp=0;
char did[64+1]; char did[64+1];
int pll=mdp->out.payload_length;
int pll=ob_remaining(payload);
if (pll>64) pll=64; if (pll>64) pll=64;
/* get did from the packet */ /* get did from the packet */
if (mdp->out.payload_length<1) { if (pll<1)
RETURN(WHY("Empty DID in DNA resolution request")); } RETURN(WHY("Empty DID in DNA resolution request"));
bcopy(&mdp->out.payload[0],&did[0],pll);
ob_get_bytes(payload, (unsigned char *)did, pll);
did[pll]=0; did[pll]=0;
if (config.debug.mdprequests) if (config.debug.mdprequests)
@ -199,7 +202,7 @@ int overlay_mdp_service_dnalookup(overlay_mdp_frame *mdp)
strbuf_tohex(b, SID_STRLEN, sidp->binary); strbuf_tohex(b, SID_STRLEN, sidp->binary);
strbuf_puts(b, "/local/"); strbuf_puts(b, "/local/");
strbuf_puts(b, unpackedDid); strbuf_puts(b, unpackedDid);
overlay_mdp_dnalookup_reply(&mdp->out.src, sidp, strbuf_str(b), unpackedDid, name); overlay_mdp_dnalookup_reply(header->source, header->source_port, sidp, strbuf_str(b), unpackedDid, name);
kp++; kp++;
results++; results++;
} }
@ -214,9 +217,9 @@ int overlay_mdp_service_dnalookup(overlay_mdp_frame *mdp)
when results become available, so this function will return when results become available, so this function will return
immediately, so as not to cause blockages and delays in servald. immediately, so as not to cause blockages and delays in servald.
*/ */
dna_helper_enqueue(mdp, did, &mdp->out.src.sid); dna_helper_enqueue(header->source, header->source_port, did);
monitor_tell_formatted(MONITOR_DNAHELPER, "LOOKUP:%s:%d:%s\n", monitor_tell_formatted(MONITOR_DNAHELPER, "LOOKUP:%s:%d:%s\n",
alloca_tohex_sid_t(mdp->out.src.sid), mdp->out.src.port, alloca_tohex_sid_t(header->source->sid), header->source_port,
did); did);
} }
RETURN(0); RETURN(0);
@ -370,6 +373,7 @@ void overlay_mdp_bind_internal_services()
mdp_bind_internal(NULL, MDP_PORT_PROBE, overlay_mdp_service_probe); mdp_bind_internal(NULL, MDP_PORT_PROBE, overlay_mdp_service_probe);
mdp_bind_internal(NULL, MDP_PORT_STUNREQ, overlay_mdp_service_stun_req); mdp_bind_internal(NULL, MDP_PORT_STUNREQ, overlay_mdp_service_stun_req);
mdp_bind_internal(NULL, MDP_PORT_STUN, overlay_mdp_service_stun); mdp_bind_internal(NULL, MDP_PORT_STUN, overlay_mdp_service_stun);
mdp_bind_internal(NULL, MDP_PORT_DNALOOKUP, overlay_mdp_service_dnalookup);
} }
int overlay_mdp_try_internal_services( int overlay_mdp_try_internal_services(
@ -386,9 +390,6 @@ int overlay_mdp_try_internal_services(
case MDP_PORT_KEYMAPREQUEST: case MDP_PORT_KEYMAPREQUEST:
overlay_mdp_fill_legacy(header, payload, &mdp); overlay_mdp_fill_legacy(header, payload, &mdp);
RETURN(keyring_mapping_request(keyring, header, &mdp)); RETURN(keyring_mapping_request(keyring, header, &mdp));
case MDP_PORT_DNALOOKUP:
overlay_mdp_fill_legacy(header, payload, &mdp);
RETURN(overlay_mdp_service_dnalookup(&mdp));
case MDP_PORT_TRACE: case MDP_PORT_TRACE:
overlay_mdp_fill_legacy(header, payload, &mdp); overlay_mdp_fill_legacy(header, payload, &mdp);
RETURN(overlay_mdp_service_trace(&mdp)); RETURN(overlay_mdp_service_trace(&mdp));

View File

@ -417,7 +417,8 @@ typedef struct overlay_mdp_frame {
int overlay_mdp_swap_src_dst(overlay_mdp_frame *mdp); int overlay_mdp_swap_src_dst(overlay_mdp_frame *mdp);
int overlay_mdp_dispatch(overlay_mdp_frame *mdp, struct socket_address *client); int overlay_mdp_dispatch(overlay_mdp_frame *mdp, struct socket_address *client);
void overlay_mdp_encode_ports(struct overlay_buffer *plaintext, mdp_port_t dst_port, mdp_port_t src_port); void overlay_mdp_encode_ports(struct overlay_buffer *plaintext, mdp_port_t dst_port, mdp_port_t src_port);
int overlay_mdp_dnalookup_reply(const sockaddr_mdp *dstaddr, const sid_t *resolved_sidp, const char *uri, const char *did, const char *name); int overlay_mdp_dnalookup_reply(struct subscriber *dest, mdp_port_t dest_port,
const sid_t *resolved_sidp, const char *uri, const char *did, const char *name);
int overlay_send_frame(struct internal_mdp_header *header, struct overlay_buffer *payload); int overlay_send_frame(struct internal_mdp_header *header, struct overlay_buffer *payload);
void overlay_mdp_fill_legacy( void overlay_mdp_fill_legacy(
@ -483,7 +484,7 @@ int server_probe(int *pid);
int dna_helper_start(); int dna_helper_start();
int dna_helper_shutdown(); int dna_helper_shutdown();
int dna_helper_enqueue(overlay_mdp_frame *mdp, const char *did, const sid_t *requestorSidp); int dna_helper_enqueue(struct subscriber *source, mdp_port_t source_port, const char *did);
int dna_return_resolution(overlay_mdp_frame *mdp, unsigned char *fromSid, int dna_return_resolution(overlay_mdp_frame *mdp, unsigned char *fromSid,
const char *did,const char *name,const char *uri); const char *did,const char *name,const char *uri);
int parseDnaReply(const char *buf, size_t len, char *token, char *did, char *name, char *uri, const char **bufp); int parseDnaReply(const char *buf, size_t len, char *token, char *did, char *name, char *uri, const char **bufp);