int CNotifyEvent::Callback(SnmpTarget &target, Pdu &pdu, SnmpSocket fd, int status) { Oid trapid; pdu.get_notify_id(trapid); (void)fd; // Make the callback if the trap passed the filters if ((m_snmp) && (notify_filter(trapid, target))) { int reason; if (SNMP_CLASS_TL_FAILED == status) reason = SNMP_CLASS_TL_FAILED; else reason = SNMP_CLASS_NOTIFICATION; //------[ call into the callback function ]------------------------- if (m_snmp->get_notify_callback()) (m_snmp->get_notify_callback())( reason, m_snmp, // snmp++ session who owns the req pdu, // trap pdu target, // target m_snmp->get_notify_callback_data()); // callback data } return SNMP_CLASS_SUCCESS; }
void MainWindow::async_callback(int reason, Snmp * /*snmp*/, Pdu &pdu, SnmpTarget &target) { Vb nextVb; int pdu_error; QString prefix_text; QString notify_text; push_button_get_next->setEnabled(true); // What is the reason for this callback? if (reason == SNMP_CLASS_NOTIFICATION) { prefix_text = "Trap: "; // get the notify id for traps Oid id; pdu.get_notify_id(id); notify_text = QString(" ID: %1 Type %2 -- ").arg(id.get_printable()) .arg(pdu.get_type()); } else if (reason == SNMP_CLASS_ASYNC_RESPONSE) { prefix_text = "Response "; } else if (reason == SNMP_CLASS_TIMEOUT) { prefix_text = "Timeout "; } else { QString err = QString("\nDid not receive async response/trap: (%1) %2\n") .arg(reason).arg(Snmp::error_msg(reason)); text_edit_output->append(err); } // Look at the error status of the Pdu pdu_error = pdu.get_error_status(); if (pdu_error) { QString err = "\nResponse contains error:\n"; err += Snmp::error_msg(pdu_error); text_edit_output->append(err); return; } // The Pdu must contain at least one Vb if (pdu.get_vb_count() == 0) { QString err = "\nPdu is empty\n"; text_edit_output->append(err); return; } for (int i=0; i<pdu.get_vb_count(); i++) { // Get the Vb of the Pdu pdu.get_vb(nextVb, i); // Get Oid and value from the Vb and display it line_edit_obj_id->setText(nextVb.get_printable_oid()); line_edit_value->setText(nextVb.get_printable_value()); text_edit_output->append(prefix_text + target.get_address().get_printable() + " -- " + notify_text + line_edit_obj_id->text() + " = " + line_edit_value->text() + "\n"); } // If we received a inform pdu, we have to send a response if (pdu.get_type() == sNMP_PDU_INFORM) { text_edit_output->append("Sending response to inform.\n"); // just change the value of the first vb pdu.get_vb(nextVb, 0); nextVb.set_value("This is the response."); pdu.set_vb(nextVb, 0); snmp->response(pdu, target); } }
int wpdu::set_trap_info(snmp_pdu *raw_pdu, const Pdu& pdu) const { Oid enterprise; Oid trapid; // validate caller has set this correctly pdu.get_notify_id( trapid); if ( !trapid.valid() || trapid.length() < 2 ) { cmu_snmp::free_pdu( raw_pdu); return SNMP_CLASS_INVALID_NOTIFYID; } raw_pdu->specific_type=0; // TODO: object should emit numeric instead of this kind of mess... if ( trapid == coldStart) raw_pdu->trap_type = V1_COLD_START; // cold start else if ( trapid == warmStart) raw_pdu->trap_type = V1_WARM_START; // warm start else if( trapid == linkDown) raw_pdu->trap_type = V1_LINK_DOWN; // link down else if ( trapid == linkUp) raw_pdu->trap_type = V1_LINK_UP; // link up else if ( trapid == authenticationFailure ) raw_pdu->trap_type = V1_AUTH_FAILURE; // authentication failure else if ( trapid == egpNeighborLoss) raw_pdu->trap_type = V1_EGP_NEIGHBOR_LOSS; // egp neighbor loss else { raw_pdu->trap_type = V1_ENT_SPECIFIC; // enterprise specific // last oid subid is the specific value // if 2nd to last subid is "0", remove it // enterprise is always the notify oid prefix raw_pdu->specific_type = (int) trapid[(int) (trapid.length() - 1)]; trapid.trim(1); if ( trapid[(int)(trapid.length() - 1)] == 0 ) trapid.trim(1); enterprise = trapid; } if ( raw_pdu->trap_type != V1_ENT_SPECIFIC) pdu.get_notify_enterprise( enterprise); if ( enterprise.length() > 0) { // note!! To the contrary, enterprise OID val is // copied here and raw_pdu->enterprise is freed in free_pdu // as it should be (HDN) // these are hooks into an SNMP++ oid // and therefor the raw_pdu enterprise // should not free them. null them out!! SmiLPOID rawOid; rawOid = enterprise.oidval(); // HDN - enterprise is a local object, cannot simply assign pointer //raw_pdu->enterprise = rawOid->ptr; raw_pdu->enterprise_length = (int) rawOid->len; ACE_NEW_RETURN(raw_pdu->enterprise, oid[raw_pdu->enterprise_length],-1); ACE_OS::memcpy((char *)raw_pdu->enterprise,(char *)rawOid->ptr, raw_pdu->enterprise_length * sizeof(oid)); } TimeTicks timestamp; pdu.get_notify_timestamp( timestamp); raw_pdu->time = ( unsigned long) timestamp; // HDN - set agent addr using the local hostname if possible char localHostName[MAXHOSTNAMELEN]; Snmp::get_host_name(localHostName, MAXHOSTNAMELEN); if (ACE_OS::strlen(localHostName) > 0) { GenAddress addr(localHostName); OctetStr octet; addr.to_octet(octet); ACE_OS::memcpy(&(raw_pdu->agent_addr.sin_addr), octet.data(), octet.length()); } return 0; }