Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3652597
  • 博文数量: 880
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 6155
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-11 09:12
个人简介

To be a better coder

文章分类

全部博文(880)

文章存档

2022年(5)

2021年(60)

2020年(175)

2019年(207)

2018年(210)

2017年(142)

2016年(81)

分类: 网络与安全

2017-10-31 15:59:18

原文地址:虚拟网络设备--VETH pair 作者:hubaohai

        Veth pair 是一对虚拟网卡,从一张veth网卡发出的数据包可以直接到达它的peer veth,两者之间存在着虚拟链路。
        Veth 网卡和常规的以太网区别仅在于xmit接口:将数据发送到其peer,触发peer的Rx 过程。
        Veth 的原理示意图如下:
        
        
        Veth 的实现在linux/drivers/net/veth.c 下,总体来看比较简单:
        关键的数据结构:

点击(此处)折叠或打开

  1. struct veth_priv {
  2.     struct net_device __rcu    *peer;
  3.     atomic64_t        dropped;
  4. };
        在初始化时veth_newlink 函数中有:
        点击(此处)折叠或打开
  1. /*
  2.  * tie the deviced together
  3.  */

  4.  priv = netdev_priv(dev);
  5.  rcu_assign_pointer(priv->peer, peer);

  6.  priv = netdev_priv(peer);
  7.  rcu_assign_pointer(priv->peer, dev);
        在发送函数veth_xmit中有:
    

点击(此处)折叠或打开

  1.     rcv = rcu_dereference(priv->peer);
  2.     ...
  3.     if (likely(dev_forward_skb(rcv, skb) == NET_RX_SUCCESS)) {
  4.         struct pcpu_vstats *stats = this_cpu_ptr(dev->vstats);

  5.         u64_stats_update_begin(&stats->syncp);
  6.         stats->bytes += length;
  7.         stats->packets++;
  8.         u64_stats_update_end(&stats->syncp);
  9.     } else {
        
        应用方式:通过net namespace 做实验如下:
        

点击(此处)折叠或打开

  1. #!/bin/sh
  2. echo "create net namespace net0 and net1"
  3. ip netns add net0
  4. ip netns add net1
  5. echo "list net namespace"
  6. ip netns list
  7. echo "add veth pair v1 and vp1"
  8. ip link add veth_0 type veth peer name veth_0_peer
  9. ip link
  10. echo "set veth_0 in net0"
  11. ip link set veth_0 netns net0
  12. echo "set veth_0_peer in net1"
  13. ip link set veth_0_peer netns net1
  14. ip netns exec net0 ip addr add local 10.0.78.3/24 dev veth_0
  15. ip netns exec net0 ifconfig veth_0 up
  16. ip netns exec net1 ip addr add local 10.0.78.4/24 dev veth_0_peer
  17. ip netns exec net1 ifconfig veth_0_peer up
  18. echo "show ip netns net0"
  19. ip netns exec net0 ip addr
  20. echo "show ip netns net1"
  21. ip netns exec net1 ip addr
  22. ip netns exec net1 ping 10.0.78.3




阅读(1642) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~