Skip to content
Snippets Groups Projects

RMON stats and Eth stats implementation for HSGMII LAN driver

Merged Arun Muthusamy requested to merge Bug_12103 into devel
3 files
+ 1021
0
Compare changes
  • Side-by-side
  • Inline
Files
3
+ 131
0
@@ -33,10 +33,14 @@
#include <sys/types.h>
#include <unistd.h>
#include <easy/easy.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/sockios.h>
#include "../ethernet.h"
#include "ecnt_prvt.h"
#include "fe_type.h"
#ifdef STATIC_ANALYSIS
#include "stub_libapi_lib_switchmgr.h"
@@ -51,12 +55,139 @@
#define IFNAME_ETH0 "eth0."
#define IFNAME_NAS "nas"
#define IFNAME_AE_WAN "ae_wan"
#define DRIVER_NAME "hsgmii_lan"
#define DRIVER_NAME_LEN 20
#define HSGMII_INDEX 2
/* Not defined in Econet library */
ECNT_SWITCHMGR_RET switchmgr_lib_get_port_link_state(u8 port,
ECNT_SWITCHMGR_LINK_STATE *p_link_state,
ECNT_SWITCHMGR_LINK_SPEED *p_speed);
static int get_drv_info_by_ifname(char *ifname, char *buffer)
{
int fd;
int ret = -1;
struct ifreq ifr;
struct ethtool_drvinfo info;
if (ifname == NULL || buffer == NULL)
return ret;
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0)
return ret;
memset(&info, 0, sizeof(info));
info.cmd = ETHTOOL_GDRVINFO;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
ifr.ifr_data = (void *)&info;
if (ioctl(fd, SIOCETHTOOL, &ifr) != 0)
goto exit;
strcpy(buffer, info.driver);
ret = 0;
exit:
close(fd);
return ret;
}
static int get_port_statistics(int function_id, struct ecnt_fe_data *para) {
int fd, ret = -1;
para->function_id = function_id;
para->index = HSGMII_INDEX;
fd = open("/dev/fe", O_RDWR);
if (fd < 0)
{
return -1;
}
ret = ioctl(fd, 0, para);
close(fd);
if(ret >= 0)
return 0;
return -1;
}
int hsgmii_lan_prvt_get_port_statistics(char *ifname, struct eth_stats *stats, struct eth_rmon_stats *rstats) {
char driver_name[DRIVER_NAME_LEN];
struct ecnt_fe_data para;
memset(&para,0,sizeof(struct ecnt_fe_data));
if (get_drv_info_by_ifname(ifname, driver_name))
return -1;
if (!strncmp(driver_name, DRIVER_NAME, DRIVER_NAME_LEN)) {
if (!get_port_statistics(FE_GET_HSGMII_LAN_TX_CNT, &para)) {
if (stats != NULL) {
stats->tx_bytes = 0;
stats->tx_packets = para.api_data.FE_TxCnt.txFrameCnt;
stats->tx_errors = 0;
stats->tx_ucast_packets = 0;
stats->tx_mcast_packets = para.api_data.FE_TxCnt.txBroadcastCnt;
stats->tx_bcast_packets = para.api_data.FE_TxCnt.txMulticastCnt;
stats->tx_discard_packets = para.api_data.FE_RxCnt.rxDropCnt;
stats->rx_unknown_packets = 0;
}
if (rstats != NULL) {
rstats->tx.packets = para.api_data.FE_TxCnt.txFrameCnt;
rstats->tx.bytes = 0;
rstats->tx.bcast_packets = para.api_data.FE_TxCnt.txMulticastCnt;
rstats->tx.mcast_packets = para.api_data.FE_TxCnt.txMulticastCnt;
rstats->tx.crc_err_packets = 0;
rstats->tx.under_sz_packets = 0;
rstats->tx.over_sz_packets = 0;
rstats->tx.packets_64bytes = para.api_data.FE_TxCnt.txEq64Cnt;
rstats->tx.packets_65to127bytes = para.api_data.FE_TxCnt.txFrom65To127Cnt;
rstats->tx.packets_256to511bytes = para.api_data.FE_TxCnt.txFrom256To511Cnt;
rstats->tx.packets_512to1023bytes = para.api_data.FE_TxCnt.txFrom512To1023Cnt;
rstats->tx.packets_1024to1518bytes = para.api_data.FE_TxCnt.txFrom1024To1518Cnt;
}
}
if (!get_port_statistics(FE_GET_HSGMII_LAN_RX_CNT, &para)) {
if (rstats != NULL) {
rstats->rx.packets = para.api_data.FE_RxCnt.rxFrameCnt;
rstats->rx.bytes = 0;
rstats->rx.bcast_packets = para.api_data.FE_RxCnt.rxMulticastCnt;
rstats->rx.mcast_packets = para.api_data.FE_RxCnt.rxMulticastCnt;
rstats->rx.crc_err_packets = para.api_data.FE_RxCnt.rxCrcCnt;
rstats->rx.under_sz_packets = para.api_data.FE_RxCnt.rxUnderSizeCnt;
rstats->rx.over_sz_packets = para.api_data.FE_RxCnt.rxOversizeCnt;
rstats->rx.packets_64bytes = para.api_data.FE_RxCnt.rxEq64Cnt;
rstats->rx.packets_65to127bytes = para.api_data.FE_RxCnt.rxFrom65To127Cnt;
rstats->rx.packets_256to511bytes = para.api_data.FE_RxCnt.rxFrom256To511Cnt;
rstats->rx.packets_512to1023bytes = para.api_data.FE_RxCnt.rxFrom512To1023Cnt;
rstats->rx.packets_1024to1518bytes = para.api_data.FE_RxCnt.rxFrom1024To1518Cnt;
}
if (stats != NULL) {
stats->rx_bytes = 0;
stats->rx_packets = para.api_data.FE_RxCnt.rxFrameCnt;
stats->rx_errors = 0;
stats->rx_ucast_packets = 0;
stats->rx_mcast_packets = para.api_data.FE_RxCnt.rxMulticastCnt;
stats->rx_bcast_packets = para.api_data.FE_RxCnt.rxBroadcastCnt;
stats->rx_discard_packets = para.api_data.FE_TxCnt.txDropCnt;
stats->rx_unknown_packets = 0;
}
}
return 0;
}
return -1;
}
int ecnt_prvt_get_port_statistics(uint32_t port,
struct eth_stats *stats,
struct eth_rmon_stats *rstats)
Loading