in source/code/scxsystemlib/networkinterface/networkinterface.cpp [1287:1381]
void NetworkInterfaceInfo::ParseEthtool(int fd, SCXHandle<NetworkInterfaceDependencies> deps)
{
struct ifreq ifr;
struct ethtool_cmd ecmd;
ecmd.cmd = ETHTOOL_GSET; /* get setting */
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, SCXCoreLib::StrToUTF8(m_name).c_str(), IFNAMSIZ - 1);
ifr.ifr_data = (caddr_t) &ecmd;
m_autoSense = false;
if (deps->ioctl(fd, SIOCETHTOOL, &ifr) >= 0)
{
/* macros defined in file <linux/ethtool.h> */
if ((ecmd.supported & SUPPORTED_Autoneg) &&
(AUTONEG_ENABLE == ecmd.autoneg))
{
m_autoSense = true;
}
else
{
m_autoSense = false;
}
m_knownAttributesMask |= eAutoSense;
m_maxSpeed = 0;
#if defined(SUPPORTED_10000baseT_Full) || defined(SUPPORTED_10000baseKX4_Full) || defined(SUPPORTED_10000baseKR_Full) || defined(SUPPORTED_10000baseR_FEC)
if ((ecmd.supported & SUPPORTED_10000baseT_Full)
#ifdef SUPPORTED_10000baseKX4_Full
|| (ecmd.supported & SUPPORTED_10000baseKX4_Full)
#endif
#ifdef SUPPORTED_10000baseKR_Full
|| (ecmd.supported & SUPPORTED_10000baseKR_Full)
#endif
#ifdef SUPPORTED_10000baseR_FEC
|| (ecmd.supported & SUPPORTED_10000baseR_FEC)
#endif
)
{
m_maxSpeed = SPEED_10000;
}
#endif
#ifdef SUPPORTED_2500baseX_Full
if (m_maxSpeed < SPEED_2500 && (ecmd.supported & SUPPORTED_2500baseX_Full))
{
m_maxSpeed = SPEED_2500;
}
#endif
if (m_maxSpeed < SPEED_1000 &&
((ecmd.supported & SUPPORTED_1000baseT_Full) ||
#if defined(SUPPORTED_1000baseKX_Full)
(ecmd.supported & SUPPORTED_1000baseKX_Full) ||
#endif
(ecmd.supported & SUPPORTED_1000baseT_Half)))
{
m_maxSpeed = SPEED_1000;
}
else if ((ecmd.supported & SUPPORTED_100baseT_Full) ||
(ecmd.supported & SUPPORTED_100baseT_Half))
{
m_maxSpeed = SPEED_100;
}
else if ((ecmd.supported & SUPPORTED_10baseT_Full) ||
(ecmd.supported & SUPPORTED_10baseT_Half))
{
m_maxSpeed = SPEED_10;
}
else
{
SCX_LOGTRACE(m_log, StrAppend(wstring(L"for net device ") + m_name + L" can not get supported speed, the supported value got by ioctl(,SIOCETHTOOL,) is : ", ecmd.supported));
m_maxSpeed = 0;
}
m_maxSpeed *= 1000 * 1000; // change speed from Mbits to bits
switch(ecmd.speed)
{ // macroes defined in <linux/ethtool.h>
case SPEED_10: // 10Mb
case SPEED_100: // 100Mb
case SPEED_1000: // gigabit
#ifdef SPEED_2500
case SPEED_2500: // 2.5Gb
#endif
#ifdef SPEED_10000
case SPEED_10000: // 10GbE
#endif
m_speed = ecmd.speed * 1000 * 1000; // change speed from Mbits to bits
break;
default: /* don't support */
SCX_LOGTRACE(m_log, StrAppend(wstring(L"for net device ") + m_name + L" ioctl(,SIOCETHTOOL,) get a unformal speed value : ", ecmd.speed))
m_speed = 0;
}
}
else
{
SCX_LOGTRACE(m_log, L"for net device " + m_name + L" ioctl(,SIOCETHTOOL,) fail : " + wstrerror(errno));
}
}