Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 1 addition & 7 deletions src/BERDecode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,8 @@ int NetworkAddress::fromBuffer(const uint8_t *buf, size_t max_len){
int i = BER_CONTAINER::fromBuffer(buf, max_len);
CHECK_DECODE_ERR(i);
const uint8_t* ptr = buf + i;

// byte tempAddress[4];
// tempAddress[0] = *ptr++;
// tempAddress[1] = *ptr++;
// tempAddress[2] = *ptr++;
// tempAddress[3] = *ptr++;

_value = IPAddress(ptr);
ptr += 4;
return ptr - buf;
}

Expand Down
4 changes: 2 additions & 2 deletions src/SNMP_Agent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,12 +190,12 @@ ValueCallback* SNMPAgent::addGaugeHandler(const char *oid, uint32_t* value, bool
return addHandler(new Gauge32Callback(oidType, value), false);
}

ValueCallback* addIPAddressHandler(const char *oid, IPAddress* value, bool isSettable, bool overwritePrefix){
ValueCallback* SNMPAgent::addIPAddressHandler(const char *oid, IPAddress* value, bool isSettable, bool overwritePrefix){
if(!value) return nullptr;

SortableOIDType* oidType = buildOIDWithPrefix(oid, overwritePrefix);
if(!oidType) return nullptr;
return addHandler(new NetworkAddressCallback(oidType, value), false);
return addHandler(new NetworkAddressCallback(oidType, value), isSettable);
}

ValueCallback * SNMPAgent::addHandler(ValueCallback *callback, bool isSettable) {
Expand Down
59 changes: 53 additions & 6 deletions tests/tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,15 +61,18 @@ TEST_CASE( "Test handle failures when Encoding/Decoding", "[snmp]"){

SECTION( "Should fail to parse a corrupt buffer "){
SNMPPacket* readPacket = new SNMPPacket();
for(int i = 25; i < 133; i+= 10){
char old[10] = {0};
memcpy(old, &buffer[i], 10);
long randomLong = random();
memcpy(&buffer[i], &randomLong, 10);
uint8_t random_arr[] = {35, 147, 95, 195, 124, 200, 244, 76, 255, 241, 35, 147, 95, 255, 241, 35};
uint8_t old[sizeof(random_arr)] = {0};
for(int i = 25; i < 133; i+= sizeof(random_arr)){
memcpy(old, &buffer[i], sizeof(random_arr));

memcpy(&buffer[i], &random_arr, sizeof(random_arr));

// This may SOMETIMES fail if the random gets lucky and makes something valid
INFO("The number is " << i);
REQUIRE( readPacket->parseFrom(buffer, 200) != SNMP_ERROR_OK );

memcpy(&buffer[i], old, 10);
memcpy(&buffer[i], old, sizeof(random_arr));
REQUIRE( readPacket->parseFrom(buffer, 200) == SNMP_ERROR_OK );
}
}
Expand Down Expand Up @@ -123,6 +126,29 @@ TEST_CASE( "Test Encoding/Decoding packet", "[snmp]" ) {
REQUIRE( std::static_pointer_cast<IntegerType>(packet->varbindList[4].value)->_value == -420000 );
}

TEST_CASE( "Test Get IpAdress value", "[snmp]" ) {
std::deque<ValueCallback*> callbacks;
IPAddress ip_addr = IPAddress(1,2,3,4);
ValueCallback* ip_addr_callback = new NetworkAddressCallback(new SortableOIDType(".1.3.6.1.4.1.5.1"), &ip_addr);
callbacks.push_back(ip_addr_callback);

SNMPPacket* requestPacket = new SNMPPacket();
requestPacket->setPDUType(GetRequestPDU);
requestPacket->setCommunityString("public");
requestPacket->setRequestID(random());
requestPacket->setVersion(SNMP_VERSION_1);
requestPacket->varbindList.push_back(VarBind(std::make_shared<SortableOIDType>(".1.3.6.1.4.1.5.1"), std::make_shared<NetworkAddress>(IPAddress(0,0,0,0))));
uint8_t buffer[500];
int requestLength = requestPacket->serialiseInto(buffer, 500);
REQUIRE( requestLength > 0 );
int responseLength;
REQUIRE( handlePacket(buffer, requestLength, &responseLength, 500, callbacks, (char*)"public", (char*)"private") == SNMP_GET_OCCURRED );
SNMPPacket* responsePacket = new SNMPPacket();
REQUIRE( responsePacket->parseFrom(buffer, responseLength) == SNMP_ERROR_OK );
REQUIRE( responsePacket->varbindList.at(0).type == NETWORK_ADDRESS );
REQUIRE( std::static_pointer_cast<NetworkAddress>(responsePacket->varbindList.at(0).value)->_value == ip_addr );
}

TEST_CASE( "Test GetRequestPDU", "[snmp]" ){
std::deque<ValueCallback*> callbacks;

Expand Down Expand Up @@ -260,6 +286,27 @@ TEST_CASE( "Test SetRequestPDU", "[snmp]" ){

}

TEST_CASE( "Test Set IpAdress value", "[snmp]" ) {
std::deque<ValueCallback*> callbacks;
IPAddress ip_addr = IPAddress(1,2,3,4);
ValueCallback* ip_addr_callback = new NetworkAddressCallback(new SortableOIDType(".1.3.6.1.4.1.5.1"), &ip_addr);
ip_addr_callback->isSettable = true;
callbacks.push_back(ip_addr_callback);

SNMPPacket* requestPacket = new SNMPPacket();
requestPacket->setPDUType(SetRequestPDU);
requestPacket->setCommunityString("public");
requestPacket->setRequestID(random());
requestPacket->setVersion(SNMP_VERSION_1);
IPAddress set_ip_addr = IPAddress(5,6,7,8);
requestPacket->varbindList.push_back(VarBind(std::make_shared<SortableOIDType>(".1.3.6.1.4.1.5.1"), std::make_shared<NetworkAddress>(set_ip_addr)));
uint8_t buffer[500];
int requestLength = requestPacket->serialiseInto(buffer, 500);
REQUIRE( requestLength > 0 );
int responseLength;
REQUIRE( handlePacket(buffer, requestLength, &responseLength, 500, callbacks, (char*)"public", (char*)"public") == SNMP_SET_OCCURRED );
REQUIRE( ip_addr == set_ip_addr );
}

TEST_CASE( "sort/remove handlers ", "[snmp]"){
std::deque<ValueCallback*> callbacks;
Expand Down