X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fnetdev-bsd.c;h=8b384ba3d1263f75cfa76a91f0e6880efa911a5a;hb=c68cc3ef3fa0ee3ade3c86035e5c3d7eb066a605;hp=9094d0477221724ebbea7bd10e81adc51e79c015;hpb=275707c33f8f5463154bc3e2f561181a2060ab57;p=sliver-openvswitch.git diff --git a/lib/netdev-bsd.c b/lib/netdev-bsd.c index 9094d0477..8b384ba3d 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); } @@ -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; } } @@ -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,7 +1090,7 @@ 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, + error = netdev_bsd_do_ioctl(netdev_get_name(netdev_), &ifr, SIOCGIFADDR, "SIOCGIFADDR"); if (error) { return error; @@ -1097,7 +1099,7 @@ 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, + error = netdev_bsd_do_ioctl(netdev_get_name(netdev_), &ifr, SIOCGIFNETMASK, "SIOCGIFNETMASK"); if (error) { return error; @@ -1220,19 +1222,21 @@ iff_to_nd_flags(int iff) } static int -netdev_bsd_update_flags(struct netdev *netdev, enum netdev_flags off, +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; @@ -1255,6 +1259,7 @@ const struct netdev_class netdev_bsd_class = { netdev_bsd_destroy, NULL, /* get_config */ NULL, /* set_config */ + NULL, /* get_tunnel_config */ netdev_bsd_open_system, netdev_bsd_close, @@ -1315,6 +1320,7 @@ const struct netdev_class netdev_tap_class = { netdev_bsd_destroy, NULL, /* get_config */ NULL, /* set_config */ + NULL, /* get_tunnel_config */ netdev_bsd_open_system, netdev_bsd_close, @@ -1378,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; @@ -1392,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 @@ -1471,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;