[Asterisk-Dev] Long comments and ideas for sip.conf

John Todd jtodd at loligo.com
Thu Sep 4 00:17:33 MST 2003


Long message.  Get a big mug of coffee or something before you start 
to read this.  Mark, take a few aspirin with that coffee.

I have a few comments on some extensions and re-arrangements of the 
sip.conf file that might make it a bit more extensible, and a bit 
better organized for some of the complex things people (like myself) 
are asking it to do.  After quite a bit of thought and some 
understanding of how components elsewhere in the system work, I think 
the following modifications to the SIP configuration parsing and 
functionality might be useful.  There are many sub-portions of these 
comments, each of which might be it's own feature request, but I 
thought that putting them into one long message here might induce 
some commentary before I went through the process of getting it into 
bugs.digium.com.  Here we go...


1) Addition of "include" logic into sip.conf:

I have been adding large numbers of SIP phones to various Asterisk 
servers, and as my fingers have worn down, it has occurred to me that 
the use of some type of macro or other quick addition method might 
make sense.  The use of the [default] stanza is great, but that only 
allows one default to be easily referenced.  I have multiple 
defaults, usually based on what type of equipment the user has on 
their desk.  I really like the concept of "include" statements in the 
extensions.conf, and a natural expansion of that concept I think 
would work well in sip.conf to make configuration there easier.  For 
large locations. this would reduce the duplication of data for each 
customer, and would allow "global" changes for certain equipment 
types very quickly.  The ability to create "meta-users" for SIP (see 
example #1) would allow for selection of codecs, bitrates, etc. from 
within the dialplan in a reasonably extendable way, simply by 
specifying a different meta-user which is being referenced in the 
Dial application.


2) Selective inclusion based on User-Agent:

Additionally, I have had great pains when users switch what type of 
phone they're using without telling me.  Some phones work with 
certain sip.conf configurations; others do not.  The ability to 
automatically detect these phones exists: it's in the User-Agent: 
string that gets sent in the SIP headers.  It would be of great 
benefit to automatically detect these strings, and using a wildcard 
system provide different actions within sip.conf.  This would 
virtually eliminate configuration changes entirely in sip.conf once a 
peer was configured correctly.  There may be rare circumstances where 
User-Agent: settings are not sufficient, but I am very much 
interested in the 90/10 rule here - if I can take care of 90% of the 
problems, then I can handle the 10% exceptions.

The only "twist" on this concept outside of the use of "include" as I 
define it in #1 would be that the new concept of "equipment=" would 
spin include=> a little differently.  Any stanza starting with 
"equipment-" would be treated specially, in that Asterisk would try 
to match the User-Agent: data and then use the first included stanza 
in the tree that has a "user-agent=" string that matches.  This 
method might even be able to eventually replace the [default] stanza, 
but it can certainly co-exist with it.  The current use and syntax of 
sip.conf is compatible with the new version, so this method is 
backwards-compatible.  Note that "includes" can be nested for 
equipment- calls, so you can create one big stanza that includes all 
of the other equipment- stanzas, for a global match.  I am open to 
other ways of doing this, but it was the only one I came up with off 
the top of my head (see Example #2)


3) Registration with other SIP servers - clean up syntax:

While I had started this huge undertaking, I figured: 'What the hell, 
let's look at registration, since I'm already writing nearly a book 
on the sip.conf.'   The current method of listing SIP register=> 
commands in the [general] context is getting pretty ugly all on one 
line, and doesn't offer much flexibility.  The extraction of these 
register commands out of one-line summaries and into the general 
format of the sip.conf file seems to be a good idea.  There are 
additional flags and timers that would be desirable to set on 
outbound REGISTER requests, and the only way to cleanly do that is to 
change the way register=> is done and make it look more like the rest 
of the file.  See example #3.


4) Minor extensions and features

There are a few extra features that sip.conf needs to make it more 
compliant with both the RFCs and with the "real world".  Some of 
these features become possible only with some of the other 
modifications in this document.  Here's the list:

   - User-Agent: spoofing on a per host basis, to get around badly 
built or filtered servers that only want to talk to a certain piece 
of equipment
   - Configurable expire times for SIP registrations that are made 
with remote servers, on a per-peer basis
   - Protocol selection between TCP and UDP for SIP messages, on a 
per-peer selection (for registrations as well as any other SIP 
operation)


-------------------------------
Example #1: Using "includes" in the sip.conf file to regulate how we 
pass out calls to certain SIP peers.  This creates two "meta" users 
that have the same characteristics as 7003, except that one is a 
low-bandwidth restricted user and one is a high-bandwidth user.  We 
then refer to those "meta" users in the dialplan when we want to send 
a call to a user, but using slightly different configuration options 
for that peer entry.  If the host wasn't dynamic, I suppose this 
could be done with existing SIP configurations with static IP 
addresses (ugly) but if the host is dynamic it won't work at all, so 
a meta-user concept might suffice to handle this process.

; -- sip.conf start --

[7003]
username=bill
secret=notreallysecret
context=generic-customer1
nat=no
canreinvite=no
host=dynamic


[7003-low]
include => 7003
disallow=all
allow=g729


[7003-high]
include => 7003
disallow=all
allow=ulaw
allow=alaw

; -- sip.conf end --

; -- extension.conf start --
;
; This checks to see if the variable "PAIDUP" has
;  been set to "1".  If so, then this customer gets
;  a nice fat alaw/ulaw (64kbps) pipe to use.  If not,
;  then we send him to a G.729 channel at 9.6kbps.
;
exten => 7003,1,DBget(PAIDUP=${EXTEN}/PAIDUP)
exten => 7003,2,GotoIf($[${PAIDUP} = 1]?3:5)
exten => 7003,3,Dial(SIP/${EXTEN}-high,50,r)
exten => 7003,4,Voicemail2(u${EXTEN})
exten => 7003,5,Dial(SIP/${EXTEN}-low,50,r)
exten => 7003,6,Voicemail2(u${EXTEN})
exten => 7003,104,Voicemail2(b${EXTEN})
exten => 7003,106,Voicemail2(b${EXTEN})

--------------------------------------


Example #2: We use "include" and "equipment-" stanzas to allow any 
user to access the system with any SIP device on which they might be 
sitting.


; Note: hypothetical "protocol=" command is used - this doesn't exist yet.
;   This could potentially be udp, or tcp.  Here's hoping.  :-)
;
; Wildcard matching is the same as that used in the dialplan, except that
;  special characters are escaped with "\" characters.
;

[7000]
equipment=allphones
username=bob
secret=foo
host=dynamic

[7001]
equipment=allphones
username=jane
secret=baz
host=dynamic

; We override the context for this user.
[7002]
equipment=allphones
context=special-customers
username=theboss
secret=bigsecret
host=dynamic

; Here, we create one easy-to-include list of includes
[equipment-allphones]
include => equipment-7960-4.4
include => equipment-ATA-new
include => equipment-grandstream1
include => equipment-asterisk-beta
include => equipment-allothers

; This matches Cisco 7960's running version 4 of the SIP code
;  i.e.: CSCO/4
;
[equipment-7960-4.4]
user-agent="CSCO/4"
context=from-customers1
canreinvite=no
type=friend
protocol=udp
dtmfmode=rfc2833
nat=yes

; This matches ATA-186 devices running v2.14 through 2.16
;  i.e.: Cisco ATA 186  v2.16 ata18x (030401a)
;
[equipment-ATA-new]
user-agent="Cisco ATA 186  v2.1\[4,5,6\]\*"
context=from-customers1
canreinvite=no
type=friend
protocol=udp
dtmfmode=rfc2833
nat=yes

; This matches Grandstream phones > 1.0
;  i.e.:  Grandstream SIP UA 1.0.3.81
;
[equipment-grandstream1]
user-agent="Grandstream SIP UA 1.0.\*"
context=from-customers1
canreinvite=no
type=friend
protocol=udp
dtmfmode=info
nat=no

; This matches Asterisk servers.  Currently, Asterisk does
;  not send version numbers.  :-(
;  i.e.: Asterisk PBX
;
[equipment-asterisk-beta]
user-agent="Asterisk PBX"
context=from-customers1
canreinvite=no
type=friend
protocol=udp
dtmfmode=rfc2833
nat=no


; If it doesn't match any of the above, this is the last match
;  in the "include" list in equipment-allphones, and it's a wildcard,
;  so it gets used.
;
[equipment-allothers]
user-agent="\*"
context=from-customers1
canreinvite=no
type=friend
protocol=udp
dtmfmode=rfc2833
nat=yes


------------------------------------------------------


Example #3: We replace the "register=>" lines with something that 
makes a bit more sense.  Breaking things out into stanza format seems 
to make a lot mor


; We add a few extra features in each sip peer.
;  expire = the number of seconds that this registration should
;    indicate for expiry.  Default is 500.
;  register = [yes, no] Is this a host to which we're sending
;    registrations, or receiving them? Despite the fact that some
;    remote servers may be both registered to and received from,
;    the presence of a "register = yes" line means that the definition
;    will only be used for REGISTER requests, and a separate peer
;    must be defined for outbound calls, even to the same host.  A
;    "no" definition means take no action.  Default = no.
;  user = [userid[@hostname][/localextension]] - This is more or
;    less identical to the prior syntax of the register=> lines,
;    where userid is the only mandatory field.  A domain and/or
;    local extension are optional.  No default.
;  secret = password for the user.  No default.


; When using "include", the order of the included lines is the order
;  in which the settings are taken.  The first match wins.  Thus:
;
; [foo]
; expire=100
;
; [bar]
; host=something.domain.com
; expire=200
; include => foo
;
; If running a call through peer "bar", then expire would
;   end up being 200.
;

; In this example, we have two lines that we want to register
;  with Free World Dialup.

; Note that only one "qualify" sample loop should be run against
;  a single host.  We don't want to measure for each meta-peer.

[fwd-main]
register=no
host=fwd.pulver.com
expire=200
register-agent="Wazoo SIP Proxy v1.0"
qualify=1000


[fwd-13392]
register=yes
user=13992 at fwd.pulver.com/13392
secret=somesecrethere
include => fwd-main

[fwd-4832]
register=yes
user=4832 at fwd.pulver.com/4832
secret=anothersecretword
register-agent="Asterisk PBX"
include => fwd-main




More information about the asterisk-dev mailing list