mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-02-21 09:51:50 +00:00
Refactor dna lookup requests to new interface
This commit is contained in:
parent
20e2b2fdd7
commit
63db7b4513
14
dna_helper.c
14
dna_helper.c
@ -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';
|
||||
}
|
||||
|
12
monitor.c
12
monitor.c
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
5
serval.h
5
serval.h
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user