Annotation of qemu/roms/ipxe/src/net/infiniband/ib_mcast.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (C) 2007 Michael Brown <[email protected]>.
        !             3:  *
        !             4:  * This program is free software; you can redistribute it and/or
        !             5:  * modify it under the terms of the GNU General Public License as
        !             6:  * published by the Free Software Foundation; either version 2 of the
        !             7:  * License, or any later version.
        !             8:  *
        !             9:  * This program is distributed in the hope that it will be useful, but
        !            10:  * WITHOUT ANY WARRANTY; without even the implied warranty of
        !            11:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            12:  * General Public License for more details.
        !            13:  *
        !            14:  * You should have received a copy of the GNU General Public License
        !            15:  * along with this program; if not, write to the Free Software
        !            16:  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            17:  */
        !            18: 
        !            19: FILE_LICENCE ( GPL2_OR_LATER );
        !            20: 
        !            21: #include <stdint.h>
        !            22: #include <string.h>
        !            23: #include <byteswap.h>
        !            24: #include <errno.h>
        !            25: #include <ipxe/list.h>
        !            26: #include <ipxe/infiniband.h>
        !            27: #include <ipxe/ib_mi.h>
        !            28: #include <ipxe/ib_mcast.h>
        !            29: 
        !            30: /** @file
        !            31:  *
        !            32:  * Infiniband multicast groups
        !            33:  *
        !            34:  */
        !            35: 
        !            36: /**
        !            37:  * Generate multicast membership MAD
        !            38:  *
        !            39:  * @v ibdev            Infiniband device
        !            40:  * @v gid              Multicast GID
        !            41:  * @v join             Join (rather than leave) group
        !            42:  * @v mad              MAD to fill in
        !            43:  */
        !            44: static void ib_mcast_mad ( struct ib_device *ibdev, union ib_gid *gid,
        !            45:                           int join, union ib_mad *mad ) {
        !            46:        struct ib_mad_sa *sa = &mad->sa;
        !            47: 
        !            48:        /* Construct multicast membership record request */
        !            49:        memset ( sa, 0, sizeof ( *sa ) );
        !            50:        sa->mad_hdr.mgmt_class = IB_MGMT_CLASS_SUBN_ADM;
        !            51:        sa->mad_hdr.class_version = IB_SA_CLASS_VERSION;
        !            52:        sa->mad_hdr.method =
        !            53:                ( join ? IB_MGMT_METHOD_SET : IB_MGMT_METHOD_DELETE );
        !            54:        sa->mad_hdr.attr_id = htons ( IB_SA_ATTR_MC_MEMBER_REC );
        !            55:        sa->sa_hdr.comp_mask[1] =
        !            56:                htonl ( IB_SA_MCMEMBER_REC_MGID | IB_SA_MCMEMBER_REC_PORT_GID |
        !            57:                        IB_SA_MCMEMBER_REC_JOIN_STATE );
        !            58:        sa->sa_data.mc_member_record.scope__join_state = 1;
        !            59:        memcpy ( &sa->sa_data.mc_member_record.mgid, gid,
        !            60:                 sizeof ( sa->sa_data.mc_member_record.mgid ) );
        !            61:        memcpy ( &sa->sa_data.mc_member_record.port_gid, &ibdev->gid,
        !            62:                 sizeof ( sa->sa_data.mc_member_record.port_gid ) );
        !            63: }
        !            64: 
        !            65: /**
        !            66:  * Handle multicast membership record join response
        !            67:  *
        !            68:  * @v ibdev            Infiniband device
        !            69:  * @v mi               Management interface
        !            70:  * @v madx             Management transaction
        !            71:  * @v rc               Status code
        !            72:  * @v mad              Received MAD (or NULL on error)
        !            73:  * @v av               Source address vector (or NULL on error)
        !            74:  */
        !            75: static void ib_mcast_complete ( struct ib_device *ibdev,
        !            76:                                struct ib_mad_interface *mi __unused,
        !            77:                                struct ib_mad_transaction *madx,
        !            78:                                int rc, union ib_mad *mad,
        !            79:                                struct ib_address_vector *av __unused ) {
        !            80:        struct ib_mc_membership *membership = ib_madx_get_ownerdata ( madx );
        !            81:        struct ib_queue_pair *qp = membership->qp;
        !            82:        union ib_gid *gid = &membership->gid;
        !            83:        struct ib_mc_member_record *mc_member_record =
        !            84:                &mad->sa.sa_data.mc_member_record;
        !            85:        int joined;
        !            86:        unsigned long qkey;
        !            87: 
        !            88:        /* Report failures */
        !            89:        if ( ( rc == 0 ) && ( mad->hdr.status != htons ( IB_MGMT_STATUS_OK ) ))
        !            90:                rc = -ENOTCONN;
        !            91:        if ( rc != 0 ) {
        !            92:                DBGC ( ibdev, "IBDEV %p QPN %lx join failed: %s\n",
        !            93:                       ibdev, qp->qpn, strerror ( rc ) );
        !            94:                goto out;
        !            95:        }
        !            96: 
        !            97:        /* Extract values from MAD */
        !            98:        joined = ( mad->hdr.method == IB_MGMT_METHOD_GET_RESP );
        !            99:        qkey = ntohl ( mc_member_record->qkey );
        !           100:        DBGC ( ibdev, "IBDEV %p QPN %lx %s " IB_GID_FMT " qkey %lx\n",
        !           101:               ibdev, qp->qpn, ( joined ? "joined" : "left" ),
        !           102:               IB_GID_ARGS ( gid ), qkey );
        !           103: 
        !           104:        /* Set queue key */
        !           105:        qp->qkey = qkey;
        !           106:        if ( ( rc = ib_modify_qp ( ibdev, qp ) ) != 0 ) {
        !           107:                DBGC ( ibdev, "IBDEV %p QPN %lx could not modify qkey: %s\n",
        !           108:                       ibdev, qp->qpn, strerror ( rc ) );
        !           109:                goto out;
        !           110:        }
        !           111: 
        !           112:  out:
        !           113:        /* Destroy the completed transaction */
        !           114:        ib_destroy_madx ( ibdev, mi, madx );
        !           115:        membership->madx = NULL;
        !           116: 
        !           117:        /* Hand off to upper completion handler */
        !           118:        membership->complete ( ibdev, qp, membership, rc, mad );
        !           119: }
        !           120: 
        !           121: /** Multicast membership management transaction completion operations */
        !           122: static struct ib_mad_transaction_operations ib_mcast_op = {
        !           123:        .complete = ib_mcast_complete,
        !           124: };
        !           125: 
        !           126: /**
        !           127:  * Join multicast group
        !           128:  *
        !           129:  * @v ibdev            Infiniband device
        !           130:  * @v qp               Queue pair
        !           131:  * @v membership       Multicast group membership
        !           132:  * @v gid              Multicast GID to join
        !           133:  * @v joined           Join completion handler
        !           134:  * @ret rc             Return status code
        !           135:  */
        !           136: int ib_mcast_join ( struct ib_device *ibdev, struct ib_queue_pair *qp,
        !           137:                    struct ib_mc_membership *membership, union ib_gid *gid,
        !           138:                    void ( * complete ) ( struct ib_device *ibdev,
        !           139:                                          struct ib_queue_pair *qp,
        !           140:                                          struct ib_mc_membership *membership,
        !           141:                                          int rc, union ib_mad *mad ) ) {
        !           142:        union ib_mad mad;
        !           143:        int rc;
        !           144: 
        !           145:        DBGC ( ibdev, "IBDEV %p QPN %lx joining " IB_GID_FMT "\n",
        !           146:               ibdev, qp->qpn, IB_GID_ARGS ( gid ) );
        !           147: 
        !           148:        /* Initialise structure */
        !           149:        membership->qp = qp;
        !           150:        memcpy ( &membership->gid, gid, sizeof ( membership->gid ) );
        !           151:        membership->complete = complete;
        !           152: 
        !           153:        /* Attach queue pair to multicast GID */
        !           154:        if ( ( rc = ib_mcast_attach ( ibdev, qp, gid ) ) != 0 ) {
        !           155:                DBGC ( ibdev, "IBDEV %p QPN %lx could not attach: %s\n",
        !           156:                       ibdev, qp->qpn, strerror ( rc ) );
        !           157:                goto err_mcast_attach;
        !           158:        }
        !           159: 
        !           160:        /* Initiate multicast membership join */
        !           161:        ib_mcast_mad ( ibdev, gid, 1, &mad );
        !           162:        membership->madx = ib_create_madx ( ibdev, ibdev->gsi, &mad, NULL,
        !           163:                                            &ib_mcast_op );
        !           164:        if ( ! membership->madx ) {
        !           165:                DBGC ( ibdev, "IBDEV %p QPN %lx could not create join "
        !           166:                       "transaction\n", ibdev, qp->qpn );
        !           167:                rc = -ENOMEM;
        !           168:                goto err_create_madx;
        !           169:        }
        !           170:        ib_madx_set_ownerdata ( membership->madx, membership );
        !           171: 
        !           172:        return 0;
        !           173: 
        !           174:        ib_destroy_madx ( ibdev, ibdev->gsi, membership->madx );
        !           175:  err_create_madx:
        !           176:        ib_mcast_detach ( ibdev, qp, gid );
        !           177:  err_mcast_attach:
        !           178:        return rc;
        !           179: }
        !           180: 
        !           181: /**
        !           182:  * Leave multicast group
        !           183:  *
        !           184:  * @v ibdev            Infiniband device
        !           185:  * @v qp               Queue pair
        !           186:  * @v membership       Multicast group membership
        !           187:  */
        !           188: void ib_mcast_leave ( struct ib_device *ibdev, struct ib_queue_pair *qp,
        !           189:                      struct ib_mc_membership *membership ) {
        !           190:        union ib_gid *gid = &membership->gid;
        !           191:        union ib_mad mad;
        !           192:        int rc;
        !           193: 
        !           194:        DBGC ( ibdev, "IBDEV %p QPN %lx leaving " IB_GID_FMT "\n",
        !           195:               ibdev, qp->qpn, IB_GID_ARGS ( gid ) );
        !           196: 
        !           197:        /* Detach from multicast GID */
        !           198:        ib_mcast_detach ( ibdev, qp, &membership->gid );
        !           199: 
        !           200:        /* Cancel multicast membership join, if applicable */
        !           201:        if ( membership->madx ) {
        !           202:                ib_destroy_madx ( ibdev, ibdev->gsi, membership->madx );
        !           203:                membership->madx = NULL;
        !           204:        }
        !           205: 
        !           206:        /* Send a single group leave MAD */
        !           207:        ib_mcast_mad ( ibdev, &membership->gid, 0, &mad );
        !           208:        if ( ( rc = ib_mi_send ( ibdev, ibdev->gsi, &mad, NULL ) ) != 0 ) {
        !           209:                DBGC ( ibdev, "IBDEV %p QPN %lx could not send leave request: "
        !           210:                       "%s\n", ibdev, qp->qpn, strerror ( rc ) );
        !           211:        }
        !           212: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.