summaryrefslogtreecommitdiffstats
path: root/src/include/ipxe/ethernet.h
blob: dd04e00ce091d40a146ef9f431f1dc1803b1268a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#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 */