Chinaunix首页 | 论坛 | 博客
  • 博客访问: 525940
  • 博文数量: 51
  • 博客积分: 345
  • 博客等级: 民兵
  • 技术积分: 534
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-21 12:02
个人简介

文章分类

全部博文(51)

文章存档

2023年(2)

2022年(1)

2021年(7)

2020年(10)

2019年(2)

2016年(20)

2015年(5)

2014年(1)

2011年(3)

我的朋友

分类: LINUX

2020-02-20 11:42:56

virtual Ethernet

veth设备是内部链接的一个虚拟以太设备对;类似于一个管道来链接不同的namespace或者container;它可以与桥配合(bridge docker0)使用也作为独立的网络设备使用。


Config

可以使用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


结构体struct

一个pair对中每个虚拟接口必然会有一个struct net_device在其后扩展的是struct veth_priv;

在创建过程中,peer指针会指向的对方,来绑定两个device,这样就非常方便的查找到对方了。

Code:drivers/net/veth.c

               static int veth_newlink()


xmit

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的网络设备的,所以对内核来讲和其他物理设备没有什么区别。




阅读(1146) | 评论(0) | 转发(0) |
0

上一篇:智能网卡Stingray Setup

下一篇:BPF on Networking

给主人留下些什么吧!~~