<html>
<head>
    <base href="https://wiki.asterisk.org/wiki">
            <link rel="stylesheet" href="/wiki/s/2041/1/7/_/styles/combined.css?spaceKey=AST&amp;forWysiwyg=true" type="text/css">
    </head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="https://wiki.asterisk.org/wiki/display/AST/Using+Include+Statements+to+Create+Classes+of+Service">Using Include Statements to Create Classes of Service</a></h2>
    <h4>Page <b>edited</b> by             <a href="https://wiki.asterisk.org/wiki/display/~lmadsen">Leif Madsen</a>
    </h4>
        <div id="versionComment">
        <b>Comment:</b>
        Add some spacing to make the dialplan more clear.<br />
    </div>
        <br/>
                         <h4>Changes (0)</h4>
                                 
    
<div id="page-diffs">
                    <table class="diff" cellpadding="0" cellspacing="0">
    
            <tr><td class="diff-snipped" >...<br></td></tr>
    
            </table>
    </div>                            <h4>Full Content</h4>
                    <div class="notificationGreySide">
        <p>Now that we've shown the basic syntax of include statements, let's put some include statements to good use. Include statements are often used to build chains of functionality or classes of service. In this example, we're going to build several different contexts, each with its own type of outbound calling. We'll then use include statements to chain these contexts together.</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Numbering Plans</b><br />The examples in this section use patterns designed for the North American Number Plan, and may not fit your individual circumstances. Feel free to use this example as a guide as you build your own dialplan.


<p>In these examples, we're going to assuming that a seven-digit number that does not begin with a zero or a one is a local (non-toll) call. Ten-digit numbers (where neither the first or fourth digits begin with zero or one) are also treated as local calls. A one, followed by ten digits (where neither the first or fourth digits begin with zero or one) is considered a long-distance (toll) call. Again, feel free to modify these examples to fit your own particular circumstances.</p></td></tr></table></div>
<div class='panelMacro'><table class='warningMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/forbidden.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Outbound dialing</b><br />These examples assume that you have a SIP provider named provider configured in <b>sip.conf</b>. The examples dial out through this SIP provider using the <b>SIP/provider/number</b> syntax.<br/>
Obviously, these examples won't work unless you setup a SIP provider for outbound calls, or replace this syntax with some other type of outbound connection. For more information on configuring a SIP provider, see <span class="error">&#91;Section 420. The SIP Protocol&#93;</span>. For analog connectivity information, see <span class="error">&#91;Section 441. Analog Telephony with DAHDI&#93;</span>. For more information on connectivity via digital circuits, see <span class="error">&#91;Section 450. Basics of Digital Telephony&#93;</span></td></tr></table></div>
<p>First, let's create a new context for local calls.</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="toolbar: false; theme: Confluence; brush: java; gutter: false"><![CDATA[[local]
; seven-digit local numbers
exten =&gt; _NXXXXXX,1,Dial(SIP/provider/${EXTEN})

; ten-digit local numbers
exten =&gt; _NXXNXXXXXX,1,Dial(SIP/provider/${EXTEN})

; emergency services (911), and other three-digit services
exten =&gt; NXX,1,Dial(SIP/provider/${EXTEN})

; if you don't find a match in this context, look in [users]
include =&gt; users
]]></script>
</div></div>

<p>Remember that the variable <b>${EXTEN}</b> will get replaced with the dialed extension. For example, if Bob dials <b>5551212</b> in the <b>local</b> context, Asterisk will execute the Dial application with <b>SIP/provider/5551212</b> as the first parameter. (This syntax means "Dial out to the account named provider using the SIP channel driver, and dial the number <b>5551212</b>.)</p>

<p>Next, we'll build a long-distance context, and link it back to the <b>local</b> context with an include statement. This way, if you dial a local number and your phone's channel driver sends the call to the <b>longdistance</b> context, Asterisk will search the <b>local</b> context if it doesn't find a matching pattern in the <b>longdistance</b> context.</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="toolbar: false; theme: Confluence; brush: javascript; gutter: false"><![CDATA[[longdistance]
; 1+ ten digit long-distance numbers
exten =&gt; _1NXXNXXXXXX,1,Dial(SIP/provider/${EXTEN})

; if you don't find a match in this context, look in [local]
include =&gt; local]]></script>
</div></div>

<p>Last but not least, let's add an <b>[docs:international]</b> context. In North America, you dial 011 to signify that you're going to dial an international number.</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="toolbar: false; theme: Confluence; brush: javascript; gutter: false"><![CDATA[[international]
; 1+ ten digit long-distance numbers
exten =&gt; _011.,1,Dial(SIP/provider/${EXTEN})

; if you don't find a match in this context, look in [longdistance]
include =&gt; longdistance]]></script>
</div></div>

<p>And there we have it &#45;&#45; a simple chain of contexts going from most privileged (international calls) down to lease privileged (local calling).</p>

<p>At this point, you may be asking yourself, "What's the big deal? Why did we need to break them up into contexts, if they're all going out the same outbound connection?" That's a great question&#33; The primary reason for breaking the different classes of calls into separate contexts is so that we can enforce some security boundaries.</p>

<p>Do you remember what we said earlier, that the channel drivers point inbound calls at a particular context? In this case, if we point a phone at the <b>[docs:local]</b> context, it could only make local and internal calls. On the other hand, if we were to point it at the <b>[docs:international]</b> context, it could make international and long-distance and local and internal calls. Essentially, we've created different classes of service by chaining contexts together with include statements, and using the channel driver configuration files to point different phones at different contexts along the chain.</p>

<p>Many people find it instructive to look at a visual diagram at this point, so let's draw ourselves a map of the contexts we've created so far.</p>

<p><b>Insert graphic showing chain of includes from international through long-distance to local and to users and features</b></p>

<p>In this graphic, we've illustrated the various contexts and how they work together. We've also shown that Alice's phone is pointed at the <b>[docs:international]</b> context, while Bob's phone is only pointed at the <b>[docs:local]</b> context.</p>

<p>Please take the next few minutes and implement a series of chained contexts into your own dialplan, similar to what we've explained above. You can then change the configuration for Alice and Bob (in <b>sip.conf</b>, since they're SIP phones) to point to different contexts, and see what happens when you attempt to make various types of calls from each phone.</p>
    </div>
        <div id="commentsSection" class="wiki-content pageSection">
        <div style="float: right;">
            <a href="https://wiki.asterisk.org/wiki/users/viewnotifications.action" class="grey">Change Notification Preferences</a>
        </div>
        <a href="https://wiki.asterisk.org/wiki/display/AST/Using+Include+Statements+to+Create+Classes+of+Service">View Online</a>
        |
        <a href="https://wiki.asterisk.org/wiki/pages/diffpagesbyversion.action?pageId=4817347&revisedVersion=8&originalVersion=7">View Changes</a>
                |
        <a href="https://wiki.asterisk.org/wiki/display/AST/Using+Include+Statements+to+Create+Classes+of+Service?showComments=true&amp;showCommentArea=true#addcomment">Add Comment</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>