Can now both send and receive packets. LL header format not yet
[people/xl0/gpxe.git] / src / include / gpxe / infiniband.h
1 #ifndef _GPXE_INFINIBAND_H
2 #define _GPXE_INFINIBAND_H
3
4 /** @file
5  *
6  * Infiniband protocol
7  *
8  */
9
10 #include <stdint.h>
11 #include <gpxe/netdevice.h>
12
13 /** Infiniband hardware address length */
14 #define IB_ALEN 20
15 #define IB_HLEN 24
16
17 /** An Infiniband Global Identifier */
18 struct ib_gid {
19         uint8_t bytes[16];
20 };
21
22 /** An Infiniband Global Route Header */
23 struct ib_global_route_header {
24         /** IP version, traffic class, and flow label
25          *
26          *  4 bits : Version of the GRH
27          *  8 bits : Traffic class
28          * 20 bits : Flow label
29          */
30         uint32_t ipver_tclass_flowlabel;
31         /** Payload length */
32         uint16_t paylen;
33         /** Next header */
34         uint8_t nxthdr;
35         /** Hop limit */
36         uint8_t hoplmt;
37         /** Source GID */
38         struct ib_gid sgid;
39         /** Destiniation GID */
40         struct ib_gid dgid;
41 } __attribute__ (( packed ));
42
43 /** An Infiniband MAC address */
44 struct ib_mac {
45         /** Queue pair number
46          *
47          * MSB must be zero; QPNs are only 24-bit.
48          */
49         uint32_t qpn;
50         /** Port GID */
51         struct ib_gid gid;
52 } __attribute__ (( packed ));
53
54 /** An Infiniband header
55  *
56  * This data structure doesn't represent the on-wire format, but does
57  * contain all the information required by the driver to construct the
58  * packet.
59  */
60 struct ibhdr {
61         /** Peer address */
62         uint8_t peer[IB_ALEN];
63         /** Network-layer protocol */
64         uint16_t proto;
65         /** Reserved, must be zero */
66         uint16_t reserved;
67 } __attribute__ (( packed ));
68
69 extern struct ll_protocol infiniband_protocol;
70
71 extern const char * ib_ntoa ( const void *ll_addr );
72
73 /**
74  * Allocate Infiniband device
75  *
76  * @v priv_size         Size of driver private data
77  * @ret netdev          Network device, or NULL
78  */
79 static inline struct net_device * alloc_ibdev ( size_t priv_size ) {
80         struct net_device *netdev;
81
82         netdev = alloc_netdev ( priv_size );
83         if ( netdev ) {
84                 netdev->ll_protocol = &infiniband_protocol;
85         }
86         return netdev;
87 }
88
89 #endif /* _GPXE_INFINIBAND_H */