xref: /OK3568_Linux_fs/kernel/lib/net_utils.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun #include <linux/string.h>
3*4882a593Smuzhiyun #include <linux/if_ether.h>
4*4882a593Smuzhiyun #include <linux/ctype.h>
5*4882a593Smuzhiyun #include <linux/kernel.h>
6*4882a593Smuzhiyun 
mac_pton(const char * s,u8 * mac)7*4882a593Smuzhiyun bool mac_pton(const char *s, u8 *mac)
8*4882a593Smuzhiyun {
9*4882a593Smuzhiyun 	int i;
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun 	/* XX:XX:XX:XX:XX:XX */
12*4882a593Smuzhiyun 	if (strlen(s) < 3 * ETH_ALEN - 1)
13*4882a593Smuzhiyun 		return false;
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun 	/* Don't dirty result unless string is valid MAC. */
16*4882a593Smuzhiyun 	for (i = 0; i < ETH_ALEN; i++) {
17*4882a593Smuzhiyun 		if (!isxdigit(s[i * 3]) || !isxdigit(s[i * 3 + 1]))
18*4882a593Smuzhiyun 			return false;
19*4882a593Smuzhiyun 		if (i != ETH_ALEN - 1 && s[i * 3 + 2] != ':')
20*4882a593Smuzhiyun 			return false;
21*4882a593Smuzhiyun 	}
22*4882a593Smuzhiyun 	for (i = 0; i < ETH_ALEN; i++) {
23*4882a593Smuzhiyun 		mac[i] = (hex_to_bin(s[i * 3]) << 4) | hex_to_bin(s[i * 3 + 1]);
24*4882a593Smuzhiyun 	}
25*4882a593Smuzhiyun 	return true;
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun EXPORT_SYMBOL(mac_pton);
28