wvNetLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:27k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* wvNetLib.c - WindView for Networking Interface Library */
  2. /* Copyright 1990 - 2000 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01d,10may02,kbw  making man page edits
  8. 01c,25oct00,ham  doc: cleanup for vxWorks AE 1.0.
  9. 01b,07jun00,ham  fixed a compilation warning.
  10. 01a,12jan00,spm  written
  11. */
  12. /*
  13. DESCRIPTION
  14. This library provides the user interface to the network-related events
  15. for the WindView system visualization tool. These events are divided into
  16. two WindView classes. The NET_CORE_EVENT class indicates events directly
  17. related to data transfer. All other events (such as memory allocation and
  18. API routines) use the NET_AUX_EVENT class. Within each class, events are
  19. assigned one of eight priority levels. The four highest priority levels 
  20. (EMERGENCY, ALERT, CRITICAL, and ERROR) indicate the occurrence of errors 
  21. and the remaining four (WARNING, NOTICE, INFO, and VERBOSE) provide 
  22. progressively more detailed information about the internal processing in 
  23. the network stack. 
  24. USER INTERFACE
  25. If WindView support is included, the wvNetStart() and wvNetStop() routines 
  26. will enable and disable event reporting for the network stack. The start
  27. routine takes a single parameter specifying the minimum priority level for
  28. all network components. That setting may be modified with the wvNetLevelAdd() 
  29. and wvNetLevelRemove() routines. Individual events may be included or removed
  30. with the wvNetEventEnable() and wvNetDisable() routines.
  31. The wvNetAddressFilterSet() and wvNetPortFilterSet() routines provide further 
  32. screening for some events.
  33. INTERNAL
  34. The WindView monitor executing on a VxWorks target transmits events to the
  35. WindView parser on the host based on the event class. Increasing the number
  36. of classes beyond two would allow more precise control over event generation 
  37. and reduce the load on the VxWorks target, but the total number of available 
  38. classes is limited. 
  39. Events are generated within each source code module using macros defined
  40. in the wvNetLib.h include file. The WV_BLOCK_START macro determines whether 
  41. WindView is active and verifies that the given event class has been selected. 
  42. All WindView related processing must be enclosed between a WV_BLOCK_START 
  43. and WV_BLOCK_END pair.
  44. The WV_NET_EVENT_TEST macro immediately follows the start of the WindView
  45. event block. It verifies that an individual event is selected by testing
  46. the contents of the event selection map. The event map contains bitmaps for 
  47. all events within each of the eight priority levels. It is modified by the 
  48. user interface routines as the settings are changed. Currently, no priority 
  49. level contains more than 64 events. If that limit is exceeded, the EVENT_MASK 
  50. structure must be expanded. Local variables indicate the number of events 
  51. currently defined for each priority level.
  52. If an event is active, the WV_NET_FILTER_TEST macro verifies than any 
  53. remaining conditions are satisfied.
  54. If an event fulfills all the conditions, the event identifier is constructed
  55. with the WV_NET_EVENT_SET or WV_NET_MARKER_SET macros and the event
  56. is logged with the evtLogOInt() routine. The event identifier encodes
  57. the related system component (currently 0x30) and the source code module, 
  58. priority level, and data transfer direction for all events.
  59. To use this feature, include the following component:
  60. INCLUDE_WVNET
  61. INCLUDE FILES:
  62. SEE ALSO:
  63. .I "WindView for Tornado User's Guide"
  64. */
  65. /* includes */
  66. #include "vxWorks.h"
  67. #include "wvLib.h"
  68. #include "wvNetLib.h"
  69. /* globals */
  70. EVENT_MASK wvNetEventMap [8]; /* Bitmasks for all event priorities. */
  71. BOOL wvNetAddressFilterTest (int, int, ULONG, ULONG);
  72. BOOL wvNetPortFilterTest (int, USHORT, USHORT);
  73. /* external variables */
  74. IMPORT EVENT_MASK * pWvNetEventMap;
  75. IMPORT u_long inet_addr (char * inetString);
  76. /* locals */
  77. LOCAL int maxEmergencyOffset = 45;       /*                                 */
  78. LOCAL int maxAlertOffset = 8;            /* The maximum offset value for    */
  79. LOCAL int maxCriticalOffset = 34;        /* each priority level is one      */
  80. LOCAL int maxErrorOffset = 47;           /* less than the number of events. */
  81. LOCAL int maxWarningOffset = 19;         /* If it exceeds 63, the bitmap    */
  82. LOCAL int maxNoticeOffset = 22;          /* size must be increased.         */
  83. LOCAL int maxInfoOffset = 56;
  84. LOCAL int maxVerboseOffset = 57;
  85. LOCAL BOOL wvNetInputSrcAddrFlag = FALSE;
  86. LOCAL BOOL wvNetInputDstAddrFlag = FALSE;
  87. LOCAL int wvNetInputSrcAddr;
  88. LOCAL int wvNetInputSrcMask;
  89. LOCAL int wvNetInputDstAddr;
  90. LOCAL int wvNetInputDstMask;
  91. LOCAL BOOL wvNetOutputSrcAddrFlag = FALSE;
  92. LOCAL BOOL wvNetOutputDstAddrFlag = FALSE;
  93. LOCAL int wvNetOutputSrcAddr;
  94. LOCAL int wvNetOutputSrcMask;
  95. LOCAL int wvNetOutputDstAddr;
  96. LOCAL int wvNetOutputDstMask;
  97. LOCAL BOOL wvNetInputSrcPortFlag;
  98. LOCAL int wvNetInputSrcPort;
  99. LOCAL BOOL wvNetInputDstPortFlag;
  100. LOCAL int wvNetInputDstPort;
  101. LOCAL BOOL wvNetOutputSrcPortFlag;
  102. LOCAL int wvNetOutputSrcPort;
  103. LOCAL BOOL wvNetOutputDstPortFlag;
  104. LOCAL int wvNetOutputDstPort;
  105. /* forward declarations */
  106. /*******************************************************************************
  107. *
  108. * wvNetInit - stub routine for linker
  109. *
  110. * This routine is called during system startup so that the global variables
  111. * storing the WindView settings for the networking instrumentation are 
  112. * available. It also initializes the event bitmaps so that all events
  113. * are reported when logging begins. Event selection can be customized
  114. * with the appropriate library routines.
  115. *
  116. * RETURNS: N/A
  117. *
  118. * ERRNO: N/A
  119. *
  120. * NOMANUAL
  121. */
  122. void wvNetInit (void)
  123.     {
  124.     int index;
  125.     int loop;
  126.     /* 
  127.      * Enable all events for each level. Because of the array indexing,
  128.      * the index into the event map is one less than the value assigned
  129.      * to the priority level.
  130.      */
  131.     for (index = WV_NET_EMERGENCY - 1; index < WV_NET_VERBOSE; index++)
  132.         {
  133.         /* 
  134.          * Currently, no priority level uses more than 64 events. This
  135.          * inner loop must be increased if that limit is exceeded.
  136.          */
  137.         for (loop = 0; loop < 8; loop++)
  138.             wvNetEventMap [index].bitmap [loop] = 255;
  139.         }
  140.     /* Provide access to the event map from instrumented modules. */
  141.     pWvNetEventMap = wvNetEventMap;
  142.     _func_wvNetAddressFilterTest = wvNetAddressFilterTest;
  143.     _func_wvNetPortFilterTest = (FUNCPTR)wvNetPortFilterTest;
  144.     return;
  145.     } 
  146. /*******************************************************************************
  147. *
  148. * wvNetEnable - begin reporting network events to WindView
  149. *
  150. * This routine activates WindView event reporting for network components,
  151. * after disabling all events with a priority less than <level>. The
  152. * default value (or a <level> of WV_NET_VERBOSE) will not disable
  153. * any additional events. The available priority values are:
  154. *
  155. *     WV_NET_EMERGENCY (1)
  156. *     WV_NET_ALERT (2)
  157. *     WV_NET_CRITICAL (3)
  158. *     WV_NET_ERROR (4)
  159. *     WV_NET_WARNING (5)
  160. *     WV_NET_NOTICE (6)
  161. *     WV_NET_INFO (7)
  162. *     WV_NET_VERBOSE (8)
  163. * If an event is not explicitly disabled by the priority level, it uses the 
  164. * current event selection map and class settings. The initial values enable
  165. * all events of both classes. 
  166. *
  167. * RETURNS: N/A
  168. *
  169. * ERRNO: N/A
  170. */
  171. void wvNetEnable
  172.     (
  173.     int priority    /* minimum priority, or 0 for default of WV_NET_VERBOSE */
  174.     )
  175.     {
  176.     int index;
  177.     int loop;
  178.     /*
  179.      * Because of the array indexing, the <priority> parameter provides the
  180.      * starting offset into the event map for the lower priority events. 
  181.      * Events with priorities greater than or equal to the given level
  182.      * remain enabled. All other events are disabled.
  183.      */
  184.     if (priority == 0) /* Set index so no events are disabled by default.*/
  185.         priority = WV_NET_VERBOSE;
  186.     for (index = priority; index < WV_NET_VERBOSE; index++)
  187.         {
  188.         /* 
  189.          * Set event map so WV_NET_EVENT_TEST macro will reject events
  190.          * with lower priority (currently up to 64 per level). 
  191.          */
  192.         for (loop = 0; loop < 8; loop++)
  193.             wvNetEventMap [index].bitmap [loop] = 0;
  194.         }
  195.     /*
  196.      * Begin reporting network events from both the primary and auxiliary
  197.      * classes. Also enable the class 1 (context switching) events,
  198.      * in case they are not already active.
  199.      */
  200.     WV_EVTCLASS_SET (WV_NET_CORE_CLASS | WV_NET_AUX_CLASS);
  201.     return;
  202.     }
  203. /*******************************************************************************
  204. *
  205. * wvNetDisable - end reporting of network events to WindView
  206. *
  207. * This routine stops WindView event reporting for all network components.
  208. *
  209. * RETURNS: N/A
  210. *
  211. * ERRNO: N/A
  212. */
  213. void wvNetDisable (void)
  214.     {
  215.     /* Stop reporting events from either class. */
  216.     WV_EVTCLASS_UNSET (WV_NET_CORE_CLASS | WV_NET_AUX_CLASS);
  217.     return;
  218.     }
  219. /*******************************************************************************
  220. *
  221. * wvNetLevelAdd - enable network events with specific priority level
  222. *
  223. * This routine changes the event selection map to allow reporting of any 
  224. * events with priority equal to <level>. It will override current event 
  225. * selections for the given priority, but has no effect on settings for 
  226. * events with higher or lower priorities. The available priority values 
  227. * are:
  228. *
  229. *     WV_NET_EMERGENCY (1)
  230. *     WV_NET_ALERT (2)
  231. *     WV_NET_CRITICAL (3)
  232. *     WV_NET_ERROR (4)
  233. *     WV_NET_WARNING (5)
  234. *     WV_NET_NOTICE (6)
  235. *     WV_NET_INFO (7)
  236. *     WV_NET_VERBOSE (8)
  237. * Events are only reported based on the current WindView class setting. The 
  238. * initial (default) setting includes networking events from both classes.
  239. *
  240. * RETURNS: OK, or ERROR for unknown event level.
  241. *
  242. * ERRNO: N/A
  243. */
  244. STATUS wvNetLevelAdd
  245.     (
  246.     int priority  /* priority level to enable */
  247.     )
  248.     {
  249.     int index;
  250.     int loop;
  251.     if (priority < WV_NET_EMERGENCY || priority > WV_NET_VERBOSE)
  252.         return (ERROR);
  253.     /* 
  254.      * Because of array indexing, the index into the event map is one
  255.      * less than the value assigned to the priority level.
  256.      */
  257.     index = priority - 1;
  258.     /*
  259.      * Set event map so WV_NET_EVENT_TEST macro will accept any events 
  260.      * with selected priority (currently up to 64 per level).
  261.      */
  262.     for (loop = 0; loop < 8; loop++)
  263.          wvNetEventMap [index].bitmap [loop] = 255;
  264.     return (OK);
  265.     }
  266. /*******************************************************************************
  267. *
  268. * wvNetLevelRemove - disable network events with specific priority level
  269. *
  270. * This routine changes the event selection map to prevent reporting of any 
  271. * events with priority equal to <level>. It will override the current event 
  272. * selection for the given priority, but has no effect on settings for events 
  273. * with higher or lower priorities. The available priority values are:
  274. *
  275. *     WV_NET_EMERGENCY (1)
  276. *     WV_NET_ALERT (2)
  277. *     WV_NET_CRITICAL (3)
  278. *     WV_NET_ERROR (4)
  279. *     WV_NET_WARNING (5)
  280. *     WV_NET_NOTICE (6)
  281. *     WV_NET_INFO (7)
  282. *     WV_NET_VERBOSE (8)
  283. * Events are only reported based on the current WindView class setting. The
  284. * initial (default) setting includes networking events from both classes.
  285. *
  286. * RETURNS: OK, or ERROR for unknown event level.
  287. *
  288. * ERRNO: N/A
  289. */
  290. STATUS wvNetLevelRemove
  291.     (
  292.     int priority  /* priority level to disable */
  293.     )
  294.     {
  295.     int index;
  296.     int loop;
  297.     if (priority < WV_NET_EMERGENCY || priority > WV_NET_VERBOSE)
  298.         return (ERROR);
  299.     /* 
  300.      * Because of array indexing, the index into the event map is one
  301.      * less than the value assigned to the priority level.
  302.      */
  303.     index = priority - 1;
  304.     /*
  305.      * Set event map so WV_NET_EVENT_TEST macro will reject any events 
  306.      * with selected priority (currently up to 64 per level).
  307.      */
  308.     for (loop = 0; loop < 8; loop++)
  309.          wvNetEventMap [index].bitmap [loop] = 0;
  310.     return (OK);
  311.     }
  312. /*******************************************************************************
  313. *
  314. * wvNetEventEnable - activate specific network events
  315. *
  316. * This routine allows reporting of a single event within the priority equal 
  317. * to <level>. The activation is overridden if the setting for the entire 
  318. * priority level changes. The available priority values are:
  319. *
  320. *     WV_NET_EMERGENCY (1)
  321. *     WV_NET_ALERT (2)
  322. *     WV_NET_CRITICAL (3)
  323. *     WV_NET_ERROR (4)
  324. *     WV_NET_WARNING (5)
  325. *     WV_NET_NOTICE (6)
  326. *     WV_NET_INFO (7)
  327. *     WV_NET_VERBOSE (8)
  328. * Offset values for individual events are listed in the documentation.
  329. *
  330. * RETURNS: OK, or ERROR for unknown event.
  331. *
  332. * ERRNO: N/A
  333. */
  334. STATUS wvNetEventEnable
  335.     (
  336.     int priority,  /* priority level of event */
  337.     int offset  /* identifier within priority level */
  338.     )
  339.     {
  340.     STATUS result = OK;
  341.     int index;
  342.     UCHAR mask;
  343.     int byteOffset;
  344.     int byteIndex;
  345.     switch (priority)
  346.         {
  347.         case WV_NET_EMERGENCY:
  348.             if (offset > maxEmergencyOffset)
  349.                 result = ERROR;
  350.             break;
  351.         case WV_NET_ALERT:
  352.             if (offset > maxAlertOffset)
  353.                 result = ERROR;
  354.             break;
  355.         case WV_NET_CRITICAL:
  356.             if (offset > maxCriticalOffset)
  357.                 result = ERROR;
  358.             break;
  359.         case WV_NET_ERROR:
  360.             if (offset > maxErrorOffset)
  361.                 result = ERROR;
  362.             break;
  363.         case WV_NET_WARNING:
  364.             if (offset > maxWarningOffset)
  365.                 result = ERROR;
  366.             break;
  367.         case WV_NET_NOTICE:
  368.             if (offset > maxNoticeOffset)
  369.                 result = ERROR;
  370.             break;
  371.         case WV_NET_INFO:
  372.             if (offset > maxInfoOffset)
  373.                 result = ERROR;
  374.             break;
  375.         case WV_NET_VERBOSE:
  376.             if (offset > maxVerboseOffset)
  377.                 result = ERROR;
  378.             break;
  379.         default:  /* Unknown priority level */
  380.             result = ERROR;
  381.             break;
  382.         }
  383.     /* 
  384.      * Because of array indexing, the index into the event map is one
  385.      * less than the value assigned to the priority level.
  386.      */
  387.     index = priority - 1;
  388.     if (result == OK)
  389.         {        
  390.         byteOffset = offset / 8;
  391.         /* 
  392.          * Convert the offset to an array index based on the number of
  393.          * bytes in the bitmap.
  394.          */
  395.         byteIndex = WVNET_MASKSIZE - 1 - byteOffset;
  396.         /*
  397.          * Set event map so WV_NET_EVENT_TEST macro will accept the
  398.          * specified event.
  399.          */
  400.         mask = 1 << (offset % 8);
  401.         wvNetEventMap [index].bitmap [byteIndex] |= mask;
  402.         }
  403.     return (result);
  404.     }
  405. /*******************************************************************************
  406. *
  407. * wvNetEventDisable - deactivate specific network events
  408. *
  409. * This routine prevents reporting of a single event within the priority equal 
  410. * to <level>. The activation is overridden if the setting for the entire 
  411. * priority level changes. The available priority values are:
  412. *
  413. *     WV_NET_EMERGENCY (1)
  414. *     WV_NET_ALERT (2)
  415. *     WV_NET_CRITICAL (3)
  416. *     WV_NET_ERROR (4)
  417. *     WV_NET_WARNING (5)
  418. *     WV_NET_NOTICE (6)
  419. *     WV_NET_INFO (7)
  420. *     WV_NET_VERBOSE (8)
  421. * Offset values for individual events are listed in the documentation.
  422. *
  423. * RETURNS: OK, or ERROR for unknown event.
  424. *
  425. * ERRNO: N/A
  426. */
  427. STATUS wvNetEventDisable
  428.     (
  429.     int priority,  /* priority level of event */
  430.     int offset  /* identifier within priority level */
  431.     )
  432.     {
  433.     STATUS result = OK;
  434.     int index;
  435.     UCHAR mask;
  436.     int byteOffset;
  437.     int byteIndex;
  438.     switch (priority)
  439.         {
  440.         case WV_NET_EMERGENCY:
  441.             if (offset > maxEmergencyOffset)
  442.                 result = ERROR;
  443.             break;
  444.         case WV_NET_ALERT:
  445.             if (offset > maxAlertOffset)
  446.                 result = ERROR;
  447.             break;
  448.         case WV_NET_CRITICAL:
  449.             if (offset > maxCriticalOffset)
  450.                 result = ERROR;
  451.             break;
  452.         case WV_NET_ERROR:
  453.             if (offset > maxErrorOffset)
  454.                 result = ERROR;
  455.             break;
  456.         case WV_NET_WARNING:
  457.             if (offset > maxWarningOffset)
  458.                 result = ERROR;
  459.             break;
  460.         case WV_NET_NOTICE:
  461.             if (offset > maxNoticeOffset)
  462.                 result = ERROR;
  463.             break;
  464.         case WV_NET_INFO:
  465.             if (offset > maxInfoOffset)
  466.                 result = ERROR;
  467.             break;
  468.         case WV_NET_VERBOSE:
  469.             if (offset > maxVerboseOffset)
  470.                 result = ERROR;
  471.             break;
  472.         default:  /* Unknown priority level */
  473.             result = ERROR;
  474.             break;
  475.         }
  476.     /* 
  477.      * Because of array indexing, the index into the event map is one
  478.      * less than the value assigned to the priority level.
  479.      */
  480.     index = priority - 1;
  481.     if (result == OK)
  482.         {        
  483.         byteOffset = offset / 8;
  484.         /* 
  485.          * Convert the offset to an array index based on the number of
  486.          * bytes in the bitmap.
  487.          */
  488.         byteIndex = WVNET_MASKSIZE - 1 - byteOffset;
  489.         /*
  490.          * Set event map so WV_NET_EVENT_TEST macro will reject the
  491.          * specified event.
  492.          */
  493.         mask = ~ (1 << (offset % 8));
  494.         wvNetEventMap [index].bitmap [byteIndex] &= mask;
  495.         }
  496.     return (result);
  497.     }
  498. /*******************************************************************************
  499. *
  500. * wvNetAddressFilterSet - specify an address filter for events
  501. *
  502. * This routine activates an additional test that disables certain events
  503. * that do not match the specified IP address. The <pAddress> parameter
  504. * provides the test value in dotted-decimal format. The <type> parameter
  505. * indicates whether that address is compared against the source or
  506. * destination values, and the <direction> value identifies whether the 
  507. * <type> is interpreted from the perspective of incoming or outgoing traffic.
  508. * The <pMask> parameter provides a network mask to support testing for a
  509. * group of events.
  510. *
  511. * RETURNS: OK if filter set, or ERROR otherwise.
  512. *
  513. * ERRNO: N/A
  514. *
  515. */
  516. STATUS wvNetAddressFilterSet
  517.     (
  518.     char *  pAddress,  /* target address for event comparisons */
  519.     char *  pMask,  /* mask value applied to data fields */
  520.     int  type,  /* 0 for source, 1 for destination */ 
  521.     int  direction  /* 0 for input, 1 for output */
  522.     )
  523.     {
  524.     int targetAddr;
  525.     int targetMask;
  526.     STATUS result = OK;
  527.     targetAddr = inet_addr (pAddress);
  528.     targetMask = inet_addr (pMask);
  529.     if (targetAddr == ERROR)   /* targetMask of 255.255.255.255 is OK. */
  530.         return (ERROR);
  531.     if (direction == 0 && type == 0)
  532.         {
  533.         wvNetInputSrcAddr = targetAddr;
  534.         wvNetInputSrcMask = targetMask;
  535.         wvNetInputSrcAddrFlag = TRUE;
  536.         }
  537.     else if (direction == 0 && type == 1)
  538.         {
  539.         wvNetInputDstAddr = targetAddr;
  540.         wvNetInputDstMask = targetMask;
  541.         wvNetInputDstAddrFlag = TRUE;
  542.         }
  543.     else if (direction == 1 && type == 0)
  544.         {
  545.         wvNetOutputSrcAddr = targetAddr;
  546.         wvNetOutputSrcMask = targetMask;
  547.         wvNetOutputSrcAddrFlag = TRUE;
  548.         }
  549.     else if (direction == 1 && type == 1)
  550.         {
  551.         wvNetOutputDstAddr = targetAddr;
  552.         wvNetOutputDstMask = targetMask;
  553.         wvNetOutputDstAddrFlag = TRUE;
  554.         } 
  555.     else
  556.         result = ERROR;
  557.     return (result);
  558.     }
  559. /*******************************************************************************
  560. *
  561. * wvNetAddressFilterClear - remove the address filter for events
  562. *
  563. * This routine removes any active address filter test indicated by
  564. * the <type> and <direction> parameters used to enable it. Affected
  565. * events will be reported unconditionally.
  566. *
  567. * RETURNS: N/A
  568. *
  569. * ERRNO: N/A
  570. */
  571. void wvNetAddressFilterClear
  572.     (
  573.     int  type,  /* 0 for source, 1 for destination */ 
  574.     int  direction  /* 0 for input, 1 for output */
  575.     )
  576.     {
  577.     if (direction == 0 && type == 0)
  578.         wvNetInputSrcAddrFlag = FALSE;
  579.     else if (direction == 0 && type == 1)
  580.         wvNetInputDstAddrFlag = FALSE;
  581.     else if (direction == 1 && type == 0)
  582.         wvNetOutputSrcAddrFlag = FALSE;
  583.     else if (direction == 1 && type == 1)
  584.         wvNetOutputDstAddrFlag = FALSE;
  585.     return;
  586.     }
  587. /*******************************************************************************
  588. *
  589. * wvNetPortFilterSet - specify an address filter for events
  590. *
  591. * This routine activates an additional filter, which disables certain events 
  592. * that do not match the specified port value. The <port> parameter provides 
  593. * the test value and the <type> parameter indicates whether that value is 
  594. * compared against the source or destination fields. The <direction> setting 
  595. * identifies whether the <type> is interpreted from the perspective of 
  596. * incoming or outgoing traffic.
  597. *
  598. * RETURNS: OK if filter set, or ERROR otherwise.
  599. *
  600. * ERRNO: N/A
  601. */
  602. STATUS wvNetPortFilterSet
  603.     (
  604.     int  port,  /* target port for event comparisons */
  605.     int  type,  /* 0 for source, 1 for destination */ 
  606.     int  direction  /* 0 for input, 1 for output */
  607.     )
  608.     {
  609.     STATUS result = OK;
  610.     if (direction == 0 && type == 0)
  611.         {
  612.         wvNetInputSrcPort = port;
  613.         wvNetInputSrcPortFlag = TRUE;
  614.         }
  615.     else if (direction == 0 && type == 1)
  616.         {
  617.         wvNetInputDstPort = port;
  618.         wvNetInputDstPortFlag = TRUE;
  619.         }
  620.     else if (direction == 1 && type == 0)
  621.         {
  622.         wvNetOutputSrcPort = port;
  623.         wvNetOutputSrcPortFlag = TRUE;
  624.         }
  625.     else if (direction == 1 && type == 1)
  626.         {
  627.         wvNetOutputDstPort = port;
  628.         wvNetOutputDstPortFlag = TRUE;
  629.         } 
  630.     else
  631.         result = ERROR;
  632.     return (result);
  633.     }
  634. /*******************************************************************************
  635. *
  636. * wvNetPortFilterClear - remove the port number filter for events
  637. *
  638. * This routine removes any active port filter test indicated by
  639. * the <type> and <direction> parameters used to enable it. Affected
  640. * events will be reported unconditionally.
  641. *
  642. * RETURNS: N/A
  643. *
  644. * ERRNO: N/A
  645. */
  646. void wvNetPortFilterClear
  647.     (
  648.     int  type,  /* 0 for source, 1 for destination */ 
  649.     int  direction  /* 0 for input, 1 for output */
  650.     )
  651.     {
  652.     if (direction == 0 && type == 0)
  653.         wvNetInputSrcPortFlag = FALSE;
  654.     else if (direction == 0 && type == 1)
  655.         wvNetInputDstPortFlag = FALSE;
  656.     else if (direction == 1 && type == 0)
  657.         wvNetOutputSrcPortFlag = FALSE;
  658.     else if (direction == 1 && type == 1)
  659.         wvNetOutputDstPortFlag = FALSE;
  660.     return;
  661.     }
  662. /*******************************************************************************
  663. *
  664. * wvNetAddressFilterTest - compare the given addresses with filter values
  665. *
  666. * This routine is invoked by the WV_NET_ADDR_FILTER_TEST macro within
  667. * an event block. It returns TRUE if no filters are in effect or if the
  668. * target values for each filter match the given addresses.
  669. *
  670. * RETURNS: TRUE if filter passes, or FALSE otherwise.
  671. *
  672. * ERRNO: N/A
  673. *
  674. * NOMANUAL
  675. */
  676. BOOL wvNetAddressFilterTest
  677.     (
  678.     int filterType,  /* 0 for input filter or 1 for output filter */
  679.     int targetType, /* 1 for dst only, 2 for src only, or 3 for both */
  680.     ULONG srcAddr,  /* current source address for event block */
  681.     ULONG dstAddr /* current destination address for event block */
  682.     )
  683.     {
  684.     BOOL result = TRUE;
  685.     if (filterType == 0)  /* Compare given addresses to input values. */
  686.         {
  687.         if (wvNetInputSrcAddrFlag && targetType != 1)
  688.             result = ((srcAddr & wvNetInputSrcMask) == wvNetInputSrcAddr);
  689.         /* Only test the destination address if any source test passed. */
  690.         if (result && wvNetInputDstAddrFlag && targetType != 2)
  691.             result = ((dstAddr & wvNetInputDstMask) == wvNetInputDstAddr);
  692.         }
  693.     if (filterType == 1)       /* Compare given addresses to output values. */
  694.         {
  695.         if (wvNetOutputSrcAddrFlag && targetType != 1)
  696.             result = ((srcAddr & wvNetOutputSrcMask) == wvNetOutputSrcAddr);
  697.         /* Only test the destination address if any source test passed. */
  698.         if (result && wvNetOutputDstAddrFlag && targetType != 2)
  699.             result = ((dstAddr & wvNetOutputDstMask) == wvNetOutputDstAddr);
  700.         }
  701.     /* if (!result)    /@ XXX - for testing, include if desired. @/
  702.         logMsg ("Address filter ignoring event.n", 0, 0, 0, 0, 0, 0); */
  703.     return (result);
  704.     }
  705. /*******************************************************************************
  706. *
  707. * wvNetPortFilterTest - compare the given port numbers with filter values
  708. *
  709. * This routine is invoked by the WV_NET_PORT_FILTER_TEST macro within
  710. * an event block. It returns TRUE if no filters are in effect or if the
  711. * target values for each filter match the given port numbers.
  712. *
  713. * INTERNAL
  714. * Unlike the address filter tests, both the source and destination ports
  715. * are always available for the filtered events, so the <targetType> 
  716. * parameter is not needed.
  717. *
  718. * RETURNS: TRUE if filter passes, or FALSE otherwise.
  719. *
  720. * ERRNO: N/A
  721. *
  722. * NOMANUAL
  723. */
  724. BOOL wvNetPortFilterTest
  725.     (
  726.     int filterType,  /* 0 for input filter or 1 for output filter */
  727.     USHORT srcPort,  /* current source port for event block */
  728.     USHORT dstPort /* current destination port for event block */
  729.     )
  730.     {
  731.     BOOL result = TRUE;
  732.     if (filterType == 0)  /* Compare given ports to input values. */
  733.         {
  734.         if (wvNetInputSrcPortFlag)
  735.             result = (srcPort == wvNetInputSrcPort);
  736.         /* Only test the destination port if any source test passed. */
  737.         if (result && wvNetInputDstPortFlag)
  738.             result = (dstPort == wvNetInputDstPort);
  739.         }
  740.     if (filterType == 1)       /* Compare given addresses to output values. */
  741.         {
  742.         if (wvNetOutputSrcPortFlag)
  743.             result = (srcPort == wvNetOutputSrcPort);
  744.         /* Only test the destination address if any source test passed. */
  745.         if (result && wvNetOutputDstPortFlag)
  746.             result = (dstPort == wvNetOutputDstPort);
  747.         }
  748.     return (result);
  749.     }
  750. #if 0
  751. /*******************************************************************************
  752. *
  753. * wvNetEventTest - check if event is enabled
  754. *
  755. * This routine duplicates the WV_NET_EVENT_TEST macro. It checks the bitmap
  756. * for an event to determine if it should be reported to the host-side of the 
  757. * WindView tool. It is never called, and is present only to illustrate the 
  758. * macro behavior.
  759. *
  760. * RETURNS: TRUE if event is selected, or FALSE otherwise.
  761. *
  762. * ERRNO: N/A
  763. *
  764. * NOMANUAL
  765. */
  766. BOOL wvNetEventTest
  767.     (
  768.     int priority,  /* priority level of event */
  769.     int offset  /* identifier within priority level */
  770.     )
  771.     {
  772.     BOOL result;
  773.     int index;
  774.     UCHAR mask;
  775.     int byteOffset;
  776.     int byteIndex;
  777.     /* 
  778.      * Because of array indexing, the index into the event map is one
  779.      * less than the value assigned to the priority level.
  780.      */
  781.     index = priority - 1;
  782.     byteOffset = offset / 8;
  783.     /* 
  784.      * Convert the offset to an array index based on the number of
  785.      * bytes in the bitmap.
  786.      */
  787.     byteIndex = WVNET_MASKSIZE - 1 - byteOffset;
  788.     /* Check the flag in the bitmap for the specified event. */
  789.     mask = 1 << (offset % 8);
  790.     result = (wvNetEventMap [index].bitmap [byteIndex] & mask);
  791.     return (result);
  792.     }
  793. #endif