added drain method to netdev-tunnel's
[sliver-openvswitch.git] / lib / netdev-tunnel.c
index ffefde4..6bbf2cb 100644 (file)
@@ -55,7 +55,6 @@ struct netdev_dev_tunnel {
 
 struct netdev_tunnel {
     struct netdev netdev;
-    bool listening;
 };
 
 static struct shash tunnel_netdev_devs = SHASH_INITIALIZER(&tunnel_netdev_devs);
@@ -153,7 +152,6 @@ netdev_tunnel_open(struct netdev_dev *netdev_dev_, struct netdev **netdevp)
 
     netdev = xmalloc(sizeof *netdev);
     netdev_init(&netdev->netdev, netdev_dev_);
-    netdev->listening = false;
 
     *netdevp = &netdev->netdev;
     return 0;
@@ -228,9 +226,6 @@ netdev_tunnel_set_config(struct netdev_dev *dev_, const struct shash *args)
 static int
 netdev_tunnel_listen(struct netdev *netdev_)
 {
-    struct netdev_tunnel *netdev = netdev_tunnel_cast(netdev_);
-    VLOG_DBG("tunnel_listen(%s)", netdev_get_name(netdev_));
-    netdev->listening = true;
     return 0;
 }
 
@@ -304,7 +299,22 @@ netdev_tunnel_send_wait(struct netdev *netdev_)
 static int
 netdev_tunnel_drain(struct netdev *netdev_)
 {
-    struct netdev_tunnel *netdev = netdev_tunnel_cast(netdev_);
+    struct netdev_dev_tunnel *dev = 
+       netdev_dev_tunnel_cast(netdev_get_dev(netdev_));
+    char buffer[128];
+    int error;
+
+    if (!dev->connected)
+       return 0;
+    for (;;) {
+       error = recv(dev->sockfd, buffer, 128, MSG_TRUNC);
+       if (error) {
+            if (error == -EAGAIN)
+               break;
+            else if (error != -EMSGSIZE)
+               return error;
+       }
+    }
     return 0;
 }