|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Arp MIB architecture support
|
|
Packit |
fcad23 |
*
|
|
Packit |
fcad23 |
* $Id$
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
#include <net-snmp/net-snmp-config.h>
|
|
Packit |
fcad23 |
#include <net-snmp/net-snmp-includes.h>
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include <net-snmp/agent/net-snmp-agent-includes.h>
|
|
Packit |
fcad23 |
#include <net-snmp/data_access/arp.h>
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/**---------------------------------------------------------------------*/
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* arp_entry functions
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
/**
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
netsnmp_arp_entry *
|
|
Packit |
fcad23 |
netsnmp_access_arp_entry_create(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
netsnmp_arp_entry *entry =
|
|
Packit |
fcad23 |
SNMP_MALLOC_TYPEDEF(netsnmp_arp_entry);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (NULL == entry)
|
|
Packit |
fcad23 |
return NULL;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
entry->oid_index.len = 1;
|
|
Packit |
fcad23 |
entry->oid_index.oids = &entry->ns_arp_index;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return entry;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/**
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
netsnmp_access_arp_entry_free(netsnmp_arp_entry * entry)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
free(entry);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/**---------------------------------------------------------------------*/
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Utility routines
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/**
|
|
Packit |
fcad23 |
* Update given entry with new data. Calculate new arp_last_updated, if any
|
|
Packit |
fcad23 |
* field is changed.
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
void netsnmp_access_arp_entry_update(netsnmp_arp_entry *entry,
|
|
Packit |
fcad23 |
netsnmp_arp_entry *new_data)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
int modified = 0;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
entry->generation = new_data->generation;
|
|
Packit |
fcad23 |
if (entry->arp_ipaddress_len != new_data->arp_ipaddress_len
|
|
Packit |
fcad23 |
|| memcmp(entry->arp_ipaddress, new_data->arp_ipaddress, entry->arp_ipaddress_len) != 0 ) {
|
|
Packit |
fcad23 |
modified = 1;
|
|
Packit |
fcad23 |
entry->arp_ipaddress_len = new_data->arp_ipaddress_len;
|
|
Packit |
fcad23 |
memcpy(entry->arp_ipaddress, new_data->arp_ipaddress, sizeof(entry->arp_ipaddress));
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
if (entry->arp_physaddress_len != new_data->arp_physaddress_len ||
|
|
Packit |
fcad23 |
memcmp(entry->arp_physaddress, new_data->arp_physaddress, entry->arp_physaddress_len) != 0) {
|
|
Packit |
fcad23 |
modified = 1;
|
|
Packit |
fcad23 |
entry->arp_physaddress_len = new_data->arp_physaddress_len;
|
|
Packit |
fcad23 |
memcpy(entry->arp_physaddress, new_data->arp_physaddress, sizeof(entry->arp_physaddress_len));
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
if (entry->arp_state != new_data->arp_state) {
|
|
Packit |
fcad23 |
modified = 1;
|
|
Packit |
fcad23 |
entry->arp_state = new_data->arp_state;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
if (entry->arp_type != new_data->arp_type) {
|
|
Packit |
fcad23 |
modified = 1;
|
|
Packit |
fcad23 |
entry->arp_type = new_data->arp_type;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
if (entry->flags != new_data->flags) {
|
|
Packit |
fcad23 |
modified = 1;
|
|
Packit |
fcad23 |
entry->flags = new_data->flags;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (modified)
|
|
Packit |
fcad23 |
entry->arp_last_updated = netsnmp_get_agent_uptime();
|
|
Packit |
fcad23 |
}
|