⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m2udplib.c

📁 VXWORKS源代码
💻 C
字号:
/* m2UdpLib.c - MIB-II UDP-group API for SNMP agents *//* Copyright 1984 - 2001 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01e,15oct01,rae  merge from truestack ver 01i, base 01d (SPR #68597, VS)01d,08mar97,vin  added changes to accomodate changes in pcb structure.01c,25jan95,jdi  doc cleanup.01b,11nov94,rhp  edited man pages01a,08dec93,jag  written*//*DESCRIPTIONThis library provides MIB-II services for the UDP group.  It providesroutines to initialize the group, access the group scalar variables, andread the table of UDP listeners.  For a broader description of MIB-IIservices, see the manual entry for m2Lib.To use this feature, include the following component:INCLUDE_MIB2_UDPUSING THIS LIBRARYThis library can be initialized and deleted by callingm2UdpInit() and m2UdpDelete() respectively, if only the UDP group's services are needed.  If full MIB-II support is used, this group and all othergroups can be initialized and deleted by calling m2Init() and m2Delete().The group scalar variables are accessed by calling m2UdpGroupInfoGet()as follows:.CS    M2_UDP   udpVars;    if (m2UdpGroupInfoGet (&udpVars) == OK)	/@ values in udpVars are valid @/.CEThe UDP table of listeners can be accessed in lexicographical order.The first entry in the table can be accessed by setting the tableindex to zero in a call to m2UdpTblEntryGet().  Every other entrythereafter can be accessed by incrementing the index returned from theprevious invocation to the next possible lexicographical index, andrepeatedly calling m2UdpTblEntryGet() with the M2_NEXT_VALUE constantas the search parameter. For example:.CSM2_UDPTBL  udpEntry;    /@ Specify zero index to get the first entry in the table @/    udpEntry.udpLocalAddress = 0;    /@ local IP Address in host byte order  @/    udpEntry.udpLocalPort    = 0;    /@ local port Number                  @/    /@ get the first entry in the table @/    if ((m2UdpTblEntryGet (M2_NEXT_VALUE, &udpEntry) == OK)	/@ values in udpEntry in the first entry are valid  @/    /@ process first entry in the table @/    /@      * For the next call, increment the index returned in the previous call.     * The increment is to the next possible lexicographic entry; for     * example, if the returned index was 0.0.0.0.3000 the index passed in the     * next invocation should be 0.0.0.0.3001.  If an entry in the table     * matches the specified index, then that entry is returned.       * Otherwise the closest entry following it, in lexicographic order,     * is returned.     @/    /@ get the second entry in the table @/    if ((m2UdpTblEntryGet (M2_NEXT_VALUE, &udpEntry) == OK)	/@ values in udpEntry in the second entry are valid  @/.CEINCLUDE FILES: m2Lib.h SEE ALSO:m2Lib, m2IfLib, m2IpLib, m2IcmpLib, m2TcpLib, m2SysLib*//* includes */#include "vxWorks.h"#include "vwModNum.h"#include "m2Lib.h"#include "socket.h"#include <net/route.h>#include <netinet/in.h>#include <netinet/ip.h>#include <netinet/ip_var.h>#include <netinet/udp.h>#include <netinet/udp_var.h>#include <netinet/in_pcb.h>#include "errnoLib.h"#ifdef VIRTUAL_STACK#include "netinet/vsLib.h"#endif    /* VIRTUAL_STACK *//* external declarations */#ifndef VIRTUAL_STACKextern struct udpstat     udpstat;	/* UDP statistics variable */extern struct inpcbhead   udb;		/* UDP link list of listen requests */#endif    /* VIRTUAL_STACK *//********************************************************************************* m2UdpInit - initialize MIB-II UDP-group access** This routine allocates the resources needed to allow access to the UDP * MIB-II variables.  This routine must be called before any UDP variables* can be accessed.** RETURNS: OK, always.** SEE ALSO:* m2UdpGroupInfoGet(), m2UdpTblEntryGet(), m2UdpDelete()*/STATUS m2UdpInit (void)    {    return (OK);    }/********************************************************************************* m2UdpGroupInfoGet - get MIB-II UDP-group scalar variables** This routine fills in the UDP structure at <pUdpInfo> with the MIB-II* UDP scalar variables.** RETURNS: OK, or ERROR if <pUdpInfo> is not a valid pointer.** ERRNO:* S_m2Lib_INVALID_PARAMETER** SEE ALSO:* m2UdpInit(), m2UdpTblEntryGet(), m2UdpDelete()*/STATUS m2UdpGroupInfoGet    (    M2_UDP * pUdpInfo		/* pointer to the UDP group structure */    )    {     /* Validate Pointer to UDP structure */     if (pUdpInfo == NULL)	{	errnoSet (S_m2Lib_INVALID_PARAMETER);        return (ERROR);	}     pUdpInfo->udpNoPorts      = udpstat.udps_noport + 				udpstat.udps_noportbcast;     pUdpInfo->udpOutDatagrams = udpstat.udps_opackets;    /*  The number UDP packets deliever to UDP users. */    pUdpInfo->udpInDatagrams  = udpstat.udps_ipackets    -                                (udpstat.udps_hdrops     +                                udpstat.udps_badsum      +                                udpstat.udps_badlen      +                                udpstat.udps_noportbcast +                                udpstat.udps_fullsock);     /*  The number UDP packets not deliever due to errors */    pUdpInfo->udpInErrors     = udpstat.udps_hdrops +                                udpstat.udps_badsum +                                udpstat.udps_badlen;     return (OK);    }/********************************************************************************* m2UdpTblEntryGet - get a UDP MIB-II entry from the UDP list of listeners** This routine traverses the UDP table of listeners and does an* M2_EXACT_VALUE or a M2_NEXT_VALUE search based on the* <search> parameter.  The calling routine is responsible for* supplying a valid MIB-II entry index in the input structure* <pUdpEntry>.  The index is made up of the IP address and the local* port number.  The first entry in the table is retrieved by doing a* M2_NEXT_VALUE search with the index fields set to zero.** RETURNS:* OK, or ERROR if the input parameter is not specified or a match is not * found.** ERRNO:*  S_m2Lib_INVALID_PARAMETER*  S_m2Lib_ENTRY_NOT_FOUND** SEE ALSO:* m2Lib, m2UdpInit(), m2UdpGroupInfoGet(), m2UdpDelete()*/STATUS m2UdpTblEntryGet    (    int              search,        /* M2_EXACT_VALUE or M2_NEXT_VALUE */    M2_UDPTBL      * pUdpEntry      /* ptr to the requested entry with index */    )    {    M2_UDPTBL        savedEntry;    /* Possible M2_NEXT_VALUE Entry in UDP */				    /* table */    M2_UDPTBL        currEntry;    int              netLock;       /* Use to secure the Network Code Access */    struct inpcb   * pPcb;          /* Pointer to UDP Listener structure. */      /* Validate Pointer to UDP Table Entry structure */     if (pUdpEntry == NULL)	{	errnoSet (S_m2Lib_INVALID_PARAMETER);        return (ERROR);	}     /*      * Initialize Entry for M2_NEXT_VALUE entry search.  Not used in     * M2_EXACT_VALUE search.     */     savedEntry.udpLocalAddress = -1;    /* Largest possible value. */    savedEntry.udpLocalPort    = -1;    /* Largest possible value. */     netLock = splnet ();             /* Get exclusive access to Network Code */     for (pPcb = udb.lh_first; pPcb != NULL; pPcb = pPcb->inp_list.le_next )        {	currEntry.udpLocalAddress = ntohl (pPcb->inp_laddr.s_addr);	currEntry.udpLocalPort    = ntohs (pPcb->inp_lport);        if (search == M2_EXACT_VALUE)            {	    /* Check that the specified index matches the current entry */            if ((pUdpEntry->udpLocalAddress == currEntry.udpLocalAddress) &&                (pUdpEntry->udpLocalPort == currEntry.udpLocalPort))                {                splx (netLock);   /* Give up exclusive access to Network Code */                return (OK);      /* The answer is in the structure pUdpEntry */                }            }        else            {            /*             * A NEXT search is satisfied by an entry that is lexicographicaly             * equal to or greater than the input UDP connection entry. Because	     * the UDP connection list is not in order, the list must be 	     * traverse completely before a selection is made.  The rules for a 	     * lexicographical comparison are built in the next statement.             */  	    if (((currEntry.udpLocalAddress > pUdpEntry->udpLocalAddress) ||		  ((currEntry.udpLocalAddress == pUdpEntry->udpLocalAddress) &&		   (currEntry.udpLocalPort >= pUdpEntry->udpLocalPort))) &&                 ((currEntry.udpLocalAddress < savedEntry.udpLocalAddress) ||                   ((currEntry.udpLocalAddress == savedEntry.udpLocalAddress) &&                    (currEntry.udpLocalPort < savedEntry.udpLocalPort))))                {		/* 		 * Save the entry which qualifies as the NEXT greater 		 * lexicographic entry.  Because the table is not order the		 * search must proceed to the end of the table.		 */                savedEntry.udpLocalAddress =  currEntry.udpLocalAddress;                savedEntry.udpLocalPort    =  currEntry.udpLocalPort;                }            }        }     splx (netLock);             /* Give up exclusive access to Network Code */    /* If a match was found fill, the requested structure */    if (savedEntry.udpLocalPort != -1)        {        pUdpEntry->udpLocalAddress = savedEntry.udpLocalAddress;        pUdpEntry->udpLocalPort    = savedEntry.udpLocalPort;        return (OK);        }     errnoSet (S_m2Lib_ENTRY_NOT_FOUND);    return (ERROR);    }/********************************************************************************* m2UdpDelete - delete all resources used to access the UDP group** This routine frees all the resources allocated at the time the group was* initialized.  The UDP group should not be accessed after this routine has been* called.** RETURNS: OK, always.** SEE ALSO:* m2UdpInit(), m2UdpGroupInfoGet(), m2UdpTblEntryGet()*/STATUS m2UdpDelete (void)    {    return (OK);    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -