summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/drivers/net/eoib.c4
-rw-r--r--src/include/ipxe/eoib.h21
2 files changed, 23 insertions, 2 deletions
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 );