mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-04-24 21:09:49 +00:00
Support for binding internal handlers to mdp ports
This commit is contained in:
parent
0d5d878521
commit
a77642fc9e
@ -126,6 +126,7 @@ struct mdp_binding{
|
|||||||
struct subscriber *subscriber;
|
struct subscriber *subscriber;
|
||||||
mdp_port_t port;
|
mdp_port_t port;
|
||||||
int version;
|
int version;
|
||||||
|
int (*internal)(const struct mdp_header *header, const uint8_t *payload, size_t len);
|
||||||
struct socket_address client;
|
struct socket_address client;
|
||||||
time_ms_t binding_time;
|
time_ms_t binding_time;
|
||||||
};
|
};
|
||||||
@ -270,6 +271,49 @@ static int overlay_mdp_process_bind_request(int sock, struct subscriber *subscri
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mdp_bind_internal(struct subscriber *subscriber, mdp_port_t port,
|
||||||
|
int (*internal)(const struct mdp_header *header, const uint8_t *payload, size_t len))
|
||||||
|
{
|
||||||
|
|
||||||
|
int i;
|
||||||
|
struct mdp_binding *free_slot=NULL;
|
||||||
|
|
||||||
|
for(i=0;i<MDP_MAX_BINDINGS;i++) {
|
||||||
|
if ((!free_slot) && mdp_bindings[i].port==0)
|
||||||
|
free_slot=&mdp_bindings[i];
|
||||||
|
|
||||||
|
if (mdp_bindings[i].port == port
|
||||||
|
&& mdp_bindings[i].subscriber == subscriber)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!free_slot)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
free_slot->subscriber=subscriber;
|
||||||
|
free_slot->port=port;
|
||||||
|
free_slot->version=1;
|
||||||
|
free_slot->internal=internal;
|
||||||
|
free_slot->binding_time=gettime_ms();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int mdp_unbind_internal(struct subscriber *subscriber, mdp_port_t port,
|
||||||
|
int (*internal)(const struct mdp_header *header, const uint8_t *payload, size_t len))
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i=0;i<MDP_MAX_BINDINGS;i++) {
|
||||||
|
if (mdp_bindings[i].port == port
|
||||||
|
&& mdp_bindings[i].subscriber == subscriber
|
||||||
|
&& mdp_bindings[i].internal == internal){
|
||||||
|
mdp_bindings[i].port=0;
|
||||||
|
mdp_bindings[i].subscriber=NULL;
|
||||||
|
mdp_bindings[i].internal=NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int overlay_mdp_decode_header(struct overlay_buffer *buff, overlay_mdp_frame *mdp)
|
static int overlay_mdp_decode_header(struct overlay_buffer *buff, overlay_mdp_frame *mdp)
|
||||||
{
|
{
|
||||||
/* extract MDP port numbers */
|
/* extract MDP port numbers */
|
||||||
@ -483,6 +527,10 @@ static int overlay_saw_mdp_frame(struct overlay_frame *frame, overlay_mdp_frame
|
|||||||
header.flags|=MDP_FLAG_NO_CRYPT;
|
header.flags|=MDP_FLAG_NO_CRYPT;
|
||||||
if (mdp->packetTypeAndFlags & MDP_NOSIGN)
|
if (mdp->packetTypeAndFlags & MDP_NOSIGN)
|
||||||
header.flags|=MDP_FLAG_NO_SIGN;
|
header.flags|=MDP_FLAG_NO_SIGN;
|
||||||
|
|
||||||
|
if (mdp_bindings[match].internal)
|
||||||
|
RETURN(mdp_bindings[match].internal(&header, mdp->out.payload, mdp->out.payload_length));
|
||||||
|
|
||||||
RETURN(mdp_send2(&mdp_bindings[match].client, &header, mdp->out.payload, mdp->out.payload_length));
|
RETURN(mdp_send2(&mdp_bindings[match].client, &header, mdp->out.payload, mdp->out.payload_length));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1262,6 +1310,7 @@ static void mdp_process_packet(struct socket_address *client, struct mdp_header
|
|||||||
case MDP_LISTEN:
|
case MDP_LISTEN:
|
||||||
// double check that this binding belongs to this connection
|
// double check that this binding belongs to this connection
|
||||||
if (!binding
|
if (!binding
|
||||||
|
|| binding->internal
|
||||||
|| !compare_client(&binding->client, client))
|
|| !compare_client(&binding->client, client))
|
||||||
mdp_reply_error(client, header);
|
mdp_reply_error(client, header);
|
||||||
break;
|
break;
|
||||||
@ -1285,6 +1334,7 @@ static void mdp_process_packet(struct socket_address *client, struct mdp_header
|
|||||||
}else{
|
}else{
|
||||||
// double check that this binding belongs to this connection
|
// double check that this binding belongs to this connection
|
||||||
if (!binding
|
if (!binding
|
||||||
|
|| binding->internal
|
||||||
|| !source
|
|| !source
|
||||||
|| header->local.port == 0
|
|| header->local.port == 0
|
||||||
|| !compare_client(&binding->client, client)){
|
|| !compare_client(&binding->client, client)){
|
||||||
@ -1342,6 +1392,7 @@ static void mdp_process_packet(struct socket_address *client, struct mdp_header
|
|||||||
|
|
||||||
// remove binding
|
// remove binding
|
||||||
if (binding
|
if (binding
|
||||||
|
&& !binding->internal
|
||||||
&& header->flags & MDP_FLAG_CLOSE
|
&& header->flags & MDP_FLAG_CLOSE
|
||||||
&& compare_client(&binding->client, client)){
|
&& compare_client(&binding->client, client)){
|
||||||
if (config.debug.mdprequests)
|
if (config.debug.mdprequests)
|
||||||
|
7
serval.h
7
serval.h
@ -552,6 +552,13 @@ 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(const sockaddr_mdp *dstaddr, const sid_t *resolved_sidp, const char *uri, const char *did, const char *name);
|
||||||
|
|
||||||
|
struct mdp_header;
|
||||||
|
int mdp_bind_internal(struct subscriber *subscriber, mdp_port_t port,
|
||||||
|
int (*internal)(const struct mdp_header *header, const uint8_t *payload, size_t len));
|
||||||
|
int mdp_unbind_internal(struct subscriber *subscriber, mdp_port_t port,
|
||||||
|
int (*internal)(const struct mdp_header *header, const uint8_t *payload, size_t len));
|
||||||
|
|
||||||
|
|
||||||
struct vomp_call_state;
|
struct vomp_call_state;
|
||||||
|
|
||||||
void set_codec_flag(int codec, unsigned char *flags);
|
void set_codec_flag(int codec, unsigned char *flags);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user