tun-device: Remove the superfluous use of select() before read()

This commit is contained in:
Martin Willi
2014-11-21 11:16:48 +01:00
parent 1abaff6a3c
commit eaca7f2143
2 changed files with 7 additions and 20 deletions
+6 -17
View File
@@ -347,31 +347,20 @@ METHOD(tun_device_t, read_packet, bool,
private_tun_device_t *this, chunk_t *packet) private_tun_device_t *this, chunk_t *packet)
{ {
ssize_t len; ssize_t len;
fd_set set;
bool old; bool old;
FD_ZERO(&set);
FD_SET(this->tunfd, &set);
old = thread_cancelability(TRUE);
len = select(this->tunfd + 1, &set, NULL, NULL, NULL);
thread_cancelability(old);
if (len < 0)
{
DBG1(DBG_LIB, "select on TUN device %s failed: %s", this->if_name,
strerror(errno));
return FALSE;
}
/* FIXME: this is quite expensive for lots of small packets, copy from
* local buffer instead? */
*packet = chunk_alloc(get_mtu(this)); *packet = chunk_alloc(get_mtu(this));
thread_cleanup_push(free, packet->ptr);
old = thread_cancelability(TRUE);
len = read(this->tunfd, packet->ptr, packet->len); len = read(this->tunfd, packet->ptr, packet->len);
thread_cancelability(old);
thread_cleanup_pop(FALSE);
if (len < 0) if (len < 0)
{ {
DBG1(DBG_LIB, "reading from TUN device %s failed: %s", this->if_name, DBG1(DBG_LIB, "reading from TUN device %s failed: %s", this->if_name,
strerror(errno)); strerror(errno));
chunk_free(packet); free(packet->ptr);
return FALSE; return FALSE;
} }
packet->len = len; packet->len = len;
+1 -3
View File
@@ -31,8 +31,6 @@ typedef struct tun_device_t tun_device_t;
* Class to create TUN devices * Class to create TUN devices
* *
* Creating such a device requires the CAP_NET_ADMIN capability. * Creating such a device requires the CAP_NET_ADMIN capability.
*
* @note The implementation is currently very Linux specific
*/ */
struct tun_device_t { struct tun_device_t {
@@ -42,7 +40,7 @@ struct tun_device_t {
* @note This call blocks until a packet is available. It is a thread * @note This call blocks until a packet is available. It is a thread
* cancellation point. * cancellation point.
* *
* @param packet the packet read from the device * @param packet the packet read from the device, allocated
* @return TRUE if successful * @return TRUE if successful
*/ */
bool (*read_packet)(tun_device_t *this, chunk_t *packet); bool (*read_packet)(tun_device_t *this, chunk_t *packet);