+/* -*- mode: c; c-file-style: "openbsd" -*- */
+/*
+ * Copyright (c) 2015 Vincent Bernat <bernat@luffy.cx>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
#include <check.h>
#include "../src/daemon/lldpd.h"
extern struct lldpd *agent_scfg;
extern struct timeval starttime;
extern struct variable8 agent_lldp_vars[];
-extern int asprintf (char **, char *, ...);
/* Our test config */
struct lldpd test_cfg = {
.g_config = {
- .c_delay = 30,
+ .c_tx_interval = 30,
.c_smart = 0
}
};
/* First chassis */
struct lldpd_mgmt mgmt1 = {
.m_family = LLDPD_AF_IPV4,
- .m_addr = { .inet = { 251789504 } }, /* 192.0.2.15 */
+ .m_addr = { .octets = { 0xc0, 0, 0x2, 0xf } }, /* 192.0.2.15 */
.m_addrsize = sizeof(struct in_addr),
.m_iface = 3
};
/* Second chassis */
struct lldpd_mgmt mgmt2 = {
.m_family = LLDPD_AF_IPV4,
- .m_addr = { .inet = { 285343936 } }, /* 192.0.2.17 */
+ .m_addr = { .octets = { 0xc0, 0, 0x2, 0x11 } }, /* 192.0.2.17 */
.m_addrsize = sizeof(struct in_addr),
.m_iface = 5
};
.h_tx_cnt = 1352,
.h_rx_cnt = 1458,
.h_rx_discarded_cnt = 5,
- .h_rx_ageout_cnt = 1455,
.h_rx_unrecognized_cnt = 4,
+ .h_insert_cnt = 100,
+ .h_delete_cnt = 5,
+ .h_ageout_cnt = 20,
+ .h_drop_cnt = 1,
.h_lport = {
.p_chassis = &chassis1,
.p_lastchange = 200,
.h_tx_cnt = 11352,
.h_rx_cnt = 11458,
.h_rx_discarded_cnt = 55,
- .h_rx_ageout_cnt = 21455,
.h_rx_unrecognized_cnt = 14,
+ .h_insert_cnt = 1000,
+ .h_delete_cnt = 51,
+ .h_ageout_cnt = 210,
+ .h_drop_cnt = 1,
.h_lport = {
.p_chassis = &chassis1,
.p_lastchange = 50,
.p_pi_len = 2,
};
struct lldpd_pi pi888e01 = {
- .p_pi = "\x88\x8e\e01",
+ .p_pi = "\x88\x8e\x01",
.p_pi_len = 3,
};
#endif
void
snmp_config()
{
-
starttime = test_starttime;
agent_scfg = &test_cfg;
TAILQ_INIT(&test_cfg.g_chassis);
TAILQ_INSERT_TAIL(&hardware1.h_rports, &hardware2.h_lport, p_entries);
TAILQ_INIT(&hardware2.h_rports);
TAILQ_INSERT_TAIL(&hardware2.h_rports, &hardware1.h_lport, p_entries);
-
}
/* Convert OID to a string. Static buffer. */
{
static char *buffer[4] = {NULL, NULL, NULL, NULL};
static int current = 0;
- int i;
+ size_t i;
current = (current + 1)%4;
- if (buffer[current]) free(buffer[current]); buffer[current] = NULL;
+ free(buffer[current]); buffer[current] = NULL;
for (i = 0; i < namelen; i++) {
/* Not very efficient... */
char *newbuffer = NULL;
- asprintf(&newbuffer, "%s.%u", buffer[current]?buffer[current]:"", name[i]);
- if (buffer[current]) free(buffer[current]);
+ if (asprintf(&newbuffer, "%s.%lu", buffer[current]?buffer[current]:"",
+ (unsigned long)name[i]) == -1) {
+ free(buffer[current]);
+ buffer[current] = NULL;
+ return NULL;
+ }
+ free(buffer[current]);
buffer[current] = newbuffer;
}
return buffer[current++];
{ {1, 1, 4, 0}, 4, ASN_INTEGER, { .integer = 1 } }, /* lldpTxDelay */
{ {1, 1, 5, 0}, 4, ASN_INTEGER, { .integer = 5 } }, /* lldpNotificationInterval */
{ {1, 2, 1, 0}, 4, ASN_TIMETICKS, { .integer = 10000 } },/* lldpStatsRemTablesLastChangeTime */
- { {1, 2, 2, 0}, 4, ASN_GAUGE, { .integer = 12916 } }, /* lldpStatsRemTablesInserts */
- { {1, 2, 3, 0}, 4, ASN_GAUGE, { .integer = 12914 } }, /* lldpStatsRemTablesDeletes */
- { {1, 2, 4, 0}, 4, ASN_GAUGE, { .integer = 0 } }, /* lldpStatsRemTablesDrops */
- { {1, 2, 5, 0}, 4, ASN_GAUGE, { .integer = 22910 } }, /* lldpStatsRemTablesAgeouts */
+ { {1, 2, 2, 0}, 4, ASN_GAUGE, { .integer = 1100 } }, /* lldpStatsRemTablesInserts */
+ { {1, 2, 3, 0}, 4, ASN_GAUGE, { .integer = 56 } }, /* lldpStatsRemTablesDeletes */
+ { {1, 2, 4, 0}, 4, ASN_GAUGE, { .integer = 2 } }, /* lldpStatsRemTablesDrops */
+ { {1, 2, 5, 0}, 4, ASN_GAUGE, { .integer = 230 } }, /* lldpStatsRemTablesAgeouts */
{ {1, 2, 6, 1, 2, 3}, 6, ASN_COUNTER, { .integer = 1352 } }, /* lldpStatsTxPortFramesTotal.3 */
{ {1, 2, 6, 1, 2, 4}, 6, ASN_COUNTER, { .integer = 11352 } }, /* lldpStatsTxPortFramesTotal.4 */
{ {1, 2, 7, 1, 5, 4}, 6, ASN_COUNTER, { .integer = 14 } }, /* lldpStatsRxPortTLVsDiscardedTotal.4 */
{ {1, 2, 7, 1, 6, 3}, 6, ASN_COUNTER, { .integer = 4 } }, /* lldpStatsRxPortTLVsUnrecognizedTotal.3 */
{ {1, 2, 7, 1, 6, 4}, 6, ASN_COUNTER, { .integer = 14 } }, /* lldpStatsRxPortTLVsUnrecognizedTotal.4 */
- { {1, 2, 7, 1, 7, 3}, 6, ASN_GAUGE, { .integer = 1455 } }, /* lldpStatsRxPortAgeoutsTotal.3 */
- { {1, 2, 7, 1, 7, 4}, 6, ASN_GAUGE, { .integer = 21455 } }, /* lldpStatsRxPortAgeoutsTotal.4 */
+ { {1, 2, 7, 1, 7, 3}, 6, ASN_GAUGE, { .integer = 20 } }, /* lldpStatsRxPortAgeoutsTotal.3 */
+ { {1, 2, 7, 1, 7, 4}, 6, ASN_GAUGE, { .integer = 210 } }, /* lldpStatsRxPortAgeoutsTotal.4 */
{ {1, 3, 1, 0}, 4, ASN_INTEGER, { .integer = 4 } }, /* lldpLocChassisIdSubtype */
/* lldpLocChassisId */
{ { 1, 5, 32962, 1, 2, 3, 1, 2, 3, 1449}, 10, ASN_OCTET_STR,
{ .string = { .octet = "VLAN #1449", .len = 10 }} },
/* lldpXdot1LocProtocolId */
- { { 1, 5, 32962, 1, 2, 4, 1, 2, 3, 13175}, 10, ASN_OCTET_STR,
+ { { 1, 5, 32962, 1, 2, 4, 1, 2, 3, 30321}, 10, ASN_OCTET_STR,
+ { .string = { .octet = "\x88\x8e\x01", .len = 3 } }},
+ { { 1, 5, 32962, 1, 2, 4, 1, 2, 3, 30515}, 10, ASN_OCTET_STR,
{ .string = { .octet = "\x88\xcc", .len = 2 } }},
- { { 1, 5, 32962, 1, 2, 4, 1, 2, 3, 29020}, 10, ASN_OCTET_STR,
- { .string = { .octet = "\x88\x8e\e01", .len = 3 } }},
/* lldpXdot1RemPortVlanId */
{ { 1, 5, 32962, 1, 3, 1, 1, 1, 0, 3, 1}, 11, ASN_INTEGER, { .integer = 0 }},
{ { 1, 5, 32962, 1, 3, 3, 1, 2, 10000, 4, 1, 1449}, 12, ASN_OCTET_STR,
{ .string = { .octet = "VLAN #1449", .len = 10 }} },
/* lldpXdot1RemProtocolId */
- { { 1, 5, 32962, 1, 3, 4, 1, 2, 10000, 4, 1, 13175}, 12, ASN_OCTET_STR,
- { .string = { .octet = "\x88\xcc", .len = 2 } }},
- { { 1, 5, 32962, 1, 3, 4, 1, 2, 10000, 4, 1, 29020}, 12, ASN_OCTET_STR,
- { .string = { .octet = "\x88\x8e\e01", .len = 3 } }},
+ { { 1, 5, 32962, 1, 3, 4, 1, 2, 10000, 4, 1, 30321}, 12, ASN_OCTET_STR,
+ { .string = { .octet = "\x88\x8e\x01", .len = 3 } }},
+ { { 1, 5, 32962, 1, 3, 4, 1, 2, 10000, 4, 1, 30515}, 12, ASN_OCTET_STR,
+ { .string = { .octet = "\x88\xcc", .len = 2 } }}
#endif
};
{
static char *hex[] = { NULL, NULL };
static int which = 0;
- if (hex[which]) free(hex[which]); hex[which] = NULL;
+ free(hex[which]); hex[which] = NULL;
hex[which] = malloc(len * 3 + 1);
fail_unless(hex[which] != NULL, "Not enough memory?");
- for (int i = 0; i < len; i++)
+ for (size_t i = 0; i < len; i++)
snprintf(hex[which] + 3*i, 4, "%02X ", (unsigned char)str[i]);
which = 1 - which;
return hex[1 - which];
vp->type = v1->type;
vp->acl = v1->acl;
vp->findVar = v1->findVar;
- vp->namelen = v1->namelen +
+ vp->namelen = v1->namelen +
sizeof(lldp_oid)/sizeof(oid);
memcpy(vp->name, lldp_oid, sizeof(lldp_oid));
memcpy(vp->name + sizeof(lldp_oid)/sizeof(oid),
u_char *result, size_t varlen,
oid *target, size_t targetlen, char *repr)
{
+ unsigned long int value;
fail_unless((targetlen == sizeof(lldp_oid)/sizeof(oid) + n->namelen) &&
!memcmp(target, lldp_oid, sizeof(lldp_oid)) &&
!memcmp(target + sizeof(lldp_oid)/sizeof(oid),
fail_unless(varlen == sizeof(unsigned long int),
"Inappropriate length for integer type for OID %s",
repr);
- fail_unless(n->value.integer ==
- *(unsigned long int *)result,
+ memcpy(&value, result, sizeof(value));
+ fail_unless(n->value.integer == value,
"For OID %s, expected value %u but got %u instead",
repr,
n->value.integer,
- *(unsigned long int *)result);
+ value);
break;
default:
fail_unless(((n->value.string.len == varlen) &&
START_TEST (test_variable_order)
{
- int i;
+ size_t i;
for (i = 0; i < agent_lldp_vars_size() - 1; i++) {
fail_unless(snmp_oid_compare(agent_lldp_vars[i].name,
agent_lldp_vars[i].namelen,
START_TEST (test_get)
{
- int j;
+ size_t j;
for (j = 0;
j < sizeof(snmp_tree)/sizeof(struct tree_node);
j++) {
- int i;
+ size_t i;
int found = 0;
struct variable vp;
oid target[MAX_OID_LEN];
/* Invoke the function */
result = vp.findVar(&vp, target, &targetlen, 1, &varlen, &wmethod);
-
+
/* Check the result */
fail_unless(result != NULL,
"No result when querying %s", repr);
START_TEST (test_getnext)
{
- int j;
- int end = sizeof(snmp_tree)/sizeof(struct tree_node);
+ size_t j;
+ size_t end = sizeof(snmp_tree)/sizeof(struct tree_node);
for (j = 0;
j < end;
j++) {
- int i;
+ size_t i;
struct variable vp;
oid target[MAX_OID_LEN];
size_t targetlen;