[ipoib] Mask out non-QPN bits in the IPoIB destination MAC when sending
[people/cooldavid/gpxe.git] / src / include / gpxe / ipoib.h
1 #ifndef _GPXE_IPOIB_H
2 #define _GPXE_IPOIB_H
3
4 /** @file
5  *
6  * IP over Infiniband
7  */
8
9 FILE_LICENCE ( GPL2_OR_LATER );
10
11 #include <gpxe/infiniband.h>
12
13 /** IPoIB MAC address length */
14 #define IPOIB_ALEN 20
15
16 /** An IPoIB MAC address */
17 struct ipoib_mac {
18         /** Queue pair number
19          *
20          * MSB indicates support for IPoIB "connected mode".  Lower 24
21          * bits are the QPN.
22          */
23         uint32_t flags__qpn;
24         /** Port GID */
25         struct ib_gid gid;
26 } __attribute__ (( packed ));
27
28 /** IPoIB link-layer header length */
29 #define IPOIB_HLEN 4
30
31 /** IPoIB link-layer header */
32 struct ipoib_hdr {
33         /** Network-layer protocol */
34         uint16_t proto;
35         /** Reserved, must be zero */
36         union {
37                 /** Reserved, must be zero */
38                 uint16_t reserved;
39                 /** Peer addresses
40                  *
41                  * We use these fields internally to represent the
42                  * peer addresses using a lookup key.  There simply
43                  * isn't enough room in the IPoIB header to store
44                  * literal source or destination MAC addresses.
45                  */
46                 struct {
47                         /** Destination address key */
48                         uint8_t dest;
49                         /** Source address key */
50                         uint8_t src;
51                 } __attribute__ (( packed )) peer;
52         } __attribute__ (( packed )) u;
53 } __attribute__ (( packed ));
54
55 extern const char * ipoib_ntoa ( const void *ll_addr );
56 extern void ipoib_link_state_changed ( struct ib_device *ibdev );
57 extern int ipoib_probe ( struct ib_device *ibdev );
58 extern void ipoib_remove ( struct ib_device *ibdev );
59 extern struct net_device * alloc_ipoibdev ( size_t priv_size );
60
61 #endif /* _GPXE_IPOIB_H */