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