diff src/g23m-fad/tcpip/rnet/rnet_api.c @ 1:fa8dc04885d8

src/g23m-*: import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:25:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-fad/tcpip/rnet/rnet_api.c	Fri Oct 16 06:25:50 2020 +0000
@@ -0,0 +1,716 @@
+/**
+ * @file  rnet_api.c
+ *
+ * Riviera NET.
+ *
+ * Code of the Riviera TCP/IP stack (non-blocking) API.
+ * Platform independent code.
+ *
+ * @author  Vincent Oberle (v-oberle@ti.com)
+ * @version 0.1
+ */
+
+/*
+ * History:
+ *
+ *   Date         Author        Modification
+ *  --------------------------------------------------
+ *  01/25/2002  Vincent Oberle    Create
+ *  03/14/2002  Vincent Oberle    Support of multiple implementations
+  * 03/27/2002 Jose Yp-Tcha Adding Real Transport configuration
+ *  06/24/2002  Regis Feneon    Adding RNET_RT+WINDOWS configuration
+ * (C) Copyright 2002 by Texas Instruments Incorporated, All Rights Reserved
+ */
+
+/* See this file for comments */
+#include "rnet_api.h"
+
+#include "rnet_trace_i.h"
+
+
+#ifdef _WINDOWS
+   #if defined RNET_CFG_WINSOCK
+      #include "rnet_ws/rnet_ws_api.h"
+   #elif defined RNET_CFG_REAL_TRANSPORT
+      #include "rnet_rt/rnet_rt_api.h"
+   #else
+      RNET_TRACE_ERROR("RNET: No implementation chosen");
+      return RNET_NOT_SUPPORTED;
+   #endif
+#else
+   #if defined RNET_CFG_REAL_TRANSPORT
+      #include "rnet_rt/rnet_rt_api.h"
+   #elif defined RNET_CFG_BRIDGE
+       #include "rnet_br/rnet_br_api.h"
+   #endif
+#endif
+
+//#define RNET_BENCHMARKING
+#ifdef RNET_BENCHMARKING
+
+#include "timer.h"
+
+#define MAX_FUNCTION 20
+typedef enum {
+new = 0,
+set_traffic_class,
+bind,
+listen,
+connect,
+send,
+recv,
+recv_from,
+shutdown,
+close,
+get_local_adr,
+get_buff_size,
+get_max_packet_size,
+get_host_info,
+get_proto,
+set_user_data,
+get_user_data
+} RNET_BENCHMARK_FUNC;
+
+struct {
+  UINT16 nbtick_avg;
+  UINT16 nbtick_max;
+  UINT16 nbtick_min;
+  UINT32 nb_calls;
+  UINT8 overload;
+} rnet_benchmarking[MAX_FUNCTION];
+
+T_RNET_RET ret;
+
+void rnet_benchmarking_start_timer(void)
+{
+      TM_EnableTimer( 1 );
+      TM_ResetTimer( 1, 0xFFFF, 0, 0 ); // un tick = 2.4 microsecondes
+      TM_StartTimer( 1 );
+}
+
+void rnet_benchmarking_stop_timer(void)
+{
+      TM_StopTimer( 1 );
+}
+
+UINT16 rnet_benchmarking_read_timer(void)
+{
+    return((0xFFFF - TM_ReadTimer(1)));
+}
+
+void rnet_benchmarking_todo(RNET_BENCHMARK_FUNC val, char *lib)
+{
+   UINT16 cur_timer;
+   char loclib[80];
+
+   rnet_benchmarking[val].nb_calls++;
+   cur_timer = rnet_benchmarking_read_timer();
+   if (cur_timer == 0)
+      rnet_benchmarking[val].overload++;
+   else {
+      rnet_benchmarking[val].nbtick_avg = ((rnet_benchmarking[val].nbtick_avg *
+                            (rnet_benchmarking[val].nb_calls-1)) + cur_timer ) /
+                                            rnet_benchmarking[val].nb_calls;
+      if (rnet_benchmarking[val].nbtick_max < cur_timer)
+         rnet_benchmarking[val].nbtick_max = cur_timer;
+      if ((rnet_benchmarking[val].nbtick_min > cur_timer) || (rnet_benchmarking[val].nbtick_min == 0))
+         rnet_benchmarking[val].nbtick_min = cur_timer;
+   }
+   sprintf(loclib, "RNET_RT benchmarking %s nbtick_avg: %d\n", lib, rnet_benchmarking[val].nbtick_avg);
+   RNET_TRACE_LOW(loclib);
+   sprintf(loclib, "RNET_RT benchmarking %s nbtick_max: %d\n", lib, rnet_benchmarking[val].nbtick_max);
+   RNET_TRACE_LOW(loclib);
+   sprintf(loclib, "RNET_RT benchmarking %s nbtick_min: %d\n", lib, rnet_benchmarking[val].nbtick_min);
+   RNET_TRACE_LOW(loclib);
+   sprintf(loclib, "RNET_RT benchmarking %s nb_calls: %d\n", lib, rnet_benchmarking[val].nb_calls);
+   RNET_TRACE_LOW(loclib);
+   sprintf(loclib, "RNET_RT benchmarking %s overload: %d\n", lib, rnet_benchmarking[val].overload);
+   RNET_TRACE_LOW(loclib);
+}
+
+#endif
+
+/**
+ * Creates a new connection identifier (T_RNET_DESC).
+ */
+T_RNET_RET rnet_new (T_RNET_IPPROTO proto,
+           T_RNET_DESC ** desc,
+           T_RV_RETURN_PATH return_path)
+{
+  #ifdef _WINDOWS
+     #if defined RNET_CFG_WINSOCK
+       return rnet_ws_new(proto, desc, return_path);
+     #elif defined RNET_CFG_REAL_TRANSPORT
+    return rnet_rt_new(proto, desc, return_path);
+     #else
+        RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #else
+     #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+    ret = rnet_rt_new(proto, desc, return_path);
+        rnet_benchmarking_todo(new, "new");
+        return(ret);
+#else
+    return rnet_rt_new(proto, desc, return_path);
+#endif
+     #elif defined RNET_CFG_BRIDGE
+    return rnet_br_new(proto, desc, return_path);
+     #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+ #endif
+}
+
+/**
+ * Sets the traffic class of a connection ID.
+ *
+ * Note that this function is NOT implemented under Windows.
+ */
+T_RNET_RET rnet_set_traffic_class (T_RNET_DESC * desc,
+                   T_RNET_TRAFFIC_CLASS traffic_class)
+{
+#ifdef _WINDOWS
+    #if defined RNET_CFG_WINSOCK
+    RNET_TRACE_ERROR("RNET: rnet_set_traffic_class not supported under Windows");
+    return RNET_NOT_SUPPORTED;
+    #elif defined RNET_CFG_REAL_TRANSPORT
+     RNET_TRACE_ERROR("RNET: rnet_set_traffic_class not supported for step one");
+     return RNET_NOT_SUPPORTED;
+    #else
+     RNET_TRACE_ERROR("RNET: No implementation chosen");
+      return RNET_NOT_SUPPORTED;
+    #endif
+#else
+    #if defined RNET_CFG_REAL_TRANSPORT
+     RNET_TRACE_ERROR("RNET: rnet_set_traffic_class not supported for step one");
+     return RNET_NOT_SUPPORTED;
+    #else
+      RNET_TRACE_ERROR("RNET: No implementation chosen");
+     return RNET_NOT_SUPPORTED;
+    #endif
+#endif
+}
+
+/**
+ * Binds the connection to a local IP address and port number.
+ */
+T_RNET_RET rnet_bind (T_RNET_DESC * desc,
+            T_RNET_IP_ADDR local_addr,
+            T_RNET_PORT local_port)
+{
+  #ifdef _WINDOWS
+     #if defined RNET_CFG_WINSOCK
+      return rnet_ws_bind(desc, local_addr, local_port);
+     #elif defined RNET_CFG_REAL_TRANSPORT
+        return rnet_rt_bind(desc, local_addr, local_port);
+     #else
+       RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #else
+     #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+        ret = rnet_rt_bind(desc, local_addr, local_port);
+        rnet_benchmarking_todo(bind, "bind");
+        return(ret);
+#else
+        return rnet_rt_bind(desc, local_addr, local_port);
+#endif
+     #elif defined RNET_CFG_BRIDGE
+    return rnet_br_bind(desc, local_addr, local_port);
+     #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #endif
+}
+
+/**
+ * Commands a connection to start listening for incoming connections.
+ */
+T_RNET_RET rnet_listen (T_RNET_DESC *desc)
+{
+  #ifdef _WINDOWS
+     #if defined RNET_CFG_WINSOCK
+      return rnet_ws_listen(desc);
+     #elif defined RNET_CFG_REAL_TRANSPORT
+    return rnet_rt_listen(desc);
+     #else
+       RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #else
+     #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+    ret = rnet_rt_listen(desc);
+        rnet_benchmarking_todo(listen, "listen");
+        return(ret);
+#else
+    return rnet_rt_listen(desc);
+#endif
+     #elif defined RNET_CFG_BRIDGE
+    return rnet_br_listen(desc);
+     #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #endif
+}
+
+/**
+ * Sets up the connection ID to connect to the remote host.
+ */
+T_RNET_RET rnet_connect (T_RNET_DESC * desc,
+             T_RNET_IP_ADDR peer_addr,
+             T_RNET_PORT peer_port)
+{
+  #ifdef _WINDOWS
+    #if defined RNET_CFG_WINSOCK
+        return rnet_ws_connect(desc, peer_addr, peer_port);
+    #elif defined RNET_CFG_REAL_TRANSPORT
+    return rnet_rt_connect(desc, peer_addr, peer_port);
+    #else
+     RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+    #endif
+  #else
+    #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+    ret = rnet_rt_connect(desc, peer_addr, peer_port);
+        rnet_benchmarking_todo(connect, "connect");
+        return(ret);
+#else
+    return rnet_rt_connect(desc, peer_addr, peer_port);
+#endif
+    #elif defined RNET_CFG_BRIDGE
+       return rnet_br_connect(desc, peer_addr, peer_port);
+    #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+    #endif
+  #endif
+}
+
+/**
+ * Enqueues the data for sending.
+ */
+T_RNET_RET rnet_send (T_RNET_DESC * desc,
+            T_RVF_BUFFER *buff,
+            UINT16 * len_p)
+{
+  #ifdef _WINDOWS
+      #if defined RNET_CFG_WINSOCK
+       return rnet_ws_send(desc, buff, len_p);
+      #elif defined RNET_CFG_REAL_TRANSPORT
+     return rnet_rt_send(desc, buff, len_p);
+      #else
+        RNET_TRACE_ERROR("RNET: No implementation chosen");
+       return RNET_NOT_SUPPORTED;
+      #endif
+  #else
+      #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+         rnet_benchmarking_start_timer();
+     ret = rnet_rt_send(desc, buff, len_p);
+         rnet_benchmarking_todo(send, "send");
+         return(ret);
+#else
+     return rnet_rt_send(desc, buff, len_p);
+#endif
+      #elif defined RNET_CFG_BRIDGE
+       return rnet_br_send(desc, buff, len_p);
+      #else
+       RNET_TRACE_ERROR("RNET: No implementation chosen");
+         return RNET_NOT_SUPPORTED;
+      #endif
+  #endif
+}
+
+/**
+ * Read the waiting data.
+ */
+T_RNET_RET rnet_recv (T_RNET_DESC * desc,
+            T_RVF_BUFFER *buff,
+            UINT16 * len_p)
+{
+  #ifdef _WINDOWS
+     #if defined RNET_CFG_WINSOCK
+      return rnet_ws_recv(desc, buff, len_p);
+     #elif defined RNET_CFG_REAL_TRANSPORT
+    return rnet_rt_recv(desc, buff, len_p);
+     #else
+       RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #else
+     #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+    ret = rnet_rt_recv(desc, buff, len_p);
+        rnet_benchmarking_todo(recv, "recv");
+        return(ret);
+#else
+    return rnet_rt_recv(desc, buff, len_p);
+#endif
+     #elif defined RNET_CFG_BRIDGE
+    return rnet_br_recv(desc, buff, len_p);
+     #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #endif
+}
+
+/**
+ * Read the waiting data.
+ */
+T_RNET_RET rnet_recv_from (T_RNET_DESC * desc,
+               T_RVF_BUFFER * buff,
+               UINT16 * len_p,
+               T_RNET_IP_ADDR * from_addr,
+               T_RNET_PORT * from_port)
+{
+#ifdef _WINDOWS
+   #if defined RNET_CFG_WINSOCK
+    return rnet_ws_recv_from(desc, buff, len_p, from_addr, from_port);
+   #elif defined RNET_CFG_REAL_TRANSPORT
+        return rnet_rt_recv_from(desc, buff, len_p, from_addr, from_port);
+   #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+   #endif
+#else
+   #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+        ret = rnet_rt_recv_from(desc, buff, len_p, from_addr, from_port);
+        rnet_benchmarking_todo(recv_from, "recv_from");
+        return(ret);
+#else
+        return rnet_rt_recv_from(desc, buff, len_p, from_addr, from_port);
+#endif
+   #elif defined RNET_CFG_BRIDGE
+    return rnet_br_recv_from(desc, buff, len_p, from_addr, from_port);
+   #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+   #endif
+#endif
+}
+
+/**
+ * Disables the sending on a socket and informs the peer
+ * about it.
+ */
+T_RNET_RET rnet_shutdown (T_RNET_DESC * desc)
+{
+  #ifdef _WINDOWS
+     #if defined RNET_CFG_WINSOCK
+        return rnet_ws_shutdown(desc);
+     #elif defined RNET_CFG_REAL_TRANSPORT
+    return rnet_rt_shutdown(desc);
+     #else
+       RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #else
+     #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+    ret = rnet_rt_shutdown(desc);
+        rnet_benchmarking_todo(shutdown, "shutdown");
+        return(ret);
+#else
+    return rnet_rt_shutdown(desc);
+#endif
+     #elif defined RNET_CFG_BRIDGE
+    return rnet_br_shutdown(desc);
+     #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #endif
+}
+
+/**
+ * Closes the connection.
+ */
+T_RNET_RET rnet_close (T_RNET_DESC * desc)
+{
+  #ifdef _WINDOWS
+     #if defined RNET_CFG_WINSOCK
+      return rnet_ws_close(desc);
+     #elif defined RNET_CFG_REAL_TRANSPORT
+    return rnet_rt_close(desc);
+     #else
+       RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #else
+     #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+    ret = rnet_rt_close(desc);
+        rnet_benchmarking_todo(close, "close");
+        return(ret);
+#else
+    return rnet_rt_close(desc);
+#endif
+     #elif defined RNET_CFG_BRIDGE
+    return rnet_br_close(desc);
+     #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #endif
+}
+
+/**
+ * Gets the local address and port of a connection ID.
+ */
+T_RNET_RET rnet_get_local_addr_port (T_RNET_DESC * desc,
+                   T_RNET_IP_ADDR * local_addr,
+                   T_RNET_PORT * local_port)
+{
+  #ifdef _WINDOWS
+     #if defined RNET_CFG_WINSOCK
+        return rnet_ws_get_local_addr_port(desc, local_addr, local_port);
+     #elif defined RNET_CFG_REAL_TRANSPORT
+    return rnet_rt_get_local_addr_port(desc, local_addr, local_port);
+     #else
+       RNET_TRACE_ERROR("RNET: No implementation chosen");
+      return RNET_NOT_SUPPORTED;
+     #endif
+  #else
+     #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+    ret = rnet_rt_get_local_addr_port(desc, local_addr, local_port);
+        rnet_benchmarking_todo(get_local_adr, "get_local_adr");
+        return(ret);
+#else
+    return rnet_rt_get_local_addr_port(desc, local_addr, local_port);
+#endif
+     #elif defined RNET_CFG_BRIDGE
+    return rnet_br_get_local_addr_port(desc, local_addr, local_port);
+     #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+   #endif
+}
+
+/**
+ * Use to determine the amount of data pending in the network's input buffer
+ * that can be read from the connection ID.
+ */
+T_RNET_RET rnet_get_buff_size (T_RNET_DESC * desc,
+                 UINT32 * size)
+{
+  #ifdef _WINDOWS
+     #if defined RNET_CFG_WINSOCK
+        return rnet_ws_get_buff_size(desc, size);
+     #elif defined RNET_CFG_REAL_TRANSPORT
+    return rnet_rt_get_buff_size(desc, size);
+     #else
+       RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #else
+     #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+    ret = rnet_rt_get_buff_size(desc, size);
+        rnet_benchmarking_todo(get_buff_size, "get_buff_size");
+        return(ret);
+#else
+    return rnet_rt_get_buff_size(desc, size);
+#endif
+     #elif defined RNET_CFG_BRIDGE
+    return rnet_br_get_buff_size(desc, size);
+     #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #endif
+}
+
+/**
+ * Indicates the maximum send size of a message for message-oriented
+ * descriptor (UDP) as implemented by a particular service provider.
+ */
+T_RNET_RET rnet_get_max_packet_size (T_RNET_DESC * desc,
+                   UINT32 * size)
+{
+#ifdef _WINDOWS
+  #if defined RNET_CFG_WINSOCK
+    return rnet_ws_get_max_packet_size(desc, size);
+     #elif defined RNET_CFG_REAL_TRANSPORT
+    return rnet_rt_get_max_packet_size(desc, size);
+  #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+  #endif
+#else
+     #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+    ret = rnet_rt_get_max_packet_size(desc, size);
+        rnet_benchmarking_todo(get_max_packet_size, "get_max_packet_size");
+        return(ret);
+#else
+    return rnet_rt_get_max_packet_size(desc, size);
+#endif
+     #elif defined RNET_CFG_BRIDGE
+    return rnet_br_get_max_packet_size(desc, size);
+     #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+#endif
+
+}
+
+/**
+ * Requests host information corresponding to a host name or to a
+ * network address.
+ */
+T_RNET_RET rnet_get_host_info (char *name,
+                 T_RNET_IP_ADDR addr,
+                 T_RV_RETURN_PATH return_path,
+                 void * user_data)
+{
+  #ifdef _WINDOWS
+    #if defined RNET_CFG_WINSOCK
+    return rnet_ws_get_host_info(name, addr, return_path,user_data);
+     #elif defined RNET_CFG_REAL_TRANSPORT
+    return rnet_rt_get_host_info(name, addr, return_path,user_data);
+     #else
+       RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #else
+     #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+    ret = rnet_rt_get_host_info(name, addr, return_path,user_data);
+        rnet_benchmarking_todo(get_host_info, "get_host_info");
+        return(ret);
+#else
+
+    return rnet_rt_get_host_info(name, addr, return_path,user_data);
+#endif
+     #elif defined RNET_CFG_BRIDGE
+    return rnet_br_get_host_info(name, addr, return_path,user_data);
+     #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #endif
+}
+
+/**
+ * Retrieves the protocol associated to a connection descriptor.
+ */
+T_RNET_IPPROTO rnet_get_proto (T_RNET_DESC *desc)
+{
+  #ifdef _WINDOWS
+     #if defined RNET_CFG_WINSOCK
+        return rnet_ws_get_proto(desc);
+     #elif defined RNET_CFG_REAL_TRANSPORT
+    return rnet_rt_get_proto(desc);
+     #else
+       RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+  #else
+     #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+    ret = rnet_rt_get_proto(desc);
+        rnet_benchmarking_todo(get_proto, "get_proto");
+        return(ret);
+#else
+    return rnet_rt_get_proto(desc);
+#endif
+     #elif defined RNET_CFG_BRIDGE
+    return rnet_br_get_proto(desc);
+     #else
+     RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_IPPROTO_UDP;
+     #endif
+   #endif
+}
+
+/**
+ * Associates an application specific pointer to a connection ID.
+ */
+void rnet_set_user_data (T_RNET_DESC *desc, void *user_data)
+{
+   #ifdef _WINDOWS
+      #if defined RNET_CFG_WINSOCK
+         rnet_ws_set_user_data(desc, user_data);
+      #elif defined RNET_CFG_REAL_TRANSPORT
+     rnet_rt_set_user_data(desc, user_data);
+      #else
+        RNET_TRACE_ERROR("RNET: No implementation chosen");
+       return RNET_NOT_SUPPORTED;
+      #endif
+   #else
+      #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+        rnet_benchmarking_start_timer();
+     rnet_rt_set_user_data(desc, user_data);
+        rnet_benchmarking_todo(set_user_data, "set_user_data");
+#else
+     rnet_rt_set_user_data(desc, user_data);
+#endif
+      #elif defined RNET_CFG_BRIDGE
+       rnet_br_set_user_data(desc, user_data);
+      #else
+     RNET_TRACE_ERROR("RNET: No implementation chosen");
+      #endif
+   #endif
+}
+
+/**
+ * Returns the application specific pointer associated to the connection ID.
+ */
+void * rnet_get_user_data (T_RNET_DESC *desc)
+{
+   #ifdef _WINDOWS
+     #if defined RNET_CFG_WINSOCK
+        return rnet_ws_get_user_data(desc);
+     #elif defined RNET_CFG_REAL_TRANSPORT
+    return (void *)rnet_rt_get_user_data(desc);
+     #else
+       RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return RNET_NOT_SUPPORTED;
+     #endif
+   #else
+      #if defined RNET_CFG_REAL_TRANSPORT
+#ifdef RNET_BENCHMARKING
+      void *retv;
+        rnet_benchmarking_start_timer();
+    retv = (void *)rnet_rt_get_user_data(desc);
+        rnet_benchmarking_todo(get_user_data, "get_user_data");
+        return(retv);
+#else
+    return (void *)rnet_rt_get_user_data(desc);
+#endif
+      #elif defined RNET_CFG_BRIDGE
+    return rnet_br_get_user_data(desc);
+      #else
+    RNET_TRACE_ERROR("RNET: No implementation chosen");
+    return NULL;
+      #endif
+   #endif
+}
+