#ifndef _IPXE_EOIB_H #define _IPXE_EOIB_H /** @file * * Ethernet over Infiniband * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include #include #include /** 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 */