#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. | |
Definition in file ib_mcast.c.
| 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.
| 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.
| 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.
| ibdev | Infiniband device | |
| qp | Queue pair | |
| membership | Multicast group membership | |
| gid | Multicast GID to join | |
| joined | Join completion handler |
| 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.
| 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 }
struct ib_mad_transaction_operations ib_mcast_op [static] |
Initial value:
{
.complete = ib_mcast_complete,
}
Definition at line 124 of file ib_mcast.c.
1.5.7.1