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:
12
libpri.h
12
libpri.h
@@ -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
74
pri.c
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
48
q931.c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user