[Infiniband] Add preliminary multiple port support for Hermon cards
[people/sha0/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 #include <gpxe/infiniband.h>
10
11 /** IPoIB MAC address length */
12 #define IPOIB_ALEN 20
13
14 /** An IPoIB MAC address */
15 struct ipoib_mac {
16         /** Queue pair number
17          *
18          * MSB must be zero; QPNs are only 24-bit.
19          */
20         uint32_t qpn;
21         /** Port GID */
22         struct ib_gid gid;
23 } __attribute__ (( packed ));
24
25 /** IPoIB link-layer header length */
26 #define IPOIB_HLEN 24
27
28 /**
29  * IPoIB link-layer header pseudo portion
30  *
31  * This part doesn't actually exist on the wire, but it provides a
32  * convenient way to fit into the typical network device model.
33  */
34 struct ipoib_pseudo_hdr {
35         /** Peer address */
36         struct ipoib_mac peer;
37 } __attribute__ (( packed ));
38
39 /** IPoIB link-layer header real portion */
40 struct ipoib_real_hdr {
41         /** Network-layer protocol */
42         uint16_t proto;
43         /** Reserved, must be zero */
44         uint16_t reserved;
45 } __attribute__ (( packed ));
46
47 /** An IPoIB link-layer header */
48 struct ipoib_hdr {
49         /** Pseudo portion */
50         struct ipoib_pseudo_hdr pseudo;
51         /** Real portion */
52         struct ipoib_real_hdr real;
53 } __attribute__ (( packed ));
54
55 extern struct ll_protocol ipoib_protocol;
56
57 extern const char * ipoib_ntoa ( const void *ll_addr );
58
59 /**
60  * Allocate IPoIB device
61  *
62  * @v priv_size         Size of driver private data
63  * @ret netdev          Network device, or NULL
64  */
65 static inline struct net_device * alloc_ipoibdev ( size_t priv_size ) {
66         struct net_device *netdev;
67
68         netdev = alloc_netdev ( priv_size );
69         if ( netdev ) {
70                 netdev->ll_protocol = &ipoib_protocol;
71         }
72         return netdev;
73 }
74
75 extern void ipoib_link_state_changed ( struct ib_device *ibdev );
76 extern int ipoib_probe ( struct ib_device *ibdev );
77 extern void ipoib_remove ( struct ib_device *ibdev );
78
79 #endif /* _GPXE_IPOIB_H */