Create new, more extensible setup method (pri_setup)

git-svn-id: https://origsvn.digium.com/svn/libpri/trunk@114 2fbb986a-6c06-0410-b554-c9c1f0a7f128
This commit is contained in:
Mark Spencer
2004-06-16 15:33:58 +00:00
parent 1cabafb5fb
commit d4eab6216e
5 changed files with 123 additions and 30 deletions

View File

@@ -317,6 +317,7 @@ typedef union {
} pri_event;
struct pri;
struct pri_sr;
/* Create a D-channel on a given file descriptor. The file descriptor must be a
@@ -415,6 +416,16 @@ extern pri_event *pri_schedule_run(struct pri *pri);
extern int pri_call(struct pri *pri, q931_call *c, int transmode, int channel,
int exclusive, int nonisdn, char *caller, int callerplan, char *callername, int callerpres,
char *called,int calledplan, int ulayer1);
extern struct pri_sr *pri_sr_new(void);
extern void pri_sr_free(struct pri_sr *sr);
extern int pri_sr_set_channel(struct pri_sr *sr, int channel, int exclusive, int nonisdn);
extern int pri_sr_set_bearer(struct pri_sr *sr, int transmode, int userl1);
extern int pri_sr_set_called(struct pri_sr *sr, char *called, int calledplan, int complete);
extern int pri_sr_set_caller(struct pri_sr *sr, char *caller, char *callername, int callerplan, int callerpres);
extern int pri_setup(struct pri *pri, q931_call *call, struct pri_sr *req);
/* Override message and error stuff */
extern void pri_set_message(void (*__pri_error)(char *));
@@ -444,6 +455,7 @@ extern void pri_enslave(struct pri *master, struct pri *slave);
#define PRI_GR303_SUPPORT
#define PRI_ENSLAVE_SUPPORT
#define PRI_SETUP_CALL
#endif
/* Send notification */

74
pri.c
View File

@@ -345,13 +345,39 @@ void pri_dump_event(struct pri *pri, pri_event *e)
}
}
static void pri_sr_init(struct pri_sr *req)
{
memset(req, 0, sizeof(struct pri_sr));
}
int pri_setup(struct pri *pri, q931_call *c, struct pri_sr *req)
{
if (!pri || !c)
return -1;
return q931_setup(pri, c, req);
}
int pri_call(struct pri *pri, q931_call *c, int transmode, int channel, int exclusive,
int nonisdn, char *caller, int callerplan, char *callername, int callerpres, char *called,
int calledplan,int ulayer1)
{
struct pri_sr req;
if (!pri || !c)
return -1;
return q931_setup(pri, c, transmode, channel, exclusive, nonisdn, caller, callerplan, callername, callerpres, called, calledplan, ulayer1);
pri_sr_init(&req);
req.transmode = transmode;
req.channel = channel;
req.exclusive = exclusive;
req.nonisdn = nonisdn;
req.caller = caller;
req.callerplan = callerplan;
req.callername = callername;
req.callerpres = callerpres;
req.called = called;
req.calledplan = calledplan;
req.userl1 = ulayer1;
return q931_setup(pri, c, &req);
}
static void (*__pri_error)(char *stuff);
@@ -451,3 +477,49 @@ void pri_enslave(struct pri *master, struct pri *slave)
if (master && slave)
slave->callpool = &master->localpool;
}
struct pri_sr *pri_sr_new(void)
{
struct pri_sr *req;
req = malloc(sizeof(struct pri_sr));
if (req)
pri_sr_init(req);
return req;
}
void pri_sr_free(struct pri_sr *sr)
{
free(sr);
}
int pri_sr_set_channel(struct pri_sr *sr, int channel, int exclusive, int nonisdn)
{
sr->channel = channel;
sr->exclusive = exclusive;
sr->nonisdn = nonisdn;
return 0;
}
int pri_sr_set_bearer(struct pri_sr *sr, int transmode, int userl1)
{
sr->transmode = transmode;
sr->userl1 = userl1;
return 0;
}
int pri_sr_set_called(struct pri_sr *sr, char *called, int calledplan, int numcomplete)
{
sr->called = called;
sr->calledplan = calledplan;
sr->numcomplete = numcomplete;
return 0;
}
int pri_sr_set_caller(struct pri_sr *sr, char *caller, char *callername, int callerplan, int callerpres)
{
sr->caller = caller;
sr->callername = callername;
sr->callerplan = callerplan;
sr->callerpres = callerpres;
return 0;
}

View File

@@ -100,6 +100,21 @@ struct pri {
#endif
};
struct pri_sr {
int transmode;
int channel;
int exclusive;
int nonisdn;
char *caller;
int callerplan;
char *callername;
int callerpres;
char *called;
int calledplan;
int userl1;
int numcomplete;
};
/* Internal switch types */
#define PRI_SWITCH_GR303_EOC_PATH 10
#define PRI_SWITCH_GR303_TMC_SWITCHING 11

View File

@@ -272,9 +272,7 @@ extern int q931_call_setcrv(struct pri *pri, q931_call *call, int crv, int callm
extern q931_call *q931_new_call(struct pri *pri);
extern int q931_setup(struct pri *pri, q931_call *c, int transmode, int channel, int exclusive,
int nonisdn, char *caller, int callerplan, char *callername, int callerpres, char *called,
int calledplan, int ulay1);
extern int q931_setup(struct pri *pri, q931_call *c, struct pri_sr *req);
extern void q931_dump(q931_h *h, int len, int txrx);
extern void __q931_destroycall(struct pri *pri, q931_call *c);

48
q931.c
View File

@@ -2044,57 +2044,53 @@ static int setup_ies[] = { Q931_BEARER_CAPABILITY, Q931_CHANNEL_IDENT, Q931_PROG
static int gr303_setup_ies[] = { Q931_BEARER_CAPABILITY, Q931_CHANNEL_IDENT, -1 };
int q931_setup(struct pri *pri, q931_call *c, int transmode, int channel, int exclusive,
int nonisdn, char *caller, int callerplan, char *callername, int callerpres, char *called,
int calledplan, int userl1)
int q931_setup(struct pri *pri, q931_call *c, struct pri_sr *req)
{
int res;
if (!channel)
return -1;
c->transcapability = transmode;
c->transcapability = req->transmode;
c->transmoderate = TRANS_MODE_64_CIRCUIT;
if (!userl1)
userl1 = PRI_LAYER_1_ULAW;
c->userl1 = userl1;
c->ds1no = (channel & 0xff00) >> 8;
channel &= 0xff;
c->channelno = channel;
if (!req->userl1)
req->userl1 = PRI_LAYER_1_ULAW;
c->userl1 = req->userl1;
c->ds1no = (req->channel & 0xff00) >> 8;
req->channel &= 0xff;
c->channelno = req->channel;
c->slotmap = -1;
c->nonisdn = nonisdn;
c->nonisdn = req->nonisdn;
c->newcall = 0;
if (exclusive)
if (req->exclusive)
c->chanflags = FLAG_EXCLUSIVE;
else
c->chanflags = FLAG_PREFERRED;
if (caller) {
strncpy(c->callernum, caller, sizeof(c->callernum) - 1);
c->callerplan = callerplan;
if (callername)
strncpy(c->callername, callername, sizeof(c->callername) - 1);
if (req->caller) {
strncpy(c->callernum, req->caller, sizeof(c->callernum) - 1);
c->callerplan = req->callerplan;
if (req->callername)
strncpy(c->callername, req->callername, sizeof(c->callername) - 1);
else
strcpy(c->callername, "");
if ((pri->switchtype == PRI_SWITCH_DMS100) ||
(pri->switchtype == PRI_SWITCH_ATT4ESS)) {
/* Doesn't like certain presentation types */
if (!(callerpres & 0x7c))
callerpres = PRES_ALLOWED_NETWORK_NUMBER;
if (!(req->callerpres & 0x7c))
req->callerpres = PRES_ALLOWED_NETWORK_NUMBER;
}
c->callerpres = callerpres;
c->callerpres = req->callerpres;
} else {
strcpy(c->callernum, "");
strcpy(c->callername, "");
c->callerplan = PRI_UNKNOWN;
c->callerpres = PRES_NUMBER_NOT_AVAILABLE;
}
if (called) {
strncpy(c->callednum, called, sizeof(c->callednum) - 1);
c->calledplan = calledplan;
if (req->called) {
strncpy(c->callednum, req->called, sizeof(c->callednum) - 1);
c->calledplan = req->calledplan;
} else
return -1;
if (nonisdn && (pri->switchtype == PRI_SWITCH_NI2))
if (req->nonisdn && (pri->switchtype == PRI_SWITCH_NI2))
c->progress = Q931_PROG_CALLER_NOT_ISDN;
else
c->progress = -1;