File 7702-erts-inet-drv-kernel-Add-support-for-inet-drv-debug.patch of Package erlang

From 6dab4c8153aa86dc7ba9e3c44fd74f8393a30694 Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Tue, 3 May 2022 10:36:52 +0200
Subject: [PATCH 2/7] [erts|inet-drv,kernel] Add support for inet-drv debug

Make it possible to use the debug option (for inet
driver debug) in gen_tcp (both when creating sockets
(listen and connect) and after they have been created
(using inet:setopts/2)), gen_udp and gen_sctp).

OTP-18032
---
 erts/emulator/drivers/common/inet_drv.c | 1292 ++++++++++++++++++-----
 lib/kernel/src/inet.erl                 |    9 +-
 2 files changed, 1044 insertions(+), 257 deletions(-)

diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c
index b0e8d5ee30..136debcc7a 100644
--- a/erts/emulator/drivers/common/inet_drv.c
+++ b/erts/emulator/drivers/common/inet_drv.c
@@ -111,6 +111,46 @@
 
 #include "erl_driver.h"
 
+
+#if !defined(TRUE)
+#define TRUE  1
+#endif
+#if !defined(FALSE)
+#define FALSE 0
+#endif
+
+/* Descriptor debug */
+#ifdef INET_DRV_DEBUG
+#define DDBG_DEFAULT TRUE
+#else
+#define DDBG_DEFAULT FALSE
+#endif
+#define DDBG(__D__, __ARG__) if ( (__D__)->debug ) erts_printf __ARG__
+
+#define B2S(__B__)   ((__B__) ? "true" : "false")
+#define SH2S(__H__)  (((__H__) == TCP_SHUT_WR) ? "write" :          \
+                      (((__H__) == TCP_SHUT_RD) ? "read" :          \
+                       (((__H__) == TCP_SHUT_RDWR) ? "read-write" : \
+                        "undefined")))
+#define A2S(__A__)   (((__A__) == INET_PASSIVE) ? "passive" : \
+                      (((__A__) == INET_ACTIVE) ? "active" :  \
+                       (((__A__) == INET_ONCE) ? "once" :     \
+                        (((__A__) == INET_MULTI) ? "multi" :  \
+                         "undefined"))))
+#define M2S(__M__)   (((__M__) == INET_MODE_LIST) ? "list" :      \
+                      (((__M__) == INET_MODE_BINARY) ? "binary" : \
+                       "undefined"))
+#define D2S(__D__)   (((__D__) == INET_DELIVER_PORT) ? "port" :  \
+                      (((__D__) == INET_DELIVER_TERM) ? "term" : \
+                       "undefined"))
+
+#if defined(__WIN32__)
+#define SOCKET_FSTR "%lld"
+#else
+#define SOCKET_FSTR "%d"
+#endif
+
+
 /* The IS_SOCKET_ERROR macro below is used for portability reasons. While
    POSIX specifies that errors from socket-related system calls should be
    indicated with a -1 return value, some users have experienced non-Windows
@@ -847,6 +887,8 @@ static size_t my_strnlen(const char *s, size_t maxlen)
 #define INET_OPT_TTL                46  /* IP_TTL */
 #define INET_OPT_RECVTTL            47  /* IP_RECVTTL ancillary data */
 #define TCP_OPT_NOPUSH              48  /* super-Nagle, aka TCP_CORK */
+#define INET_LOPT_DEBUG             99  /* Enable/disable DEBUG for a socket */
+
 /* SCTP options: a separate range, from 100: */
 #define SCTP_OPT_RTOINFO		100
 #define SCTP_OPT_ASSOCINFO		101
@@ -1174,6 +1216,7 @@ typedef struct {
 				   as full file path */
 #endif
     int recv_cmsgflags;         /* Which ancillary data to expect */
+    int debug;                  /* debug enabled or not */
 } inet_descriptor;
 
 
@@ -4923,6 +4966,18 @@ static ErlDrvSSizeT inet_ctl_fdopen(inet_descriptor* desc, int domain, int type,
     inet_address name;
     SOCKLEN_T sz;
 
+    DDBG(desc,
+         ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+          "inet_ctl_fdopen -> entry with"
+          "\r\n   socket:  %d"
+          "\r\n   bound:   %s"
+          "\r\n   domain:  %d"
+          "\r\n   type:    %d"
+          "\r\n",
+          __LINE__,
+          desc->s, driver_caller(desc->port),
+          s, B2S(bound), domain, type) );
+
     if (bound) {
         /* check that it is a socket and that the socket is bound */
         sz = sizeof(name);
@@ -4956,6 +5011,12 @@ static ErlDrvSSizeT inet_ctl_fdopen(inet_descriptor* desc, int domain, int type,
 			 * not certain that we can open it again */
     desc->stype = type;
     desc->sfamily = domain;
+
+    DDBG(desc,
+         ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+          "inet_ctl_fdopen -> done\r\n",
+          __LINE__, desc->s, driver_caller(desc->port)) );
+
     return ctl_reply(INET_REP_OK, NULL, 0, rbuf, rsize);
 }
 
@@ -6501,7 +6562,6 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
     if (IS_SCTP(desc))
 	return sctp_set_opts(desc, ptr, len);
 #endif
-    /* XXX { int i; for(i=0;i<len;++i) fprintf(stderr,"0x%02X, ", (unsigned) ptr[i]); fprintf(stderr,"\r\n");} */
 
     while(len >= 5) {
         int recv_cmsgflags;
@@ -6516,47 +6576,74 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 	propagate = 0;
         recv_cmsgflags = desc->recv_cmsgflags;
 
-	switch(opt) {
+	DDBG(desc,
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "inet_set_opts -> opt: %d\r\n",
+	      __LINE__, desc->s, driver_caller(desc->port), opt) );
+
+ 	switch(opt) {
 	case INET_LOPT_HEADER:
-	    DEBUGF(("inet_set_opts(%p): s=%d, HEADER=%d\r\n",
-		    desc->port, desc->s,ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(header) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    desc->hsz = ival;
 	    continue;
 
 	case INET_LOPT_MODE:
 	    /* List or Binary: */
-	    DEBUGF(("inet_set_opts(%p): s=%d, MODE=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(mode) -> %s (%d)\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port),
+                  M2S(ival), ival) );
 	    desc->mode = ival;
 	    continue;
 
 	case INET_LOPT_DELIVER:
-	    DEBUGF(("inet_set_opts(%p): s=%d, DELIVER=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(deliver) -> %s (%d)\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port),
+                  D2S(ival), ival) );
 	    desc->deliver = ival;
 	    continue;
 	    
 	case INET_LOPT_BUFFER:
-	    DEBUGF(("inet_set_opts(%p): s=%d, BUFFER=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(buffer) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    if (ival < INET_MIN_BUFFER) ival = INET_MIN_BUFFER;
 	    desc->bufsz = ival;
             desc->flags |= INET_FLG_BUFFER_SET;
 	    continue;
 
 	case INET_LOPT_ACTIVE:
-	    DEBUGF(("inet_set_opts(%p): s=%d, ACTIVE=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(active) -> active (ival): %s (%d)\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port),
+                  A2S(ival), ival) );
 	    desc->active = ival;
             if (desc->active == INET_MULTI) {
-                long ac = desc->active_count;
+                long   ac   = desc->active_count;
                 Sint16 nval = get_int16(ptr);
                 ptr += 2;
                 len -= 2;
+                DDBG(desc,
+                     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                      "inet_set_opts(active) -> nval: %d\r\n",
+                      __LINE__, desc->s, driver_caller(desc->port), nval) );
                 ac += nval;
                 if (ac > INT16_MAX || ac < INT16_MIN)
                     return -1;
                 desc->active_count += nval;
+                DDBG(desc,
+                     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                      "inet_set_opts(active) -> count => %d\r\n",
+                      __LINE__, desc->s, driver_caller(desc->port),
+                      desc->active_count) );
                 if (desc->active_count < 0)
                     desc->active_count = 0;
                 if (desc->active_count == 0) {
@@ -6583,24 +6670,35 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    continue;
 
 	case INET_LOPT_PACKET:
-	    DEBUGF(("inet_set_opts(%p): s=%d, PACKET=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(packet) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    desc->htype = ival;
 	    continue;
 
 	case INET_LOPT_PACKET_SIZE:
-	    DEBUGF(("inet_set_opts(%p): s=%d, PACKET_SIZE=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(packet-size) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    desc->psize = (unsigned int)ival;
 	    continue;
 
 	case INET_LOPT_EXITONCLOSE:
-	    DEBUGF(("inet_set_opts(%p): s=%d, EXITONCLOSE=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(exit-on-close) -> %d (%s)\r\n",
+                  __LINE__,
+                  desc->s, driver_caller(desc->port), ival, B2S(ival)) );
 	    desc->exitf = ival;
 	    continue;
 
 	case INET_LOPT_TCP_HIWTRMRK:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(hiwtrmrk) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    if (desc->stype == SOCK_STREAM) {
 		tcp_descriptor* tdesc = (tcp_descriptor*) desc;
 		if (ival < 0) ival = 0;
@@ -6611,6 +6709,10 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    continue;
 
 	case INET_LOPT_TCP_LOWTRMRK:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(lowtrmrk) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    if (desc->stype == SOCK_STREAM) {
 		tcp_descriptor* tdesc = (tcp_descriptor*) desc;
 		if (ival < 0) ival = 0;
@@ -6622,6 +6724,10 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 
 	case INET_LOPT_MSGQ_HIWTRMRK: {
 	    ErlDrvSizeT high;
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(msgq-hiwtrmrk) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    if (ival < ERL_DRV_BUSY_MSGQ_LIM_MIN
 		|| ERL_DRV_BUSY_MSGQ_LIM_MAX < ival)
 		return -1;
@@ -6632,6 +6738,10 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 
 	case INET_LOPT_MSGQ_LOWTRMRK: {
 	    ErlDrvSizeT low;
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(msgq-lowtrmrk) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    if (ival < ERL_DRV_BUSY_MSGQ_LIM_MIN
 		|| ERL_DRV_BUSY_MSGQ_LIM_MAX < ival)
 		return -1;
@@ -6641,6 +6751,10 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 	}
 
 	case INET_LOPT_TCP_SEND_TIMEOUT:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(send-timeout) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    if (desc->stype == SOCK_STREAM) {
 		tcp_descriptor* tdesc = (tcp_descriptor*) desc;
 		tdesc->send_timeout = ival;
@@ -6648,6 +6762,10 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    continue;
 
 	case INET_LOPT_TCP_SEND_TIMEOUT_CLOSE:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(send-timeout-close) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    if (desc->stype == SOCK_STREAM) {
 		tcp_descriptor* tdesc = (tcp_descriptor*) desc;
 		tdesc->send_timeout_close = ival;
@@ -6656,6 +6774,11 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    
 
 	case INET_LOPT_TCP_DELAY_SEND:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(delay-send) -> %d (%s)\r\n",
+                  __LINE__,
+                  desc->s, driver_caller(desc->port), ival, B2S(ival)) );
 	    if (desc->stype == SOCK_STREAM) {
 		tcp_descriptor* tdesc = (tcp_descriptor*) desc;
 		if (ival)
@@ -6667,6 +6790,10 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 
 #ifdef HAVE_UDP
 	case INET_LOPT_UDP_READ_PACKETS:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(read-packets) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    if (desc->stype == SOCK_DGRAM) {
 		udp_descriptor* udesc = (udp_descriptor*) desc;
 		if (ival <= 0) return -1;
@@ -6677,6 +6804,10 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 
 #ifdef HAVE_SETNS
 	case INET_LOPT_NETNS:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(netns) -> %d, %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival, len) );
 	    /* It is annoying that ival and len are both (signed) int */
 	    if (ival < 0) return -1;
 	    if (len < ival) return -1;
@@ -6690,6 +6821,11 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 #endif
 
 	case INET_LOPT_TCP_SHOW_ECONNRESET:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(show-econnreset) -> %d (%s)\r\n",
+                  __LINE__,
+                  desc->s, driver_caller(desc->port), ival, B2S(ival)) );
 	    if (desc->sprotocol == IPPROTO_TCP) {
 		tcp_descriptor* tdesc = (tcp_descriptor*) desc;
 		if (ival)
@@ -6700,8 +6836,11 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    continue;
 
 	case INET_LOPT_LINE_DELIM:
-	    DEBUGF(("inet_set_opts(%p): s=%d, LINE_DELIM=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(line-delimiter) -> %c (%d)\r\n",
+                  __LINE__,
+                  desc->s, driver_caller(desc->port), (char) ival, ival) );
 	    desc->delimiter = (char)ival;
 	    continue;
 
@@ -6712,32 +6851,51 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
              * which we don't support anymore!
              */
 	case INET_OPT_REUSEADDR: type = SO_REUSEADDR;
-	    DEBUGF(("inet_set_opts(%p): s=%d, SO_REUSEADDR=%d\r\n",
-		    desc->port, desc->s,ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(reuseaddr) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
 	    break;
+
 	case INET_OPT_KEEPALIVE: type = SO_KEEPALIVE;
-	    DEBUGF(("inet_set_opts(%p): s=%d, SO_KEEPALIVE=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(keepalive) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
 	    break;
+
 	case INET_OPT_DONTROUTE: type = SO_DONTROUTE;
-	    DEBUGF(("inet_set_opts(%p): s=%d, SO_DONTROUTE=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(dontroute) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
 	    break;
+
 	case INET_OPT_BROADCAST: type = SO_BROADCAST;
-	    DEBUGF(("inet_set_opts(%p): s=%d, SO_BROADCAST=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(broadcast) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
 	    break;
+
 	case INET_OPT_OOBINLINE: type = SO_OOBINLINE; 
-	    DEBUGF(("inet_set_opts(%p): s=%d, SO_OOBINLINE=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(oobinline) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
 	    break;
-	case INET_OPT_SNDBUF:    type = SO_SNDBUF; 
-	    DEBUGF(("inet_set_opts(%p): s=%d, SO_SNDBUF=%d\r\n",
-		    desc->port, desc->s, ival));
+
+	case INET_OPT_SNDBUF:    type = SO_SNDBUF;             DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(sndbuf) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    break;
+
 	case INET_OPT_RCVBUF:    type = SO_RCVBUF; 
-	    DEBUGF(("inet_set_opts(%p): s=%d, SO_RCVBUF=%d\r\n",
-		    desc->port, desc->s, ival));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(rcvbuf) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
             if (!(desc->flags & INET_FLG_BUFFER_SET)) {
                 /* make sure we have desc->bufsz >= SO_RCVBUF */
                 if (ival > (1 << 16) && desc->stype == SOCK_DGRAM && !IS_SCTP(desc))
@@ -6749,6 +6907,7 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
                     desc->bufsz = ival;
             }
 	    break;
+
 	case INET_OPT_LINGER:    type = SO_LINGER; 
 	    if (len < 4)
 		return -1;
@@ -6758,9 +6917,14 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    len -= 4;
 	    arg_ptr = (char*) &li_val;
 	    arg_sz = sizeof(li_val);
-	    DEBUGF(("inet_set_opts(%p): s=%d, SO_LINGER=%d,%d",
-		    desc->port, desc->s,
-                    li_val.l_onoff,li_val.l_linger));
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(linger) -> %d, %d\r\n",
+                  __LINE__,
+                  desc->s, driver_caller(desc->port),
+                  li_val.l_onoff, li_val.l_linger) );
+
 	    if (desc->sprotocol == IPPROTO_TCP) {
 		tcp_descriptor* tdesc = (tcp_descriptor*) desc;
 		if (li_val.l_onoff && li_val.l_linger == 0)
@@ -6772,49 +6936,72 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 
 	case INET_OPT_PRIORITY: 
 #ifdef SO_PRIORITY
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(prio) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    type = SO_PRIORITY;
 	    propagate = 1; /* We do want to know if this fails */
-	    DEBUGF(("inet_set_opts(%p): s=%d, SO_PRIORITY=%d\r\n",
-		    desc->port, desc->s, ival));
 	    break;
 #else
             /* inet_fill_opts always returns a value for this option,
              * so we need to ignore it if not implemented */
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(prio) -> SKIP\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
 	    continue;
 #endif
+
 	case INET_OPT_TOS:
 #if defined(IP_TOS) && defined(IPPROTO_IP)
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(tos) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    proto = IPPROTO_IP;
 	    type = IP_TOS;
 	    propagate = 1;
-	    DEBUGF(("inet_set_opts(%p): s=%d, IP_TOS=%d\r\n",
-		    desc->port, desc->s, ival));
 	    break;
 #else
             /* inet_fill_opts always returns a value for this option,
              * so we need to ignore it if not implemented. */
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(tos) -> SKIP\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
 	    continue;
 #endif
+
 #if defined(IPV6_TCLASS) && defined(IPPROTO_IPV6)
 	case INET_OPT_TCLASS:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(tclass) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    proto = IPPROTO_IPV6;
 	    type = IPV6_TCLASS;
 	    propagate = 1;
-	    DEBUGF(("inet_set_opts(%p): s=%d, IPV6_TCLASS=%d\r\n",
-		    desc->port, desc->s, ival));
 	    break;
 #endif
+
 #if defined(IP_TTL) && defined(IPPROTO_IP)
 	case INET_OPT_TTL:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(ttl) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    proto = IPPROTO_IP;
 	    type = IP_TTL;
 	    propagate = 1;
-	    DEBUGF(("inet_set_opts(%p): s=%d, IP_TTL=%d\r\n",
-		    desc->port, desc->s, ival));
 	    break;
 #endif
 #if defined(IP_RECVTOS) && defined(IPPROTO_IP)
 	case INET_OPT_RECVTOS:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(recvtos) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    proto = IPPROTO_IP;
 	    type = IP_RECVTOS;
 	    propagate = 1;
@@ -6822,12 +7009,14 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
                 ival ?
                 (desc->recv_cmsgflags | INET_CMSG_RECVTOS) :
                 (desc->recv_cmsgflags & ~INET_CMSG_RECVTOS);
-	    DEBUGF(("inet_set_opts(%p): s=%d, IP_RECVTOS=%d\r\n",
-		    desc->port, desc->s, ival));
 	    break;
 #endif
 #if defined(IPV6_RECVTCLASS) && defined(IPPROTO_IPV6)
 	case INET_OPT_RECVTCLASS:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(recvtclass) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    proto = IPPROTO_IPV6;
 	    type = IPV6_RECVTCLASS;
 	    propagate = 1;
@@ -6835,12 +7024,14 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
                 ival ?
                 (desc->recv_cmsgflags | INET_CMSG_RECVTCLASS) :
                 (desc->recv_cmsgflags & ~INET_CMSG_RECVTCLASS);
-	    DEBUGF(("inet_set_opts(%p): s=%d, IPV6_RECVTCLASS=%d\r\n",
-		    desc->port, desc->s, ival));
 	    break;
 #endif
 #if defined(IP_RECVTTL) && defined(IPPROTO_IP)
 	case INET_OPT_RECVTTL:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(recvttl) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    proto = IPPROTO_IP;
 	    type = IP_RECVTTL;
 	    propagate = 1;
@@ -6848,68 +7039,84 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
                 ival ?
                 (desc->recv_cmsgflags | INET_CMSG_RECVTTL) :
                 (desc->recv_cmsgflags & ~INET_CMSG_RECVTTL);
-	    DEBUGF(("inet_set_opts(%p): s=%d, IP_RECVTTL=%d\r\n",
-		    desc->port, desc->s, ival));
 	    break;
 #endif
 
 	case TCP_OPT_NODELAY:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(nodelay) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
 	    proto = IPPROTO_TCP; 
 	    type = TCP_NODELAY; 
-	    DEBUGF(("inet_set_opts(%p): s=%d, TCP_NODELAY=%d\r\n",
-		    desc->port, desc->s, ival));
 	    break;
 
 	case TCP_OPT_NOPUSH:
 #if defined(INET_TCP_NOPUSH)
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(nopush) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    proto = IPPROTO_TCP;
 	    type = INET_TCP_NOPUSH;
-	    DEBUGF(("inet_set_opts(%p): s=%d, t=%d TCP_NOPUSH=%d\r\n",
-	            desc->port, desc->s, type, ival));
 	    break;
 #else
 	    /* inet_fill_opts always returns a value for this option,
 	     * so we need to ignore it if not implemented, just in case */
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(nopush) -> SKIP\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
 	    continue;
 #endif
 
 #if defined(HAVE_MULTICAST_SUPPORT) && defined(IPPROTO_IP)
 
 	case UDP_OPT_MULTICAST_TTL:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(multicast-ttl) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    proto = IPPROTO_IP;
 	    type = IP_MULTICAST_TTL;
-	    DEBUGF(("inet_set_opts(%p): s=%d, IP_MULTICAST_TTL=%d\r\n",
-		    desc->port, desc->s,ival));
 	    break;
 
 	case UDP_OPT_MULTICAST_LOOP:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(multicast-loop) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
 	    proto = IPPROTO_IP;
 	    type = IP_MULTICAST_LOOP;
-	    DEBUGF(("inet_set_opts(%p): s=%d, IP_MULTICAST_LOOP=%d\r\n",
-		    desc->port, desc->s,ival));
 	    break;
 
 	case UDP_OPT_MULTICAST_IF:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(multicast-if) -> %d (%d)\r\n",
+                  __LINE__,
+                  desc->s, driver_caller(desc->port), ival, sock_htonl(ival)) );
 	    proto = IPPROTO_IP;
 	    type = IP_MULTICAST_IF;
-	    DEBUGF(("inet_set_opts(%p): s=%d, IP_MULTICAST_IF=%x\r\n",
-		    desc->port, desc->s, ival));
 	    ival = sock_htonl(ival);
 	    break;
 
 	case UDP_OPT_ADD_MEMBERSHIP:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(add-membership) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    proto = IPPROTO_IP;
 	    type = IP_ADD_MEMBERSHIP;
-	    DEBUGF(("inet_set_opts(%p): s=%d, IP_ADD_MEMBERSHIP=%d\r\n",
-		    desc->port, desc->s,ival));
 	    goto L_set_mreq;
 	    
 	case UDP_OPT_DROP_MEMBERSHIP:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(drop-membership) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    proto = IPPROTO_IP;
 	    type = IP_DROP_MEMBERSHIP;
-	    DEBUGF(("inet_set_opts(%p): s=%d, "
-                    "IP_DROP_MEMBERSHIP=%x\r\n",
-		    desc->port, desc->s, ival));
 	L_set_mreq:
 	    mreq_val.imr_multiaddr.s_addr = sock_htonl(ival);
 	    ival = get_int32(ptr);
@@ -6923,12 +7130,14 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 #endif /* defined(HAVE_MULTICAST_SUPPORT) && defined(IPPROTO_IP) */
 
 	case INET_OPT_IPV6_V6ONLY:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(ipv6-v6only) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
 #if HAVE_DECL_IPV6_V6ONLY && defined(IPPROTO_IPV6)
 	    proto = IPPROTO_IPV6;
 	    type = IPV6_V6ONLY;
 	    propagate = 1;
-	    DEBUGF(("inet_set_opts(%p): s=%d, IPV6_V6ONLY=%d\r\n",
-		    desc->port, desc->s, ival));
 	    break;
 #elif defined(__WIN32__) && defined(HAVE_IN6) && defined(AF_INET6)
 	    /* Fake a'la OpenBSD; set to 'true' is fine but 'false' invalid. */
@@ -6940,6 +7149,10 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 #endif
 
 	case INET_OPT_RAW:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(raw) -> %d, %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival, len) );
 	    if (len < 8) {
 		return -1;
 	    }
@@ -6959,6 +7172,10 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 
 #ifdef SO_BINDTODEVICE
 	case INET_OPT_BIND_TO_DEVICE:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(bindtodevice) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
 	    if (ival < 0) return -1;
 	    if (len < ival) return -1;
 	    if (ival > sizeof(ifname)) {
@@ -6974,27 +7191,49 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    arg_ptr = (char*)&ifname;
 	    arg_sz = sizeof(ifname);
 	    propagate = 1; /* We do want to know if this fails */
-
-	    DEBUGF(("inet_set_opts(%p): s=%d, SO_BINDTODEVICE=%s\r\n",
-		    desc->port, desc->s, ifname));
 	    break;
 #endif
 
-	default:
+	case INET_LOPT_DEBUG:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_set_opts(debug) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
+            if (ival) {
+                desc->debug = TRUE;
+            } else {
+                desc->debug = FALSE;
+            }
+            continue; /* take care of next option */
+
+ 	default:
 	    return -1;
 	}
+
+
+	DDBG(desc,
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "inet_set_opts -> try set opt (%d) %d\r\n",
+	      __LINE__, desc->s, driver_caller(desc->port), proto, type) );
+
+
 #if  defined(IP_TOS) && defined(IPPROTO_IP) \
     && defined(SO_PRIORITY) && !defined(__WIN32__)
 	res = setopt_prio_tos_trick (desc->s, proto, type, arg_ptr, arg_sz, propagate);
 #else
 	res = sock_setopt	    (desc->s, proto, type, arg_ptr, arg_sz);
 #endif
+
+
+	DDBG(desc,
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "inet_set_opts -> set opt result: %d\r\n",
+	      __LINE__, desc->s, driver_caller(desc->port), res) );
+
         if (res == 0) desc->recv_cmsgflags = recv_cmsgflags;
 	if (propagate && res != 0) {
 	    return -1;
 	}
-	DEBUGF(("inet_set_opts(%p): s=%d returned %d\r\n",
-		desc->port, desc->s, res));
     }
 
     if ( ((desc->stype == SOCK_STREAM) && IS_CONNECTED(desc)) ||
@@ -7140,6 +7379,11 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
         eopt = *curr;
 	curr++;
 
+	DDBG(desc,
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "sctp_set_opts -> eopt: %d\r\n",
+	      __LINE__, desc->s, driver_caller(desc->port), eopt) );
+
         recv_cmsgflags = desc->recv_cmsgflags;
 	/* Get the option value.  XXX: The condition  (curr < ptr + len)
 	   does not preclude us from reading from beyond the buffer end,
@@ -7151,43 +7395,82 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	/* Local INET options: */
 
 	case INET_LOPT_BUFFER:
-	    desc->bufsz  = get_int32(curr);		curr += 4;
+            {
+                int ival = get_int32(curr);		curr += 4;
 
-	    if (desc->bufsz < INET_MIN_BUFFER)
-		desc->bufsz = INET_MIN_BUFFER;
-            desc->flags |= INET_FLG_BUFFER_SET;
-	    res = 0;	  /* This does not affect the kernel buffer size */
+                DDBG(desc,
+                     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                      "sctp_set_opts(buffer) -> %d\r\n",
+                      __LINE__, desc->s, driver_caller(desc->port), ival) );
+
+                desc->bufsz  = ival;
+
+                if (desc->bufsz < INET_MIN_BUFFER)
+                    desc->bufsz = INET_MIN_BUFFER;
+                desc->flags |= INET_FLG_BUFFER_SET;
+                res = 0;   /* This does not affect the kernel buffer size */
+            }
 	    continue;
 
 	case INET_LOPT_MODE:
-	    desc->mode   = get_int32(curr);		curr += 4;
-	    res = 0;
+            {
+                int ival = get_int32(curr);		curr += 4;
+
+                DDBG(desc,
+                     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                      "sctp_set_opts(mode) -> %s (%d)\r\n",
+                      __LINE__, desc->s, driver_caller(desc->port),
+                      M2S(ival), ival) );
+                     
+                desc->mode = ival;
+                res        = 0;
+            }
 	    continue;
 
 	case INET_LOPT_ACTIVE:
-	    desc->active = get_int32(curr);		curr += 4;
-            if (desc->active == INET_MULTI) {
-                long ac = desc->active_count;
-                Sint16 nval = get_int16(curr);          curr += 2;
-		ac += nval;
-                if (ac > INT16_MAX || ac < INT16_MIN)
-                    return -1;
-                desc->active_count += nval;
-                if (desc->active_count < 0)
+            {
+                int ival = get_int32(curr);		curr += 4;
+
+                DDBG(desc,
+                     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                      "sctp_set_opts(active) -> %s (%d)\r\n",
+                      __LINE__, desc->s, driver_caller(desc->port),
+                      A2S(ival), ival) );
+
+                desc->active = ival;
+                if (desc->active == INET_MULTI) {
+                    long   ac   = desc->active_count;
+                    Sint16 nval = get_int16(curr);          curr += 2;
+                    DDBG(desc,
+                         ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                          "sctp_set_opts(active) -> nval: %d\r\n",
+                      __LINE__, desc->s, driver_caller(desc->port), nval) );
+                    ac += nval;
+                    if (ac > INT16_MAX || ac < INT16_MIN)
+                        return -1;
+                    desc->active_count += nval;
+                    if (desc->active_count < 0)
+                        desc->active_count = 0;
+                    if (desc->active_count == 0) {
+                        desc->active = INET_PASSIVE;
+                        packet_passive_message(desc);
+                    }
+                } else
                     desc->active_count = 0;
-                if (desc->active_count == 0) {
-                    desc->active = INET_PASSIVE;
-                    packet_passive_message(desc);
-                }
-            } else
-                desc->active_count = 0;
-	    res = 0;
+                res = 0;
+            }
 	    continue;
 
 #ifdef HAVE_SETNS
 	case INET_LOPT_NETNS:
 	{
 	    size_t ns_len;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> NETNS\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    ns_len = get_int32(curr);                   curr += 4;
 	    CHKLEN(curr, ns_len);
 	    if (desc->netns != NULL) FREE(desc->netns);
@@ -7203,6 +7486,11 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 
 	case SCTP_OPT_RTOINFO:
 	{
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> RTOINFO\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    CHKLEN(curr, ASSOC_ID_LEN + 3*4);
 	    arg.rtoi.srto_assoc_id = GET_ASSOC_ID(curr);  curr += ASSOC_ID_LEN;
 	    arg.rtoi.srto_initial  = get_int32   (curr);  curr += 4;
@@ -7215,8 +7503,14 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    arg_sz  = sizeof  ( arg.rtoi);
 	    break;
 	}
+
 	case SCTP_OPT_ASSOCINFO:
 	{
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> ASSOCINFO\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    CHKLEN(curr, ASSOC_ID_LEN + 2*2 + 3*4);
 
 	    arg.ap.sasoc_assoc_id    = GET_ASSOC_ID(curr); curr += ASSOC_ID_LEN;
@@ -7233,8 +7527,14 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    arg_sz  = sizeof  ( arg.ap);
 	    break;
 	}
+
 	case SCTP_OPT_INITMSG:
 	{
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> INITMSG\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    CHKLEN(curr, SCTP_GET_INITMSG_LEN);
 	    curr  = sctp_get_initmsg (&arg.im, curr);
 
@@ -7244,8 +7544,14 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    arg_sz  = sizeof  ( arg.im);
 	    break;
 	}
+
 	case INET_OPT_LINGER:
 	{
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> LINGER\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    CHKLEN(curr, 2*4);
 	    arg.lin.l_onoff  = get_int32 (curr);  curr += 4;
 	    arg.lin.l_linger = get_int32 (curr);  curr += 4;
@@ -7256,8 +7562,14 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    arg_sz  = sizeof  ( arg.lin);
 	    break;
 	}
+
 	case SCTP_OPT_NODELAY:
 	{
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> NODELAY\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    arg.ival= get_int32 (curr);	  curr += 4;
 	    proto   = IPPROTO_SCTP;
 	    type    = SCTP_NODELAY;
@@ -7265,9 +7577,17 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    arg_sz  = sizeof  ( arg.ival);
 	    break;
 	}
+
 	case INET_OPT_RCVBUF:
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(rcvbuf) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
+
+	    arg.ival= ival;
 	    proto   = SOL_SOCKET;
 	    type    = SO_RCVBUF;
 	    arg_ptr = (char*) (&arg.ival);
@@ -7280,9 +7600,17 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
             desc->flags |= INET_FLG_BUFFER_SET;
 	    break;
 	}
+
 	case INET_OPT_SNDBUF:
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(sndbuf) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
+
+	    arg.ival= ival;
 	    proto   = SOL_SOCKET;
 	    type    = SO_SNDBUF;
 	    arg_ptr = (char*) (&arg.ival);
@@ -7292,6 +7620,11 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	}
 	case INET_OPT_REUSEADDR:
 	{
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> REUSEADDR\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    arg.ival= get_int32 (curr);	  curr += 4;
 	    proto   = SOL_SOCKET;
 	    type    = SO_REUSEADDR;
@@ -7301,21 +7634,36 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	}
 	case INET_OPT_DONTROUTE:
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
-	    proto   = SOL_SOCKET;
-	    type    = SO_DONTROUTE;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(dontroute) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
+
+	    arg.ival = ival;
+	    proto    = SOL_SOCKET;
+	    type     = SO_DONTROUTE;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
 	    break;
 	}
+
 	case INET_OPT_PRIORITY:
 #	ifdef SO_PRIORITY
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
-	    proto   = SOL_SOCKET;
-	    type    = SO_PRIORITY;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(prio) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
+
+	    arg.ival = ival;
+	    proto    = SOL_SOCKET;
+	    type     = SO_PRIORITY;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
 	    break;
 	}
 #	else
@@ -7327,11 +7675,17 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	case INET_OPT_TOS:
 #	if defined(IP_TOS) && defined(IPPROTO_IP)
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
-	    proto   = IPPROTO_IP;
-	    type    = IP_TOS;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(tos) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
+
+	    arg.ival = ival;
+	    proto    = IPPROTO_IP;
+	    type     = IP_TOS;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
 	    break;
 	}
 #	else
@@ -7343,11 +7697,18 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 #       if defined(IPV6_TCLASS) && defined(IPPROTO_IPV6)
 	case INET_OPT_TCLASS:
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
-	    proto   = IPPROTO_IPV6;
-	    type    = IPV6_TCLASS;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(tclass) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
+
+	    arg.ival = ival;
+	    proto    = IPPROTO_IPV6;
+	    type     = IPV6_TCLASS;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
 	    break;
 	}
 #	endif
@@ -7355,11 +7716,18 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 #       if defined(IP_TTL) && defined(IPPROTO_IP)
 	case INET_OPT_TTL:
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
-	    proto   = IPPROTO_IP;
-	    type    = IP_TTL;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(ttl) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
+
+	    arg.ival = ival;
+	    proto    = IPPROTO_IP;
+	    type     = IP_TTL;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
 	    break;
 	}
 #	endif
@@ -7367,11 +7735,18 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 #	if defined(IP_RECVTOS) && defined(IPPROTO_IP)
 	case INET_OPT_RECVTOS:
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
-	    proto   = IPPROTO_IP;
-	    type    = IP_RECVTOS;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(recvtos) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
+
+	    arg.ival = ival;
+	    proto    = IPPROTO_IP;
+	    type     = IP_RECVTOS;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
             recv_cmsgflags =
                 arg.ival ?
                 (desc->recv_cmsgflags | INET_CMSG_RECVTOS) :
@@ -7383,11 +7758,18 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 #       if defined(IPV6_RECVTCLASS) && defined(IPPROTO_IPV6)
 	case INET_OPT_RECVTCLASS:
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
-	    proto   = IPPROTO_IPV6;
-	    type    = IPV6_RECVTCLASS;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(recvtclass) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
+
+	    arg.ival = ival;
+	    proto    = IPPROTO_IPV6;
+	    type     = IPV6_RECVTCLASS;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
             recv_cmsgflags =
                 arg.ival ?
                 (desc->recv_cmsgflags | INET_CMSG_RECVTCLASS) :
@@ -7399,11 +7781,18 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 #	if defined(IP_RECVTTL) && defined(IPPROTO_IP)
 	case INET_OPT_RECVTTL:
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
-	    proto   = IPPROTO_IP;
-	    type    = IP_RECVTTL;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(recvttl) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
+
+	    arg.ival = ival;
+	    proto    = IPPROTO_IP;
+	    type     = IP_RECVTTL;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
             recv_cmsgflags =
                 arg.ival ?
                 (desc->recv_cmsgflags | INET_CMSG_RECVTTL) :
@@ -7416,11 +7805,18 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	case INET_OPT_IPV6_V6ONLY:
 #       if HAVE_DECL_IPV6_V6ONLY && defined(IPPROTO_IPV6)
 	{
-	    arg.ival= get_int32 (curr);   curr += 4;
-	    proto   = IPPROTO_IPV6;
-	    type    = IPV6_V6ONLY;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(ipv6_v6only) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
+
+	    arg.ival = ival;
+	    proto    = IPPROTO_IPV6;
+	    type     = IPV6_V6ONLY;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
 	    break;
 	}
 #       elif defined(__WIN32__) && defined(HAVE_IN6) && defined(AF_INET6)
@@ -7431,6 +7827,11 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 
 #ifdef SO_BINDTODEVICE
 	case INET_OPT_BIND_TO_DEVICE:
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> BIND_TO_DEVICE\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    arg_sz = get_int32(curr);			curr += 4;
 	    CHKLEN(curr, arg_sz);
 	    if (arg_sz >= sizeof(arg.ifname))
@@ -7448,45 +7849,82 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 
 	case SCTP_OPT_AUTOCLOSE:
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
-	    proto   = IPPROTO_SCTP;
-	    type    = SCTP_AUTOCLOSE;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(autoclose) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
+
+	    arg.ival = ival;
+	    proto    = IPPROTO_SCTP;
+	    type     = SCTP_AUTOCLOSE;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
 	    break;
 	}
+
 	case SCTP_OPT_DISABLE_FRAGMENTS:
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
-	    proto   = IPPROTO_SCTP;
-	    type    = SCTP_DISABLE_FRAGMENTS;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(disable_fragments) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
+
+	    arg.ival = ival;
+	    proto    = IPPROTO_SCTP;
+	    type     = SCTP_DISABLE_FRAGMENTS;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
 	    break;
 	}
+
 	case SCTP_OPT_I_WANT_MAPPED_V4_ADDR:
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
-	    proto   = IPPROTO_SCTP;
-	    type    = SCTP_I_WANT_MAPPED_V4_ADDR;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(i_want_mapped_v4_addr) -> %s\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), B2S(ival)) );
+
+	    arg.ival = ival;
+	    proto    = IPPROTO_SCTP;
+	    type     = SCTP_I_WANT_MAPPED_V4_ADDR;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
 	    break;
 	}
+
 	case SCTP_OPT_MAXSEG:
 	{
-	    arg.ival= get_int32 (curr);	  curr += 4;
-	    proto   = IPPROTO_SCTP;
-	    type    = SCTP_MAXSEG;
-	    arg_ptr = (char*) (&arg.ival);
-	    arg_sz  = sizeof  ( arg.ival);
+            int ival = get_int32 (curr);	  curr += 4;
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts(maxseg) -> %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port), ival) );
+
+	    arg.ival = ival;
+	    proto    = IPPROTO_SCTP;
+	    type     = SCTP_MAXSEG;
+	    arg_ptr  = (char*) (&arg.ival);
+	    arg_sz   = sizeof  ( arg.ival);
 	    break;
 	}
+
 	case SCTP_OPT_PRIMARY_ADDR:
 	case SCTP_OPT_SET_PEER_PRIMARY_ADDR:
 	{
 	    ErlDrvSizeT alen;
 	    
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> PRIMARY_ADDR | SET_PEER_PRIMARY_ADDR\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    CHKLEN(curr, ASSOC_ID_LEN);
 	    /* XXX: These 2 opts have isomorphic value data structures,
 	       "sctp_setpeerprim" and "sctp_prim" (in Solaris 10, the latter
@@ -7510,8 +7948,14 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    arg_sz   =  sizeof  ( arg.prim);
 	    break;
 	}
+
 	case SCTP_OPT_ADAPTATION_LAYER:
 	{
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> ADAPTATION_LAYER\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    /* XXX: do we need to convert the Ind into network byte order??? */
 	    arg.ad.ssb_adaptation_ind = sock_htonl (get_int32(curr));  curr += 4;
 
@@ -7521,6 +7965,7 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    arg_sz  = sizeof  ( arg.ad);
 	    break;
 	}
+
 	case SCTP_OPT_PEER_ADDR_PARAMS:
 	{
 	    ErlDrvSizeT alen;
@@ -7533,6 +7978,11 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 #           endif
 #           endif
 	    
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> PEER_ADDR_PARAMS\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    CHKLEN(curr, ASSOC_ID_LEN);
 	    arg.pap.spp_assoc_id = GET_ASSOC_ID(curr);	curr += ASSOC_ID_LEN;
 
@@ -7597,8 +8047,14 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    arg_sz  = sizeof  ( arg.pap);
 	    break;
 	}
+
 	case SCTP_OPT_DEFAULT_SEND_PARAM:
 	{
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> DEFAULT_SEND_PARAM\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    CHKLEN(curr, SCTP_GET_SENDPARAMS_LEN);
 	    curr = sctp_get_sendparams (&arg.sri, curr);
 
@@ -7609,8 +8065,14 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    VALGRIND_MAKE_MEM_DEFINED(arg_ptr, arg_sz); /*suppress "uninitialised bytes"*/
 	    break;
 	}
+
 	case SCTP_OPT_EVENTS:
 	{
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> EVENTS\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    CHKLEN(curr, 9);
 	    /* We do not support "sctp_authentication_event" -- it is not
 	       implemented in Linux Kernel SCTP anyway.   Just in case if
@@ -7644,6 +8106,11 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 #if defined(HAVE_DECL_SCTP_DELAYED_ACK_TIME) && defined(SCTP_ASSOC_VALUE_ASSOC_ID)
 	case SCTP_OPT_DELAYED_ACK_TIME:
 	{
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "sctp_set_opts -> DELAYED_ACK_TIME\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    CHKLEN(curr, ASSOC_ID_LEN + 4);
 	    arg.av.assoc_id    = GET_ASSOC_ID(curr);	curr += ASSOC_ID_LEN;
 	    arg.av.assoc_value = get_int32(curr);	curr += 4;
@@ -7655,6 +8122,26 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    break;
 	}
 #endif
+
+	case INET_LOPT_DEBUG:
+            {
+                int ival = get_int32(curr); curr += 4;
+
+                DDBG(desc,
+                     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                      "sctp_set_opts(debug) -> %s\r\n",
+                      __LINE__, desc->s, driver_caller(desc->port),
+                      B2S(ival)) );
+                if (ival) {
+                    desc->debug = TRUE;
+                } else {
+                    desc->debug = FALSE;
+                }
+
+                res = 0;
+            }
+            continue; /* take care of next option */
+
 	default:
 	    /* XXX: No more supported SCTP options. In particular, authentica-
 	       tion options (SCTP_AUTH_CHUNK, SCTP_AUTH_KEY, SCTP_PEER_AUTH_
@@ -7665,12 +8152,15 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
 	    */
 	    return -1;
 	}
+
+
 #if  defined(IP_TOS) && defined(IPPROTO_IP)             \
     && defined(SO_PRIORITY) && !defined(__WIN32__)
 	res = setopt_prio_tos_trick (desc->s, proto, type, arg_ptr, arg_sz, 1);
 #else
 	res = sock_setopt	    (desc->s, proto, type, arg_ptr, arg_sz);
 #endif
+
 	/* The return values of "sock_setopt" can only be 0 or -1: */
 	ASSERT(res == 0 || res == -1);
         if (res == 0) desc->recv_cmsgflags = recv_cmsgflags;
@@ -7788,7 +8278,13 @@ static ErlDrvSSizeT inet_fill_opts(inet_descriptor* desc,
 	dest_used = new_need;				\
     } while(0)
 
-    
+
+    DDBG(desc,
+         ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+          "inet_fill_opts -> entry\r\n",
+          __LINE__, desc->s, driver_caller(desc->port)) );
+
+
     PLACE_FOR(1,ptr);
     *ptr = INET_REP_OK;
 
@@ -7801,6 +8297,11 @@ static ErlDrvSSizeT inet_fill_opts(inet_descriptor* desc,
 
 	PLACE_FOR(5,ptr);
 
+	DDBG(desc,
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "inet_fill_opts -> opt %d\r\n",
+	      __LINE__, desc->s, driver_caller(desc->port), opt) );
+
 	switch(opt) {
 	case INET_LOPT_BUFFER:
 	    *ptr++ = opt;
@@ -8234,11 +8735,32 @@ static ErlDrvSSizeT inet_fill_opts(inet_descriptor* desc,
         }
 #endif /* #ifdef __WIN32__ */
 
+	case INET_LOPT_DEBUG:
+            *ptr++ = opt;
+            ival = desc->debug;
+            put_int32(ival, ptr);
+            continue;
+
 	default:
 	    RETURN_ERROR();
 	}
+
+	DDBG(desc,
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "inet_fill_opts -> try get opt (proto %d, type %d)\r\n",
+	      __LINE__, desc->s, driver_caller(desc->port), proto, type) );
+
 	/* We have 5 bytes allocated to ptr */
 	if (IS_SOCKET_ERROR(sock_getopt(desc->s,proto,type,arg_ptr,&arg_sz))) {
+            int save_errno = sock_errno();
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "inet_fill_opts -> failed get option (%d) %d: "
+                  "\r\n   errno: %d\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port),
+                  proto, type, save_errno) );
+
 	    TRUNCATE_TO(0,ptr);
 	    continue;
 	}
@@ -9254,6 +9776,11 @@ static ErlDrvSSizeT inet_subscribe(inet_descriptor* desc,
 /* Terminate socket */
 static void inet_stop(inet_descriptor* desc)
 {
+    DDBG(desc,
+         ("INET-DRV-DBG[%d][" SOCKET_FSTR "] "
+          "inet_stop -> entry\r\n",
+          __LINE__, desc->s) );
+
     erl_inet_close(desc);
 #ifdef HAVE_SETNS
     if (desc->netns != NULL)
@@ -9361,6 +9888,8 @@ static ErlDrvData inet_start(ErlDrvPort port, int size, int protocol)
 
     desc->recv_cmsgflags = 0;
 
+    desc->debug = DDBG_DEFAULT;
+
     return (ErlDrvData)desc;
 }
 
@@ -9382,6 +9911,11 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
 	  ErlDrvSizeT i;
 	  int dstlen = 1;  /* Reply code */
 
+          DDBG(desc,
+               ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                "inet_ctl -> GETSTAT\r\n",
+                __LINE__, desc->s, driver_caller(desc->port)) );
+
 	  for (i = 0; i < len; i++) {
 	      switch(buf[i]) {
 	      case INET_STAT_SEND_OCT: dstlen += 9; break;
@@ -9389,7 +9923,7 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
 	      default: dstlen += 5; break;
 	      }
 	  }
-	  DEBUGF(("inet_ctl(%p): GETSTAT\r\n", (long) desc->port)); 
+
 	  if (dstlen > INET_MAX_OPT_BUFFER) /* sanity check */
 	      return 0;
 	  if (dstlen > rsize) {
@@ -9405,8 +9939,12 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
     case INET_REQ_SUBSCRIBE: {
 	  char* dst;
 	  int dstlen = 1 /* Reply code */ + len*5;
-	  DEBUGF(("inet_ctl(%p): INET_REQ_SUBSCRIBE\r\n",
-                  desc->port)); 
+
+          DDBG(desc,
+               ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                "inet_ctl -> SUBSCRIBE\r\n",
+                __LINE__, desc->s, driver_caller(desc->port)) );
+
 	  if (dstlen > INET_MAX_OPT_BUFFER) /* sanity check */
 	      return 0;
 	  if (dstlen > rsize) {
@@ -9421,7 +9959,12 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
 
     case INET_REQ_GETOPTS: {    /* get options */
 	ErlDrvSSizeT replen;
-	DEBUGF(("inet_ctl(%p): GETOPTS\r\n", desc->port)); 
+
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "inet_ctl -> GETOPTS\r\n",
+              __LINE__, desc->s, driver_caller(desc->port)) );
+
 #ifdef HAVE_SCTP
         if (IS_SCTP(desc))
         {
@@ -9436,37 +9979,63 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
     }
 
     case INET_REQ_GETIFLIST: {
-	DEBUGF(("inet_ctl(%p): GETIFLIST\r\n", desc->port)); 
+
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> GETIFLIST\r\n",
+              __LINE__, driver_caller(desc->port)) );
+
 	if (!IS_OPEN(desc))
 	    return ctl_xerror(EXBADPORT, rbuf, rsize);
 	return inet_ctl_getiflist(desc, rbuf, rsize);
     }
 
     case INET_REQ_GETIFADDRS: {
-	DEBUGF(("inet_ctl(%p): GETIFADDRS\r\n", desc->port));
+
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> GETIFADDRS\r\n",
+              __LINE__, driver_caller(desc->port)) );
+
 	if (!IS_OPEN(desc))
 	    return ctl_xerror(EXBADPORT, rbuf, rsize);
 	return inet_ctl_getifaddrs(desc, rbuf, rsize);
     }
 
     case INET_REQ_IFGET: {
-	DEBUGF(("inet_ctl(%p): IFGET\r\n", desc->port)); 	
+
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> IFGET\r\n",
+              __LINE__, driver_caller(desc->port)) );
+
 	if (!IS_OPEN(desc))
 	    return ctl_xerror(EXBADPORT, rbuf, rsize);
 	return inet_ctl_ifget(desc, buf, len, rbuf, rsize);
     }
 
     case INET_REQ_IFSET: {
-	DEBUGF(("inet_ctl(%p): IFSET\r\n", desc->port));
+
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> IFSET\r\n",
+              __LINE__, driver_caller(desc->port)) );
+
 	if (!IS_OPEN(desc))
 	    return ctl_xerror(EXBADPORT, rbuf, rsize);
 	return inet_ctl_ifset(desc, buf, len, rbuf, rsize);
     }
 
     case INET_REQ_SETOPTS:  {   /* set options */
-	DEBUGF(("inet_ctl(%p): SETOPTS\r\n", desc->port)); 
-	/* XXX fprintf(stderr,"inet_ctl(%p): SETOPTS (len = %d)\r\n", desc->port,(int) len); */
-	switch(inet_set_opts(desc, buf, len)) {
+        int sres;
+
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%d,%T] inet_ctl -> SETOPTS\r\n",
+              __LINE__, desc->s, driver_caller(desc->port)) );
+
+        sres = inet_set_opts(desc, buf, len);
+
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%d,%T] inet_ctl(setopts) -> sres: %d\r\n",
+              __LINE__, desc->s, driver_caller(desc->port), sres) );
+
+	switch(sres) {
 	case -1: 
 	    return ctl_error(EINVAL, rbuf, rsize);
 	case 0: 
@@ -9491,18 +10060,26 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
 	}
     }
 
+
     case INET_REQ_GETSTATUS: {
 	char tbuf[4];
 
-	DEBUGF(("inet_ctl(%p): GETSTATUS\r\n", desc->port)); 
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> GETSTATUS\r\n",
+              __LINE__, driver_caller(desc->port)) );
+
 	put_int32(desc->state, tbuf);
 	return ctl_reply(INET_REP_OK, tbuf, 4, rbuf, rsize);
     }
 
+
     case INET_REQ_GETTYPE: {
 	char tbuf[8];
 
-	DEBUGF(("inet_ctl(%p): GETTYPE\r\n", desc->port)); 
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> GETTYPE\r\n",
+              __LINE__, driver_caller(desc->port)) );
+
 	if (desc->sfamily == AF_INET) {
 	    put_int32(INET_AF_INET, &tbuf[0]);
 	}
@@ -9539,18 +10116,24 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
     case INET_REQ_GETFD: {
 	char tbuf[4];
 
-	DEBUGF(("inet_ctl(%p): GETFD\r\n", desc->port)); 
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%d,%T] inet_ctl -> GETFD\r\n",
+              __LINE__, desc->s, driver_caller(desc->port)) );
+
 	if (!IS_OPEN(desc))
 	    return ctl_error(EINVAL, rbuf, rsize);
 	put_int32((long)desc->s, tbuf);
 	return ctl_reply(INET_REP_OK, tbuf, 4, rbuf, rsize);
     }
 	
+
     case INET_REQ_GETHOSTNAME: { /* get host name */
 	char tbuf[INET_MAXHOSTNAMELEN + 1];
 
-	DEBUGF(("inet_ctl(%p): GETHOSTNAME\r\n",
-                desc->port)); 
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> GETHOSTNAME\r\n",
+              __LINE__, driver_caller(desc->port)) );
+
 	if (len != 0)
 	    return ctl_error(EINVAL, rbuf, rsize);
 
@@ -9560,9 +10143,12 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
 	return ctl_reply(INET_REP_OK, tbuf, strlen(tbuf), rbuf, rsize);
     }
 
+
     case INET_REQ_GETPADDRS: {
-	DEBUGF(("inet_ctl(%p): INET_GETPADDRS\r\n",
-                desc->port));
+
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> GETPADDRS\r\n",
+              __LINE__, driver_caller(desc->port)) );
 
 	if (len != 4) return ctl_error(EINVAL, rbuf, rsize);
 
@@ -9593,13 +10179,16 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
 	}
     }
 
+
     case INET_REQ_PEER:  {      /* get peername */
 	char tbuf[sizeof(inet_address)];
 	inet_address peer;
 	inet_address* ptr;
 	unsigned int sz;
 
-	DEBUGF(("inet_ctl(%p): PEER\r\n", desc->port)); 
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> PEER\r\n",
+              __LINE__, driver_caller(desc->port)) );
 
 	if (!(desc->state & INET_F_ACTIVE))
 	    return ctl_error(ENOTCONN, rbuf, rsize);
@@ -9622,6 +10211,11 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
 
     case INET_REQ_SETPEER: { /* set fake peername Port Address */
         char *xerror;
+
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> SETPEER\r\n",
+              __LINE__, driver_caller(desc->port)) );
+
 	if (len == 0) {
 	    desc->peer_ptr = NULL;
 	    return ctl_reply(INET_REP_OK, NULL, 0, rbuf, rsize);
@@ -9639,8 +10233,10 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
     }
 
     case INET_REQ_GETLADDRS: {
-	DEBUGF(("inet_ctl(%p): INET_GETLADDRS\r\n",
-                desc->port));
+
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> GETLADDRS\r\n",
+              __LINE__, driver_caller(desc->port)) );
 
 	if (len != 4) return ctl_error(EINVAL, rbuf, rsize);
 
@@ -9678,7 +10274,9 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
 	inet_address* ptr;
 	unsigned int sz;
 
-	DEBUGF(("inet_ctl(%p): NAME\r\n", desc->port)); 
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%d,%T] inet_ctl -> NAME\r\n",
+              __LINE__, desc->s, driver_caller(desc->port)) );
 
 	if ((ptr = desc->name_ptr) != NULL) {
 	    sz = desc->name_addr_len;
@@ -9698,6 +10296,11 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
 
     case INET_REQ_SETNAME: { /* set fake sockname Port Address */
         char *xerror;
+
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> SETNAME\r\n",
+              __LINE__, driver_caller(desc->port)) );
+
 	if (len == 0) {
 	    desc->name_ptr = NULL;
 	    return ctl_reply(INET_REP_OK, NULL, 0, rbuf, rsize);
@@ -9719,7 +10322,9 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
 	inet_address local;
 	int port;
 
-	DEBUGF(("inet_ctl(%p): BIND\r\n", desc->port)); 
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%d,%T] inet_ctl -> BIND\r\n",
+              __LINE__, desc->s, driver_caller(desc->port)) );
 
 	if (len < 2)
 	    return ctl_error(EINVAL, rbuf, rsize);
@@ -9752,8 +10357,10 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
     }
 
     case INET_REQ_IGNOREFD: {
-      DEBUGF(("inet_ctl(%p): IGNOREFD, IGNORED = %d\r\n",
-	      desc->port,(int)*buf));
+
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%d,%T] inet_ctl -> IGNOREFD: %s\r\n",
+              __LINE__, desc->s, driver_caller(desc->port), B2S(*buf)) );
 
       /*
        * FD can only be ignored for connected TCP connections for now,
@@ -9794,6 +10401,10 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
 	short port;
 	int n;
 
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> GETSERVBYNAME\r\n",
+              __LINE__, driver_caller(desc->port)) );
+
 	if (len < 2)
 	    return ctl_error(EINVAL, rbuf, rsize);
 	n = get_int8(buf); buf++; len--;
@@ -9820,6 +10431,10 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
 	int n;
 	struct servent* srv;
 
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> GETSERVBYPORT\r\n",
+              __LINE__, driver_caller(desc->port)) );
+
 	if (len < 3)
 	    return ctl_error(EINVAL, rbuf, rsize);
 	port = get_int16(buf);
@@ -9837,6 +10452,9 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
     }
 	
     default:
+        DDBG(desc,
+             ("INET-DRV-DBG[%d][%T] inet_ctl -> unknown command\r\n",
+              __LINE__, driver_caller(desc->port)) );
 	return ctl_xerror(EXBADPORT, rbuf, rsize);
     }
 }
@@ -10166,8 +10784,10 @@ static void tcp_close_check(tcp_descriptor* desc)
 static void tcp_inet_stop(ErlDrvData e)
 {
     tcp_descriptor* desc = (tcp_descriptor*)e;
-    DEBUGF(("tcp_inet_stop(%p) {s=%d\r\n", 
-	    desc->inet.port, desc->inet.s));
+
+    DDBG(INETP(desc),
+         ("INET-DRV-DBG[%d][" SOCKET_FSTR "] tcp_inet_stop -> entry\r\n",
+          __LINE__, desc->inet.s) );
 
     tcp_close_check(desc);
     tcp_clear_input(desc);
@@ -10176,12 +10796,15 @@ static void tcp_inet_stop(ErlDrvData e)
     if(desc->tcp_add_flags & TCP_ADDF_SENDFILE) {
         desc->tcp_add_flags &= ~TCP_ADDF_SENDFILE;
         close(desc->sendfile.dup_file_fd);
-        DEBUGF(("tcp_inet_stop(%p): SENDFILE dup closed %d\r\n",
-                desc->inet.port, desc->sendfile.dup_file_fd));
+
+        DDBG(INETP(desc),
+             ("INET-DRV-DBG[%d][" SOCKET_FSTR "] "
+              "tcp_inet_stop -> SENDFILE dup closed %d\r\n",
+              __LINE__, desc->inet.s, desc->sendfile.dup_file_fd) );
+
     }
 #endif
 
-    DEBUGF(("tcp_inet_stop(%p) }\r\n", desc->inet.port));
     inet_stop(INETP(desc));
 }
 
@@ -10222,10 +10845,14 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 
     cmd -= ERTS_INET_DRV_CONTROL_MAGIC_NUMBER;
     switch(cmd) {
+
     case INET_REQ_OPEN: { /* open socket and return internal index */
 	int domain;
-	DEBUGF(("tcp_inet_ctl(%p): OPEN\r\n",
-                desc->inet.port));
+
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][%T] tcp_inet_ctl -> OPEN\r\n",
+	      __LINE__, driver_caller(desc->inet.port)) );
+
 	if (len != 2) return ctl_error(EINVAL, rbuf, rsize);
 	switch(buf[0]) {
 	case INET_AF_INET:
@@ -10249,11 +10876,16 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 	break;
     }
 
+
     case INET_REQ_FDOPEN: {  /* pass in an open (and optionally bound) socket */
 	int domain;
         int bound;
-	DEBUGF(("tcp_inet_ctl(%p): FDOPEN\r\n",
-                desc->inet.port));
+
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "tcp_inet_ctl -> FDOPEN\r\n",
+	      __LINE__, desc->inet.s, driver_caller(desc->inet.port)) );
+
 	if (len != 6 && len != 10) return ctl_error(EINVAL, rbuf, rsize);
 	switch(buf[0]) {
 	case INET_AF_INET:
@@ -10283,11 +10915,15 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 	break;
     }
 
-    case INET_REQ_LISTEN: { /* argument backlog */
 
+    case INET_REQ_LISTEN: { /* argument backlog */
 	int backlog;
-	DEBUGF(("tcp_inet_ctl(%p): LISTEN\r\n",
-                desc->inet.port)); 
+
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "tcp_inet_ctl -> LISTEN\r\n",
+	      __LINE__, desc->inet.s, driver_caller(desc->inet.port)) );
+
 	if (desc->inet.state == INET_STATE_CLOSED)
 	    return ctl_xerror(EXBADPORT, rbuf, rsize);
 	if (!IS_OPEN(INETP(desc)))
@@ -10307,8 +10943,11 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 	char tbuf[2], *xerror;
 	unsigned timeout;
 
-	DEBUGF(("tcp_inet_ctl(%p): CONNECT\r\n",
-                desc->inet.port)); 
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "tcp_inet_ctl -> CONNECT\r\n",
+	      __LINE__, desc->inet.s, driver_caller(desc->inet.port)) );
+
 	/* INPUT: Timeout(4), Port(2), Address(N) */
 
 	if (!IS_OPEN(INETP(desc)))
@@ -10328,16 +10967,35 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 	
 	code = sock_connect(desc->inet.s, 
 			    (struct sockaddr*) &desc->inet.remote, len);
+
+        /* We *cannot* have debug printouts here since it resets the
+         * 'errno' value (printf).
+         */
+
 	if (IS_SOCKET_ERROR(code) &&
 		((sock_errno() == ERRNO_BLOCK) ||  /* Winsock2 */
 		 (sock_errno() == EINPROGRESS))) {	/* Unix & OSE!! */
-          sock_select(INETP(desc), FD_CONNECT, 1);
+
+            DDBG(INETP(desc),
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "tcp_inet_ctl(connect) -> would block => select\r\n",
+                  __LINE__,
+                  desc->inet.s, driver_caller(desc->inet.port)) );
+
+            sock_select(INETP(desc), FD_CONNECT, 1);
 	    desc->inet.state = INET_STATE_CONNECTING;
 	    if (timeout != INET_INFINITY)
 		driver_set_timer(desc->inet.port, timeout);
 	    enq_async(INETP(desc), tbuf, INET_REQ_CONNECT);
 	}
 	else if (code == 0) { /* ok we are connected */
+
+            DDBG(INETP(desc),
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "tcp_inet_ctl(connect) -> connected\r\n",
+                  __LINE__,
+                  desc->inet.s, driver_caller(desc->inet.port)) );
+
 	    desc->inet.state = INET_STATE_CONNECTED;
 	    if (desc->inet.active)
 		sock_select(INETP(desc), (FD_READ|FD_CLOSE), 1);
@@ -10345,11 +11003,21 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 	    async_ok(INETP(desc));
 	}
 	else {
-	    return ctl_error(sock_errno(), rbuf, rsize);
+            int save_errno = sock_errno();
+
+            DDBG(INETP(desc),
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "tcp_inet_ctl(connect) -> error: %s (%d)\r\n",
+                  __LINE__,
+                  desc->inet.s, driver_caller(desc->inet.port),
+                  errno_str(save_errno), save_errno) );
+
+	    return ctl_error(save_errno, rbuf, rsize);
 	}
 	return ctl_reply(INET_REP_OK, tbuf, 2, rbuf, rsize);
     }
 
+
     case INET_REQ_ACCEPT: {  /* do async accept */
 	char tbuf[2];
 	unsigned timeout;
@@ -10357,8 +11025,11 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 	unsigned int n;
 	SOCKET s;
 
-	DEBUGF(("tcp_inet_ctl(%p): ACCEPT\r\n",
-                desc->inet.port)); 
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "tcp_inet_ctl -> ACCEPT\r\n",
+	      __LINE__, desc->inet.s, driver_caller(desc->inet.port)) );
+
 	/* INPUT: Timeout(4) */
 
 	if ((desc->inet.state != INET_STATE_LISTENING && desc->inet.state != INET_STATE_ACCEPTING &&
@@ -10460,9 +11131,12 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 	    return ctl_reply(INET_REP_OK, tbuf, 2, rbuf, rsize);
 	}
     }
+
+
     case INET_REQ_CLOSE:
-	DEBUGF(("tcp_inet_ctl(%p): CLOSE\r\n",
-                desc->inet.port)); 
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] tcp_inet_ctl -> CLOSE\r\n",
+	      __LINE__, desc->inet.s, driver_caller(desc->inet.port)) );
 	tcp_close_check(desc);
 	tcp_desc_close(desc);
 	return ctl_reply(INET_REP_OK, NULL, 0, rbuf, rsize);
@@ -10473,8 +11147,10 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 	char tbuf[2];
 	int n;
 
-	DEBUGF(("tcp_inet_ctl(%p): RECV (s=%d)\r\n",
-		desc->inet.port, desc->inet.s)); 
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] tcp_inet_ctl -> RECV\r\n",
+	      __LINE__, desc->inet.s, driver_caller(desc->inet.port)) );
+
 	/* INPUT: Timeout(4),  Length(4) */
 	if (!IS_CONNECTED(INETP(desc))) {
 	    if (desc->tcp_add_flags & TCP_ADDF_DELAYED_CLOSE_RECV) {
@@ -10493,8 +11169,13 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 	timeout = get_int32(buf);
 	buf += 4;
 	n = get_int32(buf);
-	DEBUGF(("tcp_inet_ctl(%p) timeout = %d, n = %d\r\n",
-		desc->inet.port,timeout,n));
+
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "tcp_inet_ctl(recv) -> timeout: %d, n: %d\r\n",
+	      __LINE__,
+              desc->inet.s, driver_caller(desc->inet.port), timeout, n) );
+
 	if ((desc->inet.htype != TCP_PB_RAW) && (n != 0))
 	    return ctl_error(EINVAL, rbuf, rsize);
 	if (n > TCP_MAX_PACKET_SIZE)
@@ -10518,9 +11199,11 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 	return ctl_reply(INET_REP_OK, tbuf, 2, rbuf, rsize);
     }
 
+
     case TCP_REQ_UNRECV: {
-	DEBUGF(("tcp_inet_ctl(%p): UNRECV\r\n",
-                desc->inet.port)); 
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] tcp_inet_ctl -> UNRECV\r\n",
+	      __LINE__, desc->inet.s, driver_caller(desc->inet.port)) );
 	if (!IS_CONNECTED(INETP(desc)))
    	    return ctl_error(ENOTCONN, rbuf, rsize);
 	tcp_push_buffer(desc, buf, len);
@@ -10528,17 +11211,31 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 	    tcp_deliver(desc, 0);
 	return ctl_reply(INET_REP_OK, NULL, 0, rbuf, rsize);
     }
+
+
     case TCP_REQ_SHUTDOWN: {
 	int how;
-	DEBUGF(("tcp_inet_ctl(%p): FDOPEN\r\n",
-                desc->inet.port)); 
+
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "tcp_inet_ctl -> SHUTDOWN\r\n",
+	      __LINE__, desc->inet.s, driver_caller(desc->inet.port)) );
+
 	if (!IS_CONNECTED(INETP(desc))) {
 	    return ctl_error(ENOTCONN, rbuf, rsize);
 	}
 	if (len != 1) {
 	    return ctl_error(EINVAL, rbuf, rsize);
 	}
+
 	how = buf[0];
+
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "tcp_inet_ctl(shutdown) -> how: %s (%d)\r\n",
+	      __LINE__,
+              desc->inet.s, driver_caller(desc->inet.port), SH2S(how), how) );
+
 	if (how != TCP_SHUT_RD && driver_sizeq(desc->inet.port) > 0) {
 	    if (how == TCP_SHUT_WR) {
 		desc->tcp_add_flags |= TCP_ADDF_PENDING_SHUT_WR;
@@ -10556,6 +11253,7 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 	}
     }
 
+
     case TCP_REQ_SENDFILE: {
 #ifdef HAVE_SENDFILE
         const ErlDrvSizeT required_len =
@@ -10564,8 +11262,10 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 
         int raw_file_fd;
 
-        DEBUGF(("tcp_inet_ctl(%p): SENDFILE\r\n",
-                desc->inet.port));
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "tcp_inet_ctl -> SENDFILE\r\n",
+	      __LINE__, desc->inet.s, driver_caller(desc->inet.port)) );
 
         if (len != required_len) {
             return ctl_error(EINVAL, rbuf, rsize);
@@ -10585,8 +11285,12 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
 
         desc->sendfile.dup_file_fd = dup(raw_file_fd);
 
-        DEBUGF(("tcp_inet_ctl(%p): SENDFILE dup %d\r\n",
-                desc->inet.port, desc->sendfile.dup_file_fd));
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "tcp_inet_ctl(sendfile) -> dup: %d\r\n",
+	      __LINE__,
+              desc->inet.s, driver_caller(desc->inet.port),
+              desc->sendfile.dup_file_fd) );
 
         if(desc->sendfile.dup_file_fd == -1) {
             return ctl_error(errno, rbuf, rsize);
@@ -10620,8 +11324,11 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
     }
 
     default:
-	DEBUGF(("tcp_inet_ctl(%p): %u\r\n",
-                desc->inet.port, cmd)); 
+	DDBG(INETP(desc),
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "tcp_inet_ctl -> (maybe) general command %u\r\n",
+	      __LINE__,
+              desc->inet.s, driver_caller(desc->inet.port), cmd) );
 	return inet_ctl(INETP(desc), cmd, buf, len, rbuf, rsize);
     }
 
@@ -10721,25 +11428,44 @@ static int tcp_inet_multi_timeout(ErlDrvData e, ErlDrvTermData caller)
 
 static void tcp_inet_command(ErlDrvData e, char *buf, ErlDrvSizeT len)
 {
-    tcp_descriptor* desc = (tcp_descriptor*)e;
-    desc->inet.caller = driver_caller(desc->inet.port);
+    tcp_descriptor* desc   = (tcp_descriptor*)e;
+    ErlDrvTermData  caller = driver_caller(desc->inet.port);
+
+    desc->inet.caller = caller;
+
+    DDBG(INETP(desc),
+         ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+          "tcp_inet_command -> entry\r\n",
+          __LINE__, desc->inet.s, caller) );
 
-    DEBUGF(("tcp_inet_command(%p) {s=%d\r\n", 
-	    desc->inet.port, desc->inet.s)); 
     if (!IS_CONNECTED(INETP(desc)))
 	inet_reply_error(INETP(desc), ENOTCONN);
     else if (tcp_send(desc, buf, len) == 0)
 	inet_reply_ok(INETP(desc));
-    DEBUGF(("tcp_inet_command(%p) }\r\n", desc->inet.port)); 
+
+    DDBG(INETP(desc),
+         ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+          "tcp_inet_command -> done\r\n",
+          __LINE__, desc->inet.s, caller) );
+
 }
 
 static void tcp_inet_commandv(ErlDrvData e, ErlIOVec* ev)
 {
-    tcp_descriptor* desc = (tcp_descriptor*)e;
-    desc->inet.caller = driver_caller(desc->inet.port);
+    tcp_descriptor* desc   = (tcp_descriptor*)e;
+    ErlDrvTermData  caller = driver_caller(desc->inet.port);
+
+    desc->inet.caller = caller;
+
+#ifdef INET_DRV_DEBUG
+    /* This function is just called to much to be part of this     *
+     * by default. Atleast as long as there are no 'debug levels'. */
+    DDBG(INETP(desc),
+         ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+          "tcp_inet_commandv -> entry\r\n",
+          __LINE__, desc->inet.s, caller) );
+#endif
 
-    DEBUGF(("tcp_inet_commandv(%p) {s=%d\r\n",
-	    desc->inet.port, desc->inet.s)); 
     if (!IS_CONNECTED(INETP(desc))) {
 	if (desc->tcp_add_flags & TCP_ADDF_DELAYED_CLOSE_SEND) {
 	    desc->tcp_add_flags &= ~TCP_ADDF_DELAYED_CLOSE_SEND;
@@ -10758,7 +11484,13 @@ static void tcp_inet_commandv(ErlDrvData e, ErlIOVec* ev)
 	tcp_shutdown_error(desc, EPIPE);
     else if (tcp_sendv(desc, ev) == 0)
 	inet_reply_ok(INETP(desc));
-    DEBUGF(("tcp_inet_commandv(%p) }\r\n", desc->inet.port)); 
+ 
+#ifdef INET_DRV_DEBUG
+    DDBG(INETP(desc),
+         ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] tcp_inet_commandv -> done\r\n",
+          __LINE__, desc->inet.s, caller) );
+#endif
+
 }
     
 static void tcp_inet_flush(ErlDrvData e)
@@ -10789,7 +11521,13 @@ static void tcp_inet_process_exit(ErlDrvData e, ErlDrvMonitor *monitorp)
 {
     tcp_descriptor* desc = (tcp_descriptor*)e;
     ErlDrvTermData who = driver_get_monitored_process(desc->inet.port,monitorp);
-    int state = desc->inet.state;
+    int            state = desc->inet.state;
+
+    DDBG(INETP(desc),
+         ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%p] "
+          "tcp_inet_process_exit -> entry with"
+          "\r\n   who: %T\r\n",
+          __LINE__, desc->inet.s, desc->inet.port, who) );
 
     if ((state & INET_STATE_MULTI_ACCEPTING) == INET_STATE_MULTI_ACCEPTING) {
 	int id,req;
@@ -10812,6 +11550,12 @@ static void tcp_inet_process_exit(ErlDrvData e, ErlDrvMonitor *monitorp)
 	sock_select(INETP(desc),FD_ACCEPT,0);
 	desc->inet.state = INET_STATE_LISTENING; /* restore state */
     }
+
+    DDBG(INETP(desc),
+         ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%p] "
+          "tcp_inet_process_exit -> done\r\n",
+          __LINE__, desc->inet.s, desc->inet.port) );
+
 } 
 
 static void inet_stop_select(ErlDrvEvent event, void* _)
@@ -10831,7 +11575,7 @@ static int tcp_recv_closed(tcp_descriptor* desc)
 #endif
     int blocking_send = 0;
     DEBUGF(("tcp_recv_closed(%p): s=%d, in %s, line %d\r\n",
-	    port, desc->inet.s, __FILE__, __LINE__));
+	    port, desc->inet.s, __LINE__));
     if (IS_BUSY(INETP(desc))) {
 	/* A send is blocked */
 	desc->inet.caller = desc->inet.busy_caller;
@@ -11379,7 +12123,7 @@ static void tcp_inet_event(ErlDrvData e, ErlDrvEvent event)
     }
     if (netEv.lNetworkEvents & FD_CLOSE) {
 	/* error in err = netEv.iErrorCode[FD_CLOSE_BIT] */
-	DEBUGF(("Detected close in %s, line %d\r\n", __FILE__, __LINE__));
+	DEBUGF(("Detected close in %s, line %d\r\n", __LINE__));
 	if (desc->tcp_add_flags & TCP_ADDF_SHOW_ECONNRESET) {
 	    err = netEv.iErrorCode[FD_CLOSE_BIT];
 	    if (err == ECONNRESET)
@@ -11588,7 +12332,7 @@ static int tcp_send_or_shutdown_error(tcp_descriptor* desc, int err)
      * and active sockets.
      */
     DEBUGF(("driver_failure_eof(%p) in %s, line %d\r\n",
-	    desc->inet.port, __FILE__, __LINE__));
+	    desc->inet.port, __LINE__));
     if (desc->inet.active) {
         ErlDrvTermData err_atom;
 	if (show_econnreset) {
@@ -12526,13 +13270,16 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
     int af = AF_INET;
 
     cmd -= ERTS_INET_DRV_CONTROL_MAGIC_NUMBER;
+
     switch(cmd) {
     case INET_REQ_OPEN:   /* open socket and return internal index */
-	DEBUGF(("packet_inet_ctl(%p): OPEN\r\n",
-                desc->port)); 
+	DDBG(desc,
+	     ("INET-DRV-DBG[%d][%T] packet_inet_ctl -> OPEN\r\n",
+	      __LINE__, driver_caller(desc->port)) );
 	if (len != 2) {
 	    return ctl_error(EINVAL, rbuf, rsize);
 	}
+
 	switch (buf[0]) {
 	case INET_AF_INET:  af = AF_INET; break;
 #if defined(HAVE_IN6) && defined(AF_INET6)
@@ -12544,6 +13291,7 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
 	default:
 	    return ctl_xerror(str_eafnosupport, rbuf, rsize);
 	}
+
 	switch (buf[1]) {
 	case INET_TYPE_STREAM: type = SOCK_STREAM; break;
 	case INET_TYPE_DGRAM: type = SOCK_DGRAM; break;
@@ -12553,6 +13301,7 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
 	default:
 	    return ctl_error(EINVAL, rbuf, rsize);
 	}
+
 	replen = inet_ctl_open(desc, af, type, rbuf, rsize);
 
 	if ((*rbuf)[0] != INET_REP_ERROR) {
@@ -12578,11 +13327,16 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
     case INET_REQ_FDOPEN: {  /* pass in an open (and optionally bound) socket */
 	SOCKET s;
         int bound;
-	DEBUGF(("packet inet_ctl(%p): FDOPEN\r\n",
-                desc->port));
+
+	DDBG(desc,
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "packet_inet_ctl -> FDOPEN\r\n",
+	      __LINE__, desc->s, driver_caller(desc->port)) );
+
 	if (len != 6 && len != 10) {
 	    return ctl_error(EINVAL, rbuf, rsize);
 	}
+
 	switch (buf[0]) {
 	case INET_AF_INET:  af = AF_INET; break;
 #if defined(HAVE_IN6) && defined(AF_INET6)
@@ -12594,6 +13348,7 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
 	default:
 	    return ctl_xerror(str_eafnosupport, rbuf, rsize);
 	}
+
 	switch (buf[1]) {
 	case INET_TYPE_STREAM: type = SOCK_STREAM; break;
 	case INET_TYPE_DGRAM: type = SOCK_DGRAM; break;
@@ -12632,8 +13387,10 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
 
 
     case INET_REQ_CLOSE:
-	DEBUGF(("packet_inet_ctl(%p): CLOSE\r\n",
-                desc->port)); 
+	DDBG(desc,
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "packet_inet_ctl -> CLOSE\r\n",
+	      __LINE__, desc->s, driver_caller(desc->port)) );
 	erl_inet_close(desc);
 	return ctl_reply(INET_REP_OK, NULL, 0, rbuf, rsize);
 
@@ -12653,8 +13410,12 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
 #ifdef HAVE_SCTP
 	unsigned timeout;
 #endif
-	DEBUGF(("packet_inet_ctl(%p): CONNECT\r\n",
-                desc->port)); 
+
+
+	DDBG(desc,
+	     ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+              "packet_inet_ctl -> CONNECT\r\n",
+	      __LINE__, desc->s, driver_caller(desc->port)) );
 	
 	/* INPUT: [ Timeout(4), Port(2), Address(N) ] */
 
@@ -12784,9 +13545,12 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
 		   from the TCP section. Returns: {ok,[]} on success.
 		*/
 	    int backlog;
-	    
-	    DEBUGF(("packet_inet_ctl(%p): LISTEN\r\n",
-                    desc->port)); 
+
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "packet_inet_ctl -> LISTEN\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    if (!IS_SCTP(desc))
 		return ctl_xerror(EXBADPORT, rbuf, rsize);
 	    if (!IS_OPEN(desc))
@@ -12813,6 +13577,11 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
 	    char* curr;
 	    int   add_flag, rflag;
 	    
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "packet_inet_ctl -> BINDX\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    if (!IS_SCTP(desc))
 		return ctl_xerror(EXBADPORT, rbuf, rsize);
 
@@ -12851,8 +13620,11 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
 	    int err;
 	    SOCKET new_socket;
 
-	    DEBUGF(("packet_inet_ctl(%p): PEELOFF\r\n",
-                    desc->port));
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "packet_inet_ctl -> PEELOFF\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    if (!IS_SCTP(desc))
 		return ctl_xerror(EXBADPORT, rbuf, rsize);
 	    if (!IS_OPEN(desc))
@@ -12893,8 +13665,11 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
 	    unsigned timeout;
 	    char tbuf[2];
 
-	    DEBUGF(("packet_inet_ctl(%p): RECV\r\n",
-                    desc->port)); 
+            DDBG(desc,
+                 ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%T] "
+                  "packet_inet_ctl -> RECV\r\n",
+                  __LINE__, desc->s, driver_caller(desc->port)) );
+
 	    /* INPUT: Timeout(4), Length(4) */
 	    if (!IS_OPEN(desc))
 		return ctl_xerror(EXBADPORT, rbuf, rsize);
@@ -12919,6 +13694,7 @@ static ErlDrvSSizeT packet_inet_ctl(ErlDrvData e, unsigned int cmd, char* buf,
 	   INET_REQ_BIND goes here. If the req is not recognised
 	   there either, an error is returned:
 	*/
+
 	return inet_ctl(desc, cmd, buf, len, rbuf, rsize);
     }
 }
@@ -12927,6 +13703,12 @@ static void packet_inet_timeout(ErlDrvData e)
 {
     udp_descriptor  * udesc = (udp_descriptor*) e;
     inet_descriptor * desc  = INETP(udesc);
+
+    DDBG(desc,
+         ("INET-DRV-DBG[%d][" SOCKET_FSTR ",%p] "
+          "packet_inet_timeout -> entry\r\n",
+          __LINE__, desc->s, desc->port) );
+
     if (!(desc->active)) {
 	sock_select(desc, FD_READ, 0);
         async_error_am (desc, am_timeout);
diff --git a/lib/kernel/src/inet.erl b/lib/kernel/src/inet.erl
index 6ccf251372..eb9093069e 100644
--- a/lib/kernel/src/inet.erl
+++ b/lib/kernel/src/inet.erl
@@ -946,7 +946,8 @@ stats() ->
 %% Available options for tcp:connect
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 connect_options() ->
-    [tos, tclass, priority, reuseaddr, keepalive, linger, nodelay,
+    [debug,
+     tos, tclass, priority, reuseaddr, keepalive, linger, nodelay,
      sndbuf, recbuf,
      recvtos, recvtclass, ttl, recvttl,
      header, active, packet, packet_size, buffer, mode, deliver, line_delimiter,
@@ -1035,7 +1036,9 @@ con_add(Name, Val, #connect_opts{} = R, Opts, AllOpts) ->
 %% Available options for tcp:listen
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 listen_options() ->
-    [tos, tclass, priority, reuseaddr, keepalive, linger, sndbuf, recbuf, nodelay,
+    [debug,
+     tos, tclass,
+     priority, reuseaddr, keepalive, linger, sndbuf, recbuf, nodelay,
      recvtos, recvtclass, ttl, recvttl,
      header, active, packet, buffer, mode, deliver, backlog, ipv6_v6only,
      exit_on_close, high_watermark, low_watermark, high_msgq_watermark,
@@ -1143,6 +1146,7 @@ gen_tcp_module(Opts, socket) ->
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 udp_options() ->
     [
+     debug,
      tos, tclass,
      priority, reuseaddr, sndbuf, recbuf, header, active, buffer, mode,
      recvtos, recvtclass, ttl, recvttl, deliver, ipv6_v6only,
@@ -1242,6 +1246,7 @@ gen_udp_module(Opts, socket) ->
 %  (*) passing of open FDs ("fdopen") is not supported.
 sctp_options() ->
 [   % The following are generic inet options supported for SCTP sockets:
+    debug,
     mode, active, buffer, tos, tclass, ttl,
     priority, dontroute, reuseaddr, linger,
     recvtos, recvtclass, recvttl,
-- 
2.35.3

openSUSE Build Service is sponsored by