aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authordvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-10-14 22:09:32 +0000
committerdvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-10-14 22:09:32 +0000
commit7d8031c5594f55b0ca99853c4fbe1d0969548ff1 (patch)
tree81aedde2d885f3effaf53ffa266e0b763c9626d9 /main
parentbf1e6569f0393d06aa3a85f341e620d82b126616 (diff)
Set TCLASS field of IPv6 header when sip qos options are set.
(closes issue #18099) Reported by: jamesnet Patches: issues_18099_v2.diff uploaded by dvossel (license 671) Tested by: dvossel, jamesnet git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.8@291829 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/netsock2.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/main/netsock2.c b/main/netsock2.c
index 99f7eac89..ed5964db8 100644
--- a/main/netsock2.c
+++ b/main/netsock2.c
@@ -454,8 +454,17 @@ ssize_t ast_sendto(int sockfd, const void *buf, size_t len, int flags,
int ast_set_qos(int sockfd, int tos, int cos, const char *desc)
{
int res;
+ int proto_type = IPPROTO_IP; /* ipv4 values by default */
+ int dscp_field = IP_TOS;
+ struct ast_sockaddr addr;
- if ((res = setsockopt(sockfd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)))) {
+ /* if this is IPv6 we need to set the TCLASS instead of TOS */
+ if (!ast_getsockname(sockfd, &addr) && ast_sockaddr_is_ipv6(&addr)) {
+ proto_type = IPPROTO_IPV6;
+ dscp_field = IPV6_TCLASS;
+ }
+
+ if ((res = setsockopt(sockfd, proto_type, dscp_field, &tos, sizeof(tos)))) {
ast_log(LOG_WARNING, "Unable to set %s TOS to %d (may be you have no "
"root privileges): %s\n", desc, tos, strerror(errno));
} else if (tos) {