1*10465441SEvalZero /** 2*10465441SEvalZero * @file 3*10465441SEvalZero * SNMP Agent message handling structures. 4*10465441SEvalZero */ 5*10465441SEvalZero 6*10465441SEvalZero /* 7*10465441SEvalZero * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. 8*10465441SEvalZero * All rights reserved. 9*10465441SEvalZero * 10*10465441SEvalZero * Redistribution and use in source and binary forms, with or without modification, 11*10465441SEvalZero * are permitted provided that the following conditions are met: 12*10465441SEvalZero * 13*10465441SEvalZero * 1. Redistributions of source code must retain the above copyright notice, 14*10465441SEvalZero * this list of conditions and the following disclaimer. 15*10465441SEvalZero * 2. Redistributions in binary form must reproduce the above copyright notice, 16*10465441SEvalZero * this list of conditions and the following disclaimer in the documentation 17*10465441SEvalZero * and/or other materials provided with the distribution. 18*10465441SEvalZero * 3. The name of the author may not be used to endorse or promote products 19*10465441SEvalZero * derived from this software without specific prior written permission. 20*10465441SEvalZero * 21*10465441SEvalZero * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 22*10465441SEvalZero * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 23*10465441SEvalZero * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 24*10465441SEvalZero * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25*10465441SEvalZero * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 26*10465441SEvalZero * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27*10465441SEvalZero * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28*10465441SEvalZero * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 29*10465441SEvalZero * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 30*10465441SEvalZero * OF SUCH DAMAGE. 31*10465441SEvalZero * 32*10465441SEvalZero * Author: Christiaan Simons <[email protected]> 33*10465441SEvalZero */ 34*10465441SEvalZero 35*10465441SEvalZero #ifndef __LWIP_SNMP_MSG_H__ 36*10465441SEvalZero #define __LWIP_SNMP_MSG_H__ 37*10465441SEvalZero 38*10465441SEvalZero #include "lwip/opt.h" 39*10465441SEvalZero #include "lwip/snmp.h" 40*10465441SEvalZero #include "lwip/snmp_structs.h" 41*10465441SEvalZero #include "lwip/ip_addr.h" 42*10465441SEvalZero #include "lwip/err.h" 43*10465441SEvalZero 44*10465441SEvalZero #if LWIP_SNMP 45*10465441SEvalZero 46*10465441SEvalZero #if SNMP_PRIVATE_MIB 47*10465441SEvalZero /* When using a private MIB, you have to create a file 'private_mib.h' that contains 48*10465441SEvalZero * a 'struct mib_array_node mib_private' which contains your MIB. */ 49*10465441SEvalZero #include "private_mib.h" 50*10465441SEvalZero #endif 51*10465441SEvalZero 52*10465441SEvalZero #ifdef __cplusplus 53*10465441SEvalZero extern "C" { 54*10465441SEvalZero #endif 55*10465441SEvalZero 56*10465441SEvalZero /* The listen port of the SNMP agent. Clients have to make their requests to 57*10465441SEvalZero this port. Most standard clients won't work if you change this! */ 58*10465441SEvalZero #ifndef SNMP_IN_PORT 59*10465441SEvalZero #define SNMP_IN_PORT 161 60*10465441SEvalZero #endif 61*10465441SEvalZero /* The remote port the SNMP agent sends traps to. Most standard trap sinks won't 62*10465441SEvalZero work if you change this! */ 63*10465441SEvalZero #ifndef SNMP_TRAP_PORT 64*10465441SEvalZero #define SNMP_TRAP_PORT 162 65*10465441SEvalZero #endif 66*10465441SEvalZero 67*10465441SEvalZero #define SNMP_ES_NOERROR 0 68*10465441SEvalZero #define SNMP_ES_TOOBIG 1 69*10465441SEvalZero #define SNMP_ES_NOSUCHNAME 2 70*10465441SEvalZero #define SNMP_ES_BADVALUE 3 71*10465441SEvalZero #define SNMP_ES_READONLY 4 72*10465441SEvalZero #define SNMP_ES_GENERROR 5 73*10465441SEvalZero 74*10465441SEvalZero #define SNMP_GENTRAP_COLDSTART 0 75*10465441SEvalZero #define SNMP_GENTRAP_WARMSTART 1 76*10465441SEvalZero #define SNMP_GENTRAP_AUTHFAIL 4 77*10465441SEvalZero #define SNMP_GENTRAP_ENTERPRISESPC 6 78*10465441SEvalZero 79*10465441SEvalZero struct snmp_varbind 80*10465441SEvalZero { 81*10465441SEvalZero /* next pointer, NULL for last in list */ 82*10465441SEvalZero struct snmp_varbind *next; 83*10465441SEvalZero /* previous pointer, NULL for first in list */ 84*10465441SEvalZero struct snmp_varbind *prev; 85*10465441SEvalZero 86*10465441SEvalZero /* object identifier length (in s32_t) */ 87*10465441SEvalZero u8_t ident_len; 88*10465441SEvalZero /* object identifier array */ 89*10465441SEvalZero s32_t *ident; 90*10465441SEvalZero 91*10465441SEvalZero /* object value ASN1 type */ 92*10465441SEvalZero u8_t value_type; 93*10465441SEvalZero /* object value length (in u8_t) */ 94*10465441SEvalZero u8_t value_len; 95*10465441SEvalZero /* object value */ 96*10465441SEvalZero void *value; 97*10465441SEvalZero 98*10465441SEvalZero /* encoding varbind seq length length */ 99*10465441SEvalZero u8_t seqlenlen; 100*10465441SEvalZero /* encoding object identifier length length */ 101*10465441SEvalZero u8_t olenlen; 102*10465441SEvalZero /* encoding object value length length */ 103*10465441SEvalZero u8_t vlenlen; 104*10465441SEvalZero /* encoding varbind seq length */ 105*10465441SEvalZero u16_t seqlen; 106*10465441SEvalZero /* encoding object identifier length */ 107*10465441SEvalZero u16_t olen; 108*10465441SEvalZero /* encoding object value length */ 109*10465441SEvalZero u16_t vlen; 110*10465441SEvalZero }; 111*10465441SEvalZero 112*10465441SEvalZero struct snmp_varbind_root 113*10465441SEvalZero { 114*10465441SEvalZero struct snmp_varbind *head; 115*10465441SEvalZero struct snmp_varbind *tail; 116*10465441SEvalZero /* number of variable bindings in list */ 117*10465441SEvalZero u8_t count; 118*10465441SEvalZero /* encoding varbind-list seq length length */ 119*10465441SEvalZero u8_t seqlenlen; 120*10465441SEvalZero /* encoding varbind-list seq length */ 121*10465441SEvalZero u16_t seqlen; 122*10465441SEvalZero }; 123*10465441SEvalZero 124*10465441SEvalZero /** output response message header length fields */ 125*10465441SEvalZero struct snmp_resp_header_lengths 126*10465441SEvalZero { 127*10465441SEvalZero /* encoding error-index length length */ 128*10465441SEvalZero u8_t erridxlenlen; 129*10465441SEvalZero /* encoding error-status length length */ 130*10465441SEvalZero u8_t errstatlenlen; 131*10465441SEvalZero /* encoding request id length length */ 132*10465441SEvalZero u8_t ridlenlen; 133*10465441SEvalZero /* encoding pdu length length */ 134*10465441SEvalZero u8_t pdulenlen; 135*10465441SEvalZero /* encoding community length length */ 136*10465441SEvalZero u8_t comlenlen; 137*10465441SEvalZero /* encoding version length length */ 138*10465441SEvalZero u8_t verlenlen; 139*10465441SEvalZero /* encoding sequence length length */ 140*10465441SEvalZero u8_t seqlenlen; 141*10465441SEvalZero 142*10465441SEvalZero /* encoding error-index length */ 143*10465441SEvalZero u16_t erridxlen; 144*10465441SEvalZero /* encoding error-status length */ 145*10465441SEvalZero u16_t errstatlen; 146*10465441SEvalZero /* encoding request id length */ 147*10465441SEvalZero u16_t ridlen; 148*10465441SEvalZero /* encoding pdu length */ 149*10465441SEvalZero u16_t pdulen; 150*10465441SEvalZero /* encoding community length */ 151*10465441SEvalZero u16_t comlen; 152*10465441SEvalZero /* encoding version length */ 153*10465441SEvalZero u16_t verlen; 154*10465441SEvalZero /* encoding sequence length */ 155*10465441SEvalZero u16_t seqlen; 156*10465441SEvalZero }; 157*10465441SEvalZero 158*10465441SEvalZero /** output response message header length fields */ 159*10465441SEvalZero struct snmp_trap_header_lengths 160*10465441SEvalZero { 161*10465441SEvalZero /* encoding timestamp length length */ 162*10465441SEvalZero u8_t tslenlen; 163*10465441SEvalZero /* encoding specific-trap length length */ 164*10465441SEvalZero u8_t strplenlen; 165*10465441SEvalZero /* encoding generic-trap length length */ 166*10465441SEvalZero u8_t gtrplenlen; 167*10465441SEvalZero /* encoding agent-addr length length */ 168*10465441SEvalZero u8_t aaddrlenlen; 169*10465441SEvalZero /* encoding enterprise-id length length */ 170*10465441SEvalZero u8_t eidlenlen; 171*10465441SEvalZero /* encoding pdu length length */ 172*10465441SEvalZero u8_t pdulenlen; 173*10465441SEvalZero /* encoding community length length */ 174*10465441SEvalZero u8_t comlenlen; 175*10465441SEvalZero /* encoding version length length */ 176*10465441SEvalZero u8_t verlenlen; 177*10465441SEvalZero /* encoding sequence length length */ 178*10465441SEvalZero u8_t seqlenlen; 179*10465441SEvalZero 180*10465441SEvalZero /* encoding timestamp length */ 181*10465441SEvalZero u16_t tslen; 182*10465441SEvalZero /* encoding specific-trap length */ 183*10465441SEvalZero u16_t strplen; 184*10465441SEvalZero /* encoding generic-trap length */ 185*10465441SEvalZero u16_t gtrplen; 186*10465441SEvalZero /* encoding agent-addr length */ 187*10465441SEvalZero u16_t aaddrlen; 188*10465441SEvalZero /* encoding enterprise-id length */ 189*10465441SEvalZero u16_t eidlen; 190*10465441SEvalZero /* encoding pdu length */ 191*10465441SEvalZero u16_t pdulen; 192*10465441SEvalZero /* encoding community length */ 193*10465441SEvalZero u16_t comlen; 194*10465441SEvalZero /* encoding version length */ 195*10465441SEvalZero u16_t verlen; 196*10465441SEvalZero /* encoding sequence length */ 197*10465441SEvalZero u16_t seqlen; 198*10465441SEvalZero }; 199*10465441SEvalZero 200*10465441SEvalZero /* Accepting new SNMP messages. */ 201*10465441SEvalZero #define SNMP_MSG_EMPTY 0 202*10465441SEvalZero /* Search for matching object for variable binding. */ 203*10465441SEvalZero #define SNMP_MSG_SEARCH_OBJ 1 204*10465441SEvalZero /* Perform SNMP operation on in-memory object. 205*10465441SEvalZero Pass-through states, for symmetry only. */ 206*10465441SEvalZero #define SNMP_MSG_INTERNAL_GET_OBJDEF 2 207*10465441SEvalZero #define SNMP_MSG_INTERNAL_GET_VALUE 3 208*10465441SEvalZero #define SNMP_MSG_INTERNAL_SET_TEST 4 209*10465441SEvalZero #define SNMP_MSG_INTERNAL_GET_OBJDEF_S 5 210*10465441SEvalZero #define SNMP_MSG_INTERNAL_SET_VALUE 6 211*10465441SEvalZero /* Perform SNMP operation on object located externally. 212*10465441SEvalZero In theory this could be used for building a proxy agent. 213*10465441SEvalZero Practical use is for an enterprise spc. app. gateway. */ 214*10465441SEvalZero #define SNMP_MSG_EXTERNAL_GET_OBJDEF 7 215*10465441SEvalZero #define SNMP_MSG_EXTERNAL_GET_VALUE 8 216*10465441SEvalZero #define SNMP_MSG_EXTERNAL_SET_TEST 9 217*10465441SEvalZero #define SNMP_MSG_EXTERNAL_GET_OBJDEF_S 10 218*10465441SEvalZero #define SNMP_MSG_EXTERNAL_SET_VALUE 11 219*10465441SEvalZero 220*10465441SEvalZero #define SNMP_COMMUNITY_STR_LEN 64 221*10465441SEvalZero struct snmp_msg_pstat 222*10465441SEvalZero { 223*10465441SEvalZero /* lwIP local port (161) binding */ 224*10465441SEvalZero struct udp_pcb *pcb; 225*10465441SEvalZero /* source IP address */ 226*10465441SEvalZero ip_addr_t sip; 227*10465441SEvalZero /* source UDP port */ 228*10465441SEvalZero u16_t sp; 229*10465441SEvalZero /* request type */ 230*10465441SEvalZero u8_t rt; 231*10465441SEvalZero /* request ID */ 232*10465441SEvalZero s32_t rid; 233*10465441SEvalZero /* error status */ 234*10465441SEvalZero s32_t error_status; 235*10465441SEvalZero /* error index */ 236*10465441SEvalZero s32_t error_index; 237*10465441SEvalZero /* community name (zero terminated) */ 238*10465441SEvalZero u8_t community[SNMP_COMMUNITY_STR_LEN + 1]; 239*10465441SEvalZero /* community string length (exclusive zero term) */ 240*10465441SEvalZero u8_t com_strlen; 241*10465441SEvalZero /* one out of MSG_EMPTY, MSG_DEMUX, MSG_INTERNAL, MSG_EXTERNAL_x */ 242*10465441SEvalZero u8_t state; 243*10465441SEvalZero /* saved arguments for MSG_EXTERNAL_x */ 244*10465441SEvalZero struct mib_external_node *ext_mib_node; 245*10465441SEvalZero struct snmp_name_ptr ext_name_ptr; 246*10465441SEvalZero struct obj_def ext_object_def; 247*10465441SEvalZero struct snmp_obj_id ext_oid; 248*10465441SEvalZero /* index into input variable binding list */ 249*10465441SEvalZero u8_t vb_idx; 250*10465441SEvalZero /* ptr into input variable binding list */ 251*10465441SEvalZero struct snmp_varbind *vb_ptr; 252*10465441SEvalZero /* list of variable bindings from input */ 253*10465441SEvalZero struct snmp_varbind_root invb; 254*10465441SEvalZero /* list of variable bindings to output */ 255*10465441SEvalZero struct snmp_varbind_root outvb; 256*10465441SEvalZero /* output response lengths used in ASN encoding */ 257*10465441SEvalZero struct snmp_resp_header_lengths rhl; 258*10465441SEvalZero }; 259*10465441SEvalZero 260*10465441SEvalZero struct snmp_msg_trap 261*10465441SEvalZero { 262*10465441SEvalZero /* lwIP local port (161) binding */ 263*10465441SEvalZero struct udp_pcb *pcb; 264*10465441SEvalZero /* destination IP address in network order */ 265*10465441SEvalZero ip_addr_t dip; 266*10465441SEvalZero 267*10465441SEvalZero /* source enterprise ID (sysObjectID) */ 268*10465441SEvalZero struct snmp_obj_id *enterprise; 269*10465441SEvalZero /* source IP address, raw network order format */ 270*10465441SEvalZero u8_t sip_raw[4]; 271*10465441SEvalZero /* generic trap code */ 272*10465441SEvalZero u32_t gen_trap; 273*10465441SEvalZero /* specific trap code */ 274*10465441SEvalZero u32_t spc_trap; 275*10465441SEvalZero /* timestamp */ 276*10465441SEvalZero u32_t ts; 277*10465441SEvalZero /* list of variable bindings to output */ 278*10465441SEvalZero struct snmp_varbind_root outvb; 279*10465441SEvalZero /* output trap lengths used in ASN encoding */ 280*10465441SEvalZero struct snmp_trap_header_lengths thl; 281*10465441SEvalZero }; 282*10465441SEvalZero 283*10465441SEvalZero /** Agent Version constant, 0 = v1 oddity */ 284*10465441SEvalZero extern const s32_t snmp_version; 285*10465441SEvalZero /** Agent default "public" community string */ 286*10465441SEvalZero extern const char snmp_publiccommunity[7]; 287*10465441SEvalZero 288*10465441SEvalZero extern struct snmp_msg_trap trap_msg; 289*10465441SEvalZero 290*10465441SEvalZero /** Agent setup, start listening to port 161. */ 291*10465441SEvalZero void snmp_init(void); 292*10465441SEvalZero void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable); 293*10465441SEvalZero void snmp_trap_dst_ip_set(u8_t dst_idx, ip_addr_t *dst); 294*10465441SEvalZero 295*10465441SEvalZero /** Varbind-list functions. */ 296*10465441SEvalZero struct snmp_varbind* snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len); 297*10465441SEvalZero void snmp_varbind_free(struct snmp_varbind *vb); 298*10465441SEvalZero void snmp_varbind_list_free(struct snmp_varbind_root *root); 299*10465441SEvalZero void snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb); 300*10465441SEvalZero struct snmp_varbind* snmp_varbind_tail_remove(struct snmp_varbind_root *root); 301*10465441SEvalZero 302*10465441SEvalZero /** Handle an internal (recv) or external (private response) event. */ 303*10465441SEvalZero void snmp_msg_event(u8_t request_id); 304*10465441SEvalZero err_t snmp_send_response(struct snmp_msg_pstat *m_stat); 305*10465441SEvalZero err_t snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap); 306*10465441SEvalZero void snmp_coldstart_trap(void); 307*10465441SEvalZero void snmp_authfail_trap(void); 308*10465441SEvalZero 309*10465441SEvalZero #ifdef __cplusplus 310*10465441SEvalZero } 311*10465441SEvalZero #endif 312*10465441SEvalZero 313*10465441SEvalZero #endif /* LWIP_SNMP */ 314*10465441SEvalZero 315*10465441SEvalZero #endif /* __LWIP_SNMP_MSG_H__ */ 316