On Fri, Nov 13, 2009 at 3:40 PM, Sasha Khapyorsky <[email protected]> wrote: > > This is rework of previously used IPv6 SNM groups compression workaround > using newly proposed "many MGID to single MLID" mapping infrastructure. > > Unlike previous solution where all IPv6 Solicited node multicast (SNM) > requests were collapsed into a single multicast group in OpenSM, now > each IPv6 SNM group is represented as a separate multicast group and > all groups sharing same P_Key and scope values use a same MLID value.
Shouldn't this also ensure groups sharing MLIDs have the same MTU, rate, and packet lifetime ? > The compression method itself should be faster now because MLID sharing > criteria (matching IPv6 SNM MGID signature) is performed only once when > multicast group is created (and not each time when get MC group by MGID > lookup was performed). > > This solution should be fully IBA complaint. Why the should qualification ? Shouldn't the IBA compliant issues fixed be documented here ? -- Hal > As before this feature is switched on by using 'consolidate_ipv6_snm_req' > command line or/and configuration option. > > Signed-off-by: Sasha Khapyorsky <[email protected]> > --- > opensm/opensm/osm_sa_mcmember_record.c | 68 ++++++++++++++++++------------- > 1 files changed, 39 insertions(+), 29 deletions(-) > > diff --git a/opensm/opensm/osm_sa_mcmember_record.c > b/opensm/opensm/osm_sa_mcmember_record.c > index 27675b6..58c5736 100644 > --- a/opensm/opensm/osm_sa_mcmember_record.c > +++ b/opensm/opensm/osm_sa_mcmember_record.c > @@ -114,6 +114,35 @@ static void free_mlid(IN osm_sa_t * sa, IN uint16_t mlid) > /********************************************************************* > Get a new unused mlid by scanning all the used ones in the subnet. > **********************************************************************/ > +/* Special Case IPv6 Solicited Node Multicast (SNM) addresses */ > +/* 0xff1Z601bXXXX0000 : 0x00000001ffYYYYYY */ > +/* Where Z is the scope, XXXX is the P_Key, and > + * YYYYYY is the last 24 bits of the port guid */ > +#define PREFIX_MASK CL_HTON64(0xff10ffff0000ffffULL) > +#define PREFIX_SIGNATURE CL_HTON64(0xff10601b00000000ULL) > +#define INT_ID_MASK CL_HTON64(0xfffffff1ff000000ULL) > +#define INT_ID_SIGNATURE CL_HTON64(0x00000001ff000000ULL) > + > +static int compare_ipv6_snm_mgids(const void *m1, const void *m2) > +{ > + return memcmp(m1, m2, sizeof(ib_gid_t) - 6); > +} > + > +static ib_net16_t find_ipv6_snm_mlid(osm_subn_t *subn, ib_gid_t *mgid) > +{ > + osm_mgrp_t *m = (osm_mgrp_t *)cl_fmap_match(&subn->mgrp_mgid_tbl, > mgid, > + compare_ipv6_snm_mgids); > + if (m != (osm_mgrp_t *)cl_fmap_end(&subn->mgrp_mgid_tbl)) > + return m->mlid; > + return 0; > +} > + > +static unsigned match_ipv6_snm_mgid(ib_gid_t * mgid) > +{ > + return ((mgid->unicast.prefix & PREFIX_MASK) == PREFIX_SIGNATURE && > + (mgid->unicast.interface_id & INT_ID_MASK) == > INT_ID_SIGNATURE); > +} > + > static ib_net16_t get_new_mlid(osm_sa_t * sa, ib_member_rec_t * mcmr) > { > osm_subn_t *p_subn = sa->p_subn; > @@ -125,6 +154,16 @@ static ib_net16_t get_new_mlid(osm_sa_t * sa, > ib_member_rec_t * mcmr) > && !osm_get_mbox_by_mlid(p_subn, requested_mlid)) > return requested_mlid; > > + if (sa->p_subn->opt.consolidate_ipv6_snm_req > + && match_ipv6_snm_mgid(&mcmr->mgid) > + && (requested_mlid = find_ipv6_snm_mlid(sa->p_subn, > &mcmr->mgid))) { > + char str[INET6_ADDRSTRLEN]; > + OSM_LOG(sa->p_log, OSM_LOG_DEBUG, > + "Special Case Solicited Node Mcast Join for MGID > %s\n", > + inet_ntop(AF_INET6, mcmr->mgid.raw, str, > sizeof(str))); > + return requested_mlid; > + } > + > max = p_subn->max_mcast_lid_ho - IB_LID_MCAST_START_HO + 1; > for (i = 0; i < max; i++) > if (!sa->p_subn->mboxes[i]) > @@ -829,39 +868,10 @@ Exit: > return status; > } > > -#define PREFIX_MASK CL_HTON64(0xff10ffff0000ffffULL) > -#define PREFIX_SIGNATURE CL_HTON64(0xff10601b00000000ULL) > -#define INT_ID_MASK CL_HTON64(0xfffffff1ff000000ULL) > -#define INT_ID_SIGNATURE CL_HTON64(0x00000001ff000000ULL) > - > -/* Special Case IPv6 Solicited Node Multicast (SNM) addresses */ > -/* 0xff1Z601bXXXX0000 : 0x00000001ffYYYYYY */ > -/* Where Z is the scope, XXXX is the P_Key, and > - * YYYYYY is the last 24 bits of the port guid */ > -static unsigned match_and_update_ipv6_snm_mgid(ib_gid_t * mgid) > -{ > - if ((mgid->unicast.prefix & PREFIX_MASK) == PREFIX_SIGNATURE && > - (mgid->unicast.interface_id & INT_ID_MASK) == INT_ID_SIGNATURE) { > - mgid->unicast.prefix &= PREFIX_MASK; > - mgid->unicast.interface_id &= INT_ID_MASK; > - return 1; > - } > - return 0; > -} > - > osm_mgrp_t *osm_get_mgrp_by_mgid(IN osm_sa_t * sa, IN ib_gid_t * p_mgid) > { > osm_mgrp_t *mg; > > - if (sa->p_subn->opt.consolidate_ipv6_snm_req && > - match_and_update_ipv6_snm_mgid(p_mgid)) { > - char gid_str[INET6_ADDRSTRLEN]; > - OSM_LOG(sa->p_log, OSM_LOG_DEBUG, > - "Special Case Solicited Node Mcast Join for MGID > %s\n", > - inet_ntop(AF_INET6, p_mgid->raw, gid_str, > - sizeof gid_str)); > - } > - > mg = (osm_mgrp_t *)cl_fmap_get(&sa->p_subn->mgrp_mgid_tbl, p_mgid); > if (mg != (osm_mgrp_t *)cl_fmap_end(&sa->p_subn->mgrp_mgid_tbl)) > return mg; > -- > 1.6.5.2 > > -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
