X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fnetdev-pltap.c;h=6c36e96d8eb7eb24b43ff35da0ecb0e91a3d6196;hb=2ad325a8ef508698dcb6fe6d37648a9cde9badf4;hp=4e010cf53fb25a96f2fabba22e749a88fdf069c3;hpb=bcb67bd81dfa52acc51040a9bf358a530c3fac2b;p=sliver-openvswitch.git diff --git a/lib/netdev-pltap.c b/lib/netdev-pltap.c index 4e010cf53..6c36e96d8 100644 --- a/lib/netdev-pltap.c +++ b/lib/netdev-pltap.c @@ -338,13 +338,16 @@ netdev_pltap_recv(struct netdev *netdev_, void *buffer, size_t size) { struct netdev_dev_pltap *dev = netdev_dev_pltap_cast(netdev_get_dev(netdev_)); + char prefix[4]; + struct iovec iov[2] = { + { .iov_base = prefix, .iov_len = 4 }, + { .iov_base = buffer, .iov_len = size } + }; if (!dev->finalized) return -EAGAIN; for (;;) { ssize_t retval; - retval = read(dev->fd, buffer, size); - VLOG_DBG("%s: read(%"PRIxPTR", %"PRIu64") = %"PRId64, - netdev_get_name(netdev_), (uintptr_t)buffer, size, retval); + retval = readv(dev->fd, iov, 2); if (retval >= 0) { if (retval <= size) { return retval; @@ -376,17 +379,20 @@ netdev_pltap_send(struct netdev *netdev_, const void *buffer, size_t size) { struct netdev_dev_pltap *dev = netdev_dev_pltap_cast(netdev_get_dev(netdev_)); + char prefix[4] = { 0, 0, 8, 6 }; + struct iovec iov[2] = { + { .iov_base = prefix, .iov_len = 4 }, + { .iov_base = buffer, .iov_len = size } + }; if (dev->fd < 0 || !dev->finalized) return EAGAIN; for (;;) { ssize_t retval; - retval = write(dev->fd, buffer, size); - VLOG_DBG("%s: write(%"PRIxPTR", %"PRIu64") = %"PRId64, - netdev_get_name(netdev_), (uintptr_t)buffer, size, retval); + retval = writev(dev->fd, iov, 2); if (retval >= 0) { - if (retval != size) { - VLOG_WARN_RL(&rl, "sent partial Ethernet packet (%"PRId64" bytes of " - "%"PRIu64") on %s", retval, size, netdev_get_name(netdev_)); + if (retval != size + 4) { + VLOG_WARN_RL(&rl, "sent partial Ethernet packet (%zd bytes of %zu) on %s", + retval, size + 4, netdev_get_name(netdev_)); } return 0; } else if (errno != EINTR) { @@ -461,6 +467,7 @@ get_etheraddr(const char *netdev_name, uint8_t ea[ETH_ADDR_LEN]) VLOG(errno == ENODEV ? VLL_INFO : VLL_ERR, "ioctl(SIOCGIFHWADDR) on %s device failed: %s", netdev_name, strerror(errno)); + close(af_inet_sock); return errno; } hwaddr_family = ifr.ifr_hwaddr.sa_family; @@ -469,6 +476,7 @@ get_etheraddr(const char *netdev_name, uint8_t ea[ETH_ADDR_LEN]) netdev_name, hwaddr_family); } memcpy(ea, ifr.ifr_hwaddr.sa_data, ETH_ADDR_LEN); + close(af_inet_sock); return 0; }