380 likes | 495 Views
The Management API. What it is (and isn’t) Defining variables Accessing “singleton” variables Accessing Table variables. What it is…. An API that allows you to… Create a list of all management variables such as those used in SNMP on the system
E N D
The Management API What it is (and isn’t) Defining variables Accessing “singleton” variables Accessing Table variables
What it is… An API that allows you to… • Create a list of all management variables such as those used in SNMP on the system • Protect management variables from concurrent access by multiple threads • Read and write management variables • Register functions that will be called when a variable is written to • Check values that are written to variables (to make sure the values are within the valid ranges)
What it’s not… • An prepackaged SNMP Management station parallel to the SNMP Agent
Advantages • Variables are centralized • A common interface • Easy access to variables • Location is transparent • Easy integration with extensions • Advanced Web Server • SNMP Agent
SNMPBrowser Web Browser NET+OS Application Overview • Access Data • State • Connections • System up time • Location • Physical Address • Jobs • Statistics Netsilicon Management Interface
Variable Properties typedef struct { MAN_ID_TYPEid void *varPointer; int isFunction; int size; int type int dimensions; int numberDimensions; MAN_SEMAPHORE*semaphores; int numberSemaphores; void *rangeFn; void *rangeInfo manTableInfoType*tableInfo; void *callbackFn; } manVarType; • Define a variable • ID • Type • Size • Dimension • Memory • Range • Semaphore • Callback Function • Table
Variable Properties: id • String value • Unlimited length (memory constraint) char *snmpInPktsVar = “1.3.6.1.2.1.6.1” char *serlNoVar = “SerialNumber”
var->size = sizeof (INT32) var->varPointer = malloc (size) var->size = sizeof (INT8) memSize = var->size * var->dimensions[0] var->varPointer = malloc (memSize) Variable Properties: varPointer/isFunction = 0 • Memory Address • Causes allocation of a new variable of the specified type • isFunction set to variable INT8 ipAddress[4] var->type = MAN_INT8 var->isFunction = MAN_VAR var->dimensions = {4} var->numberDimensions = 1 INT32 inMsgCount; var->type = MAN_INT32 var->isFunction = MAN_VAR
inMsgCountAccessFn (var, buffer, indices, isWrite, timeout) static INT32 inMsgCount = 0; memcpy (buffer, inMsgCount, sizeof (INT32)); Variable Properties: varPointer/isFunction = MAN_FN • Function Address • Specifies function to access existing variable • Defined asmanAccessFunctionTypeor manTableAccessFunctionType • isFunction set as MAN_FN manAccessFunctionTypeinMsgCountAccessFn ( ); varPointer = inMsgCountAccessFn ; isFunction = MAN_FN;
Variable Properties: size • Define the variable size • Dependent on variable type • Automatically calculated internally when submitted • Requires manual setting for MAN_UNKNOWN INT32 inMsgCount; size = NULL struct FOO entry ; type = MAN_UNKNOWN size = sizeof (struct FOO); size = sizeof (INT32) = 4
Character MAN_CHAR Integer MAN_INT8 MAN_INT16 MAN_INT32 MAN_INT64 Word MAN_WORD8 MAN_WORD16 MAN_WORD32 MAN_WORD64 Variable Properties: type • Float (4 bytes) (unsupported) • MAN_FLOAT • Double (8 bytes) (unsupported) • MAN_DOUBLE • Unknown (structure) • MAN_UNKNOWN • Octet String • MAN_OCTET_STRING • Table • MAN_SNMP_TABLE
Variable Properties: dimension • Number of dimensions • Maximum is 10 • Coordinates for each dimension INT8 ipAddress[4] numberDimensions = 1 dimensions[] = {4} INT8 port[4][2] numberDimensions = 2 dimensions[] = {4, 2}
Variable Properties: semaphores • Controls access to variable • Prevents collision when accessed by multiple applications • Lock before variable is accessed • Unlock after variable is accessed • Supports multiple semaphores • FIFO order when locking • LIFO order when unlocking Access Variable Sem 1 Sem 2 Sem 3 Sem 4 Sem 5
Variable Properties: rangeFn • User defined function • MAN_ERROR_TYPE(*manTestFn) (manVarType *var, void *buffer) • Validate values • Legal states • Control boundary of variable • Minimum and maximum range • Called when before variable is updated • Return MAN_SUCCESS to allow update
Variable Properties: callbackFn • User defined function • MAN_ERROR_TYPE (*manCallbackFunctionType) (MAN_ID_TYPE *var, void *buffer, int buflen, void* fnd) • Notification • variable is changed • Called after variable is updated • Singleton variable • Table • Each entry in dimensional variable • Supports multiple callbacks, executed in the order registered *var->varPointer = 5; (callbackFn) (var)
Table Properties • Field information • Size • Type • Index information • Compare index fields • Data information typedef struct { int numberFields; int *fieldType; int *fieldSize; void *indexFn; void *indexInfo; } manTableInfoType;
Example Variable Table tcpConnState tcpConnLocalAddr tcpConnLocalPort tcpConnRemAddr tcpConnRemPort Listen (2) 10.52.32.20 10 10.52.32.80 10 Established (5) 10.52.32.35 15 10.52.32.65 15 Closed (1) 10.52.32.52 5 10.52.32.25 5 Established (5) 10.52.32.78 12 10.52.32.8 12
1 * sizeof (INT32) 4 * sizeof (WORD8) 1 * sizeof (INT32) MAN_INT32 4 * sizeof (WORD8) MAN_WORD8 1 * sizeof (INT32) MAN_INT32 MAN_WORD8 MAN_INT32 Table Properties: fieldType/fieldSize • Structures are transparent to the APIs • Number of fields in each entry • List of types for each field • List of sizes for each field typedef struct { int numberFields; int *fieldType; int *fieldSize; void *indexFn; void *indexInfo; } manTableInfoType; Fields fieldType fieldSize fieldType tcpConnState tcpConnLocalAddr fieldSize tcpConnLocalPort tcpConnRemAddr tcpConnRemPort
Table Properties: indexFn • User defined function used to locate entry in table • Current row is compared with index passed by application • Return results • -1 if index of entry is less than index in current row • 0 if index of entry is equal to index in current row • 1 if index of entry is greater than index in current row int (*manIndexFunctionType) (void *index, void *row, void *indexInfo) { tcpConnTableIndexType *index = indexInfo; tcpConnTableType *currentRow = (tcpConnTableType*) row; value = memcmp (currentRow->tcpConnLocalPort, index->tcpConnLocalPort, 4) return (value); }
Management API Capabilities • Register a list of variables • Access variable property • Retrieve a variable value • Update a variable value • Add callback routine • Register change function • Un-register variable list • Access a table
Register Variable List • MAN_ERROR_TYPEmanAddVariableList(manVarType*varList, int numberVars) • Registers custom variable list to master list • Supports one or more different lists • Verifies the properties of each variable • Calculates size and allocates memory • Each variable is hashed for faster access • No duplicate variables allowed
Unregister Variable List • MAN_ERROR_TYPEmanDeleteVariableList(manVarType*varList) • Unregisters variable list from Master list • Frees memory • Causes rehashing of table
Access Variable Properties • MAN_ERROR_TYPEmanGetVariableInfo(MAN_ID_TYPEid, int *type, int *size, int *dimensions, int *numberDimensions)
MAN_ERROR_TYPE manGetWORD* (MAN_ID_TYPE id, void *buffer, int *indices MAN_TIMEOUT_TYPE timeout) MAN_ERROR_TYPE manGetChar (MAN_ID_TYPE id, void *buffer, int *indices MAN_TIMEOUT_TYPE timeout) MAN_ERROR_TYPE manGetOctetString (MAN_ID_TYPE id, void *buffer, int *indices MAN_TIMEOUT_TYPE timeout) MAN_ERROR_TYPE manGetUnknown (MAN_ID_TYPE id, void *buffer, int size, int *indices MAN_TIMEOUT_TYPE timeout) MAN_ERROR_TYPE manGetINT* (MAN_ID_TYPE id, void *buffer, int *indices MAN_TIMEOUT_TYPE timeout) Reads a value from variable memory into buffer Index allows an entry to be accessed from dimensional variable Double and float not supported totalSize = var->size; memcpy (getValue, var->varPointer, totalSize); Retrieve Singleton Variable INT32getValue = 0; manGetINT32 (“inMsgCount”, &getValue, NULL, 10)
MAN_ERROR_TYPE manGetArray (MAN_ID_TYPE id, void *buffer, int size, MAN_TIMEOUT_TYPE timeout) Not valid for MAN_OCTET_STRING and MAN_SNMP_TABLE type Reads all entries from dimensional variable into buffer Buffer size must be equal to or greater than dimensional totalSize = var->size * ( var->dimensions) memcpy (getValue, var->varPointer, totalSize); Retrieve Dimensional Variable INT8getValue[4] = 0; manGetArray (“ipAddress”, getValue, 4, 10)
MAN_ERROR_TYPE manSetWORD* (MAN_ID_TYPE id, void buffer, int *indices MAN_TIMEOUT_TYPE timeout) MAN_ERROR_TYPE manSetChar (MAN_ID_TYPE id, void buffer, int *indices MAN_TIMEOUT_TYPE timeout) MAN_ERROR_TYPE manSetOctetString (MAN_ID_TYPE id, void *buffer, int *indices MAN_TIMEOUT_TYPE timeout) MAN_ERROR_TYPE manSetUnknown (MAN_ID_TYPE id, void *buffer, int size, int *indices MAN_TIMEOUT_TYPE timeout) MAN_ERROR_TYPE manSetINT* (MAN_ID_TYPE id, void buffer, int *indices MAN_TIMEOUT_TYPE timeout) Writes value from buffer into variable memory Index allows an entry to be accessed from dimensional variable Double and float not supported totalSize = var->size; memcpy (var->varPointer, setValue, totalSize); Update Singleton Variable INT32setValue = 50; manSetINT32 (“inMsgCount”, &setValue, NULL, 10)
MAN_ERROR_TYPE manSetArray (MAN_ID_TYPE id, void *buffer, int size, MAN_TIMEOUT_TYPE timeout) Not valid for MAN_OCTET_STRING_TYPE and MAN_SNMP_TABLE Writes buffer into dimensional variable Buffer size must equal dimensional size totalSize = var->size * ( var->dimensions) memcpy (var->varPointer, setValue, totalSize); Update a Dimensional Variable INT8setValue[4] = {10,32,52,70}; manSetArray (“ipAddress”, setValue, 4, 10)
Add a Callback Function • MAN_ERROR_TYPE manAddVariableCallback (MAN_ID_TYPE id, int*indices, manCallbackFunctionType *fn, void *fnd) • User defined function executed when variable is updated • Routine must be defined as manCallbackFunctionType • Sets one or more callback routines per variable • Sets a callback for an entry in dimensional variable • Multiple functions are executed in the order added
Remove a Callback Function • MAN_ERROR_TYPE manDeleteVariableCallback (MAN_ID_TYPE id, int*indices, manCallbackFunctionType *fn, void *fnd) • Removes user defined function when variable is updated • One callback is removed if multiple set
Set Variable Change Function • MAN_ERROR_TYPE manRegisterChangeFn (manVariableChangeFnType *fn) • User defined function executed when variable is accessed • Sets one routine for all variables
Remove Variable Change Function • MAN_ERROR_TYPE manUnregisterChangeFn (void) • Removes the user defined function executed when a variable is accessed
Access Tables • Update table entry • Retrieve table entry • Retrieve table entry position • Delete table entry • Add new table entry
typedef struct { WORD8 tcpConnLocalAddr[4] INT32 tcpConnLocalPort WORD8 tcpConnRemAddr[4] INT32 tcpConnRemPort } tcpConnTableIndexType; Table Index • An entry requires a unique identifier • Distinguish between entries • Sorting and searching entries in table • Defined as manTableIndexType typedef struct { int numericIndex; int wantExact; void *snmpIndex; } manTableIndexType;
Update Table Entry • MAN_ERROR_TYPE manSetSnmpRow (MAN_ID_TYPE id, manTableIndexType *index, manTableIndexType *newIndex, void *buffer, MAN_TIMEOUT_TYPE timeout) • Updates entry that matches index when exact • Updates first entry greater or equal to index when not exact • Relocates entry in table if index is changed
Retrieve a Table Entry • MAN_ERROR_TYPE manGetSnmpRow (MAN_ID_TYPE id, manTableIndexType *index, void *buffer, MAN_TIMEOUT_TYPE timeout) • Retrieves entry that matches index when exact • Retrieves first entry greater or equal to index when not exact
Retrieve Table Entry Position • MAN_ERROR_TYPE manGetSnmpRowPos (MAN_ID_TYPE id, manTableIndexType *index, int *pos, MAN_TIMEOUT_TYPE timeout) • Get position of entry that matches index when exact • Get position of first entry greater or equal to index when not exact
Remove a Table Entry • MAN_ERROR_TYPE manDeleteSnmpRow (MAN_ID_TYPE id, manTableIndexType *index, MAN_TIMEOUT_TYPE timeout) • Deletes entry that matches index when exact • Deletes first entry greater or equal to index when not exact • Releases memory allocated for entry
Add a Table Entry • MAN_ERROR_TYPE manInsertSnmpRow (MAN_ID_TYPE id, manTableIndexType *index, void *buffer, MAN_TIMEOUT_TYPE timeout) • Inserts before entry which matches index when exact • Inserts before first entry greater or equal to index when not exact • Allocates memory for new entry