]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[infiniband] Allow for the creation of multicast groups
authorMichael Brown <mcb30@ipxe.org>
Tue, 8 Mar 2016 10:34:27 +0000 (10:34 +0000)
committerMichael Brown <mcb30@ipxe.org>
Tue, 8 Mar 2016 12:23:30 +0000 (12:23 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/ipoib.c
src/include/ipxe/ib_mcast.h
src/net/infiniband/ib_mcast.c

index 66e72ac1ac4f5cdce2d546583bf3d1e263eb96ab..d545b6f402d848370d0116a4655ff58d16aee331 100644 (file)
@@ -770,7 +770,7 @@ static int ipoib_join_broadcast_group ( struct ipoib_device *ipoib ) {
        /* Join multicast group */
        if ( ( rc = ib_mcast_join ( ipoib->ibdev, ipoib->qp,
                                    &ipoib->broadcast.membership,
-                                   &ipoib->broadcast.av,
+                                   &ipoib->broadcast.av, 0,
                                    ipoib_join_complete ) ) != 0 ) {
                DBGC ( ipoib, "IPoIB %p could not join broadcast group: %s\n",
                       ipoib, strerror ( rc ) );
index 789a2f3bfa7fcd608e9033c0b6a4b29b0f16efae..df348bd9b86819f61e5d4836e95f70cf47938e1a 100644 (file)
@@ -33,7 +33,7 @@ struct ib_mc_membership {
 
 extern int ib_mcast_join ( struct ib_device *ibdev, struct ib_queue_pair *qp,
                           struct ib_mc_membership *membership,
-                          struct ib_address_vector *av,
+                          struct ib_address_vector *av, unsigned int mask,
                           void ( * joined ) ( struct ib_mc_membership *memb,
                                               int rc ) );
 
index 6f904331c506022d7a7265fd751a0286fbdf47d6..f7264287c635fb3f02300a58149deb1fe6dd2242 100644 (file)
@@ -43,25 +43,32 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  *
  * @v ibdev            Infiniband device
  * @v av               Address vector
- * @v join             Join (rather than leave) group
+ * @v method           Method (IB_MGMT_METHOD_SET or IB_MGMT_METHOD_DELETE)
+ * @v mask             Additional component mask
  * @v mad              MAD to fill in
  */
 static void ib_mcast_mad ( struct ib_device *ibdev,
                           struct ib_address_vector *av,
-                          int join, union ib_mad *mad ) {
+                          unsigned int method, unsigned int mask,
+                          union ib_mad *mad ) {
        struct ib_mad_sa *sa = &mad->sa;
 
        /* Construct multicast membership record request */
        memset ( sa, 0, sizeof ( *sa ) );
        sa->mad_hdr.mgmt_class = IB_MGMT_CLASS_SUBN_ADM;
        sa->mad_hdr.class_version = IB_SA_CLASS_VERSION;
-       sa->mad_hdr.method =
-               ( join ? IB_MGMT_METHOD_SET : IB_MGMT_METHOD_DELETE );
+       sa->mad_hdr.method = method;
        sa->mad_hdr.attr_id = htons ( IB_SA_ATTR_MC_MEMBER_REC );
        sa->sa_hdr.comp_mask[1] =
                htonl ( IB_SA_MCMEMBER_REC_MGID | IB_SA_MCMEMBER_REC_PORT_GID |
-                       IB_SA_MCMEMBER_REC_JOIN_STATE );
-       sa->sa_data.mc_member_record.scope__join_state = 1;
+                       IB_SA_MCMEMBER_REC_JOIN_STATE | mask );
+       sa->sa_data.mc_member_record.qkey = htonl ( av->qkey );
+       sa->sa_data.mc_member_record.pkey =
+               htons ( ibdev->pkey | IB_PKEY_FULL );
+       sa->sa_data.mc_member_record.rate_selector__rate = av->rate;
+       sa->sa_data.mc_member_record.sl__flow_label__hop_limit =
+               htonl ( av->sl << 28 );
+       sa->sa_data.mc_member_record.scope__join_state = 0x01;
        memcpy ( &sa->sa_data.mc_member_record.mgid, &av->gid,
                 sizeof ( sa->sa_data.mc_member_record.mgid ) );
        memcpy ( &sa->sa_data.mc_member_record.port_gid, &ibdev->gid,
@@ -144,7 +151,7 @@ static struct ib_mad_transaction_operations ib_mcast_op = {
  */
 int ib_mcast_join ( struct ib_device *ibdev, struct ib_queue_pair *qp,
                    struct ib_mc_membership *membership,
-                   struct ib_address_vector *av,
+                   struct ib_address_vector *av, unsigned int mask,
                    void ( * complete ) ( struct ib_mc_membership *membership,
                                          int rc ) ) {
        union ib_mad mad;
@@ -171,7 +178,7 @@ int ib_mcast_join ( struct ib_device *ibdev, struct ib_queue_pair *qp,
        membership->attached = 1;
 
        /* Initiate multicast membership join */
-       ib_mcast_mad ( ibdev, av, 1, &mad );
+       ib_mcast_mad ( ibdev, av, IB_MGMT_METHOD_SET, mask, &mad );
        membership->madx = ib_create_madx ( ibdev, ibdev->gsi, &mad, NULL,
                                            &ib_mcast_op );
        if ( ! membership->madx ) {
@@ -226,7 +233,7 @@ void ib_mcast_leave ( struct ib_device *ibdev, struct ib_queue_pair *qp,
        }
 
        /* Send a single group leave MAD */
-       ib_mcast_mad ( ibdev, av, 0, &mad );
+       ib_mcast_mad ( ibdev, av, IB_MGMT_METHOD_DELETE, 0, &mad );
        if ( ( rc = ib_mi_send ( ibdev, ibdev->gsi, &mad, NULL ) ) != 0 ) {
                DBGC ( ibdev, "IBDEV %s QPN %#lx could not send leave request: "
                       "%s\n", ibdev->name, qp->qpn, strerror ( rc ) );