snmpmsg.cpp

来自「JdonFramework need above jdk 1.4.0 This」· C++ 代码 · 共 832 行 · 第 1/2 页

CPP
832
字号
      tempvb.set_null();    status = convertVbToSmival( tempvb, &smival );    if ( status != SNMP_CLASS_SUCCESS) {      snmp_free_pdu( raw_pdu);      return status;    }    // add the vb to the raw pdu    snmp_add_var( raw_pdu, smioid->ptr, (int) smioid->len, &smival);    freeSmivalDescriptor( &smival);  }  // ASN1 encode the pdu#ifdef _SNMPv3  if (version == version3)  {    if ((!engine_id) || (!security_name))    {      LOG_BEGIN(ERROR_LOG | 4);      LOG("SNMPMessage: Need security name and engine id for v3 message");      LOG_END;      // prevention of SNMP++ Enterprise Oid death      if ( enterprise.len() >0) {	raw_pdu->enterprise = 0;	raw_pdu->enterprise_length=0;      }      snmp_free_pdu( raw_pdu);      return SNMP_CLASS_INVALID_TARGET;    }    status = v3MP::I->snmp_build(raw_pdu, databuff, (int *)&bufflen,				 *engine_id, *security_name, security_model,				 pdu->get_security_level(),				 pdu->get_context_engine_id(),				 pdu->get_context_name());    if (status == SNMPv3_MP_OK) {      if ((pdu->get_type() == sNMP_PDU_RESPONSE) &&          ((int)pdu->get_maxsize_scopedpdu() < pdu->get_asn1_length())) {	LOG_BEGIN(ERROR_LOG | 1);	LOG("SNMPMessage: *BUG*: Serialized response pdu is too big (len) (max)");	LOG(pdu->get_asn1_length());	LOG(pdu->get_maxsize_scopedpdu());	LOG_END;        // prevention of SNMP++ Enterprise Oid death        if ( enterprise.len() >0) {          raw_pdu->enterprise = 0;          raw_pdu->enterprise_length=0;        }        snmp_free_pdu( raw_pdu);        return SNMP_ERROR_TOO_BIG;      }    }  }  else#endif    status = snmp_build( raw_pdu, databuff, (int *) &bufflen, version,                         community.data(), (int) community.len());  LOG_BEGIN(DEBUG_LOG | 4);  LOG("SNMPMessage: return value for build message");  LOG(status);  LOG_END;  if ((status != 0)#ifdef _SNMPv3      && ((version != version3) || (status != SNMPv3_MP_OK))#endif      ) {    valid_flag = false;    // prevention of SNMP++ Enterprise Oid death    if ( enterprise.len() >0) {      raw_pdu->enterprise = 0;      raw_pdu->enterprise_length=0;    }    snmp_free_pdu( raw_pdu);#ifdef _SNMPv3    if (version == version3)      return status;    else#endif      // NOTE: This is an assumption - in most cases during normal      // operation the reason is a tooBig - another could be a      // damaged variable binding.      return SNMP_ERROR_TOO_BIG;  }  valid_flag = true;  // prevention of SNMP++ Enterprise Oid death  if ( enterprise.len() >0) {    raw_pdu->enterprise = 0;    raw_pdu->enterprise_length=0;  }  snmp_free_pdu( raw_pdu);  return SNMP_CLASS_SUCCESS;}// load up a SnmpMessageint SnmpMessage::load( unsigned char *data,                       unsigned long len){  bufflen = MAX_SNMP_PACKET;  valid_flag = false;  if (len <= MAX_SNMP_PACKET)  {    memcpy( (unsigned char *) databuff, (unsigned char *) data,            (unsigned int) len);    bufflen = len;    valid_flag = true;  }  else    return SNMP_ERROR_WRONG_LENGTH;  return SNMP_CLASS_SUCCESS;}// unload the data into SNMP++ objectsint SnmpMessage::unload(Pdu &pdu,                 // Pdu object			OctetStr &community,      // community object			snmp_version &version,    // SNMP version #                        OctetStr *engine_id,      // optional v3                        OctetStr *security_name,  // optional v3                        long int *security_model,                        UdpAddress *from_addr,                        Snmp *snmp_session){  pdu.clear();  if (!valid_flag)    return SNMP_CLASS_INVALID;  snmp_pdu *raw_pdu;  raw_pdu = snmp_pdu_create(0); // do a "snmp_free_pdu( raw_pdu)" before return  int status;#ifdef _SNMPv3  OctetStr context_engine_id;  OctetStr context_name;  long int security_level;  if ((security_model) && (security_name) && (engine_id) && (snmp_session)) {    status = v3MP::I->snmp_parse(snmp_session, raw_pdu,                         databuff, (int)bufflen, *engine_id,                         *security_name, context_engine_id, context_name,                         security_level, *security_model, version, *from_addr);    if (status != SNMPv3_MP_OK) {      pdu.set_request_id( raw_pdu->reqid);      pdu.set_type( raw_pdu->command);      snmp_free_pdu( raw_pdu);      return status;    }    pdu.set_context_engine_id(context_engine_id);    pdu.set_context_name(context_name);    pdu.set_security_level(security_level);    pdu.set_message_id(raw_pdu->msgid);    pdu.set_maxsize_scopedpdu(raw_pdu->maxsize_scopedpdu);  }  else {#endif    unsigned char community_name[MAX_LEN_COMMUNITY + 1];    int           community_len = MAX_LEN_COMMUNITY + 1;    status = snmp_parse(raw_pdu, databuff, (int) bufflen,                        community_name, community_len, version);    if (status != SNMP_CLASS_SUCCESS) {      snmp_free_pdu(raw_pdu);      return status;    }    community.set_data( community_name, community_len);#ifdef _SNMPv3  }#endif  // load up the SNMP++ variables  pdu.set_request_id(raw_pdu->reqid);  pdu.set_error_status((int) raw_pdu->errstat);  pdu.set_error_index((int) raw_pdu->errindex);  pdu.set_type( raw_pdu->command);  // deal with traps a little different  if ( raw_pdu->command == sNMP_PDU_V1TRAP) {    // timestamp    TimeTicks timestamp;    timestamp = raw_pdu->time;    pdu.set_notify_timestamp( timestamp);    // set the agent address    IpAddress agent_addr(inet_ntoa(raw_pdu->agent_addr.sin_addr));    if (agent_addr != "0.0.0.0")    {      pdu.set_v1_trap_address(agent_addr);      LOG_BEGIN(DEBUG_LOG | 4);      LOG("SNMPMessage: Trap address of received v1 trap");      LOG(agent_addr.get_printable());      LOG_END;    }    // set enterprise, notifyid    Oid enterprise;    if (raw_pdu->enterprise_length >0) {      for (int i=0; i< raw_pdu->enterprise_length; i++) {        enterprise += (int) (raw_pdu->enterprise[i]);      }      pdu.set_notify_enterprise(enterprise);    }    switch (raw_pdu->trap_type) {    case 0:      pdu.set_notify_id(coldStart);      break;    case 1:      pdu.set_notify_id(warmStart);      break;    case 2:      pdu.set_notify_id(linkDown);      break;    case 3:      pdu.set_notify_id(linkUp);      break;    case 4:      pdu.set_notify_id(authenticationFailure);      break;    case 5:      pdu.set_notify_id(egpNeighborLoss);      break;    case 6: { // enterprise specific      // base id + specific #      Oid eOid = enterprise;      eOid += 0ul;      eOid += raw_pdu->specific_type;      pdu.set_notify_id( eOid);      break;      }    default:      {	LOG_BEGIN(WARNING_LOG | 3);	LOG("SNMPMessage: Received trap with illegal trap type");	LOG(raw_pdu->trap_type);	LOG_END;      }    }  }  // vbs  Vb tempvb;  Oid tempoid;  struct   variable_list *vp;  int vb_nr = 1;  for(vp = raw_pdu->variables; vp; vp = vp->next_variable, vb_nr++) {    // extract the oid portion    tempoid.set_data( (unsigned long *)vp->name,                      ( unsigned int) vp->name_length);    tempvb.set_oid( tempoid);    // extract the value portion    switch(vp->type){      // octet string    case sNMP_SYNTAX_OCTETS:      {	OctetStr octets( (unsigned char *) vp->val.string,			 (unsigned long) vp->val_len);	tempvb.set_value( octets);      }      break;    case sNMP_SYNTAX_OPAQUE:      {	OpaqueStr octets( (unsigned char *) vp->val.string,		          (unsigned long) vp->val_len);	tempvb.set_value( octets);      }      break;      // object id    case sNMP_SYNTAX_OID:      {	Oid oid( (unsigned long*) vp->val.objid,		 (int) vp->val_len);	tempvb.set_value( oid);        if ((vb_nr == 2) &&            ((raw_pdu->command == sNMP_PDU_TRAP) ||             (raw_pdu->command == sNMP_PDU_INFORM)) &&            (tempoid == SNMP_MSG_OID_TRAPID))        {          // set notify_id          pdu.set_notify_id(oid);	  continue; // don't add vb to pdu        }      }      break;      // timeticks    case sNMP_SYNTAX_TIMETICKS:      {	TimeTicks timeticks( (unsigned long) *(vp->val.integer));	tempvb.set_value( timeticks);        if ((vb_nr == 1) &&            ((raw_pdu->command == sNMP_PDU_TRAP) ||             (raw_pdu->command == sNMP_PDU_INFORM)) &&            (tempoid == SNMP_MSG_OID_SYSUPTIME))        {          // set notify_timestamp          pdu.set_notify_timestamp( timeticks);	  continue; // don't add vb to pdu        }      }      break;      // 32 bit counter    case sNMP_SYNTAX_CNTR32:      {	Counter32 counter32( (unsigned long) *(vp->val.integer));	tempvb.set_value( counter32);      }      break;      // 32 bit gauge    case sNMP_SYNTAX_GAUGE32:      {	Gauge32 gauge32( (unsigned long) *(vp->val.integer));	tempvb.set_value( gauge32);      }      break;      // ip address    case sNMP_SYNTAX_IPADDR:      {	char buffer[42];	if (vp->val_len == 16)	  sprintf( buffer, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:"		   "%02x%02x:%02x%02x:%02x%02x:%02x%02x",		   vp->val.string[ 0], vp->val.string[ 1], vp->val.string[ 2],		   vp->val.string[ 3], vp->val.string[ 4], vp->val.string[ 5],		   vp->val.string[ 6], vp->val.string[ 7], vp->val.string[ 8],		   vp->val.string[ 9], vp->val.string[10], vp->val.string[11],		   vp->val.string[12], vp->val.string[13], vp->val.string[14],		   vp->val.string[15]);	else	  sprintf( buffer,"%d.%d.%d.%d",		   vp->val.string[0], vp->val.string[1],		   vp->val.string[2], vp->val.string[3]);	IpAddress ipaddress( buffer);	tempvb.set_value( ipaddress);      }      break;      // 32 bit integer    case sNMP_SYNTAX_INT:      {	SnmpInt32 int32( (long) *(vp->val.integer));	tempvb.set_value( int32);      }      break;      // 32 bit unsigned integer/* Not distinguishable from Gauge32    case sNMP_SYNTAX_UINT32:      {	SnmpUInt32 uint32( (unsigned long) *(vp->val.integer));	tempvb.set_value( uint32);      }      break;*/      // v2 counter 64's    case sNMP_SYNTAX_CNTR64:      { // Frank Fock (was empty before)	Counter64 c64(((counter64*)vp->val.counter64)->high,		      ((counter64*)vp->val.counter64)->low);	tempvb.set_value( c64);	break;      }    case sNMP_SYNTAX_NULL:	    tempvb.set_null();	    break;		    // v2 vb exceptions    case sNMP_SYNTAX_NOSUCHOBJECT:    case sNMP_SYNTAX_NOSUCHINSTANCE:    case sNMP_SYNTAX_ENDOFMIBVIEW:      tempvb.set_exception_status(vp->type);      break;    default:      tempvb.set_null();    } // end switch    // append the vb to the pdu    pdu += tempvb;  }  snmp_free_pdu( raw_pdu);  return SNMP_CLASS_SUCCESS;}#ifdef SNMP_PP_NAMESPACE}; // end of namespace Snmp_pp#endif 

⌨️ 快捷键说明

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