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 | |
| 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')
| -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 | /* |
