|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Template MIB group implementation - at.c
|
|
Packit |
fcad23 |
*
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/* Portions of this file are subject to the following copyright(s). See
|
|
Packit |
fcad23 |
* the Net-SNMP's COPYING file for more details and other copyrights
|
|
Packit |
fcad23 |
* that may apply:
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Portions of this file are copyrighted by:
|
|
Packit |
fcad23 |
* Copyright © 2003 Sun Microsystems, Inc. All rights reserved.
|
|
Packit |
fcad23 |
* Use is subject to license terms specified in the COPYING file
|
|
Packit |
fcad23 |
* distributed with the Net-SNMP package.
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include <net-snmp/net-snmp-config.h>
|
|
Packit |
fcad23 |
#include <net-snmp/net-snmp-includes.h>
|
|
Packit |
fcad23 |
#include <net-snmp/agent/net-snmp-agent-includes.h>
|
|
Packit |
fcad23 |
#include <net-snmp/data_access/interface.h>
|
|
Packit |
fcad23 |
#include "kernel_sunos5.h"
|
|
Packit |
fcad23 |
#include "../at.h"
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
typedef struct if_ip {
|
|
Packit |
fcad23 |
int ifIdx;
|
|
Packit |
fcad23 |
IpAddress ipAddr;
|
|
Packit |
fcad23 |
} if_ip_t;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static int
|
|
Packit |
fcad23 |
AT_Cmp(void *addr, void *ep)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
mib2_ipNetToMediaEntry_t *mp = (mib2_ipNetToMediaEntry_t *) ep;
|
|
Packit |
fcad23 |
int ret = -1;
|
|
Packit |
fcad23 |
oid index;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#ifdef NETSNMP_INCLUDE_IFTABLE_REWRITES
|
|
Packit |
fcad23 |
mp->ipNetToMediaIfIndex.o_bytes[mp->ipNetToMediaIfIndex.o_length] = '\0';
|
|
Packit |
fcad23 |
index = netsnmp_access_interface_index_find(
|
|
Packit |
fcad23 |
mp->ipNetToMediaIfIndex.o_bytes);
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
index = Interface_Index_By_Name(mp->ipNetToMediaIfIndex.o_bytes,
|
|
Packit |
fcad23 |
mp->ipNetToMediaIfIndex.o_length);
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
DEBUGMSGTL(("mibII/at", "......... AT_Cmp %lx<>%lx %d<>%d (%.5s)\n",
|
|
Packit |
fcad23 |
(unsigned long)mp->ipNetToMediaNetAddress,
|
|
Packit |
fcad23 |
(unsigned long)((if_ip_t *) addr)->ipAddr,
|
|
Packit |
fcad23 |
((if_ip_t *) addr)->ifIdx, index,
|
|
Packit |
fcad23 |
mp->ipNetToMediaIfIndex.o_bytes));
|
|
Packit |
fcad23 |
if (mp->ipNetToMediaNetAddress != ((if_ip_t *) addr)->ipAddr)
|
|
Packit |
fcad23 |
ret = 1;
|
|
Packit |
fcad23 |
else if (((if_ip_t *) addr)->ifIdx != index)
|
|
Packit |
fcad23 |
ret = 1;
|
|
Packit |
fcad23 |
else
|
|
Packit |
fcad23 |
ret = 0;
|
|
Packit |
fcad23 |
DEBUGMSGTL(("mibII/at", "......... AT_Cmp returns %d\n", ret));
|
|
Packit |
fcad23 |
return ret;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
u_char *
|
|
Packit |
fcad23 |
var_atEntry(struct variable * vp,
|
|
Packit |
fcad23 |
oid * name,
|
|
Packit |
fcad23 |
size_t * length,
|
|
Packit |
fcad23 |
int exact, size_t * var_len, WriteMethod ** write_method)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* object identifier is of form:
|
|
Packit |
fcad23 |
* 1.3.6.1.2.1.3.1.1.1.interface.1.A.B.C.D, where A.B.C.D is IP address.
|
|
Packit |
fcad23 |
* Interface is at offset 10,
|
|
Packit |
fcad23 |
* IPADDR starts at offset 12.
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
#define AT_MAX_NAME_LENGTH 16
|
|
Packit |
fcad23 |
#define AT_IFINDEX_OFF 10
|
|
Packit |
fcad23 |
u_char *cp;
|
|
Packit |
fcad23 |
oid *op;
|
|
Packit |
fcad23 |
oid lowest[AT_MAX_NAME_LENGTH];
|
|
Packit |
fcad23 |
oid current[AT_MAX_NAME_LENGTH];
|
|
Packit |
fcad23 |
if_ip_t NextAddr;
|
|
Packit |
fcad23 |
mib2_ipNetToMediaEntry_t entry;
|
|
Packit |
fcad23 |
static mib2_ipNetToMediaEntry_t Lowentry;
|
|
Packit |
fcad23 |
int Found = 0;
|
|
Packit |
fcad23 |
req_e req_type;
|
|
Packit |
fcad23 |
int offset, olength = 0;
|
|
Packit |
fcad23 |
static in_addr_t addr_ret;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* fill in object part of name for current (less sizeof instance part)
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
DEBUGMSGTL(("mibII/at", "var_atEntry: "));
|
|
Packit |
fcad23 |
DEBUGMSGOID(("mibII/at", vp->name, vp->namelen));
|
|
Packit |
fcad23 |
DEBUGMSG(("mibII/at", " %d\n", exact));
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
memset(&Lowentry, 0, sizeof(Lowentry));
|
|
Packit |
fcad23 |
memcpy((char *) current, (char *) vp->name, vp->namelen * sizeof(oid));
|
|
Packit |
fcad23 |
lowest[0] = 1024;
|
|
Packit |
fcad23 |
for (NextAddr.ipAddr = (u_long) - 1, NextAddr.ifIdx = 255, req_type =
|
|
Packit |
fcad23 |
GET_FIRST;;
|
|
Packit |
fcad23 |
NextAddr.ipAddr = entry.ipNetToMediaNetAddress, NextAddr.ifIdx =
|
|
Packit |
fcad23 |
current[AT_IFINDEX_OFF], req_type = GET_NEXT) {
|
|
Packit |
fcad23 |
if (getMibstat
|
|
Packit |
fcad23 |
(MIB_IP_NET, &entry, sizeof(mib2_ipNetToMediaEntry_t),
|
|
Packit |
fcad23 |
req_type, &AT_Cmp, &NextAddr) != 0)
|
|
Packit |
fcad23 |
break;
|
|
Packit |
fcad23 |
#ifdef NETSNMP_INCLUDE_IFTABLE_REWRITES
|
|
Packit |
fcad23 |
entry.ipNetToMediaIfIndex.o_bytes[entry.ipNetToMediaIfIndex.o_length] = '\0';
|
|
Packit |
fcad23 |
current[AT_IFINDEX_OFF] = netsnmp_access_interface_index_find(
|
|
Packit |
fcad23 |
entry.ipNetToMediaIfIndex.o_bytes);
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
current[AT_IFINDEX_OFF] =
|
|
Packit |
fcad23 |
Interface_Index_By_Name(entry.ipNetToMediaIfIndex.o_bytes,
|
|
Packit |
fcad23 |
entry.ipNetToMediaIfIndex.o_length);
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
if (current[6] == 3) { /* AT group oid */
|
|
Packit |
fcad23 |
current[AT_IFINDEX_OFF + 1] = 1;
|
|
Packit |
fcad23 |
offset = AT_IFINDEX_OFF + 2;
|
|
Packit |
fcad23 |
olength = AT_IFINDEX_OFF + 6;
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
offset = AT_IFINDEX_OFF + 1;
|
|
Packit |
fcad23 |
olength = AT_IFINDEX_OFF + 5;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
COPY_IPADDR(cp, (u_char *) & entry.ipNetToMediaNetAddress, op,
|
|
Packit |
fcad23 |
current + offset);
|
|
Packit |
fcad23 |
if (exact) {
|
|
Packit |
fcad23 |
if (snmp_oid_compare(current, olength, name, *length) == 0) {
|
|
Packit |
fcad23 |
memcpy((char *) lowest, (char *) current,
|
|
Packit |
fcad23 |
olength * sizeof(oid));
|
|
Packit |
fcad23 |
Lowentry = entry;
|
|
Packit |
fcad23 |
Found++;
|
|
Packit |
fcad23 |
break; /* no need to search further */
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
if (snmp_oid_compare(current, olength, name, *length) > 0 &&
|
|
Packit |
fcad23 |
(Found == 0 ||
|
|
Packit |
fcad23 |
snmp_oid_compare(current, olength, lowest, olength) < 0)) {
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* if new one is greater than input and closer to input than
|
|
Packit |
fcad23 |
* previous lowest, and is not equal to it, save this one as the "next" one.
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
memcpy((char *) lowest, (char *) current,
|
|
Packit |
fcad23 |
olength * sizeof(oid));
|
|
Packit |
fcad23 |
Lowentry = entry;
|
|
Packit |
fcad23 |
Found++;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
DEBUGMSGTL(("mibII/at", "... Found = %d\n", Found));
|
|
Packit |
fcad23 |
if (Found == 0)
|
|
Packit |
fcad23 |
return (NULL);
|
|
Packit |
fcad23 |
memcpy((char *) name, (char *) lowest, olength * sizeof(oid));
|
|
Packit |
fcad23 |
*length = olength;
|
|
Packit |
fcad23 |
*write_method = 0;
|
|
Packit |
fcad23 |
switch (vp->magic) {
|
|
Packit |
fcad23 |
case IPMEDIAIFINDEX:
|
|
Packit |
fcad23 |
*var_len = sizeof long_return;
|
|
Packit |
fcad23 |
#ifdef NETSNMP_INCLUDE_IFTABLE_REWRITES
|
|
Packit |
fcad23 |
Lowentry.ipNetToMediaIfIndex.o_bytes[
|
|
Packit |
fcad23 |
Lowentry.ipNetToMediaIfIndex.o_length] = '\0';
|
|
Packit |
fcad23 |
long_return = netsnmp_access_interface_index_find(
|
|
Packit |
fcad23 |
Lowentry.ipNetToMediaIfIndex.o_bytes);
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
long_return = Interface_Index_By_Name(
|
|
Packit |
fcad23 |
Lowentry.ipNetToMediaIfIndex.o_bytes,
|
|
Packit |
fcad23 |
Lowentry.ipNetToMediaIfIndex.o_length);
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
return (u_char *) & long_return;
|
|
Packit |
fcad23 |
case IPMEDIAPHYSADDRESS:
|
|
Packit |
fcad23 |
*var_len = Lowentry.ipNetToMediaPhysAddress.o_length;
|
|
Packit |
fcad23 |
return Lowentry.ipNetToMediaPhysAddress.o_bytes;
|
|
Packit |
fcad23 |
case IPMEDIANETADDRESS:
|
|
Packit |
fcad23 |
*var_len = sizeof(addr_ret);
|
|
Packit |
fcad23 |
addr_ret = Lowentry.ipNetToMediaNetAddress;
|
|
Packit |
fcad23 |
return (u_char *) &addr_ret;
|
|
Packit |
fcad23 |
case IPMEDIATYPE:
|
|
Packit |
fcad23 |
*var_len = sizeof long_return;
|
|
Packit |
fcad23 |
long_return = Lowentry.ipNetToMediaType;
|
|
Packit |
fcad23 |
return (u_char *) & long_return;
|
|
Packit |
fcad23 |
default:
|
|
Packit |
fcad23 |
DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_atEntry\n",
|
|
Packit |
fcad23 |
vp->magic));
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
return NULL;
|
|
Packit |
fcad23 |
}
|