X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fnetdev-bsd.c;h=74765064080666cb87b75fcbbec41bfc56c34299;hb=bb79b46b3410dccc702f2614a86a07acb7521162;hp=538f91a7c2c023b4626621575c37a5f20ff62cd8;hpb=e71336c383e20d412a990ff22fe501d42a2a84c7;p=sliver-openvswitch.git diff --git a/lib/netdev-bsd.c b/lib/netdev-bsd.c index 538f91a7c..747650640 100644 --- a/lib/netdev-bsd.c +++ b/lib/netdev-bsd.c @@ -17,7 +17,6 @@ #include #include -#include #include #include #include @@ -50,6 +49,7 @@ #include "socket-util.h" #include "shash.h" #include "svec.h" +#include "util.h" #include "vlog.h" VLOG_DEFINE_THIS_MODULE(netdev_bsd); @@ -133,11 +133,11 @@ static int cache_notifier_refcount; static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); -static int netdev_bsd_do_ioctl(const struct netdev *, struct ifreq *, - unsigned long cmd, const char *cmd_name); +static int netdev_bsd_do_ioctl(const char *, struct ifreq *, unsigned long cmd, + const char *cmd_name); static void destroy_tap(int fd, const char *name); -static int get_flags(const struct netdev *, int *flagsp); -static int set_flags(struct netdev *, int flags); +static int get_flags(const struct netdev_dev *, int *flagsp); +static int set_flags(const char *, int flags); static int do_set_addr(struct netdev *netdev, int ioctl_nr, const char *ioctl_name, struct in_addr addr); @@ -157,14 +157,15 @@ is_netdev_bsd_class(const struct netdev_class *netdev_class) static struct netdev_bsd * netdev_bsd_cast(const struct netdev *netdev) { - assert(is_netdev_bsd_class(netdev_dev_get_class(netdev_get_dev(netdev)))); + ovs_assert(is_netdev_bsd_class(netdev_dev_get_class( + netdev_get_dev(netdev)))); return CONTAINER_OF(netdev, struct netdev_bsd, netdev); } static struct netdev_dev_bsd * netdev_dev_bsd_cast(const struct netdev_dev *netdev_dev) { - assert(is_netdev_bsd_class(netdev_dev_get_class(netdev_dev))); + ovs_assert(is_netdev_bsd_class(netdev_dev_get_class(netdev_dev))); return CONTAINER_OF(netdev_dev, struct netdev_dev_bsd, netdev_dev); } @@ -220,7 +221,7 @@ netdev_dev_bsd_changed(struct netdev_dev_bsd *dev) /* Invalidate cache in case of interface status change. */ static void netdev_bsd_cache_cb(const struct rtbsd_change *change, - void *aux OVS_UNUSED) + void *aux OVS_UNUSED) { struct netdev_dev_bsd *dev; @@ -752,7 +753,7 @@ netdev_bsd_send_wait(struct netdev *netdev_) */ static int netdev_bsd_set_etheraddr(struct netdev *netdev_, - const uint8_t mac[ETH_ADDR_LEN]) + const uint8_t mac[ETH_ADDR_LEN]) { struct netdev_dev_bsd *netdev_dev = netdev_dev_bsd_cast(netdev_get_dev(netdev_)); @@ -779,7 +780,7 @@ netdev_bsd_set_etheraddr(struct netdev *netdev_, */ static int netdev_bsd_get_etheraddr(const struct netdev *netdev_, - uint8_t mac[ETH_ADDR_LEN]) + uint8_t mac[ETH_ADDR_LEN]) { struct netdev_dev_bsd *netdev_dev = netdev_dev_bsd_cast(netdev_get_dev(netdev_)); @@ -812,7 +813,8 @@ netdev_bsd_get_mtu(const struct netdev *netdev_, int *mtup) struct ifreq ifr; int error; - error = netdev_bsd_do_ioctl(netdev_, &ifr, SIOCGIFMTU, "SIOCGIFMTU"); + error = netdev_bsd_do_ioctl(netdev_get_name(netdev_), &ifr, SIOCGIFMTU, + "SIOCGIFMTU"); if (error) { return error; } @@ -906,22 +908,22 @@ netdev_bsd_get_stats(const struct netdev *netdev_, struct netdev_stats *stats) stats->rx_errors = ifmd.ifmd_data.ifi_ierrors; stats->tx_errors = ifmd.ifmd_data.ifi_oerrors; stats->rx_dropped = ifmd.ifmd_data.ifi_iqdrops; - stats->tx_dropped = 0; + stats->tx_dropped = UINT64_MAX; stats->multicast = ifmd.ifmd_data.ifi_imcasts; stats->collisions = ifmd.ifmd_data.ifi_collisions; - stats->rx_length_errors = 0; - stats->rx_over_errors = 0; - stats->rx_crc_errors = 0; - stats->rx_frame_errors = 0; - stats->rx_fifo_errors = 0; - stats->rx_missed_errors = 0; - - stats->tx_aborted_errors = 0; - stats->tx_carrier_errors = 0; - stats->tx_fifo_errors = 0; - stats->tx_heartbeat_errors = 0; - stats->tx_window_errors = 0; + stats->rx_length_errors = UINT64_MAX; + stats->rx_over_errors = UINT64_MAX; + stats->rx_crc_errors = UINT64_MAX; + stats->rx_frame_errors = UINT64_MAX; + stats->rx_fifo_errors = UINT64_MAX; + stats->rx_missed_errors = UINT64_MAX; + + stats->tx_aborted_errors = UINT64_MAX; + stats->tx_carrier_errors = UINT64_MAX; + stats->tx_fifo_errors = UINT64_MAX; + stats->tx_heartbeat_errors = UINT64_MAX; + stats->tx_window_errors = UINT64_MAX; break; } } @@ -1010,8 +1012,8 @@ netdev_bsd_parse_media(int media) */ static int netdev_bsd_get_features(const struct netdev *netdev, - enum netdev_features *current, uint32_t *advertised, - enum netdev_features *supported, uint32_t *peer) + enum netdev_features *current, uint32_t *advertised, + enum netdev_features *supported, uint32_t *peer) { struct ifmediareq ifmr; int *media_list; @@ -1036,7 +1038,7 @@ netdev_bsd_get_features(const struct netdev *netdev, media_list = xcalloc(ifmr.ifm_count, sizeof(int)); ifmr.ifm_ulist = media_list; - if (!IFM_TYPE(ifmr.ifm_current) & IFM_ETHER) { + if (IFM_TYPE(ifmr.ifm_current) != IFM_ETHER) { VLOG_DBG_RL(&rl, "%s: doesn't appear to be ethernet", netdev_get_name(netdev)); error = EINVAL; @@ -1088,8 +1090,8 @@ netdev_bsd_get_in4(const struct netdev *netdev_, struct in_addr *in4, int error; ifr.ifr_addr.sa_family = AF_INET; - error = netdev_bsd_do_ioctl(netdev_, &ifr, - SIOCGIFADDR, "SIOCGIFADDR"); + error = netdev_bsd_do_ioctl(netdev_get_name(netdev_), &ifr, + SIOCGIFADDR, "SIOCGIFADDR"); if (error) { return error; } @@ -1097,8 +1099,8 @@ netdev_bsd_get_in4(const struct netdev *netdev_, struct in_addr *in4, sin = (struct sockaddr_in *) &ifr.ifr_addr; netdev_dev->in4 = sin->sin_addr; netdev_dev->cache_valid |= VALID_IN4; - error = netdev_bsd_do_ioctl(netdev_, &ifr, - SIOCGIFNETMASK, "SIOCGIFNETMASK"); + error = netdev_bsd_do_ioctl(netdev_get_name(netdev_), &ifr, + SIOCGIFNETMASK, "SIOCGIFNETMASK"); if (error) { return error; } @@ -1116,7 +1118,7 @@ netdev_bsd_get_in4(const struct netdev *netdev_, struct in_addr *in4, */ static int netdev_bsd_set_in4(struct netdev *netdev_, struct in_addr addr, - struct in_addr mask) + struct in_addr mask) { struct netdev_dev_bsd *netdev_dev = netdev_dev_bsd_cast(netdev_get_dev(netdev_)); @@ -1220,19 +1222,21 @@ iff_to_nd_flags(int iff) } static int -netdev_bsd_update_flags(struct netdev *netdev, enum netdev_flags off, - enum netdev_flags on, enum netdev_flags *old_flagsp) +netdev_bsd_update_flags(struct netdev_dev *dev_, enum netdev_flags off, + enum netdev_flags on, enum netdev_flags *old_flagsp) { + struct netdev_dev_bsd *netdev_dev; int old_flags, new_flags; int error; - error = get_flags(netdev, &old_flags); + netdev_dev = netdev_dev_bsd_cast(dev_); + error = get_flags(dev_, &old_flags); if (!error) { *old_flagsp = iff_to_nd_flags(old_flags); new_flags = (old_flags & ~nd_to_iff_flags(off)) | nd_to_iff_flags(on); if (new_flags != old_flags) { - error = set_flags(netdev, new_flags); - netdev_dev_bsd_changed(netdev_dev_bsd_cast(netdev_get_dev(netdev))); + error = set_flags(netdev_dev_get_name(dev_), new_flags); + netdev_dev_bsd_changed(netdev_dev); } } return error; @@ -1380,12 +1384,12 @@ destroy_tap(int fd, const char *name) } static int -get_flags(const struct netdev *netdev, int *flags) +get_flags(const struct netdev_dev *dev, int *flags) { struct ifreq ifr; int error; - error = netdev_bsd_do_ioctl(netdev, &ifr, SIOCGIFFLAGS, "SIOCGIFFLAGS"); + error = netdev_bsd_do_ioctl(dev->name, &ifr, SIOCGIFFLAGS, "SIOCGIFFLAGS"); *flags = 0xFFFF0000 & (ifr.ifr_flagshigh << 16); *flags |= 0x0000FFFF & ifr.ifr_flags; @@ -1394,14 +1398,14 @@ get_flags(const struct netdev *netdev, int *flags) } static int -set_flags(struct netdev *netdev, int flags) +set_flags(const char *name, int flags) { struct ifreq ifr; ifr.ifr_flags = 0x0000FFFF & flags; ifr.ifr_flagshigh = (0xFFFF0000 & flags) >> 16; - return netdev_bsd_do_ioctl(netdev, &ifr, SIOCSIFFLAGS, "SIOCSIFFLAGS"); + return netdev_bsd_do_ioctl(name, &ifr, SIOCSIFFLAGS, "SIOCSIFFLAGS"); } static int @@ -1473,13 +1477,13 @@ set_etheraddr(const char *netdev_name, int hwaddr_family, } static int -netdev_bsd_do_ioctl(const struct netdev *netdev, struct ifreq *ifr, - unsigned long cmd, const char *cmd_name) +netdev_bsd_do_ioctl(const char *name, struct ifreq *ifr, unsigned long cmd, + const char *cmd_name) { - strncpy(ifr->ifr_name, netdev_get_name(netdev), sizeof ifr->ifr_name); + strncpy(ifr->ifr_name, name, sizeof ifr->ifr_name); if (ioctl(af_inet_sock, cmd, ifr) == -1) { - VLOG_DBG_RL(&rl, "%s: ioctl(%s) failed: %s", - netdev_get_name(netdev), cmd_name, strerror(errno)); + VLOG_DBG_RL(&rl, "%s: ioctl(%s) failed: %s", name, cmd_name, + strerror(errno)); return errno; } return 0;