Пример #1
0
int
mlvpn_tuntap_write(struct tuntap_s *tuntap)
{
    ssize_t ret;
    mlvpn_pkt_t *pkt;
    circular_buffer_t *buf = tuntap->sbuf;

    /* Safety checks */
    if (mlvpn_cb_is_empty(buf))
        fatalx("tuntap_write called with empty buffer");

    pkt = mlvpn_pktbuffer_read(buf);
    ret = write(tuntap->fd, pkt->data, pkt->len);
    if (ret < 0)
    {
        log_warn("tuntap", "%s write error", tuntap->devname);
    } else {
        if (ret != pkt->len)
        {
            log_warnx("tuntap", "%s write error: %zd/%d bytes sent",
               tuntap->devname, ret, pkt->len);
        } else {
            log_debug("tuntap", "%s > sent %zd bytes",
               tuntap->devname, ret);
        }
    }
    return ret;
}
Пример #2
0
int
mlvpn_tuntap_write(struct tuntap_s *tuntap)
{
    int len, datalen;
    mlvpn_pkt_t *pkt;
    circular_buffer_t *buf = tuntap->sbuf;
    uint32_t type;
    struct iovec iov[2];

    /* Safety checks */
    if (mlvpn_cb_is_empty(buf))
    {
        _FATAL("[tuntap %s] tuntap_write called with empty buffer!\n",
                tuntap->devname);
        return -1;
    }

    pkt = mlvpn_pktbuffer_read(buf);

    type = htonl(AF_INET);

    iov[0].iov_base = &type;
    iov[0].iov_len = sizeof(type);
    iov[1].iov_base = pkt->pktdata.data;
    iov[1].iov_len = pkt->pktdata.len;

    len = writev(tuntap->fd, iov, 2);
    datalen = len - iov[0].iov_len;
    if (len < 0)
    {
        _ERROR("[tuntap %s] write error: %s\n",
                tuntap->devname, strerror(errno));
    } else {
        if (datalen != pkt->pktdata.len)
        {
            _ERROR("[tuntap %s] write error: only %d/%d bytes sent.\n",
                    tuntap->devname, datalen, pkt->pktdata.len);
        } else {
            _DEBUG("[tuntap %s] >> wrote %d bytes.\n",
                    tuntap->devname, datalen);
        }
    }

    return datalen;
}