QEMU网络虚拟化(一):qemu-net 初始化

本文深入剖析QEMU网络初始化流程,从main函数开始,详细解读网络设备和tap接口的创建过程,包括命令行参数解析、网络设备初始化、tap设备打开及NetClientState结构关联。通过实例说明nic和tap如何建立互为peer的关系。

qemu-net 初始化

初始化流程

main() – vl.c 主函数
 | -> net_client_parse : 解析网络部分命令行参数 QemuOptsList -> QemuOpts -> QemuOpt对应具体键值对
 net_init_clients – net.c : 初始化网络部分,可能存在多个netdev,依次初始化
  -> net_init_client/net_init_netdev -> net_client_init -> net_client_init1 – net.c
​   -> net_client_init_fun [netdev->type] (netdev, name, peer, errp) – net.c
    -> net_init_tap – tap.c
     -> net_tap_init – tap.c
      | -> tap_open – tap-linux.c : 会打开/dev/net/tun字符设备,获取文件描述符
      net_init_tap_one – tap.c
       -> net_tap_fd_init – tap.c : 会创建tap口对应的NetClientState的结构
        -> tap_read_poll – tap.c
         -> tap_update_fd_handler – tap.c
          -> qemu_set_fd_handler – iohandler.c
           |-> iohandler_init ->aio_context_new -> g_source_new
​           aio_set_fd_handler : 找到iohandler_ctx中对应AioHander节点赋值io_read和io_write
            -> g_source_add_poll : fd会被加入到source(事件源iohandler_ctx)中,并添加到默认contex中

【g_source_new会关联aio_source_funcs 到GSource的接口函数(prepare,check,dispatch, finalize )】

数据结构

handler结构关系:
在这里插入图片描述

aio_source_funcs 定义

static GSourceFuncs aio_source_funcs = {
   
   
    			aio_ctx_prepare,
    			aio_ctx_check,
    			aio_ctx_dispatch,
    			aio_ctx_finalize
			};

NetClientState定义(逻辑连接点,nic、tap 、hub等都有该结构体):

struct NetClientState {
   
   
    NetClientInfo *info;
    int link_down;
    QTAILQ_ENTRY(NetClientState) next;
    NetClientState *peer; /* 指向对端逻辑节点,例如创建了virt-net nic网络接口,该指针会指向对端tap对应的NetClientState,同理,对端也会指向本结构体 */
    NetQueue *incoming_queue; /* 队列收包相关的 */ 
    char *model;
    char *name;
    char info_str[256];
    unsigned receive_disabled : 1;
    NetClientDestructor *destructor;
    unsigned int queue_index;
    unsigned rxfilter_notify_enabled:1;
    int vring_enable;
    int vnet_hdr_len;
    QTAILQ_HEAD(, NetFilterState) filters;
};

net_tap_fd_init / net_hub_port_new -> qemu_new_net_client -> qemu_net_client_setup -> QTAILQ_INSERT_TAIL(&net_clients, nc, next)
qemu_new_nic -> qemu_net_client_setup -> QTAILQ_INSERT_TAIL(&net_clients, nc, next)
系统会维护一个net_clients全局列表,存放所有的NetClientState单元

nic和tap的关联

命令行假设如下:

-netdev tap,id=hostnet0,ifname=vnet2,downscript=no,queues=4
-device virtio-net-pci,
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值