#ifndef _GPXE_INFINIBAND_H #define _GPXE_INFINIBAND_H /** @file * * Infiniband protocol * */ #include #include /** 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 )); /** Infiniband MAC address length */ #define IB_ALEN 20 /** 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 )); /** Infiniband link-layer header length */ #define IB_HLEN 4 /** An Infiniband link-layer header */ struct ibhdr { /** 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 */