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_bufptr = 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 int awaiting_reply = 0;
@ -466,7 +467,7 @@ void handle_reply_line(const char *bufp, size_t len)
else {
if (config.debug.dnahelper)
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 {
@ -593,10 +594,10 @@ static void reply_timeout(struct sched_ent *alarm)
}
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)
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)
return 0;
// 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];
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_puts(b, did);
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_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);
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)
return monitor_write_error(c,"I don't know who I am");
struct sockaddr_mdp addr={
.port = atoi(parsed->args[3]),
};
if (str_to_sid_t(&addr.sid, sid) == -1)
mdp_port_t dest_port = atoi(parsed->args[3]);
sid_t dest;
if (str_to_sid_t(&dest, sid) == -1)
return monitor_write_error(c,"Invalid SID");
struct subscriber *destination = find_subscriber(dest.binary, sizeof(dest), 1);
char uri[256];
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);
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;
}

View File

@ -620,7 +620,8 @@ static int overlay_saw_mdp_frame(
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)
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.src.sid = *resolved_sidp;
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> */
strbuf b = strbuf_local((char *)mdpreply.out.payload, sizeof mdpreply.out.payload);
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();
}
int overlay_mdp_service_dnalookup(overlay_mdp_frame *mdp)
int overlay_mdp_service_dnalookup(struct internal_mdp_header *header, struct overlay_buffer *payload)
{
IN();
unsigned cn=0, in=0, kp=0;
char did[64+1];
int pll=mdp->out.payload_length;
int pll=ob_remaining(payload);
if (pll>64) pll=64;
/* get did from the packet */
if (mdp->out.payload_length<1) {
RETURN(WHY("Empty DID in DNA resolution request")); }
bcopy(&mdp->out.payload[0],&did[0],pll);
if (pll<1)
RETURN(WHY("Empty DID in DNA resolution request"));
ob_get_bytes(payload, (unsigned char *)did, pll);
did[pll]=0;
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_puts(b, "/local/");
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++;
results++;
}
@ -214,9 +217,9 @@ int overlay_mdp_service_dnalookup(overlay_mdp_frame *mdp)
when results become available, so this function will return
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",
alloca_tohex_sid_t(mdp->out.src.sid), mdp->out.src.port,
alloca_tohex_sid_t(header->source->sid), header->source_port,
did);
}
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_STUNREQ, overlay_mdp_service_stun_req);
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(
@ -386,9 +390,6 @@ int overlay_mdp_try_internal_services(
case MDP_PORT_KEYMAPREQUEST:
overlay_mdp_fill_legacy(header, payload, &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:
overlay_mdp_fill_legacy(header, payload, &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_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);
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);
void overlay_mdp_fill_legacy(
@ -483,7 +484,7 @@ int server_probe(int *pid);
int dna_helper_start();
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,
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);