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