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
This commit is contained in:
Tilghman Lesher
2011-09-07 00:54:36 +00:00
parent f090651138
commit f03bccdb4d
6 changed files with 24 additions and 11 deletions

View File

@@ -24,6 +24,13 @@ Chan_local changes
* Added a manager event "LocalBridge" for local channel call bridges between * Added a manager event "LocalBridge" for local channel call bridges between
the two pseudo-channels created. 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 ------------------- --- Functionality changes from Asterisk 1.8 to Asterisk 10 -------------------
------------------------------------------------------------------------------ ------------------------------------------------------------------------------

View File

@@ -1216,10 +1216,14 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls
allow=gsm allow=gsm
allow=g723 allow=g723
allow=ulaw allow=ulaw
; Or, more simply:
;allow=!all,ilbc,g729,gsm,g723,ulaw
[ulaw-phone](!) ; and another one for ulaw-only [ulaw-phone](!) ; and another one for ulaw-only
disallow=all disallow=all
allow=ulaw allow=ulaw
; Again, more simply:
;allow=!all,ulaw
; and finally instantiate a few phones ; and finally instantiate a few phones
; ;

View File

@@ -37,8 +37,7 @@ CREATE TABLE `iaxfriends` (
`transfer` varchar(10) NULL, -- mediaonly/yes/no `transfer` varchar(10) NULL, -- mediaonly/yes/no
`jitterbuffer` varchar(3) NULL, -- yes/no `jitterbuffer` varchar(3) NULL, -- yes/no
`forcejitterbuffer` varchar(3) NULL, -- yes/no `forcejitterbuffer` varchar(3) NULL, -- yes/no
`disallow` varchar(40) NULL, -- all/{list-of-codecs} `allow` varchar(200) NULL, -- all/{list-of-codecs}
`allow` varchar(40) NULL, -- all/{list-of-codecs}
`codecpriority` varchar(40) NULL, `codecpriority` varchar(40) NULL,
`qualify` varchar(10) NULL, -- yes/no/{number of milliseconds} `qualify` varchar(10) NULL, -- yes/no/{number of milliseconds}
`qualifysmoothing` varchar(10) NULL, -- yes/no `qualifysmoothing` varchar(10) NULL, -- yes/no

View File

@@ -28,8 +28,7 @@ CREATE TABLE IF NOT EXISTS `sipfriends` (
`callgroup` varchar(40) DEFAULT NULL, `callgroup` varchar(40) DEFAULT NULL,
`pickupgroup` varchar(40) DEFAULT NULL, `pickupgroup` varchar(40) DEFAULT NULL,
`language` varchar(40) DEFAULT NULL, `language` varchar(40) DEFAULT NULL,
`allow` varchar(40) DEFAULT NULL, `allow` varchar(200) DEFAULT NULL,
`disallow` varchar(40) DEFAULT NULL,
`insecure` varchar(40) DEFAULT NULL, `insecure` varchar(40) DEFAULT NULL,
`trustrpid` enum('yes','no') DEFAULT NULL, `trustrpid` enum('yes','no') DEFAULT NULL,
`progressinband` enum('yes','no','never') DEFAULT NULL, `progressinband` enum('yes','no','never') DEFAULT NULL,

View File

@@ -61,8 +61,7 @@ rtpholdtimeout character varying(3),
secret character varying(80), secret character varying(80),
"type" character varying DEFAULT 'friend' NOT NULL, "type" character varying DEFAULT 'friend' NOT NULL,
username character varying(80) DEFAULT '' NOT NULL, username character varying(80) DEFAULT '' NOT NULL,
disallow character varying(100) DEFAULT 'all', allow character varying(200) DEFAULT '!all,g729,ilbc,gsm,ulaw,alaw',
allow character varying(100) DEFAULT 'g729;ilbc;gsm;ulaw;alaw',
musiconhold character varying(100), musiconhold character varying(100),
regseconds bigint DEFAULT 0::bigint NOT NULL, regseconds bigint DEFAULT 0::bigint NOT NULL,
ipaddr character varying(40) DEFAULT '' NOT NULL, ipaddr character varying(40) DEFAULT '' NOT NULL,

View File

@@ -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 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; char *parse = NULL, *this = NULL, *psize = NULL;
struct ast_format format; struct ast_format format;
parse = ast_strdupa(list); parse = ast_strdupa(list);
while ((this = strsep(&parse, ","))) { while ((this = strsep(&parse, ","))) {
iter_allowing = allowing;
framems = 0; framems = 0;
if (*this == '!') {
this++;
iter_allowing = !allowing;
}
if ((psize = strrchr(this, ':'))) { if ((psize = strrchr(this, ':'))) {
*psize++ = '\0'; *psize++ = '\0';
ast_debug(1, "Packetization for codec: %s is %s\n", this, psize); 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; all = strcasecmp(this, "all") ? 0 : 1;
if (!all && !ast_getformatbyname(this, &format)) { 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++; errors++;
continue; continue;
} }
if (cap) { if (cap) {
if (allowing) { if (iter_allowing) {
if (all) { if (all) {
ast_format_cap_add_all(cap); ast_format_cap_add_all(cap);
} else { } else {
@@ -773,13 +778,13 @@ int ast_parse_allow_disallow(struct ast_codec_pref *pref, struct ast_format_cap
if (pref) { if (pref) {
if (!all) { if (!all) {
if (allowing) { if (iter_allowing) {
ast_codec_pref_append(pref, &format); ast_codec_pref_append(pref, &format);
ast_codec_pref_setsize(pref, &format, framems); ast_codec_pref_setsize(pref, &format, framems);
} else { } else {
ast_codec_pref_remove(pref, &format); ast_codec_pref_remove(pref, &format);
} }
} else if (!allowing) { } else if (!iter_allowing) {
memset(pref, 0, sizeof(*pref)); memset(pref, 0, sizeof(*pref));
} }
} }