diff options
Diffstat (limited to 'firmware/octoclock/include/lwip/snmp_msg.h')
| -rw-r--r-- | firmware/octoclock/include/lwip/snmp_msg.h | 311 | 
1 files changed, 311 insertions, 0 deletions
diff --git a/firmware/octoclock/include/lwip/snmp_msg.h b/firmware/octoclock/include/lwip/snmp_msg.h new file mode 100644 index 000000000..b2f69c4be --- /dev/null +++ b/firmware/octoclock/include/lwip/snmp_msg.h @@ -0,0 +1,311 @@ +/** + * @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" + +#if LWIP_SNMP + +#if SNMP_PRIVATE_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 */ +  struct ip_addr 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 */ +  struct ip_addr 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, struct ip_addr *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__ */  | 
