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

VxWorks

开发平台:

C/C++

  1. /* m2UdpLib.c - MIB-II UDP-group API for SNMP agents */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01e,15oct01,rae  merge from truestack ver 01i, base 01d (SPR #68597, VS)
  8. 01d,08mar97,vin  added changes to accomodate changes in pcb structure.
  9. 01c,25jan95,jdi  doc cleanup.
  10. 01b,11nov94,rhp  edited man pages
  11. 01a,08dec93,jag  written
  12. */
  13. /*
  14. DESCRIPTION
  15. This library provides MIB-II services for the UDP group.  It provides
  16. routines to initialize the group, access the group scalar variables, and
  17. read the table of UDP listeners.  For a broader description of MIB-II
  18. services, see the manual entry for m2Lib.
  19. To use this feature, include the following component:
  20. INCLUDE_MIB2_UDP
  21. USING THIS LIBRARY
  22. This library can be initialized and deleted by calling
  23. m2UdpInit() and m2UdpDelete() respectively, if only the UDP group's services 
  24. are needed.  If full MIB-II support is used, this group and all other
  25. groups can be initialized and deleted by calling m2Init() and m2Delete().
  26. The group scalar variables are accessed by calling m2UdpGroupInfoGet()
  27. as follows:
  28. .CS
  29.     M2_UDP   udpVars;
  30.     if (m2UdpGroupInfoGet (&udpVars) == OK)
  31. /@ values in udpVars are valid @/
  32. .CE
  33. The UDP table of listeners can be accessed in lexicographical order.
  34. The first entry in the table can be accessed by setting the table
  35. index to zero in a call to m2UdpTblEntryGet().  Every other entry
  36. thereafter can be accessed by incrementing the index returned from the
  37. previous invocation to the next possible lexicographical index, and
  38. repeatedly calling m2UdpTblEntryGet() with the M2_NEXT_VALUE constant
  39. as the search parameter. For example:
  40. .CS
  41. M2_UDPTBL  udpEntry;
  42.     /@ Specify zero index to get the first entry in the table @/
  43.     udpEntry.udpLocalAddress = 0;    /@ local IP Address in host byte order  @/
  44.     udpEntry.udpLocalPort    = 0;    /@ local port Number                  @/
  45.     /@ get the first entry in the table @/
  46.     if ((m2UdpTblEntryGet (M2_NEXT_VALUE, &udpEntry) == OK)
  47. /@ values in udpEntry in the first entry are valid  @/
  48.     /@ process first entry in the table @/
  49.     /@ 
  50.      * For the next call, increment the index returned in the previous call.
  51.      * The increment is to the next possible lexicographic entry; for
  52.      * example, if the returned index was 0.0.0.0.3000 the index passed in the
  53.      * next invocation should be 0.0.0.0.3001.  If an entry in the table
  54.      * matches the specified index, then that entry is returned.  
  55.      * Otherwise the closest entry following it, in lexicographic order,
  56.      * is returned.
  57.      @/
  58.     /@ get the second entry in the table @/
  59.     if ((m2UdpTblEntryGet (M2_NEXT_VALUE, &udpEntry) == OK)
  60. /@ values in udpEntry in the second entry are valid  @/
  61. .CE
  62. INCLUDE FILES: m2Lib.h
  63.  
  64. SEE ALSO:
  65. m2Lib, m2IfLib, m2IpLib, m2IcmpLib, m2TcpLib, m2SysLib
  66. */
  67. /* includes */
  68. #include "vxWorks.h"
  69. #include "vwModNum.h"
  70. #include "m2Lib.h"
  71. #include "socket.h"
  72. #include <net/route.h>
  73. #include <netinet/in.h>
  74. #include <netinet/ip.h>
  75. #include <netinet/ip_var.h>
  76. #include <netinet/udp.h>
  77. #include <netinet/udp_var.h>
  78. #include <netinet/in_pcb.h>
  79. #include "errnoLib.h"
  80. #ifdef VIRTUAL_STACK
  81. #include "netinet/vsLib.h"
  82. #endif    /* VIRTUAL_STACK */
  83. /* external declarations */
  84. #ifndef VIRTUAL_STACK
  85. extern struct udpstat     udpstat; /* UDP statistics variable */
  86. extern struct inpcbhead   udb; /* UDP link list of listen requests */
  87. #endif    /* VIRTUAL_STACK */
  88. /*******************************************************************************
  89. *
  90. * m2UdpInit - initialize MIB-II UDP-group access
  91. *
  92. * This routine allocates the resources needed to allow access to the UDP 
  93. * MIB-II variables.  This routine must be called before any UDP variables
  94. * can be accessed.
  95. *
  96. * RETURNS: OK, always.
  97. *
  98. * SEE ALSO:
  99. * m2UdpGroupInfoGet(), m2UdpTblEntryGet(), m2UdpDelete()
  100. */
  101. STATUS m2UdpInit (void)
  102.     {
  103.     return (OK);
  104.     }
  105. /*******************************************************************************
  106. *
  107. * m2UdpGroupInfoGet - get MIB-II UDP-group scalar variables
  108. *
  109. * This routine fills in the UDP structure at <pUdpInfo> with the MIB-II
  110. * UDP scalar variables.
  111. *
  112. * RETURNS: OK, or ERROR if <pUdpInfo> is not a valid pointer.
  113. *
  114. * ERRNO:
  115. * S_m2Lib_INVALID_PARAMETER
  116. *
  117. * SEE ALSO:
  118. * m2UdpInit(), m2UdpTblEntryGet(), m2UdpDelete()
  119. */
  120. STATUS m2UdpGroupInfoGet
  121.     (
  122.     M2_UDP * pUdpInfo /* pointer to the UDP group structure */
  123.     )
  124.     {
  125.  
  126.     /* Validate Pointer to UDP structure */
  127.  
  128.     if (pUdpInfo == NULL)
  129. {
  130. errnoSet (S_m2Lib_INVALID_PARAMETER);
  131.         return (ERROR);
  132. }
  133.  
  134.     pUdpInfo->udpNoPorts      = udpstat.udps_noport + 
  135. udpstat.udps_noportbcast; 
  136.     pUdpInfo->udpOutDatagrams = udpstat.udps_opackets;
  137.     /*  The number UDP packets deliever to UDP users. */
  138.     pUdpInfo->udpInDatagrams  = udpstat.udps_ipackets    -
  139.                                 (udpstat.udps_hdrops     +
  140.                                 udpstat.udps_badsum      +
  141.                                 udpstat.udps_badlen      +
  142.                                 udpstat.udps_noportbcast +
  143.                                 udpstat.udps_fullsock);
  144.  
  145.     /*  The number UDP packets not deliever due to errors */
  146.     pUdpInfo->udpInErrors     = udpstat.udps_hdrops +
  147.                                 udpstat.udps_badsum +
  148.                                 udpstat.udps_badlen;
  149.  
  150.     return (OK);
  151.     }
  152. /*******************************************************************************
  153. *
  154. * m2UdpTblEntryGet - get a UDP MIB-II entry from the UDP list of listeners
  155. *
  156. * This routine traverses the UDP table of listeners and does an
  157. * M2_EXACT_VALUE or a M2_NEXT_VALUE search based on the
  158. * <search> parameter.  The calling routine is responsible for
  159. * supplying a valid MIB-II entry index in the input structure
  160. * <pUdpEntry>.  The index is made up of the IP address and the local
  161. * port number.  The first entry in the table is retrieved by doing a
  162. * M2_NEXT_VALUE search with the index fields set to zero.
  163. *
  164. * RETURNS:
  165. * OK, or ERROR if the input parameter is not specified or a match is not 
  166. * found.
  167. *
  168. * ERRNO:
  169. *  S_m2Lib_INVALID_PARAMETER
  170. *  S_m2Lib_ENTRY_NOT_FOUND
  171. *
  172. * SEE ALSO:
  173. * m2Lib, m2UdpInit(), m2UdpGroupInfoGet(), m2UdpDelete()
  174. */
  175. STATUS m2UdpTblEntryGet
  176.     (
  177.     int              search,        /* M2_EXACT_VALUE or M2_NEXT_VALUE */
  178.     M2_UDPTBL      * pUdpEntry      /* ptr to the requested entry with index */
  179.     )
  180.     {
  181.     M2_UDPTBL        savedEntry;    /* Possible M2_NEXT_VALUE Entry in UDP */
  182.     /* table */
  183.     M2_UDPTBL        currEntry;
  184.     int              netLock;       /* Use to secure the Network Code Access */
  185.     struct inpcb   * pPcb;          /* Pointer to UDP Listener structure. */
  186.  
  187.  
  188.     /* Validate Pointer to UDP Table Entry structure */
  189.  
  190.     if (pUdpEntry == NULL)
  191. {
  192. errnoSet (S_m2Lib_INVALID_PARAMETER);
  193.         return (ERROR);
  194. }
  195.  
  196.     /* 
  197.      * Initialize Entry for M2_NEXT_VALUE entry search.  Not used in
  198.      * M2_EXACT_VALUE search.
  199.      */
  200.  
  201.     savedEntry.udpLocalAddress = -1;    /* Largest possible value. */
  202.     savedEntry.udpLocalPort    = -1;    /* Largest possible value. */
  203.  
  204.     netLock = splnet ();             /* Get exclusive access to Network Code */
  205.  
  206.     for (pPcb = udb.lh_first; pPcb != NULL; pPcb = pPcb->inp_list.le_next )
  207.         {
  208. currEntry.udpLocalAddress = ntohl (pPcb->inp_laddr.s_addr);
  209. currEntry.udpLocalPort    = ntohs (pPcb->inp_lport);
  210.         if (search == M2_EXACT_VALUE)
  211.             {
  212.     /* Check that the specified index matches the current entry */
  213.             if ((pUdpEntry->udpLocalAddress == currEntry.udpLocalAddress) &&
  214.                 (pUdpEntry->udpLocalPort == currEntry.udpLocalPort))
  215.                 {
  216.                 splx (netLock);   /* Give up exclusive access to Network Code */
  217.                 return (OK);      /* The answer is in the structure pUdpEntry */
  218.                 }
  219.             }
  220.         else
  221.             {
  222.             /*
  223.              * A NEXT search is satisfied by an entry that is lexicographicaly
  224.              * equal to or greater than the input UDP connection entry. Because
  225.      * the UDP connection list is not in order, the list must be 
  226.      * traverse completely before a selection is made.  The rules for a 
  227.      * lexicographical comparison are built in the next statement.
  228.              */  
  229.     if (((currEntry.udpLocalAddress > pUdpEntry->udpLocalAddress) ||
  230.   ((currEntry.udpLocalAddress == pUdpEntry->udpLocalAddress) &&
  231.    (currEntry.udpLocalPort >= pUdpEntry->udpLocalPort))) &&
  232.                  ((currEntry.udpLocalAddress < savedEntry.udpLocalAddress) ||
  233.                    ((currEntry.udpLocalAddress == savedEntry.udpLocalAddress) &&
  234.                     (currEntry.udpLocalPort < savedEntry.udpLocalPort))))
  235.                 {
  236. /* 
  237.  * Save the entry which qualifies as the NEXT greater 
  238.  * lexicographic entry.  Because the table is not order the
  239.  * search must proceed to the end of the table.
  240.  */
  241.                 savedEntry.udpLocalAddress =  currEntry.udpLocalAddress;
  242.                 savedEntry.udpLocalPort    =  currEntry.udpLocalPort;
  243.                 }
  244.             }
  245.         }
  246.  
  247.     splx (netLock);             /* Give up exclusive access to Network Code */
  248.     /* If a match was found fill, the requested structure */
  249.     if (savedEntry.udpLocalPort != -1)
  250.         {
  251.         pUdpEntry->udpLocalAddress = savedEntry.udpLocalAddress;
  252.         pUdpEntry->udpLocalPort    = savedEntry.udpLocalPort;
  253.         return (OK);
  254.         }
  255.  
  256.     errnoSet (S_m2Lib_ENTRY_NOT_FOUND);
  257.     return (ERROR);
  258.     }
  259. /*******************************************************************************
  260. *
  261. * m2UdpDelete - delete all resources used to access the UDP group
  262. *
  263. * This routine frees all the resources allocated at the time the group was
  264. * initialized.  The UDP group should not be accessed after this routine has been
  265. * called.
  266. *
  267. * RETURNS: OK, always.
  268. *
  269. * SEE ALSO:
  270. * m2UdpInit(), m2UdpGroupInfoGet(), m2UdpTblEntryGet()
  271. */
  272. STATUS m2UdpDelete (void)
  273.     {
  274.     return (OK);
  275.     }