mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-06-02 23:40:49 +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_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';
|
||||||
}
|
}
|
||||||
|
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)
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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));
|
||||||
|
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_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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user