Commit e0e7877a0a522d12d0fa6afd7959d3ca5cac73ff

Authored by aliguori
1 parent 1b0f9cc2

Handle link status in qemu_sendv_packet() (Mark McLoughlin)

If link is down, pretend that the packet has been successfully sent.

Signed-off-by: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6444 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 15 additions and 0 deletions
@@ -421,6 +421,16 @@ static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov, @@ -421,6 +421,16 @@ static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov,
421 return offset; 421 return offset;
422 } 422 }
423 423
  424 +static ssize_t calc_iov_length(const struct iovec *iov, int iovcnt)
  425 +{
  426 + size_t offset = 0;
  427 + int i;
  428 +
  429 + for (i = 0; i < iovcnt; i++)
  430 + offset += iov[i].iov_len;
  431 + return offset;
  432 +}
  433 +
424 ssize_t qemu_sendv_packet(VLANClientState *vc1, const struct iovec *iov, 434 ssize_t qemu_sendv_packet(VLANClientState *vc1, const struct iovec *iov,
425 int iovcnt) 435 int iovcnt)
426 { 436 {
@@ -428,12 +438,17 @@ ssize_t qemu_sendv_packet(VLANClientState *vc1, const struct iovec *iov, @@ -428,12 +438,17 @@ ssize_t qemu_sendv_packet(VLANClientState *vc1, const struct iovec *iov,
428 VLANClientState *vc; 438 VLANClientState *vc;
429 ssize_t max_len = 0; 439 ssize_t max_len = 0;
430 440
  441 + if (vc1->link_down)
  442 + return calc_iov_length(iov, iovcnt);
  443 +
431 for (vc = vlan->first_client; vc != NULL; vc = vc->next) { 444 for (vc = vlan->first_client; vc != NULL; vc = vc->next) {
432 ssize_t len = 0; 445 ssize_t len = 0;
433 446
434 if (vc == vc1) 447 if (vc == vc1)
435 continue; 448 continue;
436 449
  450 + if (vc->link_down)
  451 + len = calc_iov_length(iov, iovcnt);
437 if (vc->fd_readv) 452 if (vc->fd_readv)
438 len = vc->fd_readv(vc->opaque, iov, iovcnt); 453 len = vc->fd_readv(vc->opaque, iov, iovcnt);
439 else if (vc->fd_read) 454 else if (vc->fd_read)