Annotation of qemu/roms/ipxe/src/net/infiniband/ib_mcast.c, revision 1.1.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.