f8231db0818dc8891fcc646120b178a8b98e8307
[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 must be zero; QPNs are only 24-bit.
21          */
22         uint32_t qpn;
23         /** Port GID */
24         struct ib_gid gid;
25 } __attribute__ (( packed ));
26
27 /** IPoIB link-layer header length */
28 #define IPOIB_HLEN 4
29
30 /** IPoIB link-layer header */
31 struct ipoib_hdr {
32         /** Network-layer protocol */
33         uint16_t proto;
34         /** Reserved, must be zero */
35         union {
36                 /** Reserved, must be zero */
37                 uint16_t reserved;
38                 /** Peer addresses
39                  *
40                  * We use these fields internally to represent the
41                  * peer addresses using a lookup key.  There simply
42                  * isn't enough room in the IPoIB header to store
43                  * literal source or destination MAC addresses.
44                  */
45                 struct {
46                         /** Destination address key */
47                         uint8_t dest;
48                         /** Source address key */
49                         uint8_t src;
50                 } __attribute__ (( packed )) peer;
51         } __attribute__ (( packed )) u;
52 } __attribute__ (( packed ));
53
54 extern const char * ipoib_ntoa ( const void *ll_addr );
55 extern void ipoib_link_state_changed ( struct ib_device *ibdev );
56 extern int ipoib_probe ( struct ib_device *ibdev );
57 extern void ipoib_remove ( struct ib_device *ibdev );
58 extern struct net_device * alloc_ipoibdev ( size_t priv_size );
59
60 #endif /* _GPXE_IPOIB_H */