2007-09-12 23:17:43 +02:00
|
|
|
#ifndef _GPXE_INFINIBAND_H
|
|
|
|
#define _GPXE_INFINIBAND_H
|
|
|
|
|
|
|
|
/** @file
|
|
|
|
*
|
|
|
|
* Infiniband protocol
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <gpxe/netdevice.h>
|
|
|
|
|
|
|
|
/** Infiniband hardware address length */
|
|
|
|
#define IB_ALEN 20
|
|
|
|
#define IB_HLEN 24
|
|
|
|
|
2007-09-13 15:43:12 +02:00
|
|
|
/** An Infiniband Global Identifier */
|
|
|
|
struct ib_gid {
|
|
|
|
uint8_t bytes[16];
|
|
|
|
};
|
|
|
|
|
|
|
|
/** An Infiniband Global Route Header */
|
|
|
|
struct ib_global_route_header {
|
|
|
|
/** IP version, traffic class, and flow label
|
|
|
|
*
|
|
|
|
* 4 bits : Version of the GRH
|
|
|
|
* 8 bits : Traffic class
|
|
|
|
* 20 bits : Flow label
|
|
|
|
*/
|
|
|
|
uint32_t ipver_tclass_flowlabel;
|
|
|
|
/** Payload length */
|
|
|
|
uint16_t paylen;
|
|
|
|
/** Next header */
|
|
|
|
uint8_t nxthdr;
|
|
|
|
/** Hop limit */
|
|
|
|
uint8_t hoplmt;
|
|
|
|
/** Source GID */
|
|
|
|
struct ib_gid sgid;
|
|
|
|
/** Destiniation GID */
|
|
|
|
struct ib_gid dgid;
|
|
|
|
} __attribute__ (( packed ));
|
|
|
|
|
|
|
|
/** An Infiniband MAC address */
|
|
|
|
struct ib_mac {
|
|
|
|
/** Queue pair number
|
|
|
|
*
|
|
|
|
* MSB must be zero; QPNs are only 24-bit.
|
|
|
|
*/
|
|
|
|
uint32_t qpn;
|
|
|
|
/** Port GID */
|
|
|
|
struct ib_gid gid;
|
|
|
|
} __attribute__ (( packed ));
|
|
|
|
|
2007-09-12 23:17:43 +02:00
|
|
|
/** An Infiniband header
|
|
|
|
*
|
|
|
|
* This data structure doesn't represent the on-wire format, but does
|
|
|
|
* contain all the information required by the driver to construct the
|
|
|
|
* packet.
|
|
|
|
*/
|
|
|
|
struct ibhdr {
|
|
|
|
/** Peer address */
|
|
|
|
uint8_t peer[IB_ALEN];
|
|
|
|
/** Network-layer protocol */
|
|
|
|
uint16_t proto;
|
|
|
|
/** Reserved, must be zero */
|
|
|
|
uint16_t reserved;
|
|
|
|
} __attribute__ (( packed ));
|
|
|
|
|
|
|
|
extern struct ll_protocol infiniband_protocol;
|
|
|
|
|
|
|
|
extern const char * ib_ntoa ( const void *ll_addr );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Allocate Infiniband device
|
|
|
|
*
|
|
|
|
* @v priv_size Size of driver private data
|
|
|
|
* @ret netdev Network device, or NULL
|
|
|
|
*/
|
|
|
|
static inline struct net_device * alloc_ibdev ( size_t priv_size ) {
|
|
|
|
struct net_device *netdev;
|
|
|
|
|
|
|
|
netdev = alloc_netdev ( priv_size );
|
|
|
|
if ( netdev ) {
|
|
|
|
netdev->ll_protocol = &infiniband_protocol;
|
|
|
|
}
|
|
|
|
return netdev;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* _GPXE_INFINIBAND_H */
|