diff options
author | Michael Brown | 2016-03-05 16:33:28 +0100 |
---|---|---|
committer | Michael Brown | 2016-03-08 13:23:30 +0100 |
commit | c335f8eae4e23f1f69418dfd1b2ec442e3c1a70a (patch) | |
tree | 21ac2142daf32fa36521c4ee62b3496aed8b7445 /src/net | |
parent | [infiniband] Do not use GRH for local paths (diff) | |
download | ipxe-c335f8eae4e23f1f69418dfd1b2ec442e3c1a70a.tar.gz ipxe-c335f8eae4e23f1f69418dfd1b2ec442e3c1a70a.tar.xz ipxe-c335f8eae4e23f1f69418dfd1b2ec442e3c1a70a.zip |
[infiniband] Record multicast GID attachment as part of group membership
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net')
-rw-r--r-- | src/net/infiniband/ib_mcast.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/net/infiniband/ib_mcast.c b/src/net/infiniband/ib_mcast.c index b7a6e8ce..3a055908 100644 --- a/src/net/infiniband/ib_mcast.c +++ b/src/net/infiniband/ib_mcast.c @@ -150,8 +150,9 @@ int ib_mcast_join ( struct ib_device *ibdev, struct ib_queue_pair *qp, DBGC ( ibdev, "IBDEV %s QPN %#lx joining " IB_GID_FMT "\n", ibdev->name, qp->qpn, IB_GID_ARGS ( gid ) ); - /* Sanity check */ + /* Sanity checks */ assert ( qp != NULL ); + assert ( ! membership->attached ); /* Initialise structure */ membership->qp = qp; @@ -164,6 +165,7 @@ int ib_mcast_join ( struct ib_device *ibdev, struct ib_queue_pair *qp, ibdev->name, qp->qpn, strerror ( rc ) ); goto err_mcast_attach; } + membership->attached = 1; /* Initiate multicast membership join */ ib_mcast_mad ( ibdev, gid, 1, &mad ); @@ -182,6 +184,7 @@ int ib_mcast_join ( struct ib_device *ibdev, struct ib_queue_pair *qp, ib_destroy_madx ( ibdev, ibdev->gsi, membership->madx ); err_create_madx: ib_mcast_detach ( ibdev, qp, gid ); + membership->attached = 0; err_mcast_attach: return rc; } @@ -199,6 +202,10 @@ void ib_mcast_leave ( struct ib_device *ibdev, struct ib_queue_pair *qp, union ib_mad mad; int rc; + /* Do nothing if we are already detached from the multicast GID */ + if ( ! membership->attached ) + return; + DBGC ( ibdev, "IBDEV %s QPN %#lx leaving " IB_GID_FMT "\n", ibdev->name, qp->qpn, IB_GID_ARGS ( gid ) ); @@ -207,6 +214,7 @@ void ib_mcast_leave ( struct ib_device *ibdev, struct ib_queue_pair *qp, /* Detach from multicast GID */ ib_mcast_detach ( ibdev, qp, &membership->gid ); + membership->attached = 0; /* Cancel multicast membership join, if applicable */ if ( membership->madx ) { |