📄 pdu_cont.cpp
字号:
/*=================================================================== Copyright (c) 1999 Hewlett-Packard Company ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS. Permission to use, copy, modify, distribute and/or sell this software and/or its documentation is hereby granted without fee. User agrees to display the above copyright notice and this license notice in all copies of the software and any documentation of the software. User agrees to assume all liability for the use of the software; Hewlett-Packard makes no representations about the suitability of this software for any purpose. It is provided "AS-IS without warranty of any kind,either express or implied. User hereby grants a royalty-free license to any and all derivatives based upon this software code base. P D U _ C O N T . C P P PDU CONTAINER CLASS IMPLEMENTATION DESIGN: Peter E Mellquist AUTHOR: Peter E Mellquist DATE: July 25, 1999 DESCRIPTION: This module contains the implementation for the pdu container class. LANGUAAGE: ANSI C++ OPERATING SYSTEM(S): Win32=====================================================================*/char pducls_cpp_version[]="#(@)SNMP++ 2.8 $Header: pdu_cont.cpp,v 1.10 96/03/16 16:02:46 hmgr Exp $";#include "pdu_cont.h" // include file for pdu class#include "winsnmp.h" // winsnmp include file#include "pdu.h" // include pdu class definition#include "snmperrs.h" // include snmp error messages#include "target.h"//--------------[ Pdu_Container::Pdu_Container() ]--------------------// constructor// initialize all the slots to not pending// clear all the statistic countersPdu_Container::Pdu_Container(){ int z; for (z=0;z<MAX_PDU_SLOTS;z++) slots[z] = NULL; // init stats pdus_sent = 0; pdus_received = 0; pdus_received_err = 0; pdus_sent_err = 0; timeout_count = 0; max_queue_size = 0; trap_count = 0; trap_sent = 0; decode_errors = 0; stray_responses = 0; invalid_pdu_types = 0; current_request_id = MAX_REQUEST_ID;};// destructorPdu_Container::~Pdu_Container(){ for (int z=0;z<MAX_PDU_SLOTS;z++) delete slots[z];};//-------[ search for any dangling enteries// for a given WinSNMP sessionvoid Pdu_Container::search_and_destroy( HSNMP_SESSION hSession, Snmp *snmp){ int z; for (z=0;z<MAX_PDU_SLOTS;z++) { if (( slots[z]!= NULL ) && ( slots[z]->hSession == hSession)) { if ( slots[z]->pdu_arrived ) { SNMPDEBUG("++ SNMP++, Search and Destroy Hit\n"); // check to see if it was an async request then // we need to inform the callback with the // SNMP_CLASS_SESSION_DESTROYED message if ( slots[z]->callback != NULL) { // fire destroy message to the specified callback SNMPDEBUG("++ SNMP++, Destroying Snmp Object Async Notify\n"); // we don't have the actual pdu, just the rid Pdu pdu; set_request_id( &pdu, slots[z]->RequestId); CTarget v1t; (slots[z]->callback)( (int) SNMP_CLASS_SESSION_DESTROYED, // reason (Snmp*) snmp, // snmp++ session who own the req (Pdu&) pdu, // pdu (SnmpTarget&) v1t, // target (void*) slots[z]->callback_data); // callback data } // free up the WinSNMP variables SnmpFreeEntity( slots[z]->hSourceEntity); SnmpFreeEntity( slots[z]->hDestEntity); SnmpFreeContext( slots[z]->hRecContext); SnmpFreeVbl( slots[z]->hRecVbl); } // free up the slot delete slots[z]; slots[z] = NULL; } };};//-------[ get a request id, don't save it in the pending table ]------long int Pdu_Container::get_request_id(){ current_request_id--; if (current_request_id < MIN_REQUEST_ID) current_request_id = MAX_REQUEST_ID; return current_request_id;};//--------[ get a request is from the pdu container class ]---------// this one records the rid in the pending tablelong int Pdu_Container::get_request_id( HSNMP_SESSION hSession, snmpcallback cb, void * cbd){ int z=0; while (z<MAX_PDU_SLOTS) { long int my_rid; if ( slots[z] == NULL) { current_request_id--; if (current_request_id < MIN_REQUEST_ID) current_request_id = MAX_REQUEST_ID; my_rid = current_request_id; slots[z] = new Pdu_Slot; if ( slots[z] == NULL) return -1; slots[z]->pending = TRUE; // this request is pending slots[z]->pdu_arrived = FALSE; // response has not arrived slots[z]->hSession = hSession; // no session handle slots[z]->request_id = my_rid; // set rid pending slots[z]->callback = cb; // remember callback ptr slots[z]->callback_data = cbd; // remember callback data set_max_queue( z); return my_rid; } z++; } return -1; // no slots available};//------------[ Pdu_Container::clear_request_id(long int rid) ]----------// clear the slot to make it available againvoid Pdu_Container::clear_request_id( const long int rid){ int w=0; while ( w < MAX_PDU_SLOTS) { if ((slots[w] != NULL) && ( slots[w]->request_id == rid)) { delete slots[w]; slots[w] = NULL; return; } w++; }};//----------[ Pdu_Container::check_if_arrived( long int rid) ]----------// check if a pending pdu has arrivedint Pdu_Container::check_if_arrived( const long int rid){ int w=0; // look through all the slots for a rid match // and an arrival while(w<MAX_PDU_SLOTS) { if (( slots[w] != NULL) &&( slots[w]->request_id == rid)&&(slots[w]->pdu_arrived)) return TRUE; w++; } return FALSE;};//------[ Pdu_Container::check_if_pending( long int rid) ]-----------// determine if a pdu slot is pending// received pdus are only placed into a slot// if it is pendingint Pdu_Container::check_if_pending( const long int rid, snmpcallback *cb){ int w=0; // look for a rid match and a pending request // if found, return the callback ptr while ( w<MAX_PDU_SLOTS) { if (( slots[w] != NULL) &&(slots[w]->request_id ==rid)&&(slots[w]->pending)) { *cb = slots[w]->callback; return TRUE; // don't pull the data out, just report it there } w++; } *cb = 0; return FALSE;};//---------[ Pdu_Container::set_slot ]----------------------------------// set a slot with an arrived pduvoid Pdu_Container::set_slot( long int rid, // slot to set as arrived HSNMP_SESSION hSession, // WinSnmp Session handle HSNMP_ENTITY hSourceEntity, // Source Entity HSNMP_ENTITY hDestEntity, // Destination Entity HSNMP_CONTEXT hRecContext, // Receive Context smiINT PduType, // Type of pdu smiINT RequestId, // Request ID smiINT ErrorStatus, // Error Status smiINT ErrorIndex, // Error Index HSNMP_VBL hRecVbl) // Received Variable Binding List{ int w=0; int z=-1; SNMPDEBUG("++ SNMP++, in Set Slot \n"); // find the slot while (w<MAX_PDU_SLOTS) { if (( slots[w] != NULL) &&( slots[w]->request_id == rid)) z = w; w++; } if ((z<0)||(z>=MAX_PDU_SLOTS)) return; slots[z]->pdu_arrived = TRUE; // mark as arrived // fill in the params slots[z]->hSession = hSession; slots[z]->hSourceEntity = hSourceEntity; slots[z]->hDestEntity = hDestEntity; slots[z]->hRecContext = hRecContext; slots[z]->PduType = PduType; slots[z]->RequestId = RequestId; slots[z]->ErrorStatus = ErrorStatus; slots[z]->ErrorIndex = ErrorIndex; slots[z]->hRecVbl = hRecVbl; SNMPDEBUG("++ SNMP++, Out Set Slot \n");};//------------[ Pdu_Container::get_slot ]------------------------------// get the data from a slot//void Pdu_Container::get_slot( long int rid, // for this rid HSNMP_ENTITY *hSrcRecvEnt, HSNMP_ENTITY *hDstRecvEnt, HSNMP_CONTEXT *hRecvContext, smiINT *lnRecvPduType, smiINT *lnRecvRequestId, smiINT *lnErrorStatus, smiINT *lnErrorIndex, snmpcallback *cb, void * *cbd, HSNMP_VBL *hRecvVbl){ int w=0; int z=-1; // find the slot while (w<MAX_PDU_SLOTS) { if ((slots[w] != NULL) &&( slots[w]->request_id == rid)) z = w; w++; } if ((z<0)||(z>=MAX_PDU_SLOTS)) return; // fill in the return variables *hSrcRecvEnt = slots[z]->hSourceEntity; *hDstRecvEnt = slots[z]->hDestEntity; *hRecvContext = slots[z]->hRecContext; *lnRecvPduType = slots[z]->PduType; *lnRecvRequestId = slots[z]->RequestId; *lnErrorStatus = slots[z]->ErrorStatus; *lnErrorIndex = slots[z]->ErrorIndex; *hRecvVbl = slots[z]->hRecVbl; *cb = slots[z]->callback; *cbd = slots[z]->callback_data; // clear the slot delete slots[z]; slots[z] = NULL;};// return the callback information for// a given request idint Pdu_Container::get_cb_info( long int rid, snmpcallback *cb, void * *cbd){ int w=0; int z=-1; // find the slot while (w<MAX_PDU_SLOTS) { if (( slots[w] != NULL ) &&( slots[w]->request_id == rid)&&( slots[w]->callback !=0)) z = w; w++; } if ((z<0)||(z>=MAX_PDU_SLOTS)) { *cb=0; *cbd=0; return FALSE; } // fill in the return variables *cb = slots[z]->callback; *cbd = slots[z]->callback_data; delete slots[z]; slots[z] = NULL; return TRUE;};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -