You are on page 1of 4

Advice of Charge

Written by: David Vossel


Initial version: 04-19-2010
Email: dvossel@digium.com
This document is designed to give an overview of how to configure and generate Advice of
Charge along with a detailed explanation of how each option works.
Read This First

PLEASE REPORT ANY ISSUES ENCOUNTERED WHILE USING AOC. This feature has had
very little community feedback so far. If you are using this feature please share with us any
problems you are having and any improvements that could make this feature more useful. Thank
you!
Terminology

AOC: Advice of Charge


AOC-S: Advice of Charge message sent at the beginning of a call during call setup. This
message contains a list of rates associated with the call.
AOC-D: Advice of Charge message sent during the call. This message is typically used to
update the endpoint with the current call charge.
AOC-E: Advice of Charge message sent at the end of a call. This message is used to indicate to
the endpoint the final call charge.
AMI: Asterisk Manager Interface. This interface is used to generate AOC messages and listen
for AOC events.
AOC in chan_dahdi

LibPRI Support:
ETSI, or euroisdn, is the only switchtype that LibPRI currently supports for AOC.
Enable AOC Pass-through in chan_dahdi
To enable AOC pass-through between the ISDN and Asterisk use the 'aoc_enable' config option.
This option allows for any combination of AOC-S, AOC-D, and AOC-E to be enabled or disabled.
For example:

aoc_enable=s,d,e ; enables pass-through of AOC-S, AOC-D, and AOC-E


aoc_enable=s,d
; enables pass-through of AOC-S and AOC-D. Rejects
; AOC-E and AOC-E request messages

Since AOC messages are often transported on facility messages, the 'facilityenable' option must
be enabled as well to fully support AOC pass-through.
Handling AOC-E in chan_dahdi
Whenever a dahdi channel receives an AOC-E message from Asterisk, it stores that message to
deliver it at the appropriate time during call termination. This means that if two AOC-E messages
are received on the same call, the last one will override the first one and only one AOC-E
message will be sent during call termination.
There are some tricky situations involving the final AOC-E message. During a bridged call, if the
endpoint receiving the AOC messages terminates the call before the endpoint delivering the
AOC does, the final AOC-E message sent by the sending side during termination will never make
it to the receiving end because Asterisk will have already torn down that channel.
This is where the chan_dahdi.conf 'aoce_delayhangup' option comes into play.
By enabling 'aoce_delayhangup', anytime a hangup is initiated by the ISDN side of an Asterisk
channel, instead of hanging up the channel, the channel sends a unique internal AOC-E
termination request to its bridge channel. This indicates it is about to hangup and wishes to
receive the final AOC-E message from the bridged channel before completely tearing down. If
the bridged channel knows what to do with this AOC-E termination request, it will do whatever is
necessary to indicate to its endpoint that the call is being terminated without actually hanging up
the Asterisk channel. This allows the final AOC-E message to come in and be sent across the
bridge while both channels are still up. If the channel delaying its hangup for the final AOC-E
message times out, the call will be torn down just as it normally would. In chan_dahdi the timeout
period is 1/2 the T305 timer which by default is 15 seconds.
'aoce_delayhangup' currently only works when both bridged channels are dahdi_channels. If a
SIP channel receives an AOC-E termination request, it just responds by immediately hanging up
the channel. Using this option when bridged to any channel technology besides SIP or DAHDI
will result in the 15 second timeout period before tearing down the call completely.
Requesting AOC services

AOC can be requested on a call by call basis using the DAHDI dialstring option, A(). The A()
option takes in 's', 'd', and 'e' parameters which represent the three types of AOC messages,
AOC-S, AOC-D, and AOC-E. By using this option Asterisk will indicate to the endpoint during call
setup that it wishes to receive the specified forms of AOC during the call.
Example Usage in extensions.conf

exten => 1111,1,Dial(DAHDI/g1/1112/A(s,d,e) ; requests AOC-S, AOC-D, and AOC-E on


; call setup
exten => 1111,1,Dial(DAHDI/g1/1112/A(d,e) ; requests only AOC-D, and AOC-E on
; call setup

AOC in chan_sip

Asterisk supports a very basic way of sending AOC on a SIP channel to Snom phones using an
AOC specification designed by Snom. This support is limited to the sending of AOC-D and
AOC-E pass-through messages. No support for AOC-E on call termination is present, so if the
Snom endpoint receiving the AOC messages from Asterisk terminates the call, the channel will
be torn down before the phone can receive the final AOC-E message.
To enable passthrough of AOC messages via the snom specification, use the
'snom_aoc_enabled' option in sip.conf.
Generate AOC Messages via AMI

Asterisk supports a way to generate AOC messages on a channel via the AMI action
AOCMessage. At the moment the AOCMessage action is limited to AOC-D and AOC-E message
generation. There are some limitations involved with delivering the final AOC-E message as well.
The AOCMessage action has its own detailed parameter documentation so this discussion will
focus on higher level use. When generating AOC messages on a Dahdi channel first make sure
the appropriate chan_dahdi.conf options are enabled. Without enabling 'aoc_enable' correctly for
pass-through the AOC messages will never make it out the pri. The same goes with SIP, the
'snom_aoc_enabled' option must be configured before messages can successfully be set to the
endpoint.
AOC-D Message Generation
AOC-D message generation can happen anytime throughout the call. This message type is very
straight forward.
Example: AOCMessage action generating AOC-D currency message with Success response.

Action: AOCMessage
Channel: DAHDI/i1/1111-1
MsgType: d
ChargeType: Currency
CurrencyAmount: 16
CurrencyName: USD
CurrencyMultiplier: OneThousandth
AOCBillingId: Normal
ActionID: 1234
Response: Success
ActionID: 1234
Message: AOC Message successfully queued on channel

AOC-E Message Generation


AOC-E messages are sent during call termination and represent the final charge total for the call.
Since Asterisk call termination results in the channel being destroyed, it is currently not possible

for the AOCMessage AMI action to be used to send the final AOC-E message on call hangup.
There is however a work around for this issue that can be used for Dahdi channels. By default
chan_dahdi saves any AOC-E message it receives from Asterisk during a call and waits to
deliver that message during call termination. If multiple AOC-E messages are received from
Asterisk on the same Dahdi channel, only the last message received is stored for delivery. This
means that each new AOC-E message received on the channel overrides the previous one.
Knowing this the final AOC-E message can be continually updated on a Dahdi channel until call
termination occurs allowing the last update to be sent on hangup. This method is only as
accurate as the intervals in which it is updated, but allows some form of AOC-E to be generated.
Example: AOCMessage action generating AOC-E unit message with Success response.

Action: AOCMessage
Channel: DAHDI/i1/1111-1
MsgType: e
ChargeType: Unit
UnitAmount(0): 111
UnitType(0): 6
UnitAmount(1): 222
UnitType(1): 5
UnitAmount(2): 333
UnitType(3): 4
UnitAmount(4): 444
AOCBillingId: Normal
ActionID: 1234
Response: Success
ActionID: 1234
Message: AOC Message successfully queued on channel

You might also like