コード例 #1
0
def cmd_ibsysstat(argv, o):
    """Request the system information MAD
       Usage: %prog [TARGET ping|host|cpu|cpi]

       This program must be running in server mode on the target end port."""
    libibtool.vendstruct.install_vend()
    LibIBOpts.setup(o)
    o.add_option("-S",
                 action="store_true",
                 dest="server",
                 help="Run as a server")
    (args, values) = o.parse_args(argv)
    lib = LibIBOpts(o, args, values, 2, (tmpl_target, tmpl_ofa_vend))

    if args.server:
        # FIXME: This should really set the capability mask bit, I wonder how?
        # But Mellanox HCA already set it for their own uses. What a silly
        # bit.
        global cpi
        cpi = IBA.MADClassPortInfo()
        cpi.baseVersion = IBA.MAD_BASE_VERSION
        cpi.classVersion = libibtool.vendstruct.OFASysStatFormat.MAD_CLASS_VERSION
        cpi.respTimeValue = 16
        cpi.redirectQKey = cpi.trapQKey = IBA.IB_DEFAULT_QP1_QKEY
        if len(values) != 0:
            raise CmdError("Too many arguments.")
        with lib.get_umad_for_target(gmp=True) as umad:
            agent_id = umad.register_server_fmt(
                libibtool.vendstruct.OFASysStatFormat)
            while True:
                buf, path = umad.recvfrom(None)
                if path.umad_agent_id != agent_id:
                    continue
                try:
                    handle_packet(umad, buf, path)
                except rdma.MADError as err:
                    err.dump_detailed(sys.stderr, "E:", level=1)
                    umad.send_error_exc(err)
        return lib.done()

    if len(values) != 2:
        raise CmdError("Expect 2 arguments.")

    with lib.get_umad_for_target(values[0], gmp=True) as umad:
        path = lib.path
        vinf = umad.VendGet(values[1], path)
        vinf.printer(sys.stdout, **lib.format_args)
    return lib.done()