summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES7
-rw-r--r--configs/sip.conf.sample4
-rw-r--r--contrib/realtime/mysql/iaxfriends.sql3
-rw-r--r--contrib/realtime/mysql/sipfriends.sql3
-rw-r--r--contrib/realtime/postgresql/realtime.sql3
-rw-r--r--main/frame.c15
6 files changed, 24 insertions, 11 deletions
diff --git a/CHANGES b/CHANGES
index 986c132e3..4f44c1412 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 fb487dba6..7c04a4a0f 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 3b3bbb3c7..f01fd73ff 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 12047d399..07cd8788a 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 74b895738..fb474ebbe 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 b664e2e84..4a9109694 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));
}
}