home *** CD-ROM | disk | FTP | other *** search
/ Internet Standards / CD1.mdf / winsnmp / agent / winagv03.txt < prev   
Text File  |  1994-12-23  |  76KB  |  2,309 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.                      Windows SNMP Agent
  11.  
  12.  
  13.  
  14.  
  15.  
  16.              The Open Interface for Programming
  17.              the Extensible SNMP V1 and V2 Agent
  18.                   Under Microsoftr WindowsÖ
  19.  
  20.  
  21.  
  22.                          Version 0.3
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.                        1 December 1994
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.       Aleksey Romanov     Paul Freeman Associates, Inc
  44.       William H. White    Digital Equipment Corporation
  45.       Pete Wilson         Paul Freeman Associates, Inc
  46.                               
  47.  
  48.  
  49.  
  50.  
  51.  
  52.                   Copyright c 1993, 1994 by
  53.                 Paul Freeman Associates, Inc.
  54.              14 Pleasant Street   P. O. Box 2067
  55.              Westford, Massachusetts  01886-5067
  56.                               
  57.                      All Rights Reserved
  58.  
  59.  
  60. This document may be freely distributed in any form
  61. whatever, including the form of computer-readable electronic
  62. medium, provided that it is distributed in its entirety and
  63. that the copyright and this notice are included.
  64.  
  65. Comments and questions may be submitted by electronic mail
  66. to winsnmp@mailbag.intel.com. Requests to be added to the
  67. WinSNMP mailing list should be addressed as:
  68.  
  69. To:       Majordomo@mailbag.intel.com
  70. Subject:       <leave blank>
  71. Message        subscribe winsnmp
  72.  
  73. The binary of the WinSNMP Agent demonstrates the
  74. feasilbility of this specification. You can obtain this form
  75. of the Agent via anonymous FTP. The demonstration package
  76. includes an implementation of the core Agent for the SNMP v1
  77. and v2; the SNMP and System groups of MIB-II; and the
  78. required and hrSWRun groups from the Host Resources MIB (RFC
  79. 1514). To FTP this binary:
  80.  
  81.      ftp ftp.std.com               // 192.74.137.7
  82.      user ftp or anonymous
  83.      pass your e-mail address
  84.      cd vendors/snmp/windows-agent
  85.      binary
  86.      Then mget all of the files in that directory. The
  87. README file gives further instructions.
  88.  
  89. Authors' Contact Information
  90.  
  91. Aleksey Romanov     ralex@world.std.com
  92. William H. White    b_white@ranger.enet.dec.com
  93. Pete Wilson         pwilson@world.std.com
  94.  
  95.  
  96.  
  97.  
  98.  
  99. Version history and status of this version
  100.  
  101. 0.1   1 Jan 1994    Original offering.
  102. 0.2   1 Sep 1994    1. Version 0.2 reflects changes made
  103. during the implementation of the WinSNMP
  104.               Agent and its accompanying MIBs (pw).
  105.           2. Added feature allowing overlapping
  106. MIBs/namespaces (pw).
  107. 0.3   1 Dec 1994    Corrected winsnmp mail-list subscription
  108. info; add support for hrSWRun Group
  109.           in HR MIB accompanying WESA, the Windows
  110. Extensible SNMP Agent.
  111. 1    INTRODUCTION
  112.  
  113. 1.1  Identification
  114. 1.2  Trademarks
  115. 1.3  Background
  116. 1.4  Goals
  117. 1.5  Non-Goals
  118. 1.6  What is the WinSNMP/Agent?
  119. 1.7  Naming Conventions
  120. 1.8  Glossary
  121.  
  122. 2    OVERVIEW OF THE CORE-AGENT-TO-MIB-SERVER INTERFACE
  123.  
  124. 2.1  Major Components
  125. 2.2  Program Flow
  126. 2.3  Message Types
  127.  
  128. 3    ERROR CODES AND PSEUDOTYPES
  129.  
  130. 3.1  Intermediate Error Codes
  131. 3.2  Error Processing and Reporting
  132. 3.3  Set Primitive
  133. 3.4  SNMPv1 CMD_DO_COMMIT
  134. 3.5  SNMPv2 CMD_DO_COMMIT/CMD_UNDO_COMMIT
  135.  
  136. 4    FUNCTION-CALL INTERFACE FOR LOADABLE MIB SERVERS
  137.  
  138. 4.1  Basic Structures
  139. 4.2  Function Definitions
  140.  
  141. 5    MESSAGE-PASSING INTERFACE FOR EXTERNAL MIB SERVERS
  142.  
  143. 5.1  Shared Memory Mechanism
  144. 5.2  Message Structures
  145.  
  146. 6    MIB-SERVER MOUNTING AND UNMOUNTING PROCEDURES
  147.  
  148. 6.1  Loadable MIB Servers
  149. 6.2  External MIB Servers
  150. 6.3  Core Agent Mutual Exclusions
  151.  
  152. 7     DECLARATIONS
  153. 7.1  Structure Declarations
  154. 7.2  Function Prototypes
  155.  
  156. 8    OTHER ISSUES
  157.  
  158. 8.1  Common Service Primitives
  159. 8.2  Interface to DMTF
  160.  
  161. 9    REFERENCES
  162.  
  163. APPENDIX A    MIB-server code example
  164.  
  165.  
  166. 1    INTRODUCTION
  167.  
  168. 1.1  Identification
  169.  
  170. This paper is the WinSNMP/Agent Specification, Version 0.2.
  171. It suggests the rules for the implementation of extensible,
  172. interoperable, vendor-neutral SNMP agent software that
  173. observes the rules of the SNMP Version 1 and Version 2 and
  174. that operates under the Microsoftr WindowsÖ family of
  175. operating systems.
  176.  
  177. 1.2  Trademarks
  178.  
  179. Microsoft, MS, and MS-DOS are registered trademarks; and
  180. Windows is a trademark of Microsoft Corporation.
  181.  
  182. The Universal SNMP v1+v2 Agent and Open Agent Architecture
  183. are trademarks of Paul Freeman Associates, Inc.
  184.  
  185. 1.3  Background
  186.  
  187. The architecture described in this paper is the Open Agent
  188. Architecture developed as part of the Universal SNMP v1+v2
  189. Agent by Paul Freeman Associates, Inc., which makes the
  190. technology available to the WinSNMP/Agent effort.
  191.  
  192. Paul Freeman Associates, Inc., is the developer of the
  193. Universal SNMP v1+v2 Agent Ö, a commercial implementation of
  194. the agent part of the SNMP. In order to advance the state of
  195. the network-management art, PFA is making available to the
  196. WinSNMP/Agent effort the part of its Agent which realizes
  197. the interface between the core part of its Agent and MIB
  198. implementation. It is this interface which enables
  199. independent third-party MIBs to operate correctly with the
  200. PFA core Agent.  The PFA interface is referred to below as
  201. the "Interface."
  202.  
  203. The impetus for the revelation of this trade-secret material
  204. is the recent effort to standardize SNMP components for
  205. operation under the Microsoft Windows operating system:
  206. because the Interface has proven useful and complete, PFA
  207. offers it as the interface for the emergent Win/SNMP Agent
  208. standard.
  209.  
  210. 1.4  Goals of This Paper
  211.  
  212. 1.4.1  The paper describes a robust, powerful, and
  213. understandable framework for the implementation of
  214. extensible, interoperable, vendor-neutral Windows-based SNMP
  215. agents.
  216.  
  217. 1.4.2  The paper defines a standard interface between the
  218. WinSNMP's core agent and its MIB-server modules and thereby
  219. supports the independent development of core agents and MIB
  220. servers.
  221.  
  222. 1.4.3  The paper encourages the development of interoperable
  223. Windows-based agent components by different vendors so as to
  224. allow the dynamic selection of core-agent and MIB-server
  225. configurations by the end user from a set of fully
  226. interoperable core-agent and MIB-server components.
  227.  
  228. 1.4.4  The paper describes standardized elements which are
  229. focused enough to permit the creation of a broad range of
  230. product-specific, value-added agents by conforming yet
  231. competing vendors, but proposes no further policy.
  232.  
  233. 1.4.5  The paper hopes to offer APIs that are as compatible
  234. and consistent as possible with the WinSNMP/Manager and
  235. WinSNMP/MIB APIs.
  236.  
  237. 1.4.6  The paper proposes a DMTF interface.
  238.  
  239.  
  240. 1.5  Non-Goals of This Paper
  241.  
  242. 1.5.1  The paper sets no implementation policy, but only
  243. presents an implementation framework.
  244.  
  245. 1.5.2  The paper is silent on issues of correct and
  246. compliant SNMP-agent development.
  247.  
  248. 1.5.3  The paper proposes no communications scheme or
  249. transport layer of any kind, except to say by implication
  250. that some (conceptual) transport layer is present. The
  251. choice of transport layer and its realization is entirely
  252. the province of each agent implementor.
  253.  
  254. 1.6  What is the WinSNMP/Agent?
  255.  
  256. The WinSNMP/Agent is an extensible SNMPv1- and SNMPv2-
  257. compliant agent that runs under Microsoft Windows.  This
  258. specification describes a model for implementing the
  259. extensible agent.  This model strictly partitions the agent
  260. into three parts:
  261.  
  262. ·  a protocol-specific part, called the "core agent";
  263. ·  one or more MIB-specific parts, called "MIB servers"; and
  264. ·  the interface between the two, called the "core-agent-to-
  265.   MIB server interface" or, more often and more simply, the
  266.   "interface" or the "API."
  267.  
  268. 1.6.1  The WinSNMP/Agent Core Agent
  269.  
  270. A core agent is a Windows application that binds to a
  271. transport library for receiving or sending SNMP packets and
  272. for processing the SNMP v1/v2 PDU header. The core agent
  273. never accesses any MIB variables directly, but relies
  274. completely upon one or more MIB servers to perform MIB-
  275. variable accesses.  The core agent completely manages SNMP-
  276. packet processing:
  277.  
  278. ·  it receives the SNMP request packet from the
  279.   communications stack.
  280. ·  it verifies the packet's authenticity, privacy, and
  281.   context.
  282. ·  it locates the appropriate MIB server for each variable
  283.   in the packet.
  284. ·  it passes each variable binding and protocol operation,
  285.   in turn, to the appropriate MIB server.
  286. ·  it manages the synchronization of multiple-phase (SET)
  287.   and multiple-MIB-server (GETNEXT, GETBULK, and SET)
  288.   processing.
  289. ·  it receives the result of each protocol operation for
  290.   each variable binding from the MIB server and, when
  291.   appropriate, encodes the result in an SNMP response
  292.   packet.
  293. ·  it returns the complete response packet to the
  294.   communications stack for delivery to the NMS.
  295.  
  296. The core agent also provides a number of service primitives
  297. for general use including, among possibly many others:
  298.  
  299. ·  trap sending.
  300. ·  BER parsing.
  301. ·  oid comparison.
  302. ·  common RowStatus service.
  303. ·  view evaluation.
  304. ·  error logging.
  305.  
  306. 1.6.2  The WinSNMP/Agent MIB Server
  307.  
  308. A MIB server is a DLL module or MS-Windows process that
  309. provides access to MIB variables at the request of and on
  310. behalf of the core agent. A MIB server implements all of the
  311. functions necessary to carry out all of the variable-access
  312. operations requested in any SNMP packet for one or more
  313. variables.  A MIB server may operate on part of a MIB; on a
  314. complete MIB; or on multiple MIBs.
  315.  
  316. The MIB variables under the purview of a MIB server are said
  317. to comprise that MIB server's "namespace".  Namespaces are
  318. ordered and contiguous sets of variable instances.
  319. Namespaces may overlap.
  320.  
  321. A MIB server is bound to a core agent in either of two ways:
  322.  
  323. ·  The MIB server can be a dynamically-linkable (loadable)
  324.   DLL which can be loaded and then unloaded at run time. A
  325.   MIB server bound in this way is said to be "loadable."
  326. ·  The MIB server can exist as a process separate from the
  327.   core agent.  Such a MIB server communicates with the core
  328.   agent using shared memory and messages and is said to be
  329.   "external."
  330.  
  331. 1.6.3  The WinSNMP/Agent Core-Agent-to-MIB-Server Interface
  332.  
  333. The core-agent-to-MIB-server interface consists of four
  334. primitive types:
  335.  
  336. ·  an initialization primitive that lets each MIB server
  337.   initialize its namespaces;
  338. ·  variable-access primitives, including primitives that
  339.   support GET and SET operations;
  340. ·  a synchronization primitive that tells a MIB server when
  341.   packet processing is starting or is complete; and
  342. ·  general housekeeping primitives for timekeeping and views
  343.   maintenance.
  344.  
  345. This specification defines two general primitive
  346. implementations:
  347.  
  348. ·  Primitives which the core agent accesses through direct
  349.   function calls. This is the scheme used for loadable MIB
  350.   servers.
  351. ·  Primitives which the core agent accesses via the combined
  352.   use of shared memory and the messaging system native to
  353.   the Windows environment. This is the scheme used for
  354.   external MIB servers.
  355.  
  356.        +----------+  +-------+          +-----+        +----
  357. ----+
  358.        |  Request |  |       |          |     +--Call->|
  359. MIB   |
  360.    +-->|  Packet  +->|       | Requests |     |<- Ret -+
  361. Server |
  362.    |   | from NMS |  |       +-- with ->|     |        +----
  363. ----+
  364.    |   +----------+  |       | Varbinds |     |
  365. +--+-------------+   |       |          |     |        +----
  366. ----+
  367. | Communications |   | Core  |          | I/F +- Call->|  MIB
  368. |
  369. |     Layer      |   | Agent |          |     |<- Ret -+
  370. Server |
  371. +----------------+   |       |          |     |        +----
  372. ----+
  373.    A   +----------+  |       |<-Results-+     |
  374.    |   | Response |  |       |          |     |        +----
  375. ----+
  376.    +---+  Packet  |<-+       |          |     +- Call->|
  377. MIB   |
  378.        | for NMS  |  |       |          |     |<- Ret -+
  379. Server |
  380.        +----------+  +-------+          +-----+        +----
  381. ----+
  382.  
  383. Figure 1.1  Control and data flow through some
  384. communications layer, the Core Agent, the Interface, and the
  385. MIB Server(s).
  386.  
  387. 1.7  Naming Conventions
  388.  
  389. This section aims precisely to define terms which are local
  390. to this paper.
  391.  
  392. 1.7.1  Mib
  393.  
  394. Each namespace (see just below) is represented to the core
  395. agent by one structure, called "mib" in this paper. There is
  396. a linked list of such mib structures, and each structure
  397. holds the complete definitions of:
  398.  
  399. ·  the single namespace under the control of the
  400.   corresponding MIB server; and
  401. ·  all MIB-server-resident primitives which operate on that
  402.   namespace.
  403.  
  404. The core agent views all MIB servers mounted at any moment
  405. as a set of mib entries. The core agent has no interest
  406. whatever in the ways in which namespace access might be
  407. implemented within any MIB server.
  408.  
  409. 1.7.2  Namespace
  410.  
  411. A namespace, equivalent to a range of MIB variables, is an
  412. ordered and contiguous set of variable instances accessible
  413. to one and only one MIB server. The set is characterized,
  414. defined, and bounded by a low boundary, a high boundary, and
  415. an entity name.  The low boundary is that ASN.1 name which
  416. is less than or equal to the ASN.1 name of the first
  417. variable instance in the set. The high boundary is the least
  418. ASN.1 name which lies beyond the set ("beyond" in a
  419. lexicographic way).  There is no variable instance whose
  420. ASN.1 name is greater than or equal to the low bound and
  421. less than the high bound which is accessed by any other MIB
  422. server.  The entity name is the value of the appropriate
  423. contextLocalEntity.
  424.  
  425. 1.7.3  Primitives
  426.  
  427. Each MIB server implements six callable functions, termed
  428. "primitives," which operate on its namespaces.
  429.  
  430. The MIB-server namespace primitives are:
  431.  
  432. ·  init()    Initialize (one time) namespace
  433. ·  indicate()     Let the MIB server know packet processing
  434.   is starting or is finished.
  435. ·  look()    Process GETs and phase one of SETs in the
  436.   namespace.
  437. ·  set()     Process phase two of SETs in the namespace
  438. ·  tick()    Keep track of elapsed time.
  439.  
  440. There is no connection between the name of the primitive and
  441. the name of the function implementing the primitive
  442. operation.  We use primitive names as function names in
  443. order to avoid another level of indirection.
  444.  
  445. For a loadable MIB server, the core agent calls the
  446. primitives using the function pointers associated with the
  447. namespace. These function pointers are stored in the
  448. namespace's mib structure.  For an external MIB server, the
  449. core agent sets up shared memory and then passes messages to
  450. the server which cause the primitives to be invoked.
  451.  
  452. 1.8  Glossary
  453.  
  454. This section glosses terms in general use in the SNMP and
  455. Windows communities.
  456.  
  457. <To be added>
  458.  
  459. 2   OVERVIEW OF THE CORE-AGENT-TO-MIB-SERVER INTERFACE
  460.  
  461. This section is a brief, high-level overview of the "what"
  462. and "why" of the interface. A formal, detailed description
  463. of each interface component (the "how") appears later.  This
  464. section concentrates on the interface as it exists for
  465. loadable MIB servers. The external MIB server interface,
  466. which depends upon messaging, is treated in detail below,
  467. but is functionally equivalent.
  468.  
  469. 2.1  Major components
  470.  
  471. The main part of the interface is a set of six primitives:
  472. init(), indicate(), look(), set(), view(), and tick().  Each
  473. MIB server must offer this set of primitive functions.
  474.  
  475. 2.1.1 Init Function
  476.  
  477. The init function for each namespace is called only once,
  478. and before any other MIB-server functions are called, to
  479. allow the MIB server to initialize itself and the namespaces
  480. it supports.
  481.  
  482. 2.1.2 Indicate Function
  483.  
  484. The indicate function is called twice during the processing
  485. of each received SNMP packet.  It is called, first, before
  486. calling any other mib primitives involved in processing the
  487. current received packet; and it's next called, second, after
  488. all varbinds in the request packet have been dealt with and
  489. the core agent is ready to return a response packet to the
  490. communications layer. The indicate function is called with
  491. an argument START or END, so will designate the first call
  492. as indicate(START) and the second and indicate(END).
  493.  
  494. The purpose of the function is to allow the MIB server to
  495. allocate and free resources synchronously with packet
  496. processing. For example, the MIB server might allocate
  497. temporary resources or locks at indicate(START) time and
  498. release them at indicate(END) time.  The call also conveys
  499. information which is not going to change during the current
  500. packet processing: the version of this current request
  501. (SNMPv1 or SNMPv2), the type of operation performed, the
  502. reference (pointer or handle) of the view list, the index of
  503. the current view, and the temporal domain.
  504.  
  505. 2.1.3 Look Function
  506.  
  507. The MIB server's look function must perform the search and
  508. access validation for the requested name. The details of the
  509. operations performed depend upon the pdu type being
  510. processed, pdu type established by indicate(START).
  511.  
  512. For the get (GetRequest pdu), the core agent supplies the
  513. name of the variable instance to find. The MIB server needs
  514. to find this variable instance, check access rights (the
  515. tools to do so having been delivered by indicate(START)),
  516. possibly copy this variable into some temporary static area,
  517. pass back its type and length (both unencoded) and a pointer
  518. to the variable, and return success or the appropriate error
  519. code.
  520.  
  521. The next (Get-Next or Get-Bulk pdu) transaction performs
  522. similarly, except that the name of the found variable is
  523. also returned.
  524.  
  525. The write (Set pdu) transaction differs from the two get
  526. transactions. In a write transaction, the core agent
  527. delivers the name of the variable to be set, its unencoded
  528. value, and the type and the length of the value. The MIB
  529. server then must find this variable instance, check access
  530. rights, check the value, the type, and the length provided;
  531. and then must store this value into shadow memory, along
  532. with all the information needed for a successful later low-
  533. level set operation. If any error is found, the MIB server
  534. returns the appropriate error code.
  535.  
  536. If the server finds that it can successfully process the
  537. request, the MIB server must return a non-zero 32-bit handle
  538. at least once for each packet for use by the core agent in
  539. subsequent set primitives.
  540.  
  541. 2.1.4 Set Function
  542.  
  543. The core agent saves all (mib,handle,index) triplets for all
  544. non-zero handles passed back by the look primitive. Once the
  545. look primitive has been successfully performed for all
  546. varbinds in the current packet, the core agent core calls
  547. set(DO_PHASE1) for each stored (mib, handle,index) triplet.
  548. The MIB server now has the chance to verify the consistency
  549. of all variable instances associated with the handle value
  550. and/or all other variables in the server's namespaces (new
  551. values for all variables being known at this point), having
  552. made all arrangements necessary to insure a successful later
  553. commit.  The MIB server returns an indication of success or
  554. the appropriate error code.
  555.  
  556. In case of error, the core agent, remembering the error code
  557. and the index, calls set(UNDO_PHASE1, handle, index)  in
  558. reverse order for each stored and already processed triplet.
  559. The MIB server must undo all reservations made during the
  560. previous set(DO_PHASE1,...) calls.
  561.  
  562. If all calls to set(DO_PHASE1,...) were successfully
  563. performed, the core  agent calls set(DO_COMMIT,handle,index)
  564. for all triplets. If a set(DO_COMMIT,...) fails, the core
  565. agent calls set(UNDO_COMMIT,handle,index) for each already
  566. committed triplet. The core agent then calls
  567. set(UNDO_PHASE1, handle, index) for all stored triplets in
  568. reverse order.
  569.  
  570. If all calls to set(DO_COMMIT, ...) were successfully
  571. performed, the core agentcalls set(DO_RELEASE, handle,
  572. index) for all stored triplets in reverse order toinsure
  573. orderly release of all locks and resources reserved.
  574.  
  575. 2.1.5 Tick Function
  576.  
  577. The tick function is called between packets every 10-15
  578. seconds in order to allow MIB servers to perform any time
  579. related functions: clean up old notInService rows, initiate
  580. trap sending, etc.
  581.  
  582.  
  583. 2.2  Program Flow
  584.  
  585. This section gives an overview of the program flows of a
  586. simple, straightforward conceptual core agent and a
  587. cooperating MIB server.  For clarity and simplicity, this
  588. description omits error handling.
  589.  
  590. 2.2.1  Initialization
  591.  
  592. Core Agent
  593. MIB server
  594. ------------------------------------------------------------
  595. -------------------
  596.  
  597. for(all loadable MIB servers){
  598.      add MIB server to MIB-server list;
  599.      for(all MIB-server name spaces){
  600.           for(all entities supported){
  601.                 add mib to the list
  602.           }
  603.      }
  604. }
  605.  
  606. for(all mibs known){
  607.      mib->mib_specific = mib->mib_init();  ----->      reset
  608. to known state,
  609. }                                                  according
  610. to init
  611.  
  612. string, remember
  613.  
  614. pointers to global
  615.  
  616. data
  617.  
  618. 2.2.2  GetRequest Processing
  619.  
  620.  
  621. for(all mibs for particular entity){
  622.      mark mib as not referenced;
  623. }
  624.  
  625.  
  626. for(each requested varbind)
  627.      find first and last mib
  628.      entries to search;
  629.      for(
  630.           mib=first;
  631.           mib!=last;
  632.           mib=mib->mib_next
  633.      ){
  634.           if(not referenced yet){
  635.                mib->mib_indicate(START)  ----->   remember
  636. pdu type, version,
  637.                mark as referenced;                view and
  638. temporal domain,
  639.                     }
  640. perform all operations
  641.                                         required to start
  642. packet
  643.  
  644. processing
  645.  
  646.           mib->mib_look()                            ------>
  647. lok for variable instance,
  648.      }                                       check access,
  649. pass value
  650. add result to output packet;                      back
  651. }
  652.  
  653. for(all mibs for particular entity){
  654.      if(not referenced){
  655.           continue;
  656.      }
  657.      mib->mib_indicate(END)                           ---->
  658. perform all operations
  659. }
  660. required to end packet
  661.  
  662. processing
  663. build response packet and
  664. return pointer to packet to the
  665. communications layer
  666.  
  667. 2.2.3  SetRequest Processing
  668.  
  669. for(all mibs for particular entity){
  670.      mark mib as not referenced;
  671. }
  672.  
  673.  
  674. for(each requested varbind)
  675.      find first and last mib
  676.      entries to search;
  677.      for(
  678.           mib=first;
  679.           mib!=last;
  680.           mib=mib->mib_next
  681.      ){
  682.           if(not referenced yet){
  683.                mib->mib_indicate(START)   -->     remember
  684. pdu type, version,
  685.                mark as referenced;
  686. view, and temporal domain,
  687.           }
  688. perform all operations
  689.      }                                  required to start
  690. packet
  691.                                         processing
  692.  
  693.      mib->mib_look()
  694. -->  look for variable instance,
  695.                                                   check
  696. access, check value,
  697.                                         pass handle back
  698.       if (handle != 0) {
  699.           store mib, handle, index triplet
  700.      }
  701. }
  702.  
  703. for(all triplets){
  704.      mib->mib_set(DO_PHASE1, handle, index) -->   check
  705. consistency, reserve
  706. }
  707. resources
  708.  
  709. for(all triplets){
  710.      mib->mib_set(DO_COMMIT, handle, index) -->   perform
  711. commit
  712. }
  713. for(all triplets in reverse order){
  714.      mib->mib_set(DO_RELEASE, handle, index) -->  release
  715. resources
  716. }
  717.  
  718. for(all mibs for particular entity){
  719.      if(not referenced){
  720.           continue;
  721.      }
  722.      mib->mib_indicate(END) -                          ---->
  723. perform all operations
  724. }
  725. required to end packet
  726.  
  727. processing
  728. build response packet and
  729. return a packet pointer to the
  730. communications layer
  731.  
  732. 2.3  Message Types
  733.  
  734. For external MIB servers, there are corresponding request
  735. and response messages for each of the primitives listed
  736. above.  The set of messages is defined in a later section.
  737.  
  738. 3  ERROR CODES AND PSEUDO-TYPES
  739.  
  740. The Open Agent architecture defines a consistent set of
  741. intermediate error codes used throughout the agent. Below is
  742. the description of the error-codes applicable to the core-
  743. agent-to-MIB-server interface.
  744.  
  745. The Open Agent architecture uses an extended set of types
  746. internally.  This set of types includes the base set of
  747. types defined by SMI and pseudo-types. The pseudo-type is a
  748. subtype of the base type which requires additional
  749. processing from the core agent.
  750.  
  751. There is just a single pseudo-type defined currently:
  752. WESA_TYPE_UINT32V1.  There are some SNMPv1 mibs which use
  753. objects of type INTEGER (0...4294967295). The value of this
  754. type must be encoded in 5 bytes if it is greater than or
  755. equal to 0x80000000. WESA_TYPE_UINT32V1, defined as (0x100 |
  756. WESA_TYPE_INTEGER), gives the core agent the information
  757. required for appropriate encoding in this specific case.
  758.  
  759. Extended-type encoding is straightforward: the SMI type is
  760. encoded in byte 0 (LSB) of the extended type, and byte 1 is
  761. used to provide the core agent with additional information.
  762. If byte 1 is 0 then this is a basic SMI type, otherwise it
  763. is a pseudo-type.  See section 4.2.3 for precise
  764. descriptions of where and how extended types are used.
  765.  
  766. If some undefined extended type is returned to the core
  767. agent, the agent generates  genErr for delivery to the NMS.
  768. The core agent performs no conversions of SNMPv2 SMI types
  769. to SNMPv1 SMI types. It is the responsibility of the MIB
  770. server to use types in accordance with the version of the
  771. request packet being processed.
  772.  
  773. 3.1  Intermediate Error Codes: Core-Agent-to-MIB-Server
  774. Interface.
  775.  
  776. WESA_ERR_INTERNAL--  the core agent will perform
  777. indicate(END) primitive for all namespaces already touched
  778. in the current packet processing and will drop processing of
  779. the request without any other action. This is meant as a
  780. hook for non-native proxies and multi-threaded
  781. implementations and should hardly ever be used in WinSNMP.
  782.  
  783. WESA_ERR_NOERROR                   -- same as SNMPv2 noError
  784. WESA_ERR_GENERR                    -- same as SNMPv2 genErr
  785. WESA_ERR_WRONGTYPE            -- same as SNMPv2 wrongType
  786. WESA_ERR_WRONGLENGTH               -- same as SNMPv2
  787. wrongLength
  788. WESA_ERR_WRONGVALUE           -- same as SNMPv2 wrongValue
  789. WESA_ERR_NOCREATION           -- same as SNMPv2 noCreation
  790. WESA_ERR_NOACCESS             -- same as SNMPv2 noAccess
  791. WESA_ERR_INCONSISTENTVALUE         -- same as SNMPv2
  792. inconsistentValue
  793. WESA_ERR_RESOURCEUNAVAILABLE  -- same as SNMPv2
  794. resourceUnvailable
  795. WESA_ERR_NOTWRITABLE               -- same as SNMPv2
  796. notWritable
  797. WESA_ERR_INCONSISTENTNAME          -- same as SNMPv2
  798. inconsistentName
  799. WESA_ERR_NOSUCHOBJECT              -- there is no object
  800. which can be matched to the requested name with max_access
  801. != non-accessible and either request type is Get, GetNext or
  802. Get-Bulk, or request version is SNMPv1 or requested name is
  803. mapped in by the current view.
  804. WESA_ERR_NOSUCHINSTANCE       -- there is no matching
  805. instance for a requested name and such an instance cannot be
  806. created in the case of a set operation and the
  807. requested/found name is mapped in by the current view
  808. WESA_ERR_OBJECT_MAPPED_OUT         -- there is no matching
  809. object with max_access !=non-accessible for current request.
  810.  
  811.  
  812. WESA_ERR_NAME_NOT_DETECTED         -- this error is
  813. equivalent of genErr and is used by implementations with
  814. overlapped namespaces. TheMIB server must return this code
  815. when a generic error occurred before the MIB server
  816. detected if the requested name is included in thecurrent
  817. namespeace.
  818.  
  819. 3.2  Error Processing and Reporting
  820.  
  821. Any error not listed below for a particular case is an
  822. "unexpected error." For example, the error value 1002345 is
  823. an unexpected one for any case, and the error
  824. WESA_ERR_BADVALUE is an unexpected one for SNMPv1
  825. GetRequest. Unexpected error codes returned for a particular
  826. environment are translated to genErr by the core agent. The
  827. next subsections of this section will describe error
  828. translation performed by the core agent for each
  829. environment.
  830.  
  831. In all cases, WESA_ERR_NAME_NOT_DETETCTED and
  832. WESA_ERR_INTERNAL are acceptable and expected error codes.
  833.  
  834. 3.2.1  Look Primitive
  835.  
  836. 3.2.1.1  SNMPv2 GetRequest
  837. WESA_ERR_NOERROR             noError, core agent will create
  838. a varbind
  839. using returned type and value in the output
  840. packet
  841. WESA_ERR_GENERR     genErr
  842. WESA_ERR_NOSUCHOBJECT
  843.  
  844. WESA_ERR_OBJECT_MAPPED_OUT    noError,  core agent will
  845. create a varbind with value noSuchObject in the output
  846. packet
  847. WESA_ERR_NOSUCHINSTANCE
  848.  
  849. WESA_ERR_INSTANCE_MAPPED_OUT  noError, core agent will
  850. createa varbind with value noSuchInstancein the output
  851. packet
  852.  
  853. 3.2.1.2  SNMPv2 GetNextRequest and GetBulkRequest
  854.  
  855. WESA_ERR_NOERROR    noError, core agent will createa varbind
  856. using returned type andvalue in the output packet
  857. WESA_ERR_GENERR     genErr
  858. WESA_ERR_NOSUCHOBJECT
  859. WESA_ERR_OBJECT_MAPPED_OUT
  860. WESA_ERR_NOSUCHINSTANCE
  861. WESA_ERR_INSTANCE_MAPPED_OUT  (a) If there are namespaces
  862. left unprocessedcore agent will continue search in thenext
  863. namespaces, otherwise(b) noError, core agent will createa
  864. varbind with value endOfMibViewin the output packet
  865.  
  866. 3.2.1.3  SNMPv2 SetRequest
  867.  
  868. WESA_ERR_NOERRORr   noErro
  869. WESA_ERR_GENERR     genErr
  870. WESA_ERR_WRONGTYPE  wrongType
  871. WESA_ERR_WRONGLENGTH     wrongLength
  872. WESA_ERR_WRONGVALUE wrongValue
  873. WESA_ERR_NOCREATION noCreation
  874.  
  875. WESA_ERR_INCONSISTENTVALUE    inconsistentValue
  876. WESA_ERR_RESOURCEUNAVAILABLE  resourceUnvailable
  877. WESA_ERR_NOTWRITABLE     notWritable
  878. WESA_ERR_INCONSISTENTNAME     inconsistentName
  879. WESA_ERR_NOSUCHOBJECT
  880. WESA_ERR_NOSUCHINSTANCE
  881. WESA_ERR_NOCREATION
  882. noCreation
  883. WESA_ERR_OBJECT_MAPPED_OUT
  884. WESA_ERR_INSTANCE_MAPPED_OUT
  885. WESA_ERR_NOACCESS
  886. noAccess
  887.  
  888.  
  889. 3.2.1.4  SNMPv1 GetRequest and GetNextRequest
  890.  
  891. WESA_ERR_NOERROR    noError, core agent will create a
  892. varbind using returned type and value in the output packet
  893. WESA_ERR_GENERR     genErr
  894. WESA_ERR_NOSUCHOBJECT
  895. WESA_ERR_OBJECT_MAPPED_OUT
  896. WESA_ERR_NOSUCHINSTANCE
  897. WESA_ERR_INSTANCE_MAPPED_OUT
  898.      noSuchName
  899.  
  900.  
  901. 3.2.1.5  SNMPv1 SetRequest
  902. WESA_ERR_NOERROR    noError
  903. WESA_ERR_GENERR     genErr
  904. WESA_ERR_WRONGTYPE
  905. WESA_ERR_WRONGLENGTH
  906. WESA_ERR_WRONGVALUE
  907. WESA_ERR_INCONSISTENTVALUE
  908. badValue
  909. WESA_ERR_RESOURCEUNAVAILABLE  genErr
  910. WESA_ERR_NOCREATION
  911. WESA_ERR_NOTWRITABLE
  912. WESA_ERR_INCONSISTENTNAME
  913. WESA_ERR_NOSUCHOBJECT
  914. WESA_ERR_NOSUCHINSTANCE
  915. WESA_ERR_OBJECT_MAPPED_OUT
  916. WESA_ERR_INSTANCE_MAPPED_OUT
  917. WESA_ERR_NOACCESS
  918. WESA_ERR_NOCREATION
  919.  
  920.  
  921. noSuchName
  922.  
  923. 3.3  Set Primitive
  924.  
  925. 3.3.1  DO_PHASE1
  926.  
  927. The same set of rules is applicable here as in the case of
  928. the look primitive in the same environment.
  929.  
  930. 3.3.2  UNDO_PHASE1, RELEASE
  931.  
  932. The return value and index value are ignored.
  933.  
  934. 3.3.3 SNMPv1 CMD_DO_COMMIT
  935.  
  936. The same set of rules is applicable here as in the case of
  937. the look primitive in the SNMPv1 SetRequest environment.
  938.  
  939. 3.4  SNMPv1 CMD_UNDO_COMMIT
  940.  
  941. The return value and index value are ignored.
  942.  
  943. 3.5 SNMPv2 CMD_DO_COMMIT/CMD_UNDO_COMMIT
  944.  
  945. The same set of rules is applicable here as in case of the
  946. look primitive in the SNMPv2 SetRequest environment, if all
  947. CMD_DO_COMMIT calls return WESA_ERR_NOERROR. Otherwise the
  948. core agent stores the index passed back by the failed
  949. set(CMD_DO_COMMIT). If all subsequent CMD_UNDO_COMMIT calls
  950. return WESA_ERR_NOERROR, then the core agent generates
  951. commitFailed and error-index is set equal to the stored
  952. index value. Otherwise the core agent generates undoFailed
  953. with error-index 0.
  954.  
  955. 4    FUNCTION-CALL INTERFACES FOR LOADABLE MIB SERVERS
  956.  
  957. This section describes the basic structures and primitives
  958. used in the core-agent-to-MIB-server interface when the MIB
  959. server is implemented as a loadable MIB server.
  960.  
  961. 4.1  Basic Structures
  962.  
  963. 4.1.1  The mib structure
  964.  
  965. The mib is the basic structure of the interface. To be
  966. accessible to the core agent, each mib namespace mounted
  967. under the agent must be represented by a single entry in a
  968. doubly-linked list of mib elements.
  969.  
  970. struct mib {
  971.      struct mib FAR *mib_prev;
  972.      struct mib FAR *mib_next;
  973.      struct mib_server FAR *mib_server;
  974.      INT32  mib_state;
  975.      OID    mib_low_bound[MIB_BOUND_LEN];
  976.      INT32  mib_low_bound_len;
  977.      OID    mib_hi_bound[MIB_BOUND_LEN];
  978.      INT32  mib_hi_bound_len;
  979.      UINT32 mib_specific;
  980.      UINT32 mib_priority;
  981.      UINT32 (FAR PASCAL *mib_init)(const struct mib FAR *);
  982.      BOOL   (FAR PASCAL * *mib_indicate)(INT32, UINT32,
  983. INT32,
  984.                         INT32, BOOL, INT32, INT32, void FAR
  985. *,
  986.                         const struct mib FAR *);
  987.      INT32  (FAR PASCAL *mib_look)(LPOID, LPINT32, INT32,
  988. LPUINT8
  989.                          FAR *, LPUINT16, LPINT32, LPUINT32,
  990.                          const struct mib FAR *);
  991.      INT32  (FAR PASCAL *mib_set)(INT32, UINT32, LPINT32,
  992.                          const struct mib FAR*);
  993.      void   (FAR PASCAL *mib_tick)(UINT32, const struct mib
  994. FAR *);
  995.      UINT8  mib_entity[MAX_ENTITY_LEN];
  996.      INT32  mib_entity_len;
  997.      INT32  mib_flag;
  998. };
  999.  
  1000.  
  1001. mib_prev and mib_next -- are pointers to the previous and
  1002. next mib structures in the list.  NULL means that this
  1003. structure is the first or final one in the list.
  1004.  
  1005.  mib_server -- is a pointer to the structure defining the
  1006. MIB server which accesses the namespace that this mib
  1007. structure defines.
  1008.  
  1009. mib_state -- describes the current state of the namespace
  1010. represented by this mib structure. The core agent maintains
  1011. one of several legal values in mib_state, including:
  1012.  
  1013. ·  namespace is loaded, but it's inactive and can't be used:
  1014.   mib functions can't be called.
  1015. ·  namespace is loaded and active: mib functions can be
  1016.   called.
  1017. ·  namespace is loaded but disabled by the core agent due to
  1018.   some malfunction discovered by the core agent: mib
  1019.   functions can't be called.
  1020.  
  1021. mib_low_bound -- is the low boundary of the namespace
  1022. represented by and subsumed under this mib entry. The core
  1023. agent looks at mib_low_bound to decide which active MIB
  1024. server should be called to get or set each variable in the
  1025. current request. If name belongsto the namespace it must be
  1026. lexicographically greater than or equal to the namespace's
  1027. mib_low_bound.
  1028.  
  1029. mib_low_bound_len -- is the length of mib_low_bound.
  1030.  
  1031. mib_high_bound -- the high bound of the namespace
  1032. represented by this mib entry. The core agent uses
  1033. mib_high_bound and mib_low_bound to detect whether the
  1034. namespace of a newly-mounted MIB server overlaps the
  1035. namespace of any other MIB server. If name belongs to a
  1036. namespace, then it must be lexicographically less than that
  1037. namespace's mib_high_bound.
  1038.  
  1039. mib_high_bound_len -- the length of mib_high_bound.
  1040.  
  1041. mib_specific -- used by MIB-server code in some server--
  1042. specific way. For, example, the value of mib_specific
  1043. (returned by init(), stored by the core agent, and then made
  1044. visible to the MIB server on each subsequent call) is the
  1045. only way an external MIB server  supporting several entities
  1046. and/or namespaces can detect what entity and namespace is
  1047. referenced in the current invocation. It is the
  1048. responsibility of the MIB server to return some useful value
  1049. from the mib_init() function which the core agent will then
  1050. store into mib_specific.
  1051.  
  1052. mib_priority -- used by MIB servers handling overlapping
  1053. namespaces. The highest priority is 0; a namespace with this
  1054. priority cannot be overlapped with any other namespace.
  1055. Normal priority is 1000.
  1056.  
  1057. mib_init -- pointer to the init primitive function in the
  1058. MIB server for the namespace represented by this mib
  1059. element.  mib_init() returns 0 on failure, else some non-
  1060. zero UINT32  value of interest only to the MIB server. The
  1061. core agent stores this value into mib_specific.
  1062.  
  1063. mib_indicate -- pointer to the indicate primitive function
  1064. in the MIB server for the namespace represented by this mib
  1065. element.  mib_indicate() returns FALSE on failure and TRUE
  1066. on success.
  1067.  
  1068. mib_look -- pointer to the look primitive function in the
  1069. MIB server for the namespace represented by this mib
  1070. element. mib_look() returns an error code on failure.
  1071.  
  1072. mib_set -- pointer to the set primitive function in the MIB
  1073. server for the namespace represented by this mib element.
  1074.  
  1075. mib_tick -- pointer to the tick primitive function in the
  1076. MIB server for the namespace represented by this mib
  1077. element.
  1078.  
  1079. mib_entity[] -- the local entity name.
  1080.  
  1081. mib_entity_len -- the length of mib_entity.
  1082.  
  1083. mib_flag -- used internally by the core agent.
  1084.  
  1085. 4.2  Function Definitions
  1086.  
  1087. The formal definitions of all core-agent-to-MIB-server
  1088. primitives are given below with reference to a fictitious
  1089. example namespace called the "abc" namespace. The agent
  1090. calls the functions by reference to a pointer in the MIB
  1091. server's mib structure, so the "name" is that of the
  1092. pointer, not the MIB server's actual function name. As we
  1093. said above, the actual name of the function is a matter of
  1094. choice for MIB server designer. We called them abc_xxxx just
  1095. to logically link the primitive and namespace.  The final
  1096. parameter of each primitive function call is a FAR pointer
  1097. to the mib entry itself which allows MIB-server access to
  1098. its mib entry.
  1099.  
  1100. 4.2.1  Init Primitive Function
  1101.  
  1102. Called by the core agent at the time the MIB server is
  1103. mounted and before any other primitives are called.
  1104.  
  1105. Syntax:
  1106.  
  1107. UINT32 FAR PASCAL abc_init(struct mib FAR * mib);
  1108.  
  1109. struct mib FAR * mib -- pointer to the mib entry itself
  1110. which allows MIB-server  access to its mib entry.
  1111.  
  1112. Returns:
  1113.  
  1114.  0 on failure and some UINT32 non-zero value on success. The
  1115. core agent stores this returned value in mib_specific for
  1116. later reference and  use by the MIB server. If the MIB
  1117. server returns zero, then this namespace  is marked inactive
  1118. and won't be referenced again. The return value is otherwise
  1119. not interpreted in any way by the core agent.
  1120.  
  1121. Description:
  1122.  
  1123. The core agent issues init at the time the MIB server is
  1124. mounted and before any other primitives are called.
  1125.  
  1126. 4.2.2  Indicate Primitive Function
  1127.  
  1128. Called by the core agent for each namespace to indicate the
  1129. start and end of processing for each received request
  1130. packet.
  1131.  
  1132. Syntax:
  1133.  
  1134. BOOL FAR PASCAL abc_indicate(
  1135.    INT32   cmd,
  1136.    UINT32  cid,
  1137.    INT32   version,
  1138.    INT32   rw,
  1139.    BOOL    exact,
  1140.    INT32   view_ind,
  1141.    INT32   curr_time,
  1142.    void    FAR *view_head,
  1143.    const   struct mib FAR *mib
  1144. );
  1145.  
  1146. cmd            -- CYCLE_INDICATE_START or CYCLE_INDICATE_END
  1147. cid                 -- cycle id
  1148. version        -- is either SNMPV1 or SNMPV2
  1149. rw               -- is either WESA_READ or  WESA_WRITE
  1150. exact               -- is either TRUE or FALSE
  1151. view_ind       -- is the index of the current view
  1152. curr_time      -- is either CURRENTTIME, RESTARTTIME or
  1153. CACHETIME
  1154. view_head      -- is the pointer to the current view list.
  1155.  
  1156. Returns:
  1157.  
  1158. indicate returns FALSE on failure and  TRUE on success. If
  1159. indicate returns failure, then the core agent disables the
  1160. MIB server, and all its mibs, and (if applicable) unload the
  1161. MIB server.
  1162.  
  1163. If indicate(START) returns FALSE, then the core agent will
  1164. respond to the NMS with error-status genError and error-
  1165. index pointing to the first variable in the packet which has
  1166. resides in the MIB server's namespace. If indicate(END)
  1167. returns FALSE, this does not affect the result of current
  1168. packet processing.But in both cases the core agent disables
  1169. all the MIBs represented by  this MIB server.
  1170.  
  1171. Description:
  1172.  
  1173. The core agent invokes the MIB server's indicate function
  1174. for each namespace when a request packet is delivered from
  1175. the communications layer, and before any other MIB-server
  1176. functions are invoked for that namespace and packet; and
  1177. when all the varbinds in that packet for each namespace have
  1178. been processed and no further MIB-server functions will be
  1179. called for that packet. The function intends to let each MIB
  1180. server synchronize on the arrival of packets and the end of
  1181. packet processing.
  1182.  
  1183. cmd takes the value CYCLE_INDICATE_START to signal the start
  1184. of packet processing and CYCLE_INDICATE_END to signal the
  1185. end of the current packet.
  1186.  
  1187. Recall that there may be several namespaces represented by a
  1188. single MIB server and therefore several instantions of that
  1189. MIB server in mib.  What happens in this case?  Imagine a
  1190. MIB server which represents two namespaces and which
  1191. therefore has two entries in mib: "abc_A" and "abc_B."
  1192. Suppose further that the order of variables in a GetRequest
  1193. pdu is as:
  1194.  
  1195.    abc_A_1, abc_A_2, abc_B_1, abc_A_3, abc_B_2
  1196.  
  1197. Processing will be as:
  1198.  
  1199. abc_A_indicate(START)    -- server is told of a new packet
  1200.                              referencing the abc_A
  1201. namespace.
  1202. abc_A_look(abc_A_1)      -- process GetRequest of abc_A_1;
  1203.                              abc_A_indicate(START) is
  1204. guaranteed to
  1205.                              be invoked before abc_A_look().
  1206. abc_A_look(abc_A_2)      -- process GetRequest of abc_A_2.
  1207. abc_B_indicate(START)    -- core agent finds a reference to
  1208. the
  1209.                              abc_B namespace, again tells
  1210. server of
  1211.                              this packet.
  1212. abc_B_look(abc_B_1)      -- process GetRequest of abc_B_1;
  1213. again,
  1214.                         abc_B_indicate(START) is guaranteed
  1215. to
  1216.                         be invoked before abc_B_look().
  1217. abc_A_look(abc_A_3)
  1218. abc_B_look(abc_B_2)
  1219. abc_B_indicate(END)      -- the order of invocations to
  1220. abc_A_indicate(END)
  1221.                         abc_X_indicate(END) is
  1222. unpredictable, but it is
  1223.                         guaranteed that there will be  no
  1224. call to abc_X_look()
  1225.                         after any call  to
  1226. abc_X_indicate(END) for any
  1227. namespace.
  1228.  
  1229. In order to distinguish the very first call (and the very
  1230. beginning of the packet processing) cid is used. This 32-bit
  1231. unsigned never-0 value which will never be 0, this value is
  1232. incremented by the core agent for every packet processed. It
  1233. wraps on overflow, skipping 0 in the process. The MIB-server
  1234. can thus detect the very beginning of the packet. The same
  1235. value is used by the core-agent to detect packets delivered
  1236. after timeout.
  1237.  
  1238. rw and exact together tell the MIB server what request is
  1239. present in this packet. If rw is WESA_READ and exact is
  1240. TRUE, then the request is GET; if rw is WESA_READ and exact
  1241. is FALSE, then the request is GET-NEXT or GET-BULK. if  rw
  1242. is WESA_WRITE, then the request is SET and exact is always
  1243. TRUE and may be ignored.
  1244.  
  1245. 4.2.3  Look Primitive Function
  1246.  
  1247. Invoked for all MIB-access operations.
  1248.  
  1249. Syntax:
  1250.  
  1251. INT32 FAR PASCAL abc_look(
  1252.    LPOID    name,
  1253.    LPINT32  namelen,
  1254.    INT32    index,
  1255.    LPUINT8  FAR *pval,
  1256.    LPUINT16 type,
  1257.    LPINT32  len,
  1258.    LPUINT32 ph,
  1259.    const struct mib FAR  *mib
  1260. );
  1261.  
  1262. Get Transaction:
  1263. name      -- requested name
  1264. namelen   -- pointer to its length
  1265. index     -- of current variable (ignored)
  1266. pval           -- *pval will point to unencoded value upon
  1267. return
  1268. type      -- *type will contain extended type of variable
  1269. found upon return
  1270. len            -- *len  will contain length of variable
  1271. value upon return
  1272. ph        -- ignored
  1273.  
  1274. Next Transaction:
  1275. name      -- requested name upon return will contain the
  1276. found name
  1277. namelen   -- pointer to its length
  1278. index     -- of current variable (ignored)
  1279. pval           -- *pval will point to unencoded value on
  1280. return
  1281. type      -- *type will contain extended type of variable
  1282. found
  1283. len            -- *len  will contain length of variable
  1284. value
  1285. ph        -- ignored
  1286.  
  1287. Write Transaction:
  1288. name      -- name of variable
  1289. namelen   -- pointer to its length
  1290. index          -- of current variable, can be stored for
  1291. following use
  1292. pval           -- *pval points to unencoded value.
  1293. type      -- type  points to the ASN type of value (*)
  1294. len            -- len   points to the length of value (**)
  1295. ph        -- *ph   will contain the non-zero handle upon
  1296. return at MIB server's choice
  1297.  
  1298. Returns:
  1299.  
  1300. The value returned by look() is either WESA_ERR_NOERROR for
  1301. success or some error code from Section 3. If this return
  1302. value is an error code, then the core agent discards the
  1303. other values passed back by the MIB server.
  1304.  
  1305. Description:
  1306.  
  1307. The look function is invoked for all MIB-access operations:
  1308. GetRequest, GetNextRequest, GetBulkRequest, and SetRequest.
  1309. The core agent communicates the type of transaction called
  1310. out in the request packet in the invocation of indicate(),
  1311. so the transaction type isn't repeated in the look()
  1312. invocation.  The MIB server has to support instance-level
  1313. granularity while calculating access rights for the
  1314. particular name in all cases.
  1315.  
  1316. Notes:
  1317.  
  1318. (*) The SMI type is used here, not an extended type. It is
  1319. the responsibility of the MIB-server designer to provide
  1320. appropriate handling for the case if pseudo-type is used by
  1321. variables of this MIB-server.
  1322.  
  1323. (**) If *len == -1 then  some error was detected during
  1324. value decoding.
  1325.  
  1326. 4.2.4  Set Primitive Function
  1327.  
  1328. Used to set variables.
  1329.  
  1330. Syntax:
  1331.  
  1332. INT32 FAR PASCAL abc_set(
  1333.     INT32   cmd,
  1334.     UINT32  hand,
  1335.     LPINT32 pind,
  1336.     const struct mib FAR *mib
  1337. );
  1338.  cmd    -- can take five values: CMD_DO_PHASE1,
  1339. CMD_UNDO_PHASE1,
  1340.                CMD_DO_COMMIT, CMD_UNDO_COMMIT,
  1341. CMD_DO_RELEASE
  1342.  
  1343. handle  -- non-zero handle returned by MIB server's look
  1344. primitive
  1345.  
  1346. index   -- points to the variable for which the MIB server
  1347. returned a non-zero.
  1348.  
  1349. Returns:
  1350.  
  1351. Return values of this function are described in the section
  1352. 3.
  1353.  
  1354.  
  1355. Description:
  1356.  
  1357. Described in detail in  section 3.
  1358. 4.2.5  Tick Primitive Function
  1359.  
  1360. Informs the MIB server of the passage of time.
  1361.  
  1362. Syntax:
  1363. void FAR PASCAL party_tick(UINT32 cid, const struct mib FAR
  1364. *mib)
  1365.  
  1366. cid      -- holds a   non-zero 32-bit value incremented by
  1367. one  before each functioninvocation.
  1368. Returns:
  1369.  
  1370. Nothing.
  1371.  
  1372. Description:
  1373.  
  1374. The core agent invokes the tick function once every few
  1375. (nominally ten) seconds between packets to allow the MIB
  1376. server to perform any needed time-related functions. The
  1377. tick function is never called while any packet is being
  1378. processed, but only between request packets.
  1379.  
  1380. 5  MESSAGE-PASSING INTERFACE FOR EXTERNAL MIB SERVERS
  1381.  
  1382. This section describes the invocation of primitives as it's
  1383. realized for external MIB servers. The message-passing
  1384. mechanism between a WinSNMP core agent and external MIB
  1385. servers uses a combination of native MS-Windows messaging
  1386. and shared memory.
  1387.  
  1388. 5.1 Combined Message/Shared-Memory Mechanism
  1389.  
  1390. All WinSNMP agent message exchanged between the WinSNMP
  1391. Agent and its external MIB servers have the following
  1392. format:
  1393.  
  1394. struct defWinSNMPMsg {
  1395.      WHND     hWnd;              /* handle of receiving
  1396. window   */
  1397.      WORD     wMessageType;      /* RegisterWindowMessage(
  1398.  
  1399. "WinSNMPAgentMessageType")   */
  1400.      WORD     wParam;            /* WESA_<message sub-type>
  1401. */
  1402.      LONG     lParam;            /* HIWORD=shared memory
  1403. handle  */
  1404.                                  /* LOWORD=sending window
  1405. handle */
  1406. };
  1407.  
  1408.  
  1409. 5.1.1 WinSNMP Agent Windows Message Type
  1410.  
  1411. There is one type for all WinSNMP Agent messages exchanged
  1412. between the core agent and external MIB servers via
  1413. PostMessage and SendMessage. This messages type is
  1414. determined dynamically on each system by issuing:
  1415.  
  1416. WORD wMessageType =
  1417. RegisterWindowMessage("WinSNMPAgentMessageType");
  1418.  
  1419. 5.1.2  WinSNMP Agent Message Sub-Type
  1420.  
  1421. There is a constant message sub-type for each interface
  1422. primitive's message and its correspondent response:
  1423.  
  1424.      Primitive      Primitive Invocation          Primitive
  1425. Response
  1426.           --------------------------------------------------
  1427. -------------------------------------------
  1428.      init()         WESA_INIT_REQ       WESA_INIT_RSP
  1429.      indicate()     WESA_INDICATE_REQ
  1430. WESA_INDICATE_RSP
  1431.      look()         WESA_LOOK_REQ       WESA_LOOK_RSP
  1432.      set()          WESA_SET_REQ        WESA_SET_RSP
  1433.      tick()         WESA_TICK_REQ       WESA_TICK_RSP
  1434.  
  1435. The message sub-type is passed in the wParam of all WinSNMP
  1436. Agent windows messages.
  1437.  
  1438. 5.1.3. Shared Memory Areas
  1439.  
  1440. There are three shared-memory areas involved in exchanges of
  1441. information between the WinSNMP core agent and its
  1442. correspondent external MIB Servers, known as Areas
  1443. B, C and D:
  1444.  
  1445. ·  Area B is used to store the list of views known to the
  1446.   system. The actual layout of this
  1447.   area is Agent Core implementation specific and is not
  1448.   seen by the MIB servers.
  1449. ·  Area C is used by the core agent as a link area for core-
  1450.   agent-to-MIB-server transactions.
  1451. ·  Area D is used by the MIB server as a link area for MIB-
  1452.   server-to-core-agent transactions.
  1453.  
  1454. The MIB-server never writes in areas B and C; the MIB server
  1455. writes only into Area D. The core-agent never writes into
  1456. Area D but only into Areas B and C.
  1457.  
  1458. The shared-memory areas are allocated from Global Heap and
  1459. are assumed to be moveable. The handle to the shared-memory
  1460. area is passed in the high order word of lParam in WinSNMP
  1461. Agent windows messages.
  1462.  
  1463. 5.1.4 Sending Window's Handle
  1464.  
  1465. Each message identifies the sending window's handle. This
  1466. handle issued to identify
  1467. the message source for response destination and message
  1468. context selection. The handle is
  1469. passed in the low-order word of the lParam in WinSNMP Agent
  1470. windows messages.
  1471.  
  1472. 5.1.5 Message Id
  1473.  
  1474. Each message sent in either direction (to the MIB server by
  1475. the core agent; or to the core agent by the MIB server) must
  1476. contain an individual Message ID. Message ID is the cycle
  1477. identifier (cid from indicate() primitive description
  1478. above). For all other messages it is a non-zero unsigned 32-
  1479. bit value assigned by the core agent. The message ID is
  1480. passed in the shared memory associated with message.
  1481.  
  1482. 5.2 Message and Data Structures
  1483.  
  1484. The messaging mechanism in this section is a direct mapping
  1485. of the functional interface described above, so this section
  1486. will not repeat any general information about the primitives
  1487. themselves.
  1488.  
  1489. In the diagrams below, we place the core agent on the left
  1490. side of the page and the MIB server on the right.
  1491.  
  1492. Agent                <Message>                    MIB Server
  1493. ====
  1494. =========
  1495. ------------------<message sent by agent>------------------>
  1496. <----------------<message sent by MIB Server>--------------
  1497.  
  1498. The full message format is
  1499.  
  1500. <hWnd><msg_type><msg_subtype><shared_area_hdl |
  1501. sending_window_hdl>
  1502.                                     (wParam)          (high
  1503. lParam)         (low lParam)
  1504.  
  1505. In the abbreviated diagrammatic message format used, only
  1506. the wParam as <message_subtype> and the high order lParam as
  1507. <shared_area_handle> appear as follows:
  1508. <message_subtype><shared_area_handle>
  1509.  (wParam)                   (high lParam)
  1510.  
  1511. 5.2.1 Init
  1512.  
  1513. Message Exchange:
  1514.  
  1515. --------------<WESA_INIT_REQ><Handle of shared area C>------
  1516. ----->
  1517. <--------------<WESA_INIT_RSP><Handle of shared area D>-----
  1518. ---------
  1519.  
  1520. Area C format :
  1521.  
  1522. Offset    Type           Contents
  1523. ------------------------------------------------------------
  1524. -------------------------------------
  1525. 0    UINT32         Message ID
  1526. 4    UINT32         Length of the Entity Name (0..32)
  1527. 8    UINT8[]        EntityName
  1528. 40   UINT32         Length of  namespace's low  boundary (in
  1529. OIDs)(2..20)
  1530. 44   OID[]          Low boundary
  1531. 124  UNIT32         Handle of shared area B (obsolete, will
  1532. be removed)
  1533. 128  UINT32         Current value of sysUpTime (obsolete,
  1534. will be removed)
  1535.  
  1536. Area D format:
  1537. Offset    Type           Contents
  1538. ------------------------------------------------------------
  1539. -------------------------------------------------
  1540. 0    UINT32         Message ID
  1541. 4    UINT32         Result of operation (will be stored in
  1542. mib_specific, see 4.2.1 above)
  1543.  
  1544. 5.2.2 Indicate
  1545.  
  1546. Message Exchange:
  1547.  
  1548. --------------<WESA_INDICATE_REQ><Handle of shared area C>--
  1549. --------->
  1550. <-------------<WESA_INDICATE_RSP><Handle of shared area D>--
  1551. ------------
  1552.  
  1553. Area C format :
  1554.  
  1555. Offset    Type      Contents
  1556. ------------------------------------------------------------
  1557. ----------
  1558. 0    UINT32         cycle-id
  1559. 4    UINT32         mib_specific
  1560. 8    UINT32         cmd
  1561. 12   UINT32         version
  1562. 16   UINT32         rw
  1563. 20   UINT32         exact
  1564. 24   UINT32         current view index
  1565. 28   UINTY32   current time domain
  1566. 32   UINT32         handle of shared area B (view list)
  1567.  
  1568. Area D format:
  1569. Offset    Type      Contents
  1570. -----------------------------------------------------
  1571. 0    UINT32         cycle-id
  1572. 4    UINT32         Result of operation
  1573.  
  1574. 5.2.3. Look
  1575.  
  1576. a) get transaction
  1577.  
  1578. Message Exchange:
  1579.  
  1580. --------------<WESA_LOOK_REQ><Handle of shared area C>------
  1581. ----->
  1582. <--------------<WESA_LOOK_RSP><Handle of shared area D>-----
  1583. ---------
  1584.  
  1585. Area C format :
  1586.  
  1587. Offset    Type      Contents
  1588. --------------------------------------------------------
  1589. 0    UINT32         message-id
  1590. 4    UINT32         mib_specific
  1591. 8    UINT32         name length (in OIDs)
  1592. 12   OID[]          name
  1593.  
  1594. Area D format:
  1595.  
  1596. Offset    Type      Contents
  1597. -----------------------------------------------------------
  1598. 0    UINT32         message-id
  1599. 4    UINT32         result of operation
  1600. 8    UINT32    value type
  1601. 12   UINT32         value length (unencoded)
  1602. 16   any       value (unencoded)
  1603.  
  1604. b) next transaction
  1605.  
  1606. Message Exchange:
  1607.  
  1608. --------------<WESA_LOOK_REQ><Handle of shared area C>------
  1609. ----->
  1610. <-------------<WESA_LOOK_RSP><Handle of shared area D>------
  1611. --------
  1612.  
  1613. Area C format :
  1614.  
  1615. Offset    Type      Contents
  1616. --------------------------------------------------------
  1617. 0    UINT32         message -id
  1618. 4    UINT32         mib_specific
  1619. 8    UINT32         name length (in OIDs)
  1620. 12   OID[]          name
  1621.  
  1622. Area D format:
  1623.  
  1624. Offset    Type      Contents
  1625. ------------------------------------------------------------
  1626. 0    UINT32         message-id
  1627. 4    UINT32         result of operation
  1628. 8    UINT32         name length (in OIDs)
  1629. 12   OID[]          name
  1630. 524  UINT32    value type
  1631. 528  UINT32         value length (unencoded)
  1632. 532  any       value (unencoded)
  1633.  
  1634.  
  1635. c) write transaction
  1636.  
  1637. Message Exchange:
  1638.  
  1639. --------------<WESA_LOOK_REQ><Handle of shared area C>------
  1640. ----->
  1641. <-------------<WESA_LOOK_RSP><Handle of shared area D>------
  1642. --------
  1643.  
  1644. Area C format:
  1645.  
  1646. Offset    Type      Contents
  1647. ------------------------------------------------------------
  1648. 0    UINT32         message-id
  1649. 4    UINT32         mib_specific
  1650. 8    UINT32         name length (in OIDs)
  1651. 12   OID[]          name
  1652. 524       UINT32         variable index
  1653. 528  UINT32    value type
  1654. 532  UINT32         value length (unencoded)
  1655. 536  any       value (unencoded)
  1656.  
  1657. Area D format:
  1658. Offset    Type      Contents
  1659. ----------------------------------------------------
  1660. 0    UINT32         message-id
  1661. 4    UINT32         result of operation
  1662. 8    UINT32         handle or 0
  1663.  
  1664. Note: the core agent communicates the type of the
  1665. transaction specified in the request packet in the
  1666. indicate(START) message so the transaction type isn't
  1667. repeated in the look() invocation.
  1668.  
  1669.  
  1670. 5.2.4. Set
  1671.  
  1672. Message Exchange:
  1673.  
  1674. --------------<WESA_SET_REQ><Handle of shared area C>-------
  1675. ---->
  1676. <--------------<WESA_SET_RSP><Handle of shared area D>------
  1677. --------
  1678.  
  1679. Area C format:
  1680.  
  1681. Offset    Type      Contents
  1682. -----------------------------------------------
  1683. 0    UINT32         message-id
  1684. 4    UINT32         mib_specific
  1685. 8    UINT32         cmd
  1686. 12   UINT32         handle
  1687. 16   UINT32         variable index
  1688.  
  1689. Area D format:
  1690. Offset    Type      Contents
  1691. ----------------------------------------------------
  1692. 0    UINT32         message-id
  1693. 4    UINT32         result of operation
  1694. 8    UINT32         variable index
  1695.  
  1696.  
  1697.  
  1698. 5.2.5 Tick
  1699.  
  1700. Message Exchange:
  1701.  
  1702. --------------<WESA_TICK_REQ><Handle of shared area C>------
  1703. ----->
  1704. <--------------<WESA_TICK_RSP><Handle of shared area D>-----
  1705. ---------
  1706.  
  1707. Area C format:
  1708.  
  1709. Offset    Type      Contents
  1710. -----------------------------------------------
  1711. 0    UINT32         tid
  1712. 4    UINT32         mib_specific
  1713. 8    UINT32         sysUpTime
  1714.  
  1715. Area D format:
  1716. Offset    Type      Contents
  1717. -----------------------------------------------
  1718. 0    UINT32         tid
  1719.  
  1720.  
  1721. 6  PROCEDURES FOR MOUNTING AND UNMOUNTING OF MIB SERVERS
  1722.  
  1723. 6.1  Loadable MIB Servers
  1724.  
  1725. Each loadable MIB server defines three functions:
  1726.  
  1727.    BOOL  FAR PASCAL  server_reg_init(char FAR *init_str);
  1728.    INT32 FAR PASCAL  server_reg_next(struct mib FAR *mib);
  1729.    void  FAR PASCAL  server_unreg(INT32 reason);
  1730.  
  1731. The function server_reg_init() performs all the operations
  1732. needed for the MIB server to mount itself.
  1733.  
  1734. init_str is initialization data for use at MIB-server
  1735. mounting time and which depends on the needs of the MIB
  1736. server. The value of init_str is retrieved by the core agent
  1737. from the configuration database, and this value is passed to
  1738. this function without any further processing. This value can
  1739. be the name of MIB server private configuration file or
  1740. anything else.  Note:  init_str is  not used by current
  1741. implementation, it will be apparently gone very soon.
  1742. Current implementation assumes that each loadable server is
  1743. smart enough to read its own .ini file without any help.
  1744.  
  1745. The server_reg_init() function returns FALSE on failure else
  1746. TRUE.
  1747.  
  1748. Upon successful invocation of server_reg_init(), the core
  1749. agent allocates a new mib structure entry and passes a
  1750. pointer to it as a parameter to function server_reg_next().
  1751. That function stores appropriate values in the following
  1752. members of the pointed mib_list entry: mib_low_bound,
  1753. mib_high_bound, mib_low_bound_len, mib_high_bound_len,
  1754. mib_priority, mib_init, mib_indicate, mib_look, mib_set,
  1755. mib_view, mib_tick, mib_entity, and mib_entity_len.
  1756.  
  1757. There are three legal return values from the function:
  1758.  
  1759. ·  MSR_SUCC on success, in which case the function is called
  1760.   again with a pointer to another newly-assigned mib_list
  1761.   entry;
  1762. ·  MSR_NOMORE if there are no further namespaces to
  1763.   register;
  1764. ·  MSR_ERROR on failure.
  1765.  
  1766. The function server_unreg causes the MIB server to perform
  1767. any operations needed to terminate its activities. The
  1768. reason parameter can take three value:
  1769.  
  1770. ·  MSU_NOMOUNT, meaning there is some overlapping namespace;
  1771. ·  MSU_COMMAND, meaning a command to unmount the MIB server
  1772.   was received;
  1773. ·  MSU_OTHER, meaning any other case.
  1774.  
  1775. 6.2  External MIB Servers
  1776.  
  1777. There are two ways the external MIB server can be brought to
  1778. life. It can be started by the core agent or it can be
  1779. started by the user as part of any application. The same
  1780. handshake procedure is used in either case.
  1781.  
  1782. 6.2.1 External MIB-Server Descriptor
  1783.  
  1784. Every external MIB server must initialize its namespaces and
  1785. allocate global shared memory area using its Server
  1786. Descriptor. The external MIB server needs to maintain its
  1787. descriptor in a consistent state while it is running. The
  1788. external MIB server change its descriptor, but these changes
  1789. have to be done atomically. The Server Descriptor has this
  1790. format:
  1791.  
  1792. Server Descriptor format:
  1793.  
  1794. Offset    Type Contents
  1795. 0    char Unique name of MIB server, null terminated
  1796. 80   char Description of MIB server, null terminated
  1797. 160  UINT32    Number of namespaces this MIB server will
  1798. handle
  1799. First namespace handled by this MIB server
  1800. 164  UINT32    mib_specific
  1801. 168  UINT32    mib_priority
  1802. 172  UINT32    Length of entity name
  1803. 176  UINT8[]   Entity name
  1804. 208  UINT32    Length of low boundary in OIDs
  1805. 212  OID[]     Low boundary
  1806. 292  UINT32    Length of high bound in OIDs
  1807. 296  OID[]     High boundary
  1808. Second namespace handled by this MIB server
  1809. 376  UINT32    mib_specific
  1810. Information for second and subsequent namespaces arranged as
  1811. for the first
  1812.  
  1813.  
  1814. 6.2.2 MIB-Server Handshake
  1815.  
  1816. The MIB Server initiates mounting upon startup and after any
  1817. changes to the MIB-Server descriptor.To do so it broadcasts
  1818. the following message:
  1819.  
  1820.     SendMessage(
  1821.         HWND_BROADCAST,
  1822.         wesa_msg_type,
  1823.         WESA_MIB_REG_REQ,
  1824.         MAKELONG(extMIBServerWindow, extMIBServerDescriptor)
  1825.    );
  1826.  
  1827. The lParam of this message contains the MIB server's window
  1828. handle in the LOWORD and the serverdescriptor handle in
  1829. HIWORD. If there is a core agent running in the system it
  1830. will respondby a sending message back to the server (while
  1831. processing the message received fthe rom server, similarto
  1832. DDE handshake):
  1833.  
  1834.     SendMessage(
  1835.         extMIBServerWindow,
  1836.         wesa_msg_type,
  1837.         WESA_MIB_REG_RSP,
  1838.         MAKELONG(coreAgentWindow, 0)
  1839.    );
  1840.  
  1841. The LOWORD of lParam in this message contains the core
  1842. agent's window handle.
  1843.  
  1844. If  the MIB server terminates, it posts a message to the
  1845. core agent:
  1846.  
  1847.     PostMessage(
  1848.         coreAgentWindow,
  1849.         wesa_msg_type,
  1850.         WESA_MIB_REG_ABORT,
  1851.         MAKELONG(extMibServerWindow, 0)
  1852.     );
  1853.  
  1854. The LOWORD of lParam in this message contains the MIB
  1855. server's window handle.
  1856.  
  1857. 6.2.3  Core Agent Handshake
  1858.  
  1859. The core agent has to broadcasts the following message upon
  1860. start up:
  1861.  
  1862.     SendMessage(
  1863.         HWND_BROADCAST,
  1864.         wesa_msg_type,
  1865.         WESA_AGENT_REG_REQ,
  1866.         MAKELONG(coreAgentWindow, 0)
  1867.    );
  1868. The LOWORD of lParam in this message contains the core
  1869. agent's window handle.
  1870.  
  1871. Each external MIB server running in the system it responds
  1872. by sending a message back to the core-agent (while
  1873. processing the message received from the core-agent, similar
  1874. to DDE handshake):
  1875.  
  1876.     SendMessage(
  1877.         coreAgentWindow,
  1878.         wesa_msg_type,
  1879.         WESA_AGENT_REG_RSP,
  1880.         MAKELONG(extMIBServerWindow, extMIBServerDescriptor)
  1881.    );
  1882.  
  1883. The lParam of this message contains the server's window
  1884. handle in the LOWORD and the server
  1885. descriptor handle in HIWORD.
  1886.  
  1887. If the core agent is unable to mount a MIB server; or wishes
  1888. to unmount a MIB-server for some reason, it either sends or
  1889. posts the following message:
  1890.  
  1891.     SendMessage(
  1892.         extMIBServerWindow,
  1893.         wesa_msg_type,
  1894.         WESA_AGENT_REG_ABORT,
  1895.         MAKELONG(coreAgentWindow, reason)
  1896.     );
  1897.  
  1898.     PostMessage(
  1899.         extMIBServerWindow,
  1900.         wesa_msg_type,
  1901.         WESA_AGENT_REG_ABORT,
  1902.         MAKELONG(coreAgentWindow, reason)
  1903.     );
  1904.  
  1905. The LOWORD of lParam in this message contains the core
  1906. agent's window handle; the HIWORD of  lParam in this message
  1907. contains the reason for unmounting, where reason can be:
  1908.  
  1909. ·  MSU_NOMOUNT, meaning there is some overlapping namespace;
  1910. ·  MSU_COMMAND, meaning a command to unmount the MIB server
  1911.   was received;
  1912. ·  MSU_OTHER, meaning any other case.
  1913.  
  1914. 6.3 Core Agent Mutual Exclusion
  1915.  
  1916. Upon startup, the core agent must check that there are no
  1917. other WESA agents running in the system. To do so it
  1918. broadcasts the following message:
  1919.  
  1920.      SendMessage(
  1921.          HWND_BROADCAST,
  1922.          wesa_msg_type,
  1923.          WESA_AGENT_EXCL_REQ,
  1924.          MAKELONG(coreAgent1WindowHandle, 0)
  1925.      );
  1926.  
  1927. If  there is such an agent running in the system, it sends a
  1928. message back (while processing this message, in DDE
  1929. handshake style):
  1930.  
  1931.      SendMessage(
  1932.          coreAgent1WindowHandle,
  1933.          wesa_msg_type,
  1934.          WESA_AGENT_EXCL_RSP,
  1935.          MAKELONG(coreAgent2WindowHandle, 0)
  1936.      );
  1937.  
  1938. If the core agent receives the message WESA_AGENT_EXCL_RSP
  1939. it must terminate.
  1940.  
  1941.  
  1942. 7   DECLARATIONS
  1943.  
  1944. <to be added>
  1945.  
  1946. 8   OTHER ISSUES
  1947.  
  1948. This  section describes the execution environment of MIB
  1949. servers and the integration of WinSNMP/Agent with DMTF.
  1950.  
  1951. 8.1  Common services
  1952.  
  1953. There are several common services provided with the core
  1954. agent, outlined below.
  1955.  
  1956. 8.1.1  OID Comparison
  1957.  
  1958. The compare() function compares two oids.
  1959.  
  1960. INT32 FAR PASCAL compare(
  1961.      LPOID name1,
  1962.      INT32 len1,
  1963.      LPOID name2,
  1964.      INT32 len2
  1965. );
  1966.  
  1967. The function returns 1 if name1 is lexically greater than
  1968. name2; returns 0 if names are the same; and returns -1
  1969. otherwise.
  1970.  
  1971. 8.1.2  Views
  1972.  
  1973. INT32 FAR PASCAL check_view(
  1974.     LPOID  name,
  1975.     INT32  known_len,
  1976.     INT32  total_len,
  1977.     void   FAR *view_list,
  1978.     INT32  view_ind
  1979. );
  1980.  
  1981. This function evaluates whether a name is mapped into or out
  1982. of the view represented by view_ind and view_list.  Name is
  1983. the name in question, total_len is the total length of the
  1984. name, known_len is the length of the part of the name which
  1985. is known currently. For example, total_len can be the length
  1986. of the variable name including the index part; and known_len
  1987. can be the length of the object part of the name. View_list
  1988. is a pointer to the list of view entries to be used.
  1989. View_index is the index  of the view of interest. This
  1990. function returns CHV_YES if the name is mapped into the
  1991. view; CHV_NO if the name is mapped out of the view; and
  1992. CHV_MAYBE if there is not enough information to detect
  1993. whether it is mapped in or out.
  1994.  
  1995. There is a variant of this function intended for use by
  1996. external MIB servers.
  1997.  
  1998. INT32 FAR PASCAL check_view_sh(
  1999.     LPOID   name,
  2000.     INT32   known_len,
  2001.     INT32   total_len,
  2002.     HGLOBAL view_list_h,
  2003.     INT32   view_ind
  2004. );
  2005.  
  2006. The only difference between these two functions is that, in
  2007. the second case, the handle of the view list head
  2008. is used instead of a pointer to the view head.
  2009.  
  2010. 8.1.3  RowStatus State Machine
  2011.  
  2012. There is also a RowStatus state machine provided by the core
  2013. agent.
  2014.  
  2015. INT32 FAR PASCAL _export rs_machine(
  2016.     BOOL     new_entry,
  2017.     LPINT32  new_status,
  2018.     INT32    status_index,
  2019.     INT32    old_status,
  2020.     BOOL     consistent,
  2021.     INT32    cons_index,
  2022.     LPINT32  pind,
  2023.     LPUINT32 tmout
  2024. );
  2025.  
  2026. This function returns an intermediate error code for the
  2027. current operation in accord with the RowStatus transition
  2028. table from RFC 1443.
  2029.  
  2030. New_entry is FALSE if the current operation is a
  2031. modification of an existing entry, otherwise it is TRUE. If
  2032. the status element is provided within the current packet,
  2033. then *new_status is equal to this value on input; otherwise
  2034. *new_status is equal to the old value of the status element
  2035. on input. *new_status is the new value of the status element
  2036. on output, which can be different from the value provided in
  2037. the packet (CreateAndGo -> active) or different from the old
  2038. value (notInService -> notReady). If the status element is
  2039. provided within the current packet, then status_index is its
  2040. index in the packet, otherwise it is 0. Old_status is the
  2041. old value of the status element if this is a modification of
  2042. an existing row, otherwise ignored. Consistent is TRUE if
  2043. the rest of the new row's values (except status element) are
  2044. consistent, otherwise it is FALSE.  If consistent is FALSE
  2045. and the inconsistency is related to any of the variables
  2046. (except status element) in the current packet cons_index is
  2047. the index of this variable otherwise it is 0. *pind is the
  2048. value of the index of the first row variable in the current
  2049. packet and, on output, *pind is the value of error-index.
  2050. *tmout contains the time when this row should be discarded
  2051. due to time-out in notInService or notReady status.
  2052.  
  2053. 8.1.4  Time Service
  2054.  
  2055. There is a time service provided by agent, which give both
  2056. UNIX-like time and sysUpTime values available to every MIB
  2057. server.
  2058.  
  2059. UINT32 FAR PASCAL wesa_time(void)
  2060.  
  2061. UINT32 FAR PASCAL wesa_up_time(void)
  2062.  
  2063. 8.1.5  Traps
  2064.  
  2065. There are two key elements in trap sending: the
  2066. trap_register function and the trap data block.Any component
  2067. of the WESA subsystem can send a trap by calling the
  2068. trap_register function:
  2069.  
  2070. BOOL FAR PASCAL trap_register(
  2071.     INT32  tclass,
  2072.     UINT32 trap,
  2073.     UINT32 specific,
  2074.     UINT32 data
  2075. );
  2076.  
  2077. Data for non-generic (non-well known) traps are provided in
  2078. the form of a trap data block.
  2079. This block is allocated from shared memory by the element
  2080. sending the trap.
  2081. Shared memory is freed by the caller once the trap is sent.
  2082. The trap data block has the following format:
  2083.  
  2084. Offset    Type Value     Description
  2085. 0    UINT32         trap_oid_len   length of next field
  2086.      4             OID[]          trap_oid       SNMPv1:
  2087.                          enterprise,
  2088. SNMPv2: trap name
  2089. 4+trap_oid_len*4    UINT32         trap_var_num   number of
  2090. trap vars
  2091. 8+trap_oid_len*4    struct trap_var[]   trap_vars arry of
  2092. trap vars
  2093.  
  2094. Where struct trap_var is defined as :
  2095.  
  2096. #define MAX_TRAP_VAR_OID 32   /* should be OK for next 15
  2097. years */
  2098. #define MAX_TRAP_VAL_LEN 256  /* more than enough */
  2099. struct trap_var {
  2100.     OID     tv_name[MAX_TRAP_VAR_OID];
  2101.     INT32   tv_name_len;
  2102.     UINT8   tv_val[MAX_TRAP_VAL_LEN]; /* value */
  2103.     INT32   tv_len;                   /* tv_val length, non
  2104. encoded */
  2105.     UINT16  tv_type;                  /* pseudo-type */
  2106. };
  2107.  
  2108. 8.1.5.1  SNMPv1 Generic Traps
  2109.  
  2110. In order to send a generic SNMPv1 trap, the following values
  2111. must be passed to thefunction trap_register:
  2112.  
  2113.               tclass      - TCLASS_V1_GENERIC
  2114.               trap        - generic trap value
  2115.               specific   - ignored
  2116.               data        - if trap is linkUp or linkDown,
  2117. data is ifIndex of link
  2118.                                if trap is egpNeighborLoss,
  2119. data is IP address of  neighbor
  2120.                                in network byte order
  2121.  
  2122. 8.1.5.2  SNMPv1 Specific Traps
  2123.  
  2124. In order to send a specific SNMPv1 trap, the following
  2125. values must be passed to thefunction trap_register:
  2126.  
  2127.               tclass      - TCLASS_V1_SPECIFIC
  2128.               trap        - generic trap value
  2129.               specific   - specific trap value
  2130.               data        - handle of trap data block
  2131.  
  2132. 8.1.5.3  SNMPv2 Well-Known Traps
  2133.  
  2134. In order to send a well-known SNMPv2 trap, the following
  2135. values must be passed to thefunction trap_register:
  2136.  
  2137.               tclass      - TCLASS_V2_WELL_KNOWN
  2138.               trap        - last oid of well-known trap name
  2139.               specific   - ignored
  2140.               data        - if trap is linkUp or linkDown,
  2141. data is ifIndex of link
  2142.                                if trap is egpNeighborLoss,
  2143. data is IP address of  neighbor
  2144.                                in network byte order
  2145.  
  2146.  
  2147. 8.1.5.4  SNMPv2 Non-Well-Known Traps
  2148.  
  2149. In order to send any SNMPv2 trap the following values must
  2150. be passed to thefunction trap_register:
  2151.  
  2152.               tclass      - TCLASS_V1_GENERAL
  2153.               trap        - ignored
  2154.               specific   - specific trap value
  2155.               data        - handle of trap data block
  2156.  
  2157. The trap sending routine will make sysUpTime the first
  2158. variable in the varbind,the snmpTrapOID will be the second
  2159. one, and the variables from trap data block follow these two
  2160.  
  2161. 8.2  Interface to DMTF
  2162.  
  2163. This section describes the proposed interface between the
  2164. WinSNMP/Agent and DMTF. Because a DLL implementation does
  2165. not offer the capabilities that DMTF requires, DMTF must be
  2166. implemented as an external MIB server. This external MIB
  2167. server will assume the role of a DMTF management
  2168. application.
  2169. On startup, the DMTF MIB server does the following:
  2170. ·  Register itself as a management application with the DMI
  2171.   Service Layer.
  2172. ·  Issue several list commands to obtain information about
  2173.   availability of DMTF managed entities; build appropriate
  2174.   transaction tables (or functions) to translate SNMP names
  2175.   into DMI names.
  2176. ·  Build appropriate namespaces representing discovered DMTF
  2177.   variables, build a registration data block, and register
  2178.   itself with core agent by sending WM_SNMP_IAMH_REQ
  2179.   message.
  2180.  
  2181. The mapping of WinSNMP/Agent primitives onto DMI primitives
  2182. is straightforward. There is nothing DMTF specific which has
  2183. to be done by a MIB server in order to perform init(),
  2184. indicate(), and tick() primitives.
  2185.  
  2186. The mapping of the get and next transactions of the look()
  2187. primitive is clear: perform name translation and call the
  2188. appropriate DMTF list function(s). Then call the appropriate
  2189. DMTF get-attribute function(s), store value in the static
  2190. area and pass the pointer to this value, type, and length to
  2191. the core agent.
  2192.  
  2193. The mapping of the write transaction is as:
  2194. Check the new value.
  2195. Perform name translation and call the appropriate DMTF list
  2196. function(s), then call the appropriate DMTF get-attribute
  2197. function(s).
  2198. Store the old and new values in a shadow area and pass the
  2199. non-zero handle (if needed) to the core agent.
  2200.  
  2201. The function set(DO_PHASE1) is directly mapped onto the DMTF
  2202. reserve commands. The function set(UNDO_PHASE1) is directly
  2203. mapped onto the DMTF release commands. The function
  2204. set(DO_COMMIT) is directly mapped onto the DMTF set
  2205. commands. The function set(UNDO_COMMIT) is mapped onto the
  2206. DMTF set commads restoring the old values.
  2207.  
  2208. All non-solicited events indicated to the DMTF MIB server
  2209. are translated by the MIB server into WM_SNMP_TRAP1_REQ and
  2210. WM_SNMP_TRAP2_REQ messages.
  2211.  
  2212. 9    References
  2213.  
  2214. 9.1  Requests for Comment
  2215.  
  2216.  
  2217. 1155  M. Rose and K. McCloghrie: Structure and
  2218. Identification of Management Information for TCP/IP-based
  2219. Internets, May 1990.
  2220.  
  2221. 1157  J. Case, M. Fedor, M. Schoffstall, and C. Davin:
  2222. Simple Network Management Protocol (SNMP), May 1990.
  2223.  
  2224. 1213  K. McCloghrie and M. Rose: Management Information Base
  2225. for Network Management of TCP/IP-based Internets: MIB-II,
  2226. Mar 1991.
  2227.  
  2228. 1215  M. Rose: Convention for defining traps for use with
  2229. the SNMP, Mar 1991.
  2230.  
  2231. 1441  J. Case, K. McCloghrie, M. Rose, and S. Waldbusser:
  2232. Introduction to version 2 of the Internet-standard Network
  2233. Management Framework, Apr 1993.
  2234.  
  2235. 1442  J. Case, K. McCloghrie, M. Rose, and S. Waldbusser:
  2236. Structure of Management Information for version 2 of the
  2237. Simple Network Management Protocol (SNMPv2), Apr 1993.
  2238.  
  2239. 1443  J. Case, K. McCloghrie, M. Rose, and S. Waldbusser:
  2240. Textual Conventions for version 2 of the Simple Network
  2241. Management Protocol (SNMPv2), Apr 1993.
  2242.  
  2243. 1444  J. Case, K. McCloghrie, M. Rose, and S. Waldbusser:
  2244. Conformance Statements for version 2 of the Simple Network
  2245. Management Protocol (SNMPv2), Apr 1993.
  2246.  
  2247. 1445  J. Galvin and K. McCloghrie: Administrative Model for
  2248. version 2 of the Simple Network Management Protocol
  2249. (SNMPv2), Apr 1993.
  2250.  
  2251. 1446  J. Galvin and K. McCloghrie: Security Protocols for
  2252. version 2 of the Simple Network Management Protocol
  2253. (SNMPv2), Apr 1993.
  2254.  
  2255. 1447  K. McCloghrie and J. Galvin: Party MIB for version 2
  2256. of the Simple Network Managment Protocol (SNMPv2), Apr 1993.
  2257.  
  2258. 1448  J. Case, K. McCloghrie, M. Rose, and S. Waldbusser:
  2259. Protocol Operations for version 2 of the Simple Network
  2260. Managment Protocol (SNMPv2), Apr 1993.
  2261.  
  2262. 1449  J. Case, K. McCloghrie, M. Rose, and S. Waldbusser:
  2263. Transport Mappings  for version 2 of the Simple Network
  2264. Managment Protocol (SNMPv2), Apr 1993.
  2265.  
  2266. 1450  J. Case, K. McCloghrie, M. Rose, and S. Waldbusser:
  2267. Management Information Base  for version 2 of the Simple
  2268. Network Managment Protocol (SNMPv2), Apr 1993.
  2269.  
  2270. 1451  J. Case, K. McCloghrie, M. Rose, and S. Waldbusser:
  2271. Manager-to-Manager Management Information Base, Apr 1993.
  2272.  
  2273. 1452  J. Case, K. McCloghrie, M. Rose, and S. Waldbusser:
  2274. Coexistence between version 1 and version 2 of the Internet-
  2275. standard Network Management Framework, Apr 1993.
  2276.  
  2277.  
  2278. 9.2  Other Reference Sources
  2279.  
  2280. B. Natale: Windows SNMP: An Open Interface for Programming
  2281. Network Management Applications using the Simple Network
  2282. Management Protocol under Microsoft Windows, v1.0, Sep 13
  2283. 1993.
  2284.  
  2285. S. Pendse: WinSNMP/MIB: An Interface for Programming using
  2286. the Management Information Base of SNMP under Microsoft
  2287. Windows, v1.0d, Oct 1993.
  2288.  
  2289. D. Perkins: Understanding SNMP MIBs, Revision 1.1.5, Jul 7
  2290. 1992.
  2291.  
  2292. M. Rose: The Simple Book: An Introduction to Management of
  2293. TCP/IP-base Internets, Prentice-Hall, 1990.
  2294.  
  2295. M. Rose: The Simple Book: An Introduction to Internet
  2296. Management,Prentice-Hall, 1994.
  2297.  
  2298. W. Stallings: SNMP, SNMPv2, and CMIP: The Practical Guide to
  2299. Network Management Standards, Addison Wesley, 1993.
  2300.  
  2301.  
  2302.  
  2303. APPENDIX A  MIB-SERVER CODE EXAMPLE
  2304.  
  2305. <to be added>
  2306.  
  2307.  
  2308.  
  2309.