int changed_flags; /* Flags that we changed. */
};
+/* All open network devices. */
static struct list netdev_list = LIST_INITIALIZER(&netdev_list);
/* An AF_INET socket (used for ioctl operations). */
static int af_inet_sock = -1;
+/* This is set pretty low because we probably won't learn anything from the
+ * additional log messages. */
+static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
+
static void init_netdev(void);
static int restore_flags(struct netdev *netdev);
static int get_flags(const struct netdev *, int *flagsp);
} while (n_bytes < 0 && errno == EINTR);
if (n_bytes < 0) {
if (errno != EAGAIN) {
- VLOG_WARN("error receiving Ethernet packet on %s: %s",
- strerror(errno), netdev->name);
+ VLOG_WARN_RL(&rl, "error receiving Ethernet packet on %s: %s",
+ strerror(errno), netdev->name);
}
return errno;
} else {
/* Pull out the Ethernet header. */
if (buffer->size < ETH_HEADER_LEN) {
- VLOG_WARN("cannot send %zu-byte frame on %s",
- buffer->size, netdev->name);
+ VLOG_WARN_RL(&rl, "cannot send %zu-byte frame on %s",
+ buffer->size, netdev->name);
return EMSGSIZE;
}
eh = buffer_at_assert(buffer, 0, sizeof *eh);
if (errno == ENOBUFS) {
return EAGAIN;
} else if (errno != EAGAIN) {
- VLOG_WARN("error sending Ethernet packet on %s: %s",
- netdev->name, strerror(errno));
+ VLOG_WARN_RL(&rl, "error sending Ethernet packet on %s: %s",
+ netdev->name, strerror(errno));
}
return errno;
} else if (n_bytes != buffer->size) {
- VLOG_WARN("send partial Ethernet packet (%d bytes of %zu) on %s",
- (int) n_bytes, buffer->size, netdev->name);
+ VLOG_WARN_RL(&rl,
+ "send partial Ethernet packet (%d bytes of %zu) on %s",
+ (int) n_bytes, buffer->size, netdev->name);
return EMSGSIZE;
} else {
return 0;
struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
ip = sin->sin_addr;
} else {
- VLOG_DBG("%s: ioctl(SIOCGIFADDR) failed: %s",
- netdev->name, strerror(errno));
+ VLOG_DBG_RL(&rl, "%s: ioctl(SIOCGIFADDR) failed: %s",
+ netdev->name, strerror(errno));
}
if (in4) {
*in4 = ip;
if (!retval) {
memcpy(mac, r.arp_ha.sa_data, ETH_ADDR_LEN);
} else if (retval != ENXIO) {
- VLOG_WARN("%s: could not look up ARP entry for "IP_FMT": %s",
- netdev->name, IP_ARGS(&ip), strerror(retval));
+ VLOG_WARN_RL(&rl, "%s: could not look up ARP entry for "IP_FMT": %s",
+ netdev->name, IP_ARGS(&ip), strerror(retval));
}
return retval;
}