diff options
| author | Alexey Dobriyan <adobriyan@gmail.com> | 2011-05-07 23:00:07 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-05-09 12:10:49 -0700 | 
| commit | 4940fc889e1e63667a15243028ddcd84d471cd8e (patch) | |
| tree | c52bb193d0ad4f13e0f617748ed1db297261f521 /drivers/net/netconsole.c | |
| parent | 99f823f98fb981b55c663a3783c3d2293958ece4 (diff) | |
| download | olio-linux-3.10-4940fc889e1e63667a15243028ddcd84d471cd8e.tar.xz olio-linux-3.10-4940fc889e1e63667a15243028ddcd84d471cd8e.zip  | |
net: add mac_pton() for parsing MAC address
mac_pton() parses MAC address in form XX:XX:XX:XX:XX:XX and only in that form.
mac_pton() doesn't dirty result until it's sure string representation is valid.
mac_pton() doesn't care about characters _after_ last octet,
it's up to caller to deal with it.
mac_pton() diverges from 0/-E return value convention.
Target usage:
	if (!mac_pton(str, whatever->mac))
		return -EINVAL;
	/* ->mac being u8 [ETH_ALEN] is filled at this point. */
	/* optionally check str[3 * ETH_ALEN - 1] for termination */
Use mac_pton() in pktgen and netconsole for start.
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/netconsole.c')
| -rw-r--r-- | drivers/net/netconsole.c | 20 | 
1 files changed, 4 insertions, 16 deletions
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 62fdbaa1fb6..a83e101440f 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -429,8 +429,6 @@ static ssize_t store_remote_mac(struct netconsole_target *nt,  				size_t count)  {  	u8 remote_mac[ETH_ALEN]; -	char *p = (char *) buf; -	int i;  	if (nt->enabled) {  		printk(KERN_ERR "netconsole: target (%s) is enabled, " @@ -439,23 +437,13 @@ static ssize_t store_remote_mac(struct netconsole_target *nt,  		return -EINVAL;  	} -	for (i = 0; i < ETH_ALEN - 1; i++) { -		remote_mac[i] = simple_strtoul(p, &p, 16); -		if (*p != ':') -			goto invalid; -		p++; -	} -	remote_mac[ETH_ALEN - 1] = simple_strtoul(p, &p, 16); -	if (*p && (*p != '\n')) -		goto invalid; - +	if (!mac_pton(buf, remote_mac)) +		return -EINVAL; +	if (buf[3 * ETH_ALEN - 1] && buf[3 * ETH_ALEN - 1] != '\n') +		return -EINVAL;  	memcpy(nt->np.remote_mac, remote_mac, ETH_ALEN);  	return strnlen(buf, count); - -invalid: -	printk(KERN_ERR "netconsole: invalid input\n"); -	return -EINVAL;  }  /*  |