diff --git a/include/net-snmp/library/default_store.h b/include/net-snmp/library/default_store.h
old mode 100644
new mode 100755
index e743c1d..02c7929
--- a/include/net-snmp/library/default_store.h
+++ b/include/net-snmp/library/default_store.h
@@ -118,6 +118,7 @@ extern          "C" {
 #define NETSNMP_DS_SSHDOMAIN_SOCK_GROUP    13
 #define NETSNMP_DS_LIB_TIMEOUT             14
 #define NETSNMP_DS_LIB_RETRIES             15
+#define NETSNMP_DS_LIB_DSCP                16 /* DSCP (DiffServ) value */
 #define NETSNMP_DS_LIB_MAX_INT_ID          48 /* match NETSNMP_DS_MAX_SUBIDS */
     
     /*
diff --git a/include/net-snmp/library/snmpTCPBaseDomain.h b/include/net-snmp/library/snmpTCPBaseDomain.h
old mode 100644
new mode 100755
index 9c81a90..20e1402
--- a/include/net-snmp/library/snmpTCPBaseDomain.h
+++ b/include/net-snmp/library/snmpTCPBaseDomain.h
@@ -10,6 +10,7 @@ extern          "C" {
 /*
  * Prototypes
  */
+    void netsnmp_tcp_sockopt_set(int fd);
     int netsnmp_tcpbase_recv(netsnmp_transport *t, void *buf, int size,
                              void **opaque, int *olength);
     int netsnmp_tcpbase_send(netsnmp_transport *t, void *buf, int size,
diff --git a/include/net-snmp/library/snmpUDPBaseDomain.h b/include/net-snmp/library/snmpUDPBaseDomain.h
old mode 100644
new mode 100755
index 2665e98..061cdb3
--- a/include/net-snmp/library/snmpUDPBaseDomain.h
+++ b/include/net-snmp/library/snmpUDPBaseDomain.h
@@ -12,7 +12,7 @@ extern          "C" {
 /*
  * Prototypes
  */
-    void _netsnmp_udp_sockopt_set(int fd, int local);
+    void netsnmp_udp_sockopt_set(int fd, int local);
     int netsnmp_udpbase_recv(netsnmp_transport *t, void *buf, int size,
                              void **opaque, int *olength);
     int netsnmp_udpbase_send(netsnmp_transport *t, void *buf, int size,
diff --git a/snmplib/snmp_api.c b/snmplib/snmp_api.c
old mode 100644
new mode 100755
index 9e096b7..a495333
--- a/snmplib/snmp_api.c
+++ b/snmplib/snmp_api.c
@@ -782,7 +782,8 @@ register_default_handlers(void)
 		               NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_RETRIES);
     netsnmp_ds_register_config(ASN_OCTET_STR, "snmp", "outputPrecision",
                                NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OUTPUT_PRECISION);
-
+    netsnmp_ds_register_premib(ASN_INTEGER, "snmp", "dscp",
+                               NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DSCP);
 
     netsnmp_register_service_handlers();
 }
diff --git a/snmplib/transports/snmpTCPBaseDomain.c b/snmplib/transports/snmpTCPBaseDomain.c
old mode 100644
new mode 100755
index fc70dba..21b91af
--- a/snmplib/transports/snmpTCPBaseDomain.c
+++ b/snmplib/transports/snmpTCPBaseDomain.c
@@ -37,9 +37,31 @@
 
 #include <net-snmp/types.h>
 #include <net-snmp/output_api.h>
+#include <net-snmp/config_api.h>
 
 #include <net-snmp/library/snmp_transport.h>
 
+
+void
+netsnmp_tcp_sockopt_set(int fd)
+{
+    int dscp;
+
+    /* If configured (> 0), set the DSCP (DiffServ) value */
+    dscp = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DSCP);
+    if (dscp > 0)
+    {
+        char optval = (char)(dscp << 2);
+        DEBUGMSGTL(("socket:option", "setting TCP sock dscp %d\n", dscp));
+        if (setsockopt(fd, IPPROTO_IP, IP_TOS, &optval, sizeof(optval)) != 0)
+        {
+            snmp_log(LOG_ERR, "setsockopt: TCP dscp %d - %s\n",
+                     dscp, strerror(errno));
+        }
+    }
+}
+
+
 /*
  * You can write something into opaque that will subsequently get passed back 
  * to your send function if you like.  For instance, you might want to
diff --git a/snmplib/transports/snmpTCPDomain.c b/snmplib/transports/snmpTCPDomain.c
old mode 100644
new mode 100755
index 2eed07e..af4b32c
--- a/snmplib/transports/snmpTCPDomain.c
+++ b/snmplib/transports/snmpTCPDomain.c
@@ -37,6 +37,7 @@
 
 #include <net-snmp/types.h>
 #include <net-snmp/output_api.h>
+#include <net-snmp/config_api.h>
 
 #include <net-snmp/library/snmpIPv4BaseDomain.h>
 #include <net-snmp/library/snmpSocketBaseDomain.h>
@@ -203,6 +204,8 @@ netsnmp_tcp_transport(struct sockaddr_in *addr, int local)
 
     t->flags = NETSNMP_TRANSPORT_FLAG_STREAM;
 
+    netsnmp_tcp_sockopt_set(t->sock);
+
     if (local) {
 #ifndef NETSNMP_NO_LISTEN_SUPPORT
         int opt = 1;
diff --git a/snmplib/transports/snmpTCPIPv6Domain.c b/snmplib/transports/snmpTCPIPv6Domain.c
old mode 100644
new mode 100755
index 286767a..96b524c
--- a/snmplib/transports/snmpTCPIPv6Domain.c
+++ b/snmplib/transports/snmpTCPIPv6Domain.c
@@ -199,6 +199,8 @@ netsnmp_tcp6_transport(struct sockaddr_in6 *addr, int local)
 
     t->flags = NETSNMP_TRANSPORT_FLAG_STREAM;
 
+    netsnmp_tcp_sockopt_set(t->sock);
+
     if (local) {
 #ifndef NETSNMP_NO_LISTEN_SUPPORT
         int opt = 1;
diff --git a/snmplib/transports/snmpUDPBaseDomain.c b/snmplib/transports/snmpUDPBaseDomain.c
old mode 100644
new mode 100755
index 9b6f872..2d52d19
--- a/snmplib/transports/snmpUDPBaseDomain.c
+++ b/snmplib/transports/snmpUDPBaseDomain.c
@@ -53,8 +53,10 @@
 #endif
 
 void
-_netsnmp_udp_sockopt_set(int fd, int local)
+netsnmp_udp_sockopt_set(int fd, int local)
 {
+    int dscp;
+
 #ifdef  SO_BSDCOMPAT
     /*
      * Patch for Linux.  Without this, UDP packets that fail get an ICMP
@@ -98,6 +100,19 @@ _netsnmp_udp_sockopt_set(int fd, int local)
      */
     netsnmp_sock_buffer_set(fd, SO_SNDBUF, local, 0);
     netsnmp_sock_buffer_set(fd, SO_RCVBUF, local, 0);
+
+    /* If configured (!= 0), set the DSCP (DiffServ) value */
+    dscp = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DSCP);
+    if (dscp > 0)
+    {
+        char optval = (char)(dscp << 2) & 0xFC;
+        DEBUGMSGTL(("socket:option", "setting UDP sock dscp %d\n", dscp));
+        if (setsockopt(fd, IPPROTO_IP, IP_TOS, &optval, sizeof(optval)) != 0)
+        {
+            snmp_log(LOG_ERR, "setsockopt: UDP dscp %d - %s\n",
+                     dscp, strerror(errno));
+        }
+    }
 }
 
 #if defined(HAVE_IP_PKTINFO) || defined(HAVE_IP_RECVDSTADDR)
diff --git a/snmplib/transports/snmpUDPDomain.c b/snmplib/transports/snmpUDPDomain.c
old mode 100644
new mode 100755
index a0abd8c..7e2ab6c
--- a/snmplib/transports/snmpUDPDomain.c
+++ b/snmplib/transports/snmpUDPDomain.c
@@ -58,6 +58,7 @@
 
 #include <net-snmp/library/snmp_transport.h>
 #include <net-snmp/library/snmpSocketBaseDomain.h>
+#include <net-snmp/library/snmpUDPBaseDomain.h>
 #include <net-snmp/library/system.h>
 #include <net-snmp/library/tools.h>
 
@@ -84,7 +85,6 @@ typedef netsnmp_indexed_addr_pair netsnmp_udp_addr_pair;
  * not static, since snmpUDPIPv6Domain needs it, but not public, either.
  * (ie don't put it in a public header.)
  */
-void _netsnmp_udp_sockopt_set(int fd, int server);
 int
 netsnmp_sockaddr_in2(struct sockaddr_in *addr,
                      const char *inpeername, const char *default_target);
diff --git a/snmplib/transports/snmpUDPIPv4BaseDomain.c b/snmplib/transports/snmpUDPIPv4BaseDomain.c
old mode 100644
new mode 100755
index fa39e4b..da4ec45
--- a/snmplib/transports/snmpUDPIPv4BaseDomain.c
+++ b/snmplib/transports/snmpUDPIPv4BaseDomain.c
@@ -112,7 +112,7 @@ netsnmp_udpipv4base_transport(struct sockaddr_in *addr, int local)
         return NULL;
     }
 
-    _netsnmp_udp_sockopt_set(t->sock, local);
+    netsnmp_udp_sockopt_set(t->sock, local);
 
     if (local) {
 #ifndef NETSNMP_NO_LISTEN_SUPPORT
diff --git a/snmplib/transports/snmpUDPIPv6Domain.c b/snmplib/transports/snmpUDPIPv6Domain.c
old mode 100644
new mode 100755
index b42327e..5a82984
--- a/snmplib/transports/snmpUDPIPv6Domain.c
+++ b/snmplib/transports/snmpUDPIPv6Domain.c
@@ -65,6 +65,7 @@ static const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
 
 #include <net-snmp/library/snmp_transport.h>
 #include <net-snmp/library/snmpSocketBaseDomain.h>
+#include <net-snmp/library/snmpUDPBaseDomain.h>
 #include <net-snmp/library/tools.h>
 
 #ifndef NETSNMP_NO_SYSTEMD
@@ -77,11 +78,6 @@ static const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
 oid netsnmp_UDPIPv6Domain[] = { TRANSPORT_DOMAIN_UDP_IPV6 };
 static netsnmp_tdomain udp6Domain;
 
-/*
- * from snmpUDPDomain. not static, but not public, either.
- * (ie don't put it in a public header.)
- */
-extern void _netsnmp_udp_sockopt_set(int fd, int server);
 
 /*
  * Return a string representing the address in data, or else the "far end"
@@ -240,7 +236,7 @@ netsnmp_udp6_transport(struct sockaddr_in6 *addr, int local)
         return NULL;
     }
 
-    _netsnmp_udp_sockopt_set(t->sock, local);
+    netsnmp_udp_sockopt_set(t->sock, local);
 
     if (local) {
 #ifndef NETSNMP_NO_LISTEN_SUPPORT
