From 709245970284761e1b730f0b0f2c94adeeecdb0b Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Wed, 24 Jun 2009 18:19:24 +0000 Subject: [PATCH] Capture and expose the Reverse Charging Indication IE on ISDN PRI. (issue #13760) Reported by: mrgabu Patches: 20090619_libpri_1.4.patch uploaded by seanbright (license 71) Tested by: seanbright, pruonckk Review: https://reviewboard.asterisk.org/r/291/ git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.4@885 2fbb986a-6c06-0410-b554-c9c1f0a7f128 --- libpri.h | 2 ++ pri_internal.h | 1 + q931.c | 13 ++++++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/libpri.h b/libpri.h index ecfa70c..f21ca22 100644 --- a/libpri.h +++ b/libpri.h @@ -421,6 +421,7 @@ typedef struct pri_event_ring { char origcallednum[256]; int callingplanorigcalled; /* Dialing plan of Originally Called Number */ int origredirectingreason; + int reversecharge; } pri_event_ring; typedef struct pri_event_hangup { @@ -708,6 +709,7 @@ void pri_enslave(struct pri *master, struct pri *slave); #define PRI_REDIRECTING_REASON #define PRI_AOC_UNITS #define PRI_ANI +#define PRI_REVERSECHARGE_SUPPORT /* Send notification */ int pri_notify(struct pri *pri, q931_call *c, int channel, int info); diff --git a/pri_internal.h b/pri_internal.h index d865ada..000818d 100644 --- a/pri_internal.h +++ b/pri_internal.h @@ -272,6 +272,7 @@ struct q931_call { q931_call *bridged_call; /* Pointer to other leg of bridged call (Used by Q.SIG when eliminating tromboned calls) */ int changestatus; /* SERVICE message changestatus */ + int reversecharge; /* Reverse charging indication */ }; extern int pri_schedule_event(struct pri *pri, int ms, void (*function)(void *data), void *data); diff --git a/q931.c b/q931.c index 7f0e303..d3a93b0 100644 --- a/q931.c +++ b/q931.c @@ -2143,6 +2143,16 @@ static void dump_transit_count(int full_ie, struct pri *ctrl, q931_ie *ie, int l pri_message(ctrl, "Count=%d (0x%02x)\n", ie->data[0] & 0x1f, ie->data[0] & 0x1f); } +static void dump_reverse_charging_indication(int full_ie, struct pri *ctrl, q931_ie *ie, int len, char prefix) +{ + pri_message(ctrl, "%c Reverse Charging Indication (len=%02d): %d\n", prefix, len, ie->data[0] & 0x7); +} + +static int receive_reverse_charging_indication(int full_ie, struct pri *ctrl, q931_call *call, int msgtype, q931_ie *ie, int len) +{ + call->reversecharge = ie->data[0] & 0x7; + return 0; +} static struct ie ies[] = { /* Codeset 0 - Common */ @@ -2160,7 +2170,7 @@ static struct ie ies[] = { { 1, Q931_BINARY_PARAMETERS, "Packet-layer Binary Parameters" }, { 1, Q931_WINDOW_SIZE, "Packet-layer Window Size" }, { 1, Q931_CLOSED_USER_GROUP, "Closed User Group" }, - { 1, Q931_REVERSE_CHARGE_INDIC, "Reverse Charging Indication" }, + { 1, Q931_REVERSE_CHARGE_INDIC, "Reverse Charging Indication", dump_reverse_charging_indication, receive_reverse_charging_indication }, { 1, Q931_CALLING_PARTY_NUMBER, "Calling Party Number", dump_calling_party_number, receive_calling_party_number, transmit_calling_party_number }, { 1, Q931_CALLING_PARTY_SUBADDR, "Calling Party Subaddress", dump_calling_party_subaddr, receive_calling_party_subaddr }, { 1, Q931_CALLED_PARTY_NUMBER, "Called Party Number", dump_called_party_number, receive_called_party_number, transmit_called_party_number }, @@ -3784,6 +3794,7 @@ static int post_handle_q931_message(struct pri *ctrl, struct q931_mh *mh, struct ctrl->ev.ring.redirectingreason = c->redirectingreason; ctrl->ev.ring.progress = c->progress; ctrl->ev.ring.progressmask = c->progressmask; + ctrl->ev.ring.reversecharge = c->reversecharge; return Q931_RES_HAVEEVENT; case Q931_ALERTING: if (c->newcall) {