tun-device: Remove the superfluous use of select() before read()
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user