SNMP Agent http://mbed.org/users/okini3939/notebook/agentbed-library/

Dependents:   WeatherPlatform_20110408 WeatherPlatform WeatherStation

Committer:
okini3939
Date:
Fri Jan 28 09:17:03 2011 +0000
Revision:
2:9e4369522e03
Parent:
0:bb21da73024a

        

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
okini3939 0:bb21da73024a 31 SNMP_API_STAT_CODES AgentbedClass::begin(EthernetNetIf *eth)
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 // init UDP socket
okini3939 0:bb21da73024a 42 udpsock = new UDPSocket;
okini3939 0:bb21da73024a 43 udpsock->setOnEvent(this, &AgentbedClass::listen);
okini3939 0:bb21da73024a 44 udpsock->bind(Host(eth->getIp(), SNMP_DEFAULT_PORT));
okini3939 0:bb21da73024a 45 //
okini3939 0:bb21da73024a 46 return SNMP_API_STAT_SUCCESS;
okini3939 0:bb21da73024a 47 }
okini3939 0:bb21da73024a 48
okini3939 0:bb21da73024a 49 SNMP_API_STAT_CODES AgentbedClass::begin(char *getCommName, char *setCommName, uint16_t port, EthernetNetIf *eth)
okini3939 0:bb21da73024a 50 {
okini3939 0:bb21da73024a 51 // set community name set/get sizes
okini3939 0:bb21da73024a 52 _setSize = strlen(setCommName);
okini3939 0:bb21da73024a 53 _getSize = strlen(getCommName);
okini3939 0:bb21da73024a 54 //
okini3939 0:bb21da73024a 55 // validate get/set community name sizes
okini3939 0:bb21da73024a 56 if ( _setSize > SNMP_MAX_NAME_LEN + 1 || _getSize > SNMP_MAX_NAME_LEN + 1 ) {
okini3939 0:bb21da73024a 57 return SNMP_API_STAT_NAME_TOO_BIG;
okini3939 0:bb21da73024a 58 }
okini3939 0:bb21da73024a 59 //
okini3939 0:bb21da73024a 60 // set community names
okini3939 0:bb21da73024a 61 _getCommName = getCommName;
okini3939 0:bb21da73024a 62 _setCommName = setCommName;
okini3939 0:bb21da73024a 63 //
okini3939 0:bb21da73024a 64 // validate session port number
okini3939 0:bb21da73024a 65 if ( port == NULL || port == 0 ) port = SNMP_DEFAULT_PORT;
okini3939 0:bb21da73024a 66 //
okini3939 0:bb21da73024a 67 // init UDP socket
okini3939 0:bb21da73024a 68 udpsock = new UDPSocket;
okini3939 0:bb21da73024a 69 udpsock->setOnEvent(this, &AgentbedClass::listen);
okini3939 0:bb21da73024a 70 udpsock->bind(Host(eth->getIp(), port));
okini3939 0:bb21da73024a 71 //
okini3939 0:bb21da73024a 72 return SNMP_API_STAT_SUCCESS;
okini3939 0:bb21da73024a 73 }
okini3939 0:bb21da73024a 74
okini3939 0:bb21da73024a 75 void AgentbedClass::listen (UDPSocketEvent e)
okini3939 0:bb21da73024a 76 {
okini3939 0:bb21da73024a 77 // if bytes available in receive buffer
okini3939 0:bb21da73024a 78 // and pointer to a function (delegate function)
okini3939 0:bb21da73024a 79 // isn't null, trigger the function
okini3939 0:bb21da73024a 80 if (e == UDPSOCKET_READABLE && _callback != NULL ) {
okini3939 0:bb21da73024a 81 (*_callback)();
okini3939 0:bb21da73024a 82 }
okini3939 0:bb21da73024a 83 }
okini3939 0:bb21da73024a 84
okini3939 0:bb21da73024a 85
okini3939 0:bb21da73024a 86 SNMP_API_STAT_CODES AgentbedClass::requestPdu(SNMP_PDU *pdu)
okini3939 0:bb21da73024a 87 {
okini3939 0:bb21da73024a 88 char *community;
okini3939 0:bb21da73024a 89 // sequence length
okini3939 2:9e4369522e03 90 byte __attribute__((__unused__)) seqLen;
okini3939 0:bb21da73024a 91 // version
okini3939 0:bb21da73024a 92 byte verLen, verEnd;
okini3939 0:bb21da73024a 93 // community string
okini3939 0:bb21da73024a 94 byte comLen, comEnd;
okini3939 0:bb21da73024a 95 // pdu
okini3939 2:9e4369522e03 96 byte __attribute__((__unused__)) pduTyp, pduLen;
okini3939 0:bb21da73024a 97 byte ridLen, ridEnd;
okini3939 0:bb21da73024a 98 byte errLen, errEnd;
okini3939 0:bb21da73024a 99 byte eriLen, eriEnd;
okini3939 2:9e4369522e03 100 byte __attribute__((__unused__)) vblTyp, vblLen;
okini3939 2:9e4369522e03 101 byte __attribute__((__unused__)) vbiTyp, vbiLen;
okini3939 0:bb21da73024a 102 byte obiLen, obiEnd;
okini3939 2:9e4369522e03 103 byte __attribute__((__unused__)) valTyp, valLen, valEnd;
okini3939 0:bb21da73024a 104 byte i;
okini3939 0:bb21da73024a 105 Host dest;
okini3939 0:bb21da73024a 106 //
okini3939 0:bb21da73024a 107 // set packet packet size (skip UDP header)
okini3939 0:bb21da73024a 108 // _packetSize = Udp.available()-8;
okini3939 0:bb21da73024a 109 //
okini3939 0:bb21da73024a 110 memset(_packet, 0, SNMP_MAX_PACKET_LEN);
okini3939 0:bb21da73024a 111 //
okini3939 0:bb21da73024a 112 // get UDP packet
okini3939 0:bb21da73024a 113 _packetSize = udpsock->recvfrom((char*)_packet, SNMP_MAX_PACKET_LEN, &_dst);
okini3939 0:bb21da73024a 114 //
okini3939 0:bb21da73024a 115 // validate packet
okini3939 0:bb21da73024a 116 if ( _packetSize != 0 && _packetSize > SNMP_MAX_PACKET_LEN ) {
okini3939 0:bb21da73024a 117 //
okini3939 0:bb21da73024a 118 //SNMP_FREE(_packet);
okini3939 0:bb21da73024a 119
okini3939 0:bb21da73024a 120 return SNMP_API_STAT_PACKET_TOO_BIG;
okini3939 0:bb21da73024a 121 }
okini3939 0:bb21da73024a 122 //
okini3939 0:bb21da73024a 123 // allocate byte array based on packet size
okini3939 0:bb21da73024a 124 //if ( (_packet = (byte *)malloc(sizeof(byte)*_packetSize)) == NULL ) {
okini3939 0:bb21da73024a 125 //
okini3939 0:bb21da73024a 126 //SNMP_FREE(_packet);
okini3939 0:bb21da73024a 127
okini3939 0:bb21da73024a 128 // return SNMP_API_STAT_MALLOC_ERR;
okini3939 0:bb21da73024a 129 //}
okini3939 0:bb21da73024a 130 //
okini3939 0:bb21da73024a 131 // packet check 1
okini3939 0:bb21da73024a 132 if ( _packet[0] != 0x30 ) {
okini3939 0:bb21da73024a 133 //
okini3939 0:bb21da73024a 134 //SNMP_FREE(_packet);
okini3939 0:bb21da73024a 135
okini3939 0:bb21da73024a 136 return SNMP_API_STAT_PACKET_INVALID;
okini3939 0:bb21da73024a 137 }
okini3939 0:bb21da73024a 138 //
okini3939 0:bb21da73024a 139 // sequence length
okini3939 0:bb21da73024a 140 seqLen = _packet[1];
okini3939 0:bb21da73024a 141 // version
okini3939 0:bb21da73024a 142 verLen = _packet[3];
okini3939 0:bb21da73024a 143 verEnd = 3 + verLen;
okini3939 0:bb21da73024a 144 // community string
okini3939 0:bb21da73024a 145 comLen = _packet[verEnd + 2];
okini3939 0:bb21da73024a 146 comEnd = verEnd + 2 + comLen;
okini3939 0:bb21da73024a 147 // pdu
okini3939 0:bb21da73024a 148 pduTyp = _packet[comEnd + 1];
okini3939 0:bb21da73024a 149 pduLen = _packet[comEnd + 2];
okini3939 0:bb21da73024a 150 ridLen = _packet[comEnd + 4];
okini3939 0:bb21da73024a 151 ridEnd = comEnd + 4 + ridLen;
okini3939 0:bb21da73024a 152 errLen = _packet[ridEnd + 2];
okini3939 0:bb21da73024a 153 errEnd = ridEnd + 2 + errLen;
okini3939 0:bb21da73024a 154 eriLen = _packet[errEnd + 2];
okini3939 0:bb21da73024a 155 eriEnd = errEnd + 2 + eriLen;
okini3939 0:bb21da73024a 156 vblTyp = _packet[eriEnd + 1];
okini3939 0:bb21da73024a 157 vblLen = _packet[eriEnd + 2];
okini3939 0:bb21da73024a 158 vbiTyp = _packet[eriEnd + 3];
okini3939 0:bb21da73024a 159 vbiLen = _packet[eriEnd + 4];
okini3939 0:bb21da73024a 160 obiLen = _packet[eriEnd + 6];
okini3939 0:bb21da73024a 161 obiEnd = eriEnd + obiLen + 6;
okini3939 0:bb21da73024a 162 valTyp = _packet[obiEnd + 1];
okini3939 0:bb21da73024a 163 valLen = _packet[obiEnd + 2];
okini3939 0:bb21da73024a 164 valEnd = obiEnd + 2 + valLen;
okini3939 0:bb21da73024a 165 //
okini3939 0:bb21da73024a 166 // extract version
okini3939 0:bb21da73024a 167 pdu->version = 0;
okini3939 0:bb21da73024a 168 for ( i = 0; i < verLen; i++ ) {
okini3939 0:bb21da73024a 169 pdu->version = (pdu->version << 8) | _packet[5 + i];
okini3939 0:bb21da73024a 170 }
okini3939 0:bb21da73024a 171 //
okini3939 0:bb21da73024a 172 // pdu-type
okini3939 0:bb21da73024a 173 pdu->type = (SNMP_PDU_TYPES)pduTyp;
okini3939 0:bb21da73024a 174 _dstType = pdu->type;
okini3939 0:bb21da73024a 175 //
okini3939 0:bb21da73024a 176 // validate community size
okini3939 0:bb21da73024a 177 if ( comLen > SNMP_MAX_NAME_LEN ) {
okini3939 0:bb21da73024a 178 // set pdu error
okini3939 0:bb21da73024a 179 pdu->error = SNMP_ERR_TOO_BIG;
okini3939 0:bb21da73024a 180 //
okini3939 0:bb21da73024a 181 //SNMP_FREE(_packet);
okini3939 0:bb21da73024a 182
okini3939 0:bb21da73024a 183 return SNMP_API_STAT_NAME_TOO_BIG;
okini3939 0:bb21da73024a 184 }
okini3939 0:bb21da73024a 185 //
okini3939 0:bb21da73024a 186 // extract and compare community name
okini3939 0:bb21da73024a 187 // allocate char array based on community size
okini3939 0:bb21da73024a 188 if ( (community = (char *)malloc(sizeof(char)*comLen)) == NULL ) {
okini3939 0:bb21da73024a 189 //
okini3939 0:bb21da73024a 190 //SNMP_FREE(_packet);
okini3939 0:bb21da73024a 191
okini3939 0:bb21da73024a 192 return SNMP_API_STAT_MALLOC_ERR;
okini3939 0:bb21da73024a 193 }
okini3939 0:bb21da73024a 194 //
okini3939 0:bb21da73024a 195 for ( i = 0; i < comLen; i++ ) {
okini3939 0:bb21da73024a 196 community[i] = _packet[verEnd + 3 + i];
okini3939 0:bb21da73024a 197 }
okini3939 0:bb21da73024a 198 // terminate as a string
okini3939 0:bb21da73024a 199 community[comLen] = '\0';
okini3939 0:bb21da73024a 200 //
okini3939 0:bb21da73024a 201 // validate community name
okini3939 0:bb21da73024a 202 if ( pdu->type == SNMP_PDU_SET ) {
okini3939 0:bb21da73024a 203 if ( strcmp(_setCommName, community) != 0 )
okini3939 0:bb21da73024a 204 // set pdu error
okini3939 0:bb21da73024a 205 pdu->error = SNMP_ERR_NO_SUCH_NAME;
okini3939 0:bb21da73024a 206 } else {
okini3939 0:bb21da73024a 207 if ( strcmp(_getCommName, community) != 0 )
okini3939 0:bb21da73024a 208 // set pdu error
okini3939 0:bb21da73024a 209 pdu->error = SNMP_ERR_NO_SUCH_NAME;
okini3939 0:bb21da73024a 210 }
okini3939 0:bb21da73024a 211 //
okini3939 0:bb21da73024a 212 // free community buffer
okini3939 0:bb21da73024a 213 SNMP_FREE(community);
okini3939 0:bb21da73024a 214 //
okini3939 0:bb21da73024a 215 // extract reqiest-id 0x00 0x00 0x00 0x01 (4-byte int aka int32)
okini3939 0:bb21da73024a 216 pdu->requestId = 0;
okini3939 0:bb21da73024a 217 for ( i = 0; i < ridLen; i++ ) {
okini3939 0:bb21da73024a 218 pdu->requestId = (pdu->requestId << 8) | _packet[comEnd + 5 + i];
okini3939 0:bb21da73024a 219 }
okini3939 0:bb21da73024a 220 //
okini3939 0:bb21da73024a 221 // extract error
okini3939 0:bb21da73024a 222 pdu->error = SNMP_ERR_NO_ERROR;
okini3939 0:bb21da73024a 223 int32_t err = 0;
okini3939 0:bb21da73024a 224 for ( i = 0; i < errLen; i++ ) {
okini3939 0:bb21da73024a 225 err = (err << 8) | _packet[ridEnd + 3 + i];
okini3939 0:bb21da73024a 226 }
okini3939 0:bb21da73024a 227 pdu->error = (SNMP_ERR_CODES)err;
okini3939 0:bb21da73024a 228 //
okini3939 0:bb21da73024a 229 // extract error-index
okini3939 0:bb21da73024a 230 pdu->errorIndex = 0;
okini3939 0:bb21da73024a 231 for ( i = 0; i < eriLen; i++ ) {
okini3939 0:bb21da73024a 232 pdu->errorIndex = (pdu->errorIndex << 8) | _packet[errEnd + 3 + i];
okini3939 0:bb21da73024a 233 }
okini3939 0:bb21da73024a 234 //
okini3939 0:bb21da73024a 235 //
okini3939 0:bb21da73024a 236 // validate object-identifier size
okini3939 0:bb21da73024a 237 if ( obiLen > SNMP_MAX_OID_LEN ) {
okini3939 0:bb21da73024a 238 // set pdu error
okini3939 0:bb21da73024a 239 pdu->error = SNMP_ERR_TOO_BIG;
okini3939 0:bb21da73024a 240 //
okini3939 0:bb21da73024a 241 //SNMP_FREE(_packet);
okini3939 0:bb21da73024a 242
okini3939 0:bb21da73024a 243 return SNMP_API_STAT_OID_TOO_BIG;
okini3939 0:bb21da73024a 244 }
okini3939 0:bb21da73024a 245 //
okini3939 0:bb21da73024a 246 // extract and contruct object-identifier
okini3939 0:bb21da73024a 247 /*
okini3939 0:bb21da73024a 248 if ( (pdu->OID.oid = (byte *)malloc(sizeof(byte)*obiLen)) == NULL ) {
okini3939 0:bb21da73024a 249 // free DPU receive buffer
okini3939 0:bb21da73024a 250 _socket.readSkip(_socket.available());
okini3939 0:bb21da73024a 251 //
okini3939 0:bb21da73024a 252 SNMP_FREE(_packet);
okini3939 0:bb21da73024a 253
okini3939 0:bb21da73024a 254 return SNMP_API_STAT_MALLOC_ERR;
okini3939 0:bb21da73024a 255 }
okini3939 0:bb21da73024a 256 */
okini3939 0:bb21da73024a 257 memset(pdu->OID.data, 0, SNMP_MAX_OID_LEN);
okini3939 0:bb21da73024a 258 pdu->OID.size = obiLen;
okini3939 0:bb21da73024a 259 for ( i = 0; i < obiLen; i++ ) {
okini3939 0:bb21da73024a 260 pdu->OID.data[i] = _packet[eriEnd + 7 + i];
okini3939 0:bb21da73024a 261 }
okini3939 0:bb21da73024a 262 //
okini3939 0:bb21da73024a 263 // value-type
okini3939 0:bb21da73024a 264 pdu->VALUE.syntax = (SNMP_SYNTAXES)valTyp;
okini3939 0:bb21da73024a 265 //
okini3939 0:bb21da73024a 266 // validate value size
okini3939 0:bb21da73024a 267 if ( obiLen > SNMP_MAX_VALUE_LEN ) {
okini3939 0:bb21da73024a 268 // set pdu error
okini3939 0:bb21da73024a 269 pdu->error = SNMP_ERR_TOO_BIG;
okini3939 0:bb21da73024a 270 //
okini3939 0:bb21da73024a 271 //SNMP_FREE(_packet);
okini3939 0:bb21da73024a 272
okini3939 0:bb21da73024a 273 return SNMP_API_STAT_VALUE_TOO_BIG;
okini3939 0:bb21da73024a 274 }
okini3939 0:bb21da73024a 275 //
okini3939 0:bb21da73024a 276 // value-size
okini3939 0:bb21da73024a 277 pdu->VALUE.size = valLen;
okini3939 0:bb21da73024a 278 //
okini3939 0:bb21da73024a 279 // extract value
okini3939 0:bb21da73024a 280 // allocate char array based on oid size
okini3939 0:bb21da73024a 281 /*
okini3939 0:bb21da73024a 282 if( (pdu->VALUE.value = (byte *)malloc(sizeof(byte)*valLen)) == NULL ) {
okini3939 0:bb21da73024a 283 // free DPU receive buffer
okini3939 0:bb21da73024a 284 _socket.readSkip(_socket.available());
okini3939 0:bb21da73024a 285 //
okini3939 0:bb21da73024a 286 SNMP_FREE(_packet);
okini3939 0:bb21da73024a 287
okini3939 0:bb21da73024a 288 return SNMP_API_STAT_MALLOC_ERR;
okini3939 0:bb21da73024a 289 }
okini3939 0:bb21da73024a 290 */
okini3939 0:bb21da73024a 291 memset(pdu->VALUE.data, 0, SNMP_MAX_VALUE_LEN);
okini3939 0:bb21da73024a 292 for ( i = 0; i < valLen; i++ ) {
okini3939 0:bb21da73024a 293 pdu->VALUE.data[i] = _packet[obiEnd + 3 + i];
okini3939 0:bb21da73024a 294 }
okini3939 0:bb21da73024a 295 //
okini3939 0:bb21da73024a 296 //SNMP_FREE(_packet);
okini3939 0:bb21da73024a 297 //
okini3939 0:bb21da73024a 298 return SNMP_API_STAT_SUCCESS;
okini3939 0:bb21da73024a 299 }
okini3939 0:bb21da73024a 300
okini3939 0:bb21da73024a 301 SNMP_API_STAT_CODES AgentbedClass::responsePdu(SNMP_PDU *pdu)
okini3939 0:bb21da73024a 302 {
okini3939 0:bb21da73024a 303 int32_u u;
okini3939 0:bb21da73024a 304 byte i;
okini3939 0:bb21da73024a 305 //
okini3939 0:bb21da73024a 306 // Length of entire SNMP packet
okini3939 0:bb21da73024a 307 _packetPos = 0; // 23
okini3939 0:bb21da73024a 308 _packetSize = 25 - 1 + sizeof(pdu->requestId) + sizeof(pdu->error) + sizeof(pdu->errorIndex) + pdu->OID.size + pdu->VALUE.size;
okini3939 0:bb21da73024a 309 //
okini3939 0:bb21da73024a 310 memset(_packet, 0, SNMP_MAX_PACKET_LEN);
okini3939 0:bb21da73024a 311 //
okini3939 0:bb21da73024a 312 if ( _dstType == SNMP_PDU_SET ) {
okini3939 0:bb21da73024a 313 _packetSize += _setSize;
okini3939 0:bb21da73024a 314 } else {
okini3939 0:bb21da73024a 315 _packetSize += _getSize;
okini3939 0:bb21da73024a 316 }
okini3939 0:bb21da73024a 317 //
okini3939 0:bb21da73024a 318 // allocate byte array based on packet size
okini3939 0:bb21da73024a 319 //if ( (_packet = (byte *)malloc(sizeof(byte)*_packetSize)) == NULL ) {
okini3939 0:bb21da73024a 320 //
okini3939 0:bb21da73024a 321 //SNMP_FREE(_packet);
okini3939 0:bb21da73024a 322
okini3939 0:bb21da73024a 323 // return SNMP_API_STAT_MALLOC_ERR;
okini3939 0:bb21da73024a 324 //}
okini3939 0:bb21da73024a 325 //
okini3939 0:bb21da73024a 326 _packet[_packetPos++] = (byte)SNMP_SYNTAX_SEQUENCE; // type
okini3939 0:bb21da73024a 327 _packet[_packetPos++] = (byte)_packetSize; // length
okini3939 0:bb21da73024a 328 //
okini3939 0:bb21da73024a 329
okini3939 0:bb21da73024a 330 // SNMP version
okini3939 0:bb21da73024a 331 _packet[_packetPos++] = (byte)SNMP_SYNTAX_INT; // type
okini3939 0:bb21da73024a 332 _packet[_packetPos++] = 0x01; // length
okini3939 0:bb21da73024a 333 _packet[_packetPos++] = 0x00; // value
okini3939 0:bb21da73024a 334 //
okini3939 0:bb21da73024a 335 // SNMP community string
okini3939 0:bb21da73024a 336 _packet[_packetPos++] = (byte)SNMP_SYNTAX_OCTETS; // type
okini3939 0:bb21da73024a 337 if ( _dstType == SNMP_PDU_SET ) {
okini3939 0:bb21da73024a 338 _packet[_packetPos++] = (byte)_setSize; // length
okini3939 0:bb21da73024a 339 for ( i = 0; i < _setSize; i++ ) {
okini3939 0:bb21da73024a 340 _packet[_packetPos++] = (byte)_setCommName[i];
okini3939 0:bb21da73024a 341 }
okini3939 0:bb21da73024a 342 } else {
okini3939 0:bb21da73024a 343 _packet[_packetPos++] = (byte)_getSize; // length
okini3939 0:bb21da73024a 344 for ( i = 0; i < _getSize; i++ ) {
okini3939 0:bb21da73024a 345 _packet[_packetPos++] = (byte)_getCommName[i];
okini3939 0:bb21da73024a 346 }
okini3939 0:bb21da73024a 347 }
okini3939 0:bb21da73024a 348 //
okini3939 0:bb21da73024a 349 // SNMP PDU
okini3939 0:bb21da73024a 350 _packet[_packetPos++] = (byte)pdu->type;
okini3939 0:bb21da73024a 351 _packet[_packetPos++] = (byte)( sizeof(pdu->requestId) + sizeof((int32_t)pdu->error) + sizeof(pdu->errorIndex) + pdu->OID.size + pdu->VALUE.size + 14 );
okini3939 0:bb21da73024a 352 //
okini3939 0:bb21da73024a 353 // Request ID (size always 4 e.g. 4-byte int)
okini3939 0:bb21da73024a 354 _packet[_packetPos++] = (byte)SNMP_SYNTAX_INT; // type
okini3939 0:bb21da73024a 355 _packet[_packetPos++] = (byte)sizeof(pdu->requestId);
okini3939 0:bb21da73024a 356 u.int32 = pdu->requestId;
okini3939 0:bb21da73024a 357 _packet[_packetPos++] = u.data[3];
okini3939 0:bb21da73024a 358 _packet[_packetPos++] = u.data[2];
okini3939 0:bb21da73024a 359 _packet[_packetPos++] = u.data[1];
okini3939 0:bb21da73024a 360 _packet[_packetPos++] = u.data[0];
okini3939 0:bb21da73024a 361 //
okini3939 0:bb21da73024a 362 // Error (size always 4 e.g. 4-byte int)
okini3939 0:bb21da73024a 363 _packet[_packetPos++] = (byte)SNMP_SYNTAX_INT; // type
okini3939 0:bb21da73024a 364 _packet[_packetPos++] = (byte)sizeof((int32_t)pdu->error);
okini3939 0:bb21da73024a 365 u.int32 = pdu->error;
okini3939 0:bb21da73024a 366 _packet[_packetPos++] = u.data[3];
okini3939 0:bb21da73024a 367 _packet[_packetPos++] = u.data[2];
okini3939 0:bb21da73024a 368 _packet[_packetPos++] = u.data[1];
okini3939 0:bb21da73024a 369 _packet[_packetPos++] = u.data[0];
okini3939 0:bb21da73024a 370 //
okini3939 0:bb21da73024a 371 // Error Index (size always 4 e.g. 4-byte int)
okini3939 0:bb21da73024a 372 _packet[_packetPos++] = (byte)SNMP_SYNTAX_INT; // type
okini3939 0:bb21da73024a 373 _packet[_packetPos++] = (byte)sizeof(pdu->errorIndex);
okini3939 0:bb21da73024a 374 u.int32 = pdu->errorIndex;
okini3939 0:bb21da73024a 375 _packet[_packetPos++] = u.data[3];
okini3939 0:bb21da73024a 376 _packet[_packetPos++] = u.data[2];
okini3939 0:bb21da73024a 377 _packet[_packetPos++] = u.data[1];
okini3939 0:bb21da73024a 378 _packet[_packetPos++] = u.data[0];
okini3939 0:bb21da73024a 379 //
okini3939 0:bb21da73024a 380 // Varbind List
okini3939 0:bb21da73024a 381 _packet[_packetPos++] = (byte)SNMP_SYNTAX_SEQUENCE; // type
okini3939 0:bb21da73024a 382 _packet[_packetPos++] = (byte)( pdu->OID.size + pdu->VALUE.size + 6 ); //4
okini3939 0:bb21da73024a 383 //
okini3939 0:bb21da73024a 384 // Varbind
okini3939 0:bb21da73024a 385 _packet[_packetPos++] = (byte)SNMP_SYNTAX_SEQUENCE; // type
okini3939 0:bb21da73024a 386 _packet[_packetPos++] = (byte)( pdu->OID.size + pdu->VALUE.size + 4 ); //2
okini3939 0:bb21da73024a 387 //
okini3939 0:bb21da73024a 388 // ObjectIdentifier
okini3939 0:bb21da73024a 389 _packet[_packetPos++] = (byte)SNMP_SYNTAX_OID; // type
okini3939 0:bb21da73024a 390 _packet[_packetPos++] = (byte)(pdu->OID.size);
okini3939 0:bb21da73024a 391 for ( i = 0; i < pdu->OID.size; i++ ) {
okini3939 0:bb21da73024a 392 _packet[_packetPos++] = pdu->OID.data[i];
okini3939 0:bb21da73024a 393 }
okini3939 0:bb21da73024a 394 //
okini3939 0:bb21da73024a 395 // Value
okini3939 0:bb21da73024a 396 _packet[_packetPos++] = (byte)pdu->VALUE.syntax; // type
okini3939 0:bb21da73024a 397 _packet[_packetPos++] = (byte)(pdu->VALUE.size);
okini3939 0:bb21da73024a 398 for ( i = 0; i < pdu->VALUE.size; i++ ) {
okini3939 0:bb21da73024a 399 _packet[_packetPos++] = pdu->VALUE.data[i];
okini3939 0:bb21da73024a 400 }
okini3939 0:bb21da73024a 401 //
okini3939 0:bb21da73024a 402 udpsock->sendto((char*)_packet, _packetPos, &_dst);
okini3939 0:bb21da73024a 403 //
okini3939 0:bb21da73024a 404 //SNMP_FREE(_packet);
okini3939 0:bb21da73024a 405 //
okini3939 0:bb21da73024a 406 return SNMP_API_STAT_SUCCESS;
okini3939 0:bb21da73024a 407 }
okini3939 0:bb21da73024a 408
okini3939 0:bb21da73024a 409
okini3939 0:bb21da73024a 410
okini3939 0:bb21da73024a 411 void AgentbedClass::onPduReceive(onPduReceiveCallback pduReceived)
okini3939 0:bb21da73024a 412 {
okini3939 0:bb21da73024a 413 _callback = pduReceived;
okini3939 0:bb21da73024a 414 }
okini3939 0:bb21da73024a 415
okini3939 0:bb21da73024a 416 void AgentbedClass::freePdu(SNMP_PDU *pdu)
okini3939 0:bb21da73024a 417 {
okini3939 0:bb21da73024a 418 //SNMP_FREE(pdu->OID.oid);
okini3939 0:bb21da73024a 419 //SNMP_FREE(pdu->VALUE.value);
okini3939 0:bb21da73024a 420 memset(pdu->OID.data, 0, SNMP_MAX_OID_LEN);
okini3939 0:bb21da73024a 421 memset(pdu->VALUE.data, 0, SNMP_MAX_VALUE_LEN);
okini3939 0:bb21da73024a 422 //free((char *) pdu);
okini3939 0:bb21da73024a 423 }
okini3939 0:bb21da73024a 424
okini3939 0:bb21da73024a 425 // Create one global object
okini3939 0:bb21da73024a 426 //AgentbedClass Agentbed;