1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 24cd5773aSAndy Shevchenko #include <linux/string.h> 34cd5773aSAndy Shevchenko #include <linux/if_ether.h> 44cd5773aSAndy Shevchenko #include <linux/ctype.h> 5*8d2b2281SAndy Shevchenko #include <linux/export.h> 6*8d2b2281SAndy Shevchenko #include <linux/hex.h> 74cd5773aSAndy Shevchenko mac_pton(const char * s,u8 * mac)8a69f5edbSJoe Perchesbool mac_pton(const char *s, u8 *mac) 94cd5773aSAndy Shevchenko { 1021780f89SAndy Shevchenko size_t maxlen = 3 * ETH_ALEN - 1; 114cd5773aSAndy Shevchenko int i; 124cd5773aSAndy Shevchenko 134cd5773aSAndy Shevchenko /* XX:XX:XX:XX:XX:XX */ 1421780f89SAndy Shevchenko if (strnlen(s, maxlen) < maxlen) 15a69f5edbSJoe Perches return false; 164cd5773aSAndy Shevchenko 174cd5773aSAndy Shevchenko /* Don't dirty result unless string is valid MAC. */ 184cd5773aSAndy Shevchenko for (i = 0; i < ETH_ALEN; i++) { 194cd5773aSAndy Shevchenko if (!isxdigit(s[i * 3]) || !isxdigit(s[i * 3 + 1])) 20a69f5edbSJoe Perches return false; 214cd5773aSAndy Shevchenko if (i != ETH_ALEN - 1 && s[i * 3 + 2] != ':') 22a69f5edbSJoe Perches return false; 234cd5773aSAndy Shevchenko } 244cd5773aSAndy Shevchenko for (i = 0; i < ETH_ALEN; i++) { 254cd5773aSAndy Shevchenko mac[i] = (hex_to_bin(s[i * 3]) << 4) | hex_to_bin(s[i * 3 + 1]); 264cd5773aSAndy Shevchenko } 27a69f5edbSJoe Perches return true; 284cd5773aSAndy Shevchenko } 294cd5773aSAndy Shevchenko EXPORT_SYMBOL(mac_pton); 30