Linux 中的虚拟网络接口

mil*_*dos 2 networking linux kernel linux-kernel

当我创建一个虚拟网络接口然后将其启动时,它显示处于 UNKNOWN 状态:

root@5b8dd2855a9c:# ip l a boom type dummy
root@5b8dd2855a9c:# ip l show boom
58: boom: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT
    link/ether 1e:f6:4b:60:ff:1a brd ff:ff:ff:ff:ff:ff
root@5b8dd2855a9c:# ip l set boom up
root@5b8dd2855a9c:# ip l show boom
58: boom: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state **UNKNOWN** mode DEFAULT
    link/ether 1e:f6:4b:60:ff:1a brd ff:ff:ff:ff:ff:ff
root@5b8dd2855a9c:#
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么?我尝试为其分配 IP 地址,但这并没有解决问题。

我在以下机器上对此进行了测试:

root@5b8dd2855a9c:# uname -a
Linux 5b8dd2855a9c 3.16.1-tinycore64 #1 SMP Fri Aug 22 05:53:09 UTC 2014 x86_64 GNU/Linux
root@5b8dd2855a9c:#
Run Code Online (Sandbox Code Playgroud)

更新:

所以看起来这并没有使接口无法操作。经过一些奴隶谷歌搜索后,我发现了这个信息

小智 5

查看drivers/net/dummy.cinclude/linux/netdevice.h,似乎虚拟网络接口驱动程序只实现了一小部分网络设备操作:

drivers/net/dummy.c的第112行我们了解到:

static const struct net_device_ops dummy_netdev_ops = {
    .ndo_init       = dummy_dev_init,
    .ndo_uninit     = dummy_dev_uninit,
    .ndo_start_xmit     = dummy_xmit,
    .ndo_validate_addr  = eth_validate_addr,
    .ndo_set_rx_mode    = set_multicast_list,
    .ndo_set_mac_address    = eth_mac_addr,
    .ndo_get_stats64    = dummy_get_stats64,
    .ndo_change_carrier = dummy_change_carrier,
};
Run Code Online (Sandbox Code Playgroud)

在查看include/linux/netdevice.h 时struct net_device_ops定义在哪里,似乎有(确切地说是第 1057 行):

int         (*ndo_set_vf_link_state)(struct net_device *dev,
                         int vf, int link_state);
Run Code Online (Sandbox Code Playgroud)

在回答您的问题方面,这让我们何去何从,而不仅仅是在这里放一堵文字墙并希望获得 +10 分?嗯,答案是肯定的和否定的。

消息来源透露,是的,状态 UNKNOWN 是预期行为,因为没有任何东西可以设置状态,因此它绝对应该是 UNKNOWN。另一方面,期望用户打开虚拟界面应该看到状态发生变化是合理的。从用户角度来看,一个内核没有满足合理期望的经典示例。

下一个问题可能是:这是一个错误吗?应该修吗?如果这个答案当然可以解决这个问题,那么这超出了范围,如果有人愿意的话。然而,值得注意的是,虚拟接口已经在内核中存在了很长一段时间,准确地说是 20 年。早在 1994 年,我想为用户空间的虚拟接口呈现正确的链接状态并不是什么优先事项。