SNMP Agent http://mbed.org/users/okini3939/notebook/agentbed-library/
Dependents: WeatherPlatform_20110408 WeatherPlatform WeatherStation
Agentbed.cpp@2:9e4369522e03, 2011-01-28 (annotated)
- Committer:
- okini3939
- Date:
- Fri Jan 28 09:17:03 2011 +0000
- Revision:
- 2:9e4369522e03
- Parent:
- 0:bb21da73024a
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 | |
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; |