From eaa71334348aa0d99abf5588e17b3e55d0db28ce Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 15 Jul 2009 10:58:30 -0700 Subject: [PATCH] Add macros for parsing MAC addresses from strings. --- lib/cfg.c | 4 ++-- lib/packets.h | 23 +++++++++++++++++++++++ utilities/ovs-ofctl.c | 4 ++-- vswitchd/bridge.c | 4 ++-- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/lib/cfg.c b/lib/cfg.c index 901315ed9..a53e6e380 100644 --- a/lib/cfg.c +++ b/lib/cfg.c @@ -1101,8 +1101,8 @@ find_key(const char *key) static bool parse_mac(const char *s, uint8_t mac[6]) { - return sscanf(s, "%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8, - &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6; + return (sscanf(s, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(mac)) + == ETH_ADDR_SCAN_COUNT); } static bool diff --git a/lib/packets.h b/lib/packets.h index 8ccc73404..d12cc0403 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -98,11 +98,34 @@ static inline bool eth_addr_is_reserved(const uint8_t ea[ETH_ADDR_LEN]) && (ea[5] & 0xf0) == 0x00); } +/* Example: + * + * uint8_t mac[ETH_ADDR_LEN]; + * [...] + * printf("The Ethernet address is "ETH_ADDR_FMT"\n", ETH_ADDR_ARGS(mac)); + * + */ #define ETH_ADDR_FMT \ "%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8 #define ETH_ADDR_ARGS(ea) \ (ea)[0], (ea)[1], (ea)[2], (ea)[3], (ea)[4], (ea)[5] +/* Example: + * + * char *string = "1 00:11:22:33:44:55 2"; + * uint8_t mac[ETH_ADDR_LEN]; + * int a, b; + * + * if (sscanf(string, "%d"ETH_ADDR_SCAN_FMT"%d", + * &a, ETH_ADDR_SCAN_ARGS(mac), &b) == 1 + ETH_ADDR_SCAN_COUNT + 1) { + * ... + * } + */ +#define ETH_ADDR_SCAN_FMT "%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8 +#define ETH_ADDR_SCAN_ARGS(ea) \ + &(ea)[0], &(ea)[1], &(ea)[2], &(ea)[3], &(ea)[4], &(ea)[5] +#define ETH_ADDR_SCAN_COUNT 6 + #define ETH_TYPE_IP 0x0800 #define ETH_TYPE_ARP 0x0806 #define ETH_TYPE_VLAN 0x8100 diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 583e5548b..04a869a2f 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -442,8 +442,8 @@ str_to_u32(const char *str) static void str_to_mac(const char *str, uint8_t mac[6]) { - if (sscanf(str, "%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8, - &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) != 6) { + if (sscanf(str, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(mac)) + != ETH_ADDR_SCAN_COUNT) { ovs_fatal(0, "invalid mac address %s", str); } } diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 224a3e5f7..5d8a5b067 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -2437,8 +2437,8 @@ bond_unixctl_migrate(struct unixctl_conn *conn, const char *args_) return; } - if (sscanf(hash_s, "%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8, - &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) { + if (sscanf(hash_s, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(mac)) + == ETH_ADDR_SCAN_COUNT) { hash = bond_hash(mac); } else if (strspn(hash_s, "0123456789") == strlen(hash_s)) { hash = atoi(hash_s) & BOND_MASK; -- 2.43.0