[openib-general] Re: Solaris 10 with OpenIB OpenSM

Hal Rosenstock halr at voltaire.com
Sat Feb 12 04:28:10 PST 2005


On Fri, 2005-02-11 at 20:29, Tom Duffy wrote:
> On Fri, 2005-02-11 at 20:11 -0500, Hal Rosenstock wrote:
> > The log indicates that the MTU is 4 which is 2048. I also saw this in
> > the IB trace.

The issue is that Solaris is pendantic about the selectors. OpenIB
OpenSM was not filling in the MTUSelector (or the other selectors). The
spec says they should be set to exactly (2) on a query response. Solaris
must be checking them. This may be some ambiguity in the spec as most
other cases this can be ignored. I would think the selector is
meaningless on a response but the spec doesn't say this :-( It appears
other implementations treated it as such.

> > > Yes, I would like the patch.
> 
> BTW, Solaris does work now (Yippie!!!!), even without this patch (albeit
> with the MTU workaround).  I just confirmed on my network.  Thanks.

Here's an updated patch which is needed for Solaris. I also need to
retest OpenIB to make sure this still works but from code inspection it
does. (It still has one question outstanding so I may apply in 2 steps) 

-- Hal

Index: osm_sa_mcmember_record.c
===================================================================
--- osm_sa_mcmember_record.c	(revision 1781)
+++ osm_sa_mcmember_record.c	(working copy)
@@ -176,8 +176,8 @@
   p_recvd_mcmember_rec = p_ctxt->p_mcmember_rec;
   p_rcv = p_ctxt->p_rcv;
 
-  /* Why not comparing all the MGID ???? */
-  /* different scope can sneek in for the same MGID ? */
+  /* Why not compare the entire MGID ???? */
+  /* different scope can sneak in for the same MGID ? */
   /* EZ: I changed it to full compare ! */
   if (cl_memcmp(&p_mgrp->mcmember_rec.mgid,
                 &p_recvd_mcmember_rec->mgid,
@@ -443,6 +443,11 @@
 
   *p_resp_mcmember_rec = *p_mcmember_rec;
 
+  /* Fill in the mtu, rate, and packet lifetime selectors */
+  p_resp_mcmember_rec->mtu |= 2<<6; /* exactly */
+  p_resp_mcmember_rec->rate |=  2<<6; /* exactly */
+  p_resp_mcmember_rec->pkt_life |= 2<<6; /* exactly */
+
   status = osm_vendor_send(
     p_resp_madw->h_bind,
     p_resp_madw,
@@ -732,7 +737,7 @@
 
   OSM_LOG_ENTER( p_rcv->p_log, __validate_requested_mgid );
 
-  /* 14-a : mcaut GUID must start with 0xFF */
+  /* 14-a : mcast GID must start with 0xFF */
   if (p_mcm_rec->mgid.multicast.header[0] != 0xFF)
   {
     osm_log( p_rcv->p_log, OSM_LOG_ERROR,
@@ -1009,8 +1014,8 @@
     {
 
       /*
-       * acording to the same o15-0.1.14 we must get the stored JoinState and
-       * the request JoinState be oposite to leave - other wise just update it
+       * according to the same o15-0.1.14 we must get the stored JoinState and
+       * the request JoinState be opposite to leave - otherwise just update it
        */
       port_join_state = p_mcm_port->scope_state & 0x0F;
       new_join_state = 
@@ -1419,7 +1424,7 @@
   osm_mcmr_recv_t*            const p_rcv  = p_ctxt->p_rcv;
   const ib_member_rec_t*      p_rcvd_rec   = p_ctxt->p_mcmember_rec;
   const osm_physp_t*          p_req_physp  = p_ctxt->p_req_physp;
-  ib_member_rec_t             match_rec; // since we might change scope_state
+  ib_member_rec_t             match_rec; /* since we might change scope_state */
   ib_net64_t                  comp_mask    = p_ctxt->comp_mask;
   osm_mcm_port_t*             p_mcm_port;
   ib_net64_t portguid = p_rcvd_rec->port_gid.unicast.interface_id;
@@ -1433,7 +1438,7 @@
           "__osm_sa_mcm_by_comp_mask_cb: "
           "Checking mlid:0x%X\n",
           cl_ntoh16(p_mgrp->mlid ));
-  /* first try to eliminate the group by MGID, MLID or P_Key */
+  /* first try to eliminate the group by MGID, MLID, or P_Key */
   if ((IB_MCR_COMPMASK_MGID & comp_mask) &&
       cl_memcmp(&p_rcvd_rec->mgid, &p_mgrp->mcmember_rec.mgid, sizeof(ib_gid_t))) {
     goto Exit;
@@ -1490,10 +1495,10 @@
     sl_flow_hop_mask = sl_flow_hop_mask | 0x000F;
 
   if (IB_MCR_COMPMASK_FLOW & comp_mask)
-    sl_flow_hop_mask = sl_flow_hop_mask | 0x0FF0;
+    sl_flow_hop_mask = sl_flow_hop_mask | 0xFFFFFF0;
 
   if (IB_MCR_COMPMASK_HOP & comp_mask)
-    sl_flow_hop_mask = sl_flow_hop_mask | 0xF000;
+    sl_flow_hop_mask = sl_flow_hop_mask | 0xFF000000;
 
   if ((p_rcvd_rec->sl_flow_hop & sl_flow_hop_mask) !=
       (p_mgrp->mcmember_rec.sl_flow_hop & sl_flow_hop_mask)) goto Exit;







More information about the general mailing list