From d4eab6216e031b169c62a97045e7dc6619699c37 Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Wed, 16 Jun 2004 15:33:58 +0000 Subject: [PATCH] Create new, more extensible setup method (pri_setup) git-svn-id: https://origsvn.digium.com/svn/libpri/trunk@114 2fbb986a-6c06-0410-b554-c9c1f0a7f128 --- libpri.h | 12 ++++++++ pri.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++- pri_internal.h | 15 ++++++++++ pri_q931.h | 4 +-- q931.c | 48 +++++++++++++++----------------- 5 files changed, 123 insertions(+), 30 deletions(-) diff --git a/libpri.h b/libpri.h index 9776371..252bbb6 100755 --- a/libpri.h +++ b/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 */ diff --git a/pri.c b/pri.c index c17de50..1b9fcf1 100755 --- a/pri.c +++ b/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; +} diff --git a/pri_internal.h b/pri_internal.h index deb5ec3..f623b00 100755 --- a/pri_internal.h +++ b/pri_internal.h @@ -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 diff --git a/pri_q931.h b/pri_q931.h index dbce37a..ac04a69 100755 --- a/pri_q931.h +++ b/pri_q931.h @@ -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); diff --git a/q931.c b/q931.c index b1645ba..8e06dac 100755 --- a/q931.c +++ b/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;