blob: 148fc6e99ef63b351977bda6a3b4835e9d24083f [file] [log] [blame]
Andy Shevchenko4cd57732013-06-04 19:46:26 +03001#include <linux/string.h>
2#include <linux/if_ether.h>
3#include <linux/ctype.h>
4#include <linux/kernel.h>
5
Joe Perchesa69f5ed2014-06-24 11:20:48 -07006bool mac_pton(const char *s, u8 *mac)
Andy Shevchenko4cd57732013-06-04 19:46:26 +03007{
8 int i;
9
10 /* XX:XX:XX:XX:XX:XX */
11 if (strlen(s) < 3 * ETH_ALEN - 1)
Joe Perchesa69f5ed2014-06-24 11:20:48 -070012 return false;
Andy Shevchenko4cd57732013-06-04 19:46:26 +030013
14 /* Don't dirty result unless string is valid MAC. */
15 for (i = 0; i < ETH_ALEN; i++) {
16 if (!isxdigit(s[i * 3]) || !isxdigit(s[i * 3 + 1]))
Joe Perchesa69f5ed2014-06-24 11:20:48 -070017 return false;
Andy Shevchenko4cd57732013-06-04 19:46:26 +030018 if (i != ETH_ALEN - 1 && s[i * 3 + 2] != ':')
Joe Perchesa69f5ed2014-06-24 11:20:48 -070019 return false;
Andy Shevchenko4cd57732013-06-04 19:46:26 +030020 }
21 for (i = 0; i < ETH_ALEN; i++) {
22 mac[i] = (hex_to_bin(s[i * 3]) << 4) | hex_to_bin(s[i * 3 + 1]);
23 }
Joe Perchesa69f5ed2014-06-24 11:20:48 -070024 return true;
Andy Shevchenko4cd57732013-06-04 19:46:26 +030025}
26EXPORT_SYMBOL(mac_pton);