fork allowing use of the latest official mbed networking library

Dependents:   SNMPv1UDPExmaple

Fork of Agentbed by Suga koubou

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?

UserRevisionLine numberNew 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;