Hi Sasha,
I think there's a bug in the osm_mgrp_add/remove_port functions.
If some mcast group member has JoinState 0x1 (full member),
and then new join from the same port received with JoinState
0x2 (non member), OpenSM will reduce number of full members
of this group, which eventually might cause group deletion.
Similar problem (only in logically opposite direction) happens
when port tries to partially leave mcast group.
This patch should fix it.
Signed-off-by: Yevgeny Kliteynik <[EMAIL PROTECTED]>
---
opensm/opensm/osm_multicast.c | 33 +++++++++++----------------------
1 files changed, 11 insertions(+), 22 deletions(-)
diff --git a/opensm/opensm/osm_multicast.c b/opensm/opensm/osm_multicast.c
index d62d585..350fd22 100644
--- a/opensm/opensm/osm_multicast.c
+++ b/opensm/opensm/osm_multicast.c
@@ -172,17 +172,11 @@ osm_mcm_port_t *osm_mgrp_add_port(IN osm_subn_t *subn,
osm_log_t *log,
p_mgrp->last_change_id++;
}
- if ((join_state ^ prev_join_state) & IB_JOIN_STATE_FULL) {
- if (join_state & IB_JOIN_STATE_FULL) {
- if (++p_mgrp->full_members == 1) {
- mgrp_send_notice(subn, log, p_mgrp, 66);
- p_mgrp->to_be_deleted = 0;
- }
- } else if (--p_mgrp->full_members == 0) {
- mgrp_send_notice(subn, log, p_mgrp, 67);
- if (!p_mgrp->well_known)
- p_mgrp->to_be_deleted = 1;
- }
+ if ((join_state & IB_JOIN_STATE_FULL) &&
+ !(prev_join_state & IB_JOIN_STATE_FULL) &&
+ (++p_mgrp->full_members == 1)) {
+ mgrp_send_notice(subn, log, p_mgrp, 66);
+ p_mgrp->to_be_deleted = 0;
}
return (p_mcm_port);
@@ -224,17 +218,12 @@ int osm_mgrp_remove_port(osm_subn_t *subn, osm_log_t
*log, osm_mgrp_t *mgrp,
/* no more full members so the group will be deleted after re-route
but only if it is not a well known group */
- if ((port_join_state ^ new_join_state) & IB_JOIN_STATE_FULL) {
- if (port_join_state & IB_JOIN_STATE_FULL) {
- if (--mgrp->full_members == 0) {
- mgrp_send_notice(subn, log, mgrp, 67);
- if (!mgrp->well_known)
- mgrp->to_be_deleted = 1;
- }
- } else if (++mgrp->full_members == 1) {
- mgrp_send_notice(subn, log, mgrp, 66);
- mgrp->to_be_deleted = 0;
- }
+ if ((port_join_state & IB_JOIN_STATE_FULL) &&
+ !(new_join_state & IB_JOIN_STATE_FULL) &&
+ (--mgrp->full_members == 0)) {
+ mgrp_send_notice(subn, log, mgrp, 67);
+ if (!mgrp->well_known)
+ mgrp->to_be_deleted = 1;
}
return ret;
--
1.5.1.4
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general