From 97e1ede2923b2c1932e06f7eef1761515a54ce47 Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Tue, 9 Aug 2005 16:41:28 +0000
Subject: [PATCH] Centralize and fix tos for IAX (bug #4850 inspired)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6315 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 acl.c                  | 21 +++++++++++++++++++++
 channels/chan_iax2.c   | 21 ++++++++-------------
 channels/chan_sip.c    | 14 +-------------
 include/asterisk/acl.h |  1 +
 4 files changed, 31 insertions(+), 26 deletions(-)

diff --git a/acl.c b/acl.c
index 032e76f8a6..010ce26f83 100755
--- a/acl.c
+++ b/acl.c
@@ -23,6 +23,7 @@
 #include <sys/socket.h>
 #include <netdb.h>
 #include <net/if.h>
+#include <netinet/in.h>
 #include <netinet/in_systm.h>
 #include <netinet/ip.h>
 #include <sys/ioctl.h>
@@ -225,6 +226,26 @@ int ast_get_ip_or_srv(struct sockaddr_in *sin, const char *value, const char *se
 	return 0;
 }
 
+int ast_str2tos(const char *value, int *tos)
+{
+	int fval;
+	if (sscanf(value, "%i", &fval) == 1)
+		*tos = fval & 0xff;
+	else if (!strcasecmp(value, "lowdelay"))
+		*tos = IPTOS_LOWDELAY;
+	else if (!strcasecmp(value, "throughput"))
+		*tos = IPTOS_THROUGHPUT;
+	else if (!strcasecmp(value, "reliability"))
+		*tos = IPTOS_RELIABILITY;
+	else if (!strcasecmp(value, "mincost"))
+		*tos = IPTOS_MINCOST;
+	else if (!strcasecmp(value, "none"))
+		*tos = 0;
+	else
+		return -1;
+	return 0;
+}
+
 int ast_get_ip(struct sockaddr_in *sin, const char *value)
 {
 	return ast_get_ip_or_srv(sin, value, NULL);
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 9c12b29f58..34b1de6c77 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -8370,6 +8370,7 @@ static int set_config(char *config_file, int reload)
 	struct ast_variable *v;
 	char *cat;
 	char *utype;
+	char *tosval;
 	int format;
 	int portno = IAX_DEFAULT_PORTNO;
 	int  x;
@@ -8399,6 +8400,12 @@ static int set_config(char *config_file, int reload)
 
 	v = ast_variable_browse(cfg, "general");
 
+	/* Seed initial tos value */
+	tosval = ast_variable_retrieve(cfg, "general", "tos");
+	if (tosval) {
+		if (ast_str2tos(v->value, &tos))
+			ast_log(LOG_WARNING, "Invalid tos value, should be 'lowdelay', 'throughput', 'reliability', 'mincost', or 'none'\n");
+	}
 	while(v) {
 		if (!strcasecmp(v->name, "bindport")){ 
 			if (reload)
@@ -8529,19 +8536,7 @@ static int set_config(char *config_file, int reload)
 			if (!ast_context_find(regcontext))
 				ast_context_create(NULL, regcontext, channeltype);
 		} else if (!strcasecmp(v->name, "tos")) {
-			if (sscanf(v->value, "%d", &format) == 1)
-				tos = format & 0xff;
-			else if (!strcasecmp(v->value, "lowdelay"))
-				tos = IPTOS_LOWDELAY;
-			else if (!strcasecmp(v->value, "throughput"))
-				tos = IPTOS_THROUGHPUT;
-			else if (!strcasecmp(v->value, "reliability"))
-				tos = IPTOS_RELIABILITY;
-			else if (!strcasecmp(v->value, "mincost"))
-				tos = IPTOS_MINCOST;
-			else if (!strcasecmp(v->value, "none"))
-				tos = 0;
-			else
+			if (ast_str2tos(v->value, &tos))
 				ast_log(LOG_WARNING, "Invalid tos value at line %d, should be 'lowdelay', 'throughput', 'reliability', 'mincost', or 'none'\n", v->lineno);
 		} else if (!strcasecmp(v->name, "accountcode")) {
 			ast_copy_string(accountcode, v->value, sizeof(accountcode));
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 898c94581f..83c882eb1b 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -11030,19 +11030,7 @@ static int reload_config(void)
 		} else if (!strcasecmp(v->name, "recordhistory")) {
 			recordhistory = ast_true(v->value);
 		} else if (!strcasecmp(v->name, "tos")) {
-			if (sscanf(v->value, "%i", &format) == 1)
-				tos = format & 0xff;
-			else if (!strcasecmp(v->value, "lowdelay"))
-				tos = IPTOS_LOWDELAY;
-			else if (!strcasecmp(v->value, "throughput"))
-				tos = IPTOS_THROUGHPUT;
-			else if (!strcasecmp(v->value, "reliability"))
-				tos = IPTOS_RELIABILITY;
-			else if (!strcasecmp(v->value, "mincost"))
-				tos = IPTOS_MINCOST;
-			else if (!strcasecmp(v->value, "none"))
-				tos = 0;
-			else
+			if (ast_str2tos(v->value, &tos))
 				ast_log(LOG_WARNING, "Invalid tos value at line %d, should be 'lowdelay', 'throughput', 'reliability', 'mincost', or 'none'\n", v->lineno);
 		} else if (!strcasecmp(v->name, "bindport")) {
 			if (sscanf(v->value, "%d", &ourport) == 1) {
diff --git a/include/asterisk/acl.h b/include/asterisk/acl.h
index dc3e3a4c06..45553d51d4 100755
--- a/include/asterisk/acl.h
+++ b/include/asterisk/acl.h
@@ -38,6 +38,7 @@ extern int ast_ouraddrfor(struct in_addr *them, struct in_addr *us);
 extern int ast_lookup_iface(char *iface, struct in_addr *address);
 extern struct ast_ha *ast_duplicate_ha_list(struct ast_ha *original);
 extern int ast_find_ourip(struct in_addr *ourip, struct sockaddr_in bindaddr);
+extern int ast_str2tos(const char *value, int *tos);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }
-- 
GitLab