Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d737ccbe authored by Sven Eckelmann's avatar Sven Eckelmann Committed by Antonio Quartulli
Browse files

batman-adv: Add function to convert string to batadv throughput



The code to convert the throughput information from a string to the
batman-adv internal (100Kibit/s) representation is duplicated in
batadv_parse_gw_bandwidth. Move this functionality to its own function
batadv_parse_throughput to reduce the code complexity.

Signed-off-by: default avatarSven Eckelmann <sven@open-mesh.com>
Signed-off-by: default avatarMarek Lindner <mareklindner@neomailbox.ch>
Signed-off-by: default avatarAntonio Quartulli <a@unstable.cc>
parent 9e728e84
Loading
Loading
Loading
Loading
+49 −68
Original line number Diff line number Diff line
@@ -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, &lthroughput);
	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);

			if (strncasecmp(tmp_ptr, "mbit", 4) == 0)
				bw_unit_type = BATADV_BW_UNIT_MBIT;

			if ((strncasecmp(tmp_ptr, "kbit", 4) == 0) ||
			    (bw_unit_type == BATADV_BW_UNIT_MBIT))
				*tmp_ptr = '\0';
		}
	*throughput = lthroughput;

		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;
	return true;
}

		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;
			}
/**
 * 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;

			lup *= 10;
			break;
		case BATADV_BW_UNIT_KBIT:
		default:
			lup = div_u64(lup, 100);
			break;
		}
	slash_ptr = strchr(buff, '/');
	if (slash_ptr)
		*slash_ptr = 0;

		if (U32_MAX < lup) {
			batadv_err(net_dev,
				   "Upload speed of gateway mode too large: %s\n",
				   slash_ptr + 1);
	ret = batadv_parse_throughput(net_dev, buff, "download gateway speed",
				      down);
	if (!ret)
		return false;
		}

		*up = lup;
	/* 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;
	}

	return true;