net: add mac_pton() for parsing MAC address
Subsystems (3)
PATCH v2 1/1 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.
---
drivers/net/netconsole.c | 20 +++-------------- include/linux/if_ether.h | 1 net/core/netpoll.c | 26 ----------------------- net/core/pktgen.c | 53 +++++++---------------------------------------- net/core/utils.c | 24 +++++++++++++++++++++ 5 files changed, 38 insertions(+), 86 deletions(-)
drivers/net/netconsole.c +4 -16
@@ -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 ; }/*
include/linux/if_ether.h +1 -0
@@ -136,6 +136,7 @@ int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr);extern struct ctl_table ether_table[];#endif +int mac_pton (const char *s,u8 *mac);extern ssize_t sysfs_format_mac (char *buf,const unsigned char *addr,int len);#endif
net/core/netpoll.c +1 -25
@@ -698,32 +698,8 @@ int netpoll_parse_options(struct netpoll *np, char *opt)if (*cur !=0 ) {/* MAC address */ -if ((delim =strchr (cur,':' )) ==NULL ) +if (!mac_pton (cur, np->remote_mac)) goto parse_failed; - *delim =0 ; - np->remote_mac[0 ] =simple_strtol (cur,NULL ,16 ); - cur = delim +1 ; -if ((delim =strchr (cur,':' )) ==NULL ) - goto parse_failed; - *delim =0 ; - np->remote_mac[1 ] =simple_strtol (cur,NULL ,16 ); - cur = delim +1 ; -if ((delim =strchr (cur,':' )) ==NULL ) - goto parse_failed; - *delim =0 ; - np->remote_mac[2 ] =simple_strtol (cur,NULL ,16 ); - cur = delim +1 ; -if ((delim =strchr (cur,':' )) ==NULL ) - goto parse_failed; - *delim =0 ; - np->remote_mac[3 ] =simple_strtol (cur,NULL ,16 ); - cur = delim +1 ; -if ((delim =strchr (cur,':' )) ==NULL ) - goto parse_failed; - *delim =0 ; - np->remote_mac[4 ] =simple_strtol (cur,NULL ,16 ); - cur = delim +1 ; - np->remote_mac[5 ] =simple_strtol (cur,NULL ,16 ); }netpoll_print_options (np);
net/core/pktgen.c +8 -45
80 lines not on this page · raw message
net/core/utils.c +24 -0
@@ -296,3 +296,27 @@ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb, csum_unfold(*sum))); }EXPORT_SYMBOL (inet_proto_csum_replace4); + +int mac_pton (const char *s,u8 *mac) +{ +int i; + +/* XX:XX:XX:XX:XX:XX */ +if (strlen (s) <3 *ETH_ALEN -1 ) +return 0 ; + +/* Don't dirty result unless string is valid MAC. */ +for (i =0 ; i <ETH_ALEN ; i++) { +if (!strchr ("0123456789abcdefABCDEF" , s[i *3 ])) +return 0 ; +if (!strchr ("0123456789abcdefABCDEF" , s[i *3 +1 ])) +return 0 ; +if (i !=ETH_ALEN -1 && s[i *3 +2 ] !=':' ) +return 0 ; + } +for (i =0 ; i <ETH_ALEN ; i++) { + mac[i] = (hex_to_bin (s[i *3 ]) <<4 ) |hex_to_bin (s[i *3 +1 ]); + } +return 1 ; +} +EXPORT_SYMBOL (mac_pton);
From: Alexey Dobriyan <[email protected]>
Date: Sun, 8 May 2011 12:00:07 +0300
Quoted 10 lines
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:
Quoted 8 lines
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 <[email protected]>
Applied.