AOC information as separate facility messages for compatibility (CONNECT-attached AOC-D IE ignored by NT1plus)
This commit is contained in:
parent
45177fa41c
commit
55bf04c9c8
|
@ -186,8 +186,9 @@ static void split_3pty(call_t *call)
|
|||
|
||||
/* Generate AOC-S facility IE from metering information */
|
||||
#define AOCS_CURRENCY_AMOUNT_PER_UNIT 5
|
||||
static void generate_aocs_ie(call_t *call, struct l3_msg *l3m)
|
||||
static void generate_aocs_fac(call_t *call)
|
||||
{
|
||||
struct l3_msg *l3m;
|
||||
uint8_t fac_ie[256];
|
||||
struct asn1_parm fac;
|
||||
|
||||
|
@ -198,7 +199,7 @@ static void generate_aocs_ie(call_t *call, struct l3_msg *l3m)
|
|||
fac.u.inv.invokeId = 2; /* doesn't matter since no response is expected */
|
||||
fac.u.inv.operationValue = Fac_AOCSCurrency;
|
||||
|
||||
LOGP(DISDN, LOGL_DEBUG, "Sending AOC-S information from metering data: connect_units=%d unit_period_decisecs=%d\n", call->metering_connect_units, call->metering_unit_period_decisecs);
|
||||
LOGP(DISDN, LOGL_DEBUG, "Sending AOC-S facility from metering data: connect_units=%d unit_period_decisecs=%d\n", call->metering_connect_units, call->metering_unit_period_decisecs);
|
||||
|
||||
if(call->metering_connect_units == 0) { // Free call
|
||||
LOGP(DISDN, LOGL_DEBUG, "AOC-S currencyInfoList: BasicComm FreeOfCharge\n");
|
||||
|
@ -252,7 +253,11 @@ static void generate_aocs_ie(call_t *call, struct l3_msg *l3m)
|
|||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -266,7 +271,7 @@ static void aocd_timer_cb(void *data)
|
|||
|
||||
call->metering_total_units++;
|
||||
|
||||
LOGP(DISDN, LOGL_DEBUG, "Sending next AOC-D unit information, total_units=%d\n", call->metering_total_units);
|
||||
LOGP(DISDN, LOGL_DEBUG, "Sending next AOC-D facility, total_units=%d\n", call->metering_total_units);
|
||||
|
||||
osmo_timer_schedule(&call->aocd_unit_timer, call->metering_unit_period_decisecs / 10, (call->metering_unit_period_decisecs % 10) * 100000);
|
||||
|
||||
|
@ -2096,18 +2101,18 @@ void proc_req(call_t *call, uint32_t pid, osmo_cc_msg_t *msg, int with_ies)
|
|||
if (rc >= 0 && call->isdn_ep->ntmode)
|
||||
enc_ie_redirection(l3m, type, plan, 1, present, redir);
|
||||
|
||||
/* Metering handling and AOC-S generation */
|
||||
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_ie(call, l3m);
|
||||
}
|
||||
|
||||
skip_ies:
|
||||
new_state(call, ISDN_STATE_IN_PROCEEDING);
|
||||
|
||||
/* send message to ISDN */
|
||||
call->isdn_ep->ml3->to_layer3(call->isdn_ep->ml3, MT_CALL_PROCEEDING, call->l3_pid, l3m);
|
||||
|
||||
/* Metering handling and AOC-S generation */
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/* CC-ALERTING REQUEST */
|
||||
|
@ -2160,17 +2165,17 @@ void alert_req(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
|||
if (rc >= 0 && call->isdn_ep->ntmode)
|
||||
enc_ie_redirection(l3m, type, plan, 1, present, redir);
|
||||
|
||||
/* Metering handling and AOC-S generation */
|
||||
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_ie(call, l3m);
|
||||
}
|
||||
|
||||
new_state(call, ISDN_STATE_IN_ALERTING);
|
||||
|
||||
/* send message to ISDN */
|
||||
call->isdn_ep->ml3->to_layer3(call->isdn_ep->ml3, MT_ALERTING, call->l3_pid, l3m);
|
||||
|
||||
/* Metering handling and AOC-S generation */
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/* CC-CONNECT REQUEST */
|
||||
|
@ -2240,19 +2245,22 @@ void setup_rsp(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
|||
enc_ie_connected_pn(l3m, type, plan, 1, present, screen, connected);
|
||||
}
|
||||
|
||||
new_state(call, ISDN_STATE_IN_CONNECTING);
|
||||
|
||||
/* send message to ISDN */
|
||||
call->isdn_ep->ml3->to_layer3(call->isdn_ep->ml3, MT_CONNECT, call->l3_pid, l3m);
|
||||
|
||||
/* Metering handling and AOC-S generation */
|
||||
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_ie(call, l3m);
|
||||
generate_aocs_fac(call);
|
||||
}
|
||||
|
||||
new_state(call, ISDN_STATE_IN_CONNECTING);
|
||||
|
||||
/* AOC-D handling on connect */
|
||||
if(call->isdn_ep->ntmode && call->isdn_ep->aocd && call->metering_info_received && call->metering_connect_units > 0)
|
||||
{
|
||||
LOGP(DISDN, LOGL_DEBUG, "Attaching AOC-D connect facility, units: %d\n", call->metering_connect_units);
|
||||
LOGP(DISDN, LOGL_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));
|
||||
|
@ -2263,7 +2271,11 @@ void setup_rsp(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
|||
|
||||
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) {
|
||||
LOGP(DISDN, LOGL_DEBUG, "Scheduling AOC-D unit information every %d deciseconds.\n", call->metering_unit_period_decisecs);
|
||||
|
@ -2273,9 +2285,6 @@ void setup_rsp(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
|||
}
|
||||
}
|
||||
|
||||
/* send message to ISDN */
|
||||
call->isdn_ep->ml3->to_layer3(call->isdn_ep->ml3, MT_CONNECT, call->l3_pid, l3m);
|
||||
|
||||
/* in NT mode we might not receive CONNECT ACKNOWLEDGE */
|
||||
if (call->isdn_ep->ntmode) {
|
||||
new_state(call, ISDN_STATE_CONNECT);
|
||||
|
@ -2371,17 +2380,18 @@ void progress_req(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
|||
/* progress information */
|
||||
rc = process_progress(call, msg, l3m, call->state, 0);
|
||||
|
||||
/* Metering handling and AOC-S generation */
|
||||
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_ie(call, l3m);
|
||||
}
|
||||
/* send message to ISDN */
|
||||
if (rc)
|
||||
call->isdn_ep->ml3->to_layer3(call->isdn_ep->ml3, MT_PROGRESS, call->l3_pid, l3m);
|
||||
else
|
||||
free_l3msg(l3m);
|
||||
|
||||
/* Metering handling and AOC-S generation */
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/* CC-NOTIFY REQUEST */
|
||||
|
|
Loading…
Reference in New Issue