aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netconsole.c
diff options
context:
space:
mode:
authorAlexey Dobriyan <adobriyan@gmail.com>2011-05-07 19:00:07 -0400
committerDavid S. Miller <davem@davemloft.net>2011-05-09 15:10:49 -0400
commit4940fc889e1e63667a15243028ddcd84d471cd8e (patch)
treec52bb193d0ad4f13e0f617748ed1db297261f521 /drivers/net/netconsole.c
parent99f823f98fb981b55c663a3783c3d2293958ece4 (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.c20
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
456invalid:
457 printk(KERN_ERR "netconsole: invalid input\n");
458 return -EINVAL;
459} 447}
460 448
461/* 449/*