198 lines
6.1 KiB
C
198 lines
6.1 KiB
C
#include <netio.h>
|
|
#define WAIT_PCKS_COUNTER 15
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* init_osspecific()
|
|
*
|
|
* Init function
|
|
*
|
|
****************************************************************************/
|
|
|
|
void init_osspecific(netdata* data)
|
|
{
|
|
wait_pcks_counter = WAIT_PCKS_COUNTER+1;
|
|
|
|
#ifdef DEBUG
|
|
fprintf( stderr, "The netload plugin was initialized for HP_UX.\n" );
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* _countinterfaces()
|
|
*
|
|
* count all network interfaces in the system. This function is intended to
|
|
* use it only in hpux.c
|
|
*
|
|
****************************************************************************/
|
|
|
|
int _countinterfaces(void)
|
|
{
|
|
int val, num_iface=-1, sd;
|
|
if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
|
|
return (-1);
|
|
|
|
if (ioctl(sd, SIOCGIFNUM, &val) != -1)
|
|
num_iface = val;
|
|
close(sd);
|
|
|
|
return num_iface;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* _getifdata()
|
|
*
|
|
* get the Interface-ID, the Interface-Speed, and over all, check if the
|
|
* given interface really exists. This function is intended to use it only in
|
|
* hpux.c
|
|
*
|
|
****************************************************************************/
|
|
|
|
void _getifdata()
|
|
{
|
|
int buffer, fd, val, ret = -1;
|
|
unsigned int len, i;
|
|
char tmpinterfacestring[sizeof(data->ifdata.if_name)+1],*strstrmatch;
|
|
struct nmparms params;
|
|
mib_ifEntry * if_buf;
|
|
|
|
|
|
/*
|
|
* The interface description is more then the pure devicename.
|
|
* Let's do some formating to allow a propper pattern matching
|
|
*/
|
|
strcpy(tmpinterfacestring,data->ifdata.if_name);
|
|
strcat(tmpinterfacestring," ");
|
|
|
|
for (i=0; i <= data->ifdata.if_amount; i++)
|
|
{
|
|
if ((fd = open_mib("/dev/lan", O_RDWR, i, 0)) >= 0)
|
|
{
|
|
if ((if_buf = (mib_ifEntry *) malloc (sizeof(mib_ifEntry))) != 0) {
|
|
params.objid = ID_ifEntry;
|
|
params.buffer = if_buf;
|
|
len = sizeof(mib_ifEntry);
|
|
params.len = &len;
|
|
if_buf->ifIndex = i+1;
|
|
if ((ret = get_mib_info(fd, ¶ms)) == 0) {
|
|
/*
|
|
* The interface given by the user must start at the
|
|
* beginning of if_buf->ifDescr. If that's the case,
|
|
* strstrmatch is equal to if_buf->ifDescr. If not,
|
|
* strstrmatch might be a subset of if_buf->ifDescr,
|
|
* or NULL
|
|
*/
|
|
strstrmatch = strstr(if_buf->ifDescr, (char *)tmpinterfacestring);
|
|
if ( strstrmatch && (strcmp(strstrmatch,if_buf->ifDescr)== 0))
|
|
{
|
|
data->ifdata.if_valid = 1;
|
|
data->ifdata.if_id = i+1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
free(if_buf);
|
|
close_mib(fd);
|
|
}
|
|
return;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* checkinterface()
|
|
*
|
|
* check if a given interface exists, return 1 if it does and 0 if not (This
|
|
* function is a wrapper function for _countinterfaces && _getifdata.)
|
|
*
|
|
****************************************************************************/
|
|
int checkinterface(netdata* data)
|
|
{
|
|
/* == 0 no network interfaces, -1 sth. went wrong */
|
|
if ((data->ifdata.if_amount =_countinterfaces()) > 0)
|
|
_getifdata();
|
|
return data->ifdata.if_valid;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* get_stat()
|
|
*
|
|
* stub function for all unsupported operating systems
|
|
*
|
|
*****************************************************************************/
|
|
|
|
int get_stat(netdata* data)
|
|
{
|
|
int i,fd, ret=-1;
|
|
unsigned int len;
|
|
unsigned long rx_o, tx_o;
|
|
struct nmparms params, params2;
|
|
mib_ifEntry *if_buf;
|
|
|
|
if (data->ifdata.if_valid == 1 && (fd = open_mib("/dev/lan", O_RDWR, 0, 0)) >= 0)
|
|
{
|
|
if ((if_buf = (mib_ifEntry *) malloc (sizeof(mib_ifEntry))) != 0)
|
|
{
|
|
if_buf->ifIndex = data->ifdata.if_id;
|
|
params.objid = ID_ifEntry;
|
|
params.buffer = if_buf;
|
|
len = (unsigned int) sizeof(mib_ifEntry);
|
|
params.len = &len;
|
|
if ((ret = get_mib_info(fd, ¶ms)) == 0)
|
|
{
|
|
rx_o = data->stats.rx_bytes; tx_o = data->stats.tx_bytes;
|
|
|
|
data->stats.tx_bytes = if_buf->ifOutOctets;
|
|
data->stats.rx_bytes = if_buf->ifInOctets;
|
|
data->stats.tx_errors = if_buf->ifOutErrors;
|
|
data->stats.rx_errors = if_buf->ifInErrors;
|
|
|
|
if (rx_o > data->stats.rx_bytes)
|
|
data->stats.rx_over++;
|
|
if (tx_o > data->stats.tx_bytes)
|
|
data->stats.tx_over++;
|
|
}
|
|
}
|
|
free(if_buf);
|
|
|
|
/*
|
|
* Getting the tx/rx packets every run often hurts to much performance
|
|
* With WAIT_PCKS_COUNTER=15 i save on my system 43% cpu usage.instead of
|
|
* WAIT_PCKS_COUNTER=0
|
|
*/
|
|
if( data->wait_pcks_counter > WAIT_PCKS_COUNTER )
|
|
{
|
|
if ((if_ptr = (nmapi_logstat *) malloc(sizeof(nmapi_logstat) * data->ifdata.if_amount)) != 0 )
|
|
{
|
|
len = (unsigned int) data->ifdata.if_amount *sizeof(nmapi_logstat);
|
|
if ((ret = get_logical_stat(if_ptr, &len)) == 0)
|
|
{
|
|
for (i=0; i <= data->ifdata.if_amount; i++)
|
|
{
|
|
if(if_ptr[i].ifindex == data->ifdata.if_id)
|
|
{
|
|
data->stats.tx_packets = if_ptr[i].out_packets;
|
|
data->stats.rx_packets = if_ptr[i].in_packets;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
free(if_ptr);
|
|
data->wait_pcks_counter = 0;
|
|
}
|
|
else
|
|
{
|
|
data->wait_pcks_counter++;
|
|
}
|
|
}
|
|
close_mib(fd);
|
|
|
|
return(0);
|
|
}
|