{"id":10006362,"date":"2022-08-31T17:54:50","date_gmt":"2022-08-31T09:54:50","guid":{"rendered":"https:\/\/ityet.com\/?p=10006362"},"modified":"2022-08-31T17:54:50","modified_gmt":"2022-08-31T09:54:50","slug":"%e4%bb%8e-vlan-%e5%88%b0-ipvlan-%e8%81%8a%e8%81%8a%e8%99%9a%e6%8b%9f%e7%bd%91%e7%bb%9c%e8%ae%be%e5%a4%87%e5%8f%8a%e5%85%b6%e5%9c%a8%e4%ba%91%e5%8e%9f%e7%94%9f%e4%b8%ad%e7%9a%84%e5%ba%94%e7%94%a8","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10006362","title":{"rendered":"\u4ece VLAN \u5230 IPVLAN: \u804a\u804a\u865a\u62df\u7f51\u7edc\u8bbe\u5907\u53ca\u5176\u5728\u4e91\u539f\u751f\u4e2d\u7684\u5e94\u7528"},"content":{"rendered":"<p>\u7b80\u4ecb\uff1a\u00a0\u7531\u4e8e\u8fd9\u7bc7\u6587\u7ae0\u771f\u7684\u5f88\u957f\uff0c\u5927\u91cf\u7684\u7bc7\u5e45\u5728\u8bb2\u8ff0\u5185\u6838\u7684\u5b9e\u73b0\uff0c\u5982\u679c\u4f60\u5bf9\u8fd9\u90e8\u5206\u4e0d\u611f\u5174\u8da3\uff0c\u90a3\u4e48\u5728\u5efa\u8bae\u4f60\u5728\u770b\u5b8c\u7b2c\u4e00\u90e8\u5206\u7684\u4e09\u4e2a\u95ee\u9898\u540e\uff0c\u601d\u8003\u4e00\u4e0b\uff0c\u7136\u540e\u76f4\u63a5\u8df3\u8f6c\u5230\u6211\u4eec\u5bf9\u95ee\u9898\u7684\u56de\u7b54\u3002\u4f5c\u8005\uff1a\u5f20\u4f1f\uff08\u8c22\u77f3\uff09\u00a0\u7531\u4e8e\u8fd9\u7bc7\u6587\u7ae0\u771f\u7684\u5f88\u957f\uff0c\u5927\u91cf\u7684\u7bc7\u5e45\u5728\u8bb2\u8ff0\u5185\u6838\u7684\u5b9e\u73b0\uff0c\u5982\u679c\u4f60\u5bf9\u8fd9\u90e8\u5206\u4e0d\u611f\u5174\u8da3\uff0c\u90a3\u4e48\u5728\u5efa\u8bae\u4f60\u5728\u770b\u5b8c\u7b2c\u4e00\u90e8\u5206\u7684\u4e09\u4e2a\u95ee\u9898\u540e\uff0c\u601d\u8003\u4e00\u4e0b\uff0c\u7136\u540e\u76f4\u63a5\u8df3\u8f6c\u5230\u6211\u4eec\u5bf9\u95ee\u9898\u7684\u56de\u7b54\u3002\u00a0\u63d0\u51fa\u95ee\u9898\u00a0\u6ce8\uff1a\u672c\u6587\u6240\u6709\u7684\u4ee3\u7801\u5747\u4e3a Linux \u5185\u6838\u6e90\u4ee3\u7801\uff0c\u7248\u672c\u4e3a 5.16.2\u00a0\u4f60\u542c\u8bf4\u8fc7 VLAN \u4e48\uff1f\u5b83\u7684\u5168\u79f0\u662f Virtual Local Area Network\uff0c\u7528\u4e8e\u5728\u4ee5\u592a\u7f51\u4e2d\u9694\u79bb\u4e0d\u540c\u7684\u5e7f\u64ad\u57df\u3002\u5b83\u8bde\u751f\u7684\u65f6\u95f4\u5f88\u65e9\uff0c1995 \u5e74\uff0cIEEE \u5c31\u53d1\u8868\u4e86\u00a0802.1Q \u6807\u51c6[1]\u5b9a\u4e49\u4e86\u5728\u4ee5\u592a\u7f51\u6570\u636e\u5e27\u4e2d VLAN \u7684\u683c\u5f0f\uff0c\u5e76\u4e14\u6cbf\u7528\u81f3\u4eca\u3002\u5982\u679c\u4f60\u77e5\u9053 VLAN\uff0c\u90a3\u4e48\u4f60\u542c\u8bf4\u8fc7 MACVlan \u548c IPVlan \u4e48\uff1f\u968f\u7740\u5bb9\u5668\u6280\u672f\u7684\u4e0d\u65ad\u5174\u8d77\uff0cIPVlan \u548c MACVlan \u4f5c\u4e3a Linux \u865a\u62df\u7f51\u7edc\u8bbe\u5907\uff0c\u6162\u6162\u8d70\u4e0a\u524d\u53f0\uff0c\u5728 2017 \u5e74\u00a0Docker Engine \u7684 1.13.1 \u7684\u7248\u672c[2]\u4e2d\uff0c\u5c31\u5f00\u59cb\u5f15\u5165\u4e86 IPVlan \u548c MACVlan \u4f5c\u4e3a\u5bb9\u5668\u7684\u7f51\u7edc\u89e3\u51b3\u65b9\u6848\u3002\u00a0\u90a3\u4e48\u4f60\u662f\u5426\u4e5f\u6709\u8fc7\u4ee5\u4e0b\u7684\u7591\u95ee\u5462\uff1f\u00a01. VLAN \u548c IPVlan\uff0cMACVlan \u6709\u4ec0\u4e48\u5173\u7cfb\u5462\uff1f\u4e3a\u4ec0\u4e48\u540d\u5b57\u91cc\u90fd\u6709 VLAN\uff1f\u00a02. IPVlan \u548c MACVlan \u4e3a\u4ec0\u4e48\u4f1a\u6709\u5404\u79cd\u6a21\u5f0f\u548c flag\uff0c\u6bd4\u5982 VEPA\uff0cPrivate\uff0cPassthrough \u7b49\u7b49\uff1f\u5b83\u4eec\u7684\u533a\u522b\u5728\u54ea\u91cc\uff1f\u00a03. IPVlan \u548c MACVlan \u7684\u4f18\u52bf\u5728\u54ea\u91cc\uff1f\u4f60\u5e94\u8be5\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u63a5\u89e6\u5230\uff0c\u4f7f\u7528\u5230\u5b83\u4eec\u5462\uff1f\u00a0\u6211\u4e5f\u66fe\u6709\u8fc7\u4e00\u6837\u7684\u95ee\u9898\uff0c\u4eca\u5929\u8fd9\u7bc7\u6587\u7ae0\uff0c\u6211\u4eec\u5c31\u9488\u5bf9\u4e0a\u9762\u4e09\u4e2a\u95ee\u9898\u4e00\u63a2\u7a76\u7adf\u3002\u00a0\u80cc\u666f\u77e5\u8bc6\u00a0\u4ee5\u4e0b\u4e3a\u4e00\u4e9b\u80cc\u666f\u77e5\u8bc6\uff0c\u5982\u679c\u4f60\u5bf9 Linux \u672c\u8eab\u5f88\u4e86\u89e3\uff0c\u53ef\u4ee5\u8df3\u8fc7\u3002\u00a0\u5185\u6838\u5bf9\u7f51\u7edc\u8bbe\u5907\u7684\u62bd\u8c61\u00a0\u5728 Linux \u4e2d\uff0c\u6211\u4eec\u64cd\u4f5c\u4e00\u4e2a\u7f51\u7edc\u8bbe\u5907\uff0c\u4e0d\u5916\u4e4e\u4f7f\u7528 ip \u547d\u4ee4\u6216\u8005 ifconfig \u547d\u4ee4\u3002\u5bf9\u4e8e ip \u547d\u4ee4\u7684\u5b9e\u73b0 iproute2 \u6765\u8bf4\uff0c\u5b83\u771f\u6b63\u4f9d\u8d56\u7684\u5c31\u662f Linux \u63d0\u4f9b\u7684 netlink \u6d88\u606f\u673a\u5236\uff0c\u5185\u6838\u4f1a\u5bf9\u6bcf\u4e00\u7c7b\u7f51\u7edc\u8bbe\u5907\uff08\u65e0\u8bba\u662f\u771f\u5b9e\u7684\u8fd8\u662f\u865a\u62df\u7684\uff09\u62bd\u8c61\u51fa\u4e00\u4e2a\u4e13\u95e8\u54cd\u5e94 netlink \u6d88\u606f\u7684\u7ed3\u6784\u4f53\uff0c\u5b83\u4eec\u90fd\u6309\u7167 rtnl_link_ops \u7ed3\u6784\u6765\u5b9e\u73b0\uff0c\u7528\u4e8e\u54cd\u5e94\u5bf9\u7f51\u7edc\u8bbe\u5907\u7684\u521b\u5efa\uff0c\u9500\u6bc1\u548c\u4fee\u6539\u3002\u4f8b\u5982\u6bd4\u8f83\u76f4\u89c2\u7684 Veth \u8bbe\u5907\uff1a\u00a0static struct rtnl_link_ops veth_link_ops = {<\/p>\n<pre><code>.kind   = DRV_NAME,\n.priv_size  = sizeof(struct veth_priv),\n.setup    = veth_setup,\n.validate = veth_validate,\n.newlink  = veth_newlink,\n.dellink  = veth_dellink,\n.policy   = veth_policy,\n.maxtype  = VETH_INFO_MAX,\n.get_link_net = veth_get_link_net,\n.get_num_tx_queues  = veth_get_num_queues,\n.get_num_rx_queues  = veth_get_num_queues,<\/code><\/pre>\n<p>};\u00a0\u5bf9\u4e8e\u4e00\u4e2a\u7f51\u7edc\u8bbe\u5907\u6765\u8bf4\uff0cLinux \u7684\u64cd\u4f5c\u548c\u786c\u4ef6\u8bbe\u5907\u7684\u54cd\u5e94\u672c\u8eab\u4e5f\u9700\u8981\u4e00\u5957\u89c4\u8303\uff0cLinux \u5c06\u5176\u62bd\u8c61\u4e3a net_device_ops \u8fd9\u4e2a\u7ed3\u6784\u4f53\uff0c\u5982\u679c\u4f60\u5bf9\u8bbe\u5907\u9a71\u52a8\u611f\u5174\u8da3\uff0c\u90a3\u4e3b\u8981\u5c31\u662f\u548c\u5b83\u6253\u4ea4\u9053\uff0c\u4f9d\u7136\u4ee5 Veth \u8bbe\u5907\u4e3a\u4f8b\uff1a\u00a0static const struct net_device_ops veth_netdev_ops = {<br \/>  .ndo_init            = veth_dev_init,<br \/>  .ndo_open            = veth_open,<br \/>  .ndo_stop            = veth_close,<br \/>  .ndo_start_xmit      = veth_xmit,<br \/>  .ndo_get_stats64     = veth_get_stats64,<br \/>  .ndo_set_rx_mode     = veth_set_multicast_list,<br \/>  .ndo_set_mac_address = eth_mac_addr,<\/p>\n<h2>ifdef CONFIG_NET_POLL_CONTROLLER<\/h2>\n<p>.ndo_poll_controller  = veth_poll_controller,<\/p>\n<h2>endif<\/h2>\n<p>.ndo_get_iflink   = veth_get_iflink,<br \/>  .ndo_fix_features = veth_fix_features,<br \/>  .ndo_set_features = veth_set_features,<br \/>  .ndo_features_check = passthru_features_check,<br \/>  .ndo_set_rx_headroom  = veth_set_rx_headroom,<br \/>  .ndo_bpf    = veth_xdp,<br \/>  .ndo_xdp_xmit   = veth_ndo_xdp_xmit,<br \/>  .ndo_get_peer_dev = veth_peer_dev,<br \/>};\u00a0\u4ece\u4e0a\u9762\u7684\u5b9a\u4e49\u6211\u4eec\u53ef\u4ee5\u770b\u5230\u51e0\u4e2a\u8bed\u4e49\u5f88\u76f4\u89c2\u7684\u65b9\u6cd5\uff1ando_start_xmit \u7528\u4e8e\u53d1\u9001\u6570\u636e\u5305\uff0cnewlink \u7528\u4e8e\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8bbe\u5907\u3002\u00a0\u5bf9\u4e8e\u63a5\u6536\u6570\u636e\u5305\uff0cLinux \u7684\u6536\u5305\u52a8\u4f5c\u5e76\u4e0d\u662f\u7531\u5404\u4e2a\u8fdb\u7a0b\u81ea\u5df1\u53bb\u5b8c\u6210\u7684\uff0c\u800c\u662f\u7531 ksoftirqd \u5185\u6838\u7ebf\u7a0b\u8d1f\u8d23\u4e86\u4ece\u9a71\u52a8\u63a5\u6536\u3001\u7f51\u7edc\u5c42\uff08ip\uff0ciptables\uff09\u3001\u4f20\u8f93\u5c42\uff08tcp\uff0cudp\uff09\u7684\u5904\u7406\uff0c\u6700\u7ec8\u653e\u5230\u7528\u6237\u8fdb\u7a0b\u6301\u6709\u7684 Socket \u7684 recv \u7f13\u51b2\u533a\u4e2d\uff0c\u7136\u540e\u7531\u5185\u6838 inotify \u7528\u6237\u8fdb\u7a0b\u5904\u7406\u3002\u5bf9\u4e8e\u865a\u62df\u8bbe\u5907\u6765\u8bf4\uff0c\u6240\u6709\u7684\u5dee\u5f02\u96c6\u4e2d\u4e8e\u7f51\u7edc\u5c42\u4e4b\u524d\uff0c\u5728\u8fd9\u91cc\u6709\u4e00\u4e2a\u7edf\u4e00\u7684\u5165\u53e3\uff0c\u5373__netif_receive_skb_core\u3002\u00a0801.2q \u534f\u8bae\u5bf9 VLAN \u7684\u5b9a\u4e49\u00a0802.1q \u534f\u8bae\u4e2d\uff0c\u4ee5\u592a\u7f51\u6570\u636e\u5e27\u5305\u5934\u4e2d\u7528\u4e8e\u6807\u8bb0 VLAN \u5b57\u6bb5\u662f\u4e00\u4e2a 32bit \u7684\u57df\uff0c\u7ed3\u6784\u5982\u4e0b\uff1a\u00a0<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412351\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a0\u5982\u4e0a\u6240\u793a\uff0c\u6709 16 \u4e2a bit \u7528\u4e8e\u6807\u8bb0 Protocol\uff0c3 \u4e2a bit \u7528\u4e8e\u6807\u8bb0\u4f18\u5148\u7ea7\uff0c1 \u4e2a bit \u7528\u4e8e\u6807\u8bb0\u683c\u5f0f\uff0c12 \u4e2a bit \u7528\u4e8e\u5b58\u653e \u00a0 VLAN id\uff0c\u770b\u5230\u8fd9\u91cc\u6211\u60f3\u4f60\u53ef\u4ee5\u8f7b\u6613\u8ba1\u7b97\u51fa\uff0c\u4f9d\u9760 VLAN \u6211\u4eec\u80fd\u5212\u5206\u51fa\u591a\u5c11\u4e2a\u5e7f\u64ad\u57df\uff1f\u6ca1\u9519\uff0c\u6b63\u662f 2*12\uff0c4096 \u4e2a\uff0c\u51cf\u53bb\u4fdd\u7559\u7684\u5168 0 \u548c\u5168 1 \uff0c\u5ba2\u6237\u5212\u5206\u51fa 4094 \u4e2a\u53ef\u7528\u7684\u5e7f\u64ad\u57df\u3002\uff08\u5728 OpenFlow \u5174\u8d77\u4e4b\u524d\uff0c\u4e91\u8ba1\u7b97\u6700\u65e9\u671f\u96cf\u5f62\u4e2d\u7684 vpc \u7684\u5b9e\u73b0\u6b63\u662f\u4f9d\u8d56 VLAN \u8fdb\u884c\u7f51\u7edc\u7684\u533a\u5206\uff0c\u4f46\u662f\u7531\u4e8e\u8fd9\u4e2a\u9650\u5236\uff0c\u5f88\u5feb\u5c31\u88ab\u6dd8\u6c70\u4e86\uff0c\u8fd9\u4e5f\u50ac\u751f\u4e86\u53e6\u4e00\u4e2a\u4f60\u4e5f\u8bb8\u4f3c\u66fe\u76f8\u8bc6\u7684\u540d\u8bcd\uff0cVxLAN\uff0c\u5c3d\u7ba1\u4e24\u8005\u5dee\u522b\u5f88\u5927\uff0c\u4f46\u662f\u4ecd\u6709\u501f\u9274\u7684\u7f18\u6545\uff09\u3002\u00a0VLAN \u539f\u672c\u548c bridge \u4e00\u6837\u662f\u4e00\u4e2a\u4ea4\u6362\u673a\u4e0a\u7684\u6982\u5ff5\uff0c\u4e0d\u8fc7 Linux \u5c06\u5b83\u4eec\u90fd\u8fdb\u884c\u4e86\u8f6f\u4ef6\u7684\u5b9e\u73b0\uff0cLinux \u5728\u6bcf\u4e2a\u4ee5\u592a\u7f51\u6570\u636e\u5e27\u4e2d\u4f7f\u7528\u4e00\u4e2a 16bit \u7684 vlan_proto \u5b57\u6bb5\u548c 16bit \u7684 vlan_tci \u5b57\u6bb5\u5b9e\u73b0 802.1q \u534f\u8bae\uff0c\u540c\u65f6\u5bf9\u4e8e\u6bcf\u4e00\u4e2a VLAN\uff0c\u90fd\u4f1a\u865a\u62df\u51fa\u4e00\u4e2a\u5b50\u8bbe\u5907\u6765\u5904\u7406\u53bb\u9664 VLAN \u4e4b\u540e\u7684\u62a5\u6587\uff0c\u6ca1\u9519 VLAN \u4e5f\u6709\u5c5e\u4e8e\u81ea\u5df1\u7684\u5b50\u8bbe\u5907\uff0c\u5373 VLAN sub-interface\uff0c\u4e0d\u540c\u7684 VLAN \u5b50\u8bbe\u5907\u901a\u8fc7\u4e00\u4e2a\u4e3b\u8bbe\u5907\u8fdb\u884c\u7269\u7406\u4e0a\u7684\u62a5\u6587\u6536\u53d1\uff0c\u8fd9\u4e2a\u6982\u5ff5\u662f\u5426\u53c8\u6709\u70b9\u719f\u6089\uff1f\u6ca1\u9519\uff0c\u8fd9\u6b63\u662f ENI-Trunking \u7684\u539f\u7406\u3002\u00a0\u6df1\u5165 VLAN\/MACVlan\/IPVlan \u7684\u5185\u6838\u5b9e\u73b0\u00a0\u8865\u5145\u4e86\u80cc\u666f\u77e5\u8bc6\u540e\uff0c\u6211\u4eec\u5c31\u5148\u4ece VLAN \u5b50\u8bbe\u5907\u5f00\u59cb\uff0c\u770b\u770b Linux \u5185\u6838\u7a76\u7adf\u662f\u600e\u4e48\u505a\u7684\uff0c\u8fd9\u91cc\u6240\u6709\u7684\u5185\u6838\u4ee3\u7801\u90fd\u4ee5\u65f6\u4e0b\u8f83\u65b0\u7684 5.16.2 \u7248\u672c\u4e3a\u4f8b\u3002\u00a0VLAN \u5b50\u8bbe\u5907\u00a0\u8bbe\u5907\u521b\u5efa\u00a0VLAN \u5b50\u8bbe\u5907\u8d77\u521d\u5e76\u6ca1\u6709\u88ab\u5f53\u4f5c\u4e00\u7c7b\u5355\u72ec\u7684\u865a\u62df\u8bbe\u5907\u6765\u5904\u7406\uff0c\u6bd5\u7adf\u51fa\u73b0\u7684\u65f6\u95f4\u5f88\u65e9\uff0c\u4ee3\u7801\u5206\u5e03\u6bd4\u8f83\u4e71\uff0c\u4e0d\u8fc7\u6838\u5fc3\u903b\u8f91\u4f4d\u4e8e\/net\/8021q\/\u8def\u5f84\u4e0b\u3002\u4ece\u80cc\u666f\u4e2d\u6211\u4eec\u53ef\u4ee5\u4e86\u89e3\u5230\uff0cnetlink \u673a\u5236\u4e2d\u5b9e\u73b0\u4e86\u7f51\u5361\u8bbe\u5907\u521b\u5efa\u7684\u5165\u53e3\uff0c\u5bf9\u4e8e VLAN \u5b50\u8bbe\u5907\uff0c\u5b83\u4eec\u7684 netlink \u6d88\u606f\u5b9e\u73b0\u7684\u7ed3\u6784\u4f53\u662f vlan_link_ops\uff0c\u800c\u8d1f\u8d23\u521b\u5efa VLAN \u5b50\u8bbe\u5907\u7684\u662f vlan_newlink \u65b9\u6cd5\uff0c\u5185\u6838\u521d\u59cb\u5316\u4ee3\u7801\u6d41\u7a0b\u5982\u4e0b\uff1a<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412352\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a0<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412353\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a01. \u9996\u5148\u521b\u5efa\u4e00\u4e2a Linux \u901a\u7528\u7684 net_device \u7ed3\u6784\u4f53\u4fdd\u5b58\u8bbe\u5907\u7684\u914d\u7f6e\u4fe1\u606f\uff0c\u8fdb\u5165 vlan_newlink \u4e4b\u540e\uff0c\u4f1a\u8fdb\u884c vlan_check_real_dev \u68c0\u67e5\u4f20\u5165\u7684 VLAN id \u662f\u5426\u662f\u53ef\u7528\u7684\uff0c\u8fd9\u5176\u4e2d\u4f1a\u8c03\u7528\u5230 vlan_find_dev \u65b9\u6cd5\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u7528\u4e8e\u9488\u5bf9\u4e00\u4e2a\u4e3b\u8bbe\u5907\u67e5\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u5b50\u8bbe\u5907\uff0c\u540e\u9762\u8fd8\u4f1a\u7528\u5230\uff0c\u6211\u4eec\u622a\u53d6\u4e00\u90e8\u5206\u4ee3\u7801\u89c2\u5bdf\u4e00\u4e0b\uff1a\u00a0static int vlan_newlink(struct net <em>src_net, struct net_device <\/em>dev,<\/p>\n<pre><code>  struct nlattr *tb[], struct nlattr *data[],\n  struct netlink_ext_ack *extack)<\/code><\/pre>\n<p>{<br \/>  struct vlan_dev_priv *vlan = vlan_dev_priv(dev);<br \/>  struct net_device *real_dev;<br \/>  unsigned int max_mtu;<br \/>  __be16 proto;<br \/>  int err;<\/p>\n<p>\/<em>\u8fd9\u91cc\u7701\u7565\u6389\u4e86\u7528\u4e8e\u53c2\u6570\u6821\u9a8c\u7684\u90e8\u5206<\/em>\/<\/p>\n<pre><code>\/\/ \u8fd9\u91cc\u4f1a\u8bbe\u7f6evlan\u5b50\u8bbe\u5907\u7684vlan\u4fe1\u606f\uff0c\u4e5f\u5c31\u662f\u80cc\u666f\u77e5\u8bc6\u4e2dvlan\u76f8\u5173\u7684protocol\uff0cvlanid\uff0c\u4f18\u5148\u7ea7\u548cflag\u4fe1\u606f\u7684\u9ed8\u8ba4\u503c<\/code><\/pre>\n<p>vlan-&gt;vlan_proto = proto;<br \/>  vlan-&gt;vlan_id  = nla_get_u16(data[IFLA_VLAN_ID]);<br \/>  vlan-&gt;real_dev   = real_dev;<br \/>  dev-&gt;priv_flags |= (real_dev-&gt;priv_flags &#038; IFF_XMIT_DST_RELEASE);<br \/>  vlan-&gt;flags  = VLAN_FLAG_REORDER_HDR;<\/p>\n<p>err = vlan_check_real_dev(real_dev, vlan-&gt;vlan_proto, vlan-&gt;vlan_id,<\/p>\n<pre><code>      extack);<\/code><\/pre>\n<p>if (err &lt; 0)<\/p>\n<pre><code>return err;\n<\/code><\/pre>\n<p>\/<em>\u8fd9\u91cc\u4f1a\u8fdb\u884cmtu\u7684\u8bbe\u7f6e<\/em>\/<\/p>\n<p>err = vlan_changelink(dev, tb, data, extack);<br \/>  if (!err)<\/p>\n<pre><code>err = register_vlan_dev(dev, extack);<\/code><\/pre>\n<p>if (err)<\/p>\n<pre><code>vlan_dev_uninit(dev);<\/code><\/pre>\n<p>return err;<br \/>}\u00a02. \u63a5\u4e0b\u6765\u662f\u901a\u8fc7 vlan_changelink \u65b9\u6cd5\u5bf9\u8bbe\u5907\u7684\u5c5e\u6027\u8fdb\u884c\u8bbe\u7f6e\uff0c\u5982\u679c\u4f60\u6709\u7279\u6b8a\u7684\u914d\u7f6e\uff0c\u5219\u4f1a\u8986\u76d6\u9ed8\u8ba4\u503c\u3002\u00a03. \u6700\u540e\u8fdb\u5165 register_vlan_dev \u65b9\u6cd5\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u5c31\u662f\u628a\u524d\u9762\u5df2\u7ecf\u5b8c\u6210\u597d\u7684\u4fe1\u606f\u88c5\u586b\u5230 net_device \u7ed3\u6784\u4f53\uff0c\u5e76\u6309\u7167 \u00a0Linux \u7684\u8bbe\u5907\u7ba1\u7406\u7edf\u4e00\u63a5\u53e3\u6ce8\u518c\u5230\u5185\u6838\u4e2d\u3002\u00a0\u63a5\u6536\u62a5\u6587\u00a0\u4ece\u521b\u5efa\u8fc7\u7a0b\u6765\u770b\uff0c VLAN \u5b50\u8bbe\u5907\u4e0e\u4e00\u822c\u8bbe\u5907\u7684\u533a\u522b\u5c31\u5728\u4e8e\u5b83\u80fd\u591f\u88ab\u4e3b\u8bbe\u5907\u548c VLAN id \u901a\u8fc7 vlan_find_dev \u7684\u65b9\u5f0f\u627e\u5230\uff0c\u8fd9\u4e00\u70b9\u5f88\u91cd\u8981\u3002\u00a0\u63a5\u4e0b\u6765\u6211\u4eec\u6765\u770b\u62a5\u6587\u7684\u63a5\u6536\u8fc7\u7a0b\uff0c\u6839\u636e\u80cc\u666f\u77e5\u8bc6\uff0c\u7269\u7406\u8bbe\u5907\u63a5\u6536\u5230\u62a5\u6587\u540e\uff0c\u5728\u8fdb\u5165\u534f\u8bae\u6808\u5904\u7406\u4e4b\u524d\uff0c\u5e38\u89c4\u7684\u5165\u53e3\u662f __netif_receive_skb_core\uff0c\u6211\u4eec\u5c31\u4ece\u8fd9\u4e2a\u5165\u53e3\u5f00\u59cb\u9010\u6e10\u5206\u6790\uff0c\u5185\u6838\u64cd\u4f5c\u6d41\u7a0b\u5982\u4e0b\uff1a\u00a0<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412354\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a0\u6839\u636e\u4e0a\u65b9\u7684\u793a\u610f\u56fe\uff0c\u6211\u4eec\u622a\u53d6\u90e8\u5206__netif_receive_skb_core \u8fdb\u884c\u5206\u6790\uff1a\u00a01. \u9996\u5148\u5728\u6570\u636e\u5305\u5904\u7406\u6d41\u7a0b\u5f00\u59cb\u7684\u65f6\u5019\uff0c\u4f1a\u8fdb\u884c skb_vlan_untag \u64cd\u4f5c\uff0c\u5bf9\u4e8e VLAN \u6570\u636e\u5305\u6765\u8bf4\uff0c\u6570\u636e\u5305 Protocol \u5b57\u6bb5\u4e00\u76f4\u662f VLAN \u7684 ETH_P_8021Q \uff0cskb_vlan_untag \u5c31\u662f\u5c06 VLAN \u4fe1\u606f\u4ece\u6570\u636e\u5305\u7684 vlan_tci \u5b57\u6bb5\u4e2d\u63d0\u53d6\u540e\uff0c\u8c03\u7528 vlan_set_encap_proto \u5c06 Protocol \u66f4\u65b0\u4e3a\u6b63\u5e38\u7684\u7f51\u7edc\u5c42\u534f\u8bae\uff0c\u8fd9\u65f6 VLAN \u5df2\u7ecf\u4e00\u90e8\u5206\u8f6c\u53d8\u4e3a\u6b63\u5e38\u6570\u636e\u5305\u4e86\u3002\u00a02. \u62e5\u6709 VLAN tag \u7684\u6570\u636e\u5305\u4f1a\u5728 skb_vlan_tag_present \u4e2d\u8fdb\u5165 vlan_do_recieve \u7684\u5904\u7406\u6d41\u7a0b\uff0cvlan_do_receive \u7684\u5904\u7406\u8fc7\u7a0b\u7684\u6838\u5fc3\u5c31\u662f\u901a\u8fc7 vlan_find_dev \u627e\u5230\u5b50\u8bbe\u5907\uff0c\u5c06\u6570\u636e\u5305\u4e2d\u7684 dev \u8bbe\u7f6e\u4e3a\u5b50\u8bbe\u5907\uff0c\u7136\u540e\u5c06 Priority \u7b49\u4e0e VLAN \u76f8\u5173\u7684\u4fe1\u606f\u8fdb\u884c\u6e05\u7406\uff0c\u5230\u4e86\u8fd9\u91cc\uff0cVLAN \u6570\u636e\u5305\u5df2\u7ecf\u8f6c\u53d8\u4e3a\u4e00\u4e2a\u53d1\u5f80 VLAN \u5b50\u8bbe\u5907\u7684\u666e\u901a\u6570\u636e\u5305\u4e86\u3002\u00a03. \u5728 vlan_do_receive \u5b8c\u6210\u540e\uff0c\u4f1a\u8fdb\u5165 another_round\uff0c\u91cd\u65b0\u6309\u7167\u6b63\u5e38\u6570\u636e\u5305\u7684\u6d41\u7a0b\u6267\u884c\u4e00\u6b21__netif_receive_skb_core\uff0c\u6309\u7167\u6b63\u5e38\u5305\u7684\u5904\u7406\u903b\u8f91\u8fdb\u5165\uff0c\u8fdb\u5165\u4e86 rx_handler \u7684\u5904\u7406\uff0c\u5c31\u50cf\u4e00\u4e2a\u6b63\u5e38\u7684\u6570\u636e\u5305\u4e00\u6837\uff0c\u5728\u5b50\u8bbe\u5907\u4e0a\u901a\u8fc7\u4e0e\u4e3b\u8bbe\u5907\u76f8\u540c\u7684 rx_handler \u8fdb\u5165\u5230\u7f51\u7edc\u5c42\u3002\u00a0static int __netif_receive_skb_core(struct sk_buff **pskb, bool pfmemalloc,<\/p>\n<pre><code>        struct packet_type **ppt_prev)<\/code><\/pre>\n<p>{<br \/>  rx_handler_func_t *rx_handler;<br \/>  struct sk_buff <em>skb = <\/em>pskb;<br \/>  struct net_device *orig_dev;<\/p>\n<p>another_round:<br \/>  skb-&gt;skb_iif = skb-&gt;dev-&gt;ifindex;<br \/>  \/<em> \u8fd9\u662f\u5c1d\u8bd5\u5bf9\u6570\u636e\u5e27\u62a5\u6587\u672c\u8eab\u505a\u4e00\u6b21vlan\u7684\u89e3\u5c01\u88c5\uff0c\u4e5f\u5c31\u4ece\u5c06\u80cc\u666f\u4e2d\u7684vlan\u76f8\u5173\u7684\u4e24\u4e2a\u5b57\u6bb5\u586b\u5145<\/em>\/<br \/>  if (eth_type_vlan(skb-&gt;protocol)) {<\/p>\n<pre><code>skb = skb_vlan_untag(skb);\nif (unlikely(!skb))\n  goto out;<\/code><\/pre>\n<p>}<\/p>\n<pre><code>\/* \u8fd9\u91cc\u5c31\u662f\u4f60\u6240\u719f\u77e5\u7684tcpdump\u7684\u6293\u5305\u70b9\u4e86\uff0cpt_prev\u8bb0\u5f55\u4e86\u4e0a\u4e00\u4e2a\u5904\u7406\u62a5\u6587\u7684handler\uff0c\u5982\u4f60\u6240\u89c1\uff0c\u4e00\u4efdskb\u53ef\u80fd\u88ab\u5f88\u591a\u5730\u65b9\u5904\u7406\uff0c\u5305\u62ecpcap *\/<\/code><\/pre>\n<p>list_for_each_entry_rcu(ptype, &#038;ptype_all, list) {<\/p>\n<pre><code>if (pt_prev)\n  ret = deliver_skb(skb, pt_prev, orig_dev);\npt_prev = ptype;<\/code><\/pre>\n<p>}<\/p>\n<p>\/<em> \u8fd9\u91cc\u5728\u5b58\u5728vlan tag\u7684\u60c5\u51b5\u4e0b\uff0c\u5982\u679c\u6709pt_prev\u5df2\u7ecf\u5b58\u5728\uff0c\u5219\u505a\u4e00\u6b21deliver_skb\uff0c\u8fd9\u6837\u5176\u4ed6handler\u5904\u7406\u7684\u65f6\u5019\u5c31\u4f1a\u590d\u5236\u4e00\u4efd\uff0c\u539f\u59cb\u62a5\u6587\u5c31\u4e0d\u4f1a\u88ab\u4fee\u6539 <\/em>\/<br \/>  if (skb_vlan_tag_present(skb)) {<\/p>\n<pre><code>if (pt_prev) {\n  ret = deliver_skb(skb, pt_prev, orig_dev);\n  pt_prev = NULL;\n}\n    \/* \u8fd9\u91cc\u662f\u6838\u5fc3\u7684\u90e8\u5206\uff0c\u6211\u4eec\u770b\u5230\u7ecf\u8fc7vlan_do_receive\u5904\u7406\u4e4b\u540e\uff0c\u4f1a\u53d8\u6210\u6b63\u5e38\u5305\u6587\u518d\u6765\u4e00\u904d *\/\nif (vlan_do_receive(&amp;skb))\n  goto another_round;\nelse if (unlikely(!skb))\n  goto out;<\/code><\/pre>\n<p>}<\/p>\n<pre><code>\/* \u8fd9\u91cc\u662f\u6b63\u5e38\u62a5\u6587\u5e94\u8be5\u5230\u8fbe\u7684\u5730\u65b9\uff0cpt_prev\u8868\u793a\u5df2\u7ecf\u627e\u5230\u4e86\u6b63\u5e38\u7684handler\uff0c\u7136\u540e\u8c03\u7528rx_handler\u8fdb\u5165\u4e0a\u5c42\u5904\u7406 *\/<\/code><\/pre>\n<p>rx_handler = rcu_dereference(skb-&gt;dev-&gt;rx_handler);<br \/>  if (rx_handler) {<\/p>\n<pre><code>if (pt_prev) {\n  ret = deliver_skb(skb, pt_prev, orig_dev);\n  pt_prev = NULL;\n}\nswitch (rx_handler(&amp;skb)) {\ncase RX_HANDLER_CONSUMED:\n  ret = NET_RX_SUCCESS;\n  goto out;\ncase RX_HANDLER_ANOTHER:\n  goto another_round;\ncase RX_HANDLER_EXACT:\n  deliver_exact = true;\n  break;\ncase RX_HANDLER_PASS:\n  break;\n}<\/code><\/pre>\n<p>}<\/p>\n<p>if (unlikely(skb_vlan_tag_present(skb)) &#038;&#038; !netdev_uses_dsa(skb-&gt;dev)) {<br \/>check_vlan_id:<\/p>\n<pre><code>if (skb_vlan_tag_get_id(skb)) {\n\/* \u8fd9\u91cc\u662f\u5bf9vlan id\u5e76\u6ca1\u6709\u6b63\u786e\u88ab\u6458\u9664\u7684\u5904\u7406\uff0c\u901a\u5e38\u662f\u56e0\u4e3avlan id\u4e0d\u5408\u6cd5\u6216\u8005\u4e0d\u5b58\u5728\u5728\u672c\u5730<\/code><\/pre>\n<p>}<br \/>}\u00a0\u6570\u636e\u53d1\u9001\u00a0VLAN \u5b50\u8bbe\u5907\u7684\u6570\u636e\u53d1\u9001\u7684\u5165\u53e3\u662f vlan_dev_hard_start_xmit\uff0c\u76f8\u6bd4\u4e8e\u6536\u5305\u6d41\u7a0b\uff0c\u5176\u5b9e\u53d1\u9001\u7684\u6d41\u7a0b\u7b80\u5355\u5f88\u591a\uff0c\u5185\u6838\u5728\u53d1\u9001\u65f6\u7684\u6d41\u7a0b\u5982\u4e0b\uff1a<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412355\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a0<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412356\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a0\u5728\u786c\u4ef6\u53d1\u9001\u65f6\uff0cVLAN \u5b50\u8bbe\u5907\u4f1a\u8fdb\u5165 vlan_dev_hard_start_xmit \u65b9\u6cd5\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u5b9e\u73b0\u4e86 ndo_start_xmit \u63a5\u53e3\uff0c\u5b83\u901a\u8fc7__vlan_hwaccel_put_tag \u65b9\u6cd5\u586b\u5145 VLAN \u76f8\u5173\u7684\u4ee5\u592a\u7f51\u4fe1\u606f\u5230\u62a5\u6587\u4e2d\uff0c\u7136\u540e\u4fee\u6539\u4e86\u62a5\u6587\u7684\u8bbe\u5907\u4e3a\u4e3b\u8bbe\u5907\uff0c\u8c03\u7528\u4e3b\u8bbe\u5907\u7684 dev_queue_xmit \u65b9\u6cd5\u91cd\u65b0\u8fdb\u5165\u4e3b\u8bbe\u5907\u7684\u53d1\u9001\u961f\u5217\u8fdb\u884c\u53d1\u9001\uff0c\u6211\u4eec\u622a\u53d6\u5173\u952e\u7684\u4e00\u90e8\u5206\u6765\u5206\u6790\uff1a\u00a0static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,<\/p>\n<pre><code>          struct net_device *dev)<\/code><\/pre>\n<p>{<br \/>  \/<em> \u8fd9\u91cc\u5c31\u662f\u4e0a\u6587\u63d0\u5230\u7684vlan_tci\u7684\u586b\u5145\uff0c\u8fd9\u4e9b\u4fe1\u606f\u90fd\u5f52\u5c5e\u4e8e\u5b50\u8bbe\u5907\u672c\u8eab <\/em>\/<br \/>  if (veth-&gt;h_vlan_proto != vlan-&gt;vlan_proto ||<\/p>\n<pre><code>  vlan-&gt;flags &amp; VLAN_FLAG_REORDER_HDR) {\nu16 vlan_tci;\nvlan_tci = vlan-&gt;vlan_id;\nvlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb-&gt;priority);\n__vlan_hwaccel_put_tag(skb, vlan-&gt;vlan_proto, vlan_tci);<\/code><\/pre>\n<p>}<\/p>\n<pre><code>\/* \u8fd9\u91cc\u76f4\u63a5\u5c06\u8bbe\u5907\u4ece\u5b50\u8bbe\u5907\u6539\u4e3a\u4e86\u4e3b\u8bbe\u5907\uff0c\u975e\u5e38\u76f4\u63a5 *\/<\/code><\/pre>\n<p>skb-&gt;dev = vlan-&gt;real_dev;<br \/>  len = skb-&gt;len;<br \/>  if (unlikely(netpoll_tx_running(dev)))<\/p>\n<pre><code>return vlan_netpoll_send_skb(vlan, skb);\n\n\/* \u8fd9\u91cc\u5c31\u53ef\u4ee5\u76f4\u63a5\u8c03\u7528\u4e3b\u8bbe\u5907\u8fdb\u884c\u62a5\u6587\u53d1\u9001\u4e86 *\/<\/code><\/pre>\n<p>ret = dev_queue_xmit(skb);<\/p>\n<pre><code>...\n<\/code><\/pre>\n<p>return ret;<br \/>}\u00a0MACVlan \u8bbe\u5907\u00a0\u770b\u5b8c VLAN \u5b50\u8bbe\u5907\u4e4b\u540e\uff0c\u9a6c\u4e0a\u5bf9 MACVlan \u8fdb\u884c\u5206\u6790\uff0cMACVlan \u4e0e VLAN \u5b50\u8bbe\u5907\u4e0d\u4e00\u6837\u7684\u662f\uff0c\u5b83\u5df2\u7ecf\u4e0d\u518d\u662f\u4ee5\u592a\u7f51\u672c\u8eab\u7684\u80fd\u529b\u4e86\uff0c\u800c\u662f\u4e00\u79cd\u6709\u81ea\u5df1\u9a71\u52a8\u7684\u865a\u62df\u7f51\u8bbe\u5907\uff0c\u8fd9\u4e00\u70b9\u9996\u5148\u5c31\u4f53\u73b0\u5728\u9a71\u52a8\u4ee3\u7801\u7684\u72ec\u7acb\uff0cMACVlan \u76f8\u5173\u7684\u4ee3\u7801\u57fa\u672c\u90fd\u4f4d\u4e8e\/drivers\/net\/macvlan.c \u4e2d\u3002\u00a0MACVlan \u8bbe\u5907\u6709\u6709\u4e94\u79cd mode\uff0c\u5176\u4e2d\u9664\u4e86 source \u6a21\u5f0f\u5916\uff0c\u5176\u4f59\u56db\u79cd\u90fd\u51fa\u73b0\u6bd4\u8f83\u65e9\uff0c\u5b9a\u4e49\u5982\u4e0b\uff1a\u00a0enum macvlan_mode {<br \/>  MACVLAN_MODE_PRIVATE = 1, \/<em> don&#8217;t talk to other macvlans <\/em>\/<br \/>  MACVLAN_MODE_VEPA    = 2, \/<em> talk to other ports through ext bridge <\/em>\/<br \/>  MACVLAN_MODE_BRIDGE  = 4, \/<em> talk to bridge ports directly <\/em>\/<br \/>  MACVLAN_MODE_PASSTHRU = 8,\/<em> take over the underlying device <\/em>\/<br \/>  MACVLAN_MODE_SOURCE  = 16,\/<em> use source MAC address list to assign <\/em>\/<br \/>};\u00a0\u8fd9\u91cc\u5148\u8bb0\u4f4f\u8fd9\u4e9b\u6a21\u5f0f\u7684\u884c\u4e3a\uff0c\u5173\u4e8e\u5176\u4e2d\u7684\u539f\u56e0\u662f\u6211\u4eec\u540e\u9762\u8981\u56de\u7b54\u7684\u95ee\u9898\u3002\u00a0\u8bbe\u5907\u521b\u5efa\u00a0\u5bf9\u4e8e MACVlan \u8bbe\u5907\u6765\u8bf4\uff0c\u5b83\u7684 netlink \u54cd\u5e94\u7ed3\u6784\u4f53\u662f macvlan_link_ops\uff0c\u6211\u4eec\u53ef\u4ee5\u627e\u5230\u521b\u5efa\u8bbe\u5907\u7684\u54cd\u5e94\u65b9\u6cd5\u4e3amacvlan_newlink\uff0c\u4ece\u5165\u53e3\u5f00\u59cb\uff0c\u521b\u5efa\u4e00\u4e2a MACVlan \u8bbe\u5907\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u4e0b\uff1a\u00a0<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412357\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a01. macvlan_newlink \u4f1a\u8c03\u7528 macvlan_common_newlink \u8fdb\u884c\u5b9e\u9645\u7684\u5b50\u8bbe\u5907\u521b\u5efa\u64cd\u4f5c\uff0cmacvlan_common_newlink \u9996\u5148\u4f1a\u8fdb\u884c\u4e00\u4e2a\u5408\u6cd5\u6027\u7684\u6821\u9a8c\uff0c\u8fd9\u5176\u4e2d\u9700\u8981\u6ce8\u610f\u7684\u5c31\u662f netif_is_MACVlan \u68c0\u67e5\uff0c\u5982\u679c\u628a\u4e00\u4e2a MACVlan \u5b50\u8bbe\u5907\u4f5c\u4e3a\u4e3b\u8bbe\u5907\u6765\u521b\u5efa\u7684\u8bdd\uff0c\u90a3\u4e48\u4f1a\u81ea\u52a8\u91c7\u7528\u8fd9\u4e2a\u5b50\u8bbe\u5907\u7684\u4e3b\u8bbe\u5907\u4f5c\u4e3a\u65b0\u5efa\u7f51\u5361\u7684\u4e3b\u8bbe\u5907\u3002\u00a02. \u63a5\u4e0b\u6765\u4f1a\u901a\u8fc7 \u00a0eth_hw_addr_random \u7ed9 MACVlan \u8bbe\u5907\u521b\u5efa\u4e00\u4e2a\u968f\u673a\u7684 mac \u5730\u5740\uff0c\u6ca1\u9519\uff0cMACVlan \u5b50\u8bbe\u5907\u7684 mac \u5730\u5740\u662f\u968f\u673a\u7684\uff0c\u8fd9\u4e00\u70b9\u5f88\u91cd\u8981\uff0c\u540e\u9762\u4f1a\u63d0\u5230\u3002\u00a03. \u5728\u6709\u4e86 mac \u5730\u5740\u4e4b\u540e\uff0c\u5f00\u59cb\u5728\u4e3b\u8bbe\u5907\u4e0a\u521d\u59cb\u5316 MACVlan \u903b\u8f91\uff0c\u8fd9\u91cc\u4f1a\u6709\u4e2a\u68c0\u67e5\uff0c\u5982\u679c\u4e3b\u8bbe\u5907\u4ece\u672a\u521b\u5efa\u8fc7 MACVlan \u8bbe\u5907\uff0c\u5219\u4f1a\u901a\u8fc7 macvlan_port_create \u6765\u652f\u6301 MACVlan \u7684\u521d\u59cb\u5316\uff0c\u800c\u8fd9\u4e2a\u521d\u59cb\u5316\u6700\u4e3a\u6838\u5fc3\u7684\u5c31\u662f\uff0c\u8c03\u7528 netdev_rx_handler_register \u8fdb\u884c\u4e86 MACVlan \u7684 rx_handler \u65b9\u6cd5 macvlan_handle_frame \u53bb\u53d6\u4ee3\u4e86\u8bbe\u5907\u539f\u6765\u6ce8\u518c\u7684 rx_handler \u7684\u52a8\u4f5c\u3002\u00a04. \u5728\u521d\u59cb\u5316\u5b8c\u6210\u540e\uff0c\u83b7\u5f97\u4e00\u4e2a port\uff0c\u4e5f\u5c31\u662f\u5b50\u8bbe\u5907\uff0c\u7136\u540e\u5bf9\u5b50\u8bbe\u5907\u7684\u4fe1\u606f\u8fdb\u884c\u4e86\u8bbe\u7f6e\u3002\u00a05. \u6700\u540e\u901a\u8fc7 register_netdevice \u5b8c\u6210\u4e86\u8bbe\u5907\u7684\u521b\u5efa\u52a8\u4f5c\u3002\u6211\u4eec\u622a\u53d6\u90e8\u5206\u6838\u5fc3\u903b\u8f91\u8fdb\u884c\u5206\u6790\uff1a\u00a0int macvlan_common_newlink(struct net <em>src_net, struct net_device <\/em>dev,<\/p>\n<pre><code>     struct nlattr *tb[], struct nlattr *data[],\n     struct netlink_ext_ack *extack)<\/code><\/pre>\n<p>{<br \/>  &#8230;<\/p>\n<pre><code>\/* \u8fd9\u91cc\u68c0\u67e5\u4e86\u4e3b\u8bbe\u5907\u662f\u5426\u662fmacvlan\u8bbe\u5907\uff0c\u5982\u679c\u662f\u5219\u76f4\u63a5\u4f7f\u7528\u4ed6\u7684\u4e3b\u8bbe\u5907 *\/<\/code><\/pre>\n<p>if (netif_is_macvlan(lowerdev))<\/p>\n<pre><code>lowerdev = macvlan_dev_real_dev(lowerdev);\n\n\/* \u8fd9\u91cc\u751f\u6210\u4e86\u968f\u673a\u7684mac\u5730\u5740 *\/<\/code><\/pre>\n<p>if (!tb[IFLA_ADDRESS])<\/p>\n<pre><code>eth_hw_addr_random(dev);\n<\/code><\/pre>\n<p>\/<em> \u8fd9\u91cc\u8fdb\u884c\u4e86\u521d\u59cb\u5316\u64cd\u4f5c\uff0c\u4e5f\u5c31\u662f\u66ff\u6362\u4e86rx_handler <\/em>\/<br \/>  if (!netif_is_macvlan_port(lowerdev)) {<\/p>\n<pre><code>err = macvlan_port_create(lowerdev);\nif (err &lt; 0)\n  return err;\ncreate = true;<\/code><\/pre>\n<p>}<br \/>  port = macvlan_port_get_rtnl(lowerdev);<\/p>\n<pre><code>\/* \u63a5\u4e0b\u6765\u4e00\u5927\u6bb5\u90fd\u662f\u7701\u7565\u7684\u5173\u4e8e\u6a21\u5f0f\u7684\u8bbe\u7f6e *\/<\/code><\/pre>\n<p>vlan-&gt;lowerdev = lowerdev;<br \/>  vlan-&gt;dev      = dev;<br \/>  vlan-&gt;port     = port;<br \/>  vlan-&gt;set_features = MACVLAN_FEATURES;<br \/>  vlan-&gt;mode     = MACVLAN_MODE_VEPA;<\/p>\n<pre><code>\/* \u6700\u540e\u6ce8\u518c\u4e86\u8bbe\u5907 *\/<\/code><\/pre>\n<p>err = register_netdevice(dev);<br \/>  if (err &lt; 0)<\/p>\n<pre><code>goto destroy_macvlan_port;<\/code><\/pre>\n<p>}\u00a0\u63a5\u6536\u62a5\u6587\u00a0MACVlan \u8bbe\u5907\u7684\u62a5\u6587\u63a5\u6536\u4f9d\u7136\u662f\u4ece__netif_receive_skb_core \u5165\u53e3\u5f00\u59cb\uff0c\u5177\u4f53\u7684\u4ee3\u7801\u6d41\u7a0b\u5982\u4e0b\uff1a\u00a0<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412358\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a01. \u5f53__netif_receive_skb_core \u5728\u4e3b\u8bbe\u5907\u63a5\u6536\u540e\uff0c\u4f1a\u8fdb\u5165 MACVlan \u9a71\u52a8\u6ce8\u518c\u7684 macvlan_handle_frame \u65b9\u6cd5\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u9996\u5148\u4f1a\u5904\u7406\u591a\u64ad\u7684\u62a5\u6587\uff0c\u7136\u540e\u5904\u7406\u5355\u64ad\u7684\u62a5\u6587\u3002\u00a02. \u5bf9\u4e8e\u591a\u64ad\u62a5\u6587\uff0c\u7ecf\u8fc7 is_multicast_ether_addr \u540e\uff0c\u9996\u5148\u901a\u8fc7 macvlan_hash_lookup\uff0c\u901a\u8fc7\u5b50\u8bbe\u5907\u4e0a\u7684\u76f8\u5173\u4fe1\u606f\u67e5\u627e\u5230\u5b50\u8bbe\u5907\uff0c\u5219\u6839\u636e\u7f51\u5361\u7684 mode \u8fdb\u884c\u5904\u7406\uff0c\u5982\u679c\u662f private \u6216\u8005 passthrou\uff0c\u627e\u5230\u5b50\u8bbe\u5907\u5e76\u5355\u72ec\u901a\u8fc7 macvlan_broadcast_one \u9001\u7ed9\u5b83\uff1b\u5982\u679c\u662f bridge \u6216\u8005\u6ca1\u6709 VEPA\uff0c\u5219\u6240\u6709\u7684\u5b50\u8bbe\u5907\u90fd\u4f1a\u901a\u8fc7 macvlan_broadcast_enqueue \u6536\u5230\u5e7f\u64ad\u62a5\u6587\u3002\u00a03. \u5bf9\u4e8e\u5355\u64ad\u7684\u62a5\u6587\uff0c\u9996\u5148\u4f1a\u5c06 source \u6a21\u5f0f\u548c passthru \u6a21\u5f0f\u8fdb\u884c\u5904\u7406\uff0c\u76f4\u63a5\u89e6\u53d1\u4e0a\u5c42\u7684\u64cd\u4f5c\uff0c\u5bf9\u4e8e\u5176\u4ed6\u6a21\u5f0f\uff0c\u6839\u636e\u6e90 mac \u8fdb\u884c macvlan_hash_lookup \u64cd\u4f5c\uff0c\u5982\u679c\u627e\u5230\u4e86 VLAN \u4fe1\u606f\uff0c\u5219\u5c06\u62a5\u6587\u7684 dev \u8bbe\u7f6e\u4e3a\u627e\u5230\u7684\u5b50\u8bbe\u5907\u3002\u00a04. \u6700\u540e\u5bf9\u62a5\u6587\u8fdb\u884c pkt_type \u7684\u8bbe\u7f6e\uff0c\u5c06\u5176\u901a\u8fc7 RX_HANDLER_ANOTHER \u7684\u8fd4\u56de\uff0c\u518d\u8fdb\u884c\u4e00\u6b21__netif_receive_skb_core \u7684\u64cd\u4f5c\uff0c\u8fd9\u6b21\u64cd\u4f5c\u4e2d\uff0c\u8d70\u5230 macvlan_hash_lookup \u65f6\uff0c\u7531\u4e8e\u5df2\u7ecf\u662f\u5b50\u8bbe\u5907\uff0c\u6240\u4ee5\u4f1a\u8fd4\u56de RX_HANDLER_PASS \u4ece\u800c\u8fdb\u5165\u4e0a\u5c42\u7684\u5904\u7406\u3002\u00a05. \u5bf9\u4e8e MACVlan \u7684\u6570\u636e\u63a5\u6536\u8fc7\u7a0b\uff0c\u6700\u4e3a\u5173\u952e\u7684\u5c31\u662f\u4e3b\u8bbe\u5907\u63a5\u6536\u5230\u62a5\u6587\u540e\u9009\u62e9\u5b50\u8bbe\u5907\u7684\u903b\u8f91\uff0c\u8fd9\u90e8\u5206\u4ee3\u7801\u5982\u4e0b\uff1a\u00a0static struct macvlan_dev <em>macvlan_hash_lookup(const struct macvlan_port <\/em>port,<\/p>\n<pre><code>             const unsigned char *addr)<\/code><\/pre>\n<p>{<br \/>  struct macvlan_dev *vlan;<br \/>  u32 idx = macvlan_eth_hash(addr);<\/p>\n<p>hlist_for_each_entry_rcu(vlan, &#038;port-&gt;vlan_hash[idx], hlist,<\/p>\n<pre><code>     lockdep_rtnl_is_held()) {\n\/* \u8fd9\u90e8\u5206\u903b\u8f91\u5c31\u662fmacvlan\u67e5\u627e\u5b50\u8bbe\u5907\u7684\u6838\u5fc3\uff0c\u6bd4\u8f83mac\u5730\u5740 *\/\nif (ether_addr_equal_64bits(vlan-&gt;dev-&gt;dev_addr, addr))\n  return vlan;<\/code><\/pre>\n<p>}<br \/>  return NULL;<br \/>}\u00a0\u53d1\u9001\u62a5\u6587\u00a0MACVlan \u7684\u53d1\u9001\u62a5\u6587\u8fc7\u7a0b\u4e5f\u662f\u4ece\u5b50\u8bbe\u5907\u63a5\u6536\u5230 ndo_start_xmit \u56de\u8c03\u51fd\u6570\u5f00\u59cb\uff0c\u5b83\u7684\u5165\u53e3\u662f macvlan_start_xmit\uff0c\u6574\u4f53\u7684\u5185\u6838\u4ee3\u7801\u6d41\u7a0b\u5982\u4e0b\uff1a<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412359\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a0<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412360\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a01. \u5f53\u6570\u636e\u5305\u8fdb\u5165 macvlan_start_xmit \u540e\uff0c\u4e3b\u8981\u6267\u884c\u6570\u636e\u5305\u53d1\u9001\u64cd\u4f5c\u7684\u662f macvlan_queue_xmit \u65b9\u6cd5\u3002\u00a02. macvlan_queue_xmit \u9996\u5148\u5904\u7406 bridge \u6a21\u5f0f\uff0c\u6211\u4eec\u4ece mode \u7684\u5b9a\u4e49\u53ef\u77e5\uff0c\u53ea\u6709 bridge \u6a21\u5f0f\u4e0b\u624d\u53ef\u80fd\u5728\u4e3b\u8bbe\u5907\u5185\u90e8\u51fa\u73b0\u4e0d\u540c\u5b50\u8bbe\u5907\u7684\u76f4\u63a5\u901a\u4fe1\uff0c\u6240\u6709\u8fd9\u91cc\u5904\u7406\u4e86\u8fd9\u79cd\u7279\u6b8a\u7684\u60c5\u51b5\uff0c\u628a\u591a\u64ad\u62a5\u6587\u548c\u76ee\u7684\u5730\u4e3a\u5176\u4ed6\u5b50\u8bbe\u5907\u7684\u5355\u64ad\u62a5\u6587\u76f4\u63a5\u53d1\u7ed9\u5b50\u8bbe\u5907\u3002\u00a03. \u5bf9\u4e8e\u5176\u4ed6\u62a5\u6587\uff0c\u5219\u4f1a\u901a\u8fc7 dev_queue_xmit_accel \u8fdb\u884c\u53d1\u9001\uff0cdev_queue_xmit_accel \u4f1a\u76f4\u63a5\u8c03\u7528\u4e3b\u8bbe\u5907\u7684 netdev_start_xmit \u65b9\u6cd5\uff0c\u4ece\u800c\u5b9e\u73b0\u62a5\u6587\u771f\u6b63\u7684\u53d1\u9001\u3002\u00a0static int macvlan_queue_xmit(struct sk_buff <em>skb, struct net_device <\/em>dev)<br \/>{<br \/>  &#8230;<\/p>\n<p>\/<em> \u8fd9\u91cc\u9996\u5148\u662fbridge\u6a21\u5f0f\u4e0b\u7684\u903b\u8f91\uff0c\u9700\u8981\u8003\u8651\u4e0d\u901a\u5b50\u8bbe\u5907\u95f4\u7684\u901a\u4fe1 <\/em>\/<br \/>  if (vlan-&gt;mode == MACVLAN_MODE_BRIDGE) {<\/p>\n<pre><code>const struct ethhdr *eth = skb_eth_hdr(skb);\n\n\/* send to other bridge ports directly *\/\nif (is_multicast_ether_addr(eth-&gt;h_dest)) {\n  skb_reset_mac_header(skb);\n  macvlan_broadcast(skb, port, dev, MACVLAN_MODE_BRIDGE);\n  goto xmit_world;\n}\n\/* \u8fd9\u91cc\u5bf9\u53d1\u5f80\u540c\u4e00\u4e2a\u4e3b\u8bbe\u5907\u7684\u5176\u4ed6\u5b50\u8bbe\u5907\u8fdb\u884c\u5904\u7406\uff0c\u76f4\u63a5\u8fdb\u884c\u8f6c\u53d1 *\/\ndest = macvlan_hash_lookup(port, eth-&gt;h_dest);\nif (dest &amp;&amp; dest-&gt;mode == MACVLAN_MODE_BRIDGE) {\n  \/* send to lowerdev first for its network taps *\/\n  dev_forward_skb(vlan-&gt;lowerdev, skb);\n\n  return NET_XMIT_SUCCESS;\n}<\/code><\/pre>\n<p>}<br \/>xmit_world:<br \/>  skb-&gt;dev = vlan-&gt;lowerdev;<\/p>\n<pre><code>\/* \u8fd9\u91cc\u5df2\u7ecf\u5c06\u62a5\u6587\u7684\u8bbe\u5907\u8bbe\u7f6e\u4e3a\u4e3b\u8bbe\u5907\uff0c\u7136\u540e\u901a\u8fc7\u4e3b\u8bbe\u5907\u8fdb\u884c\u53d1\u9001 *\/<\/code><\/pre>\n<p>return dev_queue_xmit_accel(skb,<\/p>\n<pre><code>        netdev_get_sb_channel(dev) ? dev : NULL);<\/code><\/pre>\n<p>}\u00a0IPVlan \u8bbe\u5907\u00a0IPVlan \u5b50\u8bbe\u5907\u76f8\u6bd4\u4e8e MACVlan \u548c VLAN \u5b50\u8bbe\u5907\u6765\u8bf4\uff0c\u6a21\u578b\u5c31\u66f4\u52a0\u590d\u6742\u4e86\uff0c\u4e0d\u540c\u4e8e MACVlan\uff0cIPVlan \u5c06\u4e0e\u5b50\u8bbe\u5907\u95f4\u4e92\u901a\u884c\u4e3a\u901a\u8fc7 flag \u6765\u5b9a\u4e49\uff0c\u540c\u65f6\u53c8\u63d0\u4f9b\u4e86\u4e09\u79cd mode\uff0c\u5b9a\u4e49\u5982\u4e0b\uff1a\u00a0\/<em> \u6700\u521d\u53ea\u6709l2\u548cl3\uff0c\u540e\u9762linux\u6709\u4e86l3mdev\uff0c\u4e8e\u662f\u5c31\u51fa\u73b0\u4e86l3s\uff0c\u4ed6\u4eec\u4e3b\u8981\u7684\u533a\u522b\u8fd8\u662f\u5728rx <\/em>\/<br \/>enum ipvlan_mode {<br \/>  IPVLAN_MODE_L2 = 0,<br \/>  IPVLAN_MODE_L3,<br \/>  IPVLAN_MODE_L3S,<br \/>  IPVLAN_MODE_MAX<br \/>};<\/p>\n<p>\/<em> \u8fd9\u91cc\u5176\u5b9e\u8fd8\u6709\u4e2abridge\uff0c\u56e0\u4e3a\u9ed8\u8ba4\u5c31\u662fbridge\uff0c\u6240\u6709\u7701\u7565\u4e86\uff0c\u4ed6\u4eec\u7684\u8bed\u4e49\u548cmacvlan\u4e00\u6837 <\/em>\/<\/p>\n<h2>define IPVLAN_F_PRIVATE  0x01<\/h2>\n<h2>define IPVLAN_F_VEPA   0x02\u00a0\u8bbe\u5907\u521b\u5efa\u00a0\u6709\u4e86\u4e4b\u524d\u4e24\u79cd\u5b50\u8bbe\u5907\u7684\u5206\u6790\uff0c\u5728 IPVlan \u7684\u5206\u6790\u4e0a\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u6309\u7167\u8fd9\u4e2a\u601d\u8def\u7ee7\u7eed\u8fdb\u884c\u5206\u6790\uff0cIPVlan \u8bbe\u5907\u7684 netlink \u6d88\u606f\u5904\u7406\u7ed3\u6784\u4f53\u662f ipvlan_link_ops\uff0c\u800c\u521b\u5efa\u8bbe\u5907\u7684\u5165\u53e3\u65b9\u6cd5\u662f ipvlan_link_new\uff0c\u521b\u5efa IPVlan \u5b50\u8bbe\u5907\u7684\u6d41\u7a0b\u5982\u4e0b\uff1a<\/h2>\n<p><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412361\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a0<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412362\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a01. \u8fdb\u5165 ipvlan_link_new\uff0c\u8fdb\u884c\u5408\u6cd5\u6027\u5224\u65ad\uff0c\u4e0e MACVlan \u7c7b\u4f3c\uff0c\u5982\u679c\u4ee5\u4e00\u4e2a IPVlan \u8bbe\u5907\u4f5c\u4e3a\u4e3b\u8bbe\u5907\u8fdb\u884c\u65b0\u589e\uff0c\u5c31\u4f1a\u81ea\u52a8\u5c06 IPVlan \u8bbe\u5907\u7684\u4e3b\u8bbe\u5907\u4f5c\u4e3a\u65b0\u8bbe\u5907\u7684\u4e3b\u8bbe\u5907\u3002\u00a02. \u901a\u8fc7 eth_hw_addr_set \u8bbe\u7f6e IPVlan \u8bbe\u5907\u7684 mac \u5730\u5740\u4e3a\u4e3b\u8bbe\u5907\u7684 mac \u5730\u5740\uff0c\u8fd9\u662f IPVlan \u4e0e MACVlan \u6700\u660e\u663e\u7684\u7279\u5f81\u533a\u5206\u3002\u00a03. \u8fdb\u5165\u7edf\u4e00\u7f51\u5361\u6ce8\u518c\u7684 register_netdevice \u6d41\u7a0b\uff0c\u5728\u8fd9\u4e2a\u6d41\u7a0b\u91cc\uff0c\u5982\u679c\u5f53\u524d\u6ca1\u6709 IPVlan \u5b50\u8bbe\u5907\u5b58\u5728\uff0c\u5219\u4f1a\u548c MACVlan \u4e00\u6837\uff0c\u8fdb\u5165\u5230 ipvlan_init \u7684\u521d\u59cb\u5316\u8fc7\u7a0b\uff0c\u5b83\u4f1a\u5728\u4e3b\u8bbe\u5907\u4e0a\u521b\u5efa ipvl_port\uff0c\u5e76\u4e14\u7528 IPVlan \u7684 rx_handler \u53bb\u53d6\u4ee3\u4e3b\u8bbe\u5907\u539f\u6709\u7684 rx_handler\uff0c\u540c\u65f6\u4e5f\u4f1a\u542f\u52a8\u4e00\u4e2a\u4e13\u95e8\u7684\u5185\u6838 worker \u53bb\u5904\u7406\u591a\u64ad\u62a5\u6587\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5bf9\u4e8e IPVlan\uff0c\u6240\u6709\u7684\u591a\u64ad\u62a5\u6587\u5176\u5b9e\u90fd\u662f\u7edf\u4e00\u5904\u7406\u7684\u3002\u00a04. \u63a5\u4e0b\u6765\u7ee7\u7eed\u5904\u7406\u5f53\u524d\u8fd9\u4e2a\u65b0\u589e\u7684\u5b50\u8bbe\u5907\uff0c\u901a\u8fc7 ipvlan_set_port_mode \u5c06\u5f53\u524d\u5b50\u8bbe\u5907\u4fdd\u5b58\u5230\u4e3b\u8bbe\u5907\u7684\u4fe1\u606f\u4e2d\uff0c\u540c\u65f6\u9488\u5bf9 l3s \u7684\u5b50\u8bbe\u5907\uff0c\u4f1a\u5c06\u5b83\u7684 l3mdev \u5904\u7406\u65b9\u6cd5\u6ce8\u518c\u5230 nf_hook \u4e2d\uff0c\u6ca1\u9519\uff0c\u8fd9\u662f\u548c\u4e0a\u9762\u8bbe\u5907\u6700\u5927\u7684\u533a\u522b\uff0cl3s \u7684\u4e3b\u8bbe\u5907\u548c\u5b50\u8bbe\u5907\u4ea4\u6362\u6570\u636e\u5305\u5b9e\u9645\u4e0a\u662f\u5728\u7f51\u7edc\u5c42\u5b8c\u6210\u7684\u3002\u00a0\u5bf9\u4e8e IPVlan \u7f51\u7edc\u8bbe\u5907\uff0c\u6211\u4eec\u622a\u53d6 ipvlan_port_create \u4e00\u90e8\u5206\u4ee3\u7801\u8fdb\u884c\u5206\u6790\uff1a\u00a0static int ipvlan_port_create(struct net_device *dev)<br \/>{<\/p>\n<pre><code>\/* \u4ece\u8fd9\u91cc\u53ef\u4ee5\u770b\u5230\uff0cport\u662f\u4e3b\u8bbe\u5907\u5bf9\u5b50\u8bbe\u5907\u7ba1\u7406\u7684\u6838\u5fc3 *\/<\/code><\/pre>\n<p>struct ipvl_port *port;<br \/>  int err, idx;<\/p>\n<pre><code>\/* \u5b50\u8bbe\u5907\u7684\u5404\u79cd\u5c5e\u6027\uff0c\u90fd\u5728port\u4e2d\u4f53\u73b0\uff0c\u4e5f\u53ef\u4ee5\u770b\u5230\u9ed8\u8ba4\u7684mode\u662fl3 *\/<\/code><\/pre>\n<p>write_pnet(&#038;port-&gt;pnet, dev_net(dev));<br \/>  port-&gt;dev = dev;<br \/>  port-&gt;mode = IPVLAN_MODE_L3;<\/p>\n<pre><code>\/* \u8fd9\u91cc\u53ef\u4ee5\u770b\u5230\uff0c\u5bf9\u4e8eipvlan\uff0c\u591a\u64ad\u7684\u62a5\u6587\u90fd\u662f\u5355\u72ec\u5904\u7406\u7684 *\/<\/code><\/pre>\n<p>skb_queue_head_init(&#038;port-&gt;backlog);<br \/>  INIT_WORK(&#038;port-&gt;wq, ipvlan_process_multicast);<\/p>\n<pre><code>\/* \u8fd9\u91cc\u5c31\u662f\u5e38\u89c4\u64cd\u4f5c\u4e86\uff0c\u5176\u5b9e\u4ed6\u662f\u9760\u7740\u8fd9\u91cc\u6765\u8ba9\u4e3b\u8bbe\u5907\u7684\u6536\u5305\u53ef\u4ee5\u987a\u5229\u914d\u5408ipvlan\u7684\u52a8\u4f5c *\/<\/code><\/pre>\n<p>err = netdev_rx_handler_register(dev, ipvlan_handle_frame, port);<br \/>  if (err)<\/p>\n<pre><code>goto err;<\/code><\/pre>\n<p>}\u00a0\u63a5\u6536\u62a5\u6587\u00a0\u00a0IPVlan \u5b50\u8bbe\u5907\u7684\u4e09\u79cd mode \u5206\u522b\u6709\u4e0d\u540c\u7684\u6536\u5305\u5904\u7406\u6d41\u7a0b\uff0c\u5728\u5185\u6838\u7684\u6d41\u7a0b\u5982\u4e0b\uff1a\u00a0<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412363\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a0<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412364\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><\/p>\n<ol>\n<li>\u4e0e MACVlan \u7c7b\u4f3c\uff0c\u9996\u5148\u4f1a\u7ecf\u8fc7__netif_receive_skb_core \u8fdb\u5165\u5230\u521b\u5efa\u65f6\u6ce8\u518c\u7684 ipvlan_handle_frame \u7684\u5904\u7406\u6d41\u7a0b\uff0c\u6b64\u65f6\u6570\u636e\u5305\u4f9d\u7136\u662f\u4e3b\u8bbe\u5907\u6240\u62e5\u6709\u3002\u00a02. \u5bf9\u4e8e mode l2 \u6a21\u5f0f\u7684\u62a5\u6587\u5904\u7406\uff0c\u53ea\u5904\u7406\u591a\u64ad\u7684\u62a5\u6587\uff0c\u5c06\u62a5\u6587\u653e\u8fdb\u524d\u9762\u521b\u5efa\u5b50\u8bbe\u5907\u65f6\u521d\u59cb\u5316\u7684\u591a\u64ad\u5904\u7406\u7684\u961f\u5217\uff1b\u5bf9\u4e8e\u5355\u64ad\u62a5\u6587\uff0c\u4f1a\u76f4\u63a5\u4ea4\u7ed9 ipvlan_handle_mode_l3 \u8fdb\u884c\u5904\u7406\uff01\u00a03. \u5bf9\u4e8e mode l3 \u6216\u8005\u5355\u64ad\u7684 mode l2 \u62a5\u6587\uff0c\u8fdb\u5165 ipvlan_handle_mode_l3 \u5904\u7406\u6d41\u7a0b\uff0c\u9996\u5148\u901a\u8fc7 ipvlan_get_L3_hdr \u83b7\u53d6\u5230\u7f51\u7edc\u5c42\u7684\u5934\u4fe1\u606f\uff0c\u7136\u540e\u6839\u636e ip \u5730\u5740\u53bb\u67e5\u627e\u5230\u5bf9\u5e94\u7684\u5b50\u8bbe\u5907\uff0c\u6700\u540e\u8c03\u7528 ipvlan_rcv_frame\uff0c\u5c06\u62a5\u6587\u7684 dev \u8bbe\u7f6e\u4e3a IPVlan \u5b50\u8bbe\u5907\u5e76\u8fd4\u56de RX_HANDLER_ANOTHER\uff0c\u8fdb\u884c\u4e0b\u4e00\u6b21\u6536\u5305\u3002\u00a04. \u5bf9\u4e8e mode l3s\uff0c\u5728 ipvlan_handle_frame \u4e2d\u4f1a\u76f4\u63a5\u8fd4\u56de RX_HANDLER_PASS\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0cmode l3s \u7684\u62a5\u6587\u4f1a\u5728\u4e3b\u8bbe\u5907\u5c31\u8fdb\u5165\u5230\u7f51\u7edc\u5c42\u7684\u5904\u7406\u9636\u6bb5\uff0c\u5bf9\u4e8e mode l3s \u6765\u8bf4\uff0c\u9884\u5148\u6ce8\u518c\u7684 nf_hook \u4f1a\u5728 NF_INET_LOCAL_IN \u65f6\u89e6\u53d1\uff0c\u6267\u884c ipvlan_l3_rcv \u64cd\u4f5c\uff0c\u901a\u8fc7 addr \u627e\u5230\u5b50\u8bbe\u5907\uff0c\u66f4\u6362\u62a5\u6587\u7684\u7f51\u7edc\u5c42\u76ee\u7684\u5730\u5740\uff0c\u7136\u540e\u76f4\u63a5\u8fdb\u5165 ip_local_deliver \u8fdb\u884c\u7f51\u7edc\u5c42\u4f59\u4e0b\u7684\u64cd\u4f5c\u3002\u00a0\u53d1\u9001\u62a5\u6587\u00a0IPVlan \u7684\u62a5\u6587\u53d1\u9001\uff0c\u5c3d\u7ba1\u5728\u5b9e\u73b0\u4e0a\u76f8\u5bf9\u590d\u6742\uff0c\u4f46\u662f\u7a76\u5176\u6839\u672c\uff0c\u8fd8\u662f\u5404\u4e2a\u5b50\u8bbe\u5907\u5728\u60f3\u529e\u6cd5\u7528\u4e3b\u8bbe\u5907\u6765\u505a\u5230\u53d1\u9001\u62a5\u6587\u7684\u5de5\u4f5c\uff0cIPVlan \u5b50\u8bbe\u5907\u8fdb\u884c\u6570\u636e\u5305\u53d1\u9001\u65f6\uff0c\u9996\u5148\u8fdb\u5165 ipvlan_start_xmit\uff0c\u5176\u6838\u5fc3\u7684\u53d1\u9001\u64cd\u4f5c\u5728 ipvlan_queue_xmit\uff0c\u5185\u6838\u4ee3\u7801\u6d41\u7a0b\u5982\u4e0b\uff1a\u00a0<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412365\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a01. ipvlan_queue_xmit \u6839\u636e\u5b50\u8bbe\u5907\u7684\u6a21\u5f0f\u9009\u62e9\u4e0d\u540c\u7684\u53d1\u9001\u65b9\u6cd5\uff0cmode l2 \u901a\u8fc7 ipvlan_xmit_mode_l2 \u53d1\u9001\uff0cmode l3 \u548c mode l3s \u8fdb\u884c ipvlan_xmit_mode_l3 \u53d1\u9001\u3002\u00a02. \u5bf9\u4e8e ipvlan_xmit_mode_l2\uff0c\u9996\u5148\u5224\u65ad\u662f\u5426\u662f\u672c\u5730\u5730\u5740\u6216\u8005 VEPA \u6a21\u5f0f\uff0c\u5982\u679c\u4e0d\u662f VEPA \u6a21\u5f0f\u7684\u672c\u5730\u62a5\u6587\uff0c\u5219\u9996\u5148\u901a\u8fc7 ipvlan_addr_lookup \u67e5\u5230\u5230\u662f\u5426\u662f\u76f8\u540c\u4e3b\u8bbe\u5907\u4e0b\u7684 IPVlan \u5b50\u8bbe\u5907\uff0c\u5982\u679c\u662f\uff0c\u5219\u901a\u8fc7 ipvlan_rcv_frame \u8ba9\u5176\u4ed6\u5b50\u8bbe\u5907\u8fdb\u884c\u6536\u5305\u5904\u7406\uff1b\u5982\u679c\u4e0d\u662f\uff0c\u5219\u901a\u8fc7 dev_forward_skb \u8ba9\u4e3b\u8bbe\u5907\u8fdb\u884c\u5904\u7406\u3002\u00a03. \u63a5\u4e0b\u6765 ipvlan_xmit_mode_l2 \u4f1a\u5bf9\u591a\u64ad\u62a5\u6587\u8fdb\u884c\u5904\u7406\uff0c\u5728\u5904\u7406\u4e4b\u524d\uff0c\u901a\u8fc7 ipvlan_skb_crossing_ns \u6e05\u7406\u6389\u6570\u636e\u5305\u7684 netns \u76f8\u5173\u7684\u4fe1\u606f\uff0c\u5305\u62ec priority \u7b49\uff0c\u6700\u540e\u5c06\u6570\u636e\u5305\u653e\u5230 ipvlan_multicast_enqueue\uff0c\u89e6\u53d1\u4e0a\u8ff0\u7684\u591a\u64ad\u5904\u7406\u6d41\u7a0b\u3002\u00a04. \u5bf9\u4e8e\u975e\u672c\u5730\u7684\u6570\u636e\u5305\uff0c\u901a\u8fc7\u4e3b\u8bbe\u5907\u7684 dev_queue_xmit \u8fdb\u884c\u53d1\u9001\u3002\u00a05. ipvlan_xmit_mode_l3 \u7684\u5904\u7406\u9996\u5148\u4e5f\u662f\u5bf9 VEPA \u8fdb\u884c\u5224\u65ad\uff0c\u5bf9\u4e0e\u975e VEPA \u6a21\u5f0f\u7684\u6570\u636e\u5305\uff0c\u901a\u8fc7ipvlan_addr_lookup \u67e5\u627e\u662f\u5426\u662f\u5176\u4ed6\u5b50\u8bbe\u5907\uff0c\u5982\u679c\u662f\u5219\u8c03\u7528 ipvlan_rcv_frame \u89e6\u53d1\u5176\u4ed6\u8bbe\u5907\u8fdb\u884c\u6536\u5305\u5904\u7406\u3002\u00a06. \u5bf9\u4e8e\u975e VEPA \u6a21\u5f0f\u7684\u6570\u636e\u5305\uff0c\u9996\u5148\u8fdb\u884c ipvlan_skb_crossing_ns \u7684\u5904\u7406\uff0c\u7136\u540e\u8fdb\u884c ipvlan_process_outbound\u7684\u64cd\u4f5c\uff0c\u6b64\u65f6\u6839\u636e\u6570\u636e\u5305\u7684\u7f51\u7edc\u5c42\u534f\u8bae\uff0c\u9009\u62e9 ipvlan_process_v4_outbound \u6216\u8005 ipvlan_process_v6_outbound \u8fdb\u884c\u5904\u7406\u3002\u00a07. \u4ee5 ipvlan_process_v6_outbound \u4e3a\u4f8b\uff0c\u9996\u5148\u4f1a\u901a\u8fc7 ip_route_output_flow \u8fdb\u884c\u8def\u7531\u7684\u67e5\u627e\uff0c\u7136\u540e\u76f4\u63a5\u901a\u8fc7\u7f51\u7edc\u5c42\u7684 ip_local_out\uff0c\u5728\u4e3b\u8bbe\u5907\u7684\u7f51\u7edc\u5c42\u7ee7\u7eed\u8fdb\u884c\u53d1\u5305\u64cd\u4f5c\u3002\u00a0\u89e3\u51b3\u95ee\u9898\u00a0\u7ecf\u5386\u4e0a\u9762\u7684\u5206\u6790\u548c\u4e00\u756a\u4f53\u4f1a\u601d\u8003\uff0c\u6211\u60f3\u81f3\u5c11\u7b2c\u4e00\u4e2a\u95ee\u9898\u5df2\u7ecf\u53ef\u4ee5\u5f88\u8f7b\u6613\u7684\u56de\u7b54\u51fa\u6765\u4e86\uff1a\u00a0VLAN \u4e0e MACVlan\/IPVlan \u7684\u5173\u7cfb\u00a0VLAN \u548c IPVlan\uff0cMACVlan \u6709\u4ec0\u4e48\u5173\u7cfb\u5462\uff1f\u4e3a\u4ec0\u4e48\u540d\u5b57\u91cc\u90fd\u6709 VLAN\uff1f\u00a0\u65e2\u7136 MACVlan \u548c IPVlan \u9009\u62e9\u53eb\u8fd9\u4e2a\u540d\u5b57\uff0c\u90a3\u8bf4\u660e\u5728\u67d0\u4e9b\u65b9\u9762\u8fd8\u662f\u6709\u76f8\u4f3c\u4e4b\u5904\u7684\u3002\u6211\u4eec\u6574\u4f53\u5206\u6790\u4e0b\u6765\u53d1\u73b0\uff0cVLAN \u5b50\u8bbe\u5907\u548c MACVlan\uff0cIPVlan \u7684\u6838\u5fc3\u903b\u8f91\u5f88\u76f8\u4f3c\uff1a\u00a01. \u4e3b\u8bbe\u5907\u8d1f\u8d23\u7269\u7406\u4e0a\u7684\u6536\u53d1\u5305\u3002\u00a02. \u4e3b\u8bbe\u5907\u5c06\u5b50\u8bbe\u5907\u7ba1\u7406\u4e3a\u591a\u4e2a port\uff0c\u7136\u540e\u6839\u636e\u4e00\u5b9a\u7684\u89c4\u5219\u627e\u5230 port\uff0c\u6bd4\u5982 VLAN \u4fe1\u606f\uff0cmac \u5730\u5740\u4ee5\u53ca ip \u5730\u5740\uff08macvlan_hash_lookup\uff0cvlan_find_dev\uff0cipvlan_addr_lookup\uff09\u3002\u00a03. \u4e3b\u8bbe\u5907\u6536\u5305\u540e\uff0c\u90fd\u9700\u8981\u7ecf\u8fc7\u5728__netif_receive_skb_core \u4e2d\u8d70\u4e00\u6bb5\u201c\u56de\u5934\u8def\u201d.\u00a04. \u5b50\u8bbe\u5907\u53d1\u5305\u6700\u7ec8\u90fd\u662f\u76f4\u63a5\u901a\u8fc7\u4fee\u6539\u62a5\u6587\u7684 dev\uff0c\u7136\u540e\u8ba9\u4e3b\u8bbe\u5907\u53bb\u64cd\u4f5c\u3002\u00a0\u6240\u4ee5\u4e0d\u96be\u63a8\u8bba\uff0cMACVlan\/IPVlan \u7684\u5185\u5728\u903b\u8f91\u5176\u5b9e\u5f88\u5927\u7a0b\u5ea6\u4e0a\u53c2\u8003\u4e86 Linux \u7684 VLAN \u7684\u5b9e\u73b0\u3002Linux \u6700\u65e9\u52a0\u5165 MACVlan \u662f\u5728 2007 \u5e74 6 \u6708 18 \u65e5\u53d1\u5e03\u7684\u00a02.6.63 \u7248\u672c[3]\uff0c\u5bf9\u4ed6\u7684\u63cf\u8ff0\u662f\uff1a\u00a0The new &#8220;MACVlan&#8221; driver allows the system administrator to create virtual interfaces mapped to and from specific MAC addresses.\u00a0\u800c\u5230\u4e86 2014 \u5e74 12 \u6708 7 \u65e5 \u53d1\u5e03\u7684\u00a03.19 \u7248\u672c[4]\u4e2d\uff0c\u7b2c\u4e00\u6b21\u5f15\u5165\u4e86 IPVlan\uff0c\u4ed6\u7684\u63cf\u8ff0\u662f\uff1a\u00a0The new &#8220;IPVlan&#8221; driver enable the creation of virtual network devices for container interconnection. It is designed to work well with network namespaces. IPVlan is much like the existing MACVlan driver, but it does its multiplexing at a higher level in the stack.\u00a0\u81f3\u4e8e VLAN\uff0c\u51fa\u73b0\u7684\u8fdc\u6bd4 Linux 2.4 \u7248\u672c\u8fd8\u8981\u65e9\uff0c\u5f88\u591a\u8bbe\u5907\u7684\u7b2c\u4e00\u7248\u9a71\u52a8\u5c31\u5df2\u7ecf\u652f\u6301\u4e86 VLAN\uff0c\u4e0d\u8fc7\uff0cLinux \u5bf9\u4e8e VLAN \u7684 hwaccel \u5b9e\u73b0\uff0c\u662f 2004 \u5e74\u7684\u00a02.6.10[5]\uff0c\u5f53\u65f6\u66f4\u65b0\u7684\u4e00\u5927\u6279\u7279\u6027\u4e2d\uff0c\u51fa\u73b0\u4e86\u8fd9\u4e00\u6761\uff1a\u00a0I was poking about in the National Semi 83820 driver, and I happened to notice that the chip supports VLAN tag add\/strip assist in hardware, but the driver wasn&#8217;t making use of it. This patch adds in the driver support to use the VLAN tag add\/remove hardware, and enables the drivers use of the kernel VLAN hwaccel interface.\u00a0\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53 Linux \u5f00\u59cb\u628a VLAN \u5f53\u4f5c\u4e00\u4e2a interface \u5904\u7406\u540e\uff0c\u624d\u6709\u4e86\u540e\u9762\u7684 MACVlan \u548c IPVlan \u4e24\u4e2a virtual interface\uff0cLinux \u4e3a\u4e86\u5b9e\u73b0\u5bf9\u4e8e VLAN \u6570\u636e\u5305\u7684\u5904\u7406\u6d41\u7a0b\u7684\u52a0\u901f\uff0c\u628a\u4e0d\u540c\u7684 VLAN \u865a\u62df\u6210\u4e86\u8bbe\u5907\uff0c\u800c\u540e\u671f MACVlan \u548c IPVlan \u5728\u8fd9\u79cd\u601d\u8def\u4e4b\u4e0b\uff0c\u8ba9\u865a\u62df\u8bbe\u5907\u6709\u4e86\u66f4\u5927\u7684\u7528\u6b66\u4e4b\u5730\u3002\u00a0\u8fd9\u6837\u770b\u6765\uff0c\u5b83\u4eec\u7684\u5173\u7cfb\u66f4\u50cf\u662f\u4e00\u79cd\u81f4\u656c\u3002\u00a0\u5173\u4e8e VEPA\/passthrough\/bridge\/private\u00a0IPVlan \u548c MACVlan \u4e3a\u4ec0\u4e48\u4f1a\u6709\u5404\u79cd\u6a21\u5f0f\u548c flag\uff0c\u6bd4\u5982 VEPA\uff0cprivate\uff0cpassthrough \u7b49\u7b49\uff1f\u5b83\u4eec\u7684\u533a\u522b\u5728\u54ea\u91cc\uff1f\u00a0\u5176\u5b9e\u5728\u5185\u6838\u7684\u5206\u6790\u4e2d\uff0c\u6211\u4eec\u5df2\u7ecf\u5927\u81f4\u4e86\u89e3\u4e86\u8fd9\u51e0\u79cd\u6a21\u5f0f\u7684\u8868\u73b0\uff0c\u5047\u5982\u4e3b\u8bbe\u5907\u662f\u4e00\u4e2a\u9489\u9489\u7fa4\uff0c\u6240\u6709\u7684\u7fa4\u53cb\u90fd\u53ef\u4ee5\u5411\u5916\u53d1\u6d88\u606f\uff0c\u90a3\u4e48\u5176\u5b9e\u51e0\u79cd\u6a21\u5f0f\u5c31\u975e\u5e38\u76f4\u89c2\uff1a\u00a0private \u6a21\u5f0f\uff0c\u7fa4\u53cb\u4eec\u76f8\u4e92\u4e4b\u95f4\u90fd\u662f\u7981\u8a00\u7684\uff0c\u65e2\u4e0d\u80fd\u5728\u7fa4\u5185\uff0c\u4e5f\u4e0d\u80fd\u5728\u7fa4\u5916\u3002bridge \u6a21\u5f0f\uff0c\u7fa4\u53cb\u4eec\u53ef\u4ee5\u5728\u7fa4\u5185\u6109\u5feb\u53d1\u8a00\u3002VEPA \u6a21\u5f0f\uff0c\u7fa4\u53cb\u4eec\u5728\u7fa4\u5185\u7981\u8a00\u4e86\uff0c\u4f46\u662f\u4f60\u4eec\u5728\u7fa4\u5916\u76f4\u63a5\u79c1\u804a\uff0c\u76f8\u5f53\u4e8e\u5e74\u4f1a\u62a2\u7ea2\u5305\u65f6\u671f\u7684\u96c6\u4f53\u7981\u8a00\u3002passthrough \u6a21\u5f0f\uff0c\u8fd9\u65f6\u5019\u4f60\u5c31\u662f\u7fa4\u4e3b\u4e86\uff0c\u9664\u4e86\u4f60\u6ca1\u4eba\u80fd\u53d1\u8a00\u3002\u00a0\u00a0\u90a3\u4e48\u4e3a\u4ec0\u4e48\u4f1a\u6709\u8fd9\u51e0\u79cd\u6a21\u5f0f\u5462\uff1f\u6211\u4eec\u4ece\u5185\u6838\u7684\u8868\u73b0\u6765\u770b\uff0c\u65e0\u8bba\u662f port\uff0c\u8fd8\u662f bridge\uff0c\u5176\u5b9e\u90fd\u662f\u7f51\u7edc\u7684\u6982\u5ff5\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u4ece\u4e00\u5f00\u59cb\uff0cLinux \u5c31\u5728\u52aa\u529b\u5c06\u81ea\u5df1\u8868\u73b0\u6210\u4e00\u4e2a\u5408\u683c\u7684\u7f51\u7edc\u8bbe\u5907\uff0c\u5bf9\u4e8e\u4e3b\u8bbe\u5907\uff0cLinux \u52aa\u529b\u5c06\u5b83\u505a\u6210\u4e00\u4e2a\u4ea4\u6362\u673a\uff0c\u5bf9\u4e8e\u5b50\u8bbe\u5907\uff0c\u90a3\u5c31\u662f\u4e00\u4e2a\u4e2a\u7f51\u7ebf\u80cc\u540e\u7684\u8bbe\u5907\uff0c\u8fd9\u6837\u770b\u8d77\u6765\u5c31\u5f88\u5408\u7406\u4e86\u3002\u00a0\u5b9e\u9645\u4e0a\u6b63\u662f\u8fd9\u6837\uff0c\u65e0\u8bba\u662f VEPA \u8fd8\u662f private\uff0c\u5b83\u4eec\u6700\u521d\u90fd\u662f\u7f51\u7edc\u6982\u5ff5\u3002\u5176\u5b9e\u4e0d\u6b62\u662f Linux\uff0c\u6211\u4eec\u89c1\u5230\u5f88\u591a\u81f4\u529b\u4e8e\u628a\u81ea\u5df1\u4f2a\u88c5\u6210\u7269\u7406\u7f51\u7edc\u7684\u9879\u76ee\uff0c\u90fd\u6cbf\u88ad\u4e86\u8fd9\u4e9b\u884c\u4e3a\u6a21\u5f0f\uff0c\u6bd4\u5982\u00a0OpenvSwitch[6]\u3002\u00a0MACVlan \u4e0e IPVlan \u7684\u5e94\u7528\u00a0IPVlan \u548c MACVlan \u7684\u4f18\u52bf\u5728\u54ea\u91cc\uff1f\u4f60\u5e94\u8be5\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u63a5\u89e6\u5230\uff0c\u4f7f\u7528\u5230\u5b83\u4eec\u5462\uff1f\u00a0\u5176\u5b9e\u5230\u8fd9\u91cc\uff0c\u624d\u5f00\u59cb\u8bf4\u5230\u672c\u7bc7\u6587\u7ae0\u7684\u521d\u8877\u3002\u6211\u4eec\u4ece\u7b2c\u4e8c\u4e2a\u95ee\u9898\u53d1\u73b0\uff0cIPVlan \u548c MACVlan \u90fd\u662f\u5728\u505a\u4e00\u4ef6\u4e8b\uff1a\u865a\u62df\u7f51\u7edc\u3002\u6211\u4eec\u4e3a\u4ec0\u4e48\u8981\u865a\u62df\u7f51\u7edc\u5462\uff1f\u8fd9\u4e2a\u95ee\u9898\u6709\u5f88\u591a\u7b54\u6848\uff0c\u4f46\u662f\u548c\u4e91\u8ba1\u7b97\u7684\u4ef7\u503c\u4e00\u6837\uff0c\u865a\u62df\u7f51\u7edc\u4f5c\u4e3a\u4e91\u8ba1\u7b97\u7684\u4e00\u9879\u57fa\u7840\u6280\u672f\uff0c\u5b83\u4eec\u6700\u7ec8\u90fd\u662f\u4e3a\u4e86\u8d44\u6e90\u5229\u7528\u6548\u7387\u7684\u63d0\u5347\u3002\u00a0MACVlan \u548c IPVlan \u5c31\u662f\u670d\u52a1\u4e86\u8fd9\u4e2a\u6700\u7ec8\u76ee\u7684\uff0c\u571f\u8c6a\u4eec\u4e00\u53f0\u7269\u7406\u673a\u8dd1\u4e00\u4e2a helloworld \u7684\u65f6\u4ee3\u4f9d\u7136\u8fc7\u53bb\uff0c\u4ece\u865a\u62df\u5316\u5230\u5bb9\u5668\u5316\uff0c\u65f6\u4ee3\u5bf9\u7f51\u7edc\u5bc6\u5ea6\u63d0\u51fa\u4e86\u8d8a\u6765\u8d8a\u9ad8\u7684\u8981\u6c42\uff0c\u4f34\u968f\u7740\u5bb9\u5668\u6280\u672f\u7684\u8bde\u751f\uff0c\u9996\u5148\u662f veth \u8d70\u4e0a\u821e\u53f0\uff0c\u4f46\u662f\u5bc6\u5ea6\u591f\u4e86\uff0c\u8fd8\u8981\u6027\u80fd\u7684\u9ad8\u6548\uff0cMACVlan \u548c IPVlan \u901a\u8fc7\u5b50\u8bbe\u5907\u63d0\u5347\u5bc6\u5ea6\u5e76\u4fdd\u8bc1\u9ad8\u6548\u7684\u65b9\u5f0f\u5e94\u8fd0\u800c\u751f\uff08\u5f53\u7136\u8fd8\u6709\u6211\u4eec\u7684 ENI-Trunking\uff09\u3002\u00a0\u8bf4\u5230\u8fd9\u91cc\uff0c\u5c31\u8981\u4e3a\u5927\u5bb6\u63a8\u8350\u4e00\u4e0b\u963f\u91cc\u4e91\u5bb9\u5668\u670d\u52a1 ACK \u7ed9\u5927\u5bb6\u5e26\u6765\u7684\u9ad8\u6027\u80fd\u3001\u9ad8\u5bc6\u5ea6\u7684\u7f51\u7edc\u65b0\u65b9\u6848\u2014\u2014IPVlan \u65b9\u6848[7]\uff01\u00a0ACK \u57fa\u4e8e Terway \u63d2\u4ef6\uff0c\u5b9e\u73b0\u4e86\u57fa\u4e8e IPVlan \u7684 K8s \u7f51\u7edc\u89e3\u51b3\u65b9\u6848\u3002Terway \u7f51\u7edc\u63d2\u4ef6\u662f ACK \u81ea\u7814\u7684\u7f51\u7edc\u63d2\u4ef6\uff0c\u5c06\u539f\u751f\u7684\u5f39\u6027\u7f51\u5361\u5206\u914d\u7ed9 Pod \u5b9e\u73b0 Pod \u7f51\u7edc\uff0c\u652f\u6301\u57fa\u4e8e Kubernetes \u6807\u51c6\u7684\u7f51\u7edc\u7b56\u7565\uff08Network Policy\uff09\u6765\u5b9a\u4e49\u5bb9\u5668\u95f4\u7684\u8bbf\u95ee\u7b56\u7565\uff0c\u5e76\u517c\u5bb9 Calico \u7684\u7f51\u7edc\u7b56\u7565\u3002\u00a0\u5728 Terway \u7f51\u7edc\u63d2\u4ef6\u4e2d\uff0c\u6bcf\u4e2a Pod \u90fd\u62e5\u6709\u81ea\u5df1\u7f51\u7edc\u6808\u548cIP\u5730\u5740\u3002\u540c\u4e00\u53f0 ECS \u5185\u7684 Pod \u4e4b\u95f4\u901a\u4fe1\uff0c\u76f4\u63a5\u901a\u8fc7\u673a\u5668\u5185\u90e8\u7684\u8f6c\u53d1\uff0c\u8de8 ECS \u7684 Pod \u901a\u4fe1\u3001\u62a5\u6587\u901a\u8fc7 VPC \u7684\u5f39\u6027\u7f51\u5361\u76f4\u63a5\u8f6c\u53d1\u3002\u7531\u4e8e\u4e0d\u9700\u8981\u4f7f\u7528 VxLAN \u7b49\u7684\u96a7\u9053\u6280\u672f\u5c01\u88c5\u62a5\u6587\uff0c\u56e0\u6b64 Terway \u6a21\u5f0f\u7f51\u7edc\u5177\u6709\u8f83\u9ad8\u7684\u901a\u4fe1\u6027\u80fd\u3002Terway \u7684\u7f51\u7edc\u6a21\u5f0f\u5982\u4e0b\u56fe\u6240\u793a\uff1a<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412366\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a0<br \/><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042412367\" alt=\"\u56fe\u7247\" title=\"\u56fe\u7247\" loading=\"lazy\"><br \/>\u00a0\u5ba2\u6237\u5728\u4f7f\u7528 ACK \u521b\u5efa\u96c6\u7fa4\u65f6\uff0c\u5982\u679c\u9009\u62e9 Terway \u7f51\u7edc\u63d2\u4ef6\uff0c\u53ef\u4ee5\u914d\u7f6e\u5176\u4f7f\u7528 Terway IPvlan \u6a21\u5f0f\u3002Terway IPvlan \u6a21\u5f0f\u91c7\u7528 IPvlan \u865a\u62df\u5316\u548c eBPF \u5185\u6838\u6280\u672f\u5b9e\u73b0\u9ad8\u6027\u80fd\u7684 Pod \u548c Service \u7f51\u7edc\u3002\u00a0\u4e0d\u540c\u4e8e\u9ed8\u8ba4\u7684 Terway \u7684\u7f51\u7edc\u6a21\u5f0f\uff0cIPvlan \u6a21\u5f0f\u4e3b\u8981\u5728 Pod \u7f51\u7edc\u3001Service\u3001\u7f51\u7edc\u7b56\u7565\uff08NetworkPolicy\uff09\u505a\u4e86\u6027\u80fd\u7684\u4f18\u5316\uff1a\u00a0Pod \u7684\u7f51\u7edc\u76f4\u63a5\u901a\u8fc7 ENI \u7f51\u5361\u7684 IPvlan L2 \u7684\u5b50\u63a5\u53e3\u5b9e\u73b0\uff0c\u5927\u5927\u7b80\u5316\u4e86\u7f51\u7edc\u5728\u5bbf\u4e3b\u673a\u4e0a\u7684\u8f6c\u53d1\u6d41\u7a0b\uff0c\u8ba9 Pod \u7684\u7f51\u7edc\u6027\u80fd\u51e0\u4e4e\u4e0e\u5bbf\u4e3b\u673a\u7684\u6027\u80fd\u65e0\u5f02\uff0c\u5ef6\u8fdf\u76f8\u5bf9\u4f20\u7edf\u6a21\u5f0f\u964d\u4f4e 30%\u3002\u00a0\u00a0Service \u7684\u7f51\u7edc\u91c7\u7528 eBPF \u66ff\u6362\u539f\u6709\u7684 kube-proxy \u6a21\u5f0f\uff0c\u4e0d\u9700\u8981\u7ecf\u8fc7\u5bbf\u4e3b\u673a\u4e0a\u7684 iptables \u6216\u8005 IPVS \u8f6c\u53d1\uff0c\u5728\u5927\u89c4\u6a21\u96c6\u7fa4\u4e2d\u6027\u80fd\u51e0\u4e4e\u65e0\u964d\u4f4e\uff0c\u6269\u5c55\u6027\u66f4\u4f18\u3002\u5728\u5927\u91cf\u65b0\u5efa\u8fde\u63a5\u548c\u7aef\u53e3\u590d\u7528\u573a\u666f\u8bf7\u6c42\u5ef6\u8fdf\u6bd4 IPVS \u548c iptables \u6a21\u5f0f\u7684\u5927\u5e45\u964d\u4f4e\u3002\u00a0\u00a0Pod \u7684\u7f51\u7edc\u7b56\u7565\uff08NetworkPolicy\uff09\u4e5f\u91c7\u7528 eBPF \u66ff\u6362\u6389\u539f\u6709\u7684 iptables \u7684\u5b9e\u73b0\uff0c\u4e0d\u9700\u8981\u5728\u5bbf\u4e3b\u673a\u4e0a\u4ea7\u751f\u5927\u91cf\u7684 iptables \u89c4\u5219\uff0c\u8ba9\u7f51\u7edc\u7b56\u7565\u5bf9\u7f51\u7edc\u6027\u80fd\u7684\u5f71\u54cd\u964d\u5230\u6700\u4f4e\u3002\u00a0\u00a0\u6240\u4ee5\uff0c\u5229\u7528 IPVlan \u4e3a\u6bcf\u4e2a\u4e1a\u52a1 pod \u5206\u914d IPVlan \u7f51\u5361\uff0c\u65e2\u4fdd\u8bc1\u4e86\u7f51\u7edc\u7684\u5bc6\u5ea6\uff0c\u4e5f\u4f7f\u4f20\u7edf\u7f51\u7edc\u7684 Veth \u65b9\u6848\u5b9e\u73b0\u5de8\u5927\u7684\u6027\u80fd\u63d0\u5347\uff08\u8be6\u89c1\u53c2\u8003\u94fe\u63a5 7\uff09\u3002\u540c\u65f6\uff0cTerway IPvlan \u6a21\u5f0f\u63d0\u4f9b\u4e86\u9ad8\u6027\u80fd\u7684 Service \u89e3\u51b3\u65b9\u6848\uff0c\u57fa\u4e8e eBPF \u6280\u672f\uff0c\u6211\u4eec\u89c4\u907f\u4e86\u8bdf\u75c5\u5df2\u4e45\u7684 Conntrack \u6027\u80fd\u95ee\u9898\u3002\u00a0\u76f8\u4fe1\u65e0\u8bba\u662f\u4ec0\u4e48\u573a\u666f\u7684\u4e1a\u52a1\uff0cACK with IPVlan \u90fd\u662f\u4e00\u4e2a\u66f4\u4e3a\u51fa\u8272\u7684\u9009\u62e9\u3002\u00a0\u6700\u540e\u611f\u8c22\u4f60\u80fd\u9605\u8bfb\u5230\u8fd9\u91cc\uff0c\u5728\u8fd9\u4e2a\u95ee\u9898\u80cc\u540e\uff0c\u5176\u5b9e\u9690\u85cf\u4e86\u4e00\u4e2a\u95ee\u9898\uff0c\u4f60\u77e5\u9053\u4e3a\u4ec0\u4e48\u6211\u4eec\u9009\u62e9 IPVlan\uff0c\u800c\u6ca1\u6709\u9009\u62e9 MACVlan \u4e48\uff1f\u5982\u679c\u4f60\u5bf9\u865a\u62df\u7f51\u7edc\u6280\u672f\u6709\u4e86\u89e3\uff0c\u90a3\u4e48\u7ed3\u5408\u4e0a\u8ff0\u7684\u5185\u5bb9\uff0c\u4f60\u5e94\u8be5\u5f88\u5feb\u5c31\u6709\u7b54\u6848\u4e86\uff0c\u4e5f\u6b22\u8fce\u4f60\u5728\u8bc4\u8bba\u533a\u7559\u8a00\u3002\u00a0\u53c2\u8003\u94fe\u63a5\uff1a\u00a0[1]\u00a0\u300a\u5173\u4e8e IEEE 802.1Q\u300b<a href=\"https:\/\/link.segmentfault.com\/?enc=6vpL4MQ4%2FBI9oUlsZkpjiA%3D%3D.ehmugaIqS6%2FKT5kgzDatD7VB56QUnnhkhLkpbPtkzMx9lbn6oSVz7tAm9gkrS8f3\" rel=\"nofollow\">https:\/\/zh.wikipedia.org\/wiki&#8230;<\/a>\u00a0[2] \u300aDocker Engine release notes\u300b<a href=\"https:\/\/link.segmentfault.com\/?enc=aS%2Bex32cU7asYHxpRol%2BvA%3D%3D.QxVfyiWLBmHtK35DVmz1ownEGlBJgzn%2BYiL1x%2BGJX5KofCkAqZpFvdThCDgNdt5SrBaUs5H8GRJr0E3AmD6hlw%3D%3D\" rel=\"nofollow\">https:\/\/docs.docker.com\/engin&#8230;<\/a>\u00a0[3] \u300aMerged for MACVlan 2.6.23\u300b<a href=\"https:\/\/link.segmentfault.com\/?enc=q50dge%2BiHXcBOrLlVknFnA%3D%3D.bNj3pHzzIwwyJebpluwYgODGtg2yY0bLsM%2B37%2FfkTZn610tsfGnksOlKHH2wwbzH\" rel=\"nofollow\">https:\/\/lwn.net\/Articles\/241915\/<\/a>\u00a0[4] \u300aMACVlan 3.19 Merge window part 2\u300b<a href=\"https:\/\/link.segmentfault.com\/?enc=RW82o7KJOxgR%2Fy0B7WwEIw%3D%3D.wcJaWHzbZDf2BGtvjb8AMQ6ySil7TPfI2pq9rAqfI%2FZGDVzb%2FvjvyVHXJ84tVRWJ\" rel=\"nofollow\">https:\/\/lwn.net\/Articles\/626150\/<\/a>\u00a0[5] \u300aVLan 2.6.10-rc2 long-format changelog\u300b<a href=\"https:\/\/link.segmentfault.com\/?enc=l%2BnMCcTg3RrDRyd0nmlugA%3D%3D.LlspsF%2BHjyjYGa4jXU2V%2FQ3yfMkgM6JwYzr6UJQqBWW8ByorWuC2iiiMFTnqg%2Fzn\" rel=\"nofollow\">https:\/\/lwn.net\/Articles\/111033\/<\/a>\u00a0[6] \u300a[ovs-dev] VEPA support in OVS\u300b<a href=\"https:\/\/link.segmentfault.com\/?enc=V0E02Wjt3kmfTVAW6NYVLQ%3D%3D.Su9vrEJD%2FJ8%2Bt28tZG5WN5U6JMaLKOd7GKRf1Na6B%2FvSUmiHx0zodFdbLvt2QYfa5KyXM8D4Vkl3tAg8VG%2B3X%2FOAyjLJ5sFFohyp9En6hTo%3D\" rel=\"nofollow\">https:\/\/mail.openvswitch.org\/&#8230;<\/a>\u00a0[7] \u300a\u963f\u91cc\u4e91 Kubernetes \u96c6\u7fa4\u4f7f\u7528 IPVlan \u52a0\u901f Pod \u7f51\u7edc\u300b<a href=\"https:\/\/link.segmentfault.com\/?enc=4gPd2ynSA6Z5Ww4PnXNthQ%3D%3D.9%2B03FZD%2Fk0RtH5ROyUZ5%2BM1aotLzz%2F2fwCMJXBIWffLy3dWQq%2F%2BwpCQsm7bDCRcL\" rel=\"nofollow\">https:\/\/developer.aliyun.com\/&#8230;<\/a>\u00a0\u70b9\u51fb\u6b64\u5904\uff0c\u4e86\u89e3\u57fa\u4e8e\u963f\u91cc\u4e91 \u00a0ACK \u00a0Terway \u7684 IPvlan\u3002\u539f\u6587\u94fe\u63a5\uff1a<a href=\"https:\/\/link.segmentfault.com\/?enc=gZzb9a9DUv7u8Q6isOIdfQ%3D%3D.NNXju1W5UDag6PC8Wum3BNru2RPCTEFH9jfGjypw9ylo2WTzJAJV%2FurtMixXOgzX\" rel=\"nofollow\">https:\/\/click.aliyun.com\/m\/10&#8230;<\/a>\u672c\u6587\u4e3a\u963f\u91cc\u4e91\u539f\u521b\u5185\u5bb9\uff0c\u672a\u7ecf\u5141\u8bb8\u4e0d\u5f97\u8f6c\u8f7d\u3002<\/li>\n<\/ol>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000042412349\">https:\/\/segmentfault.com\/a\/1190000042412349<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b80\u4ecb\uff1a\u00a0\u7531\u4e8e\u8fd9\u7bc7\u6587\u7ae0\u771f\u7684\u5f88\u957f\uff0c\u5927\u91cf\u7684\u7bc7\u5e45\u5728\u8bb2\u8ff0\u5185\u6838\u7684\u5b9e\u73b0\uff0c\u5982\u679c\u4f60\u5bf9\u8fd9\u90e8\u5206\u4e0d\u611f\u5174\u8da3\uff0c\u90a3\u4e48\u5728\u5efa\u8bae\u4f60\u5728\u770b\u5b8c\u7b2c\u4e00\u90e8\u5206\u7684 [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-10006362","post","type-post","status-publish","format-standard","hentry"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10006362","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10006362"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10006362\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10006362"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10006362"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10006362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}