Example program with HTTPServer and sensor data streaming over TCPSockets, using Donatien Garnier's Net APIs and services code on top of LWIP. Files StreamServer.h and .cpp encapsulate streaming over TCPSockets. Broadcast is done by sendToAll(), and all incoming data is echoed back to the client. Echo code can be replaced with some remote control of the streaming interface. See main() that shows how to periodically send some data to all subscribed clients. To subscribe, a client should open a socket at <mbed_ip> port 123. I used few lines in TCL code to set up a quick sink for the data. HTTP files are served on port 80 concurrently to the streaming.
snmp_structs.h
00001 /** 00002 * @file 00003 * Generic MIB tree structures. 00004 * 00005 * @todo namespace prefixes 00006 */ 00007 00008 /* 00009 * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. 00010 * All rights reserved. 00011 * 00012 * Redistribution and use in source and binary forms, with or without modification, 00013 * are permitted provided that the following conditions are met: 00014 * 00015 * 1. Redistributions of source code must retain the above copyright notice, 00016 * this list of conditions and the following disclaimer. 00017 * 2. Redistributions in binary form must reproduce the above copyright notice, 00018 * this list of conditions and the following disclaimer in the documentation 00019 * and/or other materials provided with the distribution. 00020 * 3. The name of the author may not be used to endorse or promote products 00021 * derived from this software without specific prior written permission. 00022 * 00023 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 00024 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 00025 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 00026 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00027 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 00028 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00029 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00030 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 00031 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 00032 * OF SUCH DAMAGE. 00033 * 00034 * Author: Christiaan Simons <christiaan.simons@axon.tv> 00035 */ 00036 00037 #ifndef __LWIP_SNMP_STRUCTS_H__ 00038 #define __LWIP_SNMP_STRUCTS_H__ 00039 00040 #include "lwip/opt.h" 00041 00042 #if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ 00043 00044 #include "lwip/snmp.h" 00045 00046 #if SNMP_PRIVATE_MIB 00047 /* When using a private MIB, you have to create a file 'private_mib.h' that contains 00048 * a 'struct mib_array_node mib_private' which contains your MIB. */ 00049 #include "private_mib.h" 00050 #endif 00051 00052 #ifdef __cplusplus 00053 extern "C" { 00054 #endif 00055 00056 /* MIB object instance */ 00057 #define MIB_OBJECT_NONE 0 00058 #define MIB_OBJECT_SCALAR 1 00059 #define MIB_OBJECT_TAB 2 00060 00061 /* MIB access types */ 00062 #define MIB_ACCESS_READ 1 00063 #define MIB_ACCESS_WRITE 2 00064 00065 /* MIB object access */ 00066 #define MIB_OBJECT_READ_ONLY MIB_ACCESS_READ 00067 #define MIB_OBJECT_READ_WRITE (MIB_ACCESS_READ | MIB_ACCESS_WRITE) 00068 #define MIB_OBJECT_WRITE_ONLY MIB_ACCESS_WRITE 00069 #define MIB_OBJECT_NOT_ACCESSIBLE 0 00070 00071 /** object definition returned by (get_object_def)() */ 00072 struct obj_def 00073 { 00074 /* MIB_OBJECT_NONE (0), MIB_OBJECT_SCALAR (1), MIB_OBJECT_TAB (2) */ 00075 u8_t instance; 00076 /* 0 read-only, 1 read-write, 2 write-only, 3 not-accessible */ 00077 u8_t access; 00078 /* ASN type for this object */ 00079 u8_t asn_type; 00080 /* value length (host length) */ 00081 u16_t v_len; 00082 /* length of instance part of supplied object identifier */ 00083 u8_t id_inst_len; 00084 /* instance part of supplied object identifier */ 00085 s32_t *id_inst_ptr; 00086 }; 00087 00088 struct snmp_name_ptr 00089 { 00090 u8_t ident_len; 00091 s32_t *ident; 00092 }; 00093 00094 /** MIB const scalar (.0) node */ 00095 #define MIB_NODE_SC 0x01 00096 /** MIB const array node */ 00097 #define MIB_NODE_AR 0x02 00098 /** MIB array node (mem_malloced from RAM) */ 00099 #define MIB_NODE_RA 0x03 00100 /** MIB list root node (mem_malloced from RAM) */ 00101 #define MIB_NODE_LR 0x04 00102 /** MIB node for external objects */ 00103 #define MIB_NODE_EX 0x05 00104 00105 /** node "base class" layout, the mandatory fields for a node */ 00106 struct mib_node 00107 { 00108 /** returns struct obj_def for the given object identifier */ 00109 void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); 00110 /** returns object value for the given object identifier, 00111 @note the caller must allocate at least len bytes for the value */ 00112 void (*get_value)(struct obj_def *od, u16_t len, void *value); 00113 /** tests length and/or range BEFORE setting */ 00114 u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); 00115 /** sets object value, only to be called when set_test() */ 00116 void (*set_value)(struct obj_def *od, u16_t len, void *value); 00117 /** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */ 00118 u8_t node_type; 00119 /* array or max list length */ 00120 u16_t maxlength; 00121 }; 00122 00123 /** derived node for scalars .0 index */ 00124 typedef struct mib_node mib_scalar_node; 00125 00126 /** derived node, points to a fixed size const array 00127 of sub-identifiers plus a 'child' pointer */ 00128 struct mib_array_node 00129 { 00130 /* inherited "base class" members */ 00131 void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); 00132 void (*get_value)(struct obj_def *od, u16_t len, void *value); 00133 u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); 00134 void (*set_value)(struct obj_def *od, u16_t len, void *value); 00135 00136 u8_t node_type; 00137 u16_t maxlength; 00138 00139 /* aditional struct members */ 00140 const s32_t *objid; 00141 struct mib_node* const *nptr; 00142 }; 00143 00144 /** derived node, points to a fixed size mem_malloced array 00145 of sub-identifiers plus a 'child' pointer */ 00146 struct mib_ram_array_node 00147 { 00148 /* inherited "base class" members */ 00149 void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); 00150 void (*get_value)(struct obj_def *od, u16_t len, void *value); 00151 u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); 00152 void (*set_value)(struct obj_def *od, u16_t len, void *value); 00153 00154 u8_t node_type; 00155 u16_t maxlength; 00156 00157 /* aditional struct members */ 00158 s32_t *objid; 00159 struct mib_node **nptr; 00160 }; 00161 00162 struct mib_list_node 00163 { 00164 struct mib_list_node *prev; 00165 struct mib_list_node *next; 00166 s32_t objid; 00167 struct mib_node *nptr; 00168 }; 00169 00170 /** derived node, points to a doubly linked list 00171 of sub-identifiers plus a 'child' pointer */ 00172 struct mib_list_rootnode 00173 { 00174 /* inherited "base class" members */ 00175 void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); 00176 void (*get_value)(struct obj_def *od, u16_t len, void *value); 00177 u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); 00178 void (*set_value)(struct obj_def *od, u16_t len, void *value); 00179 00180 u8_t node_type; 00181 u16_t maxlength; 00182 00183 /* aditional struct members */ 00184 struct mib_list_node *head; 00185 struct mib_list_node *tail; 00186 /* counts list nodes in list */ 00187 u16_t count; 00188 }; 00189 00190 /** derived node, has access functions for mib object in external memory or device 00191 using 'tree_level' and 'idx', with a range 0 .. (level_length() - 1) */ 00192 struct mib_external_node 00193 { 00194 /* inherited "base class" members */ 00195 void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); 00196 void (*get_value)(struct obj_def *od, u16_t len, void *value); 00197 u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); 00198 void (*set_value)(struct obj_def *od, u16_t len, void *value); 00199 00200 u8_t node_type; 00201 u16_t maxlength; 00202 00203 /* aditional struct members */ 00204 /** points to an extenal (in memory) record of some sort of addressing 00205 information, passed to and interpreted by the funtions below */ 00206 void* addr_inf; 00207 /** tree levels under this node */ 00208 u8_t tree_levels; 00209 /** number of objects at this level */ 00210 u16_t (*level_length)(void* addr_inf, u8_t level); 00211 /** compares object sub identifier with external id 00212 return zero when equal, nonzero when unequal */ 00213 s32_t (*ident_cmp)(void* addr_inf, u8_t level, u16_t idx, s32_t sub_id); 00214 void (*get_objid)(void* addr_inf, u8_t level, u16_t idx, s32_t *sub_id); 00215 00216 /** async Questions */ 00217 void (*get_object_def_q)(void* addr_inf, u8_t rid, u8_t ident_len, s32_t *ident); 00218 void (*get_value_q)(u8_t rid, struct obj_def *od); 00219 void (*set_test_q)(u8_t rid, struct obj_def *od); 00220 void (*set_value_q)(u8_t rid, struct obj_def *od, u16_t len, void *value); 00221 /** async Answers */ 00222 void (*get_object_def_a)(u8_t rid, u8_t ident_len, s32_t *ident, struct obj_def *od); 00223 void (*get_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); 00224 u8_t (*set_test_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); 00225 void (*set_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); 00226 /** async Panic Close (agent returns error reply, 00227 e.g. used for external transaction cleanup) */ 00228 void (*get_object_def_pc)(u8_t rid, u8_t ident_len, s32_t *ident); 00229 void (*get_value_pc)(u8_t rid, struct obj_def *od); 00230 void (*set_test_pc)(u8_t rid, struct obj_def *od); 00231 void (*set_value_pc)(u8_t rid, struct obj_def *od); 00232 }; 00233 00234 /** export MIB tree from mib2.c */ 00235 extern const struct mib_array_node internet; 00236 00237 /** dummy function pointers for non-leaf MIB nodes from mib2.c */ 00238 void noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); 00239 void noleafs_get_value(struct obj_def *od, u16_t len, void *value); 00240 u8_t noleafs_set_test(struct obj_def *od, u16_t len, void *value); 00241 void noleafs_set_value(struct obj_def *od, u16_t len, void *value); 00242 00243 void snmp_oidtoip(s32_t *ident, ip_addr_t *ip); 00244 void snmp_iptooid(ip_addr_t *ip, s32_t *ident); 00245 void snmp_ifindextonetif(s32_t ifindex, struct netif **netif); 00246 void snmp_netiftoifindex(struct netif *netif, s32_t *ifidx); 00247 00248 struct mib_list_node* snmp_mib_ln_alloc(s32_t id); 00249 void snmp_mib_ln_free(struct mib_list_node *ln); 00250 struct mib_list_rootnode* snmp_mib_lrn_alloc(void); 00251 void snmp_mib_lrn_free(struct mib_list_rootnode *lrn); 00252 00253 s8_t snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn); 00254 s8_t snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn); 00255 struct mib_list_rootnode *snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n); 00256 00257 struct mib_node* snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np); 00258 struct mib_node* snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret); 00259 u8_t snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident); 00260 u8_t snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret); 00261 00262 #ifdef __cplusplus 00263 } 00264 #endif 00265 00266 #endif /* LWIP_SNMP */ 00267 00268 #endif /* __LWIP_SNMP_STRUCTS_H__ */
Generated on Tue Jul 12 2022 21:10:26 by 1.7.2