Attaching AOC-E to DISCONNECT or RELEASE; transmit AOC-E even if zero units have been charged; minor function/naming cleanup
This commit is contained in:
parent
d4698e7b48
commit
24cec65fc6
|
@ -184,9 +184,9 @@ static void split_3pty(call_t *call)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generate AOC-S facility msg from metering information */
|
/* Send AOC-S facility msg from metering information */
|
||||||
#define AOCS_CURRENCY_AMOUNT_PER_UNIT 5
|
#define AOCS_CURRENCY_AMOUNT_PER_UNIT 5
|
||||||
static void generate_aocs_fac(call_t *call)
|
static void snd_msg_fac_aocs(call_t *call)
|
||||||
{
|
{
|
||||||
struct l3_msg *l3m;
|
struct l3_msg *l3m;
|
||||||
uint8_t fac_ie[256];
|
uint8_t fac_ie[256];
|
||||||
|
@ -260,14 +260,37 @@ static void generate_aocs_fac(call_t *call)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generate AOC-E facility msg */
|
/* Send AOC-D facility msg */
|
||||||
static void generate_aoce_fac(call_t *call)
|
static void snd_msg_fac_aocd(call_t *call)
|
||||||
|
{
|
||||||
|
struct l3_msg *l3m;
|
||||||
|
uint8_t fac_ie[256];
|
||||||
|
struct asn1_parm fac;
|
||||||
|
|
||||||
|
PDEBUG(DISDN, DEBUG_DEBUG, "Sending AOC-D facility, subTotal units: %d\n", call->metering_total_units);
|
||||||
|
|
||||||
|
memset(&fac, 0, sizeof(fac));
|
||||||
|
fac.Valid = 1;
|
||||||
|
fac.comp = CompInvoke;
|
||||||
|
fac.u.inv.invokeId = 2; /* doesn't matter since no response is expected */
|
||||||
|
fac.u.inv.operationValue = Fac_AOCDChargingUnit;
|
||||||
|
|
||||||
|
fac.u.inv.o.AOCchu.recordedUnits = call->metering_total_units;
|
||||||
|
encodeFac(fac_ie, &fac);
|
||||||
|
|
||||||
|
// sending facility
|
||||||
|
l3m = create_l3msg();
|
||||||
|
enc_ie_facility(l3m, fac_ie + 2, fac_ie[1]);
|
||||||
|
call->isdn_ep->ml3->to_layer3(call->isdn_ep->ml3, MT_FACILITY, call->l3_pid, l3m);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encode AOC-E facility */
|
||||||
|
static void enc_ie_fac_aoce(call_t *call, struct l3_msg *l3m)
|
||||||
{
|
{
|
||||||
uint8_t fac_ie[256];
|
uint8_t fac_ie[256];
|
||||||
struct asn1_parm fac;
|
struct asn1_parm fac;
|
||||||
struct l3_msg *l3m;
|
|
||||||
|
|
||||||
PDEBUG(DISDN, DEBUG_DEBUG, "Sending AOC-E facility, total_units=%d\n", call->metering_total_units);
|
PDEBUG(DISDN, DEBUG_DEBUG, "Attaching AOC-E facility, total units: %d\n", call->metering_total_units);
|
||||||
|
|
||||||
memset(&fac, 0, sizeof(fac));
|
memset(&fac, 0, sizeof(fac));
|
||||||
fac.Valid = 1;
|
fac.Valid = 1;
|
||||||
|
@ -278,39 +301,18 @@ static void generate_aoce_fac(call_t *call)
|
||||||
|
|
||||||
encodeFac(fac_ie, &fac);
|
encodeFac(fac_ie, &fac);
|
||||||
|
|
||||||
// sending facility
|
// attach facility
|
||||||
l3m = create_l3msg();
|
|
||||||
enc_ie_facility(l3m, fac_ie + 2, fac_ie[1]);
|
enc_ie_facility(l3m, fac_ie + 2, fac_ie[1]);
|
||||||
call->isdn_ep->ml3->to_layer3(call->isdn_ep->ml3, MT_FACILITY, call->l3_pid, l3m);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* AOC-D timer callback */
|
/* AOC-D timer callback */
|
||||||
static void aocd_timer_cb(void *data)
|
static void aocd_timer_cb(void *data)
|
||||||
{
|
{
|
||||||
uint8_t fac_ie[256];
|
|
||||||
struct asn1_parm fac;
|
|
||||||
struct l3_msg *l3m;
|
|
||||||
call_t *call = data;
|
call_t *call = data;
|
||||||
|
|
||||||
call->metering_total_units++;
|
call->metering_total_units++;
|
||||||
|
|
||||||
PDEBUG(DISDN, DEBUG_DEBUG, "Sending next AOC-D facility, total_units=%d\n", call->metering_total_units);
|
|
||||||
|
|
||||||
timer_start(&call->aocd_unit_timer, (double)call->metering_unit_period_decisecs / (double)10);
|
timer_start(&call->aocd_unit_timer, (double)call->metering_unit_period_decisecs / (double)10);
|
||||||
|
snd_msg_fac_aocd(call);
|
||||||
memset(&fac, 0, sizeof(fac));
|
|
||||||
fac.Valid = 1;
|
|
||||||
fac.comp = CompInvoke;
|
|
||||||
fac.u.inv.invokeId = 2; /* doesn't matter since no response is expected */
|
|
||||||
fac.u.inv.operationValue = Fac_AOCDChargingUnit;
|
|
||||||
fac.u.inv.o.AOCchu.recordedUnits = call->metering_total_units;
|
|
||||||
|
|
||||||
encodeFac(fac_ie, &fac);
|
|
||||||
|
|
||||||
// sending facility
|
|
||||||
l3m = create_l3msg();
|
|
||||||
enc_ie_facility(l3m, fac_ie + 2, fac_ie[1]);
|
|
||||||
call->isdn_ep->ml3->to_layer3(call->isdn_ep->ml3, MT_FACILITY, call->l3_pid, l3m);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -907,8 +909,6 @@ void disconnect_ind(call_t *call, uint32_t pid, struct l3_msg *l3m)
|
||||||
timer_exit(&call->aocd_unit_timer);
|
timer_exit(&call->aocd_unit_timer);
|
||||||
call->aocd_unit_timer_started = 0;
|
call->aocd_unit_timer_started = 0;
|
||||||
}
|
}
|
||||||
if(call->metering_total_units > 0)
|
|
||||||
generate_aoce_fac(call);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* CC-DISCONNECT INDICATION of child instance */
|
/* CC-DISCONNECT INDICATION of child instance */
|
||||||
|
@ -2137,7 +2137,7 @@ skip_ies:
|
||||||
rc = osmo_cc_get_ie_metering(msg, 0, &(call->metering_connect_units), &(call->metering_unit_period_decisecs));
|
rc = osmo_cc_get_ie_metering(msg, 0, &(call->metering_connect_units), &(call->metering_unit_period_decisecs));
|
||||||
if(rc >= 0) {
|
if(rc >= 0) {
|
||||||
call->metering_info_received = 1;
|
call->metering_info_received = 1;
|
||||||
generate_aocs_fac(call);
|
snd_msg_fac_aocs(call);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2200,7 +2200,7 @@ void alert_req(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
||||||
rc = osmo_cc_get_ie_metering(msg, 0, &(call->metering_connect_units), &(call->metering_unit_period_decisecs));
|
rc = osmo_cc_get_ie_metering(msg, 0, &(call->metering_connect_units), &(call->metering_unit_period_decisecs));
|
||||||
if(rc >= 0) {
|
if(rc >= 0) {
|
||||||
call->metering_info_received = 1;
|
call->metering_info_received = 1;
|
||||||
generate_aocs_fac(call);
|
snd_msg_fac_aocs(call);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2214,8 +2214,6 @@ void setup_rsp(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
||||||
char connected[33];
|
char connected[33];
|
||||||
char display[128];
|
char display[128];
|
||||||
int rc;
|
int rc;
|
||||||
uint8_t fac_ie[256];
|
|
||||||
struct asn1_parm fac;
|
|
||||||
|
|
||||||
/* NT-MODE in setup state we must send PROCEEDING first */
|
/* NT-MODE in setup state we must send PROCEEDING first */
|
||||||
if (!call->proceeding_sent && call->isdn_ep->ntmode) {
|
if (!call->proceeding_sent && call->isdn_ep->ntmode) {
|
||||||
|
@ -2280,28 +2278,14 @@ void setup_rsp(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
||||||
rc = osmo_cc_get_ie_metering(msg, 0, &(call->metering_connect_units), &(call->metering_unit_period_decisecs));
|
rc = osmo_cc_get_ie_metering(msg, 0, &(call->metering_connect_units), &(call->metering_unit_period_decisecs));
|
||||||
if(rc >= 0) {
|
if(rc >= 0) {
|
||||||
call->metering_info_received = 1;
|
call->metering_info_received = 1;
|
||||||
generate_aocs_fac(call);
|
snd_msg_fac_aocs(call);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* AOC-D handling on connect */
|
/* AOC-D handling on connect */
|
||||||
if(call->isdn_ep->ntmode && call->isdn_ep->aocd && call->metering_info_received && call->metering_connect_units > 0)
|
if(call->isdn_ep->ntmode && call->isdn_ep->aocd && call->metering_info_received && call->metering_connect_units > 0)
|
||||||
{
|
{
|
||||||
PDEBUG(DISDN, DEBUG_DEBUG, "Sending first AOC-D facility, units: %d\n", call->metering_connect_units);
|
|
||||||
call->metering_total_units = call->metering_connect_units;
|
call->metering_total_units = call->metering_connect_units;
|
||||||
|
snd_msg_fac_aocd(call);
|
||||||
memset(&fac, 0, sizeof(fac));
|
|
||||||
fac.Valid = 1;
|
|
||||||
fac.comp = CompInvoke;
|
|
||||||
fac.u.inv.invokeId = 2; /* doesn't matter since no response is expected */
|
|
||||||
fac.u.inv.operationValue = Fac_AOCDChargingUnit;
|
|
||||||
|
|
||||||
fac.u.inv.o.AOCchu.recordedUnits = call->metering_total_units;
|
|
||||||
encodeFac(fac_ie, &fac);
|
|
||||||
|
|
||||||
// sending facility
|
|
||||||
l3m = create_l3msg();
|
|
||||||
enc_ie_facility(l3m, fac_ie + 2, fac_ie[1]);
|
|
||||||
call->isdn_ep->ml3->to_layer3(call->isdn_ep->ml3, MT_FACILITY, call->l3_pid, l3m);
|
|
||||||
|
|
||||||
if(call->metering_unit_period_decisecs > 0) {
|
if(call->metering_unit_period_decisecs > 0) {
|
||||||
PDEBUG(DISDN, DEBUG_DEBUG, "Scheduling AOC-D unit information every %d deciseconds.\n", call->metering_unit_period_decisecs);
|
PDEBUG(DISDN, DEBUG_DEBUG, "Scheduling AOC-D unit information every %d deciseconds.\n", call->metering_unit_period_decisecs);
|
||||||
|
@ -2534,6 +2518,10 @@ void disc_req(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
||||||
enc_ie_display(l3m, display);
|
enc_ie_display(l3m, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* AOC-E */
|
||||||
|
if(call->metering_info_received)
|
||||||
|
enc_ie_fac_aoce(call, l3m);
|
||||||
|
|
||||||
new_state(call, ISDN_STATE_OUT_DISCONNECT);
|
new_state(call, ISDN_STATE_OUT_DISCONNECT);
|
||||||
|
|
||||||
/* send message to ISDN */
|
/* send message to ISDN */
|
||||||
|
@ -2545,8 +2533,6 @@ void disc_req(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
||||||
timer_exit(&call->aocd_unit_timer);
|
timer_exit(&call->aocd_unit_timer);
|
||||||
call->aocd_unit_timer_started = 0;
|
call->aocd_unit_timer_started = 0;
|
||||||
}
|
}
|
||||||
if(call->metering_total_units > 0)
|
|
||||||
generate_aoce_fac(call);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* CC-RELEASE REQUEST */
|
/* CC-RELEASE REQUEST */
|
||||||
|
@ -2579,6 +2565,10 @@ void rel_req(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
||||||
enc_ie_display(l3m, display);
|
enc_ie_display(l3m, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* AOC-E */
|
||||||
|
if(call->metering_info_received)
|
||||||
|
enc_ie_fac_aoce(call, l3m);
|
||||||
|
|
||||||
new_state(call, ISDN_STATE_OUT_RELEASE);
|
new_state(call, ISDN_STATE_OUT_RELEASE);
|
||||||
|
|
||||||
/* send message to ISDN */
|
/* send message to ISDN */
|
||||||
|
@ -2751,4 +2741,3 @@ void cc_message(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg)
|
||||||
|
|
||||||
osmo_cc_free_msg(msg);
|
osmo_cc_free_msg(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue