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

VxWorks

开发平台:

C/C++

  1. /* m2RipLib.c - VxWorks interface routines to RIP for SNMP Agent */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01n,15oct01,rae  merge from truestack ver 01o, base 01m (VIRTUAL_STACK)
  7. 01m,30jun98,spm  corrected authentication to allow change to shorter key
  8. 01l,26jun98,spm  changed RIP_MCAST_ADDR constant from string to value; altered
  9.                  multicast group handling to comply with ANVL RIP tests
  10. 01k,25oct97,kbw  making minor man page fixes
  11. 01j,06oct97,gnn  cleaned up issues with IMPORT of ripState
  12. 01i,15may97,gnn  cleaned up some warnings; #ifdef'd out some test code
  13. 01h,08may97,gnn  fixed the authentication string code.
  14. 01g,30apr97,kbw  fiddled man page text
  15. 01f,28apr97,gnn  fixed some of the documentation
  16. 01e,24apr97,gnn  fixed an errno value
  17. 01d,20apr97,kbw  fixed man page format, spell check
  18. 01c,17apr97,gnn  modified interfaces and variable to follow standards.
  19. 01b,14apr97,gnn  added documentation for MIB-II stuff.
  20. 01a,01apr97,gnn  written.
  21. */
  22.  
  23. /*
  24. DESCRIPTION
  25. This library provides routines to initialize the group, access the
  26. group global variables, read the table of network interfaces that RIP
  27. knows about, and change the state of such an interface.  For a broader
  28. description of MIB-II services, see the manual entry for m2Lib.
  29. USING THIS LIBRARY
  30. This library can be initialized and deleted by calling m2RipInit() and
  31. m2RipDelete() respectively, if only the RIP group's services are needed.
  32. If full MIB-II support is used, this group and all other groups can be
  33. initialized and deleted by calling m2Init() and m2Delete().
  34. The group global variables are accessed by calling
  35. m2RipGlobalCountersGet() as follows:
  36. .CS
  37.     M2_RIP2_GLOBAL_GROUP   ripGlobal;
  38.     if (m2RipGlobalCountersGet (&ripGlobal) == OK)
  39. /@ values in ripGlobal are valid @/
  40. .CE
  41. To retrieve the RIP group statistics for a particular interface you call the
  42. m2RipIfStatEntryGet() routine a pointer to an M2_RIP2_IFSTAT_ENTRY structure 
  43. that contains the address of the interface you are searching for.  For example:
  44. .CS
  45.     M2_RIP2_IFSTAT_ENTRY ripIfStat;
  46.     
  47. ripIfStat.rip2IfStatAddress = inet_addr("90.0.0.3");
  48. if (m2RipIfStatEntryGet(M2_EXACT_VALUE, &ripIfStat) == OK)
  49. /@ values in ripIfState are valid @/
  50. .CE
  51. To retrieve the configuration statistics for a particular interface the
  52. m2RipIfConfEntryGet() routine must be called with an IP address encoded in an
  53. M2_RIP2_IFSTAT_ENTRY structure which is passed as the second argument.  For
  54. example:
  55. .CS
  56.     M2_RIP2_IFCONF_ENTRY ripIfConf;
  57.     
  58. ripIfConf.rip2IfConfAddress = inet_addr("90.0.0.3");
  59. if (m2RipIfConfEntryGet(M2_EXACT_VALUE, &ripIfConf) == OK)
  60. /@ values in ripIfConf are valid @/
  61. .CE
  62. To set the values of for an interface the m2RipIfConfEntrySet() routine must
  63. be called with an IP address in dot notation encoded into an
  64. M2_RIP2_IFSTAT_ENTRY structure, which is passed as the second argument.  For
  65. example:
  66. .CS
  67.     M2_RIP2_IFCONF_ENTRY ripIfConf;
  68. ripIfConf.rip2IfConfAddress = inet_addr("90.0.0.3");
  69. /@ Set the authorization type. @/
  70. ripIfConf.rip2IfConfAuthType = M2_rip2IfConfAuthType_simplePassword;
  71. bzero(ripIfConf.rip2IfConfAuthKey, 16);
  72. bcopy("Simple Password ", ripIfConf.rip2IfConfAuthKey, 16);
  73. /@ We only accept version 1 packets. @/
  74. ripIfConf.rip2IfConfSend = M2_rip2IfConfSend_ripVersion1;
  75. /@ We only send version 1 packets. @/
  76. ripIfConf.rip2IfConfReceive = M2_rip2IfConfReceive_rip1;
  77. /@ Default routes have a metric of 2 @/
  78. ripIfConf.rip2IfConfDefaultMetric = 2;
  79. /@ If the interface is invalid it is turned off, we make it valid. @/
  80. ripIfConf.rip2IfConfStatus = M2_rip2IfConfStatus_valid;
  81. if (m2RipIfConfEntrySet(varsToSet, &ripIfConf) == OK)
  82. /@ Call succeded. @/
  83. .CE
  84. INCLUDE FILES: rip/m2RipLib.h rip/defs.h
  85. SEE ALSO:
  86. ripLib
  87. */
  88. /* includes */
  89. #include "vxWorks.h"
  90. #include "rip/m2RipLib.h"
  91. #include "rip/defs.h"
  92. #include "m2Lib.h"
  93. #include "errnoLib.h"
  94. #include "errno.h"
  95. #include "inetLib.h"
  96. #ifdef VIRTUAL_STACK
  97. #include "netinet/vsLib.h"
  98. #include "netinet/vsRip.h"
  99. #endif
  100. /* defines */
  101. #define same(a1, a2) 
  102. (memcmp((a1)->sa_data, (a2)->sa_data, 14) == 0)
  103. /* typedefs */
  104. /* globals */
  105. #ifndef VIRTUAL_STACK
  106. extern struct interface *ripIfNet;
  107. #endif
  108. /* locals */
  109. /* forward declarations */
  110. /******************************************************************************
  111. *
  112. * m2RipInit - initialize the RIP MIB support
  113. *
  114. * This routine sets up the RIP MIB and should be called before any 
  115. * other m2RipLib routine.
  116. *
  117. * RETURNS: OK, always.
  118. *
  119. */
  120. STATUS m2RipInit (void)
  121.     {
  122.     return (OK);
  123.     }
  124. /******************************************************************************
  125. *
  126. * m2RipDelete - delete the RIP MIB support
  127. *
  128. * This routine should be called after all m2RipLib calls are completed.
  129. *
  130. * RETURNS: OK, always. 
  131. *
  132. */
  133. STATUS m2RipDelete (void)
  134.     {
  135.     return (OK);
  136.     }
  137. /******************************************************************************
  138. *
  139. * m2RipGlobalCountersGet - get MIB-II RIP-group global counters
  140. *
  141. * This routine fills in an M2_RIP2_GLOBAL_GROUP structure pointed to 
  142. * by <pRipGlobal> with the values of the MIB-II RIP-group global counters.
  143. *
  144. * RETURNS: OK or ERROR. 
  145. *
  146. * ERRNO:
  147. *  S_m2Lib_INVALID_PARAMETER
  148. *
  149. * SEE ALSO:
  150. * m2RipInit()
  151. */
  152. STATUS m2RipGlobalCountersGet
  153.     (
  154.     M2_RIP2_GLOBAL_GROUP* pRipGlobal
  155.     )
  156.     {
  157. #ifndef VIRTUAL_STACK
  158.     extern RIP ripState;
  159. #endif
  160.     if (pRipGlobal == NULL)
  161.         {
  162.         errnoSet(S_m2Lib_INVALID_PARAMETER);
  163.         return (ERROR);
  164.         }
  165.     bcopy((char *)&ripState.ripGlobal, (char *)pRipGlobal,
  166.           sizeof(M2_RIP2_GLOBAL_GROUP));
  167.     return (OK);
  168.     }
  169. /******************************************************************************
  170. *
  171. * m2RipIfStatEntryGet - get MIB-II RIP-group interface entry
  172. *
  173. * This routine retrieves the interface statistics for the interface serving
  174. * the subnet of the IP address contained in the M2_RIP2_IFSTAT_ENTRY
  175. * structure.  <pRipIfStat> is a pointer to an M2_RIP2_IFSTAT_ENTRY structure
  176. * which the routine will fill in upon successful completion.
  177. *
  178. * This routine either returns an exact match if <search> is M2_EXACT_VALUE,
  179. * or the next value greater than or equal to the value supplied if the
  180. * <search> is M2_NEXT_VALUE.
  181. *
  182. * RETURNS: OK, or ERROR if either <pRipIfStat> is invalid or an exact match
  183. * failed.
  184. *
  185. * ERRNO:
  186. *  S_m2Lib_INVALID_PARAMETER
  187. *  S_m2Lib_ENTRY_NOT_FOUND
  188. * SEE ALSO:
  189. * m2RipInit()
  190. */
  191. STATUS m2RipIfStatEntryGet
  192.     (
  193.     int search,
  194.     M2_RIP2_IFSTAT_ENTRY* pRipIfStat
  195.     )
  196.     {
  197.     struct interface* pIfp;
  198.     struct interface* pIfpSaved = NULL;
  199.     struct sockaddr_in address;
  200.     unsigned long ipAddrSaved = -1;
  201.     unsigned long currIpAddr;
  202.     
  203.     address.sin_addr.s_addr = pRipIfStat->rip2IfStatAddress;
  204.     address.sin_family = AF_INET;
  205.         
  206.     if (search == M2_EXACT_VALUE)
  207.         {
  208.         
  209.         pIfpSaved = ripIfLookup((struct sockaddr *)&address);
  210.         
  211.         if (pIfpSaved == NULL)
  212.             {
  213.             errnoSet(S_m2Lib_ENTRY_NOT_FOUND);
  214.             return (ERROR);
  215.             }
  216.         }
  217.     else
  218.         {
  219. for (pIfp = ripIfNet; pIfp; pIfp = pIfp->int_next)
  220.             {
  221.             currIpAddr = ntohl(((struct sockaddr_in *)&pIfp->int_addr)->sin_addr.s_addr);
  222.             if ((currIpAddr >= ntohl(address.sin_addr.s_addr)) &&
  223.                 (currIpAddr < ipAddrSaved))
  224.                 {
  225.                 pIfpSaved = pIfp;
  226.                 ipAddrSaved = currIpAddr;
  227.                 }
  228.             }
  229.         if (pIfpSaved == NULL)
  230.             {
  231.             errnoSet(S_m2Lib_ENTRY_NOT_FOUND);
  232.             return (ERROR);
  233.             }
  234.         }
  235.     bcopy((char *)&pIfpSaved->ifStat, (char *)pRipIfStat,
  236.           sizeof(M2_RIP2_IFSTAT_ENTRY));
  237.     return (OK);
  238.     }
  239. /******************************************************************************
  240. *
  241. * m2RipIfConfEntryGet - get MIB-II RIP-group interface entry
  242. *
  243. * This routine retrieves the interface configuration for the interface serving
  244. * the subnet of the IP address contained in the M2_RIP2_IFCONF_ENTRY structure
  245. * passed to it.  <pRipIfConf> is a pointer to an M2_RIP2_IFCONF_ENTRY 
  246. * structure which the routine will fill in upon successful completion.
  247. *
  248. * This routine either returns an exact match if <search> is M2_EXACT_VALUE,
  249. * or the next value greater than or equal to the value supplied if the
  250. * <search> is M2_NEXT_VALUE.
  251. *
  252. * RETURNS: OK, or ERROR if <pRipIfConf> was invalid or the interface was
  253. * not found.
  254. *
  255. * ERRNO:
  256. *  S_m2Lib_INVALID_PARAMETER
  257. *  S_m2Lib_ENTRY_NOT_FOUND
  258. *
  259. * SEE ALSO:
  260. * m2RipInit()
  261. */
  262. STATUS m2RipIfConfEntryGet
  263.     (
  264.     int search,
  265.     M2_RIP2_IFCONF_ENTRY* pRipIfConf
  266.     )
  267.     {
  268.     struct interface* pIfp;
  269.     struct sockaddr_in address;
  270.     struct interface* pIfpSaved = NULL;
  271.     unsigned long ipAddrSaved = -1;
  272.     unsigned long currIpAddr;
  273.     
  274.     address.sin_addr.s_addr = pRipIfConf->rip2IfConfAddress;
  275.     address.sin_family = AF_INET;
  276.     
  277.     if (search == M2_EXACT_VALUE)
  278.         {
  279.         
  280.         pIfpSaved = ripIfLookup((struct sockaddr *)&address);
  281.         
  282.         if (pIfpSaved == NULL)
  283.             {
  284.             errnoSet(S_m2Lib_ENTRY_NOT_FOUND);
  285.             return (ERROR);
  286.             }
  287.         }
  288.     else
  289.         {
  290. for (pIfp = ripIfNet; pIfp; pIfp = pIfp->int_next)
  291.             {
  292.             currIpAddr = ntohl(((struct sockaddr_in *)&pIfp->int_addr)->sin_addr.s_addr);
  293.             if ((currIpAddr >= ntohl(address.sin_addr.s_addr)) &&
  294.                 (currIpAddr < ipAddrSaved))
  295.                 {
  296.                 pIfpSaved = pIfp;
  297.                 ipAddrSaved = currIpAddr;
  298.                 }
  299.             }
  300.         if (pIfpSaved == NULL)
  301.             {
  302.             errnoSet(S_m2Lib_ENTRY_NOT_FOUND);
  303.             return (ERROR);
  304.             }
  305.         }
  306.     bcopy((char *)&pIfpSaved->ifConf, (char *)pRipIfConf,
  307.           sizeof(M2_RIP2_IFCONF_ENTRY));
  308.     return (OK);
  309.     }
  310. #if 0
  311. void m2RipIfConfTest
  312.     (
  313.     char* pIpAddr
  314.     )
  315.     {
  316.     M2_RIP2_IFCONF_ENTRY ripIfConf;
  317.     
  318.     ripIfConf.rip2IfConfAddress = inet_addr(pIpAddr);
  319.     
  320.     if (m2RipIfConfEntryGet(M2_EXACT_VALUE, &ripIfConf) != OK)
  321.         return;
  322.     printf("IP Address: %snAuthType: %ldnAuthKey: %snSend: %ldn",
  323.            inet_ntoa(ripIfConf.rip2IfConfAddress),
  324.            ripIfConf.rip2IfConfAuthType,
  325.            ripIfConf.rip2IfConfAuthKey,
  326.            ripIfConf.rip2IfConfSend);
  327.     printf("Receive: %ldnDefault Metric: %ldnStatus: %ldn",
  328.            ripIfConf.rip2IfConfReceive,
  329.            ripIfConf.rip2IfConfDefaultMetric,
  330.            ripIfConf.rip2IfConfStatus);
  331.     
  332.     }
  333. #endif
  334. /******************************************************************************
  335. *
  336. * m2RipIfConfEntrySet - set MIB-II RIP-group interface entry
  337. *
  338. * This routine sets the interface configuration for the interface serving
  339. * the subnet of the IP address contained in the M2_RIP2_IFCONF_ENTRY structure.
  340. *
  341. * <pRipIfConf> is a pointer to an M2_RIP2_IFCONF_ENTRY structure which the
  342. * routine places into the system based on the <varToSet> value. 
  343. *
  344. * RETURNS: OK, or ERROR if <pRipIfConf> is invalid or the interface cannot
  345. * be found.
  346. *
  347. * ERRNO:
  348. *  S_m2Lib_INVALID_PARAMETER
  349. *  S_m2Lib_ENTRY_NOT_FOUND
  350. *
  351. * SEE ALSO:
  352. * m2RipInit()
  353. */
  354. STATUS m2RipIfConfEntrySet
  355.     (
  356.     unsigned int varToSet,
  357.     M2_RIP2_IFCONF_ENTRY* pRipIfConf
  358.     )
  359.     {
  360.     struct interface* pIfp;
  361.     struct sockaddr_in address;
  362. #ifndef VIRTUAL_STACK
  363.     IMPORT RIP ripState;
  364. #endif
  365.     BOOL changeFlag = FALSE;  /* Changing receive control switch? */
  366.     address.sin_addr.s_addr = pRipIfConf->rip2IfConfAddress;
  367.     address.sin_family = AF_INET;
  368.     
  369.     pIfp = ripIfLookup((struct sockaddr *)&address);
  370.     
  371.     if (pIfp == NULL)
  372.         {
  373.         errnoSet(S_m2Lib_ENTRY_NOT_FOUND);
  374.         return (ERROR);
  375.         }
  376.     if (varToSet & M2_RIP2_IF_CONF_DOMAIN)
  377.         {
  378.         bcopy(pRipIfConf->rip2IfConfDomain, pIfp->ifConf.rip2IfConfDomain,
  379.               2);
  380.         }
  381.     if (varToSet & M2_RIP2_IF_CONF_AUTH_TYPE)
  382.         {
  383.         pIfp->ifConf.rip2IfConfAuthType = pRipIfConf->rip2IfConfAuthType;
  384.         }
  385.     
  386.     if (varToSet & M2_RIP2_IF_CONF_AUTH_KEY)
  387.         {
  388.         bzero (pIfp->ifConf.rip2IfConfAuthKey, AUTHKEYLEN);
  389.         strncpy(pIfp->ifConf.rip2IfConfAuthKey, pRipIfConf->rip2IfConfAuthKey,
  390.               AUTHKEYLEN);
  391.         }
  392.     if (varToSet & M2_RIP2_IF_CONF_SEND)
  393.         {
  394.         pIfp->ifConf.rip2IfConfSend = pRipIfConf->rip2IfConfSend;
  395.         }
  396.     if (varToSet & M2_RIP2_IF_CONF_RECEIVE)
  397.         {
  398.         if (pIfp->ifConf.rip2IfConfReceive != pRipIfConf->rip2IfConfReceive)
  399.             changeFlag = TRUE;
  400.         if (changeFlag)
  401.             {
  402.             /* Add to multicast group if changing to RIPv2 packets only. */
  403.             if (pRipIfConf->rip2IfConfReceive == M2_rip2IfConfReceive_rip2)
  404.                 if (ripState.s != 0)
  405.                     ripSetInterfaces(ripState.s, (UINT32)RIP_MCAST_ADDR);
  406.             /*
  407.              * ANVL 16.1 - remove from multicast group if changing to 
  408.              *             receive any RIPv1 packets.
  409.              */
  410.             if (pIfp->ifConf.rip2IfConfReceive == M2_rip2IfConfReceive_rip2)
  411.                 if (ripState.s != 0)
  412.                     ripClearInterfaces(ripState.s, (UINT32)RIP_MCAST_ADDR);
  413.             pIfp->ifConf.rip2IfConfReceive = pRipIfConf->rip2IfConfReceive;
  414.             }
  415.         }
  416.     if (varToSet & M2_RIP2_IF_CONF_DEFAULT_METRIC)
  417.         {
  418.         pIfp->ifConf.rip2IfConfDefaultMetric =
  419.             pRipIfConf->rip2IfConfDefaultMetric;
  420.         }
  421.     
  422.     if (varToSet & M2_RIP2_IF_CONF_STATUS)
  423.         {
  424.         pIfp->ifConf.rip2IfConfStatus = pRipIfConf->rip2IfConfStatus;
  425.         }
  426.     
  427.     return (OK);
  428.     }
  429. #if 0 
  430. void m2RipIfConfSetTest
  431.     (
  432.     char* pIpAddr,
  433.     long authType,         /* Authentication type */
  434.     char authKey[15],      /* Key */
  435.     long send,             /* What version to send */
  436.     long receive,          /* What version to listen to */
  437.     long defaultMetric,    /* Default metric for default route */
  438.     long status            /* Putting M2_rip2IfConfStatus_invalid */
  439.                            /* here turns the interface off */
  440.     )
  441.     {
  442.     M2_RIP2_IFCONF_ENTRY ripIfConf;
  443.     
  444.     ripIfConf.rip2IfConfAddress = inet_addr(pIpAddr);
  445.     ripIfConf.rip2IfConfAuthType = authType;
  446.     bzero(ripIfConf.rip2IfConfAuthKey, 16);
  447.     strcpy(ripIfConf.rip2IfConfAuthKey, authKey);
  448.     ripIfConf.rip2IfConfSend = send;
  449.     ripIfConf.rip2IfConfReceive = receive;
  450.     ripIfConf.rip2IfConfDefaultMetric = defaultMetric;
  451.     ripIfConf.rip2IfConfStatus = status;
  452.     
  453.     if (m2RipIfConfEntrySet(0xff, &ripIfConf) != OK)
  454.         return;
  455.     if (m2RipIfConfEntryGet(M2_EXACT_VALUE, &ripIfConf) != OK)
  456.         return;
  457.     printf("IP Address: %snAuthType: %ldnAuthKey: %snSend: %ldn",
  458.            inet_ntoa(ripIfConf.rip2IfConfAddress),
  459.            ripIfConf.rip2IfConfAuthType,
  460.            ripIfConf.rip2IfConfAuthKey,
  461.            ripIfConf.rip2IfConfSend);
  462.     printf ("Receive: %ldnDefault Metric: %ldnStatus: %ldn",
  463.             ripIfConf.rip2IfConfReceive,
  464.             ripIfConf.rip2IfConfDefaultMetric,
  465.             ripIfConf.rip2IfConfStatus);
  466.     
  467.     }
  468. #endif