⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 con_000.cpp

📁 HIP 硬件设备管理标准接口
💻 CPP
字号:
/* * Stress test for the connection layer * * Copyright (c) 2004 by FORCE Computers * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  This * file and program are licensed under a BSD style license.  See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: *     Thomas Kanngieser <thomas.kanngieser@fci.com> * * This test requires: * - IPMI hardware with RMCP * - RMCP configuration like IP address, port, user, password *  * So it is not enabled by default. */#include <stdio.h>#include "ipmi_con_lan.h"#include <netdb.h>#include <string.h>#define dNumThreads 30#define dNumCmdsPerThread 100static const char    *host   = "192.168.110.187";static int            port   = 623;static const char    *user   = "kanne";static const char    *passwd = "kanne";static tIpmiAuthType  auth   = eIpmiAuthTypeNone;static tIpmiPrivilege priv   = eIpmiPrivilegeAdmin;static cIpmiConLan   *con  = 0;static int num_threads = 0;static int num_cmds = 0;cThreadLockRw lock;class cThreadTest : public cThread{  int m_id;  cIpmiAddr m_addr;public:  cThreadTest( int id, unsigned char slave_addr )    : m_id( id ), m_addr( eIpmiAddrTypeIpmb, 0, 0, slave_addr )  {  }  int SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp )  {    num_cmds++;    return con->ExecuteCmd( m_addr, msg, rsp );  }  void ClearSel()  {    lock.WriteLock();    // get a reservation    cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdReserveSel );    msg.m_data_len = 0;    cIpmiMsg rsp;    int rv = SendCommand( msg, rsp );    unsigned short reservation = IpmiGetUint16( rsp.m_data + 1 );    msg.m_netfn = eIpmiNetfnStorage;    msg.m_cmd   = eIpmiCmdClearSel;    IpmiSetUint16( msg.m_data, reservation );    msg.m_data[2] = 'C';    msg.m_data[3] = 'L';    msg.m_data[4] = 'R';    msg.m_data_len = 6;    bool first = true;    int count = 100;    do       {         msg.m_data[5] = first ? 0xaa : 0; // initiate erase/ erase status         first = false;         rsp.m_data[0] = 0xff;         rv = SendCommand( msg, rsp );       }    while( (rsp.m_data[1] & 0x7) != 0x1 && count-- > 0 );    lock.WriteUnlock();  }  void Cmd()  {    cIpmiMsg  msg( eIpmiNetfnStorage, eIpmiCmdAddSelEntry );    msg.m_data[0] = 0;    msg.m_data[1] = 0;    msg.m_data[2] = 0xc0;    msg.m_data[3] = 0;    msg.m_data[4] = 0;    msg.m_data[5] = 0;    msg.m_data[6] = 0;    msg.m_data[7] = 1;    msg.m_data[8] = 2;    msg.m_data[9] = 3;    msg.m_data[10] = 0;    msg.m_data[11] = 0;    msg.m_data[12] = 0;    msg.m_data[13] = 0;    msg.m_data[14] = 0;    msg.m_data[15] = 0;    msg.m_data_len = 16;    cIpmiMsg rsp;    lock.ReadLock();    for( int i = 0; i < 10; i++ )       {         int rv = SendCommand( msg, rsp );         if ( rv || rsp.m_data[0] )            {              lock.ReadUnlock();              ClearSel();              lock.ReadLock();             }       }    lock.ReadUnlock();  }  virtual void *Run()  {    num_threads++;    for( int i = 0; i < dNumCmdsPerThread; i++ )         Cmd();    num_threads--;    delete this;    return 0;  }};class cIpmiConLanTest : public cIpmiConLan{public:  cIpmiConLanTest( unsigned int timeout,                      struct in_addr addr, int por,                     tIpmiAuthType aut, tIpmiPrivilege pri,                      char *u, char *p )    : cIpmiConLan( timeout, 0, addr, por, aut, pri,                    u, p )  {  }  virtual ~cIpmiConLanTest()  {  }  virtual void HandleAsyncEvent( const cIpmiAddr & /*addr*/, const cIpmiMsg & /*msg*/ )  {  }};intmain( int /*argc*/, char * /*argv*/[] ){  stdlog.Open( dIpmiLogFile|dIpmiLogStdOut );  struct hostent *ent = gethostbyname( host );  if ( !ent )     {       stdlog << "unable to resolve IPMI LAN address: " << host << " !\n";       return 1;     }  struct in_addr lan_addr;  memcpy( &lan_addr, ent->h_addr_list[0], ent->h_length );  con = new cIpmiConLanTest( 5000,                             lan_addr, port,                             auth, priv,                             const_cast<char *>(user),                             const_cast<char *>(passwd) );  con->SetMaxOutstanding( 4 );  int rv = con->Open() ? 0 : 1;  if ( !rv )     {       time_t t0 = time( 0 );              for( int i = 0; i < dNumThreads; i++ )          {            cThreadTest *t = new cThreadTest( i, 0x20 );            t->Start();          }       sleep( 1 );       while( num_threads )          {            sleep( 1 );            stdlog << "### " << num_cmds << "\n";          }       time_t t = time( 0 ) - t0;       stdlog << "time: " << (int)t << "s\n";      }  delete con;  stdlog << num_cmds << " GetDeviceId\n";  stdlog.Close();  return rv;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -