struct netdev_tunnel {
struct netdev netdev;
- bool listening;
};
static struct shash tunnel_netdev_devs = SHASH_INITIALIZER(&tunnel_netdev_devs);
netdev = xmalloc(sizeof *netdev);
netdev_init(&netdev->netdev, netdev_dev_);
- netdev->listening = false;
*netdevp = &netdev->netdev;
return 0;
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;
}
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;
}