123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- #ifndef _IPXE_ETHERNET_H
- #define _IPXE_ETHERNET_H
-
- /** @file
- *
- * Ethernet protocol
- *
- */
-
- FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
-
- #include <stdint.h>
- #include <ipxe/netdevice.h>
- #include <ipxe/iobuf.h>
-
- /**
- * 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 uint8_t eth_broadcast[];
- extern struct ll_protocol ethernet_protocol __ll_protocol;
-
- extern int eth_push ( struct net_device *netdev, struct io_buffer *iobuf,
- const void *ll_dest, const void *ll_source,
- uint16_t net_proto );
- extern int eth_pull ( struct net_device *netdev, struct io_buffer *iobuf,
- const void **ll_dest, const void **ll_source,
- uint16_t *net_proto, unsigned int *flags );
- extern void eth_init_addr ( const void *hw_addr, void *ll_addr );
- extern void eth_random_addr ( void *hw_addr );
- extern const char * eth_ntoa ( const void *ll_addr );
- extern int eth_mc_hash ( unsigned int af, const void *net_addr,
- void *ll_addr );
- extern int eth_eth_addr ( const void *ll_addr, void *eth_addr );
- extern int eth_eui64 ( const void *ll_addr, void *eui64 );
- extern struct net_device * alloc_etherdev ( size_t priv_size );
-
- #endif /* _IPXE_ETHERNET_H */
|