104 lines
2.5 KiB
C
104 lines
2.5 KiB
C
#ifndef _IPXE_EOIB_H
|
|
#define _IPXE_EOIB_H
|
|
|
|
/** @file
|
|
*
|
|
* Ethernet over Infiniband
|
|
*
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|
|
|
#include <stdint.h>
|
|
#include <byteswap.h>
|
|
#include <ipxe/netdevice.h>
|
|
#include <ipxe/infiniband.h>
|
|
#include <ipxe/ib_mcast.h>
|
|
|
|
/** An EoIB header */
|
|
struct eoib_header {
|
|
/** Signature */
|
|
uint16_t magic;
|
|
/** Reserved */
|
|
uint16_t reserved;
|
|
} __attribute__ (( packed ));
|
|
|
|
/** EoIB magic signature */
|
|
#define EOIB_MAGIC 0x8919
|
|
|
|
/** An EoIB device */
|
|
struct eoib_device {
|
|
/** Name */
|
|
const char *name;
|
|
/** Network device */
|
|
struct net_device *netdev;
|
|
/** Underlying Infiniband device */
|
|
struct ib_device *ibdev;
|
|
/** List of EoIB devices */
|
|
struct list_head list;
|
|
/** Broadcast address */
|
|
struct ib_address_vector broadcast;
|
|
|
|
/** Completion queue */
|
|
struct ib_completion_queue *cq;
|
|
/** Queue pair */
|
|
struct ib_queue_pair *qp;
|
|
/** Broadcast group membership */
|
|
struct ib_mc_membership membership;
|
|
|
|
/** Peer cache */
|
|
struct list_head peers;
|
|
|
|
/** Send duplicate packet to gateway (or NULL)
|
|
*
|
|
* @v eoib EoIB device
|
|
* @v original Original I/O buffer
|
|
*/
|
|
void ( * duplicate ) ( struct eoib_device *eoib,
|
|
struct io_buffer *original );
|
|
/** Gateway (if any) */
|
|
struct ib_address_vector gateway;
|
|
/** Multicast group additional component mask */
|
|
unsigned int mask;
|
|
};
|
|
|
|
/**
|
|
* Check if EoIB device uses a gateway
|
|
*
|
|
* @v eoib EoIB device
|
|
* @v has_gw EoIB device uses a gateway
|
|
*/
|
|
static inline int eoib_has_gateway ( struct eoib_device *eoib ) {
|
|
|
|
return ( eoib->duplicate != NULL );
|
|
}
|
|
|
|
/**
|
|
* Force creation of multicast group
|
|
*
|
|
* @v eoib EoIB device
|
|
*/
|
|
static inline void eoib_force_group_creation ( struct eoib_device *eoib ) {
|
|
|
|
/* Some dubious EoIB implementations require each endpoint to
|
|
* force the creation of the multicast group. Yes, this makes
|
|
* it impossible for the group parameters (e.g. SL) to ever be
|
|
* modified without breaking backwards compatiblity with every
|
|
* existing driver.
|
|
*/
|
|
eoib->mask = ( IB_SA_MCMEMBER_REC_PKEY | IB_SA_MCMEMBER_REC_QKEY |
|
|
IB_SA_MCMEMBER_REC_SL | IB_SA_MCMEMBER_REC_FLOW_LABEL |
|
|
IB_SA_MCMEMBER_REC_TRAFFIC_CLASS );
|
|
}
|
|
|
|
extern int eoib_create ( struct ib_device *ibdev, const uint8_t *hw_addr,
|
|
struct ib_address_vector *broadcast,
|
|
const char *name );
|
|
extern struct eoib_device * eoib_find ( struct ib_device *ibdev,
|
|
const uint8_t *hw_addr );
|
|
extern void eoib_destroy ( struct eoib_device *eoib );
|
|
extern void eoib_set_gateway ( struct eoib_device *eoib,
|
|
struct ib_address_vector *av );
|
|
|
|
#endif /* _IPXE_EOIB_H */
|