cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

l2tpv3.c (19855B)


      1/*
      2 * QEMU System Emulator
      3 *
      4 * Copyright (c) 2003-2008 Fabrice Bellard
      5 * Copyright (c) 2012-2014 Cisco Systems
      6 *
      7 * Permission is hereby granted, free of charge, to any person obtaining a copy
      8 * of this software and associated documentation files (the "Software"), to deal
      9 * in the Software without restriction, including without limitation the rights
     10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     11 * copies of the Software, and to permit persons to whom the Software is
     12 * furnished to do so, subject to the following conditions:
     13 *
     14 * The above copyright notice and this permission notice shall be included in
     15 * all copies or substantial portions of the Software.
     16 *
     17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     23 * THE SOFTWARE.
     24 */
     25
     26#include "qemu/osdep.h"
     27#include <linux/ip.h>
     28#include <netdb.h>
     29#include "net/net.h"
     30#include "clients.h"
     31#include "qapi/error.h"
     32#include "qemu/error-report.h"
     33#include "qemu/option.h"
     34#include "qemu/sockets.h"
     35#include "qemu/iov.h"
     36#include "qemu/main-loop.h"
     37
     38
     39/* The buffer size needs to be investigated for optimum numbers and
     40 * optimum means of paging in on different systems. This size is
     41 * chosen to be sufficient to accommodate one packet with some headers
     42 */
     43
     44#define BUFFER_ALIGN sysconf(_SC_PAGESIZE)
     45#define BUFFER_SIZE 2048
     46#define IOVSIZE 2
     47#define MAX_L2TPV3_MSGCNT 64
     48#define MAX_L2TPV3_IOVCNT (MAX_L2TPV3_MSGCNT * IOVSIZE)
     49
     50/* Header set to 0x30000 signifies a data packet */
     51
     52#define L2TPV3_DATA_PACKET 0x30000
     53
     54/* IANA-assigned IP protocol ID for L2TPv3 */
     55
     56#ifndef IPPROTO_L2TP
     57#define IPPROTO_L2TP 0x73
     58#endif
     59
     60typedef struct NetL2TPV3State {
     61    NetClientState nc;
     62    int fd;
     63
     64    /*
     65     * these are used for xmit - that happens packet a time
     66     * and for first sign of life packet (easier to parse that once)
     67     */
     68
     69    uint8_t *header_buf;
     70    struct iovec *vec;
     71
     72    /*
     73     * these are used for receive - try to "eat" up to 32 packets at a time
     74     */
     75
     76    struct mmsghdr *msgvec;
     77
     78    /*
     79     * peer address
     80     */
     81
     82    struct sockaddr_storage *dgram_dst;
     83    uint32_t dst_size;
     84
     85    /*
     86     * L2TPv3 parameters
     87     */
     88
     89    uint64_t rx_cookie;
     90    uint64_t tx_cookie;
     91    uint32_t rx_session;
     92    uint32_t tx_session;
     93    uint32_t header_size;
     94    uint32_t counter;
     95
     96    /*
     97    * DOS avoidance in error handling
     98    */
     99
    100    bool header_mismatch;
    101
    102    /*
    103     * Ring buffer handling
    104     */
    105
    106    int queue_head;
    107    int queue_tail;
    108    int queue_depth;
    109
    110    /*
    111     * Precomputed offsets
    112     */
    113
    114    uint32_t offset;
    115    uint32_t cookie_offset;
    116    uint32_t counter_offset;
    117    uint32_t session_offset;
    118
    119    /* Poll Control */
    120
    121    bool read_poll;
    122    bool write_poll;
    123
    124    /* Flags */
    125
    126    bool ipv6;
    127    bool udp;
    128    bool has_counter;
    129    bool pin_counter;
    130    bool cookie;
    131    bool cookie_is_64;
    132
    133} NetL2TPV3State;
    134
    135static void net_l2tpv3_send(void *opaque);
    136static void l2tpv3_writable(void *opaque);
    137
    138static void l2tpv3_update_fd_handler(NetL2TPV3State *s)
    139{
    140    qemu_set_fd_handler(s->fd,
    141                        s->read_poll ? net_l2tpv3_send : NULL,
    142                        s->write_poll ? l2tpv3_writable : NULL,
    143                        s);
    144}
    145
    146static void l2tpv3_read_poll(NetL2TPV3State *s, bool enable)
    147{
    148    if (s->read_poll != enable) {
    149        s->read_poll = enable;
    150        l2tpv3_update_fd_handler(s);
    151    }
    152}
    153
    154static void l2tpv3_write_poll(NetL2TPV3State *s, bool enable)
    155{
    156    if (s->write_poll != enable) {
    157        s->write_poll = enable;
    158        l2tpv3_update_fd_handler(s);
    159    }
    160}
    161
    162static void l2tpv3_writable(void *opaque)
    163{
    164    NetL2TPV3State *s = opaque;
    165    l2tpv3_write_poll(s, false);
    166    qemu_flush_queued_packets(&s->nc);
    167}
    168
    169static void l2tpv3_send_completed(NetClientState *nc, ssize_t len)
    170{
    171    NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc);
    172    l2tpv3_read_poll(s, true);
    173}
    174
    175static void l2tpv3_poll(NetClientState *nc, bool enable)
    176{
    177    NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc);
    178    l2tpv3_write_poll(s, enable);
    179    l2tpv3_read_poll(s, enable);
    180}
    181
    182static void l2tpv3_form_header(NetL2TPV3State *s)
    183{
    184    uint32_t *counter;
    185
    186    if (s->udp) {
    187        stl_be_p((uint32_t *) s->header_buf, L2TPV3_DATA_PACKET);
    188    }
    189    stl_be_p(
    190            (uint32_t *) (s->header_buf + s->session_offset),
    191            s->tx_session
    192        );
    193    if (s->cookie) {
    194        if (s->cookie_is_64) {
    195            stq_be_p(
    196                (uint64_t *)(s->header_buf + s->cookie_offset),
    197                s->tx_cookie
    198            );
    199        } else {
    200            stl_be_p(
    201                (uint32_t *) (s->header_buf + s->cookie_offset),
    202                s->tx_cookie
    203            );
    204        }
    205    }
    206    if (s->has_counter) {
    207        counter = (uint32_t *)(s->header_buf + s->counter_offset);
    208        if (s->pin_counter) {
    209            *counter = 0;
    210        } else {
    211            stl_be_p(counter, ++s->counter);
    212        }
    213    }
    214}
    215
    216static ssize_t net_l2tpv3_receive_dgram_iov(NetClientState *nc,
    217                    const struct iovec *iov,
    218                    int iovcnt)
    219{
    220    NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc);
    221
    222    struct msghdr message;
    223    int ret;
    224
    225    if (iovcnt > MAX_L2TPV3_IOVCNT - 1) {
    226        error_report(
    227            "iovec too long %d > %d, change l2tpv3.h",
    228            iovcnt, MAX_L2TPV3_IOVCNT
    229        );
    230        return -1;
    231    }
    232    l2tpv3_form_header(s);
    233    memcpy(s->vec + 1, iov, iovcnt * sizeof(struct iovec));
    234    s->vec->iov_base = s->header_buf;
    235    s->vec->iov_len = s->offset;
    236    message.msg_name = s->dgram_dst;
    237    message.msg_namelen = s->dst_size;
    238    message.msg_iov = s->vec;
    239    message.msg_iovlen = iovcnt + 1;
    240    message.msg_control = NULL;
    241    message.msg_controllen = 0;
    242    message.msg_flags = 0;
    243    do {
    244        ret = sendmsg(s->fd, &message, 0);
    245    } while ((ret == -1) && (errno == EINTR));
    246    if (ret > 0) {
    247        ret -= s->offset;
    248    } else if (ret == 0) {
    249        /* belt and braces - should not occur on DGRAM
    250        * we should get an error and never a 0 send
    251        */
    252        ret = iov_size(iov, iovcnt);
    253    } else {
    254        /* signal upper layer that socket buffer is full */
    255        ret = -errno;
    256        if (ret == -EAGAIN || ret == -ENOBUFS) {
    257            l2tpv3_write_poll(s, true);
    258            ret = 0;
    259        }
    260    }
    261    return ret;
    262}
    263
    264static ssize_t net_l2tpv3_receive_dgram(NetClientState *nc,
    265                    const uint8_t *buf,
    266                    size_t size)
    267{
    268    NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc);
    269
    270    struct iovec *vec;
    271    struct msghdr message;
    272    ssize_t ret = 0;
    273
    274    l2tpv3_form_header(s);
    275    vec = s->vec;
    276    vec->iov_base = s->header_buf;
    277    vec->iov_len = s->offset;
    278    vec++;
    279    vec->iov_base = (void *) buf;
    280    vec->iov_len = size;
    281    message.msg_name = s->dgram_dst;
    282    message.msg_namelen = s->dst_size;
    283    message.msg_iov = s->vec;
    284    message.msg_iovlen = 2;
    285    message.msg_control = NULL;
    286    message.msg_controllen = 0;
    287    message.msg_flags = 0;
    288    do {
    289        ret = sendmsg(s->fd, &message, 0);
    290    } while ((ret == -1) && (errno == EINTR));
    291    if (ret > 0) {
    292        ret -= s->offset;
    293    } else if (ret == 0) {
    294        /* belt and braces - should not occur on DGRAM
    295        * we should get an error and never a 0 send
    296        */
    297        ret = size;
    298    } else {
    299        ret = -errno;
    300        if (ret == -EAGAIN || ret == -ENOBUFS) {
    301            /* signal upper layer that socket buffer is full */
    302            l2tpv3_write_poll(s, true);
    303            ret = 0;
    304        }
    305    }
    306    return ret;
    307}
    308
    309static int l2tpv3_verify_header(NetL2TPV3State *s, uint8_t *buf)
    310{
    311
    312    uint32_t *session;
    313    uint64_t cookie;
    314
    315    if ((!s->udp) && (!s->ipv6)) {
    316        buf += sizeof(struct iphdr) /* fix for ipv4 raw */;
    317    }
    318
    319    /* we do not do a strict check for "data" packets as per
    320    * the RFC spec because the pure IP spec does not have
    321    * that anyway.
    322    */
    323
    324    if (s->cookie) {
    325        if (s->cookie_is_64) {
    326            cookie = ldq_be_p(buf + s->cookie_offset);
    327        } else {
    328            cookie = ldl_be_p(buf + s->cookie_offset) & 0xffffffffULL;
    329        }
    330        if (cookie != s->rx_cookie) {
    331            if (!s->header_mismatch) {
    332                error_report("unknown cookie id");
    333            }
    334            return -1;
    335        }
    336    }
    337    session = (uint32_t *) (buf + s->session_offset);
    338    if (ldl_be_p(session) != s->rx_session) {
    339        if (!s->header_mismatch) {
    340            error_report("session mismatch");
    341        }
    342        return -1;
    343    }
    344    return 0;
    345}
    346
    347static void net_l2tpv3_process_queue(NetL2TPV3State *s)
    348{
    349    int size = 0;
    350    struct iovec *vec;
    351    bool bad_read;
    352    int data_size;
    353    struct mmsghdr *msgvec;
    354
    355    /* go into ring mode only if there is a "pending" tail */
    356    if (s->queue_depth > 0) {
    357        do {
    358            msgvec = s->msgvec + s->queue_tail;
    359            if (msgvec->msg_len > 0) {
    360                data_size = msgvec->msg_len - s->header_size;
    361                vec = msgvec->msg_hdr.msg_iov;
    362                if ((data_size > 0) &&
    363                    (l2tpv3_verify_header(s, vec->iov_base) == 0)) {
    364                    vec++;
    365                    /* Use the legacy delivery for now, we will
    366                     * switch to using our own ring as a queueing mechanism
    367                     * at a later date
    368                     */
    369                    size = qemu_send_packet_async(
    370                            &s->nc,
    371                            vec->iov_base,
    372                            data_size,
    373                            l2tpv3_send_completed
    374                        );
    375                    if (size == 0) {
    376                        l2tpv3_read_poll(s, false);
    377                    }
    378                    bad_read = false;
    379                } else {
    380                    bad_read = true;
    381                    if (!s->header_mismatch) {
    382                        /* report error only once */
    383                        error_report("l2tpv3 header verification failed");
    384                        s->header_mismatch = true;
    385                    }
    386                }
    387            } else {
    388                bad_read = true;
    389            }
    390            s->queue_tail = (s->queue_tail + 1) % MAX_L2TPV3_MSGCNT;
    391            s->queue_depth--;
    392        } while (
    393                (s->queue_depth > 0) &&
    394                 qemu_can_send_packet(&s->nc) &&
    395                ((size > 0) || bad_read)
    396            );
    397    }
    398}
    399
    400static void net_l2tpv3_send(void *opaque)
    401{
    402    NetL2TPV3State *s = opaque;
    403    int target_count, count;
    404    struct mmsghdr *msgvec;
    405
    406    /* go into ring mode only if there is a "pending" tail */
    407
    408    if (s->queue_depth) {
    409
    410        /* The ring buffer we use has variable intake
    411         * count of how much we can read varies - adjust accordingly
    412         */
    413
    414        target_count = MAX_L2TPV3_MSGCNT - s->queue_depth;
    415
    416        /* Ensure we do not overrun the ring when we have
    417         * a lot of enqueued packets
    418         */
    419
    420        if (s->queue_head + target_count > MAX_L2TPV3_MSGCNT) {
    421            target_count = MAX_L2TPV3_MSGCNT - s->queue_head;
    422        }
    423    } else {
    424
    425        /* we do not have any pending packets - we can use
    426        * the whole message vector linearly instead of using
    427        * it as a ring
    428        */
    429
    430        s->queue_head = 0;
    431        s->queue_tail = 0;
    432        target_count = MAX_L2TPV3_MSGCNT;
    433    }
    434
    435    msgvec = s->msgvec + s->queue_head;
    436    if (target_count > 0) {
    437        do {
    438            count = recvmmsg(
    439                s->fd,
    440                msgvec,
    441                target_count, MSG_DONTWAIT, NULL);
    442        } while ((count == -1) && (errno == EINTR));
    443        if (count < 0) {
    444            /* Recv error - we still need to flush packets here,
    445             * (re)set queue head to current position
    446             */
    447            count = 0;
    448        }
    449        s->queue_head = (s->queue_head + count) % MAX_L2TPV3_MSGCNT;
    450        s->queue_depth += count;
    451    }
    452    net_l2tpv3_process_queue(s);
    453}
    454
    455static void destroy_vector(struct mmsghdr *msgvec, int count, int iovcount)
    456{
    457    int i, j;
    458    struct iovec *iov;
    459    struct mmsghdr *cleanup = msgvec;
    460    if (cleanup) {
    461        for (i = 0; i < count; i++) {
    462            if (cleanup->msg_hdr.msg_iov) {
    463                iov = cleanup->msg_hdr.msg_iov;
    464                for (j = 0; j < iovcount; j++) {
    465                    g_free(iov->iov_base);
    466                    iov++;
    467                }
    468                g_free(cleanup->msg_hdr.msg_iov);
    469            }
    470            cleanup++;
    471        }
    472        g_free(msgvec);
    473    }
    474}
    475
    476static struct mmsghdr *build_l2tpv3_vector(NetL2TPV3State *s, int count)
    477{
    478    int i;
    479    struct iovec *iov;
    480    struct mmsghdr *msgvec, *result;
    481
    482    msgvec = g_new(struct mmsghdr, count);
    483    result = msgvec;
    484    for (i = 0; i < count ; i++) {
    485        msgvec->msg_hdr.msg_name = NULL;
    486        msgvec->msg_hdr.msg_namelen = 0;
    487        iov =  g_new(struct iovec, IOVSIZE);
    488        msgvec->msg_hdr.msg_iov = iov;
    489        iov->iov_base = g_malloc(s->header_size);
    490        iov->iov_len = s->header_size;
    491        iov++ ;
    492        iov->iov_base = qemu_memalign(BUFFER_ALIGN, BUFFER_SIZE);
    493        iov->iov_len = BUFFER_SIZE;
    494        msgvec->msg_hdr.msg_iovlen = 2;
    495        msgvec->msg_hdr.msg_control = NULL;
    496        msgvec->msg_hdr.msg_controllen = 0;
    497        msgvec->msg_hdr.msg_flags = 0;
    498        msgvec++;
    499    }
    500    return result;
    501}
    502
    503static void net_l2tpv3_cleanup(NetClientState *nc)
    504{
    505    NetL2TPV3State *s = DO_UPCAST(NetL2TPV3State, nc, nc);
    506    qemu_purge_queued_packets(nc);
    507    l2tpv3_read_poll(s, false);
    508    l2tpv3_write_poll(s, false);
    509    if (s->fd >= 0) {
    510        close(s->fd);
    511    }
    512    destroy_vector(s->msgvec, MAX_L2TPV3_MSGCNT, IOVSIZE);
    513    g_free(s->vec);
    514    g_free(s->header_buf);
    515    g_free(s->dgram_dst);
    516}
    517
    518static NetClientInfo net_l2tpv3_info = {
    519    .type = NET_CLIENT_DRIVER_L2TPV3,
    520    .size = sizeof(NetL2TPV3State),
    521    .receive = net_l2tpv3_receive_dgram,
    522    .receive_iov = net_l2tpv3_receive_dgram_iov,
    523    .poll = l2tpv3_poll,
    524    .cleanup = net_l2tpv3_cleanup,
    525};
    526
    527int net_init_l2tpv3(const Netdev *netdev,
    528                    const char *name,
    529                    NetClientState *peer, Error **errp)
    530{
    531    const NetdevL2TPv3Options *l2tpv3;
    532    NetL2TPV3State *s;
    533    NetClientState *nc;
    534    int fd = -1, gairet;
    535    struct addrinfo hints;
    536    struct addrinfo *result = NULL;
    537    char *srcport, *dstport;
    538
    539    nc = qemu_new_net_client(&net_l2tpv3_info, peer, "l2tpv3", name);
    540
    541    s = DO_UPCAST(NetL2TPV3State, nc, nc);
    542
    543    s->queue_head = 0;
    544    s->queue_tail = 0;
    545    s->header_mismatch = false;
    546
    547    assert(netdev->type == NET_CLIENT_DRIVER_L2TPV3);
    548    l2tpv3 = &netdev->u.l2tpv3;
    549
    550    if (l2tpv3->has_ipv6 && l2tpv3->ipv6) {
    551        s->ipv6 = l2tpv3->ipv6;
    552    } else {
    553        s->ipv6 = false;
    554    }
    555
    556    if ((l2tpv3->has_offset) && (l2tpv3->offset > 256)) {
    557        error_setg(errp, "offset must be less than 256 bytes");
    558        goto outerr;
    559    }
    560
    561    if (l2tpv3->has_rxcookie || l2tpv3->has_txcookie) {
    562        if (l2tpv3->has_rxcookie && l2tpv3->has_txcookie) {
    563            s->cookie = true;
    564        } else {
    565            error_setg(errp,
    566                       "require both 'rxcookie' and 'txcookie' or neither");
    567            goto outerr;
    568        }
    569    } else {
    570        s->cookie = false;
    571    }
    572
    573    if (l2tpv3->has_cookie64 || l2tpv3->cookie64) {
    574        s->cookie_is_64  = true;
    575    } else {
    576        s->cookie_is_64  = false;
    577    }
    578
    579    if (l2tpv3->has_udp && l2tpv3->udp) {
    580        s->udp = true;
    581        if (!(l2tpv3->has_srcport && l2tpv3->has_dstport)) {
    582            error_setg(errp, "need both src and dst port for udp");
    583            goto outerr;
    584        } else {
    585            srcport = l2tpv3->srcport;
    586            dstport = l2tpv3->dstport;
    587        }
    588    } else {
    589        s->udp = false;
    590        srcport = NULL;
    591        dstport = NULL;
    592    }
    593
    594
    595    s->offset = 4;
    596    s->session_offset = 0;
    597    s->cookie_offset = 4;
    598    s->counter_offset = 4;
    599
    600    s->tx_session = l2tpv3->txsession;
    601    if (l2tpv3->has_rxsession) {
    602        s->rx_session = l2tpv3->rxsession;
    603    } else {
    604        s->rx_session = s->tx_session;
    605    }
    606
    607    if (s->cookie) {
    608        s->rx_cookie = l2tpv3->rxcookie;
    609        s->tx_cookie = l2tpv3->txcookie;
    610        if (s->cookie_is_64 == true) {
    611            /* 64 bit cookie */
    612            s->offset += 8;
    613            s->counter_offset += 8;
    614        } else {
    615            /* 32 bit cookie */
    616            s->offset += 4;
    617            s->counter_offset += 4;
    618        }
    619    }
    620
    621    memset(&hints, 0, sizeof(hints));
    622
    623    if (s->ipv6) {
    624        hints.ai_family = AF_INET6;
    625    } else {
    626        hints.ai_family = AF_INET;
    627    }
    628    if (s->udp) {
    629        hints.ai_socktype = SOCK_DGRAM;
    630        hints.ai_protocol = 0;
    631        s->offset += 4;
    632        s->counter_offset += 4;
    633        s->session_offset += 4;
    634        s->cookie_offset += 4;
    635    } else {
    636        hints.ai_socktype = SOCK_RAW;
    637        hints.ai_protocol = IPPROTO_L2TP;
    638    }
    639
    640    gairet = getaddrinfo(l2tpv3->src, srcport, &hints, &result);
    641
    642    if ((gairet != 0) || (result == NULL)) {
    643        error_setg(errp, "could not resolve src, errno = %s",
    644                   gai_strerror(gairet));
    645        goto outerr;
    646    }
    647    fd = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    648    if (fd == -1) {
    649        fd = -errno;
    650        error_setg(errp, "socket creation failed, errno = %d",
    651                   -fd);
    652        goto outerr;
    653    }
    654    if (bind(fd, (struct sockaddr *) result->ai_addr, result->ai_addrlen)) {
    655        error_setg(errp, "could not bind socket err=%i", errno);
    656        goto outerr;
    657    }
    658
    659    freeaddrinfo(result);
    660
    661    memset(&hints, 0, sizeof(hints));
    662
    663    if (s->ipv6) {
    664        hints.ai_family = AF_INET6;
    665    } else {
    666        hints.ai_family = AF_INET;
    667    }
    668    if (s->udp) {
    669        hints.ai_socktype = SOCK_DGRAM;
    670        hints.ai_protocol = 0;
    671    } else {
    672        hints.ai_socktype = SOCK_RAW;
    673        hints.ai_protocol = IPPROTO_L2TP;
    674    }
    675
    676    result = NULL;
    677    gairet = getaddrinfo(l2tpv3->dst, dstport, &hints, &result);
    678    if ((gairet != 0) || (result == NULL)) {
    679        error_setg(errp, "could not resolve dst, error = %s",
    680                   gai_strerror(gairet));
    681        goto outerr;
    682    }
    683
    684    s->dgram_dst = g_new0(struct sockaddr_storage, 1);
    685    memcpy(s->dgram_dst, result->ai_addr, result->ai_addrlen);
    686    s->dst_size = result->ai_addrlen;
    687
    688    freeaddrinfo(result);
    689
    690    if (l2tpv3->has_counter && l2tpv3->counter) {
    691        s->has_counter = true;
    692        s->offset += 4;
    693    } else {
    694        s->has_counter = false;
    695    }
    696
    697    if (l2tpv3->has_pincounter && l2tpv3->pincounter) {
    698        s->has_counter = true;  /* pin counter implies that there is counter */
    699        s->pin_counter = true;
    700    } else {
    701        s->pin_counter = false;
    702    }
    703
    704    if (l2tpv3->has_offset) {
    705        /* extra offset */
    706        s->offset += l2tpv3->offset;
    707    }
    708
    709    if ((s->ipv6) || (s->udp)) {
    710        s->header_size = s->offset;
    711    } else {
    712        s->header_size = s->offset + sizeof(struct iphdr);
    713    }
    714
    715    s->msgvec = build_l2tpv3_vector(s, MAX_L2TPV3_MSGCNT);
    716    s->vec = g_new(struct iovec, MAX_L2TPV3_IOVCNT);
    717    s->header_buf = g_malloc(s->header_size);
    718
    719    qemu_set_nonblock(fd);
    720
    721    s->fd = fd;
    722    s->counter = 0;
    723
    724    l2tpv3_read_poll(s, true);
    725
    726    snprintf(s->nc.info_str, sizeof(s->nc.info_str),
    727             "l2tpv3: connected");
    728    return 0;
    729outerr:
    730    qemu_del_net_client(nc);
    731    if (fd >= 0) {
    732        close(fd);
    733    }
    734    if (result) {
    735        freeaddrinfo(result);
    736    }
    737    return -1;
    738}
    739