00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 #ifndef _PSNMP_H
00076 #define _PSNMP_H
00077
00078 #ifdef P_USE_PRAGMA
00079 #pragma interface
00080 #endif
00081
00082 #include <ptlib/sockets.h>
00083 #include <ptclib/pasn.h>
00084
00085
00087
00090 class PSNMPVarBindingList : public PObject
00091 {
00092 PCLASSINFO(PSNMPVarBindingList, PObject)
00093 public:
00094
00095 void Append(const PString & objectID);
00096 void Append(const PString & objectID, PASNObject * obj);
00097 void AppendString(const PString & objectID, const PString & str);
00098
00099 void RemoveAll();
00100
00101 PINDEX GetSize() const;
00102
00103 PString GetObjectID(PINDEX idx) const;
00104 PASNObject & operator[](PINDEX idx) const;
00105
00106 void PrintOn(ostream & strm) const;
00107
00108 protected:
00109 PStringList objectIds;
00110 PASNObjectList values;
00111 };
00112
00114
00117 class PSNMP : public PIndirectChannel
00118 {
00119 PCLASSINFO(PSNMP, PIndirectChannel)
00120 public:
00121 enum ErrorType {
00122
00123 NoError = 0,
00124 TooBig = 1,
00125 NoSuchName = 2,
00126 BadValue = 3,
00127 ReadOnly = 4,
00128 GenErr = 5,
00129
00130
00131 NoResponse,
00132 MalformedResponse,
00133 SendFailed,
00134 RxBufferTooSmall,
00135 TxDataTooBig,
00136 NumErrors
00137 };
00138
00139 enum RequestType {
00140 GetRequest = 0,
00141 GetNextRequest = 1,
00142 GetResponse = 2,
00143 SetRequest = 3,
00144 Trap = 4,
00145 };
00146
00147 enum { TrapPort = 162 };
00148
00149 enum TrapType {
00150 ColdStart = 0,
00151 WarmStart = 1,
00152 LinkDown = 2,
00153 LinkUp = 3,
00154 AuthenticationFailure = 4,
00155 EGPNeighbourLoss = 5,
00156 EnterpriseSpecific = 6,
00157 NumTrapTypes
00158 };
00159
00160 static PString GetErrorText(ErrorType err);
00161
00162 static PString GetTrapTypeText(PINDEX code);
00163
00164 static void SendEnterpriseTrap (
00165 const PIPSocket::Address & addr,
00166 const PString & community,
00167 const PString & enterprise,
00168 PINDEX specificTrap,
00169 PASNUnsigned timeTicks,
00170 WORD sendPort = TrapPort);
00171
00172 static void SendEnterpriseTrap (
00173 const PIPSocket::Address & addr,
00174 const PString & community,
00175 const PString & enterprise,
00176 PINDEX specificTrap,
00177 PASNUnsigned timeTicks,
00178 const PSNMPVarBindingList & vars,
00179 WORD sendPort = TrapPort);
00180
00181 static void SendTrap (
00182 const PIPSocket::Address & addr,
00183 PSNMP::TrapType trapType,
00184 const PString & community,
00185 const PString & enterprise,
00186 PINDEX specificTrap,
00187 PASNUnsigned timeTicks,
00188 const PSNMPVarBindingList & vars,
00189 WORD sendPort = TrapPort);
00190
00191 static void SendTrap (
00192 const PIPSocket::Address & addr,
00193 PSNMP::TrapType trapType,
00194 const PString & community,
00195 const PString & enterprise,
00196 PINDEX specificTrap,
00197 PASNUnsigned timeTicks,
00198 const PSNMPVarBindingList & vars,
00199 const PIPSocket::Address & agentAddress,
00200 WORD sendPort = TrapPort);
00201
00202 static void WriteTrap ( PChannel & channel,
00203 PSNMP::TrapType trapType,
00204 const PString & community,
00205 const PString & enterprise,
00206 PINDEX specificTrap,
00207 PASNUnsigned timeTicks,
00208 const PSNMPVarBindingList & vars,
00209 const PIPSocket::Address & agentAddress);
00210
00211 static BOOL DecodeTrap(const PBYTEArray & readBuffer,
00212 PINDEX & version,
00213 PString & community,
00214 PString & enterprise,
00215 PIPSocket::Address & address,
00216 PINDEX & genericTrapType,
00217 PINDEX & specificTrapType,
00218 PASNUnsigned & timeTicks,
00219 PSNMPVarBindingList & varsOut);
00220 };
00221
00222
00224
00227 class PSNMPClient : public PSNMP
00228 {
00229 PCLASSINFO(PSNMPClient, PSNMP)
00230 public:
00231 PSNMPClient(const PString & host,
00232 PINDEX retryMax = 5,
00233 PINDEX timeoutMax = 5,
00234 PINDEX rxBufferSize = 1500,
00235 PINDEX txSize = 484);
00236
00237 PSNMPClient(PINDEX retryMax = 5,
00238 PINDEX timeoutMax = 5,
00239 PINDEX rxBufferSize = 1500,
00240 PINDEX txSize = 484);
00241
00242 void SetVersion(PASNInt version);
00243 PASNInt GetVersion() const;
00244
00245 void SetCommunity(const PString & str);
00246 PString GetCommunity() const;
00247
00248 void SetRequestID(PASNInt requestID);
00249 PASNInt GetRequestID() const;
00250
00251 BOOL WriteGetRequest (PSNMPVarBindingList & varsIn,
00252 PSNMPVarBindingList & varsOut);
00253
00254 BOOL WriteGetNextRequest (PSNMPVarBindingList & varsIn,
00255 PSNMPVarBindingList & varsOut);
00256
00257 BOOL WriteSetRequest (PSNMPVarBindingList & varsIn,
00258 PSNMPVarBindingList & varsOut);
00259
00260 ErrorType GetLastErrorCode() const;
00261 PINDEX GetLastErrorIndex() const;
00262 PString GetLastErrorText() const;
00263
00264 protected:
00265 BOOL WriteRequest (PASNInt requestCode,
00266 PSNMPVarBindingList & varsIn,
00267 PSNMPVarBindingList & varsOut);
00268
00269
00270 BOOL ReadRequest(PBYTEArray & readBuffer);
00271
00272 PString hostName;
00273 PString community;
00274 PASNInt requestId;
00275 PASNInt version;
00276 PINDEX retryMax;
00277 PINDEX lastErrorIndex;
00278 ErrorType lastErrorCode;
00279 PBYTEArray readBuffer;
00280 PINDEX maxRxSize;
00281 PINDEX maxTxSize;
00282 };
00283
00284
00286
00289 class PSNMPServer : public PSNMP
00290 {
00291 PCLASSINFO(PSNMPServer, PSNMP)
00292 public:
00293
00294 virtual void OnGetRequest (PSNMPVarBindingList & vars);
00295 virtual void OnGetNextRequest (PSNMPVarBindingList & vars);
00296 virtual void OnSetRequest (PSNMPVarBindingList & vars);
00297
00298 BOOL SendGetResponse (PSNMPVarBindingList & vars);
00299 };
00300
00301 #endif
00302
00303
00304