Home | History | Annotate | Download | only in gpxe
      1 #ifndef _GPXE_IB_PACKET_H
      2 #define _GPXE_IB_PACKET_H
      3 
      4 /** @file
      5  *
      6  * Infiniband packet format
      7  *
      8  */
      9 
     10 FILE_LICENCE ( GPL2_OR_LATER );
     11 
     12 struct ib_device;
     13 struct ib_queue_pair;
     14 struct ib_address_vector;
     15 struct io_buffer;
     16 
     17 /** Half of an Infiniband Global Identifier */
     18 struct ib_gid_half {
     19 	union {
     20 		uint8_t bytes[8];
     21 		uint16_t words[4];
     22 		uint32_t dwords[2];
     23 	} u;
     24 };
     25 
     26 /** An Infiniband Global Identifier */
     27 struct ib_gid {
     28 	union {
     29 		uint8_t bytes[16];
     30 		uint16_t words[8];
     31 		uint32_t dwords[4];
     32 		struct ib_gid_half half[2];
     33 	} u;
     34 };
     35 
     36 /** An Infiniband Local Route Header */
     37 struct ib_local_route_header {
     38 	/** Virtual lane and link version */
     39 	uint8_t vl__lver;
     40 	/** Service level and next link header */
     41 	uint8_t sl__lnh;
     42 	/** Destination LID */
     43 	uint16_t dlid;
     44 	/** Packet length */
     45 	uint16_t length;
     46 	/** Source LID */
     47 	uint16_t slid;
     48 } __attribute__ (( packed ));
     49 
     50 /** Infiniband virtual lanes */
     51 enum ib_vl {
     52 	IB_VL_DEFAULT = 0,
     53 	IB_VL_SMP = 15,
     54 };
     55 
     56 /** An Infiniband Link Next Header value */
     57 enum ib_lnh {
     58 	IB_LNH_RAW = 0,
     59 	IB_LNH_IPv6 = 1,
     60 	IB_LNH_BTH = 2,
     61 	IB_LNH_GRH = 3
     62 };
     63 
     64 /** Default Infiniband LID */
     65 #define IB_LID_NONE 0xffff
     66 
     67 /** Test for multicast LID */
     68 #define IB_LID_MULTICAST( lid ) ( ( (lid) >= 0xc000 ) && ( (lid) <= 0xfffe ) )
     69 
     70 /** An Infiniband Global Route Header */
     71 struct ib_global_route_header {
     72 	/** IP version, traffic class, and flow label
     73 	 *
     74 	 *  4 bits : Version of the GRH
     75 	 *  8 bits : Traffic class
     76 	 * 20 bits : Flow label
     77 	 */
     78 	uint32_t ipver__tclass__flowlabel;
     79 	/** Payload length */
     80 	uint16_t paylen;
     81 	/** Next header */
     82 	uint8_t nxthdr;
     83 	/** Hop limit */
     84 	uint8_t hoplmt;
     85 	/** Source GID */
     86 	struct ib_gid sgid;
     87 	/** Destiniation GID */
     88 	struct ib_gid dgid;
     89 } __attribute__ (( packed ));
     90 
     91 #define IB_GRH_IPVER_IPv6 0x06
     92 #define IB_GRH_NXTHDR_IBA 0x1b
     93 
     94 /** An Infiniband Base Transport Header */
     95 struct ib_base_transport_header {
     96 	/** Opcode */
     97 	uint8_t opcode;
     98 	/** Transport header version, pad count, migration and solicitation */
     99 	uint8_t se__m__padcnt__tver;
    100 	/** Partition key */
    101 	uint16_t pkey;
    102 	/** Destination queue pair */
    103 	uint32_t dest_qp;
    104 	/** Packet sequence number and acknowledge request */
    105 	uint32_t ack__psn;
    106 } __attribute__ (( packed ));
    107 
    108 /** An Infiniband BTH opcode */
    109 enum ib_bth_opcode {
    110 	BTH_OPCODE_UD_SEND = 0x64,
    111 };
    112 
    113 /** An Infiniband Datagram Extended Transport Header */
    114 struct ib_datagram_extended_transport_header {
    115 	/** Queue key */
    116 	uint32_t qkey;
    117 	/** Source queue pair */
    118 	uint32_t src_qp;
    119 } __attribute__ (( packed ));
    120 
    121 /** All known IB header formats */
    122 union ib_headers {
    123 	struct ib_local_route_header lrh;
    124 	struct {
    125 		struct ib_local_route_header lrh;
    126 		struct ib_global_route_header grh;
    127 		struct ib_base_transport_header bth;
    128 		struct ib_datagram_extended_transport_header deth;
    129 	} __attribute__ (( packed )) lrh__grh__bth__deth;
    130 	struct {
    131 		struct ib_local_route_header lrh;
    132 		struct ib_base_transport_header bth;
    133 		struct ib_datagram_extended_transport_header deth;
    134 	} __attribute__ (( packed )) lrh__bth__deth;
    135 } __attribute__ (( packed ));
    136 
    137 /** Maximum size required for IB headers */
    138 #define IB_MAX_HEADER_SIZE sizeof ( union ib_headers )
    139 
    140 extern int ib_push ( struct ib_device *ibdev, struct io_buffer *iobuf,
    141 		     struct ib_queue_pair *qp, size_t payload_len,
    142 		     const struct ib_address_vector *av );
    143 extern int ib_pull ( struct ib_device *ibdev, struct io_buffer *iobuf,
    144 		     struct ib_queue_pair **qp, size_t *payload_len,
    145 		     struct ib_address_vector *av );
    146 
    147 #endif /* _GPXE_IB_PACKET_H */
    148