-----BEGIN PGP SIGNATURE-----

Version: GnuPG v1
 
 iQEcBAABAgAGBQJXBHKfAAoJEO8Ells5jWIR2b8H/A3zxauQJ4dC5UwWguueG3qw
 PKmkUbOq78fy4l5QSUDmBBRl2XkQSr/8BXB5LnDzuzNtDYU+yx8MhXurA1hzkgxY
 Dp3rKjt+6n7HkaFreR0kKgOXHHjInJWXpuoJrKTHRQ9TtWFn9dhemk1CjIykH947
 J8Xnt7FHCPxZcOqbN20vvgN/g2oG1CacCaldAsCNwG/5p/VMXSo2djnHAGsza3V5
 v8hRo+X07tnqQfdyr3nMwTVRVlOBq5QMmTZxlNqVxSmXwKI3CFrzorArgSj030I7
 hvnDJ0gRirxenNfuiqwqmKzyu18sCg+Ahp8U48Z6F+Kvmc/aoGmxTFY0FS7cL3M=
 =cwBg
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/jasowang/tags/net-pull-request' into staging

# gpg: Signature made Wed 06 Apr 2016 03:21:19 BST using RSA key ID 398D6211
# gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>"
# gpg: WARNING: This key is not certified with sufficiently trusted signatures!
# gpg:          It is not certain that the signature belongs to the owner.
# Primary key fingerprint: 215D 46F4 8246 689E C77F  3562 EF04 965B 398D 6211

* remotes/jasowang/tags/net-pull-request:
  filter-buffer: fix segfault when starting qemu with status=off property
  rtl8139: using CP_TX_OWN for ownership transferring during tx
  net: fix OptsVisitor memory leak
  net: Allocating Large sized arrays to heap
  util: Improved qemu_hexmap() to include an ascii dump of the buffer

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2016-04-07 10:14:41 +01:00
commit 0f9d6bd210
4 changed files with 35 additions and 46 deletions

View File

@ -2046,7 +2046,7 @@ static int rtl8139_cplus_transmit_one(RTL8139State *s)
}
/* transfer ownership to target */
txdw0 &= ~CP_RX_OWN;
txdw0 &= ~CP_TX_OWN;
/* reset error indicator bits */
txdw0 &= ~CP_TX_STATUS_UNF;

View File

@ -164,7 +164,7 @@ static void netfilter_set_status(Object *obj, const char *str, Error **errp)
return;
}
nf->on = !nf->on;
if (nfc->status_changed) {
if (nf->netdev && nfc->status_changed) {
nfc->status_changed(nf, errp);
}
}

View File

@ -81,34 +81,6 @@ int default_net = 1;
/***********************************************************/
/* network device redirectors */
#if defined(DEBUG_NET)
static void hex_dump(FILE *f, const uint8_t *buf, int size)
{
int len, i, j, c;
for(i=0;i<size;i+=16) {
len = size - i;
if (len > 16)
len = 16;
fprintf(f, "%08x ", i);
for(j=0;j<16;j++) {
if (j < len)
fprintf(f, " %02x", buf[i+j]);
else
fprintf(f, " ");
}
fprintf(f, " ");
for(j=0;j<len;j++) {
c = buf[i+j];
if (c < ' ' || c > '~')
c = '.';
fprintf(f, "%c", c);
}
fprintf(f, "\n");
}
}
#endif
static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
{
const char *p, *p1;
@ -664,7 +636,7 @@ static ssize_t qemu_send_packet_async_with_flags(NetClientState *sender,
#ifdef DEBUG_NET
printf("qemu_send_packet_async:\n");
hex_dump(stdout, buf, size);
qemu_hexdump((const char *)buf, stdout, "net", size);
#endif
if (sender->link_down || !sender->peer) {
@ -711,23 +683,28 @@ ssize_t qemu_send_packet_raw(NetClientState *nc, const uint8_t *buf, int size)
static ssize_t nc_sendv_compat(NetClientState *nc, const struct iovec *iov,
int iovcnt, unsigned flags)
{
uint8_t buf[NET_BUFSIZE];
uint8_t *buf = NULL;
uint8_t *buffer;
size_t offset;
ssize_t ret;
if (iovcnt == 1) {
buffer = iov[0].iov_base;
offset = iov[0].iov_len;
} else {
buf = g_new(uint8_t, NET_BUFSIZE);
buffer = buf;
offset = iov_to_buf(iov, iovcnt, 0, buf, sizeof(buf));
offset = iov_to_buf(iov, iovcnt, 0, buf, NET_BUFSIZE);
}
if (flags & QEMU_NET_PACKET_FLAG_RAW && nc->info->receive_raw) {
return nc->info->receive_raw(nc, buffer, offset);
ret = nc->info->receive_raw(nc, buffer, offset);
} else {
return nc->info->receive(nc, buffer, offset);
ret = nc->info->receive(nc, buffer, offset);
}
g_free(buf);
return ret;
}
ssize_t qemu_deliver_packet_iov(NetClientState *sender,
@ -1100,6 +1077,7 @@ int net_client_init(QemuOpts *opts, int is_netdev, Error **errp)
}
error_propagate(errp, err);
opts_visitor_cleanup(ov);
return ret;
}

View File

@ -18,21 +18,32 @@
void qemu_hexdump(const char *buf, FILE *fp, const char *prefix, size_t size)
{
unsigned int b;
unsigned int b, len, i, c;
for (b = 0; b < size; b++) {
if ((b % 16) == 0) {
fprintf(fp, "%s: %04x:", prefix, b);
for (b = 0; b < size; b += 16) {
len = size - b;
if (len > 16) {
len = 16;
}
if ((b % 4) == 0) {
fprintf(fp, " ");
fprintf(fp, "%s: %04x:", prefix, b);
for (i = 0; i < 16; i++) {
if ((i % 4) == 0) {
fprintf(fp, " ");
}
if (i < len) {
fprintf(fp, " %02x", (unsigned char)buf[b + i]);
} else {
fprintf(fp, " ");
}
}
fprintf(fp, " %02x", (unsigned char)buf[b]);
if ((b % 16) == 15) {
fprintf(fp, "\n");
fprintf(fp, " ");
for (i = 0; i < len; i++) {
c = buf[b + i];
if (c < ' ' || c > '~') {
c = '.';
}
fprintf(fp, "%c", c);
}
}
if ((b % 16) != 0) {
fprintf(fp, "\n");
}
}