/*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
*
* U.S. Government Rights - Commercial software. Government users are subject
* to the Sun Microsystems, Inc. standard license agreement and applicable
* provisions of the FAR and its supplements.
*
*
* This distribution may include materials developed by third parties. Sun,
* Sun Microsystems, the Sun logo and Solaris are trademarks or registered
* trademarks of Sun Microsystems, Inc. in the U.S. and other countries.
*
*/
#pragma ident "@(#)entLPMappingTable.c 1.1 03/02/24 SMI"
/*
* Note: this file originally auto-generated by mib2c using
* : mib2c.iterate.conf,v 5.4 2002/09/11 22:42:04 hardaker Exp $
*/
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "stdhdr.h"
#include "entLPMappingTable.h"
#include "entLogicalTable.h"
#include "entPhysicalTable.h"
#include "entLastChangeTime.h"
typedef struct LPIndex_s {
entLPMappingTableEntry_t *pLPEntry;
int_l *pPhyIndex; /* Pointer to the current phy index */
} LPIndex_t;
static LPIndex_t tracker;
entLPMappingTableEntry_t* gLPMappingTableHead;
int gLPMappingTableSize;
/*
* Initialize the entLPMappingTable table by defining its contents and how
* it's structured
*/
void
initialize_table_entLPMappingTable(void)
{
static oid entLPMappingTable_oid[] = { 1, 3, 6, 1, 2, 1, 47, 1, 3, 1 };
netsnmp_table_registration_info *table_info;
netsnmp_handler_registration *my_handler;
netsnmp_iterator_info *iinfo;
/*
* create the table structure itself
*/
table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
/*
* if your table is read only, it's easiest to change the
* HANDLER_CAN_RWRITE definition below to HANDLER_CAN_RONLY
*/
my_handler =
netsnmp_create_handler_registration("entLPMappingTable",
entLPMappingTable_handler, entLPMappingTable_oid,
OID_LENGTH(entLPMappingTable_oid), HANDLER_CAN_RONLY);
if (!my_handler || !table_info || !iinfo)
return; /* mallocs failed */
/*
* Setting up the table's definition
*/
netsnmp_table_helper_add_indexes(table_info,
ASN_INTEGER, /* index: entLogicalIndex */
ASN_INTEGER, /* index: entLPPhysicalIndex */
0);
table_info->min_column = 1;
table_info->max_column = 1;
/*
* iterator access routines
*/
iinfo->get_first_data_point = entLPMappingTable_get_first_data_point;
iinfo->get_next_data_point = entLPMappingTable_get_next_data_point;
iinfo->table_reginfo = table_info;
/*
* registering the table with the master agent
*/
DEBUGMSGTL(("initialize_table_entLPMappingTable",
"Registering table entLPMappingTable as a table iterator\n"));
netsnmp_register_table_iterator(my_handler, iinfo);
}
/* Initializes the entLPMappingTable module */
void
init_entLPMappingTable(void)
{
/*
* here we initialize all the tables we're planning on supporting
*/
initialize_table_entLPMappingTable();
gLPMappingTableSize = 0;
gLPMappingTableHead = NULL;
}
/*
* returns the first data point within the entLPMappingTable table data.
*
* Set the my_loop_context variable to the first data point structure
* of your choice (from which you can find the next one). This could
* be anything from the first node in a linked list, to an integer
* pointer containing the beginning of an array variable.
*
* Set the my_data_context variable to something to be returned to
* you later that will provide you with the data to return in a given
* row. This could be the same pointer as what my_loop_context is
* set to, or something different.
*
* The put_index_data variable contains a list of snmp variable
* bindings, one for each index in your table. Set the values of
* each appropriately according to the data matching the first row
* and return the put_index_data variable at the end of the function.
*/
netsnmp_variable_list *
entLPMappingTable_get_first_data_point(void **my_loop_context,
void **my_data_context, netsnmp_variable_list * put_index_data,
netsnmp_iterator_info * mydata)
{
netsnmp_variable_list *vptr;
entLPMappingTableEntry_t *zRunner, *zpValidEntry;
int_l *zPhyIndexes, zValidPhyIdx=0, *zpValidPhyIdx;
zRunner = gLPMappingTableHead;
while (zRunner) {
if (zRunner->entLogicalIndex > 0) {
zPhyIndexes = zRunner->physicalIndexes;
while ((zPhyIndexes != NULL) && (*zPhyIndexes != 0)){
if (*zPhyIndexes > 0) {
zValidPhyIdx = *zPhyIndexes;
break;
}
zPhyIndexes++;
}
if (zValidPhyIdx) {
zpValidEntry = zRunner;
zpValidPhyIdx = zPhyIndexes;
break;
}
}
zRunner = zRunner->pNextLPMappingTableEntry;
}
if (zRunner == NULL) return NULL;
*my_loop_context = (void *) zpValidEntry;
*my_data_context = (void *) zpValidPhyIdx;
tracker.pPhyIndex = zpValidPhyIdx;
vptr = put_index_data;
snmp_set_var_value(vptr, (u_char *) &zpValidEntry->entLogicalIndex,
sizeof(zpValidEntry->entLogicalIndex));
vptr = vptr->next_variable;
snmp_set_var_value(vptr, (u_char *) zpValidPhyIdx, sizeof(int_l));
vptr = vptr->next_variable;
return (put_index_data);
}
/*
* functionally the same as entLPMappingTable_get_first_data_point, but
* my_loop_context has already been set to a previous value and should
* be updated to the next in the list. For example, if it was a
* linked list, you might want to cast it and the return
* my_loop_context->next. The my_data_context pointer should be set
* to something you need later and the indexes in put_index_data
* updated again.
*/
netsnmp_variable_list *
entLPMappingTable_get_next_data_point(void **my_loop_context,
void **my_data_context, netsnmp_variable_list * put_index_data,
netsnmp_iterator_info * mydata)
{
netsnmp_variable_list *vptr;
entLPMappingTableEntry_t *zRunner, *zpValidEntry;
int_l *zPhyIndexes, zValidPhyIdx=0, *zpValidPhyIdx;
zRunner = (entLPMappingTableEntry_t *)*my_loop_context;
zPhyIndexes = tracker.pPhyIndex;
if (zPhyIndexes != NULL)
zPhyIndexes++;
while (zRunner) {
if (zRunner->entLogicalIndex > 0) {
while ((zPhyIndexes != NULL) && (*zPhyIndexes != 0)){
if (*zPhyIndexes > 0) {
zValidPhyIdx = *zPhyIndexes;
break;
}
zPhyIndexes++;
}
if (zValidPhyIdx) {
zpValidEntry = zRunner;
zpValidPhyIdx = zPhyIndexes;
break;
}
}
zRunner = zRunner->pNextLPMappingTableEntry;
if (zRunner)
zPhyIndexes = zRunner->physicalIndexes;
}
if (zRunner == NULL) return NULL;
*my_loop_context = (void *) zpValidEntry;
*my_data_context = (void *) zpValidPhyIdx;
tracker.pPhyIndex = zpValidPhyIdx;
vptr = put_index_data;
snmp_set_var_value(vptr, (u_char *) &zpValidEntry->entLogicalIndex,
sizeof(int_l));
vptr = vptr->next_variable;
snmp_set_var_value(vptr, (u_char *) zpValidPhyIdx, sizeof(int_l));
vptr = vptr->next_variable;
return (put_index_data);
}
/*
* handles requests for the entLPMappingTable table, if anything else
* needs to be done
*/
int
entLPMappingTable_handler(netsnmp_mib_handler * handler,
netsnmp_handler_registration * reginfo,
netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)
{
netsnmp_request_info *request;
netsnmp_table_request_info *table_info;
netsnmp_variable_list *var;
int_l *idx;
for (request = requests; request; request = request->next) {
var = request->requestvb;
if (request->processed != 0)
continue;
/*
* perform anything here that you need to do. The request have
* already been processed by the master table_dataset handler,
* but this gives you chance to act on the request in some
* other way if need be.
*/
/*
* the following extracts the my_data_context pointer set in
* the loop functions above. You can then use the results to
* help return data for the columns of the entLPMappingTable
* table in question
*/
/*
* XXX
*/
idx = (int_l *) netsnmp_extract_iterator_context(request);
if (idx == NULL) {
if (reqinfo->mode == MODE_GET) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
/*
* XXX: no row existed, if you support creation and
* this is a set, start dealing with it here, else
* continue
*/
}
/*
* extracts the information about the table from the request
*/
table_info = netsnmp_extract_table_info(request);
/*
* table_info->colnum contains the column number requested
*/
/*
* table_info->indexes contains a linked list of snmp variable
* bindings for the indexes of the table. Values in the list
* have been set corresponding to the indexes of the
* request
*/
if (table_info == NULL) {
continue;
}
switch (reqinfo->mode) {
/*
* the table_iterator helper should change all GETNEXTs
* into GETs for you automatically, so you don't have to
* worry about the GETNEXT case. Only GETs and SETs need
* to be dealt with here
*/
case MODE_GET:
switch (table_info->colnum) {
case COLUMN_ENTLPPHYSICALINDEX:
snmp_set_var_typed_value(var, ASN_INTEGER,
(u_char *) idx,
sizeof (idx));
break;
default:
/*
* We shouldn't get here
*/
snmp_log(LOG_ERR, "problem encountered in entLPMappingTable_handler: unknown column\n");
}
break;
case MODE_SET_RESERVE1:
/*
* set handling...
*/
default:
snmp_log(LOG_ERR, "problem encountered in entLPMappingTable_handler: unsupported mode\n");
}
}
return (SNMP_ERR_NOERROR);
}
/* Return 0 for success
1 for entry already exists
-1 for failure
-2 for stale index */
int
addLPMappingTableEntry(int xentLogicalIndex, int xentPhysicalIndex)
{
entLogicalEntry_t *zLogicalEntry;
entPhysicalEntry_t *physentry;
entLPMappingTableEntry_t *zLPMappingTableEntry, *zRunner, *zlastEntry;
int_l *zPhyIndexes;
/* Fix for 4888088: return -1 for out of bound index, return -2 for */
/* stale entry */
if (xentLogicalIndex <= 0 || xentLogicalIndex > MAX_ENTITY_INDEX || xentPhysicalIndex <= 0 || xentPhysicalIndex > MAX_ENTITY_INDEX)
return -1;
zLogicalEntry = getLogicalTableStaleEntry(xentLogicalIndex);
physentry = getPhysicalTableStaleEntry(xentPhysicalIndex);
if ((zLogicalEntry != NULL) || (physentry != NULL)) {
return -2;
}
/* End of Fix for 4888088 */
zLogicalEntry = getLogicalTableEntry(xentLogicalIndex);
physentry = getPhysicalTableEntry(xentPhysicalIndex);
if ((zLogicalEntry == NULL) || (physentry == NULL)) {
/*
Handle error here. Send it to log files
*/
return (-1);
}
zlastEntry = NULL;
zRunner = gLPMappingTableHead;
while (zRunner != NULL) {
if (zRunner->entLogicalIndex == xentLogicalIndex) {
break;
}
zlastEntry = zRunner;
zRunner = zRunner->pNextLPMappingTableEntry;
}
if (zRunner != NULL ) {/* Found a entry with log index */
int_l *p;
p = zRunner->physicalIndexes;
if (p == NULL) {
zPhyIndexes = (int_l *) malloc(2 * sizeof (int_l));
if (!zPhyIndexes) return -1;
zPhyIndexes[0] = xentPhysicalIndex;
zPhyIndexes[1] = 0;
zRunner->physicalIndexes = zPhyIndexes;
} else {/* Add phy index to last entry in the array */
int i=0;
while (p != NULL && *p != 0) {
/* Fix for 4888088: entry already exists, return 1 */
if (*p == xentPhysicalIndex)
return (1);
/* End of Fix for 4888088 */
if (*p == -xentPhysicalIndex) { /* Reuse a 'deleted' entry */
*p = xentPhysicalIndex;
/* Fix for 4928821 - does not generate notification event */
configChanged();
/* End of Fix for 4928821 */
return (0);
}
p++;
i++;
}
zRunner->physicalIndexes =
(int_l *)realloc(zRunner->physicalIndexes, (i + 2)*sizeof(int_l));
zRunner->physicalIndexes[i] = xentPhysicalIndex;
zRunner->physicalIndexes[i+1] = 0;
}
configChanged();
return (0);
}
/* New entry*/
zLPMappingTableEntry = (entLPMappingTableEntry_t *)malloc(sizeof(entLPMappingTableEntry_t));
if (!zLPMappingTableEntry) return -1; /* malloc failed */
zLPMappingTableEntry->entLogicalIndex = xentLogicalIndex;
zPhyIndexes = (int_l *) malloc(2 * sizeof (int_l));
if (!zPhyIndexes) return -1;
zPhyIndexes[0] = xentPhysicalIndex;
zPhyIndexes[1] = 0;
zLPMappingTableEntry->physicalIndexes = zPhyIndexes;
zLPMappingTableEntry->pNextLPMappingTableEntry = NULL;
if (gLPMappingTableHead){
zlastEntry->pNextLPMappingTableEntry = zLPMappingTableEntry;
} else {
gLPMappingTableHead = zLPMappingTableEntry;
}
gLPMappingTableSize++;
configChanged();
return (0);
}
/*
This function deletes the table entries for a given logical index
and physical index.
Returns 0 for success,
-1 for failure,
-2 for stale entry
*/
int
deleteLPMappingTableEntry(int xentLogicalIndex, int xentPhysicalIndex)
{
entLPMappingTableEntry_t *zRunner;
int_l *p;
/* Fix for 4888088: return -1 for invalid index, -2 for stale entry */
entLogicalEntry_t *zLogicalEntry;
entPhysicalEntry_t *zPhysicalEntry;
if (xentLogicalIndex <= 0 || xentLogicalIndex > MAX_ENTITY_INDEX || xentPhysicalIndex <= 0 || xentPhysicalIndex > MAX_ENTITY_INDEX)
return -1;
zLogicalEntry = getLogicalTableStaleEntry(xentLogicalIndex);
if (zLogicalEntry != NULL)
return -2;
zPhysicalEntry = getPhysicalTableStaleEntry(xentPhysicalIndex);
if (zPhysicalEntry != NULL)
return -2;
zLogicalEntry = getLogicalTableEntry(xentLogicalIndex);
if (zLogicalEntry == NULL)
return -1;
zPhysicalEntry = getPhysicalTableEntry(xentPhysicalIndex);
if (zPhysicalEntry == NULL)
return -1;
/* End of Fix for 4888088 */
zRunner = gLPMappingTableHead;
while (zRunner != NULL) {
if ((zRunner->entLogicalIndex == xentLogicalIndex)) {
p = zRunner->physicalIndexes;
while (p != NULL && *p != 0) {
if (*p == xentPhysicalIndex) {
*p = -xentPhysicalIndex;
configChanged();
return (0);
}
p++;
}
return (-1);
}
zRunner = zRunner->pNextLPMappingTableEntry;
}
return (-1);
}
static int
FreeLPMappingTableEntry(entLPMappingTableEntry_t *xEntry)
{
int nFound = 0;
/* Fix for 4888088 */
int_l *zPhyIndexes;
/* End of Fix for 4888088 */
if (xEntry == NULL) return (-1);
/* Fix for 4888088: We need to count the number of entries deleted, and */
/* return that accordingly. Hence the loop */
zPhyIndexes = xEntry->physicalIndexes;
while ((zPhyIndexes != NULL) && (*zPhyIndexes != 0)) {
if (*zPhyIndexes > 0) {
/* Only count valid entries (i.e. non-negative ones) */
nFound++;
}
zPhyIndexes++;
}
/* End of Fix for 4888088 */
free(xEntry->physicalIndexes);
free(xEntry);
xEntry = NULL;
/* Fix for 4888088 */
return (nFound);
/* End of Fix for 4888088 */
}
/* Returns num of successful deletion
-1 for entry not found
-2 for stale physical entry
*/
int
deleteLPMappingPhysicalIndex(int xentPhysicalIndex) {
entLPMappingTableEntry_t *zRunner;
int_l *p;
int num=0;
/* Fix for 4888088: -2 for stale entry, -1 for invalid index */
entPhysicalEntry_t *zPhysicalEntry;
if (xentPhysicalIndex <= 0 || xentPhysicalIndex > MAX_ENTITY_INDEX)
return -1;
zPhysicalEntry = getPhysicalTableStaleEntry(xentPhysicalIndex);
if (zPhysicalEntry != NULL)
return -2;
zPhysicalEntry = getPhysicalTableEntry(xentPhysicalIndex);
if (zPhysicalEntry == NULL)
return -1;
/* End of Fix for 4888088 */
zRunner = gLPMappingTableHead;
while (zRunner != NULL) {
p = zRunner->physicalIndexes;
while (p != NULL && *p != 0) {
if (*p == xentPhysicalIndex) {
*p = -xentPhysicalIndex;
num++;
break;
}
p++;
}
zRunner = zRunner->pNextLPMappingTableEntry;
}
if (num) {
configChanged();
return (num);
} else {
return -1;
}
}
/* Returns num of successful deletion
-1 for entry not found
-2 for stale logical entry
*/
int
deleteLPMappingLogicalIndex(int xentLogicalIndex) {
entLPMappingTableEntry_t *zRunner, *temp, *prevEntry;
int zLogicalIndex, nEntries=0;
/* Fix for 4888088: -1 for invalid index, -2 for stale entry */
entLogicalEntry_t *zLogicalEntry;
if (xentLogicalIndex <= 0 || xentLogicalIndex > MAX_ENTITY_INDEX)
return -1;
zLogicalEntry = getLogicalTableStaleEntry(xentLogicalIndex);
if (zLogicalEntry != NULL)
return -2;
zLogicalEntry = getLogicalTableEntry(xentLogicalIndex);
if (zLogicalEntry == NULL)
return -1;
/* End of Fix for 4888088 */
zRunner = gLPMappingTableHead;
prevEntry = NULL;
while (zRunner != NULL) {
zLogicalIndex = zRunner->entLogicalIndex;
if (zLogicalIndex > 0) {
if (zLogicalIndex == xentLogicalIndex) {
temp = zRunner->pNextLPMappingTableEntry;
zRunner->pNextLPMappingTableEntry = NULL;
if (prevEntry)
prevEntry->pNextLPMappingTableEntry = temp;
else
gLPMappingTableHead = temp;
/* Fix for 4888088: we are going to return the number of */
/* entries removed */
nEntries = FreeLPMappingTableEntry(zRunner);
/* End of Fix for 4888088 */
gLPMappingTableSize--;
configChanged();
/* Fix for 4888088 */
return (nEntries); /* Successful deletion */
/* End of Fix for 4888088 */
}
}
prevEntry = zRunner;
zRunner = zRunner->pNextLPMappingTableEntry;
}
return (-1); /* Entry not found */
}