ib_mcast.c File Reference

Infiniband multicast groups. More...

#include <stdint.h>
#include <string.h>
#include <byteswap.h>
#include <errno.h>
#include <gpxe/list.h>
#include <gpxe/infiniband.h>
#include <gpxe/ib_mi.h>
#include <gpxe/ib_mcast.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER)
static void ib_mcast_mad (struct ib_device *ibdev, struct ib_gid *gid, int join, union ib_mad *mad)
 Generate multicast membership MAD.
static void ib_mcast_complete (struct ib_device *ibdev, struct ib_mad_interface *mi __unused, struct ib_mad_transaction *madx, int rc, union ib_mad *mad, struct ib_address_vector *av __unused)
 Handle multicast membership record join response.
int ib_mcast_join (struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_mc_membership *membership, struct ib_gid *gid, void(*complete)(struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_mc_membership *membership, int rc, union ib_mad *mad))
 Join multicast group.
void ib_mcast_leave (struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_mc_membership *membership)
 Leave multicast group.

Variables

static struct
ib_mad_transaction_operations 
ib_mcast_op
 Multicast membership management transaction completion operations.


Detailed Description

Infiniband multicast groups.

Definition in file ib_mcast.c.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER   ) 

static void ib_mcast_mad ( struct ib_device ibdev,
struct ib_gid gid,
int  join,
union ib_mad mad 
) [static]

Generate multicast membership MAD.

Parameters:
ibdev Infiniband device
gid Multicast GID
join Join (rather than leave) group
mad MAD to fill in

Definition at line 44 of file ib_mcast.c.

References ib_mad_hdr::attr_id, ib_mad_hdr::class_version, ib_sa_hdr::comp_mask, ib_device::gid, htonl, htons, IB_MGMT_CLASS_SUBN_ADM, IB_MGMT_METHOD_DELETE, IB_MGMT_METHOD_SET, IB_SA_ATTR_MC_MEMBER_REC, IB_SA_CLASS_VERSION, IB_SA_MCMEMBER_REC_JOIN_STATE, IB_SA_MCMEMBER_REC_MGID, IB_SA_MCMEMBER_REC_PORT_GID, ib_mad_sa::mad_hdr, ib_sa_data::mc_member_record, memcpy, memset(), ib_mad_hdr::method, ib_mc_member_record::mgid, ib_mad_hdr::mgmt_class, ib_mc_member_record::port_gid, ib_mad::sa, ib_mad_sa::sa_data, ib_mad_sa::sa_hdr, and ib_mc_member_record::scope__join_state.

Referenced by ib_mcast_join(), and ib_mcast_leave().

00045                                                          {
00046         struct ib_mad_sa *sa = &mad->sa;
00047 
00048         /* Construct multicast membership record request */
00049         memset ( sa, 0, sizeof ( *sa ) );
00050         sa->mad_hdr.mgmt_class = IB_MGMT_CLASS_SUBN_ADM;
00051         sa->mad_hdr.class_version = IB_SA_CLASS_VERSION;
00052         sa->mad_hdr.method =
00053                 ( join ? IB_MGMT_METHOD_SET : IB_MGMT_METHOD_DELETE );
00054         sa->mad_hdr.attr_id = htons ( IB_SA_ATTR_MC_MEMBER_REC );
00055         sa->sa_hdr.comp_mask[1] =
00056                 htonl ( IB_SA_MCMEMBER_REC_MGID | IB_SA_MCMEMBER_REC_PORT_GID |
00057                         IB_SA_MCMEMBER_REC_JOIN_STATE );
00058         sa->sa_data.mc_member_record.scope__join_state = 1;
00059         memcpy ( &sa->sa_data.mc_member_record.mgid, gid,
00060                  sizeof ( sa->sa_data.mc_member_record.mgid ) );
00061         memcpy ( &sa->sa_data.mc_member_record.port_gid, &ibdev->gid,
00062                  sizeof ( sa->sa_data.mc_member_record.port_gid ) );
00063 }

static void ib_mcast_complete ( struct ib_device ibdev,
struct ib_mad_interface *mi  __unused,
struct ib_mad_transaction madx,
int  rc,
union ib_mad mad,
struct ib_address_vector *av  __unused 
) [static]

Handle multicast membership record join response.

Parameters:
ibdev Infiniband device
mi Management interface
madx Management transaction
rc Status code
mad Received MAD (or NULL on error)
av Source address vector (or NULL on error)

Definition at line 75 of file ib_mcast.c.

References ib_mc_membership::complete, DBGC, ib_gid::dwords, ENOTCONN, ib_mc_membership::gid, ib_mad::hdr, htons, ib_destroy_madx(), ib_madx_get_ownerdata(), IB_MGMT_METHOD_GET_RESP, IB_MGMT_STATUS_OK, ib_modify_qp(), ib_mc_membership::madx, ib_sa_data::mc_member_record, ib_mad_hdr::method, ntohl, NULL, ib_queue_pair::qkey, ib_mc_member_record::qkey, ib_mc_membership::qp, ib_queue_pair::qpn, ib_mad::sa, ib_mad_sa::sa_data, ib_mad_hdr::status, strerror(), and ib_gid::u.

00079                                                                         {
00080         struct ib_mc_membership *membership = ib_madx_get_ownerdata ( madx );
00081         struct ib_queue_pair *qp = membership->qp;
00082         struct ib_gid *gid = &membership->gid;
00083         struct ib_mc_member_record *mc_member_record =
00084                 &mad->sa.sa_data.mc_member_record;
00085         int joined;
00086         unsigned long qkey;
00087 
00088         /* Report failures */
00089         if ( ( rc == 0 ) && ( mad->hdr.status != htons ( IB_MGMT_STATUS_OK ) ))
00090                 rc = -ENOTCONN;
00091         if ( rc != 0 ) {
00092                 DBGC ( ibdev, "IBDEV %p QPN %lx join failed: %s\n",
00093                        ibdev, qp->qpn, strerror ( rc ) );
00094                 goto out;
00095         }
00096 
00097         /* Extract values from MAD */
00098         joined = ( mad->hdr.method == IB_MGMT_METHOD_GET_RESP );
00099         qkey = ntohl ( mc_member_record->qkey );
00100         DBGC ( ibdev, "IBDEV %p QPN %lx %s %08x:%08x:%08x:%08x qkey %lx\n",
00101                ibdev, qp->qpn, ( joined ? "joined" : "left" ),
00102                ntohl ( gid->u.dwords[0] ), ntohl ( gid->u.dwords[1] ),
00103                ntohl ( gid->u.dwords[2] ), ntohl ( gid->u.dwords[3] ),
00104                qkey );
00105 
00106         /* Set queue key */
00107         qp->qkey = qkey;
00108         if ( ( rc = ib_modify_qp ( ibdev, qp ) ) != 0 ) {
00109                 DBGC ( ibdev, "IBDEV %p QPN %lx could not modify qkey: %s\n",
00110                        ibdev, qp->qpn, strerror ( rc ) );
00111                 goto out;
00112         }
00113 
00114  out:
00115         /* Destroy the completed transaction */
00116         ib_destroy_madx ( ibdev, mi, madx );
00117         membership->madx = NULL;
00118 
00119         /* Hand off to upper completion handler */
00120         membership->complete ( ibdev, qp, membership, rc, mad );
00121 }

int ib_mcast_join ( struct ib_device ibdev,
struct ib_queue_pair qp,
struct ib_mc_membership membership,
struct ib_gid gid,
void(*)(struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_mc_membership *membership, int rc, union ib_mad *mad)  complete 
)

Join multicast group.

Parameters:
ibdev Infiniband device
qp Queue pair
membership Multicast group membership
gid Multicast GID to join
joined Join completion handler
Return values:
rc Return status code

Definition at line 138 of file ib_mcast.c.

References ib_mc_membership::complete, DBGC, ib_gid::dwords, ENOMEM, ib_mc_membership::gid, ib_device::gsi, ib_create_madx(), ib_destroy_madx(), ib_madx_set_ownerdata(), ib_mcast_attach(), ib_mcast_detach(), ib_mcast_mad(), ib_mc_membership::madx, memcpy, ntohl, NULL, ib_mc_membership::qp, ib_queue_pair::qpn, strerror(), and ib_gid::u.

Referenced by ipoib_join_broadcast_group().

00143                                                                         {
00144         union ib_mad mad;
00145         int rc;
00146 
00147         DBGC ( ibdev, "IBDEV %p QPN %lx joining %08x:%08x:%08x:%08x\n",
00148                ibdev, qp->qpn, ntohl ( gid->u.dwords[0] ),
00149                ntohl ( gid->u.dwords[1] ), ntohl ( gid->u.dwords[2] ),
00150                ntohl ( gid->u.dwords[3] ) );
00151 
00152         /* Initialise structure */
00153         membership->qp = qp;
00154         memcpy ( &membership->gid, gid, sizeof ( membership->gid ) );
00155         membership->complete = complete;
00156 
00157         /* Attach queue pair to multicast GID */
00158         if ( ( rc = ib_mcast_attach ( ibdev, qp, gid ) ) != 0 ) {
00159                 DBGC ( ibdev, "IBDEV %p QPN %lx could not attach: %s\n",
00160                        ibdev, qp->qpn, strerror ( rc ) );
00161                 goto err_mcast_attach;
00162         }
00163 
00164         /* Initiate multicast membership join */
00165         ib_mcast_mad ( ibdev, gid, 1, &mad );
00166         membership->madx = ib_create_madx ( ibdev, ibdev->gsi, &mad, NULL,
00167                                             &ib_mcast_op );
00168         if ( ! membership->madx ) {
00169                 DBGC ( ibdev, "IBDEV %p QPN %lx could not create join "
00170                        "transaction\n", ibdev, qp->qpn );
00171                 rc = -ENOMEM;
00172                 goto err_create_madx;
00173         }
00174         ib_madx_set_ownerdata ( membership->madx, membership );
00175 
00176         return 0;
00177 
00178         ib_destroy_madx ( ibdev, ibdev->gsi, membership->madx );
00179  err_create_madx:
00180         ib_mcast_detach ( ibdev, qp, gid );
00181  err_mcast_attach:
00182         return rc;
00183 }

void ib_mcast_leave ( struct ib_device ibdev,
struct ib_queue_pair qp,
struct ib_mc_membership membership 
)

Leave multicast group.

Parameters:
ibdev Infiniband device
qp Queue pair
membership Multicast group membership

Definition at line 192 of file ib_mcast.c.

References DBGC, ib_gid::dwords, ib_mc_membership::gid, ib_device::gsi, ib_destroy_madx(), ib_mcast_detach(), ib_mcast_mad(), ib_mi_send(), ib_mc_membership::madx, ntohl, NULL, ib_queue_pair::qpn, strerror(), and ib_gid::u.

Referenced by ipoib_leave_broadcast_group().

00193                                                             {
00194         struct ib_gid *gid = &membership->gid;
00195         union ib_mad mad;
00196         int rc;
00197 
00198         DBGC ( ibdev, "IBDEV %p QPN %lx leaving %08x:%08x:%08x:%08x\n",
00199                ibdev, qp->qpn, ntohl ( gid->u.dwords[0] ),
00200                ntohl ( gid->u.dwords[1] ), ntohl ( gid->u.dwords[2] ),
00201                ntohl ( gid->u.dwords[3] ) );
00202 
00203         /* Detach from multicast GID */
00204         ib_mcast_detach ( ibdev, qp, &membership->gid );
00205 
00206         /* Cancel multicast membership join, if applicable */
00207         if ( membership->madx ) {
00208                 ib_destroy_madx ( ibdev, ibdev->gsi, membership->madx );
00209                 membership->madx = NULL;
00210         }
00211 
00212         /* Send a single group leave MAD */
00213         ib_mcast_mad ( ibdev, &membership->gid, 0, &mad );
00214         if ( ( rc = ib_mi_send ( ibdev, ibdev->gsi, &mad, NULL ) ) != 0 ) {
00215                 DBGC ( ibdev, "IBDEV %p QPN %lx could not send leave request: "
00216                        "%s\n", ibdev, qp->qpn, strerror ( rc ) );
00217         }
00218 }


Variable Documentation

Initial value:

 {
        .complete = ib_mcast_complete,
}
Multicast membership management transaction completion operations.

Definition at line 124 of file ib_mcast.c.


Generated on Tue Apr 6 20:01:55 2010 for gPXE by  doxygen 1.5.7.1