Revision 348e7b8d

b/hw/virtio-net.c
657 657

  
658 658
        /* copy in packet.  ugh */
659 659
        len = iov_from_buf(sg, elem.in_num,
660
                           buf + offset, size - offset);
660
                           buf + offset, 0, size - offset);
661 661
        total += len;
662 662
        offset += len;
663 663
        /* If buffers can't be merged, at this point we
b/hw/virtio-serial-bus.c
103 103
        }
104 104

  
105 105
        len = iov_from_buf(elem.in_sg, elem.in_num,
106
                           buf + offset, size - offset);
106
                           buf + offset, 0, size - offset);
107 107
        offset += len;
108 108

  
109 109
        virtqueue_push(vq, &elem, len);
b/iov.c
14 14

  
15 15
#include "iov.h"
16 16

  
17
size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt,
18
                    const void *buf, size_t size)
17
size_t iov_from_buf(struct iovec *iov, unsigned int iov_cnt,
18
                    const void *buf, size_t iov_off, size_t size)
19 19
{
20
    size_t offset;
20
    size_t iovec_off, buf_off;
21 21
    unsigned int i;
22 22

  
23
    offset = 0;
24
    for (i = 0; offset < size && i < iovcnt; i++) {
25
        size_t len;
23
    iovec_off = 0;
24
    buf_off = 0;
25
    for (i = 0; i < iov_cnt && size; i++) {
26
        if (iov_off < (iovec_off + iov[i].iov_len)) {
27
            size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off, size);
26 28

  
27
        len = MIN(iov[i].iov_len, size - offset);
29
            memcpy(iov[i].iov_base + (iov_off - iovec_off), buf + buf_off, len);
28 30

  
29
        memcpy(iov[i].iov_base, buf + offset, len);
30
        offset += len;
31
            buf_off += len;
32
            iov_off += len;
33
            size -= len;
34
        }
35
        iovec_off += iov[i].iov_len;
31 36
    }
32
    return offset;
37
    return buf_off;
33 38
}
34 39

  
35
size_t iov_to_buf(const struct iovec *iov, const unsigned int iovcnt,
36
                  void *buf, size_t offset, size_t size)
40
size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt,
41
                  void *buf, size_t iov_off, size_t size)
37 42
{
38 43
    uint8_t *ptr;
39
    size_t iov_off, buf_off;
44
    size_t iovec_off, buf_off;
40 45
    unsigned int i;
41 46

  
42 47
    ptr = buf;
43
    iov_off = 0;
48
    iovec_off = 0;
44 49
    buf_off = 0;
45
    for (i = 0; i < iovcnt && size; i++) {
46
        if (offset < (iov_off + iov[i].iov_len)) {
47
            size_t len = MIN((iov_off + iov[i].iov_len) - offset , size);
50
    for (i = 0; i < iov_cnt && size; i++) {
51
        if (iov_off < (iovec_off + iov[i].iov_len)) {
52
            size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off , size);
48 53

  
49
            memcpy(ptr + buf_off, iov[i].iov_base + (offset - iov_off), len);
54
            memcpy(ptr + buf_off, iov[i].iov_base + (iov_off - iovec_off), len);
50 55

  
51 56
            buf_off += len;
52
            offset += len;
57
            iov_off += len;
53 58
            size -= len;
54 59
        }
55
        iov_off += iov[i].iov_len;
60
        iovec_off += iov[i].iov_len;
56 61
    }
57 62
    return buf_off;
58 63
}
59 64

  
60
size_t iov_size(const struct iovec *iov, const unsigned int iovcnt)
65
size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt)
61 66
{
62 67
    size_t len;
63 68
    unsigned int i;
64 69

  
65 70
    len = 0;
66
    for (i = 0; i < iovcnt; i++) {
71
    for (i = 0; i < iov_cnt; i++) {
67 72
        len += iov[i].iov_len;
68 73
    }
69 74
    return len;
b/iov.h
12 12

  
13 13
#include "qemu-common.h"
14 14

  
15
size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt,
16
                    const void *buf, size_t size);
17
size_t iov_to_buf(const struct iovec *iov, const unsigned int iovcnt,
18
                  void *buf, size_t offset, size_t size);
19
size_t iov_size(const struct iovec *iov, const unsigned int iovcnt);
15
size_t iov_from_buf(struct iovec *iov, unsigned int iov_cnt,
16
                    const void *buf, size_t iov_off, size_t size);
17
size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt,
18
                  void *buf, size_t iov_off, size_t size);
19
size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt);

Also available in: Unified diff