X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fnetdev-linux.c;h=02d8a4d9aa2241a76b0bfcef741a306c10c44d23;hb=6d6ab93e9dcd91119ea9a1a843c1bb35e6754706;hp=1428ce6617fc76647ae60d4b105e1a3aa1966a56;hpb=f915f1a8ca180828983ef22cf2fd21b8f010b972;p=openvswitch diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 1428ce66..02d8a4d9 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -563,7 +563,7 @@ netdev_linux_create_tap(const struct netdev_class *class OVS_UNUSED, /* Create tap device. */ ifr.ifr_flags = IFF_TAP | IFF_NO_PI; - strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); + ovs_strzcpy(ifr.ifr_name, name, sizeof ifr.ifr_name); if (ioctl(state->fd, TUNSETIFF, &ifr) == -1) { VLOG_WARN("%s: creating tap device failed: %s", name, strerror(errno)); @@ -1924,7 +1924,7 @@ do_set_addr(struct netdev *netdev, int ioctl_nr, const char *ioctl_name, struct in_addr addr) { struct ifreq ifr; - strncpy(ifr.ifr_name, netdev_get_name(netdev), sizeof ifr.ifr_name); + ovs_strzcpy(ifr.ifr_name, netdev_get_name(netdev), sizeof ifr.ifr_name); make_in4_sockaddr(&ifr.ifr_addr, addr); return netdev_linux_do_ioctl(netdev_get_name(netdev), &ifr, ioctl_nr, @@ -2045,13 +2045,14 @@ netdev_linux_arp_lookup(const struct netdev *netdev, int retval; memset(&r, 0, sizeof r); + memset(&sin, 0, sizeof sin); sin.sin_family = AF_INET; sin.sin_addr.s_addr = ip; sin.sin_port = 0; memcpy(&r.arp_pa, &sin, sizeof sin); r.arp_ha.sa_family = ARPHRD_ETHER; r.arp_flags = 0; - strncpy(r.arp_dev, netdev_get_name(netdev), sizeof r.arp_dev); + ovs_strzcpy(r.arp_dev, netdev_get_name(netdev), sizeof r.arp_dev); COVERAGE_INC(netdev_arp_lookup); retval = ioctl(af_inet_sock, SIOCGARP, &r) < 0 ? errno : 0; if (!retval) { @@ -2496,13 +2497,10 @@ htb_parse_class_details__(struct netdev *netdev, return EINVAL; } - /* min-rate. Don't allow a min-rate below 1500 bytes/s. */ - if (!min_rate_s) { - /* min-rate is required. */ - return EINVAL; - } - hc->min_rate = strtoull(min_rate_s, NULL, 10) / 8; - hc->min_rate = MAX(hc->min_rate, 1500); + /* HTB requires at least an mtu sized min-rate to send any traffic even + * on uncongested links. */ + hc->min_rate = min_rate_s ? strtoull(min_rate_s, NULL, 10) / 8 : 0; + hc->min_rate = MAX(hc->min_rate, mtu); hc->min_rate = MIN(hc->min_rate, htb->max_rate); /* max-rate */ @@ -2976,12 +2974,8 @@ hfsc_parse_class_details__(struct netdev *netdev, min_rate_s = shash_find_data(details, "min-rate"); max_rate_s = shash_find_data(details, "max-rate"); - if (!min_rate_s) { - return EINVAL; - } - - min_rate = strtoull(min_rate_s, NULL, 10) / 8; - min_rate = MAX(min_rate, 1500); + min_rate = min_rate_s ? strtoull(min_rate_s, NULL, 10) / 8 : 0; + min_rate = MAX(min_rate, 1); min_rate = MIN(min_rate, hfsc->max_rate); max_rate = (max_rate_s @@ -4054,7 +4048,7 @@ do_get_ifindex(const char *netdev_name) { struct ifreq ifr; - strncpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name); + ovs_strzcpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name); COVERAGE_INC(netdev_get_ifindex); if (ioctl(af_inet_sock, SIOCGIFINDEX, &ifr) < 0) { VLOG_WARN_RL(&rl, "ioctl(SIOCGIFINDEX) on %s device failed: %s", @@ -4089,7 +4083,7 @@ get_etheraddr(const char *netdev_name, uint8_t ea[ETH_ADDR_LEN]) int hwaddr_family; memset(&ifr, 0, sizeof ifr); - strncpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name); + ovs_strzcpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name); COVERAGE_INC(netdev_get_hwaddr); if (ioctl(af_inet_sock, SIOCGIFHWADDR, &ifr) < 0) { VLOG_ERR("ioctl(SIOCGIFHWADDR) on %s device failed: %s", @@ -4112,7 +4106,7 @@ set_etheraddr(const char *netdev_name, int hwaddr_family, struct ifreq ifr; memset(&ifr, 0, sizeof ifr); - strncpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name); + ovs_strzcpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name); ifr.ifr_hwaddr.sa_family = hwaddr_family; memcpy(ifr.ifr_hwaddr.sa_data, mac, ETH_ADDR_LEN); COVERAGE_INC(netdev_set_hwaddr); @@ -4131,7 +4125,7 @@ netdev_linux_do_ethtool(const char *name, struct ethtool_cmd *ecmd, struct ifreq ifr; memset(&ifr, 0, sizeof ifr); - strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); + ovs_strzcpy(ifr.ifr_name, name, sizeof ifr.ifr_name); ifr.ifr_data = (caddr_t) ecmd; ecmd->cmd = cmd; @@ -4154,7 +4148,7 @@ static int netdev_linux_do_ioctl(const char *name, struct ifreq *ifr, int cmd, const char *cmd_name) { - strncpy(ifr->ifr_name, name, sizeof ifr->ifr_name); + ovs_strzcpy(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", name, cmd_name, strerror(errno));