mii-tool的限制/mii-tool和千兆网络

 

                        mii-tool的限制/mii-tool和千兆网络
                        mii-tool的限制mii-tool不支持1000M以上的网卡,这里我们先做个实验,先看看100M网卡能不能正确显示:
                        [root@localhost /]# mii-tool -v eth0
                        eth0: negotiated 100baseTx-FD, link ok
                        product info: vendor 00:40:63, model 50 rev 10
                        basic mode: autonegotiation enabled
                        basic status: autonegotiation complete, link ok
                        capabilities: 100baseTx-FD 100baseTx-HD 10baseT-FD
                        10baseT-HD
                        advertising: 100baseTx-FD 100baseTx-HD 10baseT-FD
                        10baseT-HD flow-control
                        link partner: 100baseTx-FD 100baseTx-HD 10baseT-FD
                        10baseT-HD
                        #这里显示100M网卡
                        [root@localhost /]# ethtool eth0
                        Settings for eth0:
                        Supported ports: [ TP MII ]
                        Supported link modes: 10baseT/Half 10baseT/Full
                        100baseT/Half 100baseT/Full
                        Supports auto-negotiation: Yes
                        Advertised link modes: 10baseT/Half 10baseT/Full
                        100baseT/Half 100baseT/Full
                        Advertised auto-negotiation: Yes
                        Speed: 100Mb/s
                        Duplex: Full
                        Port: MII
                        PHYAD: 1
                        Transceiver: internal
                        Auto-negotiation: on
                        Supports Wake-on: pumbg
                        Wake-on: d
                        Current message level: 0x00000001 (1)
                        Link detected: yes
                        #这里也显示是100M网卡
                        正常对于100M以下的网卡都能够用这俩个命令来查看,但是对于100M以上网卡的,mii-tool就会出现问题
                        mii-tool -v eth0
                        eth0: negotiated 100baseTx-FD, link ok
                        product info: vendor 00:aa:00, model 56 rev 0
                        basic mode: autonegotiation enabled
                        basic status: autonegotiation complete, link ok
                        capabilities: 100baseTx-FD 100baseTx-HD 10baseT-FD
                        10baseT-HD
                        advertising: 100baseTx-FD 100baseTx-HD 10baseT-FD
                        10baseT-HD flow-control
                        link partner: 100baseTx-FD 100baseTx-HD 10baseT-FD
                        10baseT-HD
                        #这里显示100M网卡,实际上我是1000M的接口
                        ethtool eth0
                        Settings for eth0:
                        Supported ports: [ TP ]
                        Supported link modes: 10baseT/Half 10baseT/Full
                        100baseT/Half 100baseT/Full
                        1000baseT/Full
                        Supports auto-negotiation: Yes
                        Advertised link modes: 10baseT/Half 10baseT/Full
                        100baseT/Half 100baseT/Full
                        1000baseT/Full
                        Advertised auto-negotiation: Yes
                        Speed: 1000Mb/s
                        Duplex: Full
                        Port: Twisted Pair
                        PHYAD: 0
                        Transceiver: internal
                        Auto-negotiation: on
                        Supports Wake-on: umbg
                        Wake-on: d
                        Current message level: 0x00000007 (7)
                        Link detected: yes
                        #这里却正确的显示1000M网卡
                        这里简单分析一下mii-tool的显示部份的实现:
                        1、首先在主函数中打开套接字,循环调用处理函数:
                        int main(int argc, char **argv)
                        {
                        int i;
                        char s[6];
                        /* Open a basic socket. */
                        if ((skfd = socket(AF_INET, SOCK_DGRAM,0))
                        perror("socket");
                        exit(-1);
                        }
                        for (i = 0; i
                        sprintf(s, "eth%d", i);
                        do_one_xcvr(skfd, s, 1);
                        }
                        return 0;
                        }

                        do_one_xcvr的主要功能是调用ioctl取得网卡的phy_id,然后进一步处理:
                        int do_one_xcvr(int skfd, char *ifname, int maybe)
                        {
                        struct mii_data *mii = (struct mii_data *)&ifr.ifr_data;
                        /* Get the vitals from the interface. */
                        strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
                        if (ioctl(skfd, SIOCGMIIPHY, &ifr)
                        {
                        if (!maybe || (errno != ENODEV))
                        {
                        fprintf(stderr, "SIOCGMIIPHY on '%s' failed: %sn",
                        ifname, strerror(errno));
                        }
                        return 1;
                        }
                        show_basic_mii(skfd, mii->phy_id);
                        }
                        关于SIOCGMIIPHY等宏的定义,很容易就能够找到了,这里不分析了……
                        show_basic_mii是整个核心了:
                        int show_basic_mii(int sock, int phy_id)
                        {
                        char buf[100];
                        int i, mii_val[32];
                        int bmcr, bmsr, advert, lkpar;
                        /* Some bits in the BMSR are latched, but we can't rely
                        on being
                        the only reader, so only the current values are
                        meaningful */
                        mdio_read(sock, MII_BMSR);
                        for (i = 0; i
                        mii_val = mdio_read(sock, i);
                        if (mii_val[MII_BMCR] == 0xffff) {
                        fprintf(stderr, " No MII transceiver present!.n");
                        return -1;
                        }
                        /* Descriptive rename. */
                        bmcr = mii_val[MII_BMCR]; bmsr = mii_val[MII_BMSR];
                        advert = mii_val[MII_ANAR]; lkpar = mii_val[MII_ANLPAR];
                        sprintf(buf, "%s: ", ifr.ifr_name);
                        if (bmcr & MII_BMCR_AN_ENA) {
                        if (bmsr & MII_BMSR_AN_COMPLETE) {
                        if (advert & lkpar) {
                        strcat(buf, (lkpar & MII_AN_ACK) ?
                        "negotiated" : "no autonegotiation,");
                        strcat(buf, media_list(advert & lkpar, 1));
                        strcat(buf, ", ");
                        } else {
                        strcat(buf, "autonegotiation failed, ");
                        }
                        } else if (bmcr & MII_BMCR_RESTART) {
                        strcat(buf, "autonegotiation restarted, ");
                        }
                        } else {
                        sprintf(buf+strlen(buf), "%s Mbit, %s duplex, ",
                        (bmcr & MII_BMCR_100MBIT) ? "100" : "10",
                        (bmcr & MII_BMCR_DUPLEX) ? "full" : "half");
                        }
                        strcat(buf, (bmsr & MII_BMSR_LINK_VALID) ? "link ok" :
                        "no link");
                        printf("%sn", buf);
                        return 0;
                        }
                        能够看到,主要是通过mdio_read来读取相关信息的,之后就是判断比较和输出了,而输出网卡物一类型的时候,用到了media_list,先来看看mdio_read:
                        static int mdio_read(int skfd, int location)
                        {
                        struct mii_data *mii = (struct mii_data *)&ifr.ifr_data;
                        mii->reg_num = location;
                        if (ioctl(skfd, SIOCGMIIREG, &ifr)
                        fprintf(stderr, "SIOCGMIIREG on %s failed: %sn",
                        ifr.ifr_name,
                        strerror(errno));
                        return -1;
                        }
                        return mii->val_out;
                        }
                        同样,也是用ioctl……^o^,再来看看media_list,他主要根据mdio_read返回来的相关值读取一个事先封装好的结构数组:
                        static char *media_list(int mask, int best)
                        {
                        static char buf[100];
                        int i;
                        *buf = '';
                        mask >>= 5;
                        for (i = 4; i >= 0; i--) {
                        if (mask & (1
                        strcat(buf, " ");
                        strcat(buf, media.name);
                        if (best) break;
                        }
                        }
                        if (mask & (1
                        strcat(buf, " flow-control");
                        return buf;
                        }
                        最后来看看media的定义的赋值:
                        const struct {
                        char *name;
                        u_short value;
                        } media[] = {
                        /* The order through 100baseT4 matches bits in the BMSR
                        */
                        { "10baseT-HD", MII_AN_10BASET_HD },
                        { "10baseT-FD", MII_AN_10BASET_FD },
                        { "100baseTx-HD", MII_AN_100BASETX_HD },
                        { "100baseTx-FD", MII_AN_100BASETX_FD },
                        { "100baseT4", MII_AN_100BASET4 },
                        { "100baseTx", MII_AN_100BASETX_FD | MII_AN_100BASETX_HD
                        },
                        { "10baseT", MII_AN_10BASET_FD | MII_AN_10BASET_HD },
                        };
                        这里没有定义100M以上的接口,所以,mii-tool不支持1000M
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以通过以下步骤来下载 mii-tool 的源码: 1. 打开您的网页浏览器,转到 mii-tool 的官方网站。 2. 在官方网站上,搜索并找到 mii-tool 的下载页面。 3. 点击下载链接,下载 mii-tool 的源代码压缩包。 4. 下载完成后,将源代码压缩包保存到您的计算机的某个目录中。 5. 解压缩源代码压缩包,可以使用各种解压软件,如 WinRAR、7-Zip 等。 6. 解压缩后,您将获得包含 mii-tool 源代码的文件夹。 现在,您已经成功地下载了 mii-tool 的源码。您可以打开该文件夹查看源代码,并根据您的需求进行修改或分析。如果您需要编译和构建该源代码文件夹生成可执行文件,您可能需要阅读附带的文档或搜索相关的编译指南。 请注意,mii-tool 是一个用于控制以太网接口的命令行工具,常用于检查和配置以太网设备的状态。使用或修改源代码前,请确保您具备相关的技术知识和理解,以避免不必要的错误或损失。 ### 回答2: 要下载 mii-tool 源码,可以按照以下步骤操作: 1. 进入 mii-tool 的官方网站或源码托管平台,比如 GitHub、SourceForge 或者官方开发者网站。 2. 在网站的搜索框中输入 "mii-tool" 来搜索相关的项目。 3. 找到与你所需的 mii-tool 版本和平台相匹配的项目。通常在项目页面上会有 "Download" 或 "Code" 的选项。 4. 点击 "Download" 或 "Code" 按钮,然后选择以 ZIP 或者 TAR.GZ 等格式下载源码。也可以使用 Git 的克隆指令将源码克隆到本地。 5. 下载完成后,解压源码文件到你所选择的目录中。 6. 打开终端或命令行界面,进入源码目录。 7. 根据项目的 README 或者开发文档,查看编译和安装的指导说明,如果需要,可以先安装相关的编译依赖库。 8. 执行编译指令,比如使用 GNU 编译器 gcc 进行编译操作。 9. 编译成功后,将生成的可执行文件移动到你希望放置的位置。 10. 至此,你已成功下载并编译了 mii-tool 的源码。 请注意,以上步骤仅供参考,具体操作可能因不同的项目和平台而有所差异。在进行任何操作之前,最好先参考相关的文档和指南,以确保正确和安全地下载和使用源码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值