Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 147 | f9daq | 1 | #ifndef _NETSNMPLIB_H |
| 2 | #define _NETSNMPLIB_H |
||
| 3 | |||
| 4 | |||
| 5 | #define false 0; |
||
| 6 | #define true 1; |
||
| 7 | |||
| 8 | |||
| 9 | #include <winsock2.h> |
||
| 10 | #include <ws2tcpip.h> |
||
| 11 | #include <stdio.h> |
||
| 12 | |||
| 13 | |||
| 14 | #include <net-snmp/net-snmp-config.h> |
||
| 15 | |||
| 16 | |||
| 17 | /* |
||
| 18 | * Basic system type definitions, taken from the BSD file sys/types.h. |
||
| 19 | */ |
||
| 20 | typedef unsigned char u_char; |
||
| 21 | typedef unsigned short u_short; |
||
| 22 | typedef unsigned int u_int; |
||
| 23 | typedef unsigned long u_long; |
||
| 24 | |||
| 25 | #include <net-snmp/library/asn1.h> |
||
| 26 | #include <net-snmp/library/snmp.h> |
||
| 27 | |||
| 28 | |||
| 29 | #define SNMP_VERSION_2c 1 |
||
| 30 | typedef void *HSNMP; // SNMP handle (like FILE) |
||
| 31 | |||
| 32 | |||
| 33 | |||
| 34 | /* |
||
| 35 | * For the initial release, this will just refer to the |
||
| 36 | * relevant UCD header files. |
||
| 37 | * In due course, the types and structures relevant to the |
||
| 38 | * Net-SNMP API will be identified, and defined here directly. |
||
| 39 | * |
||
| 40 | * But for the time being, this header file is primarily a placeholder, |
||
| 41 | * to allow application writers to adopt the new header file names. |
||
| 42 | */ |
||
| 43 | |||
| 44 | typedef union { |
||
| 45 | long *integer; |
||
| 46 | u_char *string; |
||
| 47 | oid *objid; |
||
| 48 | u_char *bitstring; |
||
| 49 | struct counter64 *counter64; |
||
| 50 | #ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES |
||
| 51 | float *floatVal; |
||
| 52 | double *doubleVal; |
||
| 53 | /* |
||
| 54 | * t_union *unionVal; |
||
| 55 | */ |
||
| 56 | #endif /* NETSNMP_WITH_OPAQUE_SPECIAL_TYPES */ |
||
| 57 | } netsnmp_vardata; |
||
| 58 | |||
| 59 | |||
| 60 | /** @typedef struct variable_list netsnmp_variable_list |
||
| 61 | * Typedefs the variable_list struct into netsnmp_variable_list */ |
||
| 62 | /** @struct variable_list |
||
| 63 | * The netsnmp variable list binding structure, it's typedef'd to |
||
| 64 | * netsnmp_variable_list. |
||
| 65 | */ |
||
| 66 | typedef struct variable_list { |
||
| 67 | /** NULL for last variable */ |
||
| 68 | struct variable_list *next_variable; |
||
| 69 | /** Object identifier of variable */ |
||
| 70 | oid *name; |
||
| 71 | /** number of subid's in name */ |
||
| 72 | size_t name_length; |
||
| 73 | /** ASN type of variable */ |
||
| 74 | u_char type; |
||
| 75 | /** value of variable */ |
||
| 76 | netsnmp_vardata val; |
||
| 77 | /** the length of the value to be copied into buf */ |
||
| 78 | size_t val_len; |
||
| 79 | /** 90 percentile < 24. */ |
||
| 80 | oid name_loc[MAX_OID_LEN]; |
||
| 81 | /** 90 percentile < 40. */ |
||
| 82 | u_char buf[40]; |
||
| 83 | /** (Opaque) hook for additional data */ |
||
| 84 | void *data; |
||
| 85 | /** callback to free above */ |
||
| 86 | void (*dataFreeHook)(void *); |
||
| 87 | int index; |
||
| 88 | } netsnmp_variable_list; |
||
| 89 | |||
| 90 | /** @typedef struct snmp_pdu to netsnmp_pdu |
||
| 91 | * Typedefs the snmp_pdu struct into netsnmp_pdu */ |
||
| 92 | /** @struct snmp_pdu |
||
| 93 | * The snmp protocol data unit. |
||
| 94 | */ |
||
| 95 | typedef struct snmp_pdu { |
||
| 96 | |||
| 97 | #define non_repeaters errstat |
||
| 98 | #define max_repetitions errindex |
||
| 99 | |||
| 100 | /* |
||
| 101 | * Protocol-version independent fields |
||
| 102 | */ |
||
| 103 | /** snmp version */ |
||
| 104 | long version; |
||
| 105 | /** Type of this PDU */ |
||
| 106 | int command; |
||
| 107 | /** Request id - note: not incremented on retries */ |
||
| 108 | long reqid; |
||
| 109 | /** Message id for V3 messages note: incremented for each retry */ |
||
| 110 | long msgid; |
||
| 111 | /** Unique ID for incoming transactions */ |
||
| 112 | long transid; |
||
| 113 | /** Session id for AgentX messages */ |
||
| 114 | long sessid; |
||
| 115 | /** Error status (non_repeaters in GetBulk) */ |
||
| 116 | long errstat; |
||
| 117 | /** Error index (max_repetitions in GetBulk) */ |
||
| 118 | long errindex; |
||
| 119 | /** Uptime */ |
||
| 120 | u_long time; |
||
| 121 | u_long flags; |
||
| 122 | |||
| 123 | int securityModel; |
||
| 124 | /** noAuthNoPriv, authNoPriv, authPriv */ |
||
| 125 | int securityLevel; |
||
| 126 | int msgParseModel; |
||
| 127 | |||
| 128 | /** |
||
| 129 | * Transport-specific opaque data. This replaces the IP-centric address |
||
| 130 | * field. |
||
| 131 | */ |
||
| 132 | |||
| 133 | void *transport_data; |
||
| 134 | int transport_data_length; |
||
| 135 | |||
| 136 | /** |
||
| 137 | * The actual transport domain. This SHOULD NOT BE FREE()D. |
||
| 138 | */ |
||
| 139 | |||
| 140 | const oid *tDomain; |
||
| 141 | size_t tDomainLen; |
||
| 142 | |||
| 143 | netsnmp_variable_list *variables; |
||
| 144 | |||
| 145 | |||
| 146 | /* |
||
| 147 | * SNMPv1 & SNMPv2c fields |
||
| 148 | */ |
||
| 149 | /** community for outgoing requests. */ |
||
| 150 | u_char *community; |
||
| 151 | /** length of community name. */ |
||
| 152 | size_t community_len; |
||
| 153 | |||
| 154 | /* |
||
| 155 | * Trap information |
||
| 156 | */ |
||
| 157 | /** System OID */ |
||
| 158 | oid *enterprise; |
||
| 159 | size_t enterprise_length; |
||
| 160 | /** trap type */ |
||
| 161 | long trap_type; |
||
| 162 | /** specific type */ |
||
| 163 | long specific_type; |
||
| 164 | /** This is ONLY used for v1 TRAPs */ |
||
| 165 | unsigned char agent_addr[4]; |
||
| 166 | |||
| 167 | /* |
||
| 168 | * SNMPv3 fields |
||
| 169 | */ |
||
| 170 | /** context snmpEngineID */ |
||
| 171 | u_char *contextEngineID; |
||
| 172 | /** Length of contextEngineID */ |
||
| 173 | size_t contextEngineIDLen; |
||
| 174 | /** authoritative contextName */ |
||
| 175 | char *contextName; |
||
| 176 | /** Length of contextName */ |
||
| 177 | size_t contextNameLen; |
||
| 178 | /** authoritative snmpEngineID for security */ |
||
| 179 | u_char *securityEngineID; |
||
| 180 | /** Length of securityEngineID */ |
||
| 181 | size_t securityEngineIDLen; |
||
| 182 | /** on behalf of this principal */ |
||
| 183 | char *securityName; |
||
| 184 | /** Length of securityName. */ |
||
| 185 | size_t securityNameLen; |
||
| 186 | |||
| 187 | /* |
||
| 188 | * AgentX fields |
||
| 189 | * (also uses SNMPv1 community field) |
||
| 190 | */ |
||
| 191 | int priority; |
||
| 192 | int range_subid; |
||
| 193 | |||
| 194 | void *securityStateRef; |
||
| 195 | } netsnmp_pdu; |
||
| 196 | |||
| 197 | |||
| 198 | struct snmp_session; |
||
| 199 | typedef struct snmp_session netsnmp_session; |
||
| 200 | |||
| 201 | |||
| 202 | #define USM_AUTH_KU_LEN 32 |
||
| 203 | #define USM_PRIV_KU_LEN 32 |
||
| 204 | |||
| 205 | |||
| 206 | typedef int (*netsnmp_callback) (int, netsnmp_session *, int, |
||
| 207 | netsnmp_pdu *, void *); |
||
| 208 | |||
| 209 | /** @struct snmp_session |
||
| 210 | * The snmp session structure. |
||
| 211 | */ |
||
| 212 | struct snmp_session { |
||
| 213 | /* |
||
| 214 | * Protocol-version independent fields |
||
| 215 | */ |
||
| 216 | /** snmp version */ |
||
| 217 | long version; |
||
| 218 | /** Number of retries before timeout. */ |
||
| 219 | int retries; |
||
| 220 | /** Number of uS until first timeout, then exponential backoff */ |
||
| 221 | long timeout; |
||
| 222 | u_long flags; |
||
| 223 | struct snmp_session *subsession; |
||
| 224 | struct snmp_session *next; |
||
| 225 | |||
| 226 | /** name or address of default peer (may include transport specifier and/or port number) */ |
||
| 227 | char *peername; |
||
| 228 | /** UDP port number of peer. (NO LONGER USED - USE peername INSTEAD) */ |
||
| 229 | u_short remote_port; |
||
| 230 | /** My Domain name or dotted IP address, 0 for default */ |
||
| 231 | char *localname; |
||
| 232 | /** My UDP port number, 0 for default, picked randomly */ |
||
| 233 | u_short local_port; |
||
| 234 | /** |
||
| 235 | * Authentication function or NULL if null authentication is used |
||
| 236 | */ |
||
| 237 | u_char *(*authenticator) (u_char *, size_t *, u_char *, size_t); |
||
| 238 | /** Function to interpret incoming data */ |
||
| 239 | netsnmp_callback callback; |
||
| 240 | /** |
||
| 241 | * Pointer to data that the callback function may consider important |
||
| 242 | */ |
||
| 243 | void *callback_magic; |
||
| 244 | /** copy of system errno */ |
||
| 245 | int s_errno; |
||
| 246 | /** copy of library errno */ |
||
| 247 | int s_snmp_errno; |
||
| 248 | /** Session id - AgentX only */ |
||
| 249 | long sessid; |
||
| 250 | |||
| 251 | /* |
||
| 252 | * SNMPv1 & SNMPv2c fields |
||
| 253 | */ |
||
| 254 | /** community for outgoing requests. */ |
||
| 255 | u_char *community; |
||
| 256 | /** Length of community name. */ |
||
| 257 | size_t community_len; |
||
| 258 | /** Largest message to try to receive. */ |
||
| 259 | size_t rcvMsgMaxSize; |
||
| 260 | /** Largest message to try to send. */ |
||
| 261 | size_t sndMsgMaxSize; |
||
| 262 | |||
| 263 | /* |
||
| 264 | * SNMPv3 fields |
||
| 265 | */ |
||
| 266 | /** are we the authoritative engine? */ |
||
| 267 | u_char isAuthoritative; |
||
| 268 | /** authoritative snmpEngineID */ |
||
| 269 | u_char *contextEngineID; |
||
| 270 | /** Length of contextEngineID */ |
||
| 271 | size_t contextEngineIDLen; |
||
| 272 | /** initial engineBoots for remote engine */ |
||
| 273 | u_int engineBoots; |
||
| 274 | /** initial engineTime for remote engine */ |
||
| 275 | u_int engineTime; |
||
| 276 | /** authoritative contextName */ |
||
| 277 | char *contextName; |
||
| 278 | /** Length of contextName */ |
||
| 279 | size_t contextNameLen; |
||
| 280 | /** authoritative snmpEngineID */ |
||
| 281 | u_char *securityEngineID; |
||
| 282 | /** Length of contextEngineID */ |
||
| 283 | size_t securityEngineIDLen; |
||
| 284 | /** on behalf of this principal */ |
||
| 285 | char *securityName; |
||
| 286 | /** Length of securityName. */ |
||
| 287 | size_t securityNameLen; |
||
| 288 | |||
| 289 | /** auth protocol oid */ |
||
| 290 | oid *securityAuthProto; |
||
| 291 | /** Length of auth protocol oid */ |
||
| 292 | size_t securityAuthProtoLen; |
||
| 293 | /** Ku for auth protocol XXX */ |
||
| 294 | u_char securityAuthKey[USM_AUTH_KU_LEN]; |
||
| 295 | /** Length of Ku for auth protocol */ |
||
| 296 | size_t securityAuthKeyLen; |
||
| 297 | /** Kul for auth protocol */ |
||
| 298 | u_char *securityAuthLocalKey; |
||
| 299 | /** Length of Kul for auth protocol XXX */ |
||
| 300 | size_t securityAuthLocalKeyLen; |
||
| 301 | |||
| 302 | /** priv protocol oid */ |
||
| 303 | oid *securityPrivProto; |
||
| 304 | /** Length of priv protocol oid */ |
||
| 305 | size_t securityPrivProtoLen; |
||
| 306 | /** Ku for privacy protocol XXX */ |
||
| 307 | u_char securityPrivKey[USM_PRIV_KU_LEN]; |
||
| 308 | /** Length of Ku for priv protocol */ |
||
| 309 | size_t securityPrivKeyLen; |
||
| 310 | /** Kul for priv protocol */ |
||
| 311 | u_char *securityPrivLocalKey; |
||
| 312 | /** Length of Kul for priv protocol XXX */ |
||
| 313 | size_t securityPrivLocalKeyLen; |
||
| 314 | |||
| 315 | /** snmp security model, v1, v2c, usm */ |
||
| 316 | int securityModel; |
||
| 317 | /** noAuthNoPriv, authNoPriv, authPriv */ |
||
| 318 | int securityLevel; |
||
| 319 | /** target param name */ |
||
| 320 | char *paramName; |
||
| 321 | |||
| 322 | /** |
||
| 323 | * security module specific |
||
| 324 | */ |
||
| 325 | void *securityInfo; |
||
| 326 | |||
| 327 | /** |
||
| 328 | * use as you want data |
||
| 329 | * |
||
| 330 | * used by 'SNMP_FLAGS_RESP_CALLBACK' handling in the agent |
||
| 331 | * XXX: or should we add a new field into this structure? |
||
| 332 | */ |
||
| 333 | void *myvoid; |
||
| 334 | }; |
||
| 335 | |||
| 336 | |||
| 337 | /** |
||
| 338 | * Structure for holding a set of file descriptors, similar to fd_set. |
||
| 339 | * |
||
| 340 | * This structure however can hold so-called large file descriptors |
||
| 341 | * (>= FD_SETSIZE or 1024) on Unix systems or more than FD_SETSIZE (64) |
||
| 342 | * sockets on Windows systems. |
||
| 343 | * |
||
| 344 | * It is safe to allocate this structure on the stack. |
||
| 345 | * |
||
| 346 | * This structure must be initialized by calling netsnmp_large_fd_set_init() |
||
| 347 | * and must be cleaned up via netsnmp_large_fd_set_cleanup(). If this last |
||
| 348 | * function is not called this may result in a memory leak. |
||
| 349 | */ |
||
| 350 | typedef struct netsnmp_large_fd_set_s { |
||
| 351 | /** Maximum set size. */ |
||
| 352 | unsigned lfs_setsize; |
||
| 353 | /** |
||
| 354 | * Points to lfs_set if lfs_setsize <= FD_SETSIZE, and otherwise |
||
| 355 | * to dynamically allocated memory. |
||
| 356 | */ |
||
| 357 | fd_set *lfs_setptr; |
||
| 358 | /** File descriptor / socket set data if lfs_setsize <= FD_SETSIZE. */ |
||
| 359 | fd_set lfs_set; |
||
| 360 | } netsnmp_large_fd_set; |
||
| 361 | |||
| 362 | |||
| 363 | /* |
||
| 364 | * A tree in the format of the tree structure of the MIB. |
||
| 365 | */ |
||
| 366 | struct tree { |
||
| 367 | struct tree *child_list; /* list of children of this node */ |
||
| 368 | struct tree *next_peer; /* Next node in list of peers */ |
||
| 369 | struct tree *next; /* Next node in hashed list of names */ |
||
| 370 | struct tree *parent; |
||
| 371 | char *label; /* This node's textual name */ |
||
| 372 | u_long subid; /* This node's integer subidentifier */ |
||
| 373 | int modid; /* The module containing this node */ |
||
| 374 | int number_modules; |
||
| 375 | int *module_list; /* To handle multiple modules */ |
||
| 376 | int tc_index; /* index into tclist (-1 if NA) */ |
||
| 377 | int type; /* This node's object type */ |
||
| 378 | int access; /* This nodes access */ |
||
| 379 | int status; /* This nodes status */ |
||
| 380 | struct enum_list *enums; /* (optional) list of enumerated integers */ |
||
| 381 | struct range_list *ranges; |
||
| 382 | struct index_list *indexes; |
||
| 383 | char *augments; |
||
| 384 | struct varbind_list *varbinds; |
||
| 385 | char *hint; |
||
| 386 | char *units; |
||
| 387 | int (*printomat) (u_char **, size_t *, size_t *, int, |
||
| 388 | const netsnmp_variable_list *, |
||
| 389 | const struct enum_list *, const char *, |
||
| 390 | const char *); |
||
| 391 | void (*printer) (char *, const netsnmp_variable_list *, const struct enum_list *, const char *, const char *); /* Value printing function */ |
||
| 392 | char *description; /* description (a quoted string) */ |
||
| 393 | char *reference; /* references (a quoted string) */ |
||
| 394 | int reported; /* 1=report started in print_subtree... */ |
||
| 395 | char *defaultValue; |
||
| 396 | }; |
||
| 397 | |||
| 398 | |||
| 399 | |||
| 400 | |||
| 401 | netsnmp_pdu *snmp_pdu_create(int type); |
||
| 402 | netsnmp_pdu *snmp_clone_pdu(netsnmp_pdu *pdu); |
||
| 403 | netsnmp_pdu *snmp_fix_pdu( netsnmp_pdu *pdu, int idx); |
||
| 404 | void snmp_free_pdu( netsnmp_pdu *pdu); |
||
| 405 | |||
| 406 | |||
| 407 | void init_snmp(const char *); |
||
| 408 | void init_mib(void); |
||
| 409 | int get_node(const char *, oid *, size_t *); |
||
| 410 | void snmp_sess_init(netsnmp_session *); |
||
| 411 | struct tree *read_module(const char *); |
||
| 412 | |||
| 413 | |||
| 414 | |||
| 415 | /* Creation */ |
||
| 416 | netsnmp_variable_list * |
||
| 417 | snmp_pdu_add_variable(netsnmp_pdu *pdu, |
||
| 418 | const oid *name, size_t name_length, |
||
| 419 | u_char type, |
||
| 420 | const void *value, size_t len); |
||
| 421 | netsnmp_variable_list * |
||
| 422 | snmp_varlist_add_variable(netsnmp_variable_list **varlist, |
||
| 423 | const oid *name, size_t name_length, |
||
| 424 | u_char type, |
||
| 425 | const void *value, size_t len); |
||
| 426 | netsnmp_variable_list * |
||
| 427 | snmp_add_null_var(netsnmp_pdu *pdu, |
||
| 428 | const oid *name, size_t name_length); |
||
| 429 | netsnmp_variable_list * |
||
| 430 | snmp_clone_varbind(netsnmp_variable_list *varlist); |
||
| 431 | |||
| 432 | /* Setting Values */ |
||
| 433 | int snmp_set_var_value(netsnmp_variable_list *var, |
||
| 434 | const void *value, size_t len); |
||
| 435 | int snmp_set_var_objid(netsnmp_variable_list *var, |
||
| 436 | const oid *name, size_t name_length); |
||
| 437 | int snmp_set_var_typed_value(netsnmp_variable_list *var, |
||
| 438 | u_char type, |
||
| 439 | const void *value, size_t len); |
||
| 440 | int snmp_set_var_typed_integer(netsnmp_variable_list *var, |
||
| 441 | u_char type, long val); |
||
| 442 | |||
| 443 | /* Output */ |
||
| 444 | void print_variable(const oid *objid, size_t objidlen, |
||
| 445 | const netsnmp_variable_list *variable); |
||
| 446 | void fprint_variable(FILE *fp, |
||
| 447 | const oid *objid, size_t objidlen, |
||
| 448 | const netsnmp_variable_list *variable); |
||
| 449 | int snprint_variable(char *buf, size_t buf_len, |
||
| 450 | const oid *objid, size_t objidlen, |
||
| 451 | const netsnmp_variable_list *variable); |
||
| 452 | |||
| 453 | void print_value(const oid *objid, size_t objidlen, |
||
| 454 | const netsnmp_variable_list *variable); |
||
| 455 | void fprint_value(FILE *fp, |
||
| 456 | const oid *objid, size_t objidlen, |
||
| 457 | const netsnmp_variable_list *variable); |
||
| 458 | int snprint_value(char *buf, size_t buf_len, |
||
| 459 | const oid *objid, size_t objidlen, |
||
| 460 | const netsnmp_variable_list *variable); |
||
| 461 | |||
| 462 | /* Deletion */ |
||
| 463 | void snmp_free_var( netsnmp_variable_list *var); /* frees just this one */ |
||
| 464 | void snmp_free_varbind(netsnmp_variable_list *varlist); /* frees all in list */ |
||
| 465 | |||
| 466 | |||
| 467 | |||
| 468 | void snmp_sess_init(netsnmp_session *); |
||
| 469 | |||
| 470 | /* |
||
| 471 | * netsnmp_session *snmp_open(session) |
||
| 472 | * netsnmp_session *session; |
||
| 473 | * |
||
| 474 | * Sets up the session with the snmp_session information provided |
||
| 475 | * by the user. Then opens and binds the necessary UDP port. |
||
| 476 | * A handle to the created session is returned (this is different than |
||
| 477 | * the pointer passed to snmp_open()). On any error, NULL is returned |
||
| 478 | * and snmp_errno is set to the appropriate error code. |
||
| 479 | */ |
||
| 480 | netsnmp_session *snmp_open(netsnmp_session *); |
||
| 481 | |||
| 482 | /* |
||
| 483 | * int snmp_close(session) |
||
| 484 | * netsnmp_session *session; |
||
| 485 | * |
||
| 486 | * Close the input session. Frees all data allocated for the session, |
||
| 487 | * dequeues any pending requests, and closes any sockets allocated for |
||
| 488 | * the session. Returns 0 on error, 1 otherwise. |
||
| 489 | * |
||
| 490 | * snmp_close_sessions() does the same thing for all open sessions |
||
| 491 | */ |
||
| 492 | int snmp_close(netsnmp_session *); |
||
| 493 | int snmp_close_sessions(void); |
||
| 494 | |||
| 495 | |||
| 496 | /* |
||
| 497 | * int snmp_send(session, pdu) |
||
| 498 | * netsnmp_session *session; |
||
| 499 | * netsnmp_pdu *pdu; |
||
| 500 | * |
||
| 501 | * Sends the input pdu on the session after calling snmp_build to create |
||
| 502 | * a serialized packet. If necessary, set some of the pdu data from the |
||
| 503 | * session defaults. Add a request corresponding to this pdu to the list |
||
| 504 | * of outstanding requests on this session, then send the pdu. |
||
| 505 | * Returns the request id of the generated packet if applicable, otherwise 1. |
||
| 506 | * On any error, 0 is returned. |
||
| 507 | * The pdu is freed by snmp_send() unless a failure occured. |
||
| 508 | */ |
||
| 509 | int snmp_send(netsnmp_session *, netsnmp_pdu *); |
||
| 510 | |||
| 511 | /* |
||
| 512 | * int snmp_async_send(session, pdu, callback, cb_data) |
||
| 513 | * netsnmp_session *session; |
||
| 514 | * netsnmp_pdu *pdu; |
||
| 515 | * netsnmp_callback callback; |
||
| 516 | * void *cb_data; |
||
| 517 | * |
||
| 518 | * Sends the input pdu on the session after calling snmp_build to create |
||
| 519 | * a serialized packet. If necessary, set some of the pdu data from the |
||
| 520 | * session defaults. Add a request corresponding to this pdu to the list |
||
| 521 | * of outstanding requests on this session and store callback and data, |
||
| 522 | * then send the pdu. |
||
| 523 | * Returns the request id of the generated packet if applicable, otherwise 1. |
||
| 524 | * On any error, 0 is returned. |
||
| 525 | * The pdu is freed by snmp_send() unless a failure occured. |
||
| 526 | */ |
||
| 527 | int snmp_async_send(netsnmp_session *, netsnmp_pdu *, |
||
| 528 | netsnmp_callback, void *); |
||
| 529 | |||
| 530 | |||
| 531 | /* |
||
| 532 | * void snmp_read(fdset) |
||
| 533 | * fd_set *fdset; |
||
| 534 | * |
||
| 535 | * Checks to see if any of the fd's set in the fdset belong to |
||
| 536 | * snmp. Each socket with it's fd set has a packet read from it |
||
| 537 | * and snmp_parse is called on the packet received. The resulting pdu |
||
| 538 | * is passed to the callback routine for that session. If the callback |
||
| 539 | * routine returns successfully, the pdu and it's request are deleted. |
||
| 540 | */ |
||
| 541 | void snmp_read(fd_set *); |
||
| 542 | |||
| 543 | /* |
||
| 544 | * snmp_read2() is similar to snmp_read(), but accepts a pointer to a |
||
| 545 | * large file descriptor set instead of a pointer to a regular file |
||
| 546 | * descriptor set. |
||
| 547 | */ |
||
| 548 | void snmp_read2(netsnmp_large_fd_set *); |
||
| 549 | |||
| 550 | |||
| 551 | int snmp_synch_response(netsnmp_session *, netsnmp_pdu *, |
||
| 552 | netsnmp_pdu **); |
||
| 553 | |||
| 554 | /* |
||
| 555 | * int snmp_select_info(numfds, fdset, timeout, block) |
||
| 556 | * int *numfds; |
||
| 557 | * fd_set *fdset; |
||
| 558 | * struct timeval *timeout; |
||
| 559 | * int *block; |
||
| 560 | * |
||
| 561 | * Returns info about what snmp requires from a select statement. |
||
| 562 | * numfds is the number of fds in the list that are significant. |
||
| 563 | * All file descriptors opened for SNMP are OR'd into the fdset. |
||
| 564 | * If activity occurs on any of these file descriptors, snmp_read |
||
| 565 | * should be called with that file descriptor set. |
||
| 566 | * |
||
| 567 | * The timeout is the latest time that SNMP can wait for a timeout. The |
||
| 568 | * select should be done with the minimum time between timeout and any other |
||
| 569 | * timeouts necessary. This should be checked upon each invocation of select. |
||
| 570 | * If a timeout is received, snmp_timeout should be called to check if the |
||
| 571 | * timeout was for SNMP. (snmp_timeout is idempotent) |
||
| 572 | * |
||
| 573 | * Block is 1 if the select is requested to block indefinitely, rather than |
||
| 574 | * time out. If block is input as 1, the timeout value will be treated as |
||
| 575 | * undefined, but it must be available for setting in snmp_select_info. On |
||
| 576 | * return, if block is true, the value of timeout will be undefined. |
||
| 577 | * |
||
| 578 | * snmp_select_info returns the number of open sockets. (i.e. The number |
||
| 579 | * of sessions open) |
||
| 580 | */ |
||
| 581 | int snmp_select_info(int *, fd_set *, struct timeval *, |
||
| 582 | int *); |
||
| 583 | |||
| 584 | /* |
||
| 585 | * snmp_select_info2() is similar to snmp_select_info(), but accepts a |
||
| 586 | * pointer to a large file descriptor set instead of a pointer to a |
||
| 587 | * regular file descriptor set. |
||
| 588 | */ |
||
| 589 | int snmp_select_info2(int *, netsnmp_large_fd_set *, |
||
| 590 | struct timeval *, int *); |
||
| 591 | |||
| 592 | |||
| 593 | /* |
||
| 594 | * void snmp_timeout(); |
||
| 595 | * |
||
| 596 | * snmp_timeout should be called whenever the timeout from snmp_select_info |
||
| 597 | * expires, but it is idempotent, so snmp_timeout can be polled (probably a |
||
| 598 | * cpu expensive proposition). snmp_timeout checks to see if any of the |
||
| 599 | * sessions have an outstanding request that has timed out. If it finds one |
||
| 600 | * (or more), and that pdu has more retries available, a new packet is formed |
||
| 601 | * from the pdu and is resent. If there are no more retries available, the |
||
| 602 | * callback for the session is used to alert the user of the timeout. |
||
| 603 | */ |
||
| 604 | |||
| 605 | void snmp_timeout(void); |
||
| 606 | |||
| 607 | /* |
||
| 608 | * snmp_error - return error data |
||
| 609 | * Inputs : address of errno, address of snmp_errno, address of string |
||
| 610 | * Caller must free the string returned after use. |
||
| 611 | */ |
||
| 612 | void snmp_error(netsnmp_session *, int *, int *, char **); |
||
| 613 | |||
| 614 | /* |
||
| 615 | * single session API. |
||
| 616 | * |
||
| 617 | * These functions perform similar actions as snmp_XX functions, |
||
| 618 | * but operate on a single session only. |
||
| 619 | * |
||
| 620 | * Synopsis: |
||
| 621 | |||
| 622 | void * sessp; |
||
| 623 | netsnmp_session session, *ss; |
||
| 624 | netsnmp_pdu *pdu, *response; |
||
| 625 | |||
| 626 | snmp_sess_init(&session); |
||
| 627 | session.retries = ... |
||
| 628 | session.remote_port = ... |
||
| 629 | sessp = snmp_sess_open(&session); |
||
| 630 | ss = snmp_sess_session(sessp); |
||
| 631 | if (ss == NULL) |
||
| 632 | exit(1); |
||
| 633 | ... |
||
| 634 | if (ss->community) free(ss->community); |
||
| 635 | ss->community = strdup(gateway); |
||
| 636 | ss->community_len = strlen(gateway); |
||
| 637 | ... |
||
| 638 | snmp_sess_synch_response(sessp, pdu, &response); |
||
| 639 | ... |
||
| 640 | snmp_sess_close(sessp); |
||
| 641 | |||
| 642 | * See also: |
||
| 643 | * snmp_sess_synch_response, in snmp_client.h. |
||
| 644 | |||
| 645 | * Notes: |
||
| 646 | * 1. Invoke snmp_sess_session after snmp_sess_open. |
||
| 647 | * 2. snmp_sess_session return value is an opaque pointer. |
||
| 648 | * 3. Do NOT free memory returned by snmp_sess_session. |
||
| 649 | * 4. Replace snmp_send(ss,pdu) with snmp_sess_send(sessp,pdu) |
||
| 650 | */ |
||
| 651 | |||
| 652 | void *snmp_sess_open(netsnmp_session *); |
||
| 653 | void *snmp_sess_pointer(netsnmp_session *); |
||
| 654 | netsnmp_session *snmp_sess_session(void *); |
||
| 655 | |||
| 656 | |||
| 657 | /* |
||
| 658 | * use return value from snmp_sess_open as void * parameter |
||
| 659 | */ |
||
| 660 | |||
| 661 | int snmp_sess_send(void *, netsnmp_pdu *); |
||
| 662 | int snmp_sess_async_send(void *, netsnmp_pdu *, |
||
| 663 | netsnmp_callback, void *); |
||
| 664 | int snmp_sess_select_info(void *, int *, fd_set *, |
||
| 665 | struct timeval *, int *); |
||
| 666 | int snmp_sess_select_info2(void *, int *, |
||
| 667 | netsnmp_large_fd_set *, |
||
| 668 | struct timeval *, int *); |
||
| 669 | /* |
||
| 670 | * Returns 0 if success, -1 if fail. |
||
| 671 | */ |
||
| 672 | int snmp_sess_read(void *, fd_set *); |
||
| 673 | /* |
||
| 674 | * Similar to snmp_sess_read(), but accepts a pointer to a large file |
||
| 675 | * descriptor set instead of a pointer to a file descriptor set. |
||
| 676 | */ |
||
| 677 | int snmp_sess_read2(void *, |
||
| 678 | netsnmp_large_fd_set *); |
||
| 679 | void snmp_sess_timeout(void *); |
||
| 680 | int snmp_sess_close(void *); |
||
| 681 | |||
| 682 | int snmp_sess_synch_response(void *, netsnmp_pdu *, netsnmp_pdu **); |
||
| 683 | |||
| 684 | |||
| 685 | struct snmp_pdu; |
||
| 686 | struct snmp_session; |
||
| 687 | struct variable_list; |
||
| 688 | |||
| 689 | struct synch_state { |
||
| 690 | int waiting; |
||
| 691 | int status; |
||
| 692 | /* |
||
| 693 | * status codes |
||
| 694 | */ |
||
| 695 | #define STAT_SUCCESS 0 |
||
| 696 | #define STAT_ERROR 1 |
||
| 697 | #define STAT_TIMEOUT 2 |
||
| 698 | int reqid; |
||
| 699 | netsnmp_pdu *pdu; |
||
| 700 | }; |
||
| 701 | |||
| 702 | void snmp_replace_var_types(netsnmp_variable_list *vbl, |
||
| 703 | u_char old_type, |
||
| 704 | u_char new_type); |
||
| 705 | void snmp_reset_var_buffers(netsnmp_variable_list *var); |
||
| 706 | void snmp_reset_var_types(netsnmp_variable_list *vbl, |
||
| 707 | u_char new_type); |
||
| 708 | int count_varbinds(netsnmp_variable_list *var_ptr); |
||
| 709 | int count_varbinds_of_type(netsnmp_variable_list *var_ptr, |
||
| 710 | u_char type); |
||
| 711 | netsnmp_variable_list *find_varbind_of_type(netsnmp_variable_list * |
||
| 712 | var_ptr, u_char type); |
||
| 713 | netsnmp_variable_list *find_varbind_in_list(netsnmp_variable_list *vblist, |
||
| 714 | oid *name, size_t len); |
||
| 715 | |||
| 716 | netsnmp_pdu *snmp_split_pdu(netsnmp_pdu *, int skipCount, |
||
| 717 | int copyCount); |
||
| 718 | |||
| 719 | unsigned long snmp_varbind_len(netsnmp_pdu *pdu); |
||
| 720 | int snmp_clone_var(netsnmp_variable_list *, |
||
| 721 | netsnmp_variable_list *); |
||
| 722 | const char *snmp_errstring(int); |
||
| 723 | int snmp_synch_response_cb(netsnmp_session *, |
||
| 724 | netsnmp_pdu *, netsnmp_pdu **, |
||
| 725 | snmp_callback); |
||
| 726 | int snmp_clone_mem(void **, const void *, unsigned); |
||
| 727 | |||
| 728 | |||
| 729 | void netsnmp_query_set_default_session(netsnmp_session *); |
||
| 730 | netsnmp_session *netsnmp_query_get_default_session( void ); |
||
| 731 | int netsnmp_query_get( netsnmp_variable_list *, netsnmp_session *); |
||
| 732 | int netsnmp_query_getnext( netsnmp_variable_list *, netsnmp_session *); |
||
| 733 | int netsnmp_query_walk( netsnmp_variable_list *, netsnmp_session *); |
||
| 734 | int netsnmp_query_set( netsnmp_variable_list *, netsnmp_session *); |
||
| 735 | |||
| 736 | void snmp_sess_perror(const char *prog_string, |
||
| 737 | netsnmp_session *ss); |
||
| 738 | const char *snmp_pdu_type(int type); |
||
| 739 | |||
| 740 | #endif |