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