fork allowing use of the latest official mbed networking library
Fork of Agentbed by
Agentbed.cpp@3:81f25e337afc, 2013-04-02 (annotated)
- Committer:
- jonecm
- Date:
- Tue Apr 02 19:53:28 2013 +0000
- Revision:
- 3:81f25e337afc
- Parent:
- 2:9e4369522e03
Updated to be compatible with the MBED official networking stack
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:bb21da73024a | 1 | /* |
okini3939 | 0:bb21da73024a | 2 | Agentbed library |
okini3939 | 0:bb21da73024a | 3 | Modified for mbed, 2010 Suga. |
okini3939 | 0:bb21da73024a | 4 | |
okini3939 | 0:bb21da73024a | 5 | |
okini3939 | 0:bb21da73024a | 6 | Agentuino.cpp - An Arduino library for a lightweight SNMP Agent. |
okini3939 | 0:bb21da73024a | 7 | Copyright (C) 2010 Eric C. Gionet <lavco_eg@hotmail.com> |
okini3939 | 0:bb21da73024a | 8 | All rights reserved. |
okini3939 | 0:bb21da73024a | 9 | |
okini3939 | 0:bb21da73024a | 10 | This library is free software; you can redistribute it and/or |
okini3939 | 0:bb21da73024a | 11 | modify it under the terms of the GNU Lesser General Public |
okini3939 | 0:bb21da73024a | 12 | License as published by the Free Software Foundation; either |
okini3939 | 0:bb21da73024a | 13 | version 2.1 of the License, or (at your option) any later version. |
okini3939 | 0:bb21da73024a | 14 | |
okini3939 | 0:bb21da73024a | 15 | This library is distributed in the hope that it will be useful, |
okini3939 | 0:bb21da73024a | 16 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
okini3939 | 0:bb21da73024a | 17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
okini3939 | 0:bb21da73024a | 18 | Lesser General Public License for more details. |
okini3939 | 0:bb21da73024a | 19 | |
okini3939 | 0:bb21da73024a | 20 | You should have received a copy of the GNU Lesser General Public |
okini3939 | 0:bb21da73024a | 21 | License along with this library; if not, write to the Free Software |
okini3939 | 0:bb21da73024a | 22 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
okini3939 | 0:bb21da73024a | 23 | */ |
okini3939 | 0:bb21da73024a | 24 | |
okini3939 | 0:bb21da73024a | 25 | // |
okini3939 | 0:bb21da73024a | 26 | // sketch_aug23a |
okini3939 | 0:bb21da73024a | 27 | // |
okini3939 | 0:bb21da73024a | 28 | |
okini3939 | 0:bb21da73024a | 29 | #include "Agentbed.h" |
okini3939 | 0:bb21da73024a | 30 | |
jonecm | 3:81f25e337afc | 31 | SNMP_API_STAT_CODES SNMP::init() |
okini3939 | 0:bb21da73024a | 32 | { |
okini3939 | 0:bb21da73024a | 33 | // set community names |
okini3939 | 0:bb21da73024a | 34 | _getCommName = "public"; |
okini3939 | 0:bb21da73024a | 35 | _setCommName = "private"; |
okini3939 | 0:bb21da73024a | 36 | // |
okini3939 | 0:bb21da73024a | 37 | // set community name set/get sizes |
okini3939 | 0:bb21da73024a | 38 | _setSize = strlen(_setCommName); |
okini3939 | 0:bb21da73024a | 39 | _getSize = strlen(_getCommName); |
okini3939 | 0:bb21da73024a | 40 | // |
okini3939 | 0:bb21da73024a | 41 | return SNMP_API_STAT_SUCCESS; |
okini3939 | 0:bb21da73024a | 42 | } |
okini3939 | 0:bb21da73024a | 43 | |
jonecm | 3:81f25e337afc | 44 | SNMP_API_STAT_CODES SNMP::init(char *getCommName, char *setCommName) |
okini3939 | 0:bb21da73024a | 45 | { |
okini3939 | 0:bb21da73024a | 46 | // set community name set/get sizes |
okini3939 | 0:bb21da73024a | 47 | _setSize = strlen(setCommName); |
okini3939 | 0:bb21da73024a | 48 | _getSize = strlen(getCommName); |
okini3939 | 0:bb21da73024a | 49 | // |
okini3939 | 0:bb21da73024a | 50 | // validate get/set community name sizes |
okini3939 | 0:bb21da73024a | 51 | if ( _setSize > SNMP_MAX_NAME_LEN + 1 || _getSize > SNMP_MAX_NAME_LEN + 1 ) { |
okini3939 | 0:bb21da73024a | 52 | return SNMP_API_STAT_NAME_TOO_BIG; |
okini3939 | 0:bb21da73024a | 53 | } |
okini3939 | 0:bb21da73024a | 54 | // |
okini3939 | 0:bb21da73024a | 55 | // set community names |
okini3939 | 0:bb21da73024a | 56 | _getCommName = getCommName; |
okini3939 | 0:bb21da73024a | 57 | _setCommName = setCommName; |
okini3939 | 0:bb21da73024a | 58 | // |
jonecm | 3:81f25e337afc | 59 | |
okini3939 | 0:bb21da73024a | 60 | return SNMP_API_STAT_SUCCESS; |
okini3939 | 0:bb21da73024a | 61 | } |
okini3939 | 0:bb21da73024a | 62 | |
jonecm | 3:81f25e337afc | 63 | SNMP_API_STAT_CODES SNMP::toPdu(SNMP_PDU *pdu,char *_packet,uint16_t _packetSize) |
okini3939 | 0:bb21da73024a | 64 | { |
okini3939 | 0:bb21da73024a | 65 | char *community; |
okini3939 | 0:bb21da73024a | 66 | // sequence length |
okini3939 | 2:9e4369522e03 | 67 | byte __attribute__((__unused__)) seqLen; |
okini3939 | 0:bb21da73024a | 68 | // version |
okini3939 | 0:bb21da73024a | 69 | byte verLen, verEnd; |
okini3939 | 0:bb21da73024a | 70 | // community string |
okini3939 | 0:bb21da73024a | 71 | byte comLen, comEnd; |
okini3939 | 0:bb21da73024a | 72 | // pdu |
okini3939 | 2:9e4369522e03 | 73 | byte __attribute__((__unused__)) pduTyp, pduLen; |
okini3939 | 0:bb21da73024a | 74 | byte ridLen, ridEnd; |
okini3939 | 0:bb21da73024a | 75 | byte errLen, errEnd; |
okini3939 | 0:bb21da73024a | 76 | byte eriLen, eriEnd; |
okini3939 | 2:9e4369522e03 | 77 | byte __attribute__((__unused__)) vblTyp, vblLen; |
okini3939 | 2:9e4369522e03 | 78 | byte __attribute__((__unused__)) vbiTyp, vbiLen; |
okini3939 | 0:bb21da73024a | 79 | byte obiLen, obiEnd; |
okini3939 | 2:9e4369522e03 | 80 | byte __attribute__((__unused__)) valTyp, valLen, valEnd; |
okini3939 | 0:bb21da73024a | 81 | byte i; |
okini3939 | 0:bb21da73024a | 82 | // |
okini3939 | 0:bb21da73024a | 83 | // set packet packet size (skip UDP header) |
okini3939 | 0:bb21da73024a | 84 | // _packetSize = Udp.available()-8; |
okini3939 | 0:bb21da73024a | 85 | // |
jonecm | 3:81f25e337afc | 86 | // memset(_packet, 0, SNMP_MAX_PACKET_LEN); |
okini3939 | 0:bb21da73024a | 87 | // |
okini3939 | 0:bb21da73024a | 88 | // get UDP packet |
jonecm | 3:81f25e337afc | 89 | /// _packetSize = udpsock->recvfrom((char*)_packet, SNMP_MAX_PACKET_LEN, &_dst); |
okini3939 | 0:bb21da73024a | 90 | // |
okini3939 | 0:bb21da73024a | 91 | // validate packet |
okini3939 | 0:bb21da73024a | 92 | if ( _packetSize != 0 && _packetSize > SNMP_MAX_PACKET_LEN ) { |
okini3939 | 0:bb21da73024a | 93 | // |
okini3939 | 0:bb21da73024a | 94 | //SNMP_FREE(_packet); |
okini3939 | 0:bb21da73024a | 95 | |
okini3939 | 0:bb21da73024a | 96 | return SNMP_API_STAT_PACKET_TOO_BIG; |
okini3939 | 0:bb21da73024a | 97 | } |
okini3939 | 0:bb21da73024a | 98 | // |
okini3939 | 0:bb21da73024a | 99 | // allocate byte array based on packet size |
okini3939 | 0:bb21da73024a | 100 | //if ( (_packet = (byte *)malloc(sizeof(byte)*_packetSize)) == NULL ) { |
okini3939 | 0:bb21da73024a | 101 | // |
okini3939 | 0:bb21da73024a | 102 | //SNMP_FREE(_packet); |
okini3939 | 0:bb21da73024a | 103 | |
okini3939 | 0:bb21da73024a | 104 | // return SNMP_API_STAT_MALLOC_ERR; |
okini3939 | 0:bb21da73024a | 105 | //} |
okini3939 | 0:bb21da73024a | 106 | // |
okini3939 | 0:bb21da73024a | 107 | // packet check 1 |
okini3939 | 0:bb21da73024a | 108 | if ( _packet[0] != 0x30 ) { |
okini3939 | 0:bb21da73024a | 109 | // |
okini3939 | 0:bb21da73024a | 110 | //SNMP_FREE(_packet); |
okini3939 | 0:bb21da73024a | 111 | |
okini3939 | 0:bb21da73024a | 112 | return SNMP_API_STAT_PACKET_INVALID; |
okini3939 | 0:bb21da73024a | 113 | } |
okini3939 | 0:bb21da73024a | 114 | // |
okini3939 | 0:bb21da73024a | 115 | // sequence length |
okini3939 | 0:bb21da73024a | 116 | seqLen = _packet[1]; |
okini3939 | 0:bb21da73024a | 117 | // version |
okini3939 | 0:bb21da73024a | 118 | verLen = _packet[3]; |
okini3939 | 0:bb21da73024a | 119 | verEnd = 3 + verLen; |
okini3939 | 0:bb21da73024a | 120 | // community string |
okini3939 | 0:bb21da73024a | 121 | comLen = _packet[verEnd + 2]; |
okini3939 | 0:bb21da73024a | 122 | comEnd = verEnd + 2 + comLen; |
okini3939 | 0:bb21da73024a | 123 | // pdu |
okini3939 | 0:bb21da73024a | 124 | pduTyp = _packet[comEnd + 1]; |
okini3939 | 0:bb21da73024a | 125 | pduLen = _packet[comEnd + 2]; |
okini3939 | 0:bb21da73024a | 126 | ridLen = _packet[comEnd + 4]; |
okini3939 | 0:bb21da73024a | 127 | ridEnd = comEnd + 4 + ridLen; |
okini3939 | 0:bb21da73024a | 128 | errLen = _packet[ridEnd + 2]; |
okini3939 | 0:bb21da73024a | 129 | errEnd = ridEnd + 2 + errLen; |
okini3939 | 0:bb21da73024a | 130 | eriLen = _packet[errEnd + 2]; |
okini3939 | 0:bb21da73024a | 131 | eriEnd = errEnd + 2 + eriLen; |
okini3939 | 0:bb21da73024a | 132 | vblTyp = _packet[eriEnd + 1]; |
okini3939 | 0:bb21da73024a | 133 | vblLen = _packet[eriEnd + 2]; |
okini3939 | 0:bb21da73024a | 134 | vbiTyp = _packet[eriEnd + 3]; |
okini3939 | 0:bb21da73024a | 135 | vbiLen = _packet[eriEnd + 4]; |
okini3939 | 0:bb21da73024a | 136 | obiLen = _packet[eriEnd + 6]; |
okini3939 | 0:bb21da73024a | 137 | obiEnd = eriEnd + obiLen + 6; |
okini3939 | 0:bb21da73024a | 138 | valTyp = _packet[obiEnd + 1]; |
okini3939 | 0:bb21da73024a | 139 | valLen = _packet[obiEnd + 2]; |
okini3939 | 0:bb21da73024a | 140 | valEnd = obiEnd + 2 + valLen; |
okini3939 | 0:bb21da73024a | 141 | // |
okini3939 | 0:bb21da73024a | 142 | // extract version |
okini3939 | 0:bb21da73024a | 143 | pdu->version = 0; |
okini3939 | 0:bb21da73024a | 144 | for ( i = 0; i < verLen; i++ ) { |
okini3939 | 0:bb21da73024a | 145 | pdu->version = (pdu->version << 8) | _packet[5 + i]; |
okini3939 | 0:bb21da73024a | 146 | } |
okini3939 | 0:bb21da73024a | 147 | // |
okini3939 | 0:bb21da73024a | 148 | // pdu-type |
okini3939 | 0:bb21da73024a | 149 | pdu->type = (SNMP_PDU_TYPES)pduTyp; |
okini3939 | 0:bb21da73024a | 150 | _dstType = pdu->type; |
okini3939 | 0:bb21da73024a | 151 | // |
okini3939 | 0:bb21da73024a | 152 | // validate community size |
okini3939 | 0:bb21da73024a | 153 | if ( comLen > SNMP_MAX_NAME_LEN ) { |
okini3939 | 0:bb21da73024a | 154 | // set pdu error |
okini3939 | 0:bb21da73024a | 155 | pdu->error = SNMP_ERR_TOO_BIG; |
okini3939 | 0:bb21da73024a | 156 | // |
okini3939 | 0:bb21da73024a | 157 | //SNMP_FREE(_packet); |
okini3939 | 0:bb21da73024a | 158 | |
okini3939 | 0:bb21da73024a | 159 | return SNMP_API_STAT_NAME_TOO_BIG; |
okini3939 | 0:bb21da73024a | 160 | } |
okini3939 | 0:bb21da73024a | 161 | // |
okini3939 | 0:bb21da73024a | 162 | // extract and compare community name |
okini3939 | 0:bb21da73024a | 163 | // allocate char array based on community size |
okini3939 | 0:bb21da73024a | 164 | if ( (community = (char *)malloc(sizeof(char)*comLen)) == NULL ) { |
okini3939 | 0:bb21da73024a | 165 | // |
okini3939 | 0:bb21da73024a | 166 | //SNMP_FREE(_packet); |
okini3939 | 0:bb21da73024a | 167 | |
okini3939 | 0:bb21da73024a | 168 | return SNMP_API_STAT_MALLOC_ERR; |
okini3939 | 0:bb21da73024a | 169 | } |
okini3939 | 0:bb21da73024a | 170 | // |
okini3939 | 0:bb21da73024a | 171 | for ( i = 0; i < comLen; i++ ) { |
okini3939 | 0:bb21da73024a | 172 | community[i] = _packet[verEnd + 3 + i]; |
okini3939 | 0:bb21da73024a | 173 | } |
okini3939 | 0:bb21da73024a | 174 | // terminate as a string |
okini3939 | 0:bb21da73024a | 175 | community[comLen] = '\0'; |
okini3939 | 0:bb21da73024a | 176 | // |
okini3939 | 0:bb21da73024a | 177 | // validate community name |
okini3939 | 0:bb21da73024a | 178 | if ( pdu->type == SNMP_PDU_SET ) { |
okini3939 | 0:bb21da73024a | 179 | if ( strcmp(_setCommName, community) != 0 ) |
okini3939 | 0:bb21da73024a | 180 | // set pdu error |
okini3939 | 0:bb21da73024a | 181 | pdu->error = SNMP_ERR_NO_SUCH_NAME; |
okini3939 | 0:bb21da73024a | 182 | } else { |
okini3939 | 0:bb21da73024a | 183 | if ( strcmp(_getCommName, community) != 0 ) |
okini3939 | 0:bb21da73024a | 184 | // set pdu error |
okini3939 | 0:bb21da73024a | 185 | pdu->error = SNMP_ERR_NO_SUCH_NAME; |
okini3939 | 0:bb21da73024a | 186 | } |
okini3939 | 0:bb21da73024a | 187 | // |
okini3939 | 0:bb21da73024a | 188 | // free community buffer |
okini3939 | 0:bb21da73024a | 189 | SNMP_FREE(community); |
okini3939 | 0:bb21da73024a | 190 | // |
okini3939 | 0:bb21da73024a | 191 | // extract reqiest-id 0x00 0x00 0x00 0x01 (4-byte int aka int32) |
okini3939 | 0:bb21da73024a | 192 | pdu->requestId = 0; |
okini3939 | 0:bb21da73024a | 193 | for ( i = 0; i < ridLen; i++ ) { |
okini3939 | 0:bb21da73024a | 194 | pdu->requestId = (pdu->requestId << 8) | _packet[comEnd + 5 + i]; |
okini3939 | 0:bb21da73024a | 195 | } |
okini3939 | 0:bb21da73024a | 196 | // |
okini3939 | 0:bb21da73024a | 197 | // extract error |
okini3939 | 0:bb21da73024a | 198 | pdu->error = SNMP_ERR_NO_ERROR; |
okini3939 | 0:bb21da73024a | 199 | int32_t err = 0; |
okini3939 | 0:bb21da73024a | 200 | for ( i = 0; i < errLen; i++ ) { |
okini3939 | 0:bb21da73024a | 201 | err = (err << 8) | _packet[ridEnd + 3 + i]; |
okini3939 | 0:bb21da73024a | 202 | } |
okini3939 | 0:bb21da73024a | 203 | pdu->error = (SNMP_ERR_CODES)err; |
okini3939 | 0:bb21da73024a | 204 | // |
okini3939 | 0:bb21da73024a | 205 | // extract error-index |
okini3939 | 0:bb21da73024a | 206 | pdu->errorIndex = 0; |
okini3939 | 0:bb21da73024a | 207 | for ( i = 0; i < eriLen; i++ ) { |
okini3939 | 0:bb21da73024a | 208 | pdu->errorIndex = (pdu->errorIndex << 8) | _packet[errEnd + 3 + i]; |
okini3939 | 0:bb21da73024a | 209 | } |
okini3939 | 0:bb21da73024a | 210 | // |
okini3939 | 0:bb21da73024a | 211 | // |
okini3939 | 0:bb21da73024a | 212 | // validate object-identifier size |
okini3939 | 0:bb21da73024a | 213 | if ( obiLen > SNMP_MAX_OID_LEN ) { |
okini3939 | 0:bb21da73024a | 214 | // set pdu error |
okini3939 | 0:bb21da73024a | 215 | pdu->error = SNMP_ERR_TOO_BIG; |
okini3939 | 0:bb21da73024a | 216 | // |
okini3939 | 0:bb21da73024a | 217 | //SNMP_FREE(_packet); |
okini3939 | 0:bb21da73024a | 218 | |
okini3939 | 0:bb21da73024a | 219 | return SNMP_API_STAT_OID_TOO_BIG; |
okini3939 | 0:bb21da73024a | 220 | } |
okini3939 | 0:bb21da73024a | 221 | // |
okini3939 | 0:bb21da73024a | 222 | // extract and contruct object-identifier |
okini3939 | 0:bb21da73024a | 223 | /* |
okini3939 | 0:bb21da73024a | 224 | if ( (pdu->OID.oid = (byte *)malloc(sizeof(byte)*obiLen)) == NULL ) { |
okini3939 | 0:bb21da73024a | 225 | // free DPU receive buffer |
okini3939 | 0:bb21da73024a | 226 | _socket.readSkip(_socket.available()); |
okini3939 | 0:bb21da73024a | 227 | // |
okini3939 | 0:bb21da73024a | 228 | SNMP_FREE(_packet); |
okini3939 | 0:bb21da73024a | 229 | |
okini3939 | 0:bb21da73024a | 230 | return SNMP_API_STAT_MALLOC_ERR; |
okini3939 | 0:bb21da73024a | 231 | } |
okini3939 | 0:bb21da73024a | 232 | */ |
okini3939 | 0:bb21da73024a | 233 | memset(pdu->OID.data, 0, SNMP_MAX_OID_LEN); |
okini3939 | 0:bb21da73024a | 234 | pdu->OID.size = obiLen; |
okini3939 | 0:bb21da73024a | 235 | for ( i = 0; i < obiLen; i++ ) { |
okini3939 | 0:bb21da73024a | 236 | pdu->OID.data[i] = _packet[eriEnd + 7 + i]; |
okini3939 | 0:bb21da73024a | 237 | } |
okini3939 | 0:bb21da73024a | 238 | // |
okini3939 | 0:bb21da73024a | 239 | // value-type |
okini3939 | 0:bb21da73024a | 240 | pdu->VALUE.syntax = (SNMP_SYNTAXES)valTyp; |
okini3939 | 0:bb21da73024a | 241 | // |
okini3939 | 0:bb21da73024a | 242 | // validate value size |
okini3939 | 0:bb21da73024a | 243 | if ( obiLen > SNMP_MAX_VALUE_LEN ) { |
okini3939 | 0:bb21da73024a | 244 | // set pdu error |
okini3939 | 0:bb21da73024a | 245 | pdu->error = SNMP_ERR_TOO_BIG; |
okini3939 | 0:bb21da73024a | 246 | // |
okini3939 | 0:bb21da73024a | 247 | //SNMP_FREE(_packet); |
okini3939 | 0:bb21da73024a | 248 | |
okini3939 | 0:bb21da73024a | 249 | return SNMP_API_STAT_VALUE_TOO_BIG; |
okini3939 | 0:bb21da73024a | 250 | } |
okini3939 | 0:bb21da73024a | 251 | // |
okini3939 | 0:bb21da73024a | 252 | // value-size |
okini3939 | 0:bb21da73024a | 253 | pdu->VALUE.size = valLen; |
okini3939 | 0:bb21da73024a | 254 | // |
okini3939 | 0:bb21da73024a | 255 | // extract value |
okini3939 | 0:bb21da73024a | 256 | // allocate char array based on oid size |
okini3939 | 0:bb21da73024a | 257 | /* |
okini3939 | 0:bb21da73024a | 258 | if( (pdu->VALUE.value = (byte *)malloc(sizeof(byte)*valLen)) == NULL ) { |
okini3939 | 0:bb21da73024a | 259 | // free DPU receive buffer |
okini3939 | 0:bb21da73024a | 260 | _socket.readSkip(_socket.available()); |
okini3939 | 0:bb21da73024a | 261 | // |
okini3939 | 0:bb21da73024a | 262 | SNMP_FREE(_packet); |
okini3939 | 0:bb21da73024a | 263 | |
okini3939 | 0:bb21da73024a | 264 | return SNMP_API_STAT_MALLOC_ERR; |
okini3939 | 0:bb21da73024a | 265 | } |
okini3939 | 0:bb21da73024a | 266 | */ |
okini3939 | 0:bb21da73024a | 267 | memset(pdu->VALUE.data, 0, SNMP_MAX_VALUE_LEN); |
okini3939 | 0:bb21da73024a | 268 | for ( i = 0; i < valLen; i++ ) { |
okini3939 | 0:bb21da73024a | 269 | pdu->VALUE.data[i] = _packet[obiEnd + 3 + i]; |
okini3939 | 0:bb21da73024a | 270 | } |
okini3939 | 0:bb21da73024a | 271 | // |
okini3939 | 0:bb21da73024a | 272 | //SNMP_FREE(_packet); |
okini3939 | 0:bb21da73024a | 273 | // |
okini3939 | 0:bb21da73024a | 274 | return SNMP_API_STAT_SUCCESS; |
okini3939 | 0:bb21da73024a | 275 | } |
okini3939 | 0:bb21da73024a | 276 | |
jonecm | 3:81f25e337afc | 277 | uint16_t SNMP::fromPdu(SNMP_PDU *pdu,char *_packet) |
okini3939 | 0:bb21da73024a | 278 | { |
okini3939 | 0:bb21da73024a | 279 | int32_u u; |
jonecm | 3:81f25e337afc | 280 | uint16_t _packetSize; |
okini3939 | 0:bb21da73024a | 281 | byte i; |
okini3939 | 0:bb21da73024a | 282 | // |
okini3939 | 0:bb21da73024a | 283 | // Length of entire SNMP packet |
okini3939 | 0:bb21da73024a | 284 | _packetPos = 0; // 23 |
okini3939 | 0:bb21da73024a | 285 | _packetSize = 25 - 1 + sizeof(pdu->requestId) + sizeof(pdu->error) + sizeof(pdu->errorIndex) + pdu->OID.size + pdu->VALUE.size; |
okini3939 | 0:bb21da73024a | 286 | // |
okini3939 | 0:bb21da73024a | 287 | memset(_packet, 0, SNMP_MAX_PACKET_LEN); |
okini3939 | 0:bb21da73024a | 288 | // |
okini3939 | 0:bb21da73024a | 289 | if ( _dstType == SNMP_PDU_SET ) { |
okini3939 | 0:bb21da73024a | 290 | _packetSize += _setSize; |
okini3939 | 0:bb21da73024a | 291 | } else { |
okini3939 | 0:bb21da73024a | 292 | _packetSize += _getSize; |
okini3939 | 0:bb21da73024a | 293 | } |
okini3939 | 0:bb21da73024a | 294 | // |
okini3939 | 0:bb21da73024a | 295 | // allocate byte array based on packet size |
okini3939 | 0:bb21da73024a | 296 | //if ( (_packet = (byte *)malloc(sizeof(byte)*_packetSize)) == NULL ) { |
okini3939 | 0:bb21da73024a | 297 | // |
okini3939 | 0:bb21da73024a | 298 | //SNMP_FREE(_packet); |
okini3939 | 0:bb21da73024a | 299 | |
okini3939 | 0:bb21da73024a | 300 | // return SNMP_API_STAT_MALLOC_ERR; |
okini3939 | 0:bb21da73024a | 301 | //} |
okini3939 | 0:bb21da73024a | 302 | // |
okini3939 | 0:bb21da73024a | 303 | _packet[_packetPos++] = (byte)SNMP_SYNTAX_SEQUENCE; // type |
okini3939 | 0:bb21da73024a | 304 | _packet[_packetPos++] = (byte)_packetSize; // length |
okini3939 | 0:bb21da73024a | 305 | // |
okini3939 | 0:bb21da73024a | 306 | |
okini3939 | 0:bb21da73024a | 307 | // SNMP version |
okini3939 | 0:bb21da73024a | 308 | _packet[_packetPos++] = (byte)SNMP_SYNTAX_INT; // type |
okini3939 | 0:bb21da73024a | 309 | _packet[_packetPos++] = 0x01; // length |
okini3939 | 0:bb21da73024a | 310 | _packet[_packetPos++] = 0x00; // value |
okini3939 | 0:bb21da73024a | 311 | // |
okini3939 | 0:bb21da73024a | 312 | // SNMP community string |
okini3939 | 0:bb21da73024a | 313 | _packet[_packetPos++] = (byte)SNMP_SYNTAX_OCTETS; // type |
okini3939 | 0:bb21da73024a | 314 | if ( _dstType == SNMP_PDU_SET ) { |
okini3939 | 0:bb21da73024a | 315 | _packet[_packetPos++] = (byte)_setSize; // length |
okini3939 | 0:bb21da73024a | 316 | for ( i = 0; i < _setSize; i++ ) { |
okini3939 | 0:bb21da73024a | 317 | _packet[_packetPos++] = (byte)_setCommName[i]; |
okini3939 | 0:bb21da73024a | 318 | } |
okini3939 | 0:bb21da73024a | 319 | } else { |
okini3939 | 0:bb21da73024a | 320 | _packet[_packetPos++] = (byte)_getSize; // length |
okini3939 | 0:bb21da73024a | 321 | for ( i = 0; i < _getSize; i++ ) { |
okini3939 | 0:bb21da73024a | 322 | _packet[_packetPos++] = (byte)_getCommName[i]; |
okini3939 | 0:bb21da73024a | 323 | } |
okini3939 | 0:bb21da73024a | 324 | } |
okini3939 | 0:bb21da73024a | 325 | // |
okini3939 | 0:bb21da73024a | 326 | // SNMP PDU |
okini3939 | 0:bb21da73024a | 327 | _packet[_packetPos++] = (byte)pdu->type; |
okini3939 | 0:bb21da73024a | 328 | _packet[_packetPos++] = (byte)( sizeof(pdu->requestId) + sizeof((int32_t)pdu->error) + sizeof(pdu->errorIndex) + pdu->OID.size + pdu->VALUE.size + 14 ); |
okini3939 | 0:bb21da73024a | 329 | // |
okini3939 | 0:bb21da73024a | 330 | // Request ID (size always 4 e.g. 4-byte int) |
okini3939 | 0:bb21da73024a | 331 | _packet[_packetPos++] = (byte)SNMP_SYNTAX_INT; // type |
okini3939 | 0:bb21da73024a | 332 | _packet[_packetPos++] = (byte)sizeof(pdu->requestId); |
okini3939 | 0:bb21da73024a | 333 | u.int32 = pdu->requestId; |
okini3939 | 0:bb21da73024a | 334 | _packet[_packetPos++] = u.data[3]; |
okini3939 | 0:bb21da73024a | 335 | _packet[_packetPos++] = u.data[2]; |
okini3939 | 0:bb21da73024a | 336 | _packet[_packetPos++] = u.data[1]; |
okini3939 | 0:bb21da73024a | 337 | _packet[_packetPos++] = u.data[0]; |
okini3939 | 0:bb21da73024a | 338 | // |
okini3939 | 0:bb21da73024a | 339 | // Error (size always 4 e.g. 4-byte int) |
okini3939 | 0:bb21da73024a | 340 | _packet[_packetPos++] = (byte)SNMP_SYNTAX_INT; // type |
okini3939 | 0:bb21da73024a | 341 | _packet[_packetPos++] = (byte)sizeof((int32_t)pdu->error); |
okini3939 | 0:bb21da73024a | 342 | u.int32 = pdu->error; |
okini3939 | 0:bb21da73024a | 343 | _packet[_packetPos++] = u.data[3]; |
okini3939 | 0:bb21da73024a | 344 | _packet[_packetPos++] = u.data[2]; |
okini3939 | 0:bb21da73024a | 345 | _packet[_packetPos++] = u.data[1]; |
okini3939 | 0:bb21da73024a | 346 | _packet[_packetPos++] = u.data[0]; |
okini3939 | 0:bb21da73024a | 347 | // |
okini3939 | 0:bb21da73024a | 348 | // Error Index (size always 4 e.g. 4-byte int) |
okini3939 | 0:bb21da73024a | 349 | _packet[_packetPos++] = (byte)SNMP_SYNTAX_INT; // type |
okini3939 | 0:bb21da73024a | 350 | _packet[_packetPos++] = (byte)sizeof(pdu->errorIndex); |
okini3939 | 0:bb21da73024a | 351 | u.int32 = pdu->errorIndex; |
okini3939 | 0:bb21da73024a | 352 | _packet[_packetPos++] = u.data[3]; |
okini3939 | 0:bb21da73024a | 353 | _packet[_packetPos++] = u.data[2]; |
okini3939 | 0:bb21da73024a | 354 | _packet[_packetPos++] = u.data[1]; |
okini3939 | 0:bb21da73024a | 355 | _packet[_packetPos++] = u.data[0]; |
okini3939 | 0:bb21da73024a | 356 | // |
okini3939 | 0:bb21da73024a | 357 | // Varbind List |
okini3939 | 0:bb21da73024a | 358 | _packet[_packetPos++] = (byte)SNMP_SYNTAX_SEQUENCE; // type |
okini3939 | 0:bb21da73024a | 359 | _packet[_packetPos++] = (byte)( pdu->OID.size + pdu->VALUE.size + 6 ); //4 |
okini3939 | 0:bb21da73024a | 360 | // |
okini3939 | 0:bb21da73024a | 361 | // Varbind |
okini3939 | 0:bb21da73024a | 362 | _packet[_packetPos++] = (byte)SNMP_SYNTAX_SEQUENCE; // type |
okini3939 | 0:bb21da73024a | 363 | _packet[_packetPos++] = (byte)( pdu->OID.size + pdu->VALUE.size + 4 ); //2 |
okini3939 | 0:bb21da73024a | 364 | // |
okini3939 | 0:bb21da73024a | 365 | // ObjectIdentifier |
okini3939 | 0:bb21da73024a | 366 | _packet[_packetPos++] = (byte)SNMP_SYNTAX_OID; // type |
okini3939 | 0:bb21da73024a | 367 | _packet[_packetPos++] = (byte)(pdu->OID.size); |
okini3939 | 0:bb21da73024a | 368 | for ( i = 0; i < pdu->OID.size; i++ ) { |
okini3939 | 0:bb21da73024a | 369 | _packet[_packetPos++] = pdu->OID.data[i]; |
okini3939 | 0:bb21da73024a | 370 | } |
okini3939 | 0:bb21da73024a | 371 | // |
okini3939 | 0:bb21da73024a | 372 | // Value |
okini3939 | 0:bb21da73024a | 373 | _packet[_packetPos++] = (byte)pdu->VALUE.syntax; // type |
okini3939 | 0:bb21da73024a | 374 | _packet[_packetPos++] = (byte)(pdu->VALUE.size); |
okini3939 | 0:bb21da73024a | 375 | for ( i = 0; i < pdu->VALUE.size; i++ ) { |
okini3939 | 0:bb21da73024a | 376 | _packet[_packetPos++] = pdu->VALUE.data[i]; |
okini3939 | 0:bb21da73024a | 377 | } |
okini3939 | 0:bb21da73024a | 378 | // |
okini3939 | 0:bb21da73024a | 379 | // |
okini3939 | 0:bb21da73024a | 380 | //SNMP_FREE(_packet); |
okini3939 | 0:bb21da73024a | 381 | // |
jonecm | 3:81f25e337afc | 382 | return _packetSize; |
okini3939 | 0:bb21da73024a | 383 | } |
okini3939 | 0:bb21da73024a | 384 | |
okini3939 | 0:bb21da73024a | 385 | |
okini3939 | 0:bb21da73024a | 386 | |
okini3939 | 0:bb21da73024a | 387 | |
jonecm | 3:81f25e337afc | 388 | void SNMP::freePdu(SNMP_PDU *pdu) |
okini3939 | 0:bb21da73024a | 389 | { |
okini3939 | 0:bb21da73024a | 390 | //SNMP_FREE(pdu->OID.oid); |
okini3939 | 0:bb21da73024a | 391 | //SNMP_FREE(pdu->VALUE.value); |
okini3939 | 0:bb21da73024a | 392 | memset(pdu->OID.data, 0, SNMP_MAX_OID_LEN); |
okini3939 | 0:bb21da73024a | 393 | memset(pdu->VALUE.data, 0, SNMP_MAX_VALUE_LEN); |
okini3939 | 0:bb21da73024a | 394 | //free((char *) pdu); |
okini3939 | 0:bb21da73024a | 395 | } |
okini3939 | 0:bb21da73024a | 396 | |
okini3939 | 0:bb21da73024a | 397 | // Create one global object |
jonecm | 3:81f25e337afc | 398 | //SNMP Agentbed; |