Added silc_likely and silc_unlikely GCC branch prediction macros.
[silc.git] / lib / silcutil / silcsocketstream.c
index b599dabf732f46664ab32fae32f67f68a864dff5..0e40d4141ddd64ab799c7a59b4c68c427281b9ed 100644 (file)
@@ -22,6 +22,7 @@
 /************************** Types and definitions ***************************/
 
 #define SILC_IS_SOCKET_STREAM(s) (s->ops == &silc_socket_stream_ops)
+#define SILC_IS_SOCKET_STREAM_UDP(s) (s->ops == &silc_socket_udp_stream_ops)
 
 const SilcStreamOps silc_socket_stream_ops;
 const SilcStreamOps silc_socket_udp_stream_ops;
@@ -59,7 +60,7 @@ SILC_TASK_CALLBACK(silc_socket_stream_io)
 {
   SilcSocketStream stream = context;
 
-  if (!stream->notifier)
+  if (silc_unlikely(!stream->notifier))
     return;
 
   switch (type) {
@@ -146,7 +147,7 @@ static void *silc_socket_host_lookup_start(void *context)
 
  out:
   silc_schedule_task_add_timeout(schedule, silc_socket_host_lookup_finish,
-                                lookup, 0, 1);
+                                lookup, 0, 0);
   silc_schedule_wakeup(schedule);
   return NULL;
 }
@@ -232,6 +233,7 @@ silc_socket_tcp_stream_create(int sock, SilcBool lookup,
 /* Creates UDP socket stream */
 
 SilcStream silc_socket_udp_stream_create(int sock, SilcBool ipv6,
+                                        SilcBool connected,
                                         SilcSchedule schedule)
 {
   SilcSocketStream stream;
@@ -246,10 +248,26 @@ SilcStream silc_socket_udp_stream_create(int sock, SilcBool ipv6,
   stream->sock = sock;
   stream->schedule = schedule;
   stream->ipv6 = ipv6;
+  stream->connected = connected;
 
   return (SilcStream)stream;
 }
 
+/* Returns TRUE if the stream is UDP stream */
+
+SilcBool silc_socket_stream_is_udp(SilcStream stream, SilcBool *connected)
+{
+  SilcSocketStream socket_stream = stream;
+
+  if (!SILC_IS_SOCKET_STREAM_UDP(socket_stream))
+    return FALSE;
+
+  if (connected)
+    *connected = socket_stream->connected;
+
+  return TRUE;
+}
+
 /* Returns socket stream information */
 
 SilcBool silc_socket_stream_get_info(SilcStream stream,
@@ -258,17 +276,27 @@ SilcBool silc_socket_stream_get_info(SilcStream stream,
 {
   SilcSocketStream socket_stream = stream;
 
-  if (!SILC_IS_SOCKET_STREAM(socket_stream))
+  if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+      !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
     return FALSE;
 
   if (sock)
     *sock = socket_stream->sock;
-  if (hostname)
+  if (hostname) {
+    if (!socket_stream->hostname)
+      return FALSE;
     *hostname = socket_stream->hostname;
-  if (ip)
+  }
+  if (ip) {
+    if (!socket_stream->ip)
+      return FALSE;
     *ip = socket_stream->ip;
-  if (port)
+  }
+  if (port) {
+    if (!socket_stream->port)
+      return FALSE;
     *port = socket_stream->port;
+  }
 
   return TRUE;
 }
@@ -281,7 +309,8 @@ SilcBool silc_socket_stream_set_info(SilcStream stream,
 {
   SilcSocketStream socket_stream = stream;
 
-  if (!SILC_IS_SOCKET_STREAM(socket_stream))
+  if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+      !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
     return FALSE;
 
   if (hostname) {
@@ -295,6 +324,11 @@ SilcBool silc_socket_stream_set_info(SilcStream stream,
     socket_stream->ip = strdup(ip);
     if (!socket_stream->ip)
       return FALSE;
+    if (!socket_stream->hostname) {
+      socket_stream->hostname = strdup(ip);
+      if (!socket_stream->hostname)
+       return FALSE;
+    }
   }
   if (port)
     socket_stream->port = port;
@@ -308,7 +342,8 @@ int silc_socket_stream_get_error(SilcStream stream)
 {
   SilcSocketStream socket_stream = stream;
 
-  if (!SILC_IS_SOCKET_STREAM(socket_stream))
+  if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+      !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
     return 0;
 
   return socket_stream->sock_error;
@@ -324,7 +359,8 @@ SilcBool silc_socket_stream_set_qos(SilcStream stream,
 {
   SilcSocketStream socket_stream = stream;
 
-  if (!SILC_IS_SOCKET_STREAM(socket_stream))
+  if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+      !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
     return FALSE;
 
   SILC_LOG_DEBUG(("Setting QoS for socket stream"));
@@ -366,7 +402,8 @@ SilcBool silc_socket_stream_close(SilcStream stream)
 {
   SilcSocketStream socket_stream = stream;
 
-  if (!SILC_IS_SOCKET_STREAM(socket_stream))
+  if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+      !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
     return FALSE;
 
   silc_schedule_unset_listen_fd(socket_stream->schedule, socket_stream->sock);
@@ -381,7 +418,8 @@ void silc_socket_stream_destroy(SilcStream stream)
 {
   SilcSocketStream socket_stream = stream;
 
-  if (!SILC_IS_SOCKET_STREAM(socket_stream))
+  if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+      !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
     return;
 
   silc_socket_stream_close(socket_stream);
@@ -414,7 +452,8 @@ void silc_socket_stream_notifier(SilcStream stream,
 {
   SilcSocketStream socket_stream = stream;
 
-  if (!SILC_IS_SOCKET_STREAM(socket_stream))
+  if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+      !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
     return;
 
   SILC_LOG_DEBUG(("Setting stream notifier callback"));
@@ -448,7 +487,8 @@ SilcSchedule silc_socket_stream_get_schedule(SilcStream stream)
 {
   SilcSocketStream socket_stream = stream;
 
-  if (!SILC_IS_SOCKET_STREAM(socket_stream))
+  if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+      !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
     return NULL;
 
   return socket_stream->schedule;