ssize_t batadv_gw_bandwidth_set(struct net_device *net_dev, char *buff, size_t count) { struct batadv_priv *bat_priv = netdev_priv(net_dev); long gw_bandwidth_tmp = 0; int up = 0, down = 0; bool ret; ret = batadv_parse_gw_bandwidth(net_dev, buff, &up, &down); if (!ret) goto end; if ((!down) || (down < 256)) down = 2000; if (!up) up = down / 5; batadv_kbit_to_gw_bandwidth(down, up, &gw_bandwidth_tmp); /* the gw bandwidth we guessed above might not match the given * speeds, hence we need to calculate it back to show the number * that is going to be propagated */ batadv_gw_bandwidth_to_kbit((uint8_t)gw_bandwidth_tmp, &down, &up); if (atomic_read(&bat_priv->gw_bandwidth) == gw_bandwidth_tmp) return count; batadv_gw_deselect(bat_priv); batadv_info(net_dev, "Changing gateway bandwidth from: '%i' to: '%ld' (propagating: %d%s/%d%s)\n", atomic_read(&bat_priv->gw_bandwidth), gw_bandwidth_tmp, (down > 2048 ? down / 1024 : down), (down > 2048 ? "MBit" : "KBit"), (up > 2048 ? up / 1024 : up), (up > 2048 ? "MBit" : "KBit")); atomic_set(&bat_priv->gw_bandwidth, gw_bandwidth_tmp); end: return count; }
/** * batadv_gw_bandwidth_set() - Parse and set download/upload gateway bandwidth * from supplied string buffer * @net_dev: netdev struct of the soft interface * @buff: the buffer containing the user data * @count: number of bytes in the buffer * * Return: 'count' on success or a negative error code in case of failure */ ssize_t batadv_gw_bandwidth_set(struct net_device *net_dev, char *buff, size_t count) { struct batadv_priv *bat_priv = netdev_priv(net_dev); u32 down_curr; u32 up_curr; u32 down_new = 0; u32 up_new = 0; bool ret; down_curr = (unsigned int)atomic_read(&bat_priv->gw.bandwidth_down); up_curr = (unsigned int)atomic_read(&bat_priv->gw.bandwidth_up); ret = batadv_parse_gw_bandwidth(net_dev, buff, &down_new, &up_new); if (!ret) return -EINVAL; if (!down_new) down_new = 1; if (!up_new) up_new = down_new / 5; if (!up_new) up_new = 1; if (down_curr == down_new && up_curr == up_new) return count; batadv_gw_reselect(bat_priv); batadv_info(net_dev, "Changing gateway bandwidth from: '%u.%u/%u.%u MBit' to: '%u.%u/%u.%u MBit'\n", down_curr / 10, down_curr % 10, up_curr / 10, up_curr % 10, down_new / 10, down_new % 10, up_new / 10, up_new % 10); atomic_set(&bat_priv->gw.bandwidth_down, down_new); atomic_set(&bat_priv->gw.bandwidth_up, up_new); batadv_gw_tvlv_container_update(bat_priv); return count; }