diff --git a/sk.c b/sk.c index 43f1800..e2b1f28 100644 --- a/sk.c +++ b/sk.c @@ -406,13 +406,26 @@ int sk_receive(int fd, void *buf, int buflen, return cnt; } -int sk_set_priority(int fd, uint8_t dscp) +int sk_set_priority(int fd, int family, uint8_t dscp) { - int tos; + int level, optname, tos; socklen_t tos_len; + switch (family) { + case AF_INET: + level = IPPROTO_IP; + optname = IP_TOS; + break; + case AF_INET6: + level = IPPROTO_IPV6; + optname = IPV6_TCLASS; + break; + default: + return -1; + } + tos_len = sizeof(tos); - if (getsockopt(fd, SOL_IP, IP_TOS, &tos, &tos_len) < 0) { + if (getsockopt(fd, level, optname, &tos, &tos_len) < 0) { tos = 0; } @@ -422,7 +435,7 @@ int sk_set_priority(int fd, uint8_t dscp) /* set new DSCP value */ tos |= dscp<<2; tos_len = sizeof(tos); - if (setsockopt(fd, SOL_IP, IP_TOS, &tos, tos_len) < 0) { + if (setsockopt(fd, level, optname, &tos, tos_len) < 0) { return -1; } diff --git a/sk.h b/sk.h index fd4d820..04d26ee 100644 --- a/sk.h +++ b/sk.h @@ -111,11 +111,12 @@ int sk_receive(int fd, void *buf, int buflen, /** * Set DSCP value for socket. - * @param fd An open socket. - * @param dscp The desired DSCP code. + * @param fd An open socket. + * @param family The address family in use: AF_INET or AF_INET6 + * @param dscp The desired DSCP code. * @return Zero on success, negative on failure */ -int sk_set_priority(int fd, uint8_t dscp); +int sk_set_priority(int fd, int family, uint8_t dscp); /** * Enable time stamping on a given network interface. diff --git a/udp.c b/udp.c index 62b5c72..48af482 100644 --- a/udp.c +++ b/udp.c @@ -188,10 +188,10 @@ static int udp_open(struct transport *t, struct interface *iface, event_dscp = config_get_int(t->cfg, NULL, "dscp_event"); general_dscp = config_get_int(t->cfg, NULL, "dscp_general"); - if (event_dscp && sk_set_priority(efd, event_dscp)) { + if (event_dscp && sk_set_priority(efd, AF_INET, event_dscp)) { pr_warning("Failed to set event DSCP priority."); } - if (general_dscp && sk_set_priority(gfd, general_dscp)) { + if (general_dscp && sk_set_priority(gfd, AF_INET, general_dscp)) { pr_warning("Failed to set general DSCP priority."); } diff --git a/udp6.c b/udp6.c index d3c9c86..908f307 100644 --- a/udp6.c +++ b/udp6.c @@ -199,10 +199,10 @@ static int udp6_open(struct transport *t, struct interface *iface, event_dscp = config_get_int(t->cfg, NULL, "dscp_event"); general_dscp = config_get_int(t->cfg, NULL, "dscp_general"); - if (event_dscp && sk_set_priority(efd, event_dscp)) { + if (event_dscp && sk_set_priority(efd, AF_INET6, event_dscp)) { pr_warning("Failed to set event DSCP priority."); } - if (general_dscp && sk_set_priority(gfd, general_dscp)) { + if (general_dscp && sk_set_priority(gfd, AF_INET6, general_dscp)) { pr_warning("Failed to set general DSCP priority."); }