diff options
author | Alexey Dobriyan <adobriyan@gmail.com> | 2011-05-07 19:00:07 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-05-09 15:10:49 -0400 |
commit | 4940fc889e1e63667a15243028ddcd84d471cd8e (patch) | |
tree | c52bb193d0ad4f13e0f617748ed1db297261f521 /drivers/net/netconsole.c | |
parent | 99f823f98fb981b55c663a3783c3d2293958ece4 (diff) |
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 62fdbaa1fb60..a83e101440fd 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, | |||
429 | size_t count) | 429 | size_t count) |
430 | { | 430 | { |
431 | u8 remote_mac[ETH_ALEN]; | 431 | u8 remote_mac[ETH_ALEN]; |
432 | char *p = (char *) buf; | ||
433 | int i; | ||
434 | 432 | ||
435 | if (nt->enabled) { | 433 | if (nt->enabled) { |
436 | printk(KERN_ERR "netconsole: target (%s) is enabled, " | 434 | printk(KERN_ERR "netconsole: target (%s) is enabled, " |
@@ -439,23 +437,13 @@ static ssize_t store_remote_mac(struct netconsole_target *nt, | |||
439 | return -EINVAL; | 437 | return -EINVAL; |
440 | } | 438 | } |
441 | 439 | ||
442 | for (i = 0; i < ETH_ALEN - 1; i++) { | 440 | if (!mac_pton(buf, remote_mac)) |
443 | remote_mac[i] = simple_strtoul(p, &p, 16); | 441 | return -EINVAL; |
444 | if (*p != ':') | 442 | if (buf[3 * ETH_ALEN - 1] && buf[3 * ETH_ALEN - 1] != '\n') |
445 | goto invalid; | 443 | return -EINVAL; |
446 | p++; | ||
447 | } | ||
448 | remote_mac[ETH_ALEN - 1] = simple_strtoul(p, &p, 16); | ||
449 | if (*p && (*p != '\n')) | ||
450 | goto invalid; | ||
451 | |||
452 | memcpy(nt->np.remote_mac, remote_mac, ETH_ALEN); | 444 | memcpy(nt->np.remote_mac, remote_mac, ETH_ALEN); |
453 | 445 | ||
454 | return strnlen(buf, count); | 446 | return strnlen(buf, count); |
455 | |||
456 | invalid: | ||
457 | printk(KERN_ERR "netconsole: invalid input\n"); | ||
458 | return -EINVAL; | ||
459 | } | 447 | } |
460 | 448 | ||
461 | /* | 449 | /* |