|
Packit Service |
9ccfef |
/*
|
|
Packit Service |
9ccfef |
* dump-metrics.c --
|
|
Packit Service |
9ccfef |
*
|
|
Packit Service |
9ccfef |
* Operations to compute and dump some MIB metrics.
|
|
Packit Service |
9ccfef |
*
|
|
Packit Service |
9ccfef |
* Copyright (c) 2000 Frank Strauss, Technical University of Braunschweig.
|
|
Packit Service |
9ccfef |
* Copyright (c) 2000 J. Schoenwaelder, Technical University of Braunschweig.
|
|
Packit Service |
9ccfef |
* Copyright (c) 2002 J. Schoenwaelder, University of Osnabrueck.
|
|
Packit Service |
9ccfef |
* Copyright (c) 2004 J. Schoenwaelder, International University Bremen.
|
|
Packit Service |
9ccfef |
*
|
|
Packit Service |
9ccfef |
* See the file "COPYING" for information on usage and redistribution
|
|
Packit Service |
9ccfef |
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
Packit Service |
9ccfef |
*
|
|
Packit Service |
9ccfef |
* @(#) $Id: dump-metrics.c 8090 2008-04-18 12:56:29Z strauss $
|
|
Packit Service |
9ccfef |
*/
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/*
|
|
Packit Service |
9ccfef |
# revisions
|
|
Packit Service |
9ccfef |
# imports
|
|
Packit Service |
9ccfef |
# row creations:
|
|
Packit Service |
9ccfef |
# count node references in notification definitions
|
|
Packit Service |
9ccfef |
*/
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
#include <config.h>
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
#include <stdio.h>
|
|
Packit Service |
9ccfef |
#include <string.h>
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
#include "smi.h"
|
|
Packit Service |
9ccfef |
#include "smidump.h"
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static int raw = 0;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static int silent = 0;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef struct BasetypeCounter {
|
|
Packit Service |
9ccfef |
unsigned long total;
|
|
Packit Service |
9ccfef |
unsigned long unknown;
|
|
Packit Service |
9ccfef |
unsigned long integer32;
|
|
Packit Service |
9ccfef |
unsigned long octetstring;
|
|
Packit Service |
9ccfef |
unsigned long objectidentifier;
|
|
Packit Service |
9ccfef |
unsigned long unsigned32;
|
|
Packit Service |
9ccfef |
unsigned long integer64;
|
|
Packit Service |
9ccfef |
unsigned long unsigned64;
|
|
Packit Service |
9ccfef |
unsigned long float32;
|
|
Packit Service |
9ccfef |
unsigned long float64;
|
|
Packit Service |
9ccfef |
unsigned long float128;
|
|
Packit Service |
9ccfef |
unsigned long enums;
|
|
Packit Service |
9ccfef |
unsigned long bits;
|
|
Packit Service |
9ccfef |
unsigned long pointer;
|
|
Packit Service |
9ccfef |
} BasetypeCounter;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef struct StatusCounter {
|
|
Packit Service |
9ccfef |
unsigned long total;
|
|
Packit Service |
9ccfef |
unsigned long current;
|
|
Packit Service |
9ccfef |
unsigned long deprecated;
|
|
Packit Service |
9ccfef |
unsigned long obsolete;
|
|
Packit Service |
9ccfef |
} StatusCounter;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef struct AccessCounter {
|
|
Packit Service |
9ccfef |
unsigned long total;
|
|
Packit Service |
9ccfef |
unsigned long noaccess;
|
|
Packit Service |
9ccfef |
unsigned long notify;
|
|
Packit Service |
9ccfef |
unsigned long readonly;
|
|
Packit Service |
9ccfef |
unsigned long readwrite;
|
|
Packit Service |
9ccfef |
} AccessCounter;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef struct IndexCounter {
|
|
Packit Service |
9ccfef |
unsigned long total;
|
|
Packit Service |
9ccfef |
unsigned long index;
|
|
Packit Service |
9ccfef |
unsigned long augment;
|
|
Packit Service |
9ccfef |
unsigned long reorder;
|
|
Packit Service |
9ccfef |
unsigned long sparse;
|
|
Packit Service |
9ccfef |
unsigned long expand;
|
|
Packit Service |
9ccfef |
} IndexCounter;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef struct IndexLenCounter {
|
|
Packit Service |
9ccfef |
unsigned long total;
|
|
Packit Service |
9ccfef |
unsigned long length[11];
|
|
Packit Service |
9ccfef |
} IndexLenCounter;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef struct TableLenCounter {
|
|
Packit Service |
9ccfef |
unsigned long total;
|
|
Packit Service |
9ccfef |
unsigned long length[81];
|
|
Packit Service |
9ccfef |
} TableLenCounter;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef struct ScalarLenCounter {
|
|
Packit Service |
9ccfef |
unsigned long total;
|
|
Packit Service |
9ccfef |
unsigned long length[81];
|
|
Packit Service |
9ccfef |
} ScalarLenCounter;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef struct IndexComplexityCounter {
|
|
Packit Service |
9ccfef |
unsigned long total;
|
|
Packit Service |
9ccfef |
unsigned long complexity[100];
|
|
Packit Service |
9ccfef |
} IndexComplexityCounter;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef struct LengthCounter {
|
|
Packit Service |
9ccfef |
unsigned long total;
|
|
Packit Service |
9ccfef |
unsigned long descr;
|
|
Packit Service |
9ccfef |
unsigned long descr_len;
|
|
Packit Service |
9ccfef |
unsigned long reference;
|
|
Packit Service |
9ccfef |
unsigned long reference_len;
|
|
Packit Service |
9ccfef |
unsigned long units;
|
|
Packit Service |
9ccfef |
unsigned long units_len;
|
|
Packit Service |
9ccfef |
unsigned long format;
|
|
Packit Service |
9ccfef |
unsigned long format_len;
|
|
Packit Service |
9ccfef |
} LengthCounter;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef struct RowStatusCounter {
|
|
Packit Service |
9ccfef |
unsigned long basetables;
|
|
Packit Service |
9ccfef |
unsigned long rowstatus;
|
|
Packit Service |
9ccfef |
unsigned long storagetype;
|
|
Packit Service |
9ccfef |
} RowStatusCounter;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef struct Metrics {
|
|
Packit Service |
9ccfef |
BasetypeCounter basetypesColumns;
|
|
Packit Service |
9ccfef |
BasetypeCounter basetypesScalars;
|
|
Packit Service |
9ccfef |
BasetypeCounter basetypesAll;
|
|
Packit Service |
9ccfef |
StatusCounter statusTypes;
|
|
Packit Service |
9ccfef |
StatusCounter statusTables;
|
|
Packit Service |
9ccfef |
StatusCounter statusColumns;
|
|
Packit Service |
9ccfef |
StatusCounter statusScalars;
|
|
Packit Service |
9ccfef |
StatusCounter statusNotifications;
|
|
Packit Service |
9ccfef |
StatusCounter statusGroups;
|
|
Packit Service |
9ccfef |
StatusCounter statusCompliances;
|
|
Packit Service |
9ccfef |
StatusCounter statusAll;
|
|
Packit Service |
9ccfef |
AccessCounter accessColumns;
|
|
Packit Service |
9ccfef |
AccessCounter accessScalars;
|
|
Packit Service |
9ccfef |
AccessCounter accessAll;
|
|
Packit Service |
9ccfef |
IndexCounter indexTables;
|
|
Packit Service |
9ccfef |
IndexLenCounter indexLenTables;
|
|
Packit Service |
9ccfef |
IndexComplexityCounter indexComplexity;
|
|
Packit Service |
9ccfef |
TableLenCounter tableLength;
|
|
Packit Service |
9ccfef |
ScalarLenCounter scalarLength;
|
|
Packit Service |
9ccfef |
LengthCounter lengthTypes;
|
|
Packit Service |
9ccfef |
LengthCounter lengthTables;
|
|
Packit Service |
9ccfef |
LengthCounter lengthRows;
|
|
Packit Service |
9ccfef |
LengthCounter lengthColumns;
|
|
Packit Service |
9ccfef |
LengthCounter lengthScalars;
|
|
Packit Service |
9ccfef |
LengthCounter lengthNotifications;
|
|
Packit Service |
9ccfef |
LengthCounter lengthAll;
|
|
Packit Service |
9ccfef |
} Metrics;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef struct UsageCounter {
|
|
Packit Service |
9ccfef |
char *module;
|
|
Packit Service |
9ccfef |
char *name;
|
|
Packit Service |
9ccfef |
unsigned count;
|
|
Packit Service |
9ccfef |
struct UsageCounter *nextPtr;
|
|
Packit Service |
9ccfef |
} UsageCounter;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static UsageCounter *typeList = NULL;
|
|
Packit Service |
9ccfef |
static UsageCounter *extTypeList = NULL;
|
|
Packit Service |
9ccfef |
static UsageCounter *extNodeList = NULL;
|
|
Packit Service |
9ccfef |
static UsageCounter *extModuleList = NULL;
|
|
Packit Service |
9ccfef |
static UsageCounter *indexComplexityList = NULL;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
#define INCR_NODE 0x01
|
|
Packit Service |
9ccfef |
#define INCR_TYPE 0x02
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static char*
|
|
Packit Service |
9ccfef |
getDateString(time_t t)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
static char *s = NULL;
|
|
Packit Service |
9ccfef |
struct tm *tm;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (s) xfree(s);
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
tm = gmtime(&t);
|
|
Packit Service |
9ccfef |
smiAsprintf(&s, "%04d-%02d-%02d",
|
|
Packit Service |
9ccfef |
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
|
|
Packit Service |
9ccfef |
return s;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static char*
|
|
Packit Service |
9ccfef |
language(SmiLanguage language)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
return
|
|
Packit Service |
9ccfef |
(language == SMI_LANGUAGE_UNKNOWN) ? "-" :
|
|
Packit Service |
9ccfef |
(language == SMI_LANGUAGE_SMIV1) ? "SMIv1" :
|
|
Packit Service |
9ccfef |
(language == SMI_LANGUAGE_SMIV2) ? "SMIv2" :
|
|
Packit Service |
9ccfef |
(language == SMI_LANGUAGE_SMING) ? "SMIng" :
|
|
Packit Service |
9ccfef |
"-";
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static int
|
|
Packit Service |
9ccfef |
calcSize(SmiModule *smiModule)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
SmiNode *smiNode;
|
|
Packit Service |
9ccfef |
SmiType *smiType;
|
|
Packit Service |
9ccfef |
int size = 0;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (smiType = smiGetFirstType(smiModule);
|
|
Packit Service |
9ccfef |
smiType;
|
|
Packit Service |
9ccfef |
smiType = smiGetNextType(smiType)) {
|
|
Packit Service |
9ccfef |
if (smiType->name) {
|
|
Packit Service |
9ccfef |
size++;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
|
|
Packit Service |
9ccfef |
smiNode;
|
|
Packit Service |
9ccfef |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
switch (smiNode->nodekind) {
|
|
Packit Service |
9ccfef |
case SMI_NODEKIND_SCALAR:
|
|
Packit Service |
9ccfef |
case SMI_NODEKIND_COLUMN:
|
|
Packit Service |
9ccfef |
case SMI_NODEKIND_NOTIFICATION:
|
|
Packit Service |
9ccfef |
size++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
default:
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
return size;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
typedef void (*ForEachIndexFunc) (FILE *f, SmiNode *groupNode, SmiNode *smiNode, void *data);
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
foreachIndexDo(FILE *f, SmiNode *smiNode, ForEachIndexFunc func, void *data)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
SmiNode *indexNode = NULL, *iNode;
|
|
Packit Service |
9ccfef |
SmiElement *smiElement;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
switch (smiNode->indexkind) {
|
|
Packit Service |
9ccfef |
case SMI_INDEX_INDEX:
|
|
Packit Service |
9ccfef |
case SMI_INDEX_REORDER:
|
|
Packit Service |
9ccfef |
indexNode = smiNode;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_INDEX_EXPAND: /* TODO: we have to do more work here! */
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_INDEX_AUGMENT:
|
|
Packit Service |
9ccfef |
case SMI_INDEX_SPARSE:
|
|
Packit Service |
9ccfef |
indexNode = smiGetRelatedNode(smiNode);
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_INDEX_UNKNOWN:
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
if (indexNode) {
|
|
Packit Service |
9ccfef |
for (smiElement = smiGetFirstElement(indexNode);
|
|
Packit Service |
9ccfef |
smiElement; smiElement = smiGetNextElement(smiElement)) {
|
|
Packit Service |
9ccfef |
iNode = smiGetElementNode(smiElement);
|
|
Packit Service |
9ccfef |
if (iNode) {
|
|
Packit Service |
9ccfef |
(func) (f, smiNode, iNode, data);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static UsageCounter*
|
|
Packit Service |
9ccfef |
incrUsageCounter(UsageCounter *uCntList, char *module, char *name, int incr)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
UsageCounter *uCnt;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (uCnt = uCntList; uCnt; uCnt = uCnt->nextPtr) {
|
|
Packit Service |
9ccfef |
if (strcmp(uCnt->module, module) == 0
|
|
Packit Service |
9ccfef |
&& (! name || strcmp(uCnt->name, name) == 0)) {
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (! uCnt) {
|
|
Packit Service |
9ccfef |
uCnt = (UsageCounter *) xmalloc(sizeof(UsageCounter));
|
|
Packit Service |
9ccfef |
uCnt->module = xstrdup(module);
|
|
Packit Service |
9ccfef |
uCnt->name = name ? xstrdup(name) : NULL;
|
|
Packit Service |
9ccfef |
uCnt->count = 0;
|
|
Packit Service |
9ccfef |
uCnt->nextPtr = uCntList;
|
|
Packit Service |
9ccfef |
uCntList = uCnt;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
uCnt->count += incr;
|
|
Packit Service |
9ccfef |
return uCntList;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
incrTypeAndNodeUsageCounter(SmiModule *smiModule, SmiNode *smiNode, int flags)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
SmiType *smiType;
|
|
Packit Service |
9ccfef |
char *extModule;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/*
|
|
Packit Service |
9ccfef |
* First check whether the node is external. If yes, increment the
|
|
Packit Service |
9ccfef |
* external node counter and we are done.
|
|
Packit Service |
9ccfef |
*/
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
extModule = smiGetNodeModule(smiNode)->name;
|
|
Packit Service |
9ccfef |
if (extModule
|
|
Packit Service |
9ccfef |
&& strcmp(extModule, smiModule->name) != 0) {
|
|
Packit Service |
9ccfef |
if (flags & INCR_NODE) {
|
|
Packit Service |
9ccfef |
extNodeList = incrUsageCounter(extNodeList,
|
|
Packit Service |
9ccfef |
extModule, smiNode->name, 1);
|
|
Packit Service |
9ccfef |
extModuleList = incrUsageCounter(extModuleList, extModule, NULL, 1);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/*
|
|
Packit Service |
9ccfef |
* Next, check whether the type of the node is external. If yes,
|
|
Packit Service |
9ccfef |
* increment the external type counter and we are done. Do not
|
|
Packit Service |
9ccfef |
* count base types (that is types that have no parent type).
|
|
Packit Service |
9ccfef |
*/
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
smiType = smiGetNodeType(smiNode);
|
|
Packit Service |
9ccfef |
if (! smiType) {
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (smiType->name && smiGetParentType(smiType)) {
|
|
Packit Service |
9ccfef |
char *extModule = smiGetTypeModule(smiType)->name;
|
|
Packit Service |
9ccfef |
if (extModule /* && *extModule */
|
|
Packit Service |
9ccfef |
&& strcmp(extModule, smiModule->name) != 0) {
|
|
Packit Service |
9ccfef |
if (flags & INCR_TYPE) {
|
|
Packit Service |
9ccfef |
extTypeList = incrUsageCounter(extTypeList,
|
|
Packit Service |
9ccfef |
extModule, smiType->name, 1);
|
|
Packit Service |
9ccfef |
extModuleList = incrUsageCounter(extModuleList, extModule, NULL, 1);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/*
|
|
Packit Service |
9ccfef |
* Finally, count the type name (whether external or not does not
|
|
Packit Service |
9ccfef |
* matter here nor does it matter whether it is a base type or
|
|
Packit Service |
9ccfef |
* not).
|
|
Packit Service |
9ccfef |
*/
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (! smiType->name && smiGetParentType(smiType)) {
|
|
Packit Service |
9ccfef |
smiType = smiGetParentType(smiType);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
typeList = incrUsageCounter(typeList, smiGetTypeModule(smiType)->name,
|
|
Packit Service |
9ccfef |
smiType->name, 1);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
incrIndexComplexityCounter(SmiModule *smiModule, SmiNode *smiNode, int complexity)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
indexComplexityList = incrUsageCounter(indexComplexityList,
|
|
Packit Service |
9ccfef |
smiModule->name, smiNode->name, complexity);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static int
|
|
Packit Service |
9ccfef |
cmp(const void *va, const void *vb)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
UsageCounter **a = (UsageCounter **) va;
|
|
Packit Service |
9ccfef |
UsageCounter **b = (UsageCounter **) vb;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if ((*a)->count > (*b)->count) return -1;
|
|
Packit Service |
9ccfef |
if ((*a)->count < (*b)->count) return 1;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if ((*a)->module && (*b)->module) {
|
|
Packit Service |
9ccfef |
int x = strcmp((*a)->module, (*b)->module);
|
|
Packit Service |
9ccfef |
if (x) return x;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if ((*a)->name && (*b)->name) {
|
|
Packit Service |
9ccfef |
int x = strcmp((*a)->name, (*b)->name);
|
|
Packit Service |
9ccfef |
if (x) return x;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
return 0;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static int
|
|
Packit Service |
9ccfef |
fprintRevisions(FILE *f, int modLen, SmiRevision *smiRevision,
|
|
Packit Service |
9ccfef |
SmiModule *smiModule, int size)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
int n = 0;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (smiRevision) {
|
|
Packit Service |
9ccfef |
n = fprintRevisions(f, modLen,
|
|
Packit Service |
9ccfef |
smiGetNextRevision(smiRevision), smiModule, -1);
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s %7s ", modLen, smiModule->name,
|
|
Packit Service |
9ccfef |
(size >= 0) ? language(smiModule->language) : "-");
|
|
Packit Service |
9ccfef |
if (size >= 0) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%4d", size);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(f, " -");
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, " %3d %s\n", n, getDateString(smiRevision->date));
|
|
Packit Service |
9ccfef |
n++;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (!smiRevision && size >= 0) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s %7s ", modLen, smiModule->name,
|
|
Packit Service |
9ccfef |
language(smiModule->language));
|
|
Packit Service |
9ccfef |
fprintf(f, "%4d", size);
|
|
Packit Service |
9ccfef |
fprintf(f, " - ----------\n");
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
return n;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintRevision(FILE *f, int modc, SmiModule **modv)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
int i;
|
|
Packit Service |
9ccfef |
int modLen = 8;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (i = 0; i < modc; i++) {
|
|
Packit Service |
9ccfef |
if (modLen < strlen(modv[i]->name)) {
|
|
Packit Service |
9ccfef |
modLen = strlen(modv[i]->name);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s LANGUAGE SIZE REVISION DATE\n", modLen, "MODULE");
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (i = 0; i < modc; i++) {
|
|
Packit Service |
9ccfef |
fprintRevisions(f, modLen, smiGetFirstRevision(modv[i]),
|
|
Packit Service |
9ccfef |
modv[i], calcSize(modv[i]));
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintTypeUsage(FILE *f, UsageCounter *typeUsageList)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
UsageCounter *uCnt;
|
|
Packit Service |
9ccfef |
int modLen = 8, nameLen = 8;
|
|
Packit Service |
9ccfef |
unsigned total = 0;
|
|
Packit Service |
9ccfef |
int i, cnt = 0;
|
|
Packit Service |
9ccfef |
UsageCounter **sortCnt;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/* should be sorted */
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (uCnt = typeUsageList, cnt = 0; uCnt; uCnt = uCnt->nextPtr, cnt++) {
|
|
Packit Service |
9ccfef |
if (modLen < strlen(uCnt->module)) {
|
|
Packit Service |
9ccfef |
modLen = strlen(uCnt->module);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
if (nameLen < strlen(uCnt->name)) {
|
|
Packit Service |
9ccfef |
nameLen = strlen(uCnt->name);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
total += uCnt->count;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (cnt == 0) {
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/* create an array for a quick qsort */
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
sortCnt = (UsageCounter **) xmalloc(cnt * sizeof(UsageCounter *));
|
|
Packit Service |
9ccfef |
memset(sortCnt, 0, cnt * sizeof(UsageCounter *));
|
|
Packit Service |
9ccfef |
for (uCnt = typeUsageList, i = 0; uCnt; uCnt = uCnt->nextPtr, i++) {
|
|
Packit Service |
9ccfef |
sortCnt[i] = uCnt;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
qsort(sortCnt, cnt, sizeof(UsageCounter *), cmp);
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the distribution of the number of references\n"
|
|
Packit Service |
9ccfef |
"# to defined types (including base types) in the set of loaded MIB\n"
|
|
Packit Service |
9ccfef |
"# modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s %-*s USAGE\n", modLen, "MODULE", nameLen, "TYPE");
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (i = 0; i < cnt; i++) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s %-*s ",
|
|
Packit Service |
9ccfef |
modLen, sortCnt[i]->module, nameLen, sortCnt[i]->name);
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%8u\n", sortCnt[i]->count);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(f, "%6.1f%%\n", (double) sortCnt[i]->count * 100 / total);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
xfree(sortCnt);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintExtTypeUsage(FILE *f, UsageCounter *typeUsageList)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
UsageCounter *uCnt;
|
|
Packit Service |
9ccfef |
int modLen = 8, nameLen = 8;
|
|
Packit Service |
9ccfef |
unsigned total = 0;
|
|
Packit Service |
9ccfef |
int i, cnt = 0;
|
|
Packit Service |
9ccfef |
UsageCounter **sortCnt;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/* should be sorted */
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (uCnt = typeUsageList, cnt = 0; uCnt; uCnt = uCnt->nextPtr, cnt++) {
|
|
Packit Service |
9ccfef |
if (modLen < strlen(uCnt->module)) {
|
|
Packit Service |
9ccfef |
modLen = strlen(uCnt->module);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
if (nameLen < strlen(uCnt->name)) {
|
|
Packit Service |
9ccfef |
nameLen = strlen(uCnt->name);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
total += uCnt->count;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (cnt == 0) {
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/* create an array for a quick qsort */
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
sortCnt = (UsageCounter **) xmalloc(cnt * sizeof(UsageCounter *));
|
|
Packit Service |
9ccfef |
memset(sortCnt, 0, cnt * sizeof(UsageCounter *));
|
|
Packit Service |
9ccfef |
for (uCnt = typeUsageList, i = 0; uCnt; uCnt = uCnt->nextPtr, i++) {
|
|
Packit Service |
9ccfef |
sortCnt[i] = uCnt;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
qsort(sortCnt, cnt, sizeof(UsageCounter *), cmp);
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the distribution of the number of references\n"
|
|
Packit Service |
9ccfef |
"# to externally defined types (excluding base types) in the set of loaded\n"
|
|
Packit Service |
9ccfef |
"# MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s %-*s EXT-USAGE\n", modLen, "MODULE", nameLen, "TYPE");
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (i = 0; i < cnt; i++) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s %-*s ",
|
|
Packit Service |
9ccfef |
modLen, sortCnt[i]->module, nameLen, sortCnt[i]->name);
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%8u\n", sortCnt[i]->count);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(f, "%6.1f%%\n", (double) sortCnt[i]->count * 100 / total);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
xfree(sortCnt);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintExtNodeUsage(FILE *f, UsageCounter *typeUsageList)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
UsageCounter *uCnt;
|
|
Packit Service |
9ccfef |
int modLen = 8, nameLen = 8;
|
|
Packit Service |
9ccfef |
unsigned total = 0;
|
|
Packit Service |
9ccfef |
int i, cnt = 0;
|
|
Packit Service |
9ccfef |
UsageCounter **sortCnt;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/* should be sorted */
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (uCnt = typeUsageList, cnt = 0; uCnt; uCnt = uCnt->nextPtr, cnt++) {
|
|
Packit Service |
9ccfef |
if (modLen < strlen(uCnt->module)) {
|
|
Packit Service |
9ccfef |
modLen = strlen(uCnt->module);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
if (nameLen < strlen(uCnt->name)) {
|
|
Packit Service |
9ccfef |
nameLen = strlen(uCnt->name);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
total += uCnt->count;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (cnt == 0) {
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/* create an array for a quick qsort */
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
sortCnt = (UsageCounter **) xmalloc(cnt * sizeof(UsageCounter *));
|
|
Packit Service |
9ccfef |
memset(sortCnt, 0, cnt * sizeof(UsageCounter *));
|
|
Packit Service |
9ccfef |
for (uCnt = typeUsageList, i = 0; uCnt; uCnt = uCnt->nextPtr, i++) {
|
|
Packit Service |
9ccfef |
sortCnt[i] = uCnt;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
qsort(sortCnt, cnt, sizeof(UsageCounter *), cmp);
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the distribution of the number of references\n"
|
|
Packit Service |
9ccfef |
"# to externally defined nodes in the set of loaded MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s %-*s EXT-USAGE\n", modLen, "MODULE", nameLen, "NODE");
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (i = 0; i < cnt; i++) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s %-*s ",
|
|
Packit Service |
9ccfef |
modLen, sortCnt[i]->module, nameLen, sortCnt[i]->name);
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%8u\n", sortCnt[i]->count);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(f, "%6.1f%%\n", (double) sortCnt[i]->count * 100 / total);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
xfree(sortCnt);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintModuleUsage(FILE *f, UsageCounter *modUsageList)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
UsageCounter *uCnt;
|
|
Packit Service |
9ccfef |
int modLen = 8;
|
|
Packit Service |
9ccfef |
unsigned total = 0;
|
|
Packit Service |
9ccfef |
int i, cnt = 0;
|
|
Packit Service |
9ccfef |
UsageCounter **sortCnt;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/* should be sorted */
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (uCnt = modUsageList, cnt = 0; uCnt; uCnt = uCnt->nextPtr, cnt++) {
|
|
Packit Service |
9ccfef |
if (modLen < strlen(uCnt->module)) {
|
|
Packit Service |
9ccfef |
modLen = strlen(uCnt->module);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
total += uCnt->count;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (cnt == 0) {
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/* create an array for a quick qsort */
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
sortCnt = (UsageCounter **) xmalloc(cnt * sizeof(UsageCounter *));
|
|
Packit Service |
9ccfef |
memset(sortCnt, 0, cnt * sizeof(UsageCounter *));
|
|
Packit Service |
9ccfef |
for (uCnt = modUsageList, i = 0; uCnt; uCnt = uCnt->nextPtr, i++) {
|
|
Packit Service |
9ccfef |
sortCnt[i] = uCnt;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
qsort(sortCnt, cnt, sizeof(UsageCounter *), cmp);
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the distribution of the number of references\n"
|
|
Packit Service |
9ccfef |
"# to externally defined items (such as types or objects) accumulated by\n"
|
|
Packit Service |
9ccfef |
"# the defining MIB module in the set of loaded MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s EXT-USAGE\n", modLen, "MODULE");
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (i = 0; i < cnt; i++) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s ", modLen, sortCnt[i]->module);
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%8u\n", sortCnt[i]->count);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(f, "%6.1f%%\n", (double) sortCnt[i]->count * 100 / total);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
xfree(sortCnt);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintIndexComplexity(FILE *f, UsageCounter *modUsageList)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
UsageCounter *uCnt;
|
|
Packit Service |
9ccfef |
int modLen = 8;
|
|
Packit Service |
9ccfef |
int nameLen = 8;
|
|
Packit Service |
9ccfef |
unsigned total = 0;
|
|
Packit Service |
9ccfef |
int i, cnt = 0;
|
|
Packit Service |
9ccfef |
UsageCounter **sortCnt;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/* should be sorted */
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (uCnt = modUsageList, cnt = 0; uCnt; uCnt = uCnt->nextPtr, cnt++) {
|
|
Packit Service |
9ccfef |
if (modLen < strlen(uCnt->module)) {
|
|
Packit Service |
9ccfef |
modLen = strlen(uCnt->module);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
if (nameLen < strlen(uCnt->name)) {
|
|
Packit Service |
9ccfef |
nameLen = strlen(uCnt->name);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
total += uCnt->count;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (cnt == 0) {
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/* create an array for a quick qsort */
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
sortCnt = (UsageCounter **) xmalloc(cnt * sizeof(UsageCounter *));
|
|
Packit Service |
9ccfef |
memset(sortCnt, 0, cnt * sizeof(UsageCounter *));
|
|
Packit Service |
9ccfef |
for (uCnt = modUsageList, i = 0; uCnt; uCnt = uCnt->nextPtr, i++) {
|
|
Packit Service |
9ccfef |
sortCnt[i] = uCnt;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
qsort(sortCnt, cnt, sizeof(UsageCounter *), cmp);
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the distribution of the index complexity\n"
|
|
Packit Service |
9ccfef |
"# in the set of loaded MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s %-*s COMPLEXITY\n", modLen, "MODULE", nameLen, "TABLE");
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (i = 0; i < cnt; i++) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-*s %-*s ", modLen, sortCnt[i]->module, nameLen, sortCnt[i]->name);
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%8u\n", sortCnt[i]->count);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(f, "%6.1f%%\n", (double) sortCnt[i]->count);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
xfree(sortCnt);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
freeUsageCounter(UsageCounter *usageCounterList)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
UsageCounter *uCnt, *p;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (uCnt = usageCounterList; uCnt; ) {
|
|
Packit Service |
9ccfef |
p = uCnt, uCnt = uCnt->nextPtr;
|
|
Packit Service |
9ccfef |
xfree(p->module);
|
|
Packit Service |
9ccfef |
xfree(p->name);
|
|
Packit Service |
9ccfef |
xfree(p);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
incrBasetypeCounter(BasetypeCounter *basetypeCounter, SmiNode *smiNode)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
SmiType *smiType;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
smiType = smiGetNodeType(smiNode);
|
|
Packit Service |
9ccfef |
if (smiType) {
|
|
Packit Service |
9ccfef |
basetypeCounter->total++;
|
|
Packit Service |
9ccfef |
switch (smiType->basetype) {
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_UNKNOWN:
|
|
Packit Service |
9ccfef |
basetypeCounter->unknown++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_INTEGER32:
|
|
Packit Service |
9ccfef |
basetypeCounter->integer32++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_OCTETSTRING:
|
|
Packit Service |
9ccfef |
basetypeCounter->octetstring++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_OBJECTIDENTIFIER:
|
|
Packit Service |
9ccfef |
basetypeCounter->objectidentifier++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_UNSIGNED32:
|
|
Packit Service |
9ccfef |
basetypeCounter->unsigned32++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_INTEGER64:
|
|
Packit Service |
9ccfef |
basetypeCounter->integer64++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_UNSIGNED64:
|
|
Packit Service |
9ccfef |
basetypeCounter->unsigned64++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_FLOAT32:
|
|
Packit Service |
9ccfef |
basetypeCounter->float32++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_FLOAT64:
|
|
Packit Service |
9ccfef |
basetypeCounter->float64++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_FLOAT128:
|
|
Packit Service |
9ccfef |
basetypeCounter->float128++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_ENUM:
|
|
Packit Service |
9ccfef |
basetypeCounter->enums++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_BITS:
|
|
Packit Service |
9ccfef |
basetypeCounter->bits++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_POINTER:
|
|
Packit Service |
9ccfef |
basetypeCounter->pointer++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
incrStatusCounter(StatusCounter *cnt, SmiStatus smiStatus)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
cnt->total++;
|
|
Packit Service |
9ccfef |
switch (smiStatus) {
|
|
Packit Service |
9ccfef |
case SMI_STATUS_CURRENT:
|
|
Packit Service |
9ccfef |
case SMI_STATUS_MANDATORY:
|
|
Packit Service |
9ccfef |
case SMI_STATUS_OPTIONAL:
|
|
Packit Service |
9ccfef |
cnt->current++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_STATUS_DEPRECATED:
|
|
Packit Service |
9ccfef |
cnt->deprecated++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_STATUS_OBSOLETE:
|
|
Packit Service |
9ccfef |
cnt->obsolete++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_STATUS_UNKNOWN:
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
incrAccessCounter(AccessCounter *cnt, SmiAccess smiAccess)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
cnt->total++;
|
|
Packit Service |
9ccfef |
switch (smiAccess) {
|
|
Packit Service |
9ccfef |
case SMI_ACCESS_NOT_ACCESSIBLE:
|
|
Packit Service |
9ccfef |
cnt->noaccess++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_ACCESS_NOTIFY:
|
|
Packit Service |
9ccfef |
cnt->notify++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_ACCESS_READ_ONLY:
|
|
Packit Service |
9ccfef |
cnt->readonly++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_ACCESS_READ_WRITE:
|
|
Packit Service |
9ccfef |
cnt->readwrite++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_ACCESS_INSTALL:
|
|
Packit Service |
9ccfef |
case SMI_ACCESS_INSTALL_NOTIFY:
|
|
Packit Service |
9ccfef |
case SMI_ACCESS_REPORT_ONLY:
|
|
Packit Service |
9ccfef |
case SMI_ACCESS_UNKNOWN:
|
|
Packit Service |
9ccfef |
case SMI_ACCESS_NOT_IMPLEMENTED:
|
|
Packit Service |
9ccfef |
case SMI_ACCESS_EVENT_ONLY:
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
incrIndexCounter(IndexCounter *cnt, SmiIndexkind indexkind)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
cnt->total++;
|
|
Packit Service |
9ccfef |
switch (indexkind) {
|
|
Packit Service |
9ccfef |
case SMI_INDEX_INDEX:
|
|
Packit Service |
9ccfef |
cnt->index++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_INDEX_AUGMENT:
|
|
Packit Service |
9ccfef |
cnt->augment++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_INDEX_REORDER:
|
|
Packit Service |
9ccfef |
cnt->reorder++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_INDEX_SPARSE:
|
|
Packit Service |
9ccfef |
cnt->sparse++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_INDEX_EXPAND:
|
|
Packit Service |
9ccfef |
cnt->expand++;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_INDEX_UNKNOWN:
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
incrIndexLenCounter(IndexLenCounter *cnt, int len)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
cnt->total++;
|
|
Packit Service |
9ccfef |
if (len < sizeof(cnt->length)/sizeof(cnt->length[0])) {
|
|
Packit Service |
9ccfef |
cnt->length[len]++;
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(stderr, "smidump: index len overflow: %d\n", len);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
incrTableLenCounter(TableLenCounter *cnt, int len)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
cnt->total++;
|
|
Packit Service |
9ccfef |
if (len < sizeof(cnt->length)/sizeof(cnt->length[0])) {
|
|
Packit Service |
9ccfef |
cnt->length[len]++;
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(stderr, "smidump: table len overflow: %d\n", len);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
incrIndexComplexityMetric(IndexComplexityCounter *cnt, int cmplx)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
cnt->total++;
|
|
Packit Service |
9ccfef |
if (cmplx < sizeof(cnt->complexity)/sizeof(cnt->complexity[0])) {
|
|
Packit Service |
9ccfef |
cnt->complexity[cmplx]++;
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(stderr, "smidump: index complexity overflow: %d\n", cmplx);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
incrLengthCounter(LengthCounter *cnt, char *description, char *reference,
|
|
Packit Service |
9ccfef |
char *units, char *format)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
cnt->total++;
|
|
Packit Service |
9ccfef |
if (description) {
|
|
Packit Service |
9ccfef |
cnt->descr++;
|
|
Packit Service |
9ccfef |
cnt->descr_len += strlen(description);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (reference) {
|
|
Packit Service |
9ccfef |
cnt->reference++;
|
|
Packit Service |
9ccfef |
cnt->reference_len += strlen(reference);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
if (units) {
|
|
Packit Service |
9ccfef |
cnt->units++;
|
|
Packit Service |
9ccfef |
cnt->units_len += strlen(units);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
if (format) {
|
|
Packit Service |
9ccfef |
cnt->format++;
|
|
Packit Service |
9ccfef |
cnt->format_len += strlen(format);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
incrRowStatusCounter(SmiNode *rowNode)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
SmiNode *smiNode;
|
|
Packit Service |
9ccfef |
SmiType *smiType;
|
|
Packit Service |
9ccfef |
SmiModule *smiModule;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (smiNode = smiGetFirstChildNode(rowNode);
|
|
Packit Service |
9ccfef |
smiNode;
|
|
Packit Service |
9ccfef |
smiNode = smiGetNextChildNode(smiNode)) {
|
|
Packit Service |
9ccfef |
smiType = smiGetNodeType(smiNode);
|
|
Packit Service |
9ccfef |
if (smiType && smiType->name) {
|
|
Packit Service |
9ccfef |
smiModule = smiGetTypeModule(smiType);
|
|
Packit Service |
9ccfef |
if (smiModule && smiModule->name
|
|
Packit Service |
9ccfef |
&& strcmp(smiType->name, "RowStatus") == 0
|
|
Packit Service |
9ccfef |
&& strcmp(smiModule->name, "SNMPv2-TC") == 0) {
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (smiNode) {
|
|
Packit Service |
9ccfef |
#if 0
|
|
Packit Service |
9ccfef |
fprintf(stderr, "** %s\t%s\t%s\n", rowNode->name,
|
|
Packit Service |
9ccfef |
smiNode->name, smiType->name);
|
|
Packit Service |
9ccfef |
/* xxx count rows indexed by ifIndex, InterfaceIndex, InterfaceIndexOrZero, ... */
|
|
Packit Service |
9ccfef |
#endif
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
count(FILE *f, SmiNode *row, SmiNode *col, void *data)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
int *cnt = (int *) data;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
(*cnt)++;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
complexity(FILE *f, SmiNode *row, SmiNode *col, void *data)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
int *cmplx = (int *) data;
|
|
Packit Service |
9ccfef |
SmiType *smiType;
|
|
Packit Service |
9ccfef |
unsigned long min, max;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
smiType = smiGetNodeType(col);
|
|
Packit Service |
9ccfef |
if (! smiType) {
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
switch (smiType->basetype) {
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_INTEGER32:
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_UNSIGNED32:
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_ENUM:
|
|
Packit Service |
9ccfef |
*cmplx += 1;
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_OCTETSTRING:
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_OBJECTIDENTIFIER:
|
|
Packit Service |
9ccfef |
case SMI_BASETYPE_BITS:
|
|
Packit Service |
9ccfef |
*cmplx += 2;
|
|
Packit Service |
9ccfef |
min = smiGetMinSize(smiType);
|
|
Packit Service |
9ccfef |
max = smiGetMaxSize(smiType);
|
|
Packit Service |
9ccfef |
if (min != max) {
|
|
Packit Service |
9ccfef |
*cmplx += 1;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
default: /* ignore everything else */
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
yadayada(FILE *f, SmiNode *row, SmiNode *col, void *data)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
SmiModule *smiModule = (SmiModule *) data;
|
|
Packit Service |
9ccfef |
int flags = 0;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (col->access == SMI_ACCESS_NOT_ACCESSIBLE) {
|
|
Packit Service |
9ccfef |
flags |= INCR_TYPE;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
flags |= INCR_NODE;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
incrTypeAndNodeUsageCounter(smiModule, col, flags);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
addMetrics(Metrics *metrics, SmiModule *smiModule)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
SmiNode *smiNode;
|
|
Packit Service |
9ccfef |
SmiType *smiType;
|
|
Packit Service |
9ccfef |
size_t len;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
|
|
Packit Service |
9ccfef |
smiNode;
|
|
Packit Service |
9ccfef |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
|
|
Packit Service |
9ccfef |
len = smiNode->description ? strlen(smiNode->description) : 0;
|
|
Packit Service |
9ccfef |
switch (smiNode->nodekind) {
|
|
Packit Service |
9ccfef |
case SMI_NODEKIND_TABLE:
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusTables, smiNode->status);
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusAll, smiNode->status);
|
|
Packit Service |
9ccfef |
incrLengthCounter(&metrics->lengthTables,
|
|
Packit Service |
9ccfef |
smiNode->description, smiNode->reference,
|
|
Packit Service |
9ccfef |
smiNode->units, smiNode->format);
|
|
Packit Service |
9ccfef |
incrLengthCounter(&metrics->lengthAll,
|
|
Packit Service |
9ccfef |
smiNode->description, smiNode->reference,
|
|
Packit Service |
9ccfef |
smiNode->units, smiNode->format);
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_NODEKIND_ROW:
|
|
Packit Service |
9ccfef |
incrIndexCounter(&metrics->indexTables, smiNode->indexkind);
|
|
Packit Service |
9ccfef |
incrLengthCounter(&metrics->lengthRows,
|
|
Packit Service |
9ccfef |
smiNode->description, smiNode->reference,
|
|
Packit Service |
9ccfef |
smiNode->units, smiNode->format);
|
|
Packit Service |
9ccfef |
incrLengthCounter(&metrics->lengthAll,
|
|
Packit Service |
9ccfef |
smiNode->description, smiNode->reference,
|
|
Packit Service |
9ccfef |
smiNode->units, smiNode->format);
|
|
Packit Service |
9ccfef |
incrRowStatusCounter(smiNode);
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
int cnt = 0;
|
|
Packit Service |
9ccfef |
foreachIndexDo(NULL, smiNode, count, &cnt);
|
|
Packit Service |
9ccfef |
incrIndexLenCounter(&metrics->indexLenTables, cnt);
|
|
Packit Service |
9ccfef |
foreachIndexDo(NULL, smiNode, yadayada, smiModule);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
int cmplx = 0;
|
|
Packit Service |
9ccfef |
foreachIndexDo(NULL, smiNode, complexity, &cmplx);
|
|
Packit Service |
9ccfef |
incrIndexComplexityCounter(smiModule, smiNode, cmplx);
|
|
Packit Service |
9ccfef |
incrIndexComplexityMetric(&metrics->indexComplexity, cmplx);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
/* count the childs ... */
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
SmiModule *smiModule = smiGetModule("SNMPv2-TC");
|
|
Packit Service |
9ccfef |
SmiNode *childNode;
|
|
Packit Service |
9ccfef |
SmiType *rowStatus = smiGetType(smiModule, "RowStatus");
|
|
Packit Service |
9ccfef |
SmiType *storageType = smiGetType(smiModule, "StorageType");
|
|
Packit Service |
9ccfef |
/* include index elements not in table */
|
|
Packit Service |
9ccfef |
int n = 0;
|
|
Packit Service |
9ccfef |
for (childNode = smiGetFirstChildNode(smiNode);
|
|
Packit Service |
9ccfef |
childNode;
|
|
Packit Service |
9ccfef |
childNode = smiGetNextChildNode(childNode)) {
|
|
Packit Service |
9ccfef |
n++;
|
|
Packit Service |
9ccfef |
if (rowStatus == smiGetNodeType(childNode)) {
|
|
Packit Service |
9ccfef |
fprintf(stderr, "**** GEEEEEE - ROWSTATUS\n");
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
if (storageType == smiGetNodeType(childNode)) {
|
|
Packit Service |
9ccfef |
fprintf(stderr, "**** GEEEEEE - STORAGETYPE\n");
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
incrTableLenCounter(&metrics->tableLength, n);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_NODEKIND_COLUMN:
|
|
Packit Service |
9ccfef |
incrBasetypeCounter(&metrics->basetypesColumns, smiNode);
|
|
Packit Service |
9ccfef |
incrBasetypeCounter(&metrics->basetypesAll, smiNode);
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusColumns, smiNode->status);
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusAll, smiNode->status);
|
|
Packit Service |
9ccfef |
incrAccessCounter(&metrics->accessColumns, smiNode->access);
|
|
Packit Service |
9ccfef |
incrAccessCounter(&metrics->accessAll, smiNode->access);
|
|
Packit Service |
9ccfef |
incrLengthCounter(&metrics->lengthColumns,
|
|
Packit Service |
9ccfef |
smiNode->description, smiNode->reference,
|
|
Packit Service |
9ccfef |
smiNode->units, smiNode->format);
|
|
Packit Service |
9ccfef |
incrLengthCounter(&metrics->lengthAll,
|
|
Packit Service |
9ccfef |
smiNode->description, smiNode->reference,
|
|
Packit Service |
9ccfef |
smiNode->units, smiNode->format);
|
|
Packit Service |
9ccfef |
incrTypeAndNodeUsageCounter(smiModule, smiNode, INCR_TYPE);
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_NODEKIND_SCALAR:
|
|
Packit Service |
9ccfef |
incrBasetypeCounter(&metrics->basetypesScalars, smiNode);
|
|
Packit Service |
9ccfef |
incrBasetypeCounter(&metrics->basetypesAll, smiNode);
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusScalars, smiNode->status);
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusAll, smiNode->status);
|
|
Packit Service |
9ccfef |
incrAccessCounter(&metrics->accessScalars, smiNode->access);
|
|
Packit Service |
9ccfef |
incrAccessCounter(&metrics->accessAll, smiNode->access);
|
|
Packit Service |
9ccfef |
incrLengthCounter(&metrics->lengthScalars,
|
|
Packit Service |
9ccfef |
smiNode->description, smiNode->reference,
|
|
Packit Service |
9ccfef |
smiNode->units, smiNode->format);
|
|
Packit Service |
9ccfef |
incrLengthCounter(&metrics->lengthAll,
|
|
Packit Service |
9ccfef |
smiNode->description, smiNode->reference,
|
|
Packit Service |
9ccfef |
smiNode->units, smiNode->format);
|
|
Packit Service |
9ccfef |
incrTypeAndNodeUsageCounter(smiModule, smiNode, INCR_TYPE);
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_NODEKIND_NOTIFICATION:
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusNotifications, smiNode->status);
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusAll, smiNode->status);
|
|
Packit Service |
9ccfef |
incrLengthCounter(&metrics->lengthNotifications,
|
|
Packit Service |
9ccfef |
smiNode->description, smiNode->reference,
|
|
Packit Service |
9ccfef |
smiNode->units, smiNode->format);
|
|
Packit Service |
9ccfef |
incrLengthCounter(&metrics->lengthAll,
|
|
Packit Service |
9ccfef |
smiNode->description, smiNode->reference,
|
|
Packit Service |
9ccfef |
smiNode->units, smiNode->format);
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_NODEKIND_GROUP:
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusGroups, smiNode->status);
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusAll, smiNode->status);
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
case SMI_NODEKIND_COMPLIANCE:
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusCompliances, smiNode->status);
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusAll, smiNode->status);
|
|
Packit Service |
9ccfef |
break;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (smiType = smiGetFirstType(smiModule);
|
|
Packit Service |
9ccfef |
smiType;
|
|
Packit Service |
9ccfef |
smiType = smiGetNextType(smiType)) {
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/*
|
|
Packit Service |
9ccfef |
* Ignore all types with empty descriptions coming from the
|
|
Packit Service |
9ccfef |
* "SNMPv2-SMI" module since they are not really defined
|
|
Packit Service |
9ccfef |
* types but part of the language itself.
|
|
Packit Service |
9ccfef |
*/
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (! smiType->description) {
|
|
Packit Service |
9ccfef |
SmiModule *m = smiGetTypeModule(smiType);
|
|
Packit Service |
9ccfef |
if (m && strcmp(m->name, "SNMPv2-SMI") == 0) {
|
|
Packit Service |
9ccfef |
continue;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusTypes, smiType->status);
|
|
Packit Service |
9ccfef |
incrStatusCounter(&metrics->statusAll, smiType->status);
|
|
Packit Service |
9ccfef |
incrLengthCounter(&metrics->lengthTypes,
|
|
Packit Service |
9ccfef |
smiType->description, smiType->reference,
|
|
Packit Service |
9ccfef |
smiType->units, smiType->format);
|
|
Packit Service |
9ccfef |
incrLengthCounter(&metrics->lengthAll,
|
|
Packit Service |
9ccfef |
smiType->description, smiType->reference,
|
|
Packit Service |
9ccfef |
smiType->units, smiType->format);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintBasetypeCounter(FILE *f, BasetypeCounter *cnt, const char *s)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
if (!s && ! cnt) {
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the basetype usage distribution in the\n"
|
|
Packit Service |
9ccfef |
"# set of loaded MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-10s Int32 Uns32 Int64 Uns64 OctSt ObjId Enums Bits Flo32 Flo64 Flo128\n",
|
|
Packit Service |
9ccfef |
"CATEGORY");
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-10s %5lu %5lu %5lu %5lu %5lu %5lu %5lu %5lu %5lu %5lu %5lu\n", s,
|
|
Packit Service |
9ccfef |
cnt->integer32, cnt->unsigned32,
|
|
Packit Service |
9ccfef |
cnt->integer64, cnt->unsigned64,
|
|
Packit Service |
9ccfef |
cnt->octetstring, cnt->objectidentifier,
|
|
Packit Service |
9ccfef |
cnt->enums, cnt->bits,
|
|
Packit Service |
9ccfef |
cnt->float32, cnt->float64, cnt->float128);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-10s %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%% %4.1f%%\n", s,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->integer32 * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->unsigned32 * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->integer64 * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->unsigned64 * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->octetstring * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->objectidentifier * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->enums * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->bits * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->float32 * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->float64 * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->float128 * 100 / cnt->total : 0);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintStatusCounter(FILE *f, StatusCounter *cnt, char *s)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
if (!s || !cnt) {
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the status distribution of various\n"
|
|
Packit Service |
9ccfef |
"# definitions contained in the set of loaded MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8s %8s %11s %9s\n", "CATEGORY",
|
|
Packit Service |
9ccfef |
"TOTAL", "CURRENT", "DEPRECATED", "OBSOLETE");
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %8lu %11lu %9lu\n", s,
|
|
Packit Service |
9ccfef |
cnt->total, cnt->current, cnt->deprecated, cnt->obsolete);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %7.1f%% %10.1f%% %8.1f%%\n", s,
|
|
Packit Service |
9ccfef |
cnt->total,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->current * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->deprecated * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->obsolete * 100 / cnt->total : 0);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintAccessCounter(FILE *f, AccessCounter *cnt, char *s)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
if (!s || !cnt) {
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the access mode distribution of all scalar\n"
|
|
Packit Service |
9ccfef |
"# or column definitions contained in the set of loaded MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8s %10s %9s %7s %8s\n", "CATEGORY",
|
|
Packit Service |
9ccfef |
"TOTAL", "READWRITE", "READONLY", "NOTIFY", "NOACCES");
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %10lu %9lu %7lu %8lu\n", s,
|
|
Packit Service |
9ccfef |
cnt->total, cnt->readwrite, cnt->readonly,
|
|
Packit Service |
9ccfef |
cnt->notify, cnt->noaccess);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %9.1f%% %8.1f%% %6.1f%% %7.1f%%\n", s,
|
|
Packit Service |
9ccfef |
cnt->total,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->readwrite * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->readonly * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->notify * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->noaccess * 100 / cnt->total : 0);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintIndexCounter(FILE *f, IndexCounter *cnt, char *s)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
if (! s || ! cnt) {
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the table index kind distribution of\n"
|
|
Packit Service |
9ccfef |
"# table definitions contained in the set of loaded MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8s %8s %8s %8s %8s %8s\n", "CATEGORY",
|
|
Packit Service |
9ccfef |
"TOTAL", "INDEX", "AUGMENT", "REORDER", "SPARSE", "EXPAND");
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %8lu %8lu %8lu %8lu %8lu\n", s,
|
|
Packit Service |
9ccfef |
cnt->total, cnt->index, cnt->augment,
|
|
Packit Service |
9ccfef |
cnt->reorder, cnt->sparse, cnt->expand);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %7.1f%% %7.1f%% %7.1f%% %7.1f%% %7.1f%%\n", s,
|
|
Packit Service |
9ccfef |
cnt->total,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->index * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->augment * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->reorder * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->sparse * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->expand * 100 / cnt->total : 0);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintIndexLenCounter(FILE *f, IndexLenCounter *cnt, char *s)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
int i;
|
|
Packit Service |
9ccfef |
int n = sizeof(cnt->length)/sizeof(cnt->length[0]);
|
|
Packit Service |
9ccfef |
char buf[42];
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (! s || ! cnt) {
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the table index length distribution of\n"
|
|
Packit Service |
9ccfef |
"# table definitions contained in the set of loaded MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-10s %6s ", "CATEGORY", "TOTAL");
|
|
Packit Service |
9ccfef |
for (i = 1; i < n; i++) {
|
|
Packit Service |
9ccfef |
sprintf(buf, "[%d]", i);
|
|
Packit Service |
9ccfef |
fprintf(f, " %5s", buf);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
fprintf(f, "%-10s %6lu ", s, cnt->total);
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
for (i = 1; i < n; i++) {
|
|
Packit Service |
9ccfef |
fprintf(f, " %5lu", cnt->length[i]);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
for (i = 1; i < n; i++) {
|
|
Packit Service |
9ccfef |
fprintf(f, " %4.1f%%", (double) cnt->length[i] * 100 / cnt->total);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintTableLenCounter(FILE *f, TableLenCounter *cnt, char *s)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
int i;
|
|
Packit Service |
9ccfef |
int n = sizeof(cnt->length)/sizeof(cnt->length[0]);
|
|
Packit Service |
9ccfef |
char buf[42];
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (! s || ! cnt) {
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the table length distribution of\n"
|
|
Packit Service |
9ccfef |
"# table definitions contained in the set of loaded MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-10s %6s ", "CATEGORY", "TOTAL");
|
|
Packit Service |
9ccfef |
for (i = 1; i < n; i++) {
|
|
Packit Service |
9ccfef |
sprintf(buf, "[%d]", i);
|
|
Packit Service |
9ccfef |
fprintf(f, " %5s", buf);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
fprintf(f, "%-10s %6lu ", s, cnt->total);
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
for (i = 1; i < n; i++) {
|
|
Packit Service |
9ccfef |
fprintf(f, " %5lu", cnt->length[i]);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
for (i = 1; i < n; i++) {
|
|
Packit Service |
9ccfef |
fprintf(f, " %4.1f%%", (double) cnt->length[i] * 100 / cnt->total);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintLengthCounter(FILE *f, LengthCounter *cnt, char *s)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
if (! s) {
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the text clause usage distribution of all\n"
|
|
Packit Service |
9ccfef |
"# definitions contained in the set of loaded MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8s %12s %10s %8s %8s\n", "CATEGORY",
|
|
Packit Service |
9ccfef |
"TOTAL", "DESCRIPTION", "REFERENCE", "UNIT", "FORMAT");
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %12lu %10lu %8lu %8lu\n", s,
|
|
Packit Service |
9ccfef |
cnt->total, cnt->descr, cnt->reference,
|
|
Packit Service |
9ccfef |
cnt->units, cnt->format);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %11.1f%% %9.1f%% %7.1f%% %7.1f%%\n", s,
|
|
Packit Service |
9ccfef |
cnt->total,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->descr * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->reference * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->units * 100 / cnt->total : 0,
|
|
Packit Service |
9ccfef |
cnt->total ? (double) cnt->format * 100 / cnt->total : 0);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintLengthCounter2(FILE *f, LengthCounter *cnt, char *s)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
if (! s) {
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fprintf(f,
|
|
Packit Service |
9ccfef |
"# The following table shows the %s text length distribution (in\n"
|
|
Packit Service |
9ccfef |
"# bytes) of all definitions contained in the set of loaded MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", raw ? "total" : "average");
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8s %12s %10s %8s %8s\n", "CATEGORY",
|
|
Packit Service |
9ccfef |
"TOTAL", "DESCRIPTION", "REFERENCE", "UNIT", "FORMAT");
|
|
Packit Service |
9ccfef |
return;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (raw) {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %12lu %10lu %8lu %8lu\n", s,
|
|
Packit Service |
9ccfef |
cnt->total, cnt->descr_len, cnt->reference_len,
|
|
Packit Service |
9ccfef |
cnt->units_len, cnt->format_len);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %12.1f %10.1f %8.1f %8.1f\n", s,
|
|
Packit Service |
9ccfef |
cnt->total,
|
|
Packit Service |
9ccfef |
cnt->descr ? (double) cnt->descr_len / cnt->descr : 0,
|
|
Packit Service |
9ccfef |
cnt->reference ? (double) cnt->reference_len / cnt->reference : 0,
|
|
Packit Service |
9ccfef |
cnt->units ? (double) cnt->units_len / cnt->units : 0,
|
|
Packit Service |
9ccfef |
cnt->format ? (double) cnt->format_len / cnt->format : 0);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintfComplexity(FILE *f, Metrics *metrics)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
unsigned long cmplx = 0, fctrs = 0;
|
|
Packit Service |
9ccfef |
unsigned long total_cmplx = 0, total_fctrs = 0;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fputs(
|
|
Packit Service |
9ccfef |
"# The following table shows the complexity metrics of the set of loaded\n"
|
|
Packit Service |
9ccfef |
"# MIB modules.\n"
|
|
Packit Service |
9ccfef |
"\n", f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8s %8s %8s %8s\n", "CATEGORY", "TOTAL",
|
|
Packit Service |
9ccfef |
"RAW", "WEIGHT", "COMPLEXITY");
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
cmplx = metrics->accessScalars.readonly * 1;
|
|
Packit Service |
9ccfef |
fctrs = metrics->accessScalars.readonly;
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %8lu\n", "Scalars (ro):", fctrs, cmplx);
|
|
Packit Service |
9ccfef |
total_cmplx += cmplx;
|
|
Packit Service |
9ccfef |
total_fctrs += fctrs;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
cmplx = metrics->accessScalars.readwrite * 2;
|
|
Packit Service |
9ccfef |
fctrs = metrics->accessScalars.readwrite;
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %8lu\n", "Scalars (rw):", fctrs, cmplx);
|
|
Packit Service |
9ccfef |
total_cmplx += cmplx;
|
|
Packit Service |
9ccfef |
total_fctrs += fctrs;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
cmplx = metrics->accessColumns.readonly * 2;
|
|
Packit Service |
9ccfef |
fctrs = metrics->accessColumns.readonly;
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %8lu\n", "Columns (ro):", fctrs, cmplx);
|
|
Packit Service |
9ccfef |
total_cmplx += cmplx;
|
|
Packit Service |
9ccfef |
total_fctrs += fctrs;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
cmplx = metrics->accessColumns.readwrite * 3;
|
|
Packit Service |
9ccfef |
fctrs = metrics->accessColumns.readwrite;
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %8lu\n", "Columns (rw):", fctrs, cmplx);
|
|
Packit Service |
9ccfef |
total_cmplx += cmplx;
|
|
Packit Service |
9ccfef |
total_fctrs += fctrs;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/* readcreate tables ? */
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
/* table index complexity ? */
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
int i;
|
|
Packit Service |
9ccfef |
cmplx = 0;
|
|
Packit Service |
9ccfef |
for (i = 0; i < 100; i++) {
|
|
Packit Service |
9ccfef |
cmplx += 3 * i * metrics->indexComplexity.complexity[i];
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %8lu\n", "Indexes:", metrics->indexComplexity.total, cmplx);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
fprintf(f, "%-14s %8lu %8lu\n", "Summary:", total_fctrs, total_cmplx);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
fprintMetrics(FILE *f, Metrics *metrics)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
fprintStatusCounter(f, NULL, NULL);
|
|
Packit Service |
9ccfef |
fprintStatusCounter(f, &metrics->statusTypes, "Types:");
|
|
Packit Service |
9ccfef |
fprintStatusCounter(f, &metrics->statusTables, "Tables:");
|
|
Packit Service |
9ccfef |
fprintStatusCounter(f, &metrics->statusColumns, "Columns:");
|
|
Packit Service |
9ccfef |
fprintStatusCounter(f, &metrics->statusScalars, "Scalars:");
|
|
Packit Service |
9ccfef |
fprintStatusCounter(f, &metrics->statusNotifications, "Notifications:");
|
|
Packit Service |
9ccfef |
fprintStatusCounter(f, &metrics->statusGroups, "Groups:");
|
|
Packit Service |
9ccfef |
fprintStatusCounter(f, &metrics->statusCompliances, "Compliances:");
|
|
Packit Service |
9ccfef |
fprintStatusCounter(f, &metrics->statusAll, "Summary:");
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintAccessCounter(f, NULL, NULL);
|
|
Packit Service |
9ccfef |
fprintAccessCounter(f, &metrics->accessColumns, "Columns:");
|
|
Packit Service |
9ccfef |
fprintAccessCounter(f, &metrics->accessScalars, "Scalars:");
|
|
Packit Service |
9ccfef |
fprintAccessCounter(f, &metrics->accessAll, "Summary:");
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintIndexCounter(f, NULL, NULL);
|
|
Packit Service |
9ccfef |
fprintIndexCounter(f, &metrics->indexTables, "Tables:");
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintIndexLenCounter(f, NULL, NULL);
|
|
Packit Service |
9ccfef |
fprintIndexLenCounter(f, &metrics->indexLenTables, "Tables:");
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintTableLenCounter(f, NULL, NULL);
|
|
Packit Service |
9ccfef |
fprintTableLenCounter(f, &metrics->tableLength, "Tables:");
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintLengthCounter(f, NULL, NULL);
|
|
Packit Service |
9ccfef |
fprintLengthCounter(f, &metrics->lengthTypes, "Types:");
|
|
Packit Service |
9ccfef |
fprintLengthCounter(f, &metrics->lengthTables, "Tables:");
|
|
Packit Service |
9ccfef |
fprintLengthCounter(f, &metrics->lengthColumns, "Columns:");
|
|
Packit Service |
9ccfef |
fprintLengthCounter(f, &metrics->lengthScalars, "Scalars:");
|
|
Packit Service |
9ccfef |
fprintLengthCounter(f, &metrics->lengthNotifications, "Notifications:");
|
|
Packit Service |
9ccfef |
fprintLengthCounter(f, &metrics->lengthAll, "Summary:");
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintLengthCounter2(f, NULL, NULL);
|
|
Packit Service |
9ccfef |
fprintLengthCounter2(f, &metrics->lengthTypes, "Types:");
|
|
Packit Service |
9ccfef |
fprintLengthCounter2(f, &metrics->lengthTables, "Tables:");
|
|
Packit Service |
9ccfef |
fprintLengthCounter2(f, &metrics->lengthColumns, "Columns:");
|
|
Packit Service |
9ccfef |
fprintLengthCounter2(f, &metrics->lengthScalars, "Scalars:");
|
|
Packit Service |
9ccfef |
fprintLengthCounter2(f, &metrics->lengthNotifications, "Notifications:");
|
|
Packit Service |
9ccfef |
fprintLengthCounter2(f, &metrics->lengthAll, "Summary:");
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintBasetypeCounter(f, NULL, NULL);
|
|
Packit Service |
9ccfef |
fprintBasetypeCounter(f, &metrics->basetypesColumns, "Columns:");
|
|
Packit Service |
9ccfef |
fprintBasetypeCounter(f, &metrics->basetypesScalars, "Scalars:");
|
|
Packit Service |
9ccfef |
fprintBasetypeCounter(f, &metrics->basetypesAll, "Summary:");
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintfComplexity(f, metrics);
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintTypeUsage(f, typeList);
|
|
Packit Service |
9ccfef |
freeUsageCounter(typeList), typeList = NULL;
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintExtTypeUsage(f, extTypeList);
|
|
Packit Service |
9ccfef |
freeUsageCounter(extTypeList), extTypeList = NULL;
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintExtNodeUsage(f, extNodeList);
|
|
Packit Service |
9ccfef |
freeUsageCounter(extNodeList), extNodeList = NULL;
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintModuleUsage(f, extModuleList);
|
|
Packit Service |
9ccfef |
freeUsageCounter(extModuleList), extModuleList = NULL;
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
fprintIndexComplexity(f, indexComplexityList);
|
|
Packit Service |
9ccfef |
freeUsageCounter(indexComplexityList), indexComplexityList = NULL;
|
|
Packit Service |
9ccfef |
fprintf(f, "\n");
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static void
|
|
Packit Service |
9ccfef |
dumpMetrics(int modc, SmiModule **modv, int flags, char *output)
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
Metrics metrics;
|
|
Packit Service |
9ccfef |
int i;
|
|
Packit Service |
9ccfef |
FILE *f = stdout;
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
silent = (flags & SMIDUMP_FLAG_SILENT);
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (output) {
|
|
Packit Service |
9ccfef |
f = fopen(output, "w");
|
|
Packit Service |
9ccfef |
if (!f) {
|
|
Packit Service |
9ccfef |
fprintf(stderr, "smidump: cannot open %s for writing: ", output);
|
|
Packit Service |
9ccfef |
perror(NULL);
|
|
Packit Service |
9ccfef |
exit(1);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (flags & SMIDUMP_FLAG_UNITE) {
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
int pos = 8888;
|
|
Packit Service |
9ccfef |
fprintf(f, "# united module metrics [%d modules] "
|
|
Packit Service |
9ccfef |
"(generated by smidump " SMI_VERSION_STRING ")\n", modc);
|
|
Packit Service |
9ccfef |
fprintf(f, "#\n# smidump -u -f metrics");
|
|
Packit Service |
9ccfef |
if (raw) fprintf(f, " --metrics-raw");
|
|
Packit Service |
9ccfef |
for (i = 0; i < modc; i++) {
|
|
Packit Service |
9ccfef |
int len = strlen(modv[i]->name);
|
|
Packit Service |
9ccfef |
if (pos + len > 70) {
|
|
Packit Service |
9ccfef |
fprintf(f, " \\\n#\t"), pos = 8;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%s ", modv[i]->name);
|
|
Packit Service |
9ccfef |
pos += len + 1;
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintf(f, "%s\n", (pos == 8) ? "" : "\n");
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
fprintRevision(f, modc, modv);
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
for (i = 0; i < modc; i++) {
|
|
Packit Service |
9ccfef |
memset(&metrics, 0, sizeof(Metrics));
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
for (i = 0; i < modc; i++) {
|
|
Packit Service |
9ccfef |
addMetrics(&metrics, modv[i]);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
fprintMetrics(f, &metrics);
|
|
Packit Service |
9ccfef |
} else {
|
|
Packit Service |
9ccfef |
for (i = 0; i < modc; i++) {
|
|
Packit Service |
9ccfef |
if (! silent) {
|
|
Packit Service |
9ccfef |
fprintf(f, "# %s module metrics (generated by smidump "
|
|
Packit Service |
9ccfef |
SMI_VERSION_STRING ")\n\n", modv[i]->name);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
fprintRevision(f, 1, modv+i);
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
memset(&metrics, 0, sizeof(Metrics));
|
|
Packit Service |
9ccfef |
addMetrics(&metrics, modv[i]);
|
|
Packit Service |
9ccfef |
fprintMetrics(f, &metrics);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (fflush(f) || ferror(f)) {
|
|
Packit Service |
9ccfef |
perror("smidump: write error");
|
|
Packit Service |
9ccfef |
exit(1);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
if (output) {
|
|
Packit Service |
9ccfef |
fclose(f);
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
}
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
void
|
|
Packit Service |
9ccfef |
initMetrics()
|
|
Packit Service |
9ccfef |
{
|
|
Packit Service |
9ccfef |
static SmidumpDriverOption opt[] = {
|
|
Packit Service |
9ccfef |
{ "raw", OPT_FLAG, &raw, 0,
|
|
Packit Service |
9ccfef |
"generate raw statistics (no percentages)"},
|
|
Packit Service |
9ccfef |
{ 0, OPT_END, 0, 0 }
|
|
Packit Service |
9ccfef |
};
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
static SmidumpDriver driver = {
|
|
Packit Service |
9ccfef |
"metrics",
|
|
Packit Service |
9ccfef |
dumpMetrics,
|
|
Packit Service |
9ccfef |
0,
|
|
Packit Service |
9ccfef |
0,
|
|
Packit Service |
9ccfef |
"metrics characterizing MIB modules",
|
|
Packit Service |
9ccfef |
opt,
|
|
Packit Service |
9ccfef |
NULL
|
|
Packit Service |
9ccfef |
};
|
|
Packit Service |
9ccfef |
|
|
Packit Service |
9ccfef |
smidumpRegisterDriver(&driver);
|
|
Packit Service |
9ccfef |
}
|