summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/drivers/net/ipoib.c22
-rw-r--r--src/include/ipxe/ib_mcast.h2
-rw-r--r--src/net/infiniband/ib_mcast.c10
3 files changed, 16 insertions, 18 deletions
diff --git a/src/drivers/net/ipoib.c b/src/drivers/net/ipoib.c
index e54f8df40..8165f96e0 100644
--- a/src/drivers/net/ipoib.c
+++ b/src/drivers/net/ipoib.c
@@ -89,14 +89,8 @@ struct ipoib_device {
struct ipoib_mac mac;
/** Broadcast MAC */
struct ipoib_mac broadcast;
- /** Joined to IPv4 broadcast multicast group
- *
- * This flag indicates whether or not we have initiated the
- * join to the IPv4 broadcast multicast group.
- */
- int broadcast_joined;
/** IPv4 broadcast multicast group membership */
- struct ib_mc_membership broadcast_membership;
+ struct ib_mc_membership membership;
/** REMAC cache */
struct list_head peers;
};
@@ -742,8 +736,8 @@ void ipoib_join_complete ( struct ib_device *ibdev __unused,
struct ib_queue_pair *qp __unused,
struct ib_mc_membership *membership, int rc,
union ib_mad *mad __unused ) {
- struct ipoib_device *ipoib = container_of ( membership,
- struct ipoib_device, broadcast_membership );
+ struct ipoib_device *ipoib =
+ container_of ( membership, struct ipoib_device, membership );
/* Record join status as link status */
netdev_link_err ( ipoib->netdev, rc );
@@ -759,14 +753,12 @@ static int ipoib_join_broadcast_group ( struct ipoib_device *ipoib ) {
int rc;
if ( ( rc = ib_mcast_join ( ipoib->ibdev, ipoib->qp,
- &ipoib->broadcast_membership,
- &ipoib->broadcast.gid,
+ &ipoib->membership, &ipoib->broadcast.gid,
ipoib_join_complete ) ) != 0 ) {
DBGC ( ipoib, "IPoIB %p could not join broadcast group: %s\n",
ipoib, strerror ( rc ) );
return rc;
}
- ipoib->broadcast_joined = 1;
return 0;
}
@@ -778,11 +770,7 @@ static int ipoib_join_broadcast_group ( struct ipoib_device *ipoib ) {
*/
static void ipoib_leave_broadcast_group ( struct ipoib_device *ipoib ) {
- if ( ipoib->broadcast_joined ) {
- ib_mcast_leave ( ipoib->ibdev, ipoib->qp,
- &ipoib->broadcast_membership );
- ipoib->broadcast_joined = 0;
- }
+ ib_mcast_leave ( ipoib->ibdev, ipoib->qp, &ipoib->membership );
}
/**
diff --git a/src/include/ipxe/ib_mcast.h b/src/include/ipxe/ib_mcast.h
index 564066975..202f8e297 100644
--- a/src/include/ipxe/ib_mcast.h
+++ b/src/include/ipxe/ib_mcast.h
@@ -19,6 +19,8 @@ struct ib_mc_membership {
struct ib_queue_pair *qp;
/** Multicast GID */
union ib_gid gid;
+ /** Attached to multicast GID */
+ int attached;
/** Multicast group join transaction */
struct ib_mad_transaction *madx;
/** Handle join success/failure
diff --git a/src/net/infiniband/ib_mcast.c b/src/net/infiniband/ib_mcast.c
index b7a6e8ce8..3a0559081 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 ) {