From 24cec65fc6d532974c3aa149428f9554287459c2 Mon Sep 17 00:00:00 2001 From: Dennis Grunert Date: Thu, 18 Jan 2024 22:04:21 +0100 Subject: [PATCH] Attaching AOC-E to DISCONNECT or RELEASE; transmit AOC-E even if zero units have been charged; minor function/naming cleanup --- src/isdn/dss1.c | 97 ++++++++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 54 deletions(-) diff --git a/src/isdn/dss1.c b/src/isdn/dss1.c index 261f64d..c30ebc0 100644 --- a/src/isdn/dss1.c +++ b/src/isdn/dss1.c @@ -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 -static void generate_aocs_fac(call_t *call) +static void snd_msg_fac_aocs(call_t *call) { struct l3_msg *l3m; uint8_t fac_ie[256]; @@ -260,14 +260,37 @@ static void generate_aocs_fac(call_t *call) } } -/* Generate AOC-E facility msg */ -static void generate_aoce_fac(call_t *call) +/* Send AOC-D facility msg */ +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]; 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)); fac.Valid = 1; @@ -278,39 +301,18 @@ static void generate_aoce_fac(call_t *call) encodeFac(fac_ie, &fac); - // sending facility - l3m = create_l3msg(); + // attach facility 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 */ 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->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); - - 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); + snd_msg_fac_aocd(call); } /* @@ -907,8 +909,6 @@ void disconnect_ind(call_t *call, uint32_t pid, struct l3_msg *l3m) timer_exit(&call->aocd_unit_timer); call->aocd_unit_timer_started = 0; } - if(call->metering_total_units > 0) - generate_aoce_fac(call); } /* 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)); if(rc >= 0) { 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)); if(rc >= 0) { 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 display[128]; int rc; - uint8_t fac_ie[256]; - struct asn1_parm fac; /* NT-MODE in setup state we must send PROCEEDING first */ 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)); if(rc >= 0) { call->metering_info_received = 1; - generate_aocs_fac(call); + snd_msg_fac_aocs(call); } /* AOC-D handling on connect */ 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; - - 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); + snd_msg_fac_aocd(call); 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); @@ -2534,6 +2518,10 @@ void disc_req(call_t *call, uint32_t pid, osmo_cc_msg_t *msg) 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); /* 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); call->aocd_unit_timer_started = 0; } - if(call->metering_total_units > 0) - generate_aoce_fac(call); } /* 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); } + /* AOC-E */ + if(call->metering_info_received) + enc_ie_fac_aoce(call, l3m); + new_state(call, ISDN_STATE_OUT_RELEASE); /* 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); } -