123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- /**
- * @file
- * SNMP Agent message handling structures.
- */
- /*
- * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * Author: Christiaan Simons <christiaan.simons@axon.tv>
- */
- #ifndef __LWIP_SNMP_MSG_H__
- #define __LWIP_SNMP_MSG_H__
- #include "lwip/opt.h"
- #include "lwip/snmp.h"
- #include "lwip/snmp_structs.h"
- #include "lwip/ip_addr.h"
- #include "lwip/err.h"
- #if LWIP_SNMP
- #if SNMP_PRIVATE_MIB
- /* When using a private MIB, you have to create a file 'private_mib.h' that contains
- * a 'struct mib_array_node mib_private' which contains your MIB. */
- #include "private_mib.h"
- #endif
- #ifdef __cplusplus
- extern "C" {
- #endif
- /* The listen port of the SNMP agent. Clients have to make their requests to
- this port. Most standard clients won't work if you change this! */
- #ifndef SNMP_IN_PORT
- #define SNMP_IN_PORT 161
- #endif
- /* The remote port the SNMP agent sends traps to. Most standard trap sinks won't
- work if you change this! */
- #ifndef SNMP_TRAP_PORT
- #define SNMP_TRAP_PORT 162
- #endif
- #define SNMP_ES_NOERROR 0
- #define SNMP_ES_TOOBIG 1
- #define SNMP_ES_NOSUCHNAME 2
- #define SNMP_ES_BADVALUE 3
- #define SNMP_ES_READONLY 4
- #define SNMP_ES_GENERROR 5
- #define SNMP_GENTRAP_COLDSTART 0
- #define SNMP_GENTRAP_WARMSTART 1
- #define SNMP_GENTRAP_AUTHFAIL 4
- #define SNMP_GENTRAP_ENTERPRISESPC 6
- struct snmp_varbind
- {
- /* next pointer, NULL for last in list */
- struct snmp_varbind *next;
- /* previous pointer, NULL for first in list */
- struct snmp_varbind *prev;
- /* object identifier length (in s32_t) */
- u8_t ident_len;
- /* object identifier array */
- s32_t *ident;
- /* object value ASN1 type */
- u8_t value_type;
- /* object value length (in u8_t) */
- u8_t value_len;
- /* object value */
- void *value;
- /* encoding varbind seq length length */
- u8_t seqlenlen;
- /* encoding object identifier length length */
- u8_t olenlen;
- /* encoding object value length length */
- u8_t vlenlen;
- /* encoding varbind seq length */
- u16_t seqlen;
- /* encoding object identifier length */
- u16_t olen;
- /* encoding object value length */
- u16_t vlen;
- };
- struct snmp_varbind_root
- {
- struct snmp_varbind *head;
- struct snmp_varbind *tail;
- /* number of variable bindings in list */
- u8_t count;
- /* encoding varbind-list seq length length */
- u8_t seqlenlen;
- /* encoding varbind-list seq length */
- u16_t seqlen;
- };
- /** output response message header length fields */
- struct snmp_resp_header_lengths
- {
- /* encoding error-index length length */
- u8_t erridxlenlen;
- /* encoding error-status length length */
- u8_t errstatlenlen;
- /* encoding request id length length */
- u8_t ridlenlen;
- /* encoding pdu length length */
- u8_t pdulenlen;
- /* encoding community length length */
- u8_t comlenlen;
- /* encoding version length length */
- u8_t verlenlen;
- /* encoding sequence length length */
- u8_t seqlenlen;
- /* encoding error-index length */
- u16_t erridxlen;
- /* encoding error-status length */
- u16_t errstatlen;
- /* encoding request id length */
- u16_t ridlen;
- /* encoding pdu length */
- u16_t pdulen;
- /* encoding community length */
- u16_t comlen;
- /* encoding version length */
- u16_t verlen;
- /* encoding sequence length */
- u16_t seqlen;
- };
- /** output response message header length fields */
- struct snmp_trap_header_lengths
- {
- /* encoding timestamp length length */
- u8_t tslenlen;
- /* encoding specific-trap length length */
- u8_t strplenlen;
- /* encoding generic-trap length length */
- u8_t gtrplenlen;
- /* encoding agent-addr length length */
- u8_t aaddrlenlen;
- /* encoding enterprise-id length length */
- u8_t eidlenlen;
- /* encoding pdu length length */
- u8_t pdulenlen;
- /* encoding community length length */
- u8_t comlenlen;
- /* encoding version length length */
- u8_t verlenlen;
- /* encoding sequence length length */
- u8_t seqlenlen;
- /* encoding timestamp length */
- u16_t tslen;
- /* encoding specific-trap length */
- u16_t strplen;
- /* encoding generic-trap length */
- u16_t gtrplen;
- /* encoding agent-addr length */
- u16_t aaddrlen;
- /* encoding enterprise-id length */
- u16_t eidlen;
- /* encoding pdu length */
- u16_t pdulen;
- /* encoding community length */
- u16_t comlen;
- /* encoding version length */
- u16_t verlen;
- /* encoding sequence length */
- u16_t seqlen;
- };
- /* Accepting new SNMP messages. */
- #define SNMP_MSG_EMPTY 0
- /* Search for matching object for variable binding. */
- #define SNMP_MSG_SEARCH_OBJ 1
- /* Perform SNMP operation on in-memory object.
- Pass-through states, for symmetry only. */
- #define SNMP_MSG_INTERNAL_GET_OBJDEF 2
- #define SNMP_MSG_INTERNAL_GET_VALUE 3
- #define SNMP_MSG_INTERNAL_SET_TEST 4
- #define SNMP_MSG_INTERNAL_GET_OBJDEF_S 5
- #define SNMP_MSG_INTERNAL_SET_VALUE 6
- /* Perform SNMP operation on object located externally.
- In theory this could be used for building a proxy agent.
- Practical use is for an enterprise spc. app. gateway. */
- #define SNMP_MSG_EXTERNAL_GET_OBJDEF 7
- #define SNMP_MSG_EXTERNAL_GET_VALUE 8
- #define SNMP_MSG_EXTERNAL_SET_TEST 9
- #define SNMP_MSG_EXTERNAL_GET_OBJDEF_S 10
- #define SNMP_MSG_EXTERNAL_SET_VALUE 11
- #define SNMP_COMMUNITY_STR_LEN 64
- struct snmp_msg_pstat
- {
- /* lwIP local port (161) binding */
- struct udp_pcb *pcb;
- /* source IP address */
- ip_addr_t sip;
- /* source UDP port */
- u16_t sp;
- /* request type */
- u8_t rt;
- /* request ID */
- s32_t rid;
- /* error status */
- s32_t error_status;
- /* error index */
- s32_t error_index;
- /* community name (zero terminated) */
- u8_t community[SNMP_COMMUNITY_STR_LEN + 1];
- /* community string length (exclusive zero term) */
- u8_t com_strlen;
- /* one out of MSG_EMPTY, MSG_DEMUX, MSG_INTERNAL, MSG_EXTERNAL_x */
- u8_t state;
- /* saved arguments for MSG_EXTERNAL_x */
- struct mib_external_node *ext_mib_node;
- struct snmp_name_ptr ext_name_ptr;
- struct obj_def ext_object_def;
- struct snmp_obj_id ext_oid;
- /* index into input variable binding list */
- u8_t vb_idx;
- /* ptr into input variable binding list */
- struct snmp_varbind *vb_ptr;
- /* list of variable bindings from input */
- struct snmp_varbind_root invb;
- /* list of variable bindings to output */
- struct snmp_varbind_root outvb;
- /* output response lengths used in ASN encoding */
- struct snmp_resp_header_lengths rhl;
- };
- struct snmp_msg_trap
- {
- /* lwIP local port (161) binding */
- struct udp_pcb *pcb;
- /* destination IP address in network order */
- ip_addr_t dip;
- /* source enterprise ID (sysObjectID) */
- struct snmp_obj_id *enterprise;
- /* source IP address, raw network order format */
- u8_t sip_raw[4];
- /* generic trap code */
- u32_t gen_trap;
- /* specific trap code */
- u32_t spc_trap;
- /* timestamp */
- u32_t ts;
- /* list of variable bindings to output */
- struct snmp_varbind_root outvb;
- /* output trap lengths used in ASN encoding */
- struct snmp_trap_header_lengths thl;
- };
- /** Agent Version constant, 0 = v1 oddity */
- extern const s32_t snmp_version;
- /** Agent default "public" community string */
- extern const char snmp_publiccommunity[7];
- extern struct snmp_msg_trap trap_msg;
- /** Agent setup, start listening to port 161. */
- void snmp_init(void);
- void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable);
- void snmp_trap_dst_ip_set(u8_t dst_idx, ip_addr_t *dst);
- /** Varbind-list functions. */
- struct snmp_varbind* snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len);
- void snmp_varbind_free(struct snmp_varbind *vb);
- void snmp_varbind_list_free(struct snmp_varbind_root *root);
- void snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb);
- struct snmp_varbind* snmp_varbind_tail_remove(struct snmp_varbind_root *root);
- /** Handle an internal (recv) or external (private response) event. */
- void snmp_msg_event(u8_t request_id);
- err_t snmp_send_response(struct snmp_msg_pstat *m_stat);
- err_t snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap);
- void snmp_coldstart_trap(void);
- void snmp_authfail_trap(void);
- #ifdef __cplusplus
- }
- #endif
- #endif /* LWIP_SNMP */
- #endif /* __LWIP_SNMP_MSG_H__ */
|