|
@@ -31,27 +31,23 @@
|
|
|
#include "packet.h"
|
|
|
|
|
|
/**
|
|
|
- * batadv_parse_gw_bandwidth - parse supplied string buffer to extract download
|
|
|
- * and upload bandwidth information
|
|
|
+ * batadv_parse_throughput - parse supplied string buffer to extract throughput
|
|
|
+ * information
|
|
|
* @net_dev: the soft interface net device
|
|
|
* @buff: string buffer to parse
|
|
|
- * @down: pointer holding the returned download bandwidth information
|
|
|
- * @up: pointer holding the returned upload bandwidth information
|
|
|
+ * @description: text shown when throughput string cannot be parsed
|
|
|
+ * @throughput: pointer holding the returned throughput information
|
|
|
*
|
|
|
* Returns false on parse error and true otherwise.
|
|
|
*/
|
|
|
-static bool batadv_parse_gw_bandwidth(struct net_device *net_dev, char *buff,
|
|
|
- u32 *down, u32 *up)
|
|
|
+static bool batadv_parse_throughput(struct net_device *net_dev, char *buff,
|
|
|
+ const char *description, u32 *throughput)
|
|
|
{
|
|
|
enum batadv_bandwidth_units bw_unit_type = BATADV_BW_UNIT_KBIT;
|
|
|
- char *slash_ptr, *tmp_ptr;
|
|
|
- u64 ldown, lup;
|
|
|
+ u64 lthroughput;
|
|
|
+ char *tmp_ptr;
|
|
|
int ret;
|
|
|
|
|
|
- slash_ptr = strchr(buff, '/');
|
|
|
- if (slash_ptr)
|
|
|
- *slash_ptr = 0;
|
|
|
-
|
|
|
if (strlen(buff) > 4) {
|
|
|
tmp_ptr = buff + strlen(buff) - 4;
|
|
|
|
|
@@ -63,90 +59,75 @@ static bool batadv_parse_gw_bandwidth(struct net_device *net_dev, char *buff,
|
|
|
*tmp_ptr = '\0';
|
|
|
}
|
|
|
|
|
|
- ret = kstrtou64(buff, 10, &ldown);
|
|
|
+ ret = kstrtou64(buff, 10, <hroughput);
|
|
|
if (ret) {
|
|
|
batadv_err(net_dev,
|
|
|
- "Download speed of gateway mode invalid: %s\n",
|
|
|
- buff);
|
|
|
+ "Invalid throughput speed for %s: %s\n",
|
|
|
+ description, buff);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
switch (bw_unit_type) {
|
|
|
case BATADV_BW_UNIT_MBIT:
|
|
|
/* prevent overflow */
|
|
|
- if (U64_MAX / 10 < ldown) {
|
|
|
+ if (U64_MAX / 10 < lthroughput) {
|
|
|
batadv_err(net_dev,
|
|
|
- "Download speed of gateway mode too large: %s\n",
|
|
|
- buff);
|
|
|
+ "Throughput speed for %s too large: %s\n",
|
|
|
+ description, buff);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- ldown *= 10;
|
|
|
+ lthroughput *= 10;
|
|
|
break;
|
|
|
case BATADV_BW_UNIT_KBIT:
|
|
|
default:
|
|
|
- ldown = div_u64(ldown, 100);
|
|
|
+ lthroughput = div_u64(lthroughput, 100);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- if (U32_MAX < ldown) {
|
|
|
+ if (lthroughput > U32_MAX) {
|
|
|
batadv_err(net_dev,
|
|
|
- "Download speed of gateway mode too large: %s\n",
|
|
|
- buff);
|
|
|
+ "Throughput speed for %s too large: %s\n",
|
|
|
+ description, buff);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- *down = ldown;
|
|
|
-
|
|
|
- /* we also got some upload info */
|
|
|
- if (slash_ptr) {
|
|
|
- bw_unit_type = BATADV_BW_UNIT_KBIT;
|
|
|
-
|
|
|
- if (strlen(slash_ptr + 1) > 4) {
|
|
|
- tmp_ptr = slash_ptr + 1 - 4 + strlen(slash_ptr + 1);
|
|
|
+ *throughput = lthroughput;
|
|
|
|
|
|
- if (strncasecmp(tmp_ptr, "mbit", 4) == 0)
|
|
|
- bw_unit_type = BATADV_BW_UNIT_MBIT;
|
|
|
+ return true;
|
|
|
+}
|
|
|
|
|
|
- if ((strncasecmp(tmp_ptr, "kbit", 4) == 0) ||
|
|
|
- (bw_unit_type == BATADV_BW_UNIT_MBIT))
|
|
|
- *tmp_ptr = '\0';
|
|
|
- }
|
|
|
+/**
|
|
|
+ * batadv_parse_gw_bandwidth - parse supplied string buffer to extract download
|
|
|
+ * and upload bandwidth information
|
|
|
+ * @net_dev: the soft interface net device
|
|
|
+ * @buff: string buffer to parse
|
|
|
+ * @down: pointer holding the returned download bandwidth information
|
|
|
+ * @up: pointer holding the returned upload bandwidth information
|
|
|
+ *
|
|
|
+ * Return: false on parse error and true otherwise.
|
|
|
+ */
|
|
|
+static bool batadv_parse_gw_bandwidth(struct net_device *net_dev, char *buff,
|
|
|
+ u32 *down, u32 *up)
|
|
|
+{
|
|
|
+ char *slash_ptr;
|
|
|
+ bool ret;
|
|
|
|
|
|
- ret = kstrtou64(slash_ptr + 1, 10, &lup);
|
|
|
- if (ret) {
|
|
|
- batadv_err(net_dev,
|
|
|
- "Upload speed of gateway mode invalid: %s\n",
|
|
|
- slash_ptr + 1);
|
|
|
- return false;
|
|
|
- }
|
|
|
+ slash_ptr = strchr(buff, '/');
|
|
|
+ if (slash_ptr)
|
|
|
+ *slash_ptr = 0;
|
|
|
|
|
|
- switch (bw_unit_type) {
|
|
|
- case BATADV_BW_UNIT_MBIT:
|
|
|
- /* prevent overflow */
|
|
|
- if (U64_MAX / 10 < lup) {
|
|
|
- batadv_err(net_dev,
|
|
|
- "Upload speed of gateway mode too large: %s\n",
|
|
|
- slash_ptr + 1);
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- lup *= 10;
|
|
|
- break;
|
|
|
- case BATADV_BW_UNIT_KBIT:
|
|
|
- default:
|
|
|
- lup = div_u64(lup, 100);
|
|
|
- break;
|
|
|
- }
|
|
|
+ ret = batadv_parse_throughput(net_dev, buff, "download gateway speed",
|
|
|
+ down);
|
|
|
+ if (!ret)
|
|
|
+ return false;
|
|
|
|
|
|
- if (U32_MAX < lup) {
|
|
|
- batadv_err(net_dev,
|
|
|
- "Upload speed of gateway mode too large: %s\n",
|
|
|
- slash_ptr + 1);
|
|
|
+ /* we also got some upload info */
|
|
|
+ if (slash_ptr) {
|
|
|
+ ret = batadv_parse_throughput(net_dev, slash_ptr + 1,
|
|
|
+ "upload gateway speed", up);
|
|
|
+ if (!ret)
|
|
|
return false;
|
|
|
- }
|
|
|
-
|
|
|
- *up = lup;
|
|
|
}
|
|
|
|
|
|
return true;
|