From f03bccdb4dcc1893acd2139f5a420c80ebdbecea Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Wed, 7 Sep 2011 00:54:36 +0000 Subject: [PATCH] Implement the '!' negation element to negate codecs directly in the allow keyword. This permits the list of codecs to be specified in one configuration line, instead of two or more, generally with the aim of either allowing all codecs with the exception of a few or disallowing most but permitting a few. Review: https://reviewboard.asterisk.org/r/1411/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@334574 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- CHANGES | 7 +++++++ configs/sip.conf.sample | 4 ++++ contrib/realtime/mysql/iaxfriends.sql | 3 +-- contrib/realtime/mysql/sipfriends.sql | 3 +-- contrib/realtime/postgresql/realtime.sql | 3 +-- main/frame.c | 15 ++++++++++----- 6 files changed, 24 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index 986c132e30..4f44c1412a 100644 --- a/CHANGES +++ b/CHANGES @@ -24,6 +24,13 @@ Chan_local changes * Added a manager event "LocalBridge" for local channel call bridges between the two pseudo-channels created. +Codec changes +------------- + * Codec lists may now be modified by the '!' character, to allow succinct + specification of a list of codecs allowed and disallowed, without the + requirement to use two different keywords. For example, to specify all + codecs except g729 and g723, one need only specify allow=all,!g729,!g723. + ------------------------------------------------------------------------------ --- Functionality changes from Asterisk 1.8 to Asterisk 10 ------------------- ------------------------------------------------------------------------------ diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample index fb487dba66..7c04a4a0f5 100644 --- a/configs/sip.conf.sample +++ b/configs/sip.conf.sample @@ -1216,10 +1216,14 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls allow=gsm allow=g723 allow=ulaw + ; Or, more simply: + ;allow=!all,ilbc,g729,gsm,g723,ulaw [ulaw-phone](!) ; and another one for ulaw-only disallow=all allow=ulaw + ; Again, more simply: + ;allow=!all,ulaw ; and finally instantiate a few phones ; diff --git a/contrib/realtime/mysql/iaxfriends.sql b/contrib/realtime/mysql/iaxfriends.sql index 3b3bbb3c79..f01fd73ffa 100644 --- a/contrib/realtime/mysql/iaxfriends.sql +++ b/contrib/realtime/mysql/iaxfriends.sql @@ -37,8 +37,7 @@ CREATE TABLE `iaxfriends` ( `transfer` varchar(10) NULL, -- mediaonly/yes/no `jitterbuffer` varchar(3) NULL, -- yes/no `forcejitterbuffer` varchar(3) NULL, -- yes/no - `disallow` varchar(40) NULL, -- all/{list-of-codecs} - `allow` varchar(40) NULL, -- all/{list-of-codecs} + `allow` varchar(200) NULL, -- all/{list-of-codecs} `codecpriority` varchar(40) NULL, `qualify` varchar(10) NULL, -- yes/no/{number of milliseconds} `qualifysmoothing` varchar(10) NULL, -- yes/no diff --git a/contrib/realtime/mysql/sipfriends.sql b/contrib/realtime/mysql/sipfriends.sql index 12047d399b..07cd8788aa 100644 --- a/contrib/realtime/mysql/sipfriends.sql +++ b/contrib/realtime/mysql/sipfriends.sql @@ -28,8 +28,7 @@ CREATE TABLE IF NOT EXISTS `sipfriends` ( `callgroup` varchar(40) DEFAULT NULL, `pickupgroup` varchar(40) DEFAULT NULL, `language` varchar(40) DEFAULT NULL, - `allow` varchar(40) DEFAULT NULL, - `disallow` varchar(40) DEFAULT NULL, + `allow` varchar(200) DEFAULT NULL, `insecure` varchar(40) DEFAULT NULL, `trustrpid` enum('yes','no') DEFAULT NULL, `progressinband` enum('yes','no','never') DEFAULT NULL, diff --git a/contrib/realtime/postgresql/realtime.sql b/contrib/realtime/postgresql/realtime.sql index 74b895738f..fb474ebbe2 100644 --- a/contrib/realtime/postgresql/realtime.sql +++ b/contrib/realtime/postgresql/realtime.sql @@ -61,8 +61,7 @@ rtpholdtimeout character varying(3), secret character varying(80), "type" character varying DEFAULT 'friend' NOT NULL, username character varying(80) DEFAULT '' NOT NULL, -disallow character varying(100) DEFAULT 'all', -allow character varying(100) DEFAULT 'g729;ilbc;gsm;ulaw;alaw', +allow character varying(200) DEFAULT '!all,g729,ilbc,gsm,ulaw,alaw', musiconhold character varying(100), regseconds bigint DEFAULT 0::bigint NOT NULL, ipaddr character varying(40) DEFAULT '' NOT NULL, diff --git a/main/frame.c b/main/frame.c index b664e2e849..4a91096949 100644 --- a/main/frame.c +++ b/main/frame.c @@ -730,13 +730,18 @@ void ast_frame_dump(const char *name, struct ast_frame *f, char *prefix) int ast_parse_allow_disallow(struct ast_codec_pref *pref, struct ast_format_cap *cap, const char *list, int allowing) { - int errors = 0, framems = 0, all = 0; + int errors = 0, framems = 0, all = 0, iter_allowing; char *parse = NULL, *this = NULL, *psize = NULL; struct ast_format format; parse = ast_strdupa(list); while ((this = strsep(&parse, ","))) { + iter_allowing = allowing; framems = 0; + if (*this == '!') { + this++; + iter_allowing = !allowing; + } if ((psize = strrchr(this, ':'))) { *psize++ = '\0'; ast_debug(1, "Packetization for codec: %s is %s\n", this, psize); @@ -750,13 +755,13 @@ int ast_parse_allow_disallow(struct ast_codec_pref *pref, struct ast_format_cap all = strcasecmp(this, "all") ? 0 : 1; if (!all && !ast_getformatbyname(this, &format)) { - ast_log(LOG_WARNING, "Cannot %s unknown format '%s'\n", allowing ? "allow" : "disallow", this); + ast_log(LOG_WARNING, "Cannot %s unknown format '%s'\n", iter_allowing ? "allow" : "disallow", this); errors++; continue; } if (cap) { - if (allowing) { + if (iter_allowing) { if (all) { ast_format_cap_add_all(cap); } else { @@ -773,13 +778,13 @@ int ast_parse_allow_disallow(struct ast_codec_pref *pref, struct ast_format_cap if (pref) { if (!all) { - if (allowing) { + if (iter_allowing) { ast_codec_pref_append(pref, &format); ast_codec_pref_setsize(pref, &format, framems); } else { ast_codec_pref_remove(pref, &format); } - } else if (!allowing) { + } else if (!iter_allowing) { memset(pref, 0, sizeof(*pref)); } }