void NetworkInterfaceInfo::ParseEthtool()

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));
        }
    }