TUTORIAL Viewing Call Stats: Packet Loss, MOS, Buffers and more

synack

Guru
Joined
Dec 31, 2013
Messages
227
Reaction score
56
OK big update to the [macro-hangupcall-custom]
It was a bit of a pain as the documentation (even what is in the asterisk source code) is incorrect. I had to dig out the actual variable names from other parts of the source code.

Its quite large so i have commented out some of the database lines I feel are useless either because I only just get zeros or I just don't want them. Feel free to adjust to your own personal taste.

I cannot vouch for the validity of this data, as it's provided by the SIP channel driver.
Speaking of which, this will need to be updated/modified to work with pjsip

As always, this is beta code. It runs fine on *my* asterisk 11/freepbx 11, but use at your own caution.

Code:
[macro-hangupcall-custom]
; start of QoS reporting
exten => s,1,NoOp(Start QoS)
exten => s,n,NoOp(Local Stream ID: ${CHANNEL(rtpqos,audio,local_ssrc)})
exten => s,n,NoOp(Remote Stream ID: ${CHANNEL(rtpqos,audio,remote_ssrc)})
exten => s,n,NoOp(Packets Sent: ${CHANNEL(rtpqos,audio,txcount)})
exten => s,n,NoOp(Packets Received: ${CHANNEL(rtpqos,audio,rxcount)})
exten => s,n,NoOp(Local RX Packet Loss Max: ${CHANNEL(rtpqos,audio,local_maxrxploss)})
exten => s,n,NoOp(Local RX Packet Loss Min: ${CHANNEL(rtpqos,audio,local_minrxploss)})
exten => s,n,NoOp(Local RX Packet Loss: ${CHANNEL(rtpqos,audio,rxploss)})
exten => s,n,NoOp(Local RX Packet Loss Norm Dev: ${CHANNEL(rtpqos,audio,local_normdevrxploss)})
exten => s,n,NoOp(Local RX Packet Loss Std Dev: ${CHANNEL(rtpqos,audio,local_stdevrxploss)})
exten => s,n,NoOp(Local TX Packet Loss: ${CHANNEL(rtpqos,audio,txploss)})
exten => s,n,NoOp(Remote RX Packet Loss Max: ${CHANNEL(rtpqos,audio,remote_maxrxploss)})
exten => s,n,NoOp(Remote RX Packet Loss Min: ${CHANNEL(rtpqos,audio,remote_minrxploss)})
exten => s,n,NoOp(Remote RX Packet Loss Norm Deviation: ${CHANNEL(rtpqos,audio,remote_normdevrxploss)})
exten => s,n,NoOp(Remote RX Packet Loss Std Deviation: ${CHANNEL(rtpqos,audio,remote_stdevrxploss)})
exten => s,n,NoOp(Round Trip Time: ${CHANNEL(rtpqos,audio,rtt)})
exten => s,n,NoOp(Round Trip Time Max: ${CHANNEL(rtpqos,audio,maxrtt)})
exten => s,n,NoOp(Round Trip Time Min: ${CHANNEL(rtpqos,audio,minrtt)})
exten => s,n,NoOp(Round Trip Time Norm Dev: ${CHANNEL(rtpqos,audio,normdevrtt)})
exten => s,n,NoOp(Round Trip Time Std Dev: ${CHANNEL(rtpqos,audio,stdevrtt)})
exten => s,n,NoOp(Local RX Jitter: ${CHANNEL(rtpqos,audio,rxjitter)})
exten => s,n,NoOp(Local TX Jitter: ${CHANNEL(rtpqos,audio,txjitter)})
exten => s,n,NoOp(Local Jitter Max: ${CHANNEL(rtpqos,audio,local_maxjitter)})
exten => s,n,NoOp(Local Jitter Min: ${CHANNEL(rtpqos,audio,local_minjitter)})
exten => s,n,NoOp(Local Jitter Norm Dev: ${CHANNEL(rtpqos,audio,local_normdevjitter)})
exten => s,n,NoOp(Local Jitter Std Dev: ${CHANNEL(rtpqos,audio,local_stdevjitter)})
exten => s,n,NoOp(Remote Jitter Max: ${CHANNEL(rtpqos,audio,remote_maxjitter)})
exten => s,n,NoOp(Remote Jitter Min: ${CHANNEL(rtpqos,audio,remote_minjitter)})
exten => s,n,NoOp(Remote Jitter Norm Dev: ${CHANNEL(rtpqos,audio,remote_normdevjitter)})
exten => s,n,NoOp(Remote Jitter Std Dev: ${CHANNEL(rtpqos,audio,remote_stdevjitter)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local Stream ID: ${CHANNEL(rtpqos,audio,local_ssrc)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote Stream ID: ${CHANNEL(rtpqos,audio,remote_ssrc)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Packets Sent: ${CHANNEL(rtpqos,audio,txcount)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Packets Received: ${CHANNEL(rtpqos,audio,rxcount)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local RX Packet Loss Max: ${CHANNEL(rtpqos,audio,local_maxrxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local RX Packet Loss Min: ${CHANNEL(rtpqos,audio,local_minrxploss)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local RX Packet Loss: ${CHANNEL(rtpqos,audio,rxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local RX Packet Loss Norm Dev: ${CHANNEL(rtpqos,audio,local_normdevrxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local RX Packet Loss Std Dev: ${CHANNEL(rtpqos,audio,local_stdevrxploss)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local TX Packet Loss: ${CHANNEL(rtpqos,audio,txploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote RX Packet Loss Max: ${CHANNEL(rtpqos,audio,remote_maxrxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote RX Packet Loss Min: ${CHANNEL(rtpqos,audio,remote_minrxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote RX Packet Loss Norm Deviation: ${CHANNEL(rtpqos,audio,remote_normdevrxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote RX Packet Loss Std Deviation: ${CHANNEL(rtpqos,audio,remote_stdevrxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Round Trip Time: ${CHANNEL(rtpqos,audio,rtt)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Round Trip Time Max: ${CHANNEL(rtpqos,audio,maxrtt)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Round Trip TIme Min: ${CHANNEL(rtpqos,audio,minrtt)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Round Trip Time Norm Dev: ${CHANNEL(rtpqos,audio,normdevrtt)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Round Trip Time Std Dev: ${CHANNEL(rtpqos,audio,stdevrtt)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local RX Jitter: ${CHANNEL(rtpqos,audio,rxjitter)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local TX Jitter: ${CHANNEL(rtpqos,audio,txjitter)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local Jitter Max: ${CHANNEL(rtpqos,audio,local_maxjitter)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local Jitter Min: ${CHANNEL(rtpqos,audio,local_minjitter)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local Jitter Norm Dev: ${CHANNEL(rtpqos,audio,local_normdevjitter)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local Jitter Std Dev: ${CHANNEL(rtpqos,audio,local_stdevjitter)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote Jitter Max: ${CHANNEL(rtpqos,audio,remote_maxjitter)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote Jitter Min: ${CHANNEL(rtpqos,audio,remote_minjitter)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote Jitter Norm Dev: ${CHANNEL(rtpqos,audio,remote_normdevjitter)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote Jitter Std Dev: ${CHANNEL(rtpqos,audio,remote_stdevjitter)})
exten => s,n(continue),NoOp(End of QoS)
 

CoinTos

Member
Joined
Jan 5, 2012
Messages
34
Reaction score
7
synack Wow, that is amazing, that will be real handy. While you were working on this, and out of my own curiosity, does it look like something like this could be done for IAX?

Also, you have a capital 'I' in 'Time' on line 20.
 

synack

Guru
Joined
Dec 31, 2013
Messages
227
Reaction score
56
synack Wow, that is amazing, that will be real handy. While you were working on this, and out of my own curiosity, does it look like something like this could be done for IAX?

Also, you have a capital 'I' in 'Time' on line 20.
Thanks, the real kudos go to the code maintainers, I just rewrapped two existing things into one new one.
Good catch thanks. I've updated the "I" above.
As for IAX, Unless I'm missing something ,no. I don't believe IAX provides the QoS statistics that the SIP or PJSIP drivers do.
 

krzykat

Telecom Strategist
Joined
Aug 2, 2008
Messages
3,149
Reaction score
1,238
This is EXCELLENT. I think Ward should have this in by default on builds as I can't see a single negative to having access to this information. If someone didn't want all that info, you could probably use: https://www.pingman.com/kb/article/how-is-mos-calculated-in-pingplotter-pro-50.html to come up with the necessary calculation to just display the MOS.

Hat's off to Synack - There's lots of stuff out there, but those that put them together and share the info get my respect.
 
Joined
Apr 8, 2015
Messages
40
Reaction score
13
Amazing! This works perfectly.
Confirmed working on Incredible GUI 12 running on CentOS 6.5 as well
 

atsak

Guru
Joined
Sep 7, 2009
Messages
2,386
Reaction score
440
Working on my 11/2.11 install - have IAX trunks which generates a bit of extra garbage in the log file (does not exist) but that's probably fine. Maybe a way to exit if it's IAX, not sure - no use at programming.
 

Mike_S

New Member
Joined
Jul 7, 2009
Messages
19
Reaction score
0
Logging this information is a great tool.
It's my understanding that when a call is placed two channels are used: The "local" channel and the "bridged" channel. Please correct me if I am wrong but this is only logging the "local" channel stats. I'm trying to find a means to log the stats from both channels. I would like this because my PBX is housed in a data center and it would be valuable to determine which leg of the call experienced issues.

I can see the information that I would like to record in the CDR using this command:

watch -n 1 'asterisk -rx "sip show channelstats"'
 

dicko

Still learning but earning
Joined
Oct 30, 2015
Messages
1,634
Reaction score
846
Unfortunately channelstats data is only available while the channel is active, look to turning on rtcp

rtcp set stats on ; for channel stats
rtcp set debug on ; for grins and info

you should see the data as it is generated in the cli;

Search google for apps that can monitor the stats data and handle/respond/report accordingly.

I guess a well constructed agi script could add whatever to your cdr reports if the earlier posts n this thread don't cover.
 
Last edited:

krzykat

Telecom Strategist
Joined
Aug 2, 2008
Messages
3,149
Reaction score
1,238
Anyone having the extensions_override_freepbx working properly? on the latest incrediblepbx? Not seeing it run to populate my CDR's with lost packet stats.
 

edlentz

Member
Joined
Aug 11, 2013
Messages
87
Reaction score
5
I know this is an old thread but I just found it. I appended the two files with the code and restarted Asterisk. I placed a couple of phone to phone calls. The calls appear in the CDR log and the CEL , but the additional info is missing. Where will that info be found??
Thanks
 

kev11

New Member
Joined
Apr 18, 2017
Messages
2
Reaction score
0
I just recently came across this thread as I was investigating on how to implement QoS for a FreePBX system. I decided to try out the update posted by synack and it works very well for the most part. Thanks for posting.

There's a small issue I need help with though. I'm able to get the statistics on the full asterisk log. However, for the master.csv log, I only get entries when a call goes into voicemail. Nothing is recorded in the userfield for an answered voice call. Would anyone be able to shed some light on this issue?

I've attached two snippets of the full log for both cases if it will help to shed some light. You'll notice that for the one that goes into voicemail appends the values in the userfield. The answered call seems to handle the stats separately and in the master.csv, the field is empty.

Log of a call that goes into voicemail
[2017-04-18 16:59:24] VERBOSE[6459][C-00000009] pbx.c: Executing [s@macro-hangupcall-custom:31] Set("PJSIP/1001-0000000a", "CDR(userfield)= Packets Sent: 949") in new stack
[2017-04-18 16:59:24] VERBOSE[6459][C-00000009] pbx.c: Executing [s@macro-hangupcall-custom:32] Set("PJSIP/1001-0000000a", "CDR(userfield)= Packets Sent: 949 Packets Received: 945") in new stack
[2017-04-18 16:59:24] VERBOSE[6459][C-00000009] pbx.c: Executing [s@macro-hangupcall-custom:33] Set("PJSIP/1001-0000000a", "CDR(userfield)= Packets Sent: 949 Packets Received: 945 Local RX Packet Loss: 0") in new stack
[2017-04-18 16:59:24] VERBOSE[6459][C-00000009] pbx.c: Executing [s@macro-hangupcall-custom:34] Set("PJSIP/1001-0000000a", "CDR(userfield)= Packets Sent: 949 Packets Received: 945 Local RX Packet Loss: 0 Local TX Packet Loss: 10") in new stack
[2017-04-18 16:59:24] VERBOSE[6459][C-00000009] pbx.c: Executing [s@macro-hangupcall-custom:35] Set("PJSIP/1001-0000000a", "CDR(userfield)= Packets Sent: 949 Packets Received: 945 Local RX Packet Loss: 0 Local TX Packet Loss: 10 Local RX Jitter: 0.000000") in new stack
[2017-04-18 16:59:24] VERBOSE[6459][C-00000009] pbx.c: Executing [s@macro-hangupcall-custom:36] Set("PJSIP/1001-0000000a", "CDR(userfield)= Packets Sent: 949 Packets Received: 945 Local RX Packet Loss: 0 Local TX Packet Loss: 10 Local RX Jitter: 0.000000 Local TX Jitter: 0.001390") in new stack
[2017-04-18 16:59:24] VERBOSE[6459][C-00000009] pbx.c: Executing [s@macro-hangupcall-custom:37] Set("PJSIP/1001-0000000a", "CDR(userfield)= Packets Sent: 949 Packets Received: 945 Local RX Packet Loss: 0 Local TX Packet Loss: 10 Local RX Jitter: 0.000000 Local TX Jitter: 0.001390 Local Jitter Max: 0.004907") in new stack
[2017-04-18 16:59:24] VERBOSE[6459][C-00000009] pbx.c: Executing [s@macro-hangupcall-custom:38] Set("PJSIP/1001-0000000a", "CDR(userfield)= Packets Sent: 949 Packets Received: 945 Local RX Packet Loss: 0 Local TX Packet Loss: 10 Local RX Jitter: 0.000000 Local TX Jitter: 0.001390 Local Jitter Max: 0.004907 Local Jitter Min: 0.000182") in new stack
[2017-04-18 16:59:24] VERBOSE[6459][C-00000009] pbx.c: Executing [s@macro-hangupcall-custom:39] Set("PJSIP/1001-0000000a", "CDR(userfield)= Packets Sent: 949 Packets Received: 945 Local RX Packet Loss: 0 Local TX Packet Loss: 10 Local RX Jitter: 0.000000 Local TX Jitter: 0.001390 Local Jitter Max: 0.004907 Local Jitter Min: 0.000182 Local Jitter Norm Dev: 0.001657") in new stack
[2017-04-18 16:59:24] VERBOSE[6459][C-00000009] pbx.c: Executing [s@macro-hangupcall-custom:40] Set("PJSIP/1001-0000000a", "CDR(userfield)= Packets Sent: 949 Packets Received: 945 Local RX Packet Loss: 0 Local TX Packet Loss: 10 Local RX Jitter: 0.000000 Local TX Jitter: 0.001390 Local Jitter Max: 0.004907 Local Jitter Min: 0.000182 Local Jitter Norm Dev: 0.001657 Local Jitter Std Dev: inf") in new stack
[2017-04-18 16:59:24] VERBOSE[6459][C-00000009] pbx.c: Executing [s@macro-hangupcall-custom:41] NoOp("PJSIP/1001-0000000a", "End of QoS") in new stack

Log of an answered call

[2017-04-18 16:51:59] VERBOSE[5817][C-00000008] pbx.c: Executing [s@macro-hangupcall-custom:31] Set("PJSIP/1000-00000008", "CDR(userfield)= Packets Sent: 708") in new stack
[2017-04-18 16:51:59] VERBOSE[5817][C-00000008] pbx.c: Executing [s@macro-hangupcall-custom:32] Set("PJSIP/1000-00000008", "CDR(userfield)= Packets Received: 678") in new stack
[2017-04-18 16:51:59] VERBOSE[5817][C-00000008] pbx.c: Executing [s@macro-hangupcall-custom:33] Set("PJSIP/1000-00000008", "CDR(userfield)= Local RX Packet Loss: 1") in new stack
[2017-04-18 16:51:59] VERBOSE[5817][C-00000008] pbx.c: Executing [s@macro-hangupcall-custom:34] Set("PJSIP/1000-00000008", "CDR(userfield)= Local TX Packet Loss: 0") in new stack
[2017-04-18 16:51:59] VERBOSE[5817][C-00000008] pbx.c: Executing [s@macro-hangupcall-custom:35] Set("PJSIP/1000-00000008", "CDR(userfield)= Local RX Jitter: 0.000000") in new stack
[2017-04-18 16:51:59] VERBOSE[5817][C-00000008] pbx.c: Executing [s@macro-hangupcall-custom:36] Set("PJSIP/1000-00000008", "CDR(userfield)= Local TX Jitter: 0.003770") in new stack
[2017-04-18 16:51:59] VERBOSE[5817][C-00000008] pbx.c: Executing [s@macro-hangupcall-custom:37] Set("PJSIP/1000-00000008", "CDR(userfield)= Local Jitter Max: 0.006412") in new stack
[2017-04-18 16:51:59] VERBOSE[5817][C-00000008] pbx.c: Executing [s@macro-hangupcall-custom:38] Set("PJSIP/1000-00000008", "CDR(userfield)= Local Jitter Min: 0.000181") in new stack
[2017-04-18 16:51:59] VERBOSE[5817][C-00000008] pbx.c: Executing [s@macro-hangupcall-custom:39] Set("PJSIP/1000-00000008", "CDR(userfield)= Local Jitter Norm Dev: 0.003543") in new stack
[2017-04-18 16:51:59] VERBOSE[5817][C-00000008] pbx.c: Executing [s@macro-hangupcall-custom:40] Set("PJSIP/1000-00000008", "CDR(userfield)= Local Jitter Std Dev: inf") in new stack
[2017-04-18 16:51:59] VERBOSE[5817][C-00000008] pbx.c: Executing [s@macro-hangupcall-custom:41] NoOp("PJSIP/1000-00000008", "End of QoS") in new stack

Example of how the calls appear in Master.csv
"""CallerID"" <1001>","1001","1000","ext-local","PJSIP/1001-0000000a","","VoiceMail","1000@default,u","2017-04-18 16:59:04","2017-04-18 16:59:04","2017-04-18 16:59:24","19","19","ANSWERED","DOCUMENTATION","","1492498729.28"," Packets Sent: 949 Packets Received: 945 Local RX Packet Loss: 0 Local TX Packet Loss: 10 Local RX Jitter: 0.000000 Local TX Jitter: 0.001390 Local Jitter Max: 0.004907 Local Jitter Min: 0.000182 Local Jitter Norm Dev: 0.001657 Local Jitter Std Dev: inf",15,,
"""CallerID"" <1001>","1001","1000","ext-local","PJSIP/1001-0000000c","PJSIP/1000-0000000d","Dial","PJSIP/1000/sip:[email protected]:53262;rinstance=2e3edd9552ea87ec,15,TtrIb(func-a","2017-04-18 17:07:52","2017-04-18 17:07:57","2017-04-18 17:08:46","53","48","ANSWERED","DOCUMENTATION","","1492499272.35","",16,,


Would really appreciate the help to solve this.
 

edlentz

Member
Joined
Aug 11, 2013
Messages
87
Reaction score
5
kev11

Where is the Master.csv file you are referencing. I applied the changes and my /var/log/asterisk/cdr-csv/Master.csv is empty
 

kev11

New Member
Joined
Apr 18, 2017
Messages
2
Reaction score
0
kev11

Where is the Master.csv file you are referencing. I applied the changes and my /var/log/asterisk/cdr-csv/Master.csv is empty

I have it both under /var/log/asterisk/cdr-csv/ and /var/log/asterisk/cdr-custom/

I achieved this by adding a custom cdr config file within the asterisk folder: /etc/asterisk/cdr_custom.conf

The contents of cdr_custom.conf below:
Code:
[mappings]
Master.csv => ${CSV_QUOTE(${CDR(clid)})},${CSV_QUOTE(${CDR(src)})},${CSV_QUOTE(${CDR(dst)})},${CSV_QUOTE(${CDR(dcontext)})},${CSV_QUOTE(${CDR(channel)})},${CSV_QUOTE(${CDR(dstchannel)})},${CSV_QUOTE(${CDR(lastapp)})},${CSV_QUOTE(${CDR(lastdata)})},${CSV_QUOTE(${CDR(start)})},${CSV_QUOTE(${CDR(answer)})},${CSV_QUOTE(${CDR(end)})},${CSV_QUOTE(${CDR(duration)})},${CSV_QUOTE(${CDR(billsec)})},${CSV_QUOTE(${CDR(disposition)})},${CSV_QUOTE(${CDR(amaflags)})},${CSV_QUOTE(${CDR(accountcode)})},${CSV_QUOTE(${CDR(uniqueid)})},${CSV_QUOTE(${CDR(userfield)})},${CDR(sequence)},${CDR(callid)},${CDR(rtcpinfo)}
 

edlentz

Member
Joined
Aug 11, 2013
Messages
87
Reaction score
5
kev11,
I get the same info you get, only from a call to voicemail. There is alot more info in the full log. I like they way the info is put into the userfield of the CDR. Can the other info be added to your [mappings] ? Having this in the CDR report module will be a great value for my users.
 

edlentz

Member
Joined
Aug 11, 2013
Messages
87
Reaction score
5
kev11

I added your code to cdr.conf and got the info in the userfield of the cdr report. I am testing on my test system that only has one phone on it at the moment.
 

Sergi

New Member
Joined
Jul 3, 2018
Messages
1
Reaction score
0
Hello.
My question might seem fool, but I would like to clarify about rtpqos of CHANNEL function.
At the point of view Asterisk acting as b2bua, each two-way call, we know, has two leg: first one is when it is UAS for call initiator, and the other one - is UAC for responder (in sip terminology). Both legs have two-way media exchange with clients: transmit and receive. It's basis.
Let's take few argumets of rtpqos: "txlost" and "rxlost". Do they mean media packets to be lost between call initiator and Asterisk when they transmitting and receiving respectively?
And there is the "remote_normdevrxploss" argument for example. Whether it mean packets to lose when they are received from responder to Asterisk?
Do I understand right?
 

Joseph Hayhoe

New Member
Joined
Nov 8, 2018
Messages
1
Reaction score
1
If anyone needs it here are the updated values to match pjsip pulled from:

https://wiki.asterisk.org/wiki/display/AST/Asterisk+13+Function_CHANNEL

Code:
[macro-hangupcall-custom]
; start of QoS reporting
exten => s,1,NoOp(Start QoS)
exten => s,n,NoOp(Local Stream ID: ${CHANNEL(rtcp,local_ssrc)})
exten => s,n,NoOp(Remote Stream ID: ${CHANNEL(rtcp,remote_ssrc)})
exten => s,n,NoOp(Packets Sent: ${CHANNEL(rtcp,txcount)})
exten => s,n,NoOp(Packets Received: ${CHANNEL(rtcp,rxcount)})
exten => s,n,NoOp(Local RX Packet Loss Max: ${CHANNEL(rtcp,local_maxrxploss)})
exten => s,n,NoOp(Local RX Packet Loss Min: ${CHANNEL(rtcp,local_minrxploss)})
exten => s,n,NoOp(Local RX Packet Loss: ${CHANNEL(rtcp,rxploss)})
exten => s,n,NoOp(Local RX Packet Loss Norm Dev: ${CHANNEL(rtcp,local_normdevrxploss)})
exten => s,n,NoOp(Local RX Packet Loss Std Dev: ${CHANNEL(rtcp,local_stdevrxploss)})
exten => s,n,NoOp(Local TX Packet Loss: ${CHANNEL(rtcp,txploss)})
exten => s,n,NoOp(Remote RX Packet Loss Max: ${CHANNEL(rtcp,remote_maxrxploss)})
exten => s,n,NoOp(Remote RX Packet Loss Min: ${CHANNEL(rtcp,remote_minrxploss)})
exten => s,n,NoOp(Remote RX Packet Loss Norm Deviation: ${CHANNEL(rtcp,remote_normdevrxploss)})
exten => s,n,NoOp(Remote RX Packet Loss Std Deviation: ${CHANNEL(rtcp,remote_stdevrxploss)})
exten => s,n,NoOp(Round Trip Time: ${CHANNEL(rtcp,rtt)})
exten => s,n,NoOp(Round Trip Time Max: ${CHANNEL(rtcp,maxrtt)})
exten => s,n,NoOp(Round Trip Time Min: ${CHANNEL(rtcp,minrtt)})
exten => s,n,NoOp(Round Trip Time Norm Dev: ${CHANNEL(rtcp,normdevrtt)})
exten => s,n,NoOp(Round Trip Time Std Dev: ${CHANNEL(rtcp,stdevrtt)})
exten => s,n,NoOp(Local RX Jitter: ${CHANNEL(rtcp,rxjitter)})
exten => s,n,NoOp(Local TX Jitter: ${CHANNEL(rtcp,txjitter)})
exten => s,n,NoOp(Local Jitter Max: ${CHANNEL(rtcp,local_maxjitter)})
exten => s,n,NoOp(Local Jitter Min: ${CHANNEL(rtcp,local_minjitter)})
exten => s,n,NoOp(Local Jitter Norm Dev: ${CHANNEL(rtcp,local_normdevjitter)})
exten => s,n,NoOp(Local Jitter Std Dev: ${CHANNEL(rtcp,local_stdevjitter)})
exten => s,n,NoOp(Remote Jitter Max: ${CHANNEL(rtcp,remote_maxjitter)})
exten => s,n,NoOp(Remote Jitter Min: ${CHANNEL(rtcp,remote_minjitter)})
exten => s,n,NoOp(Remote Jitter Norm Dev: ${CHANNEL(rtcp,remote_normdevjitter)})
exten => s,n,NoOp(Remote Jitter Std Dev: ${CHANNEL(rtcp,remote_stdevjitter)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local Stream ID: ${CHANNEL(rtcp,local_ssrc)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote Stream ID: ${CHANNEL(rtcp,remote_ssrc)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Packets Sent: ${CHANNEL(rtcp,txcount)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Packets Received: ${CHANNEL(rtcp,rxcount)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local RX Packet Loss Max: ${CHANNEL(rtcp,local_maxrxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local RX Packet Loss Min: ${CHANNEL(rtcp,local_minrxploss)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local RX Packet Loss: ${CHANNEL(rtcp,rxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local RX Packet Loss Norm Dev: ${CHANNEL(rtcp,local_normdevrxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local RX Packet Loss Std Dev: ${CHANNEL(rtcp,local_stdevrxploss)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local TX Packet Loss: ${CHANNEL(rtcp,txploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote RX Packet Loss Max: ${CHANNEL(rtcp,remote_maxrxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote RX Packet Loss Min: ${CHANNEL(rtcp,remote_minrxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote RX Packet Loss Norm Deviation: ${CHANNEL(rtcp,remote_normdevrxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote RX Packet Loss Std Deviation: ${CHANNEL(rtcp,remote_stdevrxploss)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Round Trip Time: ${CHANNEL(rtcp,rtt)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Round Trip Time Max: ${CHANNEL(rtcp,maxrtt)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Round Trip TIme Min: ${CHANNEL(rtcp,minrtt)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Round Trip Time Norm Dev: ${CHANNEL(rtcp,normdevrtt)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Round Trip Time Std Dev: ${CHANNEL(rtcp,stdevrtt)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local RX Jitter: ${CHANNEL(rtcp,rxjitter)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local TX Jitter: ${CHANNEL(rtcp,txjitter)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local Jitter Max: ${CHANNEL(rtcp,local_maxjitter)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local Jitter Min: ${CHANNEL(rtcp,local_minjitter)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local Jitter Norm Dev: ${CHANNEL(rtcp,local_normdevjitter)})
exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Local Jitter Std Dev: ${CHANNEL(rtcp,local_stdevjitter)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote Jitter Max: ${CHANNEL(rtcp,remote_maxjitter)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote Jitter Min: ${CHANNEL(rtcp,remote_minjitter)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote Jitter Norm Dev: ${CHANNEL(rtcp,remote_normdevjitter)})
;exten => s,n,Set(CDR(userfield)=${CDR(userfield)} Remote Jitter Std Dev: ${CHANNEL(rtcp,remote_stdevjitter)})
exten => s,n(continue),NoOp(End of QoS)
 

Members online

Forum statistics

Threads
25,819
Messages
167,800
Members
19,247
Latest member
abuhyder
Get 3CX - Absolutely Free!

Link up your team and customers Phone System Live Chat Video Conferencing

Hosted or Self-managed. Up to 10 users free forever. No credit card. Try risk free.

3CX
A 3CX Account with that email already exists. You will be redirected to the Customer Portal to sign in or reset your password if you've forgotten it.
Top