}
for (;;) {
- ssize_t retval = read(netdev->fd, data, size);
+ ssize_t retval = recv(netdev->fd, data, size, MSG_TRUNC);
if (retval >= 0) {
- return retval;
+ return retval <= size ? retval : -EMSGSIZE;
} else if (errno != EINTR) {
if (errno != EAGAIN) {
VLOG_WARN_RL(&rl, "error receiving Ethernet packet on %s: %s",
struct ifreq ifr;
int error;
+ if (netdev_dev->cache_valid & VALID_MTU &&
+ netdev_dev->mtu == mtu) {
+ return 0;
+ }
ifr.ifr_mtu = mtu;
error = netdev_linux_do_ioctl(netdev_get_name(netdev_), &ifr,
SIOCSIFMTU, "SIOCSIFMTU");
error = netdev_vport_get_stats(netdev_, stats);
if (error) {
- VLOG_WARN_RL(&rl, "%s: obtaining netdev stats via vport failed %d",
- netdev_get_name(netdev_), error);
+ VLOG_WARN_RL(&rl, "%s: obtaining netdev stats via vport failed "
+ "(%s)", netdev_get_name(netdev_), strerror(error));
}
netdev_dev->have_vport_stats = !error;
netdev_dev->cache_valid |= VALID_HAVE_VPORT_STATS;