mirror of
https://git.savannah.nongnu.org/git/lwip.git
synced 2026-08-10 01:23:48 +08:00
SNMP agent rewrite
- SNMPv2c support
- Greatly reduced RAM usage, no memory pools any more
- API cleanup
- MIB2 is separated from SNMP stack
- Support for multiple MIBs (snmp_set_mibs call) - e.g. for private MIB
- Improved MIB2 implementation (tcpConnTable etc.)
- Redesigned simple and generic API for MIB implementation
- Comfortable node types for scalar arrays and tables
- Counter64, bit and truthvalue datatype support
- Callbacks for SNMP writes
- Runs on two APIs: RAW and netconn
- Async API is gone - the stack now supports netconn API instead,
so blocking operations can be done in MIB calls.
SNMP runs in a worker thread when netconn API is used.
- Simplified thread sync support for MIBs - useful when MIBs
need to access variables shared with other threads without locking
(used in MIB2 to access lwIP stats from lwIP thread)
Currently in work:
- Traps rewrite
- MIB compiler
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Leon Woestenberg <leon.woestenberg@axon.tv>
|
||||
* Martin Hentschel <info@cl-soft.de>
|
||||
*
|
||||
*/
|
||||
#ifndef LWIP_HDR_APPS_SNMP_H
|
||||
@@ -41,55 +42,60 @@ extern "C" {
|
||||
|
||||
#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
|
||||
|
||||
#include "lwip/ip.h"
|
||||
|
||||
/** fixed maximum length for object identifier type */
|
||||
#define LWIP_SNMP_OBJ_ID_LEN 32
|
||||
|
||||
/** internal object identifier representation */
|
||||
struct snmp_obj_id
|
||||
{
|
||||
u8_t len;
|
||||
s32_t id[LWIP_SNMP_OBJ_ID_LEN];
|
||||
};
|
||||
#include "lwip/err.h"
|
||||
#include "lwip/apps/snmp_core.h"
|
||||
|
||||
/** Agent setup, start listening to port 161. */
|
||||
void snmp_init(void);
|
||||
void snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs);
|
||||
|
||||
/**
|
||||
* 'device enterprise oid' is used for 'device OID' field in trap PDU's (for identification of generating device)
|
||||
* as well as for value returned by MIB-2 'sysObjectID' field (if internal MIB2 implementation is used).
|
||||
* The 'device enterprise oid' shall point to an OID located under 'private-enterprises' branch (1.3.6.1.4.1.XXX). If a vendor
|
||||
* wants to provide a custom object there, he has to get its own enterprise oid from IANA (http://www.iana.org). It
|
||||
* is not allowed to use LWIP enterprise ID!
|
||||
* In order to identify a specific device it is recommended to create a dedicated OID for each device type under its own
|
||||
* enterprise oid.
|
||||
* e.g.
|
||||
* device a > 1.3.6.1.4.1.XXX(ent-oid).1(devices).1(device a)
|
||||
* device b > 1.3.6.1.4.1.XXX(ent-oid).1(devices).2(device b)
|
||||
* for more details see description of 'sysObjectID' field in RFC1213-MIB
|
||||
*/
|
||||
void snmp_set_device_enterprise_oid(const struct snmp_obj_id* device_enterprise_oid);
|
||||
const struct snmp_obj_id* snmp_get_device_enterprise_oid(void);
|
||||
|
||||
void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable);
|
||||
void snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst);
|
||||
|
||||
#define SNMP_GENTRAP_COLDSTART 0
|
||||
#define SNMP_GENTRAP_WARMSTART 1
|
||||
#define SNMP_GENTRAP_LINKDOWN 2
|
||||
#define SNMP_GENTRAP_LINKUP 3
|
||||
#define SNMP_GENTRAP_AUTH_FAILURE 4
|
||||
#define SNMP_GENTRAP_EGP_NEIGHBOR_LOSS 5
|
||||
#define SNMP_GENTRAP_ENTERPRISE_SPECIFIC 6
|
||||
err_t snmp_send_trap_generic(s32_t generic_trap);
|
||||
err_t snmp_send_trap_specific(s32_t specific_trap);
|
||||
|
||||
#define SNMP_AUTH_TRAPS_DISABLED 0
|
||||
#define SNMP_AUTH_TRAPS_ENABLED 1
|
||||
void snmp_set_auth_traps_enabled(u8_t enable);
|
||||
u8_t snmp_get_auth_traps_enabled(void);
|
||||
|
||||
const char * snmp_get_community(void);
|
||||
void snmp_set_community(const char * const community);
|
||||
#if SNMP_COMMUNITY_EXT
|
||||
const char * snmp_get_community_write(void);
|
||||
const char * snmp_get_community_trap(void);
|
||||
void snmp_set_community(const char * const community);
|
||||
void snmp_set_community_write(const char * const community);
|
||||
void snmp_set_community_trap(const char * const community);
|
||||
#endif /* SNMP_COMMUNITY_EXT */
|
||||
|
||||
/* system */
|
||||
void snmp_set_sysdescr(const u8_t* str, const u8_t* len);
|
||||
void snmp_set_sysobjid(const struct snmp_obj_id *oid);
|
||||
void snmp_get_sysobjid_ptr(const struct snmp_obj_id **oid);
|
||||
void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen, u8_t bufsize);
|
||||
void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen, u8_t bufsize);
|
||||
void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen, u8_t bufsize);
|
||||
void snmp_set_snmpenableauthentraps(u8_t *value);
|
||||
void snmp_msg_event(u8_t request_id);
|
||||
void snmp_coldstart_trap(void);
|
||||
void snmp_authfail_trap(void);
|
||||
#else
|
||||
/* LWIP_SNMP support not available */
|
||||
/* define everything to be empty */
|
||||
|
||||
/* system */
|
||||
#define snmp_set_sysdescr(str, len)
|
||||
#define snmp_set_sysobjid(oid)
|
||||
#define snmp_get_sysobjid_ptr(oid)
|
||||
#define snmp_set_syscontact(ocstr, ocstrlen, bufsize)
|
||||
#define snmp_set_sysname(ocstr, ocstrlen, bufsize)
|
||||
#define snmp_set_syslocation(ocstr, ocstrlen, bufsize)
|
||||
#define snmp_set_snmpenableauthentraps(value)
|
||||
typedef void (*snmp_write_callback_fct)(const u32_t* oid, u8_t oid_len, void* callback_arg);
|
||||
void snmp_set_write_callback(snmp_write_callback_fct write_callback, void* callback_arg);
|
||||
|
||||
#endif /* LWIP_SNMP */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -1,105 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
* Abstract Syntax Notation One (ISO 8824, 8825) codec.
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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_HDR_APPS_SNMP_ASN1_H
|
||||
#define LWIP_HDR_APPS_SNMP_ASN1_H
|
||||
|
||||
#include "lwip/apps/snmp_opts.h"
|
||||
#include "lwip/err.h"
|
||||
#include "lwip/pbuf.h"
|
||||
#include "lwip/apps/snmp.h"
|
||||
|
||||
#if LWIP_SNMP
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SNMP_ASN1_UNIV (0) /* (!0x80 | !0x40) */
|
||||
#define SNMP_ASN1_APPLIC (0x40) /* (!0x80 | 0x40) */
|
||||
#define SNMP_ASN1_CONTXT (0x80) /* ( 0x80 | !0x40) */
|
||||
|
||||
#define SNMP_ASN1_CONSTR (0x20) /* ( 0x20) */
|
||||
#define SNMP_ASN1_PRIMIT (0) /* (!0x20) */
|
||||
|
||||
/* universal tags (from ASN.1 spec.) */
|
||||
#define SNMP_ASN1_INTEG 2
|
||||
#define SNMP_ASN1_OC_STR 4
|
||||
#define SNMP_ASN1_NUL 5
|
||||
#define SNMP_ASN1_OBJ_ID 6
|
||||
#define SNMP_ASN1_SEQ 16
|
||||
|
||||
/* application specific (SNMP) tags (from SNMPv2-SMI) */
|
||||
#define SNMP_ASN1_IPADDR 0 /* [APPLICATION 0] IMPLICIT OCTET STRING (SIZE (4)) */
|
||||
#define SNMP_ASN1_COUNTER 1 /* [APPLICATION 1] IMPLICIT INTEGER (0..4294967295) => u32_t */
|
||||
#define SNMP_ASN1_GAUGE 2 /* [APPLICATION 2] IMPLICIT INTEGER (0..4294967295) => u32_t */
|
||||
#define SNMP_ASN1_TIMETICKS 3 /* [APPLICATION 3] IMPLICIT INTEGER (0..4294967295) => u32_t */
|
||||
#define SNMP_ASN1_OPAQUE 4 /* [APPLICATION 4] IMPLICIT OCTET STRING */
|
||||
#define SNMP_ASN1_COUNTER64 6 /* [APPLICATION 6] IMPLICIT INTEGER (0..18446744073709551615) */
|
||||
|
||||
/* context specific (SNMP) tags (from SNMP spec. RFC1157) */
|
||||
#define SNMP_ASN1_PDU_GET_REQ 0
|
||||
#define SNMP_ASN1_PDU_GET_NEXT_REQ 1
|
||||
#define SNMP_ASN1_PDU_GET_RESP 2
|
||||
#define SNMP_ASN1_PDU_SET_REQ 3
|
||||
#define SNMP_ASN1_PDU_TRAP 4
|
||||
|
||||
err_t snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type);
|
||||
err_t snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length);
|
||||
err_t snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value);
|
||||
err_t snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value);
|
||||
err_t snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid);
|
||||
err_t snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw);
|
||||
|
||||
void snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed);
|
||||
void snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed);
|
||||
void snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed);
|
||||
void snmp_asn1_enc_oid_cnt(u16_t ident_len, const s32_t *ident, u16_t *octets_needed);
|
||||
err_t snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type);
|
||||
err_t snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length);
|
||||
err_t snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value);
|
||||
err_t snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value);
|
||||
err_t snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u16_t ident_len, const s32_t *ident);
|
||||
err_t snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, const u8_t *raw);
|
||||
|
||||
err_t snmp_asn1_dec_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value);
|
||||
u8_t snmp_asn1_enc_bits(u8_t *buf, u32_t buf_len, u32_t bit_value);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LWIP_SNMP */
|
||||
|
||||
#endif /* LWIP_HDR_APPS_SNMP_ASN1_H */
|
||||
349
src/include/lwip/apps/snmp_core.h
Normal file
349
src/include/lwip/apps/snmp_core.h
Normal file
@@ -0,0 +1,349 @@
|
||||
/**
|
||||
* @file
|
||||
* Generic MIB tree structures.
|
||||
*
|
||||
* @todo namespace prefixes
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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>
|
||||
* Martin Hentschel <info@cl-soft.de>
|
||||
*/
|
||||
|
||||
#ifndef LWIP_HDR_APPS_SNMP_CORE_H
|
||||
#define LWIP_HDR_APPS_SNMP_CORE_H
|
||||
|
||||
#include "lwip/apps/snmp_opts.h"
|
||||
|
||||
#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
|
||||
|
||||
#include "lwip/ip_addr.h"
|
||||
#include "lwip/err.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* basic ASN1 defines */
|
||||
#define SNMP_ASN1_CLASS_UNIVERSAL 0x00
|
||||
#define SNMP_ASN1_CLASS_APPLICATION 0x40
|
||||
#define SNMP_ASN1_CLASS_CONTEXT 0x80
|
||||
#define SNMP_ASN1_CLASS_PRIVATE 0xC0
|
||||
|
||||
#define SNMP_ASN1_CONTENTTYPE_PRIMITIVE 0x00
|
||||
#define SNMP_ASN1_CONTENTTYPE_CONSTRUCTED 0x20
|
||||
|
||||
/* universal tags (from ASN.1 spec.) */
|
||||
#define SNMP_ASN1_UNIVERSAL_END_OF_CONTENT 0
|
||||
#define SNMP_ASN1_UNIVERSAL_INTEGER 2
|
||||
#define SNMP_ASN1_UNIVERSAL_OCTET_STRING 4
|
||||
#define SNMP_ASN1_UNIVERSAL_NULL 5
|
||||
#define SNMP_ASN1_UNIVERSAL_OBJECT_ID 6
|
||||
#define SNMP_ASN1_UNIVERSAL_SEQUENCE_OF 16
|
||||
|
||||
/* application specific (SNMP) tags (from SNMPv2-SMI) */
|
||||
#define SNMP_ASN1_APPLICATION_IPADDR 0 /* [APPLICATION 0] IMPLICIT OCTET STRING (SIZE (4)) */
|
||||
#define SNMP_ASN1_APPLICATION_COUNTER 1 /* [APPLICATION 1] IMPLICIT INTEGER (0..4294967295) => u32_t */
|
||||
#define SNMP_ASN1_APPLICATION_GAUGE 2 /* [APPLICATION 2] IMPLICIT INTEGER (0..4294967295) => u32_t */
|
||||
#define SNMP_ASN1_APPLICATION_TIMETICKS 3 /* [APPLICATION 3] IMPLICIT INTEGER (0..4294967295) => u32_t */
|
||||
#define SNMP_ASN1_APPLICATION_OPAQUE 4 /* [APPLICATION 4] IMPLICIT OCTET STRING */
|
||||
#define SNMP_ASN1_APPLICATION_COUNTER64 6 /* [APPLICATION 6] IMPLICIT INTEGER (0..18446744073709551615) */
|
||||
|
||||
/* context specific (SNMP) tags (from RFC 1905) */
|
||||
#define SNMP_ASN1_CONTEXT_VARBIND_NO_SUCH_INSTANCE 1
|
||||
|
||||
/* full ASN1 type defines */
|
||||
#define SNMP_ASN1_TYPE_END_OF_CONTENT (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_END_OF_CONTENT)
|
||||
#define SNMP_ASN1_TYPE_INTEGER (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_INTEGER)
|
||||
#define SNMP_ASN1_TYPE_OCTET_STRING (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_OCTET_STRING)
|
||||
#define SNMP_ASN1_TYPE_NULL (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_NULL)
|
||||
#define SNMP_ASN1_TYPE_OBJECT_ID (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_OBJECT_ID)
|
||||
#define SNMP_ASN1_TYPE_SEQUENCE (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_UNIVERSAL_SEQUENCE_OF)
|
||||
#define SNMP_ASN1_TYPE_IPADDR (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_IPADDR)
|
||||
#define SNMP_ASN1_TYPE_COUNTER (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_COUNTER)
|
||||
#define SNMP_ASN1_TYPE_GAUGE (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_GAUGE)
|
||||
#define SNMP_ASN1_TYPE_TIMETICKS (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_TIMETICKS)
|
||||
#define SNMP_ASN1_TYPE_OPAQUE (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_OPAQUE)
|
||||
#define SNMP_ASN1_TYPE_COUNTER64 (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_COUNTER64)
|
||||
|
||||
typedef u8_t snmp_err_t;
|
||||
|
||||
/* error codes predefined by SNMP prot. */
|
||||
#define SNMP_ERR_NOERROR 0
|
||||
/*
|
||||
outdated v1 error codes. do not use anmore!
|
||||
#define SNMP_ERR_NOSUCHNAME 2 // use SNMP_ERR_NOSUCHINSTANCE instead
|
||||
#define SNMP_ERR_BADVALUE 3 // use SNMP_ERR_WRONGTYPE,SNMP_ERR_WRONGLENGTH,SNMP_ERR_WRONGENCODING or SNMP_ERR_WRONGVALUE instead
|
||||
#define SNMP_ERR_READONLY 4 // use SNMP_ERR_NOTWRITABLE instead
|
||||
*/
|
||||
#define SNMP_ERR_GENERROR 5
|
||||
#define SNMP_ERR_NOACCESS 6
|
||||
#define SNMP_ERR_WRONGTYPE 7
|
||||
#define SNMP_ERR_WRONGLENGTH 8
|
||||
#define SNMP_ERR_WRONGENCODING 9
|
||||
#define SNMP_ERR_WRONGVALUE 10
|
||||
#define SNMP_ERR_NOCREATION 11
|
||||
#define SNMP_ERR_INCONSISTENTVALUE 12
|
||||
#define SNMP_ERR_RESOURCEUNAVAILABLE 13
|
||||
#define SNMP_ERR_COMMITFAILED 14
|
||||
#define SNMP_ERR_UNDOFAILED 15
|
||||
#define SNMP_ERR_NOTWRITABLE 17
|
||||
#define SNMP_ERR_INCONSISTENTNAME 18
|
||||
|
||||
#define SNMP_VARBIND_EXCEPTION_OFFSET 0xF0
|
||||
#define SNMP_VARBIND_EXCEPTION_MASK 0x0F
|
||||
#define SNMP_ERR_NOSUCHINSTANCE SNMP_VARBIND_EXCEPTION_OFFSET + SNMP_ASN1_CONTEXT_VARBIND_NO_SUCH_INSTANCE
|
||||
|
||||
|
||||
/** internal object identifier representation */
|
||||
struct snmp_obj_id
|
||||
{
|
||||
u8_t len;
|
||||
u32_t id[SNMP_MAX_OBJ_ID_LEN];
|
||||
};
|
||||
|
||||
struct snmp_obj_id_const_ref
|
||||
{
|
||||
u8_t len;
|
||||
const u32_t* id;
|
||||
};
|
||||
|
||||
extern const struct snmp_obj_id_const_ref snmp_zero_dot_zero; /* administrative identifier from SNMPv2-SMI */
|
||||
|
||||
union snmp_variant_value
|
||||
{
|
||||
void* ptr;
|
||||
const void* const_ptr;
|
||||
u32_t u32;
|
||||
s32_t s32;
|
||||
};
|
||||
|
||||
#define SNMP_VARIANT_VALUE_TYPE_U32 0
|
||||
#define SNMP_VARIANT_VALUE_TYPE_S32 1
|
||||
#define SNMP_VARIANT_VALUE_TYPE_PTR 2
|
||||
#define SNMP_VARIANT_VALUE_TYPE_CONST_PTR 3
|
||||
|
||||
/**
|
||||
SNMP MIB node types
|
||||
tree node is the only node the stack can process in order to walk the tree,
|
||||
all other nodes are assumed to be leaf nodes.
|
||||
This cannot be an enum because users may want to define their own node types.
|
||||
*/
|
||||
#define SNMP_NODE_TREE 0x00
|
||||
/* predefined leaf node types */
|
||||
#define SNMP_NODE_SCALAR 0x01
|
||||
#define SNMP_NODE_SCALAR_ARRAY 0x02
|
||||
#define SNMP_NODE_TABLE 0x03
|
||||
#define SNMP_NODE_THREADSYNC 0x04
|
||||
|
||||
/** node "base class" layout, the mandatory fields for a node */
|
||||
struct snmp_node
|
||||
{
|
||||
/** one out of SNMP_NODE_TREE or any leaf node type (like SNMP_NODE_SCALAR) */
|
||||
u8_t node_type;
|
||||
/** the number assigned to this node which used as part of the full OID */
|
||||
u32_t oid;
|
||||
};
|
||||
|
||||
/* SNMP node instance access types */
|
||||
typedef enum {
|
||||
SNMP_NODE_INSTANCE_ACCESS_READ = 1,
|
||||
SNMP_NODE_INSTANCE_ACCESS_WRITE = 2,
|
||||
SNMP_NODE_INSTANCE_READ_ONLY = SNMP_NODE_INSTANCE_ACCESS_READ,
|
||||
SNMP_NODE_INSTANCE_READ_WRITE = (SNMP_NODE_INSTANCE_ACCESS_READ | SNMP_NODE_INSTANCE_ACCESS_WRITE),
|
||||
SNMP_NODE_INSTANCE_WRITE_ONLY = SNMP_NODE_INSTANCE_ACCESS_WRITE,
|
||||
SNMP_NODE_INSTANCE_NOT_ACCESSIBLE = 0
|
||||
} snmp_access_t;
|
||||
|
||||
struct snmp_node_instance;
|
||||
|
||||
typedef u16_t (*node_instance_get_value_method)(struct snmp_node_instance*, void*);
|
||||
typedef snmp_err_t (*node_instance_set_test_method)(struct snmp_node_instance*, u16_t, void*);
|
||||
typedef snmp_err_t (*node_instance_set_value_method)(struct snmp_node_instance*, u16_t, void*);
|
||||
typedef void (*node_instance_release_method)(struct snmp_node_instance*);
|
||||
|
||||
#define SNMP_GET_VALUE_RAW_DATA 0x8000
|
||||
|
||||
struct snmp_node_instance
|
||||
{
|
||||
/** prefilled with the node, get_instance() is called on; may be changed by user to any value to pass an arbitrary node between calls to get_instance() and get_value/test_value/set_value */
|
||||
const struct snmp_node* node;
|
||||
/** prefilled with the instance id requested; for get_instance() this is the exact oid requested; for get_next_instance() this is the relative starting point, stack expects relative oid of next node here */
|
||||
struct snmp_obj_id instance_oid;
|
||||
|
||||
/** ASN type for this object (see snmp_asn1.h for definitions) */
|
||||
u8_t asn1_type;
|
||||
/** one out of instance access types defined above (SNMP_NODE_INSTANCE_READ_ONLY,...) */
|
||||
snmp_access_t access;
|
||||
|
||||
/** returns object value for the given object identifier */
|
||||
node_instance_get_value_method get_value;
|
||||
/** tests length and/or range BEFORE setting */
|
||||
node_instance_set_test_method set_test;
|
||||
/** sets object value, only called when set_test() was successful */
|
||||
node_instance_set_value_method set_value;
|
||||
/** called in any case when the instance is not required anymore by stack (useful for freeing memory allocated in get_instance/get_next_instance methods) */
|
||||
node_instance_release_method release_instance;
|
||||
|
||||
/** reference to pass arbitrary value between calls to get_instance() and get_value/test_value/set_value */
|
||||
union snmp_variant_value reference;
|
||||
/** see reference (if reference is a pointer, the length of underlying data may be stored here or anything else) */
|
||||
u32_t reference_len;
|
||||
};
|
||||
|
||||
|
||||
struct snmp_tree_node
|
||||
{
|
||||
/* inherited "base class" members */
|
||||
struct snmp_node node;
|
||||
u16_t subnode_count;
|
||||
const struct snmp_node* const *subnodes;
|
||||
};
|
||||
|
||||
#define SNMP_CREATE_TREE_NODE(oid, subnodes) \
|
||||
{{ SNMP_NODE_TREE, (oid) }, \
|
||||
(u16_t)LWIP_ARRAYSIZE(subnodes), (subnodes) }
|
||||
|
||||
#define SNMP_CREATE_EMPTY_TREE_NODE(oid) \
|
||||
{{ SNMP_NODE_TREE, (oid) }, \
|
||||
0, NULL }
|
||||
|
||||
struct snmp_leaf_node
|
||||
{
|
||||
/* inherited "base class" members */
|
||||
struct snmp_node node;
|
||||
u8_t (*get_instance)(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);
|
||||
u8_t (*get_next_instance)(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);
|
||||
};
|
||||
|
||||
/* represents a single mib with its base oid and root node */
|
||||
struct snmp_mib
|
||||
{
|
||||
const u32_t *base_oid;
|
||||
u8_t base_oid_len;
|
||||
const struct snmp_node *root_node;
|
||||
};
|
||||
|
||||
#define SNMP_MIB_CREATE(oid_list, root_node) { (oid_list), (u8_t)LWIP_ARRAYSIZE(oid_list), root_node }
|
||||
|
||||
/** OID range structure */
|
||||
struct snmp_oid_range
|
||||
{
|
||||
u32_t min;
|
||||
u32_t max;
|
||||
};
|
||||
|
||||
/** checks if incoming OID length and values are in allowed ranges */
|
||||
u8_t snmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range *oid_ranges, u8_t oid_ranges_len);
|
||||
|
||||
/** state for next_oid_init / next_oid_check functions */
|
||||
struct snmp_next_oid_state
|
||||
{
|
||||
const u32_t* start_oid;
|
||||
u8_t start_oid_len;
|
||||
|
||||
u32_t* next_oid;
|
||||
u8_t next_oid_len;
|
||||
u8_t next_oid_max_len;
|
||||
|
||||
u8_t status;
|
||||
void* reference;
|
||||
};
|
||||
|
||||
#define SNMP_NEXT_OID_STATUS_SUCCESS 0
|
||||
#define SNMP_NEXT_OID_STATUS_NO_MATCH 1
|
||||
#define SNMP_NEXT_OID_STATUS_BUF_TO_SMALL 2
|
||||
|
||||
/** initialize struct next_oid_state using this function before passing it to next_oid_check */
|
||||
void snmp_next_oid_init(struct snmp_next_oid_state *state,
|
||||
const u32_t *start_oid, u8_t start_oid_len,
|
||||
u32_t *next_oid_buf, u8_t next_oid_max_len);
|
||||
/** checks if the passed incomplete OID may be a possible candidate for snmp_next_oid_check();
|
||||
this methid is intended if the complete OID is not yet known but it is very expensive to build it up,
|
||||
so it is possible to test the starting part before building up the complete oid and pass it to snmp_next_oid_check()*/
|
||||
u8_t snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len);
|
||||
/** checks the passed OID if it is a candidate to be the next one (get_next); returns !=0 if passed oid is currently closest, otherwise 0 */
|
||||
u8_t snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len, void* reference);
|
||||
|
||||
void snmp_oid_assign(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len);
|
||||
void snmp_oid_combine(struct snmp_obj_id* target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len);
|
||||
void snmp_oid_prefix(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len);
|
||||
void snmp_oid_append(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len);
|
||||
u8_t snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len);
|
||||
s8_t snmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len);
|
||||
|
||||
u8_t snmp_oid_to_ip(const u32_t *oid, ip4_addr_t *ip);
|
||||
void snmp_ip_to_oid(const ip4_addr_t *ip, u32_t *oid);
|
||||
|
||||
u8_t snmp_set_test_ok(struct snmp_node_instance* instance, u16_t value_len, void* value); /* generic function which can be used if test is always successful */
|
||||
|
||||
err_t snmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value);
|
||||
err_t snmp_decode_truthvalue(const s32_t *asn1_value, u8_t *bool_value);
|
||||
u8_t snmp_encode_bits(u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count);
|
||||
u8_t snmp_encode_truthvalue(s32_t *asn1_value, u32_t bool_value);
|
||||
|
||||
struct snmp_statistics
|
||||
{
|
||||
u32_t inpkts;
|
||||
u32_t outpkts;
|
||||
u32_t inbadversions;
|
||||
u32_t inbadcommunitynames;
|
||||
u32_t inbadcommunityuses;
|
||||
u32_t inasnparseerrs;
|
||||
u32_t intoobigs;
|
||||
u32_t innosuchnames;
|
||||
u32_t inbadvalues;
|
||||
u32_t inreadonlys;
|
||||
u32_t ingenerrs;
|
||||
u32_t intotalreqvars;
|
||||
u32_t intotalsetvars;
|
||||
u32_t ingetrequests;
|
||||
u32_t ingetnexts;
|
||||
u32_t insetrequests;
|
||||
u32_t ingetresponses;
|
||||
u32_t intraps;
|
||||
u32_t outtoobigs;
|
||||
u32_t outnosuchnames;
|
||||
u32_t outbadvalues;
|
||||
u32_t outgenerrs;
|
||||
u32_t outgetrequests;
|
||||
u32_t outgetnexts;
|
||||
u32_t outsetrequests;
|
||||
u32_t outgetresponses;
|
||||
u32_t outtraps;
|
||||
};
|
||||
|
||||
extern struct snmp_statistics snmp_stats;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LWIP_SNMP */
|
||||
|
||||
#endif /* LWIP_HDR_APPS_SNMP_CORE_H */
|
||||
79
src/include/lwip/apps/snmp_mib2.h
Normal file
79
src/include/lwip/apps/snmp_mib2.h
Normal file
@@ -0,0 +1,79 @@
|
||||
/**
|
||||
* @file
|
||||
* MIB2 callback functions called from throughout the stack to integrate a MIB2
|
||||
* into lwIP (together with MIB2_STATS).
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||
* 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.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Dirk Ziegelmeier <dziegel@gmx.de>
|
||||
*
|
||||
*/
|
||||
#ifndef LWIP_HDR_APPS_SNMP_MIB2_H
|
||||
#define LWIP_HDR_APPS_SNMP_MIB2_H
|
||||
|
||||
#include "lwip/apps/snmp_opts.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
|
||||
#if SNMP_LWIP_MIB2
|
||||
|
||||
#include "lwip/apps/snmp_core.h"
|
||||
|
||||
extern const struct snmp_mib mib2;
|
||||
|
||||
#if SNMP_USE_NETCONN
|
||||
#include "lwip/apps/snmp_threadsync.h"
|
||||
void snmp_mib2_lwip_synchronizer(snmp_threadsync_called_fn fn, void* arg);
|
||||
extern struct snmp_threadsync_locks snmp_mib2_lwip_locks;
|
||||
#endif
|
||||
|
||||
#ifndef SNMP_SYSSERVICES
|
||||
#define SNMP_SYSSERVICES ((1 << 6) | (1 << 3) | ((IP_FORWARD) << 2))
|
||||
#endif
|
||||
|
||||
void snmp_mib2_set_sysdescr(const u8_t* str, const u16_t* len); /* read-only be defintion */
|
||||
void snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize);
|
||||
void snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen);
|
||||
void snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize);
|
||||
void snmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen);
|
||||
void snmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize);
|
||||
void snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen);
|
||||
|
||||
#endif /* SNMP_LWIP_MIB2 */
|
||||
#endif /* LWIP_SNMP */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LWIP_HDR_APPS_SNMP_MIB2_H */
|
||||
@@ -29,17 +29,11 @@
|
||||
* Author: Dirk Ziegelmeier
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LWIP_HDR_APPS_SNMP_OPTS_H
|
||||
#define LWIP_HDR_APPS_SNMP_OPTS_H
|
||||
#ifndef LWIP_HDR_SNMP_OPTS_H
|
||||
#define LWIP_HDR_SNMP_OPTS_H
|
||||
|
||||
#include "lwip/opt.h"
|
||||
|
||||
/*
|
||||
----------------------------------
|
||||
---------- SNMP options ----------
|
||||
----------------------------------
|
||||
*/
|
||||
/**
|
||||
* LWIP_SNMP==1: This enables the lwIP SNMP agent. UDP must be available
|
||||
* for SNMP transport.
|
||||
@@ -53,14 +47,47 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SNMP_CONCURRENT_REQUESTS: Number of concurrent requests the module will
|
||||
* allow. At least one request buffer is required.
|
||||
* Does not have to be changed unless external MIBs answer request asynchronously
|
||||
* SNMP_USE_NETCONN: Use netconn API instead of raw API.
|
||||
* Makes SNMP agent run in a worker thread, so blocking operations
|
||||
* can be done in MIB calls.
|
||||
*/
|
||||
#ifndef SNMP_CONCURRENT_REQUESTS
|
||||
#define SNMP_CONCURRENT_REQUESTS 1
|
||||
#ifndef SNMP_USE_NETCONN
|
||||
#define SNMP_USE_NETCONN 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SNMP_USE_RAW: Use raw API.
|
||||
* SNMP agent does not run in a worker thread, so blocking operations
|
||||
* should not be done in MIB calls.
|
||||
*/
|
||||
#ifndef SNMP_USE_RAW
|
||||
#define SNMP_USE_RAW 1
|
||||
#endif
|
||||
|
||||
#if SNMP_USE_NETCONN && SNMP_USE_RAW
|
||||
#error SNMP stack can use only one of the APIs {raw, netconn}
|
||||
#endif
|
||||
|
||||
#if LWIP_SNMP && !SNMP_USE_NETCONN && !SNMP_USE_RAW
|
||||
#error SNMP stack needs a receive API and UDP {raw, netconn}
|
||||
#endif
|
||||
|
||||
#if SNMP_USE_NETCONN
|
||||
/**
|
||||
* SNMP_STACK_SIZE: Stack size of SNMP worker thread
|
||||
*/
|
||||
#ifndef SNMP_STACK_SIZE
|
||||
#define SNMP_STACK_SIZE DEFAULT_THREAD_STACKSIZE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SNMP_THREAD_PRIO: SNMP worker thread priority
|
||||
*/
|
||||
#ifndef SNMP_THREAD_PRIO
|
||||
#define SNMP_THREAD_PRIO DEFAULT_THREAD_PRIO
|
||||
#endif
|
||||
#endif /* SNMP_USE_NETCONN */
|
||||
|
||||
/**
|
||||
* SNMP_TRAP_DESTINATIONS: Number of trap destinations. At least one trap
|
||||
* destination is required
|
||||
@@ -69,15 +96,6 @@
|
||||
#define SNMP_TRAP_DESTINATIONS 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
#ifndef SNMP_PRIVATE_MIB
|
||||
#define SNMP_PRIVATE_MIB 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Only allow SNMP write actions that are 'safe' (e.g. disabling netifs is not
|
||||
* a safe action and disabled when SNMP_SAFE_REQUESTS = 1).
|
||||
@@ -88,28 +106,26 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* The maximum length of strings used. This affects the size of
|
||||
* MEMP_SNMP_VALUE elements.
|
||||
* The maximum length of strings used.
|
||||
*/
|
||||
#ifndef SNMP_MAX_OCTET_STRING_LEN
|
||||
#define SNMP_MAX_OCTET_STRING_LEN 127
|
||||
#endif
|
||||
|
||||
/**
|
||||
* The maximum depth of the SNMP tree.
|
||||
* With private MIBs enabled, this depends on your MIB!
|
||||
* This affects the size of MEMP_SNMP_VALUE elements.
|
||||
* The maximum number of Sub ID's inside an object identifier.
|
||||
* Indirectly this also limits the maximum depth of SNMP tree.
|
||||
*/
|
||||
#ifndef SNMP_MAX_TREE_DEPTH
|
||||
#define SNMP_MAX_TREE_DEPTH 15
|
||||
#ifndef SNMP_MAX_OBJ_ID_LEN
|
||||
#define SNMP_MAX_OBJ_ID_LEN 32
|
||||
#endif
|
||||
|
||||
/**
|
||||
* The size of the MEMP_SNMP_VALUE elements, normally calculated from
|
||||
* SNMP_MAX_OCTET_STRING_LEN and SNMP_MAX_TREE_DEPTH.
|
||||
* The maximum size of a value.
|
||||
*/
|
||||
#ifndef SNMP_MAX_VALUE_SIZE
|
||||
#define SNMP_MAX_VALUE_SIZE LWIP_MAX((SNMP_MAX_OCTET_STRING_LEN)+1, sizeof(s32_t)*(SNMP_MAX_TREE_DEPTH))
|
||||
#define SNMP_MIN_VALUE_SIZE (2 * sizeof(u32_t*)) // size required to store the basic types (8 bytes for counter64)
|
||||
#define SNMP_MAX_VALUE_SIZE LWIP_MAX(LWIP_MAX((SNMP_MAX_OCTET_STRING_LEN), sizeof(u32_t)*(SNMP_MAX_OBJ_ID_LEN)), SNMP_MIN_VALUE_SIZE)
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -120,16 +136,9 @@
|
||||
#define SNMP_COMMUNITY "public"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Set this to 1 to enable support for dedicated write-access and trap communities.
|
||||
*/
|
||||
#ifndef SNMP_COMMUNITY_EXT
|
||||
#define SNMP_COMMUNITY_EXT 0
|
||||
#endif
|
||||
|
||||
#if SNMP_COMMUNITY_EXT
|
||||
/**
|
||||
* The snmp write-access community.
|
||||
* Set this community to "" in order to disallow any write access.
|
||||
*/
|
||||
#ifndef SNMP_COMMUNITY_WRITE
|
||||
#define SNMP_COMMUNITY_WRITE "private"
|
||||
@@ -141,48 +150,43 @@
|
||||
#ifndef SNMP_COMMUNITY_TRAP
|
||||
#define SNMP_COMMUNITY_TRAP "public"
|
||||
#endif
|
||||
#endif /* SNMP_COMMUNITY_EXT */
|
||||
|
||||
/**
|
||||
* SNMP_NUM_NODE: the number of leafs in the SNMP tree.
|
||||
* The maximum length of community string.
|
||||
* If community names shall be adjusted at runtime via snmp_set_community() calls,
|
||||
* enter here the possible maximum length (+1 for terminating null character).
|
||||
*/
|
||||
#ifndef SNMP_NUM_NODE
|
||||
#define SNMP_NUM_NODE 50
|
||||
#ifndef SNMP_MAX_COMMUNITY_STR_LEN
|
||||
#define SNMP_MAX_COMMUNITY_STR_LEN LWIP_MAX(LWIP_MAX(sizeof(SNMP_COMMUNITY), sizeof(SNMP_COMMUNITY_WRITE)), sizeof(SNMP_COMMUNITY_TRAP))
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SNMP_NUM_ROOTNODE: the number of branches in the SNMP tree.
|
||||
* Every branch has one leaf (MEMP_NUM_SNMP_NODE) at least!
|
||||
* The OID identifiying the device. This may be the enterprise OID itself or any OID located below it in tree.
|
||||
*/
|
||||
#ifndef SNMP_NUM_ROOTNODE
|
||||
#define SNMP_NUM_ROOTNODE 30
|
||||
#ifndef SNMP_DEVICE_ENTERPRISE_OID
|
||||
/**
|
||||
* IANA assigned enterprise ID for lwIP is 26381
|
||||
* @see http://www.iana.org/assignments/enterprise-numbers
|
||||
*
|
||||
* @note this enterprise ID is assigned to the lwIP project,
|
||||
* all object identifiers living under this ID are assigned
|
||||
* by the lwIP maintainers!
|
||||
* @note don't change this define, use snmp_set_device_enterprise_oid()
|
||||
*
|
||||
* If you need to create your own private MIB you'll need
|
||||
* to apply for your own enterprise ID with IANA:
|
||||
* http://www.iana.org/numbers.html
|
||||
*/
|
||||
#define SNMP_LWIP_ENTERPRISE_OID 26381
|
||||
#define SNMP_DEVICE_ENTERPRISE_OID {1, 3, 6, 1, 4, 1, SNMP_LWIP_ENTERPRISE_OID}
|
||||
#define SNMP_DEVICE_ENTERPRISE_OID_LEN 7
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SNMP_NUM_VARBIND: influences the number of concurrent requests:
|
||||
* 2 of these are used per request (1 for input, 1 for output), so this needs
|
||||
* to be increased only if you want to support concurrent requests or multiple
|
||||
* variables per request/response.
|
||||
* SNMP_DEBUG: Enable debugging for SNMP messages.
|
||||
*/
|
||||
#ifndef SNMP_NUM_VARBIND
|
||||
#define SNMP_NUM_VARBIND 2
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SNMP_NUM_VALUE: the number of OID or values concurrently used
|
||||
* (does not have to be changed normally) - >=3 of these are used per request
|
||||
* (1 for the value read and 2 for OIDs - input and output on getnext, or more
|
||||
* if you want to support multiple varibles per request/response)
|
||||
*/
|
||||
#ifndef SNMP_NUM_VALUE
|
||||
#define SNMP_NUM_VALUE 3
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SNMP_MSG_DEBUG: Enable debugging for SNMP messages.
|
||||
*/
|
||||
#ifndef SNMP_MSG_DEBUG
|
||||
#define SNMP_MSG_DEBUG LWIP_DBG_OFF
|
||||
#ifndef SNMP_DEBUG
|
||||
#define SNMP_DEBUG LWIP_DBG_OFF
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -192,4 +196,54 @@
|
||||
#define SNMP_MIB_DEBUG LWIP_DBG_OFF
|
||||
#endif
|
||||
|
||||
#endif /* LWIP_HDR_APPS_SNMP_OPTS_H */
|
||||
/**
|
||||
* Indicates if the MIB2 implementation of LWIP SNMP stack is used.
|
||||
*/
|
||||
#ifndef SNMP_LWIP_MIB2
|
||||
#define SNMP_LWIP_MIB2 LWIP_SNMP
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Value return for sysDesc field of MIB2.
|
||||
*/
|
||||
#ifndef SNMP_LWIP_MIB2_SYSDESC
|
||||
#define SNMP_LWIP_MIB2_SYSDESC "lwIP"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Value return for sysName field of MIB2.
|
||||
* To make sysName field settable, call snmp_mib2_set_sysname() to provide the necessary buffers.
|
||||
*/
|
||||
#ifndef SNMP_LWIP_MIB2_SYSNAME
|
||||
#define SNMP_LWIP_MIB2_SYSNAME "FQDN-unk"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Value return for sysContact field of MIB2.
|
||||
* To make sysContact field settable, call snmp_mib2_set_syscontact() to provide the necessary buffers.
|
||||
*/
|
||||
#ifndef SNMP_LWIP_MIB2_SYSCONTACT
|
||||
#define SNMP_LWIP_MIB2_SYSCONTACT ""
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Value return for sysLocation field of MIB2.
|
||||
* To make sysLocation field settable, call snmp_mib2_set_syslocation() to provide the necessary buffers.
|
||||
*/
|
||||
#ifndef SNMP_LWIP_MIB2_SYSLOCATION
|
||||
#define SNMP_LWIP_MIB2_SYSLOCATION ""
|
||||
#endif
|
||||
|
||||
/**
|
||||
* This value is used to limit the repetitions processed in GetBulk requests (value == 0 means no limitation).
|
||||
* This may be useful to limit the load for a single request.
|
||||
* According to SNMP RFC 1905 it is allowed to not return all requested variables from a GetBulk request if system load would be too high.
|
||||
* so the effect is that the client will do more requests to gather all data.
|
||||
* For the stack this could be useful in case that SNMP processing is done in TCP/IP thread. In this situation a request with many
|
||||
* repetitions could block the thread for a longer time. Setting limit here will keep the stack more responsive.
|
||||
*/
|
||||
#ifndef SNMP_LWIP_GETBULK_MAX_REPETITIONS
|
||||
#define SNMP_LWIP_GETBULK_MAX_REPETITIONS 0
|
||||
#endif
|
||||
|
||||
#endif /* SNMP_LWIP_MIB2 */
|
||||
|
||||
108
src/include/lwip/apps/snmp_scalar.h
Normal file
108
src/include/lwip/apps/snmp_scalar.h
Normal file
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||
* 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.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Martin Hentschel <info@cl-soft.de>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LWIP_HDR_APPS_SNMP_SCALAR_H
|
||||
#define LWIP_HDR_APPS_SNMP_SCALAR_H
|
||||
|
||||
#include "lwip/apps/snmp_opts.h"
|
||||
#include "lwip/apps/snmp_core.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
|
||||
|
||||
/* basic scalar node */
|
||||
|
||||
struct snmp_scalar_node
|
||||
{
|
||||
/* inherited "base class" members */
|
||||
struct snmp_leaf_node node;
|
||||
u8_t asn1_type;
|
||||
snmp_access_t access;
|
||||
node_instance_get_value_method get_value;
|
||||
node_instance_set_test_method set_test;
|
||||
node_instance_set_value_method set_value;
|
||||
};
|
||||
|
||||
|
||||
snmp_err_t snmp_scalar_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);
|
||||
snmp_err_t snmp_scalar_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);
|
||||
|
||||
#define SNMP_SCALAR_CREATE_NODE(oid, access, asn1_type, get_value_method, set_test_method, set_value_method) \
|
||||
{{{ SNMP_NODE_SCALAR, (oid) }, \
|
||||
snmp_scalar_get_instance, \
|
||||
snmp_scalar_get_next_instance }, \
|
||||
(asn1_type), (access), (get_value_method), (set_test_method), (set_value_method) }
|
||||
|
||||
#define SNMP_SCALAR_CREATE_NODE_READONLY(oid, asn1_type, get_value_method) SNMP_SCALAR_CREATE_NODE(oid, SNMP_NODE_INSTANCE_READ_ONLY, asn1_type, get_value_method, NULL, NULL)
|
||||
|
||||
/* scalar array node - a tree node which contains scalars only as children */
|
||||
struct snmp_scalar_array_node_def
|
||||
{
|
||||
u32_t oid;
|
||||
u8_t asn1_type;
|
||||
snmp_access_t access;
|
||||
};
|
||||
|
||||
typedef u16_t (*snmp_scalar_array_get_value_method)(const struct snmp_scalar_array_node_def*, void*);
|
||||
typedef snmp_err_t (*snmp_scalar_array_set_test_method)(const struct snmp_scalar_array_node_def*, u16_t, void*);
|
||||
typedef snmp_err_t (*snmp_scalar_array_set_value_method)(const struct snmp_scalar_array_node_def*, u16_t, void*);
|
||||
|
||||
struct snmp_scalar_array_node
|
||||
{
|
||||
/* inherited "base class" members */
|
||||
struct snmp_leaf_node node;
|
||||
u16_t array_node_count;
|
||||
const struct snmp_scalar_array_node_def* array_nodes;
|
||||
snmp_scalar_array_get_value_method get_value;
|
||||
snmp_scalar_array_set_test_method set_test;
|
||||
snmp_scalar_array_set_value_method set_value;
|
||||
};
|
||||
|
||||
snmp_err_t snmp_scalar_array_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);
|
||||
snmp_err_t snmp_scalar_array_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);
|
||||
|
||||
#define SNMP_SCALAR_CREATE_ARRAY_NODE(oid, array_nodes, get_value_method, set_test_method, set_value_method) \
|
||||
{{{ SNMP_NODE_SCALAR_ARRAY, (oid) }, \
|
||||
snmp_scalar_array_get_instance, \
|
||||
snmp_scalar_array_get_next_instance }, \
|
||||
(u16_t)LWIP_ARRAYSIZE(array_nodes), (array_nodes), (get_value_method), (set_test_method), (set_value_method) }
|
||||
|
||||
#endif /* LWIP_SNMP */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LWIP_HDR_APPS_SNMP_SCALAR_H */
|
||||
@@ -1,271 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
* Generic MIB tree structures.
|
||||
*
|
||||
* @todo namespace prefixes
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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_HDR_APPS_SNMP_STRUCTS_H
|
||||
#define LWIP_HDR_APPS_SNMP_STRUCTS_H
|
||||
|
||||
#include "lwip/opt.h"
|
||||
|
||||
#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
|
||||
|
||||
#include "lwip/apps/snmp.h"
|
||||
#include "lwip/memp.h"
|
||||
|
||||
LWIP_MEMPOOL_PROTOTYPE(SNMP_ROOTNODE);
|
||||
LWIP_MEMPOOL_PROTOTYPE(SNMP_NODE);
|
||||
|
||||
#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
|
||||
|
||||
/* MIB object instance */
|
||||
#define MIB_OBJECT_NONE 0
|
||||
#define MIB_OBJECT_SCALAR 1
|
||||
#define MIB_OBJECT_TAB 2
|
||||
|
||||
/* MIB access types */
|
||||
#define MIB_ACCESS_READ 1
|
||||
#define MIB_ACCESS_WRITE 2
|
||||
|
||||
/* MIB object access */
|
||||
#define MIB_OBJECT_READ_ONLY MIB_ACCESS_READ
|
||||
#define MIB_OBJECT_READ_WRITE (MIB_ACCESS_READ | MIB_ACCESS_WRITE)
|
||||
#define MIB_OBJECT_WRITE_ONLY MIB_ACCESS_WRITE
|
||||
#define MIB_OBJECT_NOT_ACCESSIBLE 0
|
||||
|
||||
/** object definition returned by (get_object_def)() */
|
||||
struct obj_def
|
||||
{
|
||||
/* MIB_OBJECT_NONE (0), MIB_OBJECT_SCALAR (1), MIB_OBJECT_TAB (2) */
|
||||
u8_t instance;
|
||||
/* 0 read-only, 1 read-write, 2 write-only, 3 not-accessible */
|
||||
u8_t access;
|
||||
/* ASN type for this object */
|
||||
u8_t asn_type;
|
||||
/* length of instance part of supplied object identifier */
|
||||
u8_t id_inst_len;
|
||||
/* instance part of supplied object identifier */
|
||||
s32_t *id_inst_ptr;
|
||||
};
|
||||
|
||||
struct snmp_name_ptr
|
||||
{
|
||||
u8_t ident_len;
|
||||
s32_t *ident;
|
||||
};
|
||||
|
||||
/** MIB const scalar (.0) node */
|
||||
#define MIB_NODE_SC 0x01
|
||||
/** MIB const array node */
|
||||
#define MIB_NODE_AR 0x02
|
||||
/** MIB list root node (memp_malloced from RAM) */
|
||||
#define MIB_NODE_LR 0x04
|
||||
/** MIB node for external objects */
|
||||
#define MIB_NODE_EX 0x05
|
||||
|
||||
/** node "base class" layout, the mandatory fields for a node */
|
||||
struct mib_node
|
||||
{
|
||||
/** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */
|
||||
u8_t node_type;
|
||||
};
|
||||
|
||||
/** derived node for scalars .0 index */
|
||||
struct mib_scalar_node
|
||||
{
|
||||
/* inherited "base class" members */
|
||||
struct mib_node node;
|
||||
/** returns struct obj_def for the given object identifier */
|
||||
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||
/** returns object value for the given object identifier */
|
||||
u16_t (*get_value)(struct obj_def *od, void *value);
|
||||
/** tests length and/or range BEFORE setting */
|
||||
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
|
||||
/** sets object value, only to be called when set_test() */
|
||||
void (*set_value)(struct obj_def *od, u16_t len, void *value);
|
||||
};
|
||||
|
||||
/** describes an array entry (objid/node pair) */
|
||||
struct mib_array_node_entry
|
||||
{
|
||||
s32_t objid;
|
||||
const struct mib_node *nptr;
|
||||
};
|
||||
|
||||
/** derived node, points to a fixed size array
|
||||
of sub-identifiers plus a 'child' pointer */
|
||||
struct mib_array_node
|
||||
{
|
||||
/* inherited "base class" members */
|
||||
struct mib_node node;
|
||||
|
||||
/* additional struct members */
|
||||
u16_t maxlength;
|
||||
const struct mib_array_node_entry *entries;
|
||||
};
|
||||
|
||||
struct mib_list_node
|
||||
{
|
||||
struct mib_list_node *prev;
|
||||
struct mib_list_node *next;
|
||||
s32_t objid;
|
||||
struct mib_node *nptr;
|
||||
};
|
||||
|
||||
/** derived node, points to a doubly linked list
|
||||
of sub-identifiers plus a 'child' pointer */
|
||||
struct mib_list_rootnode
|
||||
{
|
||||
/* inherited "base class" members */
|
||||
struct mib_scalar_node scalar;
|
||||
|
||||
/* additional struct members */
|
||||
struct mib_list_node *head;
|
||||
struct mib_list_node *tail;
|
||||
/* counts list nodes in list */
|
||||
u16_t count;
|
||||
};
|
||||
|
||||
/** derived node, has access functions for mib object in external memory or device
|
||||
using 'tree_level' and 'idx', with a range 0 .. (level_length() - 1) */
|
||||
struct mib_external_node
|
||||
{
|
||||
/* inherited "base class" members */
|
||||
struct mib_node node;
|
||||
|
||||
/* additional struct members */
|
||||
/** points to an external (in memory) record of some sort of addressing
|
||||
information, passed to and interpreted by the functions below */
|
||||
void* addr_inf;
|
||||
/** tree levels under this node */
|
||||
u8_t tree_levels;
|
||||
/** number of objects at this level */
|
||||
u16_t (*level_length)(void* addr_inf, u8_t level);
|
||||
/** compares object sub identifier with external id
|
||||
return zero when equal, nonzero when unequal */
|
||||
s32_t (*ident_cmp)(void* addr_inf, u8_t level, u16_t idx, s32_t sub_id);
|
||||
void (*get_objid)(void* addr_inf, u8_t level, u16_t idx, s32_t *sub_id);
|
||||
|
||||
/** async Questions */
|
||||
void (*get_object_def_q)(void* addr_inf, u8_t rid, u8_t ident_len, s32_t *ident);
|
||||
void (*get_value_q)(u8_t rid, struct obj_def *od);
|
||||
void (*set_test_q)(u8_t rid, struct obj_def *od);
|
||||
void (*set_value_q)(u8_t rid, struct obj_def *od, u16_t len, void *value);
|
||||
/** async Answers */
|
||||
void (*get_object_def_a)(u8_t rid, u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||
u16_t (*get_value_a)(u8_t rid, struct obj_def *od, void *value);
|
||||
u8_t (*set_test_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
|
||||
void (*set_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
|
||||
/** async Panic Close (agent returns error reply,
|
||||
e.g. used for external transaction cleanup) */
|
||||
void (*get_object_def_pc)(u8_t rid, u8_t ident_len, s32_t *ident);
|
||||
void (*get_value_pc)(u8_t rid, struct obj_def *od);
|
||||
void (*set_test_pc)(u8_t rid, struct obj_def *od);
|
||||
void (*set_value_pc)(u8_t rid, struct obj_def *od);
|
||||
};
|
||||
|
||||
/** export MIB tree from mib2.c */
|
||||
extern const struct mib_array_node internet;
|
||||
|
||||
/** dummy function pointers for non-leaf MIB nodes from mib2.c */
|
||||
void noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||
u16_t noleafs_get_value(struct obj_def *od, void *value);
|
||||
u8_t noleafs_set_test(struct obj_def *od, u16_t len, void *value);
|
||||
void noleafs_set_value(struct obj_def *od, u16_t len, void *value);
|
||||
|
||||
void snmp_oidtoip(s32_t *ident, ip4_addr_t *ip);
|
||||
void snmp_iptooid(const ip4_addr_t *ip, s32_t *ident);
|
||||
void snmp_ifindextonetif(s32_t ifindex, struct netif **netif);
|
||||
void snmp_netiftoifindex(struct netif *netif, s32_t *ifidx);
|
||||
|
||||
struct mib_list_node* snmp_mib_ln_alloc(s32_t id);
|
||||
void snmp_mib_ln_free(struct mib_list_node *ln);
|
||||
struct mib_list_rootnode* snmp_mib_lrn_alloc(void);
|
||||
void snmp_mib_lrn_free(struct mib_list_rootnode *lrn);
|
||||
|
||||
s8_t snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn);
|
||||
s8_t snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn);
|
||||
struct mib_list_rootnode *snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n);
|
||||
|
||||
const struct mib_node* snmp_search_tree(const struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np);
|
||||
const struct mib_node* snmp_expand_tree(const struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret);
|
||||
u8_t snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident);
|
||||
u8_t snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret);
|
||||
|
||||
/* SNMP stack internal MIB2 statistics */
|
||||
void mib2_inc_snmpinpkts(void);
|
||||
void mib2_inc_snmpoutpkts(void);
|
||||
void mib2_inc_snmpinbadversions(void);
|
||||
void mib2_inc_snmpinbadcommunitynames(void);
|
||||
void mib2_inc_snmpinbadcommunityuses(void);
|
||||
void mib2_inc_snmpinasnparseerrs(void);
|
||||
void mib2_inc_snmpintoobigs(void);
|
||||
void mib2_inc_snmpinnosuchnames(void);
|
||||
void mib2_inc_snmpinbadvalues(void);
|
||||
void mib2_inc_snmpinreadonlys(void);
|
||||
void mib2_inc_snmpingenerrs(void);
|
||||
void mib2_add_snmpintotalreqvars(u8_t value);
|
||||
void mib2_add_snmpintotalsetvars(u8_t value);
|
||||
void mib2_inc_snmpingetrequests(void);
|
||||
void mib2_inc_snmpingetnexts(void);
|
||||
void mib2_inc_snmpinsetrequests(void);
|
||||
void mib2_inc_snmpingetresponses(void);
|
||||
void mib2_inc_snmpintraps(void);
|
||||
void mib2_inc_snmpouttoobigs(void);
|
||||
void mib2_inc_snmpoutnosuchnames(void);
|
||||
void mib2_inc_snmpoutbadvalues(void);
|
||||
void mib2_inc_snmpoutgenerrs(void);
|
||||
void mib2_inc_snmpoutgetrequests(void);
|
||||
void mib2_inc_snmpoutgetnexts(void);
|
||||
void mib2_inc_snmpoutsetrequests(void);
|
||||
void mib2_inc_snmpoutgetresponses(void);
|
||||
void mib2_inc_snmpouttraps(void);
|
||||
void mib2_get_snmpgrpid_ptr(const struct snmp_obj_id **oid);
|
||||
void mib2_get_snmpenableauthentraps(u8_t *value);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LWIP_SNMP */
|
||||
|
||||
#endif /* LWIP_HDR_APPS_SNMP_STRUCTS_H */
|
||||
122
src/include/lwip/apps/snmp_table.h
Normal file
122
src/include/lwip/apps/snmp_table.h
Normal file
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||
* 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.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Martin Hentschel <info@cl-soft.de>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LWIP_HDR_APPS_SNMP_TABLE_H
|
||||
#define LWIP_HDR_APPS_SNMP_TABLE_H
|
||||
|
||||
#include "lwip/apps/snmp_opts.h"
|
||||
#include "lwip/apps/snmp_core.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
|
||||
|
||||
/* default (customizable) read/write table */
|
||||
|
||||
struct snmp_table_col_def
|
||||
{
|
||||
u32_t index;
|
||||
u8_t asn1_type;
|
||||
snmp_access_t access;
|
||||
};
|
||||
|
||||
struct snmp_table_node
|
||||
{
|
||||
/* inherited "base class" members */
|
||||
struct snmp_leaf_node node;
|
||||
u16_t column_count;
|
||||
const struct snmp_table_col_def* columns;
|
||||
snmp_err_t (*get_cell_instance)(const u32_t* column, const u32_t* row_oid, const u8_t row_oid_len, struct snmp_node_instance* cell_instance);
|
||||
snmp_err_t (*get_next_cell_instance)(const u32_t* column, struct snmp_obj_id* row_oid, struct snmp_node_instance* cell_instance);
|
||||
/** returns object value for the given object identifier */
|
||||
node_instance_get_value_method get_value;
|
||||
/** tests length and/or range BEFORE setting */
|
||||
node_instance_set_test_method set_test;
|
||||
/** sets object value, only called when set_test() was successful */
|
||||
node_instance_set_value_method set_value;
|
||||
};
|
||||
|
||||
snmp_err_t snmp_table_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);
|
||||
snmp_err_t snmp_table_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);
|
||||
|
||||
#define SNMP_TABLE_CREATE(oid, columns, get_cell_instance_method, get_next_cell_instance_method, get_value_method, set_test_method, set_value_method) \
|
||||
{{{ SNMP_NODE_TABLE, (oid) }, \
|
||||
snmp_table_get_instance, \
|
||||
snmp_table_get_next_instance }, \
|
||||
(u16_t)LWIP_ARRAYSIZE(columns), (columns), \
|
||||
(get_cell_instance_method), (get_next_cell_instance_method), \
|
||||
(get_value_method), (set_test_method), (set_value_method)}
|
||||
|
||||
#define SNMP_TABLE_GET_COLUMN_FROM_OID(oid) ((oid)[1]) /* first array value is (fixed) row entry (fixed to 1) and 2nd value is column, follow3ed by instance */
|
||||
|
||||
|
||||
/* simple read-only table */
|
||||
|
||||
struct snmp_table_simple_col_def
|
||||
{
|
||||
u32_t index;
|
||||
u8_t asn1_type;
|
||||
u8_t data_type; /* any of SNMP_VARIANT_VALUE_TYPE_*, depending of what union member is used to store the value*/
|
||||
};
|
||||
|
||||
struct snmp_table_simple_node
|
||||
{
|
||||
/* inherited "base class" members */
|
||||
struct snmp_leaf_node node;
|
||||
u16_t column_count;
|
||||
const struct snmp_table_simple_col_def* columns;
|
||||
snmp_err_t (*get_cell_value)(const u32_t* column, const u32_t* row_oid, const u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len);
|
||||
snmp_err_t (*get_next_cell_instance_and_value)(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len);
|
||||
};
|
||||
|
||||
snmp_err_t snmp_table_simple_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);
|
||||
snmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);
|
||||
|
||||
#define SNMP_TABLE_CREATE_SIMPLE(oid, columns, get_cell_value_method, get_next_cell_instance_and_value_method) \
|
||||
{{{ SNMP_NODE_TABLE, (oid) }, \
|
||||
snmp_table_simple_get_instance, \
|
||||
snmp_table_simple_get_next_instance }, \
|
||||
(u16_t)LWIP_ARRAYSIZE(columns), (columns), (get_cell_value_method), (get_next_cell_instance_and_value_method) }
|
||||
|
||||
u16_t snmp_table_extract_value_from_s32ref(struct snmp_node_instance* instance, void* value);
|
||||
u16_t snmp_table_extract_value_from_u32ref(struct snmp_node_instance* instance, void* value);
|
||||
u16_t snmp_table_extract_value_from_refconstptr(struct snmp_node_instance* instance, void* value);
|
||||
|
||||
#endif /* LWIP_SNMP */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LWIP_HDR_APPS_SNMP_TABLE_H */
|
||||
84
src/include/lwip/apps/snmp_threadsync.h
Normal file
84
src/include/lwip/apps/snmp_threadsync.h
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||
* 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.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Dirk Ziegelmeier <dziegel@gmx.de>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LWIP_HDR_APPS_SNMP_THREADSYNC_H
|
||||
#define LWIP_HDR_APPS_SNMP_THREADSYNC_H
|
||||
|
||||
#include "lwip/apps/snmp_opts.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
|
||||
|
||||
#include "lwip/apps/snmp_core.h"
|
||||
#include "lwip/sys.h"
|
||||
|
||||
typedef void (*snmp_threadsync_called_fn)(void* arg);
|
||||
typedef void (*snmp_threadsync_synchronizer_fn)(snmp_threadsync_called_fn fn, void* arg);
|
||||
|
||||
struct snmp_threadsync_locks
|
||||
{
|
||||
sys_sem_t sem;
|
||||
sys_mutex_t sem_usage_mutex;
|
||||
snmp_threadsync_synchronizer_fn sync_fn;
|
||||
};
|
||||
|
||||
/* thread sync node */
|
||||
struct snmp_threadsync_node
|
||||
{
|
||||
/* inherited "base class" members */
|
||||
struct snmp_leaf_node node;
|
||||
const struct snmp_leaf_node *target;
|
||||
struct snmp_threadsync_locks *locks;
|
||||
};
|
||||
|
||||
snmp_err_t snmp_threadsync_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);
|
||||
snmp_err_t snmp_threadsync_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);
|
||||
|
||||
#define SNMP_CREATE_THREAD_SYNC_NODE(oid, target, locks) \
|
||||
{{{ SNMP_NODE_THREADSYNC, (oid) }, \
|
||||
snmp_threadsync_get_instance, \
|
||||
snmp_threadsync_get_next_instance }, \
|
||||
(target), \
|
||||
(locks) }
|
||||
|
||||
void snmp_threadsync_init(struct snmp_threadsync_locks *locks, snmp_threadsync_synchronizer_fn sync_fn);
|
||||
|
||||
#endif /* LWIP_SNMP */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LWIP_HDR_APPS_SNMP_THREADSYNC_H */
|
||||
Reference in New Issue
Block a user