+/*****************************************************************************
+ * Function: var_lnetInformation
+ *
+ ****************************************************************************/
+unsigned char *
+var_lnetInformation(struct variable *vp,
+ oid *name,
+ size_t *length,
+ int exact,
+ size_t *var_len,
+ WriteMethod **write_method)
+{
+ /* variables we may use later */
+ static unsigned char string[SPRINT_MAX_LEN];
+ static unsigned int i[7];
+ static unsigned long long ull[4];
+ static unsigned long next_update;
+ static counter64 c64;
+ static unsigned int c32;
+ struct timeval current_tv;
+ unsigned long current;
+ char file_path[MAX_PATH_SIZE];
+
+ /* Update at most every LNET_STATS_INTERVAL milliseconds */
+ gettimeofday(¤t_tv, NULL);
+ current = current_tv.tv_sec * 1000000 + current_tv.tv_usec;
+ if (current >= next_update) {
+ sprintf(file_path, "%s%s", LNET_PATH, "stats");
+ if (read_string(file_path, (char *) string, sizeof(string))
+ != SUCCESS)
+ return NULL;
+
+ sscanf((char *) string,
+ "%u %u %u %u %u %u %u %llu %llu %llu %llu",
+ &i[0], &i[1], &i[2], &i[3], &i[4], &i[5], &i[6],
+ &ull[0], &ull[1], &ull[2], &ull[3]);
+
+ next_update = current + (LNET_CHECK_INTERVAL * 1000);
+ }
+
+ if (header_generic(vp, name, length, exact, var_len, write_method)
+ == MATCH_FAILED)
+ return NULL;
+
+ switch (vp->magic) {
+ case LNETMSGSALLOC:
+ *var_len = sizeof(c32);
+ c32 = i[0];
+ return (unsigned char *) &c32;
+ case LNETMSGSMAX:
+ *var_len = sizeof(c32);
+ c32 = i[1];
+ return (unsigned char *) &c32;
+ case LNETERRORS:
+ *var_len = sizeof(c32);
+ c32 = i[2];
+ return (unsigned char *) &c32;
+ case LNETSENDCOUNT:
+ *var_len = sizeof(c32);
+ c32 = i[3];
+ return (unsigned char *) &c32;
+ case LNETRECVCOUNT:
+ *var_len = sizeof(c32);
+ c32 = i[4];
+ return (unsigned char *) &c32;
+ case LNETROUTECOUNT:
+ *var_len = sizeof(c32);
+ c32 = i[5];
+ return (unsigned char *) &c32;
+ case LNETDROPCOUNT:
+ *var_len = sizeof(c32);
+ c32 = i[6];
+ return (unsigned char *) &c32;
+ case LNETSENDBYTES:
+ convert_ull(&c64, ull[0], var_len);
+ return (unsigned char *) &c64;
+ case LNETRECVBYTES:
+ convert_ull(&c64, ull[1], var_len);
+ return (unsigned char *) &c64;
+ case LNETROUTEBYTES:
+ convert_ull(&c64, ull[2], var_len);
+ return (unsigned char *) &c64;
+ case LNETDROPBYTES:
+ convert_ull(&c64, ull[3], var_len);
+ return (unsigned char *) &c64;
+ default:
+ return NULL;
+ }
+}
+
+/*****************************************************************************
+ * Function: var_mdsNbSampledReq
+ *
+ ****************************************************************************/
+unsigned char *
+var_mdsNbSampledReq(struct variable *vp,
+ oid *name,
+ size_t *length,
+ int exact,
+ size_t *var_len,
+ WriteMethod **write_method)
+{
+ unsigned long long nb_sample=0,min=0,max=0,sum=0,sum_square=0;
+ static counter64 c64;
+
+ if (header_generic(vp,name,length,exact,var_len,write_method)
+ == MATCH_FAILED )
+ return NULL;
+
+ if( mds_stats_values(STR_REQ_WAITIME,&nb_sample,&min,&max,&sum,&sum_square) == ERROR) return NULL;
+
+ c64.low = (u_long) (0x0FFFFFFFF & nb_sample);
+ nb_sample >>= 32;
+ c64.high = (u_long) (0x0FFFFFFFF & nb_sample);
+
+ *var_len = sizeof(c64);
+ return (unsigned char *) &c64;
+}
+