#ifndef _GPXE_INFINIBAND_H #define _GPXE_INFINIBAND_H /** @file * * Infiniband protocol * */ #include #include /** Infiniband hardware address length */ #define IB_ALEN 20 #define IB_HLEN 24 /** 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 )); /** 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 */