diff --git a/src/drivers/net/eoib.c b/src/drivers/net/eoib.c index 44eed4cc5..a5f9e29ee 100644 --- a/src/drivers/net/eoib.c +++ b/src/drivers/net/eoib.c @@ -454,8 +454,8 @@ static int eoib_join_broadcast_group ( struct eoib_device *eoib ) { /* Join multicast group */ if ( ( rc = ib_mcast_join ( eoib->ibdev, eoib->qp, - &eoib->membership, &eoib->broadcast, 0, - eoib_join_complete ) ) != 0 ) { + &eoib->membership, &eoib->broadcast, + eoib->mask, eoib_join_complete ) ) != 0 ) { DBGC ( eoib, "EoIB %s could not join broadcast group: %s\n", eoib->name, strerror ( rc ) ); return rc; diff --git a/src/include/ipxe/eoib.h b/src/include/ipxe/eoib.h index c53880b5c..acae542b6 100644 --- a/src/include/ipxe/eoib.h +++ b/src/include/ipxe/eoib.h @@ -48,8 +48,29 @@ struct eoib_device { /** Peer cache */ struct list_head peers; + + /** Multicast group additional component mask */ + unsigned int mask; }; +/** + * 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 );