Centralize and fix tos for IAX (bug #4850 inspired)
authorMark Spencer <markster@digium.com>
Tue, 9 Aug 2005 16:41:28 +0000 (16:41 +0000)
committerMark Spencer <markster@digium.com>
Tue, 9 Aug 2005 16:41:28 +0000 (16:41 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6315 65c4cc65-6c06-0410-ace0-fbb531ad65f3

acl.c
channels/chan_iax2.c
channels/chan_sip.c
include/asterisk/acl.h

diff --git a/acl.c b/acl.c
index 032e76f..010ce26 100755 (executable)
--- 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);
index 9c12b29..34b1de6 100755 (executable)
@@ -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));
index 898c945..83c882e 100755 (executable)
@@ -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) {
index dc3e3a4..45553d5 100755 (executable)
@@ -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)
 }