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>
This commit is contained in:
committed by
David S. Miller
parent
99f823f98f
commit
4940fc889e
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user