Help us understand the problem. What is going on with this article?

NICのリンク速度を調べる

More than 5 years have passed since last update.

ちょっと気になって調べたメモ

普通に思いつくのはethtool

# ethtool ens3
        Speed: 1000Mb/s

はい、特に問題ありません。簡単ですね。
※sakuraVPSの仮想なのでens3になってます。

ethtoolが使えなかったら・・・?

# dmesg | grep "Link is Up"
[    8.724177] e1000: ens3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX

dmesgから読めばいいですね。

ethtoolは何を読んでるの?

$ rpm -qf `which ethtool`
ethtool-3.8-4.el7_0.x86_64
$ wget http://vault.centos.org/7.0.1406/os/Source/SPackages/ethtool-3.8-3.el7.src.rpm
$ rpm2cpio ../ethtool-3.8-3.el7.src.rpm | cpio -idv
$ tar xvf ethtool-3.8.tar.xz
$ cd ethtool-3.8
$ view ethtool.c
ethtool.c
static int dump_ecmd(struct ethtool_cmd *ep)

        fprintf(stdout, "       Speed: ");
        speed = ethtool_cmd_speed(ep);
        if (speed == 0 || speed == (u16)(-1) || speed == (u32)(-1))
                fprintf(stdout, "Unknown!\n");
        else
                fprintf(stdout, "%uMb/s\n", speed);

表示から探すとこの辺ですね

ethtool-copy.h
static __inline__ __u32 ethtool_cmd_speed(const struct ethtool_cmd *ep)
{
        return (ep->speed_hi << 16) | ep->speed;
}

変換してるだけ。

ethtool.c
static int do_gset(struct cmd_context *ctx)
{

        err = send_ioctl(ctx, &ecmd);
        if (err == 0) {
                err = dump_ecmd(&ecmd);


int send_ioctl(struct cmd_context *ctx, void *cmd)
{
        ctx->ifr.ifr_data = cmd;
        return ioctl(ctx->fd, SIOCETHTOOL, &ctx->ifr);
}

ここですね。ioctlで取得してるのですね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away