Signed-off-by: Anders Selhammer <[email protected]>
---
 sk.c   | 21 +++++++++++++++++----
 sk.h   |  7 ++++---
 udp.c  |  4 ++--
 udp6.c |  4 ++--
 4 files changed, 25 insertions(+), 11 deletions(-)

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.");
        }
 
-- 
1.8.3.1



_______________________________________________
Linuxptp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to