aboutsummaryrefslogtreecommitdiffstats
path: root/main/netsock.c
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-04-30 16:16:26 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-04-30 16:16:26 +0000
commit3d2428efd418ec960c90725ad9588056ace5ec5c (patch)
treed7bac5beb193490f4242d9a69cad3457727ba5d8 /main/netsock.c
parent7443c4962d761cf4b24aecdc54f78a1088de93db (diff)
Add support for setting the CoS for VLAN traffic (802.1p) in Linux. The
file doc/qos.tex has been updated to document the new functionality. (issue #9540, patch submitted by IgorG) git-svn-id: http://svn.digium.com/svn/asterisk/trunk@62457 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/netsock.c')
-rw-r--r--main/netsock.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/main/netsock.c b/main/netsock.c
index 9fa842ec3..6e01432d7 100644
--- a/main/netsock.c
+++ b/main/netsock.c
@@ -119,7 +119,7 @@ struct ast_netsock *ast_netsock_find(struct ast_netsock_list *list,
return sock;
}
-struct ast_netsock *ast_netsock_bindaddr(struct ast_netsock_list *list, struct io_context *ioc, struct sockaddr_in *bindaddr, int tos, ast_io_cb callback, void *data)
+struct ast_netsock *ast_netsock_bindaddr(struct ast_netsock_list *list, struct io_context *ioc, struct sockaddr_in *bindaddr, int tos, int cos, ast_io_cb callback, void *data)
{
int netsocket = -1;
int *ioref;
@@ -142,12 +142,9 @@ struct ast_netsock *ast_netsock_bindaddr(struct ast_netsock_list *list, struct i
close(netsocket);
return NULL;
}
- if (option_verbose > 1)
- ast_verbose(VERBOSE_PREFIX_2 "Using TOS bits %d\n", tos);
-
- if (setsockopt(netsocket, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)))
- ast_log(LOG_WARNING, "Unable to set TOS to %d\n", tos);
+ ast_netsock_set_qos(netsocket, tos, cos);
+
ast_enable_packet_fragmentation(netsocket);
if (!(ns = ast_calloc(1, sizeof(struct ast_netsock)))) {
@@ -172,7 +169,31 @@ struct ast_netsock *ast_netsock_bindaddr(struct ast_netsock_list *list, struct i
return ns;
}
-struct ast_netsock *ast_netsock_bind(struct ast_netsock_list *list, struct io_context *ioc, const char *bindinfo, int defaultport, int tos, ast_io_cb callback, void *data)
+int ast_netsock_set_qos(int netsocket, int tos, int cos)
+{
+ 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 {
+ if (option_verbose > 1)
+ ast_verbose(VERBOSE_PREFIX_2 "Using TOS bits %d\n", 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 {
+ if (option_verbose > 1)
+ ast_verbose(VERBOSE_PREFIX_2 "Using CoS mark %d\n", tos);
+ }
+#endif
+
+ return res;
+}
+
+
+struct ast_netsock *ast_netsock_bind(struct ast_netsock_list *list, struct io_context *ioc, const char *bindinfo, int defaultport, int tos, int cos, ast_io_cb callback, void *data)
{
struct sockaddr_in sin;
char *tmp;
@@ -193,7 +214,7 @@ struct ast_netsock *ast_netsock_bind(struct ast_netsock_list *list, struct io_co
inet_aton(host, &sin.sin_addr);
- return ast_netsock_bindaddr(list, ioc, &sin, tos, callback, data);
+ return ast_netsock_bindaddr(list, ioc, &sin, tos, cos, callback, data);
}
int ast_netsock_sockfd(const struct ast_netsock *ns)