]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[eoib] Allow the multicast group to be forcefully created
authorMichael Brown <mcb30@ipxe.org>
Wed, 9 Mar 2016 00:45:09 +0000 (00:45 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 9 Mar 2016 08:43:40 +0000 (08:43 +0000)
Some EoIB implementations require each individual EoIB node to create
the multicast group for the EoIB broadcast domain.

It is left as an exercise for the interested reader to determine how
such an implementation might ever allow the parameters of such a
multicast group to be changed without requiring a simultaneous upgrade
of every driver on every operating system on every machine currently
attached to the fabric.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/eoib.c
src/include/ipxe/eoib.h

index 44eed4cc5a96bbd8f60d08a98f94b7c210f329a3..a5f9e29ee40b298c530c4a1e743ef062afadf752 100644 (file)
@@ -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;
index c53880b5c584851b12922248cd392b9b27f4c3cb..acae542b6d331af25aab0a01f0759b9f270c292d 100644 (file)
@@ -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 );