1963Sats/* 24435Sgibbs * Copyright (c) 2001-2003 38876Srgrimes * Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4963Sats * All rights reserved. 54435Sgibbs * 64435Sgibbs * Author: Harti Brandt <harti@freebsd.org> 74435Sgibbs * 84435Sgibbs * Copyright (c) 2010 The FreeBSD Foundation 913765Smpp * All rights reserved. 108876Srgrimes * 114435Sgibbs * Portions of this software were developed by Shteryana Sotirova Shopova 124435Sgibbs * under sponsorship from the FreeBSD Foundation. 134435Sgibbs * 144435Sgibbs * Redistribution and use in source and binary forms, with or without 154435Sgibbs * modification, are permitted provided that the following conditions 164435Sgibbs * are met: 174435Sgibbs * 1. Redistributions of source code must retain the above copyright 184435Sgibbs * notice, this list of conditions and the following disclaimer. 194435Sgibbs * 2. Redistributions in binary form must reproduce the above copyright 204435Sgibbs * notice, this list of conditions and the following disclaimer in the 218876Srgrimes * documentation and/or other materials provided with the distribution. 2250477Speter * 237510Sjkh * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 244435Sgibbs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 254435Sgibbs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2651673Smdodd * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 2751673Smdodd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2816374Snate * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2951673Smdodd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3051673Smdodd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3116374Snate * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3216374Snate * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 334435Sgibbs * SUCH DAMAGE. 344435Sgibbs * 354435Sgibbs * $Begemot: bsnmp/snmpd/snmpmod.h,v 1.32 2006/02/14 09:04:20 brandt_h Exp $ 364435Sgibbs * 374435Sgibbs * SNMP daemon data and functions exported to modules. 38117700Smarkm */ 3930398Sitojun#ifndef snmpmod_h_ 404435Sgibbs#define snmpmod_h_ 414435Sgibbs 424435Sgibbs#include <sys/types.h> 434435Sgibbs#include <sys/queue.h> 444435Sgibbs#include <sys/socket.h> 4514259Sgibbs#include <net/if.h> 464435Sgibbs#include <netinet/in.h> 474435Sgibbs#include "asn1.h" 484435Sgibbs#include "snmp.h" 494435Sgibbs#include "snmpagent.h" 504435Sgibbs 514435Sgibbs#define MAX_MOD_ARGS 16 524435Sgibbs 534435Sgibbs/* 544435Sgibbs * These macros help to handle object lists for SNMP tables. They use 554435Sgibbs * tail queues to hold the objects in ascending order in the list. 564435Sgibbs * ordering can be done either on an integer/unsigned field, an asn_oid 574435Sgibbs * or an ordering function. 584435Sgibbs */ 594435Sgibbs 604435Sgibbs/* 614435Sgibbs * First set of macros is used when the link is embedded into sub-struct 62121492Simp * and links these sub-structs. The sub-struct must be the first field. 63121492Simp * 644435Sgibbs * The list is a list of the subfield types. 65963Sats */ 664435Sgibbs#define INSERT_OBJECT_OID_LINK_INDEX_TYPE(PTR, LIST, LINK, INDEX, SUBF) do {\ 67963Sats typedef __typeof ((PTR)->SUBF) _subf_type; \ 6813765Smpp _subf_type *_lelem; \ 69963Sats \ 70963Sats TAILQ_FOREACH(_lelem, (LIST), LINK) \ 71963Sats if (asn_compare_oid(&_lelem->INDEX, &(PTR)->SUBF.INDEX) > 0)\ 72963Sats break; \ 73963Sats if (_lelem == NULL) \ 74963Sats TAILQ_INSERT_TAIL((LIST), &(PTR)->SUBF, LINK); \ 75963Sats else \ 76963Sats TAILQ_INSERT_BEFORE(_lelem, &(PTR)->SUBF, LINK); \ 77117700Smarkm } while (0) 78117700Smarkm 79117700Smarkm#define NEXT_OBJECT_OID_LINK_INDEX_TYPE(LIST, OID, SUB, LINK, INDEX, TYPE) ({\ 80963Sats __typeof (TAILQ_FIRST((LIST))) _lelem; \ 81963Sats \ 82117700Smarkm TAILQ_FOREACH(_lelem, (LIST), LINK) \ 83117700Smarkm if (index_compare(OID, SUB, &_lelem->INDEX) < 0) \ 844435Sgibbs break; \ 8554201Smdodd (TYPE *)(_lelem); \ 8654201Smdodd }) 8754201Smdodd 8854201Smdodd#define FIND_OBJECT_OID_LINK_INDEX_TYPE(LIST, OID, SUB, LINK, INDEX, TYPE) ({\ 8954201Smdodd __typeof (TAILQ_FIRST((LIST))) _lelem; \ 9054201Smdodd \ 9154201Smdodd TAILQ_FOREACH(_lelem, (LIST), LINK) \ 92117700Smarkm if (index_compare(OID, SUB, &_lelem->INDEX) == 0) \ 93117700Smarkm break; \ 9454201Smdodd (TYPE *)(_lelem); \ 9554201Smdodd }) 9654201Smdodd 97117700Smarkm/* 98117700Smarkm * This set of macros allows specification of the link and index name. 99117700Smarkm * The index is an OID. 100117700Smarkm */ 101117700Smarkm#define INSERT_OBJECT_OID_LINK_INDEX(PTR, LIST, LINK, INDEX) do { \ 102117700Smarkm __typeof (PTR) _lelem; \ 103117700Smarkm \ 10454201Smdodd TAILQ_FOREACH(_lelem, (LIST), LINK) \ 105117700Smarkm if (asn_compare_oid(&_lelem->INDEX, &(PTR)->INDEX) > 0) \ 106117700Smarkm break; \ 107117700Smarkm if (_lelem == NULL) \ 108117700Smarkm TAILQ_INSERT_TAIL((LIST), (PTR), LINK); \ 109117700Smarkm else \ 110963Sats TAILQ_INSERT_BEFORE(_lelem, (PTR), LINK); \ 11154201Smdodd } while (0) 11254201Smdodd 113963Sats#define INSERT_OBJECT_INT_LINK_INDEX(PTR, LIST, LINK, INDEX) do { \ 114963Sats __typeof (PTR) _lelem; \ 115963Sats \ 116963Sats TAILQ_FOREACH(_lelem, (LIST), LINK) \ 117963Sats if ((asn_subid_t)_lelem->INDEX > (asn_subid_t)(PTR)->INDEX)\ 118963Sats break; \ 119963Sats if (_lelem == NULL) \ 120963Sats TAILQ_INSERT_TAIL((LIST), (PTR), LINK); \ 121963Sats else \ 1224435Sgibbs TAILQ_INSERT_BEFORE(_lelem, (PTR), LINK); \ 1234435Sgibbs } while (0) 1244435Sgibbs 1254435Sgibbs#define INSERT_OBJECT_FUNC_LINK(PTR, LIST, LINK, FUNC) do { \ 1264435Sgibbs __typeof (PTR) _lelem; \ 1274435Sgibbs \ 128963Sats TAILQ_FOREACH(_lelem, (LIST), LINK) \ 129963Sats if ((FUNC)(_lelem, (PTR)) > 0) \ 130963Sats break; \ 1314435Sgibbs if (_lelem == NULL) \ 132963Sats TAILQ_INSERT_TAIL((LIST), (PTR), LINK); \ 133963Sats else \ 134963Sats TAILQ_INSERT_BEFORE(_lelem, (PTR), LINK); \ 135963Sats } while (0) 136963Sats 137121492Simp#define INSERT_OBJECT_FUNC_LINK_REV(PTR, LIST, HEAD, LINK, FUNC) do { \ 138963Sats __typeof (PTR) _lelem; \ 139963Sats \ 140963Sats TAILQ_FOREACH_REVERSE(_lelem, (LIST), HEAD, LINK) \ 141963Sats if ((FUNC)(_lelem, (PTR)) < 0) \ 142963Sats break; \ 143963Sats if (_lelem == NULL) \ 1444435Sgibbs TAILQ_INSERT_HEAD((LIST), (PTR), LINK); \ 145963Sats else \ 146963Sats TAILQ_INSERT_AFTER((LIST), _lelem, (PTR), LINK); \ 1474435Sgibbs } while (0) 148963Sats 1494435Sgibbs#define FIND_OBJECT_OID_LINK_INDEX(LIST, OID, SUB, LINK, INDEX) ({ \ 1504435Sgibbs __typeof (TAILQ_FIRST(LIST)) _lelem; \ 151963Sats \ 152963Sats TAILQ_FOREACH(_lelem, (LIST), LINK) \ 153963Sats if (index_compare(OID, SUB, &_lelem->INDEX) == 0) \ 154963Sats break; \ 155963Sats (_lelem); \ 156963Sats }) 157963Sats 1584435Sgibbs#define NEXT_OBJECT_OID_LINK_INDEX(LIST, OID, SUB, LINK, INDEX) ({ \ 159963Sats __typeof (TAILQ_FIRST(LIST)) _lelem; \ 160963Sats \ 161963Sats TAILQ_FOREACH(_lelem, (LIST), LINK) \ 162963Sats if (index_compare(OID, SUB, &_lelem->INDEX) < 0) \ 163963Sats break; \ 164963Sats (_lelem); \ 165963Sats }) 1664435Sgibbs 167963Sats#define FIND_OBJECT_INT_LINK_INDEX(LIST, OID, SUB, LINK, INDEX) ({ \ 168963Sats __typeof (TAILQ_FIRST(LIST)) _lelem; \ 1694435Sgibbs \ 170963Sats if ((OID)->len - SUB != 1) \ 171963Sats _lelem = NULL; \ 17249070Shosokawa else \ 173963Sats TAILQ_FOREACH(_lelem, (LIST), LINK) \ 174963Sats if ((OID)->subs[SUB] == (asn_subid_t)_lelem->INDEX)\ 175963Sats break; \ 176963Sats (_lelem); \ 1774435Sgibbs }) 178963Sats 179963Sats#define NEXT_OBJECT_INT_LINK_INDEX(LIST, OID, SUB, LINK, INDEX) ({ \ 180963Sats __typeof (TAILQ_FIRST(LIST)) _lelem; \ 181963Sats \ 182963Sats if ((OID)->len - SUB == 0) \ 183963Sats _lelem = TAILQ_FIRST(LIST); \ 184963Sats else \ 185963Sats TAILQ_FOREACH(_lelem, (LIST), LINK) \ 186963Sats if ((OID)->subs[SUB] < (asn_subid_t)_lelem->INDEX)\ 187963Sats break; \ 1884435Sgibbs (_lelem); \ 189963Sats }) 190963Sats 191963Sats#define FIND_OBJECT_FUNC_LINK(LIST, OID, SUB, LINK, FUNC) ({ \ 192963Sats __typeof (TAILQ_FIRST(LIST)) _lelem; \ 193963Sats \ 194963Sats TAILQ_FOREACH(_lelem, (LIST), LINK) \ 195963Sats if ((FUNC)(OID, SUB, _lelem) == 0) \ 196963Sats break; \ 197963Sats (_lelem); \ 198963Sats }) 1994435Sgibbs 200963Sats#define NEXT_OBJECT_FUNC_LINK(LIST, OID, SUB, LINK, FUNC) ({ \ 201963Sats __typeof (TAILQ_FIRST(LIST)) _lelem; \ 202963Sats \ 203963Sats TAILQ_FOREACH(_lelem, (LIST), LINK) \ 204963Sats if ((FUNC)(OID, SUB, _lelem) < 0) \ 205963Sats break; \ 206963Sats (_lelem); \ 207963Sats }) 208963Sats 209963Sats/* 210963Sats * Macros for the case where the index field is called 'index' 211963Sats */ 212963Sats#define INSERT_OBJECT_OID_LINK(PTR, LIST, LINK) \ 213963Sats INSERT_OBJECT_OID_LINK_INDEX(PTR, LIST, LINK, index) 214963Sats 215963Sats#define INSERT_OBJECT_INT_LINK(PTR, LIST, LINK) do { \ 216963Sats INSERT_OBJECT_INT_LINK_INDEX(PTR, LIST, LINK, index) 217963Sats 218117700Smarkm#define FIND_OBJECT_OID_LINK(LIST, OID, SUB, LINK) \ 21955834Smdodd FIND_OBJECT_OID_LINK_INDEX(LIST, OID, SUB, LINK, index) 22055834Smdodd 22155834Smdodd#define NEXT_OBJECT_OID_LINK(LIST, OID, SUB, LINK) \ 22255834Smdodd NEXT_OBJECT_OID_LINK_INDEX(LIST, OID, SUB, LINK, index) 22355834Smdodd 224117700Smarkm#define FIND_OBJECT_INT_LINK(LIST, OID, SUB, LINK) \ 22555834Smdodd FIND_OBJECT_INT_LINK_INDEX(LIST, OID, SUB, LINK, index) 22655834Smdodd 227963Sats#define NEXT_OBJECT_INT_LINK(LIST, OID, SUB, LINK) \ 228963Sats NEXT_OBJECT_INT_LINK_INDEX(LIST, OID, SUB, LINK, index) 229963Sats 230963Sats/* 231963Sats * Macros for the case where the index field is called 'index' and the 232963Sats * link field 'link'. 233963Sats */ 234963Sats#define INSERT_OBJECT_OID(PTR, LIST) \ 2354435Sgibbs INSERT_OBJECT_OID_LINK_INDEX(PTR, LIST, link, index) 2364435Sgibbs 237963Sats#define INSERT_OBJECT_INT(PTR, LIST) \ 2384435Sgibbs INSERT_OBJECT_INT_LINK_INDEX(PTR, LIST, link, index) 2394435Sgibbs 2404435Sgibbs#define INSERT_OBJECT_FUNC_REV(PTR, LIST, HEAD, FUNC) \ 2414435Sgibbs INSERT_OBJECT_FUNC_LINK_REV(PTR, LIST, HEAD, link, FUNC) 2424435Sgibbs 2434435Sgibbs#define FIND_OBJECT_OID(LIST, OID, SUB) \ 2444435Sgibbs FIND_OBJECT_OID_LINK_INDEX(LIST, OID, SUB, link, index) 2454435Sgibbs 246963Sats#define FIND_OBJECT_INT(LIST, OID, SUB) \ 247963Sats FIND_OBJECT_INT_LINK_INDEX(LIST, OID, SUB, link, index) 248963Sats 249963Sats#define FIND_OBJECT_FUNC(LIST, OID, SUB, FUNC) \ 250963Sats FIND_OBJECT_FUNC_LINK(LIST, OID, SUB, link, FUNC) 251963Sats 252963Sats#define NEXT_OBJECT_OID(LIST, OID, SUB) \ 253121492Simp NEXT_OBJECT_OID_LINK_INDEX(LIST, OID, SUB, link, index) 254121492Simp 255121492Simp#define NEXT_OBJECT_INT(LIST, OID, SUB) \ 256121492Simp NEXT_OBJECT_INT_LINK_INDEX(LIST, OID, SUB, link, index) 257121492Simp 258121492Simp#define NEXT_OBJECT_FUNC(LIST, OID, SUB, FUNC) \ 259121492Simp NEXT_OBJECT_FUNC_LINK(LIST, OID, SUB, link, FUNC) 260121492Simp 261121492Simpstruct lmodule; 262121492Simp 263121492Simp/* The tick when the program was started. This is the absolute time of 264121492Simp * the start in 100th of a second. */ 265121492Simpextern uint64_t start_tick; 266963Sats 267963Sats/* The tick when the current packet was received. This is the absolute 268963Sats * time in 100th of second. */ 269121492Simpextern uint64_t this_tick; 270121492Simp 271121492Simp/* Get the current absolute time in 100th of a second. */ 272121492Simpuint64_t get_ticks(void); 273963Sats 274963Sats/* 275963Sats * Return code for proxy function 276963Sats */ 277963Satsenum snmpd_proxy_err { 278963Sats /* proxy code will process the PDU */ 279963Sats SNMPD_PROXY_OK, 280963Sats /* proxy code does not process PDU */ 281963Sats SNMPD_PROXY_REJ, 282963Sats /* drop this PDU */ 283963Sats SNMPD_PROXY_DROP, 284963Sats /* drop because of bad community */ 285963Sats SNMPD_PROXY_BADCOMM, 286963Sats /* drop because of bad community use */ 287963Sats SNMPD_PROXY_BADCOMMUSE 288963Sats}; 289963Sats 290963Sats/* 291963Sats * Input handling 292963Sats */ 293963Satsenum snmpd_input_err { 294963Sats /* proceed with packet */ 295963Sats SNMPD_INPUT_OK, 296963Sats /* fatal error in packet, ignore it */ 297963Sats SNMPD_INPUT_FAILED, 298963Sats /* value encoding has wrong length in a SET operation */ 299963Sats SNMPD_INPUT_VALBADLEN, 300963Sats /* value encoding is out of range */ 301963Sats SNMPD_INPUT_VALRANGE, 302963Sats /* value has bad encoding */ 303963Sats SNMPD_INPUT_VALBADENC, 304963Sats /* need more data (truncated packet) */ 305963Sats SNMPD_INPUT_TRUNC, 306117700Smarkm /* unknown community */ 3074435Sgibbs SNMPD_INPUT_BAD_COMM, 3084435Sgibbs}; 309963Sats 310963Sats/* 311121492Simp * Every loadable module must have one of this structures with 312121492Simp * the external name 'config'. 3137510Sjkh */ 3147510Sjkhstruct snmp_module { 3157510Sjkh /* a comment describing what this module implements */ 3167510Sjkh const char *comment; 3177510Sjkh 3187510Sjkh /* the initialization function */ 3197510Sjkh int (*init)(struct lmodule *, int argc, char *argv[]); 3207510Sjkh 3217510Sjkh /* the finalisation function */ 3227510Sjkh int (*fini)(void); 3237510Sjkh 3247510Sjkh /* the idle function */ 3257510Sjkh void (*idle)(void); 3267510Sjkh 327121492Simp /* the dump function */ 328121492Simp void (*dump)(void); 329121492Simp 3307510Sjkh /* re-configuration function */ 331963Sats void (*config)(void); 3328876Srgrimes 3334435Sgibbs /* start operation */ 334963Sats void (*start)(void); 335963Sats 336963Sats /* proxy a PDU */ 337963Sats enum snmpd_proxy_err (*proxy)(struct snmp_pdu *, void *, 338963Sats const struct asn_oid *, const struct sockaddr *, socklen_t, 339963Sats enum snmpd_input_err, int32_t, int); 340963Sats 341963Sats /* the tree this module is going to server */ 342963Sats const struct snmp_node *tree; 343963Sats u_int tree_size; 344963Sats 345963Sats /* function called, when another module was unloaded/loaded */ 346963Sats void (*loading)(const struct lmodule *, int); 347963Sats}; 3484435Sgibbs 3494435Sgibbs/* 3504435Sgibbs * Stuff exported to modules 3514435Sgibbs */ 3524435Sgibbs 3534435Sgibbs/* 3544435Sgibbs * The system group. 3554435Sgibbs */ 356963Satsstruct systemg { 357963Sats u_char *descr; 3588876Srgrimes struct asn_oid object_id; 3594435Sgibbs u_char *contact; 360963Sats u_char *name; 361963Sats u_char *location; 362963Sats uint32_t services; 363963Sats uint32_t or_last_change; 364963Sats}; 365963Satsextern struct systemg systemg; 366963Sats 367963Sats/* 368963Sats * Community support. 369963Sats * 370963Sats * We have 2 fixed communities for SNMP read and write access. Modules 371963Sats * can create their communities dynamically. They are deleted automatically 372963Sats * if the module is unloaded. 373963Sats */ 374963Sats#define COMM_INITIALIZE 0 375963Sats#define COMM_READ 1 3764435Sgibbs#define COMM_WRITE 2 377963Sats 378963Satsu_int comm_define(u_int, const char *descr, struct lmodule *, const char *str); 379963Satsstruct community *comm_define_ordered(u_int priv, const char *descr, 380963Sats struct asn_oid *index, struct lmodule *owner, const char *str); 381963Satsconst char * comm_string(u_int); 382963Sats 3838876Srgrimes/* community for current packet */ 3844435Sgibbsextern u_int community; 3854435Sgibbs 3864435Sgibbs/* 3874435Sgibbs * SNMP User-based Security Model data. Modified via the snmp_usm(3) module. 3884435Sgibbs */ 3894435Sgibbsstruct snmpd_usmstat { 3904435Sgibbs uint32_t unsupported_seclevels; 3914435Sgibbs uint32_t not_in_time_windows; 3924435Sgibbs uint32_t unknown_users; 3934435Sgibbs uint32_t unknown_engine_ids; 394121492Simp uint32_t wrong_digests; 3958876Srgrimes uint32_t decrypt_errors; 3964435Sgibbs}; 3974435Sgibbs 3984435Sgibbsextern struct snmpd_usmstat snmpd_usmstats; 399121492Simpstruct snmpd_usmstat *bsnmpd_get_usm_stats(void); 400121492Simpvoid bsnmpd_reset_usm_stats(void); 401121492Simp 402121492Simpstruct usm_user { 4034435Sgibbs struct snmp_user suser; 4044435Sgibbs uint8_t user_engine_id[SNMP_ENGINE_ID_SIZ]; 405963Sats uint32_t user_engine_len; 406963Sats char user_public[SNMP_ADM_STR32_SIZ]; 407117700Smarkm uint32_t user_public_len; 408117700Smarkm int32_t status; 409117700Smarkm int32_t type; 4104435Sgibbs SLIST_ENTRY(usm_user) up; 4114435Sgibbs}; 412963Sats 413963SatsSLIST_HEAD(usm_userlist, usm_user); 414963Satsstruct usm_user *usm_first_user(void); 4154435Sgibbsstruct usm_user *usm_next_user(struct usm_user *); 416963Satsstruct usm_user *usm_find_user(uint8_t *, uint32_t, char *); 417struct usm_user *usm_new_user(uint8_t *, uint32_t, char *); 418void usm_delete_user(struct usm_user *); 419void usm_flush_users(void); 420 421/* USM user for current packet */ 422extern struct usm_user *usm_user; 423 424/* 425 * SNMP View-based Access Control Model data. Modified via the snmp_vacm(3) module. 426 */ 427struct vacm_group; 428 429struct vacm_user { 430 /* Security user name from USM */ 431 char secname[SNMP_ADM_STR32_SIZ]; 432 int32_t sec_model; 433 /* Back pointer to user assigned group name */ 434 struct vacm_group *group; 435 int32_t type; 436 int32_t status; 437 SLIST_ENTRY(vacm_user) vvu; 438 SLIST_ENTRY(vacm_user) vvg; 439}; 440 441SLIST_HEAD(vacm_userlist, vacm_user); 442 443struct vacm_group { 444 char groupname[SNMP_ADM_STR32_SIZ]; 445 struct vacm_userlist group_users; 446 SLIST_ENTRY(vacm_group) vge; 447}; 448 449SLIST_HEAD(vacm_grouplist, vacm_group); 450 451struct vacm_access { 452 /* The group name is index, not a column in the table */ 453 struct vacm_group *group; 454 char ctx_prefix[SNMP_ADM_STR32_SIZ]; 455 int32_t sec_model; 456 int32_t sec_level; 457 int32_t ctx_match; 458 struct vacm_view *read_view; 459 struct vacm_view *write_view; 460 struct vacm_view *notify_view; 461 int32_t type; 462 int32_t status; 463 TAILQ_ENTRY(vacm_access) vva; 464}; 465 466TAILQ_HEAD(vacm_accesslist, vacm_access); 467 468struct vacm_view { 469 char viewname[SNMP_ADM_STR32_SIZ]; /* key */ 470 struct asn_oid subtree; /* key */ 471 uint8_t mask[16]; 472 uint8_t exclude; 473 int32_t type; 474 int32_t status; 475 SLIST_ENTRY(vacm_view) vvl; 476}; 477 478SLIST_HEAD(vacm_viewlist, vacm_view); 479 480struct vacm_context { 481 /* The ID of the module that registered this context */ 482 int32_t regid; 483 char ctxname[SNMP_ADM_STR32_SIZ]; 484 SLIST_ENTRY(vacm_context) vcl; 485}; 486 487SLIST_HEAD(vacm_contextlist, vacm_context); 488 489void vacm_groups_init(void); 490struct vacm_user *vacm_first_user(void); 491struct vacm_user *vacm_next_user(struct vacm_user *); 492struct vacm_user *vacm_new_user(int32_t, char *); 493int vacm_delete_user(struct vacm_user *); 494int vacm_user_set_group(struct vacm_user *, u_char *, u_int); 495struct vacm_access *vacm_first_access_rule(void); 496struct vacm_access *vacm_next_access_rule(struct vacm_access *); 497struct vacm_access *vacm_new_access_rule(char *, char *, int32_t, int32_t); 498int vacm_delete_access_rule(struct vacm_access *); 499struct vacm_view *vacm_first_view(void); 500struct vacm_view *vacm_next_view(struct vacm_view *); 501struct vacm_view *vacm_new_view(char *, struct asn_oid *); 502int vacm_delete_view(struct vacm_view *); 503struct vacm_context *vacm_first_context(void); 504struct vacm_context *vacm_next_context(struct vacm_context *); 505struct vacm_context *vacm_add_context(char *, int32_t); 506void vacm_flush_contexts(int32_t); 507 508/* 509 * RFC 3413 SNMP Management Target & Notification MIB 510 */ 511 512struct snmpd_target_stats { 513 uint32_t unavail_contexts; 514 uint32_t unknown_contexts; 515}; 516 517#define SNMP_UDP_ADDR_SIZ 6 518#define SNMP_TAG_SIZ (255 + 1) 519 520struct target_address { 521 char name[SNMP_ADM_STR32_SIZ]; 522 uint8_t address[SNMP_UDP_ADDR_SIZ]; 523 int32_t timeout; 524 int32_t retry; 525 char taglist[SNMP_TAG_SIZ]; 526 char paramname[SNMP_ADM_STR32_SIZ]; 527 int32_t type; 528 int32_t socket; 529 int32_t status; 530 SLIST_ENTRY(target_address) ta; 531}; 532 533SLIST_HEAD(target_addresslist, target_address); 534 535struct target_param { 536 char name[SNMP_ADM_STR32_SIZ]; 537 int32_t mpmodel; 538 int32_t sec_model; 539 char secname[SNMP_ADM_STR32_SIZ]; 540 enum snmp_usm_level sec_level; 541 int32_t type; 542 int32_t status; 543 SLIST_ENTRY(target_param) tp; 544}; 545 546SLIST_HEAD(target_paramlist, target_param); 547 548struct target_notify { 549 char name[SNMP_ADM_STR32_SIZ]; 550 char taglist[SNMP_TAG_SIZ]; 551 int32_t notify_type; 552 int32_t type; 553 int32_t status; 554 SLIST_ENTRY(target_notify) tn; 555}; 556 557SLIST_HEAD(target_notifylist, target_notify); 558 559extern struct snmpd_target_stats snmpd_target_stats; 560struct snmpd_target_stats *bsnmpd_get_target_stats(void); 561struct target_address *target_first_address(void); 562struct target_address *target_next_address(struct target_address *); 563struct target_address *target_new_address(char *); 564int target_activate_address(struct target_address *); 565int target_delete_address(struct target_address *); 566struct target_param *target_first_param(void); 567struct target_param *target_next_param(struct target_param *); 568struct target_param *target_new_param(char *); 569int target_delete_param(struct target_param *); 570struct target_notify *target_first_notify(void); 571struct target_notify *target_next_notify(struct target_notify *); 572struct target_notify *target_new_notify(char *); 573int target_delete_notify (struct target_notify *); 574void target_flush_all(void); 575 576/* 577 * Well known OIDs 578 */ 579extern const struct asn_oid oid_zeroDotZero; 580 581/* SNMPv3 Engine Discovery */ 582extern const struct asn_oid oid_usmUnknownEngineIDs; 583extern const struct asn_oid oid_usmNotInTimeWindows; 584 585/* 586 * Request ID ranges. 587 * 588 * A module can request a range of request ids and associate them with a 589 * type field. All ranges are deleted if a module is unloaded. 590 */ 591u_int reqid_allocate(int size, struct lmodule *); 592int32_t reqid_next(u_int type); 593int32_t reqid_base(u_int type); 594int reqid_istype(int32_t reqid, u_int type); 595u_int reqid_type(int32_t reqid); 596 597/* 598 * Timers. 599 */ 600void *timer_start(u_int, void (*)(void *), void *, struct lmodule *); 601void *timer_start_repeat(u_int, u_int, void (*)(void *), void *, 602 struct lmodule *); 603void timer_stop(void *); 604 605/* 606 * File descriptors 607 */ 608void *fd_select(int, void (*)(int, void *), void *, struct lmodule *); 609void fd_deselect(void *); 610void fd_suspend(void *); 611int fd_resume(void *); 612 613/* 614 * Object resources 615 */ 616u_int or_register(const struct asn_oid *, const char *, struct lmodule *); 617void or_unregister(u_int); 618 619/* 620 * Buffers 621 */ 622void *buf_alloc(int tx); 623size_t buf_size(int tx); 624 625/* decode PDU and find community */ 626enum snmpd_input_err snmp_input_start(const u_char *, size_t, const char *, 627 struct snmp_pdu *, int32_t *, size_t *); 628 629/* process the pdu. returns either _OK or _FAILED */ 630enum snmpd_input_err snmp_input_finish(struct snmp_pdu *, const u_char *, 631 size_t, u_char *, size_t *, const char *, enum snmpd_input_err, int32_t, 632 void *); 633 634void snmp_output(struct snmp_pdu *, u_char *, size_t *, const char *); 635void snmp_send_port(void *, const struct asn_oid *, struct snmp_pdu *, 636 const struct sockaddr *, socklen_t); 637enum snmp_code snmp_pdu_auth_access(struct snmp_pdu *, int32_t *); 638 639/* sending traps */ 640void snmp_send_trap(const struct asn_oid *, ...); 641 642/* 643 * Action support 644 */ 645int string_save(struct snmp_value *, struct snmp_context *, ssize_t, u_char **); 646void string_commit(struct snmp_context *); 647void string_rollback(struct snmp_context *, u_char **); 648int string_get(struct snmp_value *, const u_char *, ssize_t); 649int string_get_max(struct snmp_value *, const u_char *, ssize_t, size_t); 650void string_free(struct snmp_context *); 651 652int ip_save(struct snmp_value *, struct snmp_context *, u_char *); 653void ip_rollback(struct snmp_context *, u_char *); 654void ip_commit(struct snmp_context *); 655int ip_get(struct snmp_value *, u_char *); 656 657int oid_save(struct snmp_value *, struct snmp_context *, struct asn_oid *); 658void oid_rollback(struct snmp_context *, struct asn_oid *); 659void oid_commit(struct snmp_context *); 660int oid_get(struct snmp_value *, const struct asn_oid *); 661 662int index_decode(const struct asn_oid *oid, u_int sub, u_int code, ...); 663int index_compare(const struct asn_oid *, u_int, const struct asn_oid *); 664int index_compare_off(const struct asn_oid *, u_int, const struct asn_oid *, 665 u_int); 666void index_append(struct asn_oid *, u_int, const struct asn_oid *); 667void index_append_off(struct asn_oid *, u_int, const struct asn_oid *, u_int); 668 669#endif 670