From 75333f464e9f7c810a9c756b0553a02dbcb39d57 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Fri, 4 Jun 2010 22:24:45 +0300 Subject: [PATCH] [ethernet] Move Ethernet MAC address checking routines to ethernet.h Originally-fixed-by: Faur Andrei Signed-off-by: Michael Brown --- src/drivers/net/vxge/vxge_config.c | 1 + src/drivers/net/vxge/vxge_main.h | 16 -------- src/include/ipxe/ethernet.h | 66 ++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 16 deletions(-) diff --git a/src/drivers/net/vxge/vxge_config.c b/src/drivers/net/vxge/vxge_config.c index 76dbfd67..bfcd533b 100644 --- a/src/drivers/net/vxge/vxge_config.c +++ b/src/drivers/net/vxge/vxge_config.c @@ -18,6 +18,7 @@ FILE_LICENCE(GPL2_ONLY); #include #include #include +#include #include #include "vxge_traffic.h" diff --git a/src/drivers/net/vxge/vxge_main.h b/src/drivers/net/vxge/vxge_main.h index fc08ac64..550dcefd 100644 --- a/src/drivers/net/vxge/vxge_main.h +++ b/src/drivers/net/vxge/vxge_main.h @@ -211,22 +211,6 @@ struct vxgedev { char fw_version[VXGE_HW_FW_STRLEN]; }; -static inline int is_zero_ether_addr(const u8 *addr) -{ - return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]); -} - -static inline int is_multicast_ether_addr(const u8 *addr) -{ - return (0x01 & addr[0]); -} - -/* checks the ethernet address @addr is a valid unicast */ -static inline int is_valid_ether_addr(const u8 *addr) -{ - return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr); -} - void vxge_vpath_intr_enable(struct vxgedev *vdev, int vp_id); void vxge_vpath_intr_disable(struct vxgedev *vdev, int vp_id); diff --git a/src/include/ipxe/ethernet.h b/src/include/ipxe/ethernet.h index 5799092a..7e49655a 100644 --- a/src/include/ipxe/ethernet.h +++ b/src/include/ipxe/ethernet.h @@ -11,6 +11,72 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include +/** + * Check if Ethernet address is all zeroes + * + * @v addr Ethernet address + * @ret is_zero Address is all zeroes + */ +static inline int is_zero_ether_addr ( const void *addr ) { + const uint8_t *addr_bytes = addr; + + return ( ! ( addr_bytes[0] | addr_bytes[1] | addr_bytes[2] | + addr_bytes[3] | addr_bytes[4] | addr_bytes[5] ) ); +} + +/** + * Check if Ethernet address is a multicast address + * + * @v addr Ethernet address + * @ret is_mcast Address is a multicast address + * + * Note that the broadcast address is also a multicast address. + */ +static inline int is_multicast_ether_addr ( const void *addr ) { + const uint8_t *addr_bytes = addr; + + return ( addr_bytes[0] & 0x01 ); +} + +/** + * Check if Ethernet address is locally assigned + * + * @v addr Ethernet address + * @ret is_local Address is locally assigned + */ +static inline int is_local_ether_addr ( const void *addr ) { + const uint8_t *addr_bytes = addr; + + return ( addr_bytes[0] & 0x02 ); +} + +/** + * Check if Ethernet address is the broadcast address + * + * @v addr Ethernet address + * @ret is_bcast Address is the broadcast address + */ +static inline int is_broadcast_ether_addr ( const void *addr ) { + const uint8_t *addr_bytes = addr; + + return ( ( addr_bytes[0] & addr_bytes[1] & addr_bytes[2] & + addr_bytes[3] & addr_bytes[4] & addr_bytes[5] ) == 0xff ); +} + +/** + * Check if Ethernet address is valid + * + * @v addr Ethernet address + * @ret is_valid Address is valid + * + * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is + * not a multicast address, and is not ff:ff:ff:ff:ff:ff. + */ +static inline int is_valid_ether_addr ( const void *addr ) { + return ( ( ! is_multicast_ether_addr ( addr ) ) && + ( ! is_zero_ether_addr ( addr ) ) ); +} + extern void eth_init_addr ( const void *hw_addr, void *ll_addr ); extern const char * eth_ntoa ( const void *ll_addr ); extern int eth_mc_hash ( unsigned int af, const void *net_addr,