Commit c3d5265f authored by Dafydd Harries's avatar Dafydd Harries

fake UDP sockets: use socket pair instead of pipe for simplicity/pollability

darcs-hash:20070213192107-c9803-2ae1694e742f669356ea6bf0179712932eaf8429.gz
parent d7674514
#include <string.h> #include <string.h>
#include <sys/select.h>
#include "agent.h" #include "agent.h"
#include "stun.h" #include "stun.h"
#include "udp-fake.h" #include "udp-fake.h"
#include "random-glib.h" #include "random-glib.h"
static gboolean
fd_is_readable (guint fd)
{
fd_set fds;
struct timeval timeout = {0,};
FD_ZERO (&fds);
FD_SET (fd, &fds);
switch (select (fd + 1, &fds, NULL, NULL, &timeout))
{
case -1:
g_assert_not_reached ();
case 0:
return FALSE;
case 1:
return TRUE;
default:
g_assert_not_reached ();
}
}
static void static void
send_connectivity_check ( send_connectivity_check (
NiceAgent *agent, NiceAgent *agent,
...@@ -132,7 +157,7 @@ main (void) ...@@ -132,7 +157,7 @@ main (void)
*/ */
nice_agent_send (agent, 1, 1, 5, "hello"); nice_agent_send (agent, 1, 1, 5, "hello");
g_assert (0 == nice_udp_fake_socket_pop_send (sock, &addr, 1024, buf)); g_assert (0 == fd_is_readable (nice_udp_fake_socket_get_peer_fd (sock)));
send_connectivity_check (agent, &remote_addr); send_connectivity_check (agent, &remote_addr);
......
...@@ -41,6 +41,7 @@ T nice_rng_set_new_func ...@@ -41,6 +41,7 @@ T nice_rng_set_new_func
T nice_udp_bsd_socket_factory_init T nice_udp_bsd_socket_factory_init
T nice_udp_fake_socket_factory_init T nice_udp_fake_socket_factory_init
T nice_udp_fake_socket_get_peer_fd
T nice_udp_fake_socket_pop_send T nice_udp_fake_socket_pop_send
T nice_udp_fake_socket_push_recv T nice_udp_fake_socket_push_recv
T nice_udp_socket_close T nice_udp_socket_close
......
...@@ -2,45 +2,20 @@ ...@@ -2,45 +2,20 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <glib.h> #include <glib.h>
#include "udp-fake.h" #include "udp-fake.h"
typedef struct _Packet Packet;
struct _Packet
{
NiceAddress addr;
guint len;
gchar buf[1024];
};
typedef struct _UDPFakeSocketPriv UDPFakeSocketPriv; typedef struct _UDPFakeSocketPriv UDPFakeSocketPriv;
struct _UDPFakeSocketPriv struct _UDPFakeSocketPriv
{ {
GSList *send_queue; guint net_sock;
guint recv_pipe_in;
guint recv_pipe_out;
}; };
static void *
_g_slist_pop (GSList **list)
{
void *data;
GSList *head;
if (*list == NULL)
return NULL;
head = *list;
data = (*list)->data;
*list = (*list)->next;
g_slist_free_1 (head);
return data;
}
static gboolean static gboolean
fake_send ( fake_send (
NiceUDPSocket *sock, NiceUDPSocket *sock,
...@@ -48,16 +23,9 @@ fake_send ( ...@@ -48,16 +23,9 @@ fake_send (
guint len, guint len,
const gchar *buf) const gchar *buf)
{ {
Packet *packet; write (sock->fileno, to, sizeof (NiceAddress));
UDPFakeSocketPriv *priv; write (sock->fileno, &len, sizeof (guint));
write (sock->fileno, buf, len);
packet = g_slice_new0 (Packet);
packet->len = len;
packet->addr = *to;
memcpy (packet->buf, buf, len);
priv = (UDPFakeSocketPriv *) sock->priv;
priv->send_queue = g_slist_append (priv->send_queue, packet);
return TRUE; return TRUE;
} }
...@@ -69,13 +37,9 @@ fake_recv ( ...@@ -69,13 +37,9 @@ fake_recv (
guint len, guint len,
gchar *buf) gchar *buf)
{ {
UDPFakeSocketPriv *priv; read (sock->fileno, from, sizeof (NiceAddress));
read (sock->fileno, &len, sizeof (guint));
priv = (UDPFakeSocketPriv *) sock->priv; read (sock->fileno, buf, len);
read (priv->recv_pipe_out, from, sizeof (NiceAddress));
read (priv->recv_pipe_out, &len, sizeof (guint));
read (priv->recv_pipe_out, buf, len);
return len; return len;
} }
...@@ -85,19 +49,10 @@ fake_close (NiceUDPSocket *sock) ...@@ -85,19 +49,10 @@ fake_close (NiceUDPSocket *sock)
{ {
UDPFakeSocketPriv *priv; UDPFakeSocketPriv *priv;
priv = (UDPFakeSocketPriv *) sock->priv; close (sock->fileno);
close (priv->recv_pipe_out);
close (priv->recv_pipe_in);
while (priv->send_queue)
{
Packet *packet;
packet = priv->send_queue->data;
priv->send_queue = g_slist_remove (priv->send_queue, packet);
g_slice_free (Packet, packet);
}
priv = (UDPFakeSocketPriv *) sock->priv;
close (priv->net_sock);
g_slice_free (UDPFakeSocketPriv, priv); g_slice_free (UDPFakeSocketPriv, priv);
} }
...@@ -113,14 +68,13 @@ fake_socket_init ( ...@@ -113,14 +68,13 @@ fake_socket_init (
static int port = 1; static int port = 1;
UDPFakeSocketPriv *priv; UDPFakeSocketPriv *priv;
if (pipe (fds) == -1) if (socketpair (AF_LOCAL, SOCK_STREAM, 0, fds) != 0)
return FALSE; return FALSE;
priv = g_slice_new0 (UDPFakeSocketPriv); priv = g_slice_new0 (UDPFakeSocketPriv);
priv->recv_pipe_out = fds[0]; priv->net_sock = fds[0];
priv->recv_pipe_in = fds[1];
sock->fileno = priv->recv_pipe_out; sock->fileno = fds[1];
sock->addr.type = addr->type; sock->addr.type = addr->type;
sock->addr.addr_ipv4 = addr->addr_ipv4; sock->addr.addr_ipv4 = addr->addr_ipv4;
...@@ -146,9 +100,10 @@ nice_udp_fake_socket_push_recv ( ...@@ -146,9 +100,10 @@ nice_udp_fake_socket_push_recv (
UDPFakeSocketPriv *priv; UDPFakeSocketPriv *priv;
priv = (UDPFakeSocketPriv *) sock->priv; priv = (UDPFakeSocketPriv *) sock->priv;
write (priv->recv_pipe_in, from, sizeof (NiceAddress));
write (priv->recv_pipe_in, &len, sizeof (guint)); write (priv->net_sock, from, sizeof (NiceAddress));
write (priv->recv_pipe_in, buf, len); write (priv->net_sock, &len, sizeof (guint));
write (priv->net_sock, buf, len);
} }
guint guint
...@@ -159,21 +114,26 @@ nice_udp_fake_socket_pop_send ( ...@@ -159,21 +114,26 @@ nice_udp_fake_socket_pop_send (
gchar *buf) gchar *buf)
{ {
UDPFakeSocketPriv *priv; UDPFakeSocketPriv *priv;
Packet *packet;
priv = (UDPFakeSocketPriv *) sock->priv; priv = (UDPFakeSocketPriv *) sock->priv;
packet = (Packet *) _g_slist_pop (&priv->send_queue);
if (!packet) read (priv->net_sock, to, sizeof (NiceAddress));
return 0; read (priv->net_sock, &len, sizeof (guint));
read (priv->net_sock, buf, len);
memcpy (buf, packet->buf, MIN (len, packet->len));
len = packet->len;
*to = packet->addr;
g_slice_free (Packet, packet);
return len; return len;
} }
guint
nice_udp_fake_socket_get_peer_fd (
NiceUDPSocket *sock)
{
UDPFakeSocketPriv *priv;
priv = (UDPFakeSocketPriv *) sock->priv;
return priv->net_sock;
}
static void static void
fake_socket_factory_close ( fake_socket_factory_close (
G_GNUC_UNUSED G_GNUC_UNUSED
......
...@@ -23,6 +23,10 @@ nice_udp_fake_socket_pop_send ( ...@@ -23,6 +23,10 @@ nice_udp_fake_socket_pop_send (
guint len, guint len,
gchar *buf); gchar *buf);
guint
nice_udp_fake_socket_get_peer_fd (
NiceUDPSocket *sock);
G_END_DECLS G_END_DECLS
#endif /* _UDP_FAKE_H */ #endif /* _UDP_FAKE_H */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment