全部博文(51)
分类: LINUX
2020-02-20 11:42:56
virtual Ethernet
veth设备是内部链接的一个虚拟以太设备对;类似于一个管道来链接不同的namespace或者container;它可以与桥配合(bridge docker0)使用也作为独立的网络设备使用。
可以使用ip 工具来配置一个veth pair
$ ip netns add ns1 $ ip netns add ns2
$ ip netns exec ns1 /bin/bash --rcfile <(echo "PS1=\"namespace ns1> \"") $ ip link add name if_one type veth peer name if_one_peer $ ip link set dev if_one_peer netns ns2 |
网络命名空间内配置ip的指令:
$ ip netns exec ns1 ip addr add 192.168.4.20/24 dev enp9s0 $ ip netns exec ns1 ip link set enp9s0 up |
一个pair对中每个虚拟接口必然会有一个struct net_device在其后扩展的是struct veth_priv;
在创建过程中,peer指针会指向的对方,来绑定两个device,这样就非常方便的查找到对方了。
Code:drivers/net/veth.c
static
int veth_newlink()
Code:drivers/net/veth.c
static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
Step1. 通过veth_priv来获取绑定的对端设备rcv;
Step2.从rcv设备中获取有效的接收队列;
Step3.更新skb信息,转换绑定的dev(实际完成了network namespace的切换);
Step4. 调用netif_rx(),此时被内核接管,
veth是一个L2的网络设备的,所以对内核来讲和其他物理设备没有什么区别。