aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoroej <oej@f38db490-d61c-443f-a65b-d21fe96a405b>2007-12-16 10:51:53 +0000
committeroej <oej@f38db490-d61c-443f-a65b-d21fe96a405b>2007-12-16 10:51:53 +0000
commitb9b03966fb8526497e726b00cf53252268b9fcef (patch)
tree1737bbf754fc80795d7da8a7e44ef757640a050f
parent85bbad5334db6eecb6024f1e2b8316a18acfdd74 (diff)
HUGE improvements to QoS/CoS handling by IgorG
- Refer to the proper documentation - Implement separate signalling/media QoS/CoS in many channels using RTP - Improve warnings and verbose messages - Deprecate some old settings Minor modifications by me, a big effort from IgorG. Thanks! Reported by: IgorG Patches: qoscleanup-89394-4-trunk.patch uploaded by IgorG (license 20) Tested by: IgorG (closes issue #11145) git-svn-id: http://svn.digium.com/svn/asterisk/trunk@93163 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--CHANGES5
-rw-r--r--UPGRADE.txt3
-rw-r--r--channels/chan_h323.c20
-rw-r--r--channels/chan_iax2.c8
-rw-r--r--channels/chan_mgcp.c19
-rw-r--r--channels/chan_sip.c30
-rw-r--r--channels/chan_skinny.c29
-rw-r--r--channels/chan_unistim.c24
-rw-r--r--channels/iax2-provision.c2
-rw-r--r--configs/dundi.conf.sample2
-rw-r--r--configs/h323.conf.sample5
-rw-r--r--configs/iax.conf.sample2
-rw-r--r--configs/iaxprov.conf.sample2
-rw-r--r--configs/mgcp.conf.sample7
-rw-r--r--configs/sip.conf.sample10
-rw-r--r--configs/skinny.conf.sample8
-rw-r--r--configs/unistim.conf.sample7
-rw-r--r--doc/tex/qos.tex151
-rw-r--r--include/asterisk/netsock.h2
-rw-r--r--include/asterisk/rtp.h2
-rw-r--r--main/netsock.c16
-rw-r--r--main/rtp.c4
-rw-r--r--main/udptl.c2
-rw-r--r--pbx/pbx_dundi.c4
24 files changed, 242 insertions, 122 deletions
diff --git a/CHANGES b/CHANGES
index 89a021793..14e19552d 100644
--- a/CHANGES
+++ b/CHANGES
@@ -116,6 +116,11 @@ Skinny changes
-------------
* Added skinny show device, skinny show line, and skinny show settings CLI commands.
* Proper codec support in chan_skinny.
+ * Added settings for IP and Ethernet QoS requests
+
+MGCP changes
+------------
+ * Added separate settings for media QoS in mgcp.conf
DUNDi changes
-------------
diff --git a/UPGRADE.txt b/UPGRADE.txt
index 9db22501b..700720a15 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -132,6 +132,9 @@ Channel Drivers:
* chan_local.c: the comma delimiter inside the channel name has been changed to a
semicolon, in order to make the Local channel driver compatible with the comma
delimiter change in applications.
+* H323: The "tos" setting has changed name to "tos_audio" and "cos" to "cos_audio"
+ to be compatible with settings in sip.conf. The "tos" and "cos" configuration
+ is deprecated and will stop working in the next release of Asterisk.
Configuration:
diff --git a/channels/chan_h323.c b/channels/chan_h323.c
index f6f138c87..87fbcd786 100644
--- a/channels/chan_h323.c
+++ b/channels/chan_h323.c
@@ -970,7 +970,7 @@ static int __oh323_rtp_create(struct oh323_pvt *pvt)
if (h323debug)
ast_debug(1, "Created RTP channel\n");
- ast_rtp_setqos(pvt->rtp, tos, cos);
+ ast_rtp_setqos(pvt->rtp, tos, cos, "H323 RTP");
if (h323debug)
ast_debug(1, "Setting NAT on RTP to %d\n", pvt->options.nat);
@@ -2904,13 +2904,23 @@ static int reload_config(int is_reload)
} else {
memcpy(&bindaddr.sin_addr, hp->h_addr, sizeof(bindaddr.sin_addr));
}
- } else if (!strcasecmp(v->name, "tos")) {
+ } else if (!strcasecmp(v->name, "tos")) { /* Needs to be removed in next release */
+ ast_log(LOG_WARNING, "The \"tos\" setting is deprecated in this version of Asterisk. Please change to \"tos_audio\".\n");
if (ast_str2tos(v->value, &tos)) {
- ast_log(LOG_WARNING, "Invalid tos value at line %d, for more info read doc/qos.tex\n", v->lineno);
+ ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, refer to QoS documentation\n", v->lineno);
}
- } else if (!strcasecmp(v->name, "cos")) {
+ } else if (!strcasecmp(v->name, "tos_audio")) {
+ if (ast_str2tos(v->value, &tos)) {
+ ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, refer to QoS documentation\n", v->lineno);
+ }
+ } else if (!strcasecmp(v->name, "cos")) {
+ ast_log(LOG_WARNING, "The \"cos\" setting is deprecated in this version of Asterisk. Please change to \"cos_audio\".\n");
+ if (ast_str2cos(v->value, &cos)) {
+ ast_log(LOG_WARNING, "Invalid cos_audio value at line %d, refer to QoS documentation\n", v->lineno);
+ }
+ } else if (!strcasecmp(v->name, "cos_audio")) {
if (ast_str2cos(v->value, &cos)) {
- ast_log(LOG_WARNING, "Invalid cos value at line %d, for more info read doc/qos.tex\n", v->lineno);
+ ast_log(LOG_WARNING, "Invalid cos_audio value at line %d, refer to QoS documentation\n", v->lineno);
}
} else if (!strcasecmp(v->name, "gatekeeper")) {
if (!strcasecmp(v->value, "DISABLE")) {
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 3288800e7..b1205ef92 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -10422,13 +10422,13 @@ static int set_config(char *config_file, int reload)
tosval = ast_variable_retrieve(cfg, "general", "tos");
if (tosval) {
if (ast_str2tos(tosval, &tos))
- ast_log(LOG_WARNING, "Invalid tos value, see doc/qos.tex for more information.\n");
+ ast_log(LOG_WARNING, "Invalid tos value, refer to QoS documentation\n");
}
/* Seed initial cos value */
tosval = ast_variable_retrieve(cfg, "general", "cos");
if (tosval) {
if (ast_str2cos(tosval, &cos))
- ast_log(LOG_WARNING, "Invalid cos value, see doc/qos.tex for more information.\n");
+ ast_log(LOG_WARNING, "Invalid cos value, refer to QoS documentation\n");
}
while(v) {
if (!strcasecmp(v->name, "bindport")){
@@ -10601,10 +10601,10 @@ static int set_config(char *config_file, int reload)
ast_context_create(NULL, regcontext, "IAX2");
} else if (!strcasecmp(v->name, "tos")) {
if (ast_str2tos(v->value, &tos))
- ast_log(LOG_WARNING, "Invalid tos value at line %d, see doc/qos.tex for more information.'\n", v->lineno);
+ ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos")) {
if (ast_str2cos(v->value, &cos))
- ast_log(LOG_WARNING, "Invalid cos value at line %d, see doc/qos.tex for more information.'\n", v->lineno);
+ ast_log(LOG_WARNING, "Invalid cos value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "accountcode")) {
ast_copy_string(accountcode, v->value, sizeof(accountcode));
} else if (!strcasecmp(v->name, "mohinterpret")) {
diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c
index ae7a3ed14..bd2c66d62 100644
--- a/channels/chan_mgcp.c
+++ b/channels/chan_mgcp.c
@@ -153,8 +153,9 @@ static ast_group_t cur_callergroup = 0;
static ast_group_t cur_pickupgroup = 0;
static unsigned int tos = 0;
-
+static unsigned int tos_audio = 0;
static unsigned int cos = 0;
+static unsigned int cos_audio = 0;
static int immediate = 0;
@@ -2591,8 +2592,10 @@ static void start_rtp(struct mgcp_subchannel *sub)
sub->rtp = ast_rtp_new_with_bindaddr(sched, io, 1, 0, bindaddr.sin_addr);
if (sub->rtp && sub->owner)
ast_channel_set_fd(sub->owner, 0, ast_rtp_fd(sub->rtp));
- if (sub->rtp)
+ if (sub->rtp) {
+ ast_rtp_setqos(sub->rtp, tos_audio, cos_audio, "MGCP RTP");
ast_rtp_setnat(sub->rtp, sub->nat);
+ }
#if 0
ast_rtp_set_callback(p->rtp, rtpready);
ast_rtp_set_data(p->rtp, p);
@@ -4097,10 +4100,16 @@ static int reload_config(int reload)
capability &= ~format;
} else if (!strcasecmp(v->name, "tos")) {
if (ast_str2tos(v->value, &tos))
- ast_log(LOG_WARNING, "Invalid tos value at line %d, see doc/qos.tex for more information.\n", v->lineno);
+ ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno);
+ } else if (!strcasecmp(v->name, "tos_audio")) {
+ if (ast_str2tos(v->value, &tos_audio))
+ ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos")) {
if (ast_str2cos(v->value, &cos))
- ast_log(LOG_WARNING, "Invalid cos value at line %d, see doc/qos.tex for more information.\n", v->lineno);
+ ast_log(LOG_WARNING, "Invalid cos value at line %d, refer to QoS documentation\n", v->lineno);
+ } else if (!strcasecmp(v->name, "cos_audio")) {
+ if (ast_str2cos(v->value, &cos_audio))
+ ast_log(LOG_WARNING, "Invalid cos_audio value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "port")) {
if (sscanf(v->value, "%d", &ourport) == 1) {
bindaddr.sin_port = htons(ourport);
@@ -4184,7 +4193,7 @@ static int reload_config(int reload)
} else {
ast_verb(2, "MGCP Listening on %s:%d\n",
ast_inet_ntoa(bindaddr.sin_addr), ntohs(bindaddr.sin_port));
- ast_netsock_set_qos(mgcpsock, tos, cos);
+ ast_netsock_set_qos(mgcpsock, tos, cos, "MGCP");
}
}
ast_mutex_unlock(&netlock);
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 57b17f198..6e5a3b17a 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -545,7 +545,7 @@ static const struct cfsip_options {
#define DEFAULT_COS_SIP 4
#define DEFAULT_COS_AUDIO 5
#define DEFAULT_COS_VIDEO 6
-#define DEFAULT_COS_TEXT 0
+#define DEFAULT_COS_TEXT 5
#define DEFAULT_ALLOW_EXT_DOM TRUE
#define DEFAULT_REALM "asterisk"
#define DEFAULT_NOTIFYRINGING TRUE
@@ -5130,14 +5130,14 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si
ast_free(p);
return NULL;
}
- ast_rtp_setqos(p->rtp, global_tos_audio, global_cos_audio);
+ ast_rtp_setqos(p->rtp, global_tos_audio, global_cos_audio, "SIP RTP");
ast_rtp_setdtmf(p->rtp, ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_RFC2833);
ast_rtp_setdtmfcompensate(p->rtp, ast_test_flag(&p->flags[1], SIP_PAGE2_RFC2833_COMPENSATE));
ast_rtp_set_rtptimeout(p->rtp, global_rtptimeout);
ast_rtp_set_rtpholdtimeout(p->rtp, global_rtpholdtimeout);
ast_rtp_set_rtpkeepalive(p->rtp, global_rtpkeepalive);
if (p->vrtp) {
- ast_rtp_setqos(p->vrtp, global_tos_video, global_cos_video);
+ ast_rtp_setqos(p->vrtp, global_tos_video, global_cos_video, "SIP VRTP");
ast_rtp_setdtmf(p->vrtp, 0);
ast_rtp_setdtmfcompensate(p->vrtp, 0);
ast_rtp_set_rtptimeout(p->vrtp, global_rtptimeout);
@@ -5145,7 +5145,7 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si
ast_rtp_set_rtpkeepalive(p->vrtp, global_rtpkeepalive);
}
if (p->trtp) {
- ast_rtp_setqos(p->trtp, global_tos_text, global_cos_text);
+ ast_rtp_setqos(p->trtp, global_tos_text, global_cos_text, "SIP TRTP");
ast_rtp_setdtmf(p->trtp, 0);
ast_rtp_setdtmfcompensate(p->trtp, 0);
}
@@ -18575,24 +18575,28 @@ static int reload_config(enum channelreloadreason reason)
registry_count++;
} else if (!strcasecmp(v->name, "tos_sip")) {
if (ast_str2tos(v->value, &global_tos_sip))
- ast_log(LOG_WARNING, "Invalid tos_sip value at line %d, recommended value is 'cs3'. See doc/qos.tex.\n", v->lineno);
+ ast_log(LOG_WARNING, "Invalid tos_sip value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "tos_audio")) {
if (ast_str2tos(v->value, &global_tos_audio))
- ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, recommended value is 'ef'. See doc/qos.tex.\n", v->lineno);
+ ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "tos_video")) {
if (ast_str2tos(v->value, &global_tos_video))
- ast_log(LOG_WARNING, "Invalid tos_video value at line %d, recommended value is 'af41'. See doc/qos.tex.\n", v->lineno);
+ ast_log(LOG_WARNING, "Invalid tos_video value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "tos_text")) {
if (ast_str2tos(v->value, &global_tos_text))
- ast_log(LOG_WARNING, "Invalid tos_text value at line %d, recommended value is 'af41'. See doc/qos.tex.\n", v->lineno);
+ ast_log(LOG_WARNING, "Invalid tos_text value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos_sip")) {
- ast_str2cos(v->value, &global_cos_sip);
+ if (ast_str2cos(v->value, &global_cos_sip))
+ ast_log(LOG_WARNING, "Invalid cos_sip value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos_audio")) {
- ast_str2cos(v->value, &global_cos_audio);
+ if (ast_str2cos(v->value, &global_cos_audio))
+ ast_log(LOG_WARNING, "Invalid cos_audio value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos_video")) {
- ast_str2cos(v->value, &global_cos_video);
+ if (ast_str2cos(v->value, &global_cos_video))
+ ast_log(LOG_WARNING, "Invalid cos_video value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos_text")) {
- ast_str2cos(v->value, &global_cos_text);
+ if (ast_str2cos(v->value, &global_cos_text))
+ ast_log(LOG_WARNING, "Invalid cos_text value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "bindport")) {
int i;
if (sscanf(v->value, "%d", &i) == 1) {
@@ -18761,7 +18765,7 @@ static int reload_config(enum channelreloadreason reason)
} else {
ast_verb(2, "SIP Listening on %s:%d\n",
ast_inet_ntoa(bindaddr.sin_addr), ntohs(bindaddr.sin_port));
- ast_netsock_set_qos(sipsock, global_tos_sip, global_cos_sip);
+ ast_netsock_set_qos(sipsock, global_tos_sip, global_cos_sip, "SIP");
}
}
}
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c
index 5c821e183..6c526d461 100644
--- a/channels/chan_skinny.c
+++ b/channels/chan_skinny.c
@@ -50,6 +50,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/sched.h"
#include "asterisk/io.h"
#include "asterisk/rtp.h"
+#include "asterisk/netsock.h"
#include "asterisk/acl.h"
#include "asterisk/callerid.h"
#include "asterisk/cli.h"
@@ -90,6 +91,13 @@ enum skinny_codecs {
#define DEFAULT_SKINNY_BACKLOG 2
#define SKINNY_MAX_PACKET 1000
+static unsigned int tos = 0;
+static unsigned int tos_audio = 0;
+static unsigned int tos_video = 0;
+static unsigned int cos = 0;
+static unsigned int cos_audio = 0;
+static unsigned int cos_video = 0;
+
static int keep_alive = 120;
static char vmexten[AST_MAX_EXTENSION]; /* Voicemail pilot number */
static char used_context[AST_MAX_EXTENSION]; /* Voicemail pilot number */
@@ -2976,9 +2984,11 @@ static void start_rtp(struct skinny_subchannel *sub)
ast_channel_set_fd(sub->owner, 3, ast_rtcp_fd(sub->vrtp));
}
if (sub->rtp) {
+ ast_rtp_setqos(sub->rtp, tos_audio, cos_audio, "Skinny RTP");
ast_rtp_setnat(sub->rtp, l->nat);
}
if (sub->vrtp) {
+ ast_rtp_setqos(sub->vrtp, tos_video, cos_video, "Skinny VRTP");
ast_rtp_setnat(sub->vrtp, l->nat);
}
/* Set Frame packetization */
@@ -5516,6 +5526,24 @@ static int reload_config(void)
ast_copy_string(regcontext, v->value, sizeof(regcontext));
} else if (!strcasecmp(v->name, "dateformat")) {
memcpy(date_format, v->value, sizeof(date_format));
+ } else if (!strcasecmp(v->name, "tos")) {
+ if (ast_str2tos(v->value, &tos))
+ ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno);
+ } else if (!strcasecmp(v->name, "tos_audio")) {
+ if (ast_str2tos(v->value, &tos_audio))
+ ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, refer to QoS documentation\n", v->lineno);
+ } else if (!strcasecmp(v->name, "tos_video")) {
+ if (ast_str2tos(v->value, &tos_video))
+ ast_log(LOG_WARNING, "Invalid tos_video value at line %d, refer to QoS documentation\n", v->lineno);
+ } else if (!strcasecmp(v->name, "cos")) {
+ if (ast_str2cos(v->value, &cos))
+ ast_log(LOG_WARNING, "Invalid cos value at line %d, refer to QoS documentation\n", v->lineno);
+ } else if (!strcasecmp(v->name, "cos_audio")) {
+ if (ast_str2cos(v->value, &cos_audio))
+ ast_log(LOG_WARNING, "Invalid cos_audio value at line %d, refer to QoS documentation\n", v->lineno);
+ } else if (!strcasecmp(v->name, "cos_video")) {
+ if (ast_str2cos(v->value, &cos_video))
+ ast_log(LOG_WARNING, "Invalid cos_video value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "allow")) {
ast_parse_allow_disallow(&default_prefs, &default_capability, v->value, 1);
} else if (!strcasecmp(v->name, "disallow")) {
@@ -5604,6 +5632,7 @@ static int reload_config(void)
}
ast_verb(2, "Skinny listening on %s:%d\n",
ast_inet_ntoa(bindaddr.sin_addr), ntohs(bindaddr.sin_port));
+ ast_netsock_set_qos(skinnysock, tos, cos, "Skinny");
ast_pthread_create_background(&accept_t,NULL, accept_thread, NULL);
}
}
diff --git a/channels/chan_unistim.c b/channels/chan_unistim.c
index 9c1a360ad..d4cb0f347 100644
--- a/channels/chan_unistim.c
+++ b/channels/chan_unistim.c
@@ -59,6 +59,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/sched.h"
#include "asterisk/io.h"
#include "asterisk/rtp.h"
+#include "asterisk/netsock.h"
#include "asterisk/acl.h"
#include "asterisk/callerid.h"
#include "asterisk/cli.h"
@@ -214,6 +215,10 @@ static int unistim_port;
static enum autoprovision autoprovisioning = AUTOPROVISIONING_NO;
static int unistim_keepalive;
static int unistimsock = -1;
+static unsigned int tos = 0;
+static unsigned int tos_audio = 0;
+static unsigned int cos = 0;
+static unsigned int cos_audio = 0;
static struct io_context *io;
static struct sched_context *sched;
static struct sockaddr_in public_ip = { 0, };
@@ -2075,8 +2080,10 @@ static void start_rtp(struct unistim_subchannel *sub)
sub->owner->fds[0] = ast_rtp_fd(sub->rtp);
sub->owner->fds[1] = ast_rtcp_fd(sub->rtp);
}
- if (sub->rtp)
+ if (sub->rtp) {
+ ast_rtp_setqos(sub->rtp, tos_audio, cos_audio, "UNISTIM RTP");
ast_rtp_setnat(sub->rtp, sub->parent->parent->nat);
+ }
/* Create the RTP connection */
ast_rtp_get_us(sub->rtp, &us);
@@ -5330,7 +5337,19 @@ static int reload_config(void)
unistim_keepalive = atoi(v->value);
else if (!strcasecmp(v->name, "port"))
unistim_port = atoi(v->value);
- else if (!strcasecmp(v->name, "autoprovisioning")) {
+ else if (!strcasecmp(v->name, "tos")) {
+ if (ast_str2tos(v->value, &tos))
+ ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno);
+ } else if (!strcasecmp(v->name, "tos_audio")) {
+ if (ast_str2tos(v->value, &tos_audio))
+ ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, refer to QoS documentation\n", v->lineno);
+ } else if (!strcasecmp(v->name, "cos")) {
+ if (ast_str2cos(v->value, &cos))
+ ast_log(LOG_WARNING, "Invalid cos value at line %d, refer to QoS documentation\n", v->lineno);
+ } else if (!strcasecmp(v->name, "cos_audio")) {
+ if (ast_str2cos(v->value, &cos_audio))
+ ast_log(LOG_WARNING, "Invalid cos_audio value at line %d, refer to QoS documentation\n", v->lineno);
+ } else if (!strcasecmp(v->name, "autoprovisioning")) {
if (!strcasecmp(v->value, "no"))
autoprovisioning = AUTOPROVISIONING_NO;
else if (!strcasecmp(v->value, "yes"))
@@ -5511,6 +5530,7 @@ static int reload_config(void)
"UNISTIM Listening on %s:%d\n",
ast_inet_ntoa(bindaddr.sin_addr), htons(bindaddr.sin_port));
}
+ ast_netsock_set_qos(unistimsock, tos, cos, "UNISTIM");
}
return 0;
}
diff --git a/channels/iax2-provision.c b/channels/iax2-provision.c
index 3ddec3e06..5b52a0934 100644
--- a/channels/iax2-provision.c
+++ b/channels/iax2-provision.c
@@ -323,7 +323,7 @@ static int iax_template_parse(struct iax_template *cur, struct ast_config *cfg,
ast_log(LOG_WARNING, "Ignoring invalid codec '%s' for '%s' at line %d\n", v->value, s, v->lineno);
} else if (!strcasecmp(v->name, "tos")) {
if (ast_str2tos(v->value, &cur->tos))
- ast_log(LOG_WARNING, "Invalid tos value at line %d, see doc/qos.tex for more information.\n", v->lineno);
+ ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "user")) {
strncpy(cur->user, v->value, sizeof(cur->user) - 1);
if (strcmp(cur->user, v->value))
diff --git a/configs/dundi.conf.sample b/configs/dundi.conf.sample
index fa3d255d5..f62210659 100644
--- a/configs/dundi.conf.sample
+++ b/configs/dundi.conf.sample
@@ -27,7 +27,7 @@
;bindaddr=0.0.0.0
;port=4520
;
-; See doc/qos.tex for a description of the tos parameter.
+; See qos.tex or Quality of Service section of asterisk.pdf for a description of the tos parameter.
;tos=ef
;
; Our entity identifier (Should generally be the MAC address of the
diff --git a/configs/h323.conf.sample b/configs/h323.conf.sample
index 08849f690..5be321f33 100644
--- a/configs/h323.conf.sample
+++ b/configs/h323.conf.sample
@@ -4,7 +4,10 @@
[general]
port = 1720
;bindaddr = 1.2.3.4 ; this SHALL contain a single, valid IP address for this machine
-;tos=ef
+;
+; See qos.tex or Quality of Service section of asterisk.pdf for a description of these parameters.
+;tos_audio=ef ; Sets TOS for RTP audio packets.
+;cos_audio=5 ; Sets 802.1p priority for RTP audio packets.
;
; You may specify a global default AMA flag for iaxtel calls. It must be
; one of 'default', 'omit', 'billing', or 'documentation'. These flags
diff --git a/configs/iax.conf.sample b/configs/iax.conf.sample
index 01ccfb7f6..2441f2cf4 100644
--- a/configs/iax.conf.sample
+++ b/configs/iax.conf.sample
@@ -225,7 +225,7 @@ forcejitterbuffer=no
;
;authdebug=no
;
-; See doc/qos.tex for a description of the tos parameters.
+; See qos.tex or Quality of Service section of asterisk.pdf for a description of these parameters.
;tos=ef
;cos=5
;
diff --git a/configs/iaxprov.conf.sample b/configs/iaxprov.conf.sample
index 8f979b533..06891d785 100644
--- a/configs/iaxprov.conf.sample
+++ b/configs/iaxprov.conf.sample
@@ -53,7 +53,7 @@ codec=ulaw
;
flags=register,heartbeat
;
-; See doc/qos.tex for a description of this parameter.
+; See qos.tex or Quality of Service section of asterisk.pdf for a description of this parameter.
;tos=ef
;
; Example iaxy provisioning
diff --git a/configs/mgcp.conf.sample b/configs/mgcp.conf.sample
index c4b5cba59..104891e8a 100644
--- a/configs/mgcp.conf.sample
+++ b/configs/mgcp.conf.sample
@@ -5,8 +5,11 @@
;port = 2427
;bindaddr = 0.0.0.0
-; See doc/qos.tex for a description of the tos parameters.
-;tos=ef
+; See qos.tex or Quality of Service section of asterisk.pdf for a description of these parameters.
+;tos=cs3 ; Sets TOS for signaling packets.
+;tos_audio=ef ; Sets TOS for RTP audio packets.
+;cos=3 ; Sets 802.1p priority for signaling packets.
+;cos_audio=5 ; Sets 802.1p priority for RTP audio packets.
;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
; jbenable = yes ; Enables the use of a jitterbuffer on the receiving side of a
diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample
index 61cdf114a..d8e25e642 100644
--- a/configs/sip.conf.sample
+++ b/configs/sip.conf.sample
@@ -66,16 +66,16 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls
; and multiline formatted headers for strict
; SIP compatibility (defaults to "no")
-; See doc/qos.tex for a description of these parameters.
+; See qos.tex or Quality of Service section of asterisk.pdf for a description of these parameters.
;tos_sip=cs3 ; Sets TOS for SIP packets.
;tos_audio=ef ; Sets TOS for RTP audio packets.
;tos_video=af41 ; Sets TOS for RTP video packets.
;tos_text=af41 ; Sets TOS for RTP text packets.
-;cos_sip=4 ; Sets CoS for SIP packets.
-;cos_audio=6 ; Sets CoS for RTP audio packets.
-;cos_video=5 ; Sets CoS for RTP video packets.
-;cos_text=0 ; Sets CoS for RTP text packets.
+;cos_sip=3 ; Sets 802.1p priority for SIP packets.
+;cos_audio=5 ; Sets 802.1p priority for RTP audio packets.
+;cos_video=4 ; Sets 802.1p priority for RTP video packets.
+;cos_text=3 ; Sets 802.1p priority for RTP text packets.
;maxexpiry=3600 ; Maximum allowed time of incoming registrations
; and subscriptions (seconds)
diff --git a/configs/skinny.conf.sample b/configs/skinny.conf.sample
index afbbc8c39..26a6db6c7 100644
--- a/configs/skinny.conf.sample
+++ b/configs/skinny.conf.sample
@@ -28,6 +28,14 @@ keepalive=120
;allow=all ; see doc/rtp-packetization for framing options
;disallow=
+; See qos.tex or Quality of Service section of asterisk.pdf for a description of these parameters.
+;tos=cs3 ; Sets TOS for signaling packets.
+;tos_audio=ef ; Sets TOS for RTP audio packets.
+;tos_video=af41 ; Sets TOS for RTP video packets.
+;cos=3 ; Sets 802.1p priority for signaling packets.
+;cos_audio=5 ; Sets 802.1p priority for RTP audio packets.
+;cos_video=4 ; Sets 802.1p priority for RTP video packets.
+
;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
;jbenable = yes ; Enables the use of a jitterbuffer on the receiving side of a
; skinny channel. Defaults to "no". An enabled jitterbuffer will
diff --git a/configs/unistim.conf.sample b/configs/unistim.conf.sample
index 4a6c61abc..649737317 100644
--- a/configs/unistim.conf.sample
+++ b/configs/unistim.conf.sample
@@ -4,6 +4,13 @@
[general]
port=5000 ; UDP port
+;
+; See qos.tex or Quality of Service section of asterisk.pdf for a description of these parameters.
+;tos=cs3 ; Sets TOS for signaling packets.
+;tos_audio=ef ; Sets TOS for RTP audio packets.
+;cos=3 ; Sets 802.1p priority for signaling packets.
+;cos_audio=5 ; Sets 802.1p priority for RTP audio packets.
+;
;keepalive=120 ; in seconds, default = 120
;public_ip= ; if asterisk is behind a nat, specify your public IP
;autoprovisioning=no ; Allow undeclared phones to register an extension. See README for important
diff --git a/doc/tex/qos.tex b/doc/tex/qos.tex
index 3a04c5064..90ddc5244 100644
--- a/doc/tex/qos.tex
+++ b/doc/tex/qos.tex
@@ -1,31 +1,85 @@
\subsubsection{Introduction}
-Asterisk can set the Type of Service (TOS) byte on outgoing IP packets
-for various protocols. The TOS byte is used by the network to provide
-some level of Quality of Service (QoS) even if the network is
-congested with other traffic.
+Asterisk support different QoS settings on application level on various protocol
+on any of signaling and media. Type of Service (TOS) byte can be set on
+outgoing IP packets for various protocols. The TOS byte is used by the network
+to provide some level of Quality of Service (QoS) even if the network is
+congested with other traffic.
-Also asterisk running on Linux can set 802.1p CoS marks in VLAN packets
-for all used VoIP protocols. It is useful when you are working in switched
-enviropment. For maping skb-$>$priority and VLAN CoS mark you need to use
-command "vconfig set\_egress\_map [vlan-device] [skb-priority] [vlan-qos]".
+Also asterisk running on Linux can set 802.1p CoS marks in VLAN packets for all
+used VoIP protocols. It is useful when you are working in switched environment.
+In fact asterisk only set priority for Linux socket. For mapping this priority
+and VLAN CoS mark you need to use this command:
-\subsubsection{SIP}
+\begin{verbatim}
+vconfig set_egress_map [vlan-device] [skb-priority] [vlan-qos]
+\end{verbatim}
-In sip.conf, there are three parameters that control the TOS settings:
-"tos\_sip", "tos\_audio" and "tos\_video". tos\_sip controls what TOS SIP
-call signalling packets are set to. tos\_audio controls what TOS RTP audio
-packets are set to. tos\_video controls what TOS RTP video packets are
-set to.
+In table behind shown all voice channels and other modules of asterisk, that
+support QoS settings for network traffic and type of traffic which can have
+QoS settings.
+
+\begin{verbatim}
+ Channel Drivers
++==============+===========+=====+=====+=====+
+| | Signaling |Audio|Video| Text|
++==============+===========+=====+=====+=====+
+|chan_sip | + | + | + | + |
+|--------------+-----------+-----+-----+-----+
+|chan_skinny | + | + | + | |
+|--------------+-----------+-----+-----+-----+
+|chan_mgcp | + | + | | |
+|--------------+-----------+-----+-----+-----+
+|chan_unistim | + | + | | |
+|--------------+-----------+-----+-----+-----+
+|chan_h323 | | + | | |
+|--------------+-----------+-----+-----+-----+
+|chan_iax2 | + |
++==============+=============================+
+ Other
++==============+=============================+
+| dundi.conf | + (tos setting) |
+|--------------+-----------------------------+
+| iaxprov.conf | + (tos setting) |
++==============+=============================+
+\end{verbatim}
+
+
+\subsubsection{IP TOS values}
+
+The allowable values for any of the tos* parameters are:
+CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, AF11, AF12, AF13, AF21, AF22, AF23,
+AF31, AF32, AF33, AF41, AF42, AF43 and ef (expedited forwarding),
-There are four parameters to control 802.1p CoS: "cos\_sip", "cos\_audio",
-"cos\_video" and "cos\_text". It's behavior the same as writen above.
+The tos* parameters also take numeric values.
-There is a "tos" parameter that is supported for backwards
-compatibility. The tos parameter should be avoided in sip.conf
-because it sets all three tos settings in sip.conf to the same value.
+NOTE, that on Linux system you can not use ef value if your asterisk running
+from user other then root.
+
+The lowdelay, throughput, reliability, mincost, and none values are removed
+in current releases.
+
+\subsubsection{802.1p CoS values}
+
+As far as 802.1p uses 3 bites from VLAN header, there are parameter can take
+integer values from 0 to 7.
+
+\subsubsection{Recommended values}
+Recommended values shown above and also included in sample configuration files:
+\begin{verbatim}
++============+=========+======+
+| | tos | cos |
++============+=========+======+
+|Signaling | cs3 | 3 |
+|Audio | ef | 5 |
+|Video | af41 | 4 |
+|Text | af41 | 3 |
+|Other | ef | |
++============+=========+======+
+\end{verbatim}
\subsubsection{IAX2}
+
In iax.conf, there is a "tos" parameter that sets the global default TOS
for IAX packets generated by chan\_iax2. Since IAX connections combine
signalling, audio, and video into one UDP stream, it is not possible
@@ -37,56 +91,22 @@ IAX packets generated by an IAXy cannot have different TOS settings
based upon the type of packet. However different IAXy devices can
have different TOS settings.
-\subsubsection{H.323}
-Also support TOS and CoS.
-
-\subsubsection{MGCP}
-Also support TOS and CoS.
-
-\subsubsection{IP TOS values}
-
-The allowable values for any of the tos* parameters are:
-CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, AF11, AF12, AF13,
-AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43 and
-ef (expedited forwarding),
-
-The tos* parameters also take numeric values.
-
-The lowdelay, throughput, reliability, mincost, and none values are
-removed in current releases.
+\subsubsection{SIP}
-\subsubsection{802.1p CoS values}
+In sip.conf, there are three parameters that control the TOS settings:
+"tos\_sip", "tos\_audio", "tos\_video" and "tos\_text". tos\_sip controls
+what TOS SIP call signaling packets are set to. tos\_audio, tos\_video
+and tos\_text controls what TOS RTP audio, video or text accordingly
+packets are set to.
-As 802.1p uses 3 bites from VLAN header, there are parameter can take
-integer values from 0 to 7.
+There are four parameters to control 802.1p CoS: "cos\_sip", "cos\_audio",
+"cos\_video" and "cos\_text". It behavior the same as written above.
+\subsubsection{Other RTP channels}
-\begin{verbatim}
-+==============+============+==============+
-|Configuration | Parameter | Recommended |
-|File | Setting | |
-+--------------+------------+--------------+
-| | tos_sip | cs3 |
-| | tos_audio | ef |
-| | tos_video | af41 |
-| sip.conf | tos_text | af41 |
-| | cos_sip | 4 |
-| | cos_audio | 6 |
-| | cos_video | 5 |
-| | cos_text | 0 |
-+--------------+------------+--------------+
-| iax.conf | tos | ef |
-| | cos | 6 |
-+--------------+------------+--------------+
-| iaxprov.conf | tos | ef |
-+--------------+------------+--------------+
-| mgcp.conf | tos | ef |
-| | cos | 6 |
-+--------------+------------+--------------+
-| h323.conf | tos | ef |
-| | cos | 6 |
-+==============+============+==============+
-\end{verbatim}
+chan\_mgcp, chan\_h323, chan\_skinny and chan\_unistim also support TOS and
+CoS via setting tos and cos parameters in correspond to module config
+files. Naming style and behavior same as for chan\_sip.
\subsubsection{Reference}
@@ -113,4 +133,3 @@ For more information on Quality of
Service for VoIP networks see the "Enterprise QoS Solution Reference
Network Design Guide" version 3.3 from Cisco at:
\url{http://www.cisco.com/application/pdf/en/us/guest/netsol/ns432/c649/ccmigration\_09186a008049b062.pdf}
-
diff --git a/include/asterisk/netsock.h b/include/asterisk/netsock.h
index 988d51fcf..2aeb803b4 100644
--- a/include/asterisk/netsock.h
+++ b/include/asterisk/netsock.h
@@ -53,7 +53,7 @@ int ast_netsock_release(struct ast_netsock_list *list);
struct ast_netsock *ast_netsock_find(struct ast_netsock_list *list,
struct sockaddr_in *sa);
-int ast_netsock_set_qos(int netsocket, int tos, int cos);
+int ast_netsock_set_qos(int netsocket, int tos, int cos, const char *desc);
int ast_netsock_sockfd(const struct ast_netsock *ns);
diff --git a/include/asterisk/rtp.h b/include/asterisk/rtp.h
index 2aeefe077..003ff268f 100644
--- a/include/asterisk/rtp.h
+++ b/include/asterisk/rtp.h
@@ -168,7 +168,7 @@ int ast_rtp_senddigit_end(struct ast_rtp *rtp, char digit);
int ast_rtp_sendcng(struct ast_rtp *rtp, int level);
-int ast_rtp_setqos(struct ast_rtp *rtp, int tos, int cos);
+int ast_rtp_setqos(struct ast_rtp *rtp, int tos, int cos, char *desc);
/*! \brief Setting RTP payload types from lines in a SDP description: */
void ast_rtp_pt_clear(struct ast_rtp* rtp);
diff --git a/main/netsock.c b/main/netsock.c
index d10c0c344..27def180c 100644
--- a/main/netsock.c
+++ b/main/netsock.c
@@ -117,7 +117,7 @@ struct ast_netsock *ast_netsock_bindaddr(struct ast_netsock_list *list, struct i
return NULL;
}
- ast_netsock_set_qos(netsocket, tos, cos);
+ ast_netsock_set_qos(netsocket, tos, cos, "IAX2");
ast_enable_packet_fragmentation(netsocket);
@@ -143,20 +143,20 @@ struct ast_netsock *ast_netsock_bindaddr(struct ast_netsock_list *list, struct i
return ns;
}
-int ast_netsock_set_qos(int netsocket, int tos, int cos)
+int ast_netsock_set_qos(int netsocket, int tos, int cos, const char *desc)
{
int res;
if ((res = setsockopt(netsocket, IPPROTO_IP, IP_TOS, &tos, sizeof(tos))))
- ast_log(LOG_WARNING, "Unable to set TOS to %d\n", tos);
- else
- ast_verb(2, "Using TOS bits %d\n", tos);
+ ast_log(LOG_WARNING, "Unable to set %s TOS to %d, may be you have no root privileges\n", desc, tos);
+ else if (tos)
+ ast_verb(2, "Using %s TOS bits %d\n", desc, tos);
#if defined(linux)
if (setsockopt(netsocket, SOL_SOCKET, SO_PRIORITY, &cos, sizeof(cos)))
- ast_log(LOG_WARNING, "Unable to set CoS to %d\n", cos);
- else
- ast_verb(2, "Using CoS mark %d\n", cos);
+ ast_log(LOG_WARNING, "Unable to set %s CoS to %d\n", desc, cos);
+ else if (cos)
+ ast_verb(2, "Using %s CoS mark %d\n", desc, cos);
#endif
return res;
diff --git a/main/rtp.c b/main/rtp.c
index fcc80df0e..35dd95904 100644
--- a/main/rtp.c
+++ b/main/rtp.c
@@ -2292,9 +2292,9 @@ struct ast_rtp *ast_rtp_new(struct sched_context *sched, struct io_context *io,
return ast_rtp_new_with_bindaddr(sched, io, rtcpenable, callbackmode, ia);
}
-int ast_rtp_setqos(struct ast_rtp *rtp, int tos, int cos)
+int ast_rtp_setqos(struct ast_rtp *rtp, int tos, int cos, char *desc)
{
- return ast_netsock_set_qos(rtp->s, tos, cos);
+ return ast_netsock_set_qos(rtp->s, tos, cos, desc);
}
void ast_rtp_set_peer(struct ast_rtp *rtp, struct sockaddr_in *them)
diff --git a/main/udptl.c b/main/udptl.c
index f14502c71..12de3fd53 100644
--- a/main/udptl.c
+++ b/main/udptl.c
@@ -849,7 +849,7 @@ struct ast_udptl *ast_udptl_new(struct sched_context *sched, struct io_context *
int ast_udptl_setqos(struct ast_udptl *udptl, int tos, int cos)
{
- return ast_netsock_set_qos(udptl->fd, tos, cos);
+ return ast_netsock_set_qos(udptl->fd, tos, cos, "UDPTL");
}
void ast_udptl_set_peer(struct ast_udptl *udptl, struct sockaddr_in *them)
diff --git a/pbx/pbx_dundi.c b/pbx/pbx_dundi.c
index c7b6f3f05..2a363f9d4 100644
--- a/pbx/pbx_dundi.c
+++ b/pbx/pbx_dundi.c
@@ -4722,7 +4722,7 @@ static int set_config(char *config_file, struct sockaddr_in* sin, int reload)
ast_log(LOG_WARNING, "Invalid global endpoint identifier '%s' at line %d\n", v->value, v->lineno);
} else if (!strcasecmp(v->name, "tos")) {
if (ast_str2tos(v->value, &tos))
- ast_log(LOG_WARNING, "Invalid tos value at line %d, please read docs/qos.tex\n", v->lineno);
+ ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "department")) {
ast_copy_string(dept, v->value, sizeof(dept));
} else if (!strcasecmp(v->name, "organization")) {
@@ -4856,7 +4856,7 @@ static int load_module(void)
return AST_MODULE_LOAD_FAILURE;
}
- ast_netsock_set_qos(netsocket, tos, 0);
+ ast_netsock_set_qos(netsocket, tos, 0, "DUNDi");
if (start_network_thread()) {
ast_log(LOG_ERROR, "Unable to start network thread\n");