mirror of
https://github.com/servalproject/serval-dna.git
synced 2024-12-20 13:43:12 +00:00
vomp status and vomp dial command line apps added.
now debugging dial operation.
This commit is contained in:
parent
028b24261f
commit
d843e59bd5
@ -30,17 +30,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||||||
#include "serval.h"
|
#include "serval.h"
|
||||||
#include "rhizome.h"
|
#include "rhizome.h"
|
||||||
|
|
||||||
typedef struct command_line_option {
|
|
||||||
int (*function)(int argc,char **argv,struct command_line_option *o);
|
|
||||||
char *words[32]; // 32 words should be plenty!
|
|
||||||
unsigned long long flags;
|
|
||||||
#define CLIFLAG_NONOVERLAY (1<<0) /* Uses a legacy IPv4 DNA call instead of overlay mnetwork */
|
|
||||||
#define CLIFLAG_STANDALONE (1<<1) /* Cannot be issued to a running instance */
|
|
||||||
char *description; // describe this invocation
|
|
||||||
} command_line_option;
|
|
||||||
|
|
||||||
extern command_line_option command_line_options[];
|
|
||||||
|
|
||||||
static int servalNodeRunning(int *pid)
|
static int servalNodeRunning(int *pid)
|
||||||
{
|
{
|
||||||
char *instancepath = serval_instancepath();
|
char *instancepath = serval_instancepath();
|
||||||
@ -424,27 +413,6 @@ int app_mdp_ping(int argc,char **argv,struct command_line_option *o)
|
|||||||
|
|
||||||
overlay_mdp_frame mdp;
|
overlay_mdp_frame mdp;
|
||||||
|
|
||||||
/* Get list of local addresses */
|
|
||||||
mdp.packetTypeAndFlags=MDP_GETADDRS;
|
|
||||||
mdp.addrlist.first_sid=-1;
|
|
||||||
mdp.addrlist.last_sid=0x7fffffff;
|
|
||||||
mdp.addrlist.frame_sid_count=MDP_MAX_SID_REQUEST;
|
|
||||||
int result=overlay_mdp_send(&mdp,MDP_AWAITREPLY,5000);
|
|
||||||
if (result) {
|
|
||||||
if (mdp.packetTypeAndFlags==MDP_ERROR)
|
|
||||||
{
|
|
||||||
fprintf(stderr,"Could not get list of local MDP addresses\n");
|
|
||||||
fprintf(stderr," MDP Server error #%d: '%s'\n",
|
|
||||||
mdp.error.error,mdp.error.message);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
fprintf(stderr,"Could not get list of local MDP addresses\n");
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
if (mdp.packetTypeAndFlags!=MDP_ADDRLIST)
|
|
||||||
return WHY("MDP Server returned wrong frame type.");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Bind to MDP socket and await confirmation */
|
/* Bind to MDP socket and await confirmation */
|
||||||
int port=32768+(random()&32767);
|
int port=32768+(random()&32767);
|
||||||
mdp.packetTypeAndFlags=MDP_BIND;
|
mdp.packetTypeAndFlags=MDP_BIND;
|
||||||
@ -456,9 +424,10 @@ int app_mdp_ping(int argc,char **argv,struct command_line_option *o)
|
|||||||
and mdp.addrlist share storage as a union in the mdp structure. */
|
and mdp.addrlist share storage as a union in the mdp structure. */
|
||||||
bcopy(&mdp.addrlist.sids[0][0],mdp.bind.sid,SID_SIZE);
|
bcopy(&mdp.addrlist.sids[0][0],mdp.bind.sid,SID_SIZE);
|
||||||
unsigned char srcsid[SID_SIZE];
|
unsigned char srcsid[SID_SIZE];
|
||||||
|
if (overlay_mdp_getmyaddr(0,mdp.bind.sid)) return -1;
|
||||||
bcopy(mdp.bind.sid,srcsid,SID_SIZE);
|
bcopy(mdp.bind.sid,srcsid,SID_SIZE);
|
||||||
mdp.bind.port_number=port;
|
mdp.bind.port_number=port;
|
||||||
result=overlay_mdp_send(&mdp,MDP_AWAITREPLY,5000);
|
int result=overlay_mdp_send(&mdp,MDP_AWAITREPLY,5000);
|
||||||
if (result) {
|
if (result) {
|
||||||
if (mdp.packetTypeAndFlags==MDP_ERROR)
|
if (mdp.packetTypeAndFlags==MDP_ERROR)
|
||||||
fprintf(stderr,"Could not bind to MDP port %d: error=%d, message='%s'\n",
|
fprintf(stderr,"Could not bind to MDP port %d: error=%d, message='%s'\n",
|
||||||
@ -924,6 +893,10 @@ command_line_option command_line_options[]={
|
|||||||
"Create a new identity in the keyring protected by the provided PIN"},
|
"Create a new identity in the keyring protected by the provided PIN"},
|
||||||
{app_keyring_set_did,{"set","did","<sid>","<did>","[<pin>]",NULL},CLIFLAG_STANDALONE,
|
{app_keyring_set_did,{"set","did","<sid>","<did>","[<pin>]",NULL},CLIFLAG_STANDALONE,
|
||||||
"Set the DID for the specified SID. Optionally supply PIN to unlock the SID record in the keyring."},
|
"Set the DID for the specified SID. Optionally supply PIN to unlock the SID record in the keyring."},
|
||||||
|
{app_vomp_status,{"vomp","status",NULL},0,
|
||||||
|
"Display status of any VoMP calls"},
|
||||||
|
{app_vomp_dial,{"vomp","<sid>","<did>","[<callerid>]",NULL},0,
|
||||||
|
"Attempt to dial the specified sid and did. Optionally supply the calling number"},
|
||||||
{NULL,{NULL}}
|
{NULL,{NULL}}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
21
serval.h
21
serval.h
@ -17,6 +17,8 @@ along with this program; if not, write to the Free Software
|
|||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define MALLOC_PARANOIA
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -1131,7 +1133,7 @@ typedef struct overlay_mdp_addrlist {
|
|||||||
unsigned int server_sid_count;
|
unsigned int server_sid_count;
|
||||||
unsigned int first_sid;
|
unsigned int first_sid;
|
||||||
unsigned int last_sid;
|
unsigned int last_sid;
|
||||||
unsigned char frame_sid_count; /* how many of the following 59 slots are
|
unsigned int frame_sid_count; /* how many of the following 59 slots are
|
||||||
populated */
|
populated */
|
||||||
/* 59*32 < (MDP_MTU-100), so up to 59 SIDs in a single reply.
|
/* 59*32 < (MDP_MTU-100), so up to 59 SIDs in a single reply.
|
||||||
Multiple replies can be used to respond with more. */
|
Multiple replies can be used to respond with more. */
|
||||||
@ -1279,3 +1281,20 @@ typedef struct vomp_call_stateo {
|
|||||||
int vomp_mdp_event(overlay_mdp_frame *mdp,
|
int vomp_mdp_event(overlay_mdp_frame *mdp,
|
||||||
struct sockaddr_un *recvaddr,int recvaddrlen);
|
struct sockaddr_un *recvaddr,int recvaddrlen);
|
||||||
int vomp_mdp_received(overlay_mdp_frame *mdp);
|
int vomp_mdp_received(overlay_mdp_frame *mdp);
|
||||||
|
|
||||||
|
typedef struct command_line_option {
|
||||||
|
int (*function)(int argc,char **argv,struct command_line_option *o);
|
||||||
|
char *words[32]; // 32 words should be plenty!
|
||||||
|
unsigned long long flags;
|
||||||
|
#define CLIFLAG_NONOVERLAY (1<<0) /* Uses a legacy IPv4 DNA call instead of overlay mnetwork */
|
||||||
|
#define CLIFLAG_STANDALONE (1<<1) /* Cannot be issued to a running instance */
|
||||||
|
char *description; // describe this invocation
|
||||||
|
} command_line_option;
|
||||||
|
|
||||||
|
extern command_line_option command_line_options[];
|
||||||
|
int cli_arg(int argc, char **argv, command_line_option *o, char *argname, char **dst, int (*validator)(const char *arg), char *defaultvalue);
|
||||||
|
|
||||||
|
int overlay_mdp_getmyaddr(int index,unsigned char *sid);
|
||||||
|
|
||||||
|
int app_vomp_status(int argc, char **argv, struct command_line_option *o);
|
||||||
|
int app_vomp_dial(int argc, char **argv, struct command_line_option *o);
|
||||||
|
86
vomp.c
86
vomp.c
@ -276,6 +276,8 @@ int vomp_mdp_event(overlay_mdp_frame *mdp,
|
|||||||
transported audio. In particular we inform when the call state changes,
|
transported audio. In particular we inform when the call state changes,
|
||||||
including if any error has occurred.
|
including if any error has occurred.
|
||||||
*/
|
*/
|
||||||
|
dump("vomp frame",mdp,256);
|
||||||
|
fprintf(stderr,"Flags=0x%x\n",mdp->vompevent.flags);
|
||||||
switch(mdp->vompevent.flags)
|
switch(mdp->vompevent.flags)
|
||||||
{
|
{
|
||||||
case VOMPEVENT_REGISTERINTEREST:
|
case VOMPEVENT_REGISTERINTEREST:
|
||||||
@ -394,6 +396,7 @@ int vomp_mdp_event(overlay_mdp_frame *mdp,
|
|||||||
These need to be passed to the node being called to provide caller id,
|
These need to be passed to the node being called to provide caller id,
|
||||||
and potentially handle call-routing, e.g., if it is a gateway.
|
and potentially handle call-routing, e.g., if it is a gateway.
|
||||||
*/
|
*/
|
||||||
|
fprintf(stderr,"DIAL!\n");
|
||||||
{
|
{
|
||||||
/* Populate call structure */
|
/* Populate call structure */
|
||||||
if (vomp_call_count>=VOMP_MAX_CALLS)
|
if (vomp_call_count>=VOMP_MAX_CALLS)
|
||||||
@ -417,12 +420,13 @@ int vomp_mdp_event(overlay_mdp_frame *mdp,
|
|||||||
return overlay_mdp_reply_error
|
return overlay_mdp_reply_error
|
||||||
(mdp_named_socket,recvaddr,recvaddrlen,4005,
|
(mdp_named_socket,recvaddr,recvaddrlen,4005,
|
||||||
"Insufficient entropy");
|
"Insufficient entropy");
|
||||||
|
printf("session=0x%08x\n",call->local.session);
|
||||||
int i;
|
int i;
|
||||||
for(i=0;i<vomp_call_count;i++)
|
for(i=0;i<vomp_call_count;i++)
|
||||||
if (i!=slot)
|
if (i!=slot)
|
||||||
if (call->local.session==vomp_call_states[i].local.session) break;
|
if (call->local.session==vomp_call_states[i].local.session) break;
|
||||||
/* reject duplicate call session numbers */
|
/* reject duplicate call session numbers */
|
||||||
if (i>=vomp_call_count) call->local.session=0;
|
if (i<vomp_call_count) call->local.session=0;
|
||||||
}
|
}
|
||||||
call->local.session&=VOMP_SESSION_MASK;
|
call->local.session&=VOMP_SESSION_MASK;
|
||||||
call->last_activity=overlay_gettime_ms();
|
call->last_activity=overlay_gettime_ms();
|
||||||
@ -727,3 +731,83 @@ int vomp_mdp_received(overlay_mdp_frame *mdp)
|
|||||||
|
|
||||||
return WHY("Malformed VoMP MDP packet?");
|
return WHY("Malformed VoMP MDP packet?");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *vomp_describe_state(int state)
|
||||||
|
{
|
||||||
|
switch(state) {
|
||||||
|
case VOMP_STATE_CALLENDED: return "CALLENDED";
|
||||||
|
case VOMP_STATE_INCALL: return "INCALL";
|
||||||
|
case VOMP_STATE_RINGINGIN: return "RINGINGIN";
|
||||||
|
case VOMP_STATE_RINGINGOUT: return "RINGINGOUT";
|
||||||
|
case VOMP_STATE_CALLPREP: return "CALLPREP";
|
||||||
|
case VOMP_STATE_NOCALL: return "NOCALL";
|
||||||
|
}
|
||||||
|
return "UNKNOWN";
|
||||||
|
}
|
||||||
|
|
||||||
|
int app_vomp_status(int argc, char **argv, struct command_line_option *o)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i=0;i<vomp_call_count;i++)
|
||||||
|
{
|
||||||
|
printf("%s\n-> %s\n (%s -> %s)\n",
|
||||||
|
vomp_call_states[i].local.sid,
|
||||||
|
vomp_call_states[i].remote.sid,
|
||||||
|
vomp_call_states[i].local.did,
|
||||||
|
vomp_call_states[i].remote.did);
|
||||||
|
printf(" local state=%s, remote state=%s\n",
|
||||||
|
vomp_describe_state(vomp_call_states[i].local.state),
|
||||||
|
vomp_describe_state(vomp_call_states[i].remote.state));
|
||||||
|
}
|
||||||
|
if (!vomp_call_count) printf("No active calls\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int app_vomp_dial(int argc, char **argv, struct command_line_option *o)
|
||||||
|
{
|
||||||
|
char *sid,*did,*callerid;
|
||||||
|
cli_arg(argc, argv, o, "sid", &sid, NULL, "");
|
||||||
|
cli_arg(argc, argv, o, "did", &did, NULL, "");
|
||||||
|
cli_arg(argc, argv, o, "callerid", &callerid, NULL, NULL);
|
||||||
|
|
||||||
|
overlay_mdp_frame mdp;
|
||||||
|
bzero(&mdp,sizeof(mdp));
|
||||||
|
|
||||||
|
mdp.packetTypeAndFlags=MDP_VOMPEVENT;
|
||||||
|
mdp.vompevent.flags=VOMPEVENT_DIAL;
|
||||||
|
if (overlay_mdp_getmyaddr(0,&mdp.vompevent.local_sid[0])) return -1;
|
||||||
|
stowSid(mdp.vompevent.remote_sid,0,sid);
|
||||||
|
|
||||||
|
if (overlay_mdp_send(&mdp,MDP_AWAITREPLY,5000))
|
||||||
|
{
|
||||||
|
WHY("Dial request failed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return WHY("Not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
int overlay_mdp_getmyaddr(int index,unsigned char *sid)
|
||||||
|
{
|
||||||
|
overlay_mdp_frame a;
|
||||||
|
|
||||||
|
a.packetTypeAndFlags=MDP_GETADDRS;
|
||||||
|
a.addrlist.first_sid=index;
|
||||||
|
a.addrlist.last_sid=0x7fffffff;
|
||||||
|
a.addrlist.frame_sid_count=MDP_MAX_SID_REQUEST;
|
||||||
|
int result=overlay_mdp_send(&a,MDP_AWAITREPLY,5000);
|
||||||
|
if (result) {
|
||||||
|
if (a.packetTypeAndFlags==MDP_ERROR)
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Could not get list of local MDP addresses\n");
|
||||||
|
fprintf(stderr," MDP Server error #%d: '%s'\n",
|
||||||
|
a.error.error,a.error.message);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fprintf(stderr,"Could not get list of local MDP addresses\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if ((a.packetTypeAndFlags&MDP_TYPE_MASK)!=MDP_ADDRLIST)
|
||||||
|
return WHY("MDP Server returned something other than an address list");
|
||||||
|
bcopy(&a.addrlist.sids[0][0],sid,SID_SIZE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user