iPXE
ib_mcast.h File Reference

Infiniband multicast groups. More...

#include <ipxe/infiniband.h>

Go to the source code of this file.

Data Structures

struct  ib_mc_membership
 An Infiniband multicast group membership. More...

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
int ib_mcast_join (struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_mc_membership *membership, struct ib_address_vector *av, unsigned int mask, void(*joined)(struct ib_mc_membership *memb, int rc))
 Join multicast group.
void ib_mcast_leave (struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_mc_membership *membership)
 Leave multicast group.

Detailed Description

Infiniband multicast groups.

Definition in file ib_mcast.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ ib_mcast_join()

int ib_mcast_join ( struct ib_device * ibdev,
struct ib_queue_pair * qp,
struct ib_mc_membership * membership,
struct ib_address_vector * av,
unsigned int mask,
void(* complete )(struct ib_mc_membership *membership, int rc) )
extern

Join multicast group.

Parameters
ibdevInfiniband device
qpQueue pair
membershipMulticast group membership
avAddress vector to fill in
joinedJoin completion handler
Return values
rcReturn status code

Definition at line 152 of file ib_mcast.c.

156 {
157 union ib_mad mad;
158 int rc;
159
160 DBGC ( ibdev, "IBDEV %s QPN %#lx joining " IB_GID_FMT "\n",
161 ibdev->name, qp->qpn, IB_GID_ARGS ( &av->gid ) );
162
163 /* Sanity checks */
164 assert ( qp != NULL );
165 assert ( ! membership->attached );
166
167 /* Initialise structure */
168 membership->qp = qp;
169 membership->av = av;
170 membership->complete = complete;
171
172 /* Attach queue pair to multicast GID */
173 if ( ( rc = ib_mcast_attach ( ibdev, qp, &av->gid ) ) != 0 ) {
174 DBGC ( ibdev, "IBDEV %s QPN %#lx could not attach: %s\n",
175 ibdev->name, qp->qpn, strerror ( rc ) );
176 goto err_mcast_attach;
177 }
178 membership->attached = 1;
179
180 /* Initiate multicast membership join */
181 ib_mcast_mad ( ibdev, av, IB_MGMT_METHOD_SET, mask, &mad );
182 membership->madx = ib_create_madx ( ibdev, ibdev->gsi, &mad, NULL,
183 &ib_mcast_op );
184 if ( ! membership->madx ) {
185 DBGC ( ibdev, "IBDEV %s QPN %#lx could not create join "
186 "transaction\n", ibdev->name, qp->qpn );
187 rc = -ENOMEM;
188 goto err_create_madx;
189 }
190 ib_madx_set_ownerdata ( membership->madx, membership );
191
192 return 0;
193
194 ib_destroy_madx ( ibdev, ibdev->gsi, membership->madx );
195 err_create_madx:
196 ib_mcast_detach ( ibdev, qp, &av->gid );
197 membership->attached = 0;
198 err_mcast_attach:
199 return rc;
200}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
union ib_mad mad
Definition arbel.h:1
struct arbelprm_qp_db_record qp
Definition arbel.h:2
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
#define DBGC(...)
Definition compiler.h:505
#define ENOMEM
Not enough space.
Definition errno.h:535
#define IB_MGMT_METHOD_SET
Definition ib_mad.h:571
static struct ib_mad_transaction_operations ib_mcast_op
Multicast membership management transaction completion operations.
Definition ib_mcast.c:138
static void ib_mcast_mad(struct ib_device *ibdev, struct ib_address_vector *av, unsigned int method, unsigned int mask, union ib_mad *mad)
Generate multicast membership MAD.
Definition ib_mcast.c:50
struct ib_mad_transaction * ib_create_madx(struct ib_device *ibdev, struct ib_mad_interface *mi, union ib_mad *mad, struct ib_address_vector *av, struct ib_mad_transaction_operations *op)
Create management transaction.
Definition ib_mi.c:287
void ib_destroy_madx(struct ib_device *ibdev __unused, struct ib_mad_interface *mi __unused, struct ib_mad_transaction *madx)
Destroy management transaction.
Definition ib_mi.c:327
static __always_inline void ib_madx_set_ownerdata(struct ib_mad_transaction *madx, void *priv)
Set Infiniband management transaction owner-private data.
Definition ib_mi.h:106
#define IB_GID_ARGS(gid)
Infiniband Global Identifier debug message arguments.
Definition ib_packet.h:49
#define IB_GID_FMT
Infiniband Global Identifier debug message format.
Definition ib_packet.h:46
int ib_mcast_attach(struct ib_device *ibdev, struct ib_queue_pair *qp, union ib_gid *gid)
Attach to multicast group.
Definition infiniband.c:752
void ib_mcast_detach(struct ib_device *ibdev, struct ib_queue_pair *qp, union ib_gid *gid)
Detach from multicast group.
Definition infiniband.c:789
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
union ib_gid gid
GID, if present.
Definition infiniband.h:93
struct ib_mad_interface * gsi
General services interface.
Definition infiniband.h:462
char name[IBDEV_NAME_LEN]
Name of this Infiniband device.
Definition infiniband.h:409
void(* complete)(struct ib_mc_membership *membership, int rc)
Handle join success/failure.
Definition ib_mcast.h:31
struct ib_address_vector * av
Address vector.
Definition ib_mcast.h:21
struct ib_queue_pair * qp
Queue pair.
Definition ib_mcast.h:19
int attached
Attached to multicast GID.
Definition ib_mcast.h:23
struct ib_mad_transaction * madx
Multicast group join transaction.
Definition ib_mcast.h:25
A management datagram.
Definition ib_mad.h:611

References assert, ib_mc_membership::attached, ib_mc_membership::av, ib_mc_membership::complete, DBGC, ENOMEM, ib_address_vector::gid, ib_device::gsi, ib_create_madx(), ib_destroy_madx(), IB_GID_ARGS, IB_GID_FMT, ib_madx_set_ownerdata(), ib_mcast_attach(), ib_mcast_detach(), ib_mcast_mad(), ib_mcast_op, IB_MGMT_METHOD_SET, mad, ib_mc_membership::madx, ib_device::name, NULL, ib_mc_membership::qp, qp, rc, and strerror().

Referenced by eoib_join_broadcast_group(), and ipoib_join_broadcast_group().

◆ ib_mcast_leave()

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

Leave multicast group.

Parameters
ibdevInfiniband device
qpQueue pair
membershipMulticast group membership

Definition at line 209 of file ib_mcast.c.

210 {
211 struct ib_address_vector *av = membership->av;
212 union ib_mad mad;
213 int rc;
214
215 /* Do nothing if we are already detached from the multicast GID */
216 if ( ! membership->attached )
217 return;
218
219 DBGC ( ibdev, "IBDEV %s QPN %#lx leaving " IB_GID_FMT "\n",
220 ibdev->name, qp->qpn, IB_GID_ARGS ( &av->gid ) );
221
222 /* Sanity check */
223 assert ( qp != NULL );
224
225 /* Detach from multicast GID */
226 ib_mcast_detach ( ibdev, qp, &av->gid );
227 membership->attached = 0;
228
229 /* Cancel multicast membership join, if applicable */
230 if ( membership->madx ) {
231 ib_destroy_madx ( ibdev, ibdev->gsi, membership->madx );
232 membership->madx = NULL;
233 }
234
235 /* Send a single group leave MAD */
236 ib_mcast_mad ( ibdev, av, IB_MGMT_METHOD_DELETE, 0, &mad );
237 if ( ( rc = ib_mi_send ( ibdev, ibdev->gsi, &mad, NULL ) ) != 0 ) {
238 DBGC ( ibdev, "IBDEV %s QPN %#lx could not send leave request: "
239 "%s\n", ibdev->name, qp->qpn, strerror ( rc ) );
240 }
241}
#define IB_MGMT_METHOD_DELETE
Definition ib_mad.h:578
int ib_mi_send(struct ib_device *ibdev, struct ib_mad_interface *mi, union ib_mad *mad, struct ib_address_vector *av)
Transmit MAD.
Definition ib_mi.c:187
An Infiniband Address Vector.
Definition infiniband.h:73

References assert, ib_mc_membership::attached, ib_mc_membership::av, DBGC, ib_address_vector::gid, ib_device::gsi, ib_destroy_madx(), IB_GID_ARGS, IB_GID_FMT, ib_mcast_detach(), ib_mcast_mad(), IB_MGMT_METHOD_DELETE, ib_mi_send(), mad, ib_mc_membership::madx, ib_device::name, NULL, qp, rc, and strerror().

Referenced by eoib_leave_broadcast_group(), and ipoib_leave_broadcast_group().