[Spice-devel] [PATCH] complete NetWireInterface redesign, make red_tunnel_worker.c build.

Gerd Hoffmann kraxel at redhat.com
Wed May 19 02:45:15 PDT 2010


Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>
---
 server/red_tunnel_worker.c  |   25 ++++++++++++++-----------
 server/reds.h               |    3 ++-
 server/spice-experimental.h |    8 ++++----
 3 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/server/red_tunnel_worker.c b/server/red_tunnel_worker.c
index d4da0b3..210de9d 100644
--- a/server/red_tunnel_worker.c
+++ b/server/red_tunnel_worker.c
@@ -28,6 +28,8 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
+#include "spice.h"
+#include "spice-experimental.h"
 #include "red_tunnel_worker.h"
 #include "red_common.h"
 #include <spice/protocol.h>
@@ -535,7 +537,8 @@ struct TunnelWorker {
     TunnelChannel *channel;
 
     SpiceCoreInterface *core_interface;
-    NetWireInterface *vlan_interface;
+    SpiceNetWireInstance *sin;
+    SpiceNetWireInterface *sif;
     RedSlirpNetworkInterface tunnel_interface;
     RedSlirpNetworkInterface null_interface;
 
@@ -958,9 +961,10 @@ static TunneledBufferProcessQueue *tunnel_socket_alloc_simple_print_reply_proces
                                                       PROCESS_DIRECTION_TYPE_REPLY);
 }
 
-static void tunnel_send_packet(void *opaque_tunnel, const uint8_t *pkt, int pkt_len)
+__visible__ void spice_server_net_wire_recv_packet(SpiceNetWireInstance *sin,
+                                                   const uint8_t *pkt, int pkt_len)
 {
-    TunnelWorker *worker = (TunnelWorker *)opaque_tunnel;
+    TunnelWorker *worker = sin->st->worker;
     ASSERT(worker);
 
     if (worker->channel && worker->channel->base.migrate) {
@@ -971,12 +975,14 @@ static void tunnel_send_packet(void *opaque_tunnel, const uint8_t *pkt, int pkt_
 }
 
 void *red_tunnel_attach(SpiceCoreInterface *core_interface,
-                        NetWireInterface *vlan_interface)
+                        SpiceNetWireInstance *sin)
 {
     TunnelWorker *worker = spice_new0(TunnelWorker, 1);
 
     worker->core_interface = core_interface;
-    worker->vlan_interface = vlan_interface;
+    worker->sin = sin;
+    worker->sin->st->worker = worker;
+    worker->sif = SPICE_CONTAINEROF(sin->base.sif, SpiceNetWireInterface, base);
 
     worker->tunnel_interface.base.slirp_can_output = qemu_can_output;
     worker->tunnel_interface.base.slirp_output = qemu_output;
@@ -1014,12 +1020,9 @@ void *red_tunnel_attach(SpiceCoreInterface *core_interface,
     ring_init(&worker->services);
     reds_register_channel(&worker->channel_interface);
 
-    net_slirp_init(worker->vlan_interface->get_ip(worker->vlan_interface),
+    net_slirp_init(worker->sif->get_ip(worker->sin),
                    TRUE,
                    &worker->null_interface.base);
-    if (!vlan_interface->register_route_packet(vlan_interface, tunnel_send_packet, worker)) {
-        red_error("register route packet failed");
-    }
     return worker;
 }
 
@@ -2892,13 +2895,13 @@ static void tunnel_channel_release_pipe_item(RedChannel *channel, PipeItem *item
 static int qemu_can_output(SlirpUsrNetworkInterface *usr_interface)
 {
     TunnelWorker *worker = ((RedSlirpNetworkInterface *)usr_interface)->worker;
-    return worker->vlan_interface->can_send_packet(worker->vlan_interface);
+    return worker->sif->can_send_packet(worker->sin);
 }
 
 static void qemu_output(SlirpUsrNetworkInterface *usr_interface, const uint8_t *pkt, int pkt_len)
 {
     TunnelWorker *worker = ((RedSlirpNetworkInterface *)usr_interface)->worker;
-    worker->vlan_interface->send_packet(worker->vlan_interface, pkt, pkt_len);
+    worker->sif->send_packet(worker->sin, pkt, pkt_len);
 }
 
 static int null_tunnel_socket_connect(SlirpUsrNetworkInterface *usr_interface,
diff --git a/server/reds.h b/server/reds.h
index b508283..b9d5336 100644
--- a/server/reds.h
+++ b/server/reds.h
@@ -75,8 +75,9 @@ struct QXLState {
     struct RedDispatcher  *dispatcher;
 };
 
+struct TunnelWorker;
 struct SpiceNetWireState {
-    int dummy;
+    struct TunnelWorker *worker;
 };
 
 void reds_desable_mm_timer();
diff --git a/server/spice-experimental.h b/server/spice-experimental.h
index 0b732bc..aede4ce 100644
--- a/server/spice-experimental.h
+++ b/server/spice-experimental.h
@@ -31,12 +31,12 @@ typedef struct SpiceNetWireInterface SpiceNetWireInterface;
 typedef struct SpiceNetWireInstance SpiceNetWireInstance;
 typedef struct SpiceNetWireState SpiceNetWireState;
 
-struct NetWireInterface {
+struct SpiceNetWireInterface {
     SpiceBaseInterface base;
 
-    struct in_addr (*get_ip)(SpiceNetWireInterface *sin);
-    int (*can_send_packet)(SpiceNetWireInterface *sin);
-    void (*send_packet)(SpiceNetWireInterface *sin, const uint8_t *pkt, int len);
+    struct in_addr (*get_ip)(SpiceNetWireInstance *sin);
+    int (*can_send_packet)(SpiceNetWireInstance *sin);
+    void (*send_packet)(SpiceNetWireInstance *sin, const uint8_t *pkt, int len);
 };
 
 struct SpiceNetWireInstance {
-- 
1.6.6.1



More information about the Spice-devel mailing list