Altering release cause

From Yate Documentation
Revision as of 18:09, 31 October 2013 by Monica (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Yate provides a default mapping from the call release cause of the call leg that initiated the release.

You may want to alter the release cause or to enforce specific mappings per protocol.

Concept

When a call leg is released a cause code is received over the protocol or is generated locally in case of an error.

The peer of the hung up call leg gets disconnected. At this stage it sends a chan.disconnected message that can be used to prevent the call release or to alter the propagated release cause.

Example

The following Javascript is an example of altering the release cause. The script can be placed in the share/scripts directory and be configured in javascript.conf

In javascript.conf

[scripts]
alter_cause=alter_release_cause.js

Content of a very simple script:

function onDisconnected(msg) {
    if (msg.reason == "congestion")
        msg.reason = "busy";
    return false;
}

Message.install(onDisconnected,"chan.disconnected",80);

A more complex script:

function onDisconnected(msg) {
    var newreason = false;
    switch (msg.id) {
        case /^sip\//:
            // Cause propagated to SIP
            switch (msg.lastpeerid) {
                case /^sip\//:
                    // SIP to SIP
                    switch (msg.reason) {
                        case "noroute":
                            newreason = "congestion";
                            break;
                        case "rejected":
                            newreason = "forbidden";
                            break;
                    }
                    break;
            }
            break;
        case /^h323\//:
            // Cause propagated to H.323
            switch (msg.reason) {
                case "congestion":
                    newreason = "busy";
                    break;
            }
            break;
    }
    if (newreason) {
        Engine.debug(Engine.DebugInfo,"Changing end reason '" + msg.reason + "' to '" + newreason + "'");
        msg.reason = newreason;
    }
    return false;
}

Message.install(onDisconnected,"chan.disconnected",80);
Personal tools
Namespaces

Variants
Actions
Preface
Configuration
Administrators
Developers