hr_network.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:6k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  *  Host Resources MIB - network device group implementation - hr_network.c
  3.  *
  4.  */
  5. #include <net-snmp/net-snmp-config.h>
  6. #if HAVE_STRING_H
  7. #include <string.h>
  8. #else
  9. #include <strings.h>
  10. #endif
  11. #ifdef hpux11
  12. #include <sys/mib.h>
  13. #include <netinet/mib_kern.h>
  14. #endif
  15. #include "host_res.h"
  16. #include "mibII/interfaces.h"
  17. #include "hr_network.h"
  18.         /*********************
  19.  *
  20.  *  Kernel & interface information,
  21.  *   and internal forward declarations
  22.  *
  23.  *********************/
  24. void            Init_HR_Network(void);
  25. int             Get_Next_HR_Network(void);
  26. void            Save_HR_Network_Info(void);
  27. const char     *describe_networkIF(int);
  28. int             network_status(int);
  29. int             network_errors(int);
  30. int             header_hrnet(struct variable *, oid *, size_t *, int,
  31.                              size_t *, WriteMethod **);
  32. #define HRN_MONOTONICALLY_INCREASING
  33.         /*********************
  34.  *
  35.  *  Initialisation & common implementation functions
  36.  *
  37.  *********************/
  38. #define HRNET_IFINDEX 1
  39. struct variable4 hrnet_variables[] = {
  40.     {HRNET_IFINDEX, ASN_INTEGER, RONLY, var_hrnet, 2, {1, 1}}
  41. };
  42. oid             hrnet_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 3, 4 };
  43. void
  44. init_hr_network(void)
  45. {
  46.     init_device[HRDEV_NETWORK] = Init_HR_Network;
  47.     next_device[HRDEV_NETWORK] = Get_Next_HR_Network;
  48.     save_device[HRDEV_NETWORK] = Save_HR_Network_Info;
  49. #ifdef HRN_MONOTONICALLY_INCREASING
  50.     dev_idx_inc[HRDEV_NETWORK] = 1;
  51. #endif
  52.     device_descr[HRDEV_NETWORK] = describe_networkIF;
  53.     device_status[HRDEV_NETWORK] = network_status;
  54.     device_errors[HRDEV_NETWORK] = network_errors;
  55.     REGISTER_MIB("host/hr_network", hrnet_variables, variable4,
  56.                  hrnet_variables_oid);
  57. }
  58. /*
  59.  * header_hrnet(...
  60.  * Arguments:
  61.  * vp     IN      - pointer to variable entry that points here
  62.  * name    IN/OUT  - IN/name requested, OUT/name found
  63.  * length  IN/OUT  - length of IN/OUT oid's 
  64.  * exact   IN      - TRUE if an exact match was requested
  65.  * var_len OUT     - length of variable or 0 if function returned
  66.  * write_method
  67.  * 
  68.  */
  69. int
  70. header_hrnet(struct variable *vp,
  71.              oid * name,
  72.              size_t * length,
  73.              int exact, size_t * var_len, WriteMethod ** write_method)
  74. {
  75. #define HRNET_ENTRY_NAME_LENGTH 11
  76.     oid             newname[MAX_OID_LEN];
  77.     int             net_idx;
  78.     int             result;
  79.     int             LowIndex = -1;
  80.     DEBUGMSGTL(("host/hr_network", "var_hrnet: "));
  81.     DEBUGMSGOID(("host/hr_network", name, *length));
  82.     DEBUGMSG(("host/hr_network", " %dn", exact));
  83.     memcpy((char *) newname, (char *) vp->name, vp->namelen * sizeof(oid));
  84.     /*
  85.      * Find "next" net entry 
  86.      */
  87.     Init_HR_Network();
  88.     for (;;) {
  89.         net_idx = Get_Next_HR_Network();
  90.         if (net_idx == -1)
  91.             break;
  92.         newname[HRNET_ENTRY_NAME_LENGTH] = net_idx;
  93.         result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
  94.         if (exact && (result == 0)) {
  95.             LowIndex = net_idx;
  96.             break;
  97.         }
  98.         if (!exact && (result < 0) &&
  99.             (LowIndex == -1 || net_idx < LowIndex)) {
  100.             LowIndex = net_idx;
  101. #ifdef HRN_MONOTONICALLY_INCREASING
  102.             break;
  103. #endif
  104.         }
  105.     }
  106.     if (LowIndex == -1) {
  107.         DEBUGMSGTL(("host/hr_network", "... index out of rangen"));
  108.         return (MATCH_FAILED);
  109.     }
  110.     newname[HRNET_ENTRY_NAME_LENGTH] = LowIndex;
  111.     memcpy((char *) name, (char *) newname,
  112.            (vp->namelen + 1) * sizeof(oid));
  113.     *length = vp->namelen + 1;
  114.     *write_method = 0;
  115.     *var_len = sizeof(long);    /* default to 'long' results */
  116.     DEBUGMSGTL(("host/hr_network", "... get net stats "));
  117.     DEBUGMSGOID(("host/hr_network", name, *length));
  118.     DEBUGMSG(("host/hr_network", "n"));
  119.     return LowIndex;
  120. }
  121.         /*********************
  122.  *
  123.  *  System specific implementation functions
  124.  *
  125.  *********************/
  126. u_char         *
  127. var_hrnet(struct variable * vp,
  128.           oid * name,
  129.           size_t * length,
  130.           int exact, size_t * var_len, WriteMethod ** write_method)
  131. {
  132.     int             net_idx;
  133.     net_idx = header_hrnet(vp, name, length, exact, var_len, write_method);
  134.     if (net_idx == MATCH_FAILED)
  135.         return NULL;
  136.     switch (vp->magic) {
  137.     case HRNET_IFINDEX:
  138.         long_return = net_idx & ((1 << HRDEV_TYPE_SHIFT) - 1);
  139.         return (u_char *) & long_return;
  140.     default:
  141.         DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrnetn",
  142.                     vp->magic));
  143.     }
  144.     return NULL;
  145. }
  146.         /*********************
  147.  *
  148.  *  Internal implementation functions
  149.  *
  150.  *********************/
  151. #ifndef solaris2
  152. static short    HRN_index;
  153. #endif
  154. #ifdef hpux11
  155. static char     HRN_name[MAX_PHYSADDR_LEN];
  156. static nmapi_phystat HRN_ifnet;
  157. #define M_Interface_Scan_Next(a, b, c, d) Interface_Scan_Next(a, b, c)
  158. #else                           /* hpux11 */
  159. static char     HRN_name[16];
  160. static struct ifnet HRN_ifnet;
  161. #define M_Interface_Scan_Next(a, b, c, d) Interface_Scan_Next(a, b, c, d)
  162. #endif
  163. #ifdef hpux11
  164. static char     HRN_savedName[MAX_PHYSADDR_LEN];
  165. #else
  166. static char     HRN_savedName[16];
  167. #endif
  168. static u_short  HRN_savedFlags;
  169. static int      HRN_savedErrors;
  170. void
  171. Init_HR_Network(void)
  172. {
  173. #ifndef solaris2
  174.     Interface_Scan_Init();
  175. #endif
  176. }
  177. int
  178. Get_Next_HR_Network(void)
  179. {
  180. #ifndef solaris2
  181.     if (M_Interface_Scan_Next(&HRN_index, HRN_name, &HRN_ifnet, NULL))
  182.         return (HRDEV_NETWORK << HRDEV_TYPE_SHIFT) + HRN_index;
  183.     else
  184. #endif
  185.         return -1;
  186. }
  187. void
  188. Save_HR_Network_Info(void)
  189. {
  190.     strcpy(HRN_savedName, HRN_name);
  191. #ifdef hpux11
  192.     HRN_savedFlags = HRN_ifnet.if_entry.ifOper;
  193.     HRN_savedErrors = HRN_ifnet.if_entry.ifInErrors +
  194.         HRN_ifnet.if_entry.ifOutErrors;
  195. #else                           /* hpux11 */
  196.     HRN_savedFlags = HRN_ifnet.if_flags;
  197.     HRN_savedErrors = HRN_ifnet.if_ierrors + HRN_ifnet.if_oerrors;
  198. #endif                          /* hpux11 */
  199. }
  200. const char     *
  201. describe_networkIF(int idx)
  202. {
  203.     static char     string[1024];
  204.     snprintf(string, sizeof(string)-1, "network interface %s", HRN_savedName);
  205.     string[ sizeof(string)-1 ] = 0;
  206.     return string;
  207. }
  208. int
  209. network_status(int idx)
  210. {
  211. #ifdef hpux11
  212.     if (HRN_savedFlags == LINK_UP)
  213. #else
  214.     if (HRN_savedFlags & IFF_UP)
  215. #endif
  216.         return 2;               /* running */
  217.     else
  218.         return 5;               /* down */
  219. }
  220. int
  221. network_errors(int idx)
  222. {
  223.     return HRN_savedErrors;
  224. }