diff --git a/include/net-snmp/library/snmpUDPBaseDomain.h b/include/net-snmp/library/snmpUDPBaseDomain.h
index 93b8745d2a..dd708bbdba 100644
--- a/include/net-snmp/library/snmpUDPBaseDomain.h
+++ b/include/net-snmp/library/snmpUDPBaseDomain.h
@@ -23,6 +23,9 @@ extern          "C" {
                              void **opaque, int *olength);
     int netsnmp_udpbase_send(netsnmp_transport *t, const void *buf, int size,
                              void **opaque, int *olength);
+    int netsnmp_udpbase_session_init(struct netsnmp_transport_s *,
+                                     struct snmp_session *sess);
+
 
 #if defined(HAVE_IP_PKTINFO) || defined(HAVE_IP_RECVDSTADDR)
     int netsnmp_udpbase_recvfrom(int s, void *buf, int len,
diff --git a/snmplib/transports/snmpUDPBaseDomain.c b/snmplib/transports/snmpUDPBaseDomain.c
index f9b2d77647..2586c2612b 100644
--- a/snmplib/transports/snmpUDPBaseDomain.c
+++ b/snmplib/transports/snmpUDPBaseDomain.c
@@ -530,6 +530,42 @@ netsnmp_udpbase_send(netsnmp_transport *t, const void *buf, int size,
     return rc;
 }
 
+int netsnmp_udpbase_session_init(struct netsnmp_transport_s * transport,
+                                 struct snmp_session *sess)
+{
+    if (!sess) {
+        DEBUGMSGTL(("netsnmp_udpbase", "session pointer is NULL\n"));
+        return SNMPERR_SUCCESS;
+    }
+    
+    union {
+        struct sockaddr     sa;
+        struct sockaddr_in  sin;
+        struct sockaddr_in6 sin6;
+    } ss;
+    socklen_t len = sizeof(ss);
+    if (getsockname(transport->sock, (struct sockaddr *)&ss, &len) == -1) {
+        DEBUGMSGTL(("netsnmp_udpbase", "getsockname error %s\n", strerror(errno)));
+        return SNMPERR_SUCCESS;
+    }
+    switch (ss.sa.sa_family) {
+        case AF_INET:
+            sess->local_port = ntohs(ss.sin.sin_port);
+            break;
+        case AF_INET6:
+            sess->local_port = ntohs(ss.sin6.sin6_port);
+            break;
+        default:
+            DEBUGMSGTL(("netsnmp_udpbase", "unsupported address family %d\n",
+                        ss.sa.sa_family));
+            return SNMPERR_SUCCESS;
+    }
+    
+    DEBUGMSGTL(("netsnmp_udpbase", "local port number %d\n", sess->local_port));
+    
+    return SNMPERR_SUCCESS;
+}
+
 void
 netsnmp_udp_base_ctor(void)
 {
diff --git a/snmplib/transports/snmpUDPDomain.c b/snmplib/transports/snmpUDPDomain.c
index 6e7705516b..f6b2e2047c 100644
--- a/snmplib/transports/snmpUDPDomain.c
+++ b/snmplib/transports/snmpUDPDomain.c
@@ -194,6 +194,7 @@ netsnmp_udp_transport_base(netsnmp_transport *t)
     t->f_send     = netsnmp_udpbase_send;
     t->f_close    = netsnmp_socketbase_close;
     t->f_accept   = NULL;
+    t->f_setup_session = netsnmp_udpbase_session_init;
     t->f_fmtaddr  = netsnmp_udp_fmtaddr;
     t->f_get_taddr = netsnmp_ipv4_get_taddr;
 
diff --git a/snmplib/transports/snmpUDPIPv6Domain.c b/snmplib/transports/snmpUDPIPv6Domain.c
index 5ae7bd8d05..6b879ab74b 100644
--- a/snmplib/transports/snmpUDPIPv6Domain.c
+++ b/snmplib/transports/snmpUDPIPv6Domain.c
@@ -470,6 +470,7 @@ netsnmp_udp6_transport_init(const struct netsnmp_ep *ep, int flags)
     t->f_send     = netsnmp_udp6_send;
     t->f_close    = netsnmp_socketbase_close;
     t->f_accept   = NULL;
+    t->f_setup_session = netsnmp_udpbase_session_init;
     t->f_fmtaddr  = netsnmp_udp6_fmtaddr;
     t->f_get_taddr = netsnmp_ipv6_get_taddr;
 
