If AOC-D is disabled for an endpoint, do not send AOC-E; send AOC-D with zero units to indicate free of charge call; renamed aocd_timer to metering_unit_timer
This commit is contained in:
parent
24cec65fc6
commit
e77106612c
|
@ -267,21 +267,22 @@ static void snd_msg_fac_aocd(call_t *call)
|
|||
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);
|
||||
if(call->isdn_ep->ntmode && call->isdn_ep->aocd && call->metering_info_received) {
|
||||
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;
|
||||
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);
|
||||
|
||||
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);
|
||||
// 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 */
|
||||
|
@ -290,28 +291,29 @@ static void enc_ie_fac_aoce(call_t *call, struct l3_msg *l3m)
|
|||
uint8_t fac_ie[256];
|
||||
struct asn1_parm fac;
|
||||
|
||||
PDEBUG(DISDN, DEBUG_DEBUG, "Attaching AOC-E facility, total units: %d\n", call->metering_total_units);
|
||||
if(call->isdn_ep->ntmode && call->isdn_ep->aocd && call->metering_info_received) {
|
||||
PDEBUG(DISDN, DEBUG_DEBUG, "Attaching AOC-E facility, total 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_AOCEChargingUnit;
|
||||
fac.u.inv.o.AOCchu.recordedUnits = 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_AOCEChargingUnit;
|
||||
fac.u.inv.o.AOCchu.recordedUnits = call->metering_total_units;
|
||||
encodeFac(fac_ie, &fac);
|
||||
|
||||
encodeFac(fac_ie, &fac);
|
||||
|
||||
// attach facility
|
||||
enc_ie_facility(l3m, fac_ie + 2, fac_ie[1]);
|
||||
// attach facility
|
||||
enc_ie_facility(l3m, fac_ie + 2, fac_ie[1]);
|
||||
}
|
||||
}
|
||||
|
||||
/* AOC-D timer callback */
|
||||
static void aocd_timer_cb(void *data)
|
||||
/* Metering unit timer callback */
|
||||
static void metering_unit_timer_cb(void *data)
|
||||
{
|
||||
call_t *call = data;
|
||||
|
||||
call->metering_total_units++;
|
||||
timer_start(&call->aocd_unit_timer, (double)call->metering_unit_period_decisecs / (double)10);
|
||||
timer_start(&call->metering_unit_timer, (double)call->metering_unit_period_decisecs / (double)10);
|
||||
snd_msg_fac_aocd(call);
|
||||
}
|
||||
|
||||
|
@ -487,7 +489,7 @@ void setup_ind(call_t *call, uint32_t pid, struct l3_msg *l3m)
|
|||
|
||||
/* reset AOC information */
|
||||
call->metering_info_received = 0;
|
||||
call->aocd_unit_timer_started = 0;
|
||||
call->metering_unit_timer_started = 0;
|
||||
call->metering_total_units = 0;
|
||||
|
||||
new_state(call, ISDN_STATE_IN_SETUP);
|
||||
|
@ -904,10 +906,10 @@ void disconnect_ind(call_t *call, uint32_t pid, struct l3_msg *l3m)
|
|||
osmo_cc_ll_msg(&call->isdn_ep->cc_ep, call->cc_callref, msg);
|
||||
|
||||
/* stop AOC-D timer and send AOC-E facility */
|
||||
if(call->aocd_unit_timer_started) {
|
||||
timer_stop(&call->aocd_unit_timer);
|
||||
timer_exit(&call->aocd_unit_timer);
|
||||
call->aocd_unit_timer_started = 0;
|
||||
if(call->metering_unit_timer_started) {
|
||||
timer_stop(&call->metering_unit_timer);
|
||||
timer_exit(&call->metering_unit_timer);
|
||||
call->metering_unit_timer_started = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2282,16 +2284,15 @@ void setup_rsp(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
|||
}
|
||||
|
||||
/* 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->metering_info_received) {
|
||||
call->metering_total_units = call->metering_connect_units;
|
||||
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);
|
||||
call->aocd_unit_timer_started = 1;
|
||||
timer_init(&call->aocd_unit_timer, aocd_timer_cb, call);
|
||||
timer_start(&call->aocd_unit_timer, (double)call->metering_unit_period_decisecs / (double)10);
|
||||
PDEBUG(DISDN, DEBUG_DEBUG, "Scheduling metering unit timer every %d deciseconds.\n", call->metering_unit_period_decisecs);
|
||||
call->metering_unit_timer_started = 1;
|
||||
timer_init(&call->metering_unit_timer, metering_unit_timer_cb, call);
|
||||
timer_start(&call->metering_unit_timer, (double)call->metering_unit_period_decisecs / (double)10);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2519,8 +2520,7 @@ void disc_req(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
|||
}
|
||||
|
||||
/* AOC-E */
|
||||
if(call->metering_info_received)
|
||||
enc_ie_fac_aoce(call, l3m);
|
||||
enc_ie_fac_aoce(call, l3m);
|
||||
|
||||
new_state(call, ISDN_STATE_OUT_DISCONNECT);
|
||||
|
||||
|
@ -2528,10 +2528,10 @@ void disc_req(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
|||
call->isdn_ep->ml3->to_layer3(call->isdn_ep->ml3, MT_DISCONNECT, call->l3_pid, l3m);
|
||||
|
||||
/* stop AOC-D timer and send AOC-E facility */
|
||||
if(call->aocd_unit_timer_started) {
|
||||
timer_stop(&call->aocd_unit_timer);
|
||||
timer_exit(&call->aocd_unit_timer);
|
||||
call->aocd_unit_timer_started = 0;
|
||||
if(call->metering_unit_timer_started) {
|
||||
timer_stop(&call->metering_unit_timer);
|
||||
timer_exit(&call->metering_unit_timer);
|
||||
call->metering_unit_timer_started = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2566,8 +2566,7 @@ void rel_req(call_t *call, uint32_t pid, osmo_cc_msg_t *msg)
|
|||
}
|
||||
|
||||
/* AOC-E */
|
||||
if(call->metering_info_received)
|
||||
enc_ie_fac_aoce(call, l3m);
|
||||
enc_ie_fac_aoce(call, l3m);
|
||||
|
||||
new_state(call, ISDN_STATE_OUT_RELEASE);
|
||||
|
||||
|
|
|
@ -108,16 +108,16 @@ typedef struct isdn {
|
|||
void *l2inst;
|
||||
ph_socket_t *ph_socket;
|
||||
pthread_mutex_t upqueue_lock;
|
||||
struct mqueue upqueue;
|
||||
struct mqueue upqueue;
|
||||
int upqueue_initialized;
|
||||
int upqueue_pipe[2];
|
||||
struct osmo_fd upqueue_ofd;
|
||||
struct mlayer3 *ml3;
|
||||
int los, ais, rdi, slip_rx, slip_tx;
|
||||
int l1link; /* current state */
|
||||
int l2link; /* current state */
|
||||
struct mlayer3 *ml3;
|
||||
int los, ais, rdi, slip_rx, slip_tx;
|
||||
int l1link; /* current state */
|
||||
int l2link; /* current state */
|
||||
struct timer l2establish_timer;
|
||||
int b_num;
|
||||
int b_num;
|
||||
int b_reserved;
|
||||
int b_mode[128];
|
||||
int b_state[128];
|
||||
|
@ -127,7 +127,7 @@ typedef struct isdn {
|
|||
struct b_timer_inst b_timer_inst[128];
|
||||
uint8_t b_buffer[128][160];
|
||||
int b_buffer_pos[128];
|
||||
unsigned char l2mask[16]; /* 128 bits for each tei */
|
||||
unsigned char l2mask[16]; /* 128 bits for each tei */
|
||||
|
||||
/* bridging */
|
||||
int bridge_possible;
|
||||
|
@ -141,7 +141,7 @@ typedef struct isdn {
|
|||
|
||||
typedef struct call_list {
|
||||
struct call_list *next;
|
||||
isdn_t *isdn_ep;
|
||||
isdn_t *isdn_ep;
|
||||
|
||||
/* mISDN states */
|
||||
uint32_t l3_pid;
|
||||
|
@ -184,8 +184,8 @@ typedef struct call_list {
|
|||
int park_len;
|
||||
uint8_t park_callid[8];
|
||||
/* metering/AOC-D/AOC-S */
|
||||
struct timer aocd_unit_timer;
|
||||
int aocd_unit_timer_started;
|
||||
struct timer metering_unit_timer;
|
||||
int metering_unit_timer_started;
|
||||
int metering_info_received;
|
||||
uint16_t metering_connect_units;
|
||||
uint16_t metering_unit_period_decisecs;
|
||||
|
|
Loading…
Reference in New Issue