代码版本:QEMU git release v2.8

x86_64-softmmu/qemu-system-x86_64 -enable-kvm -M q35 -m 256 -smp 1 -drive file=/workspace/kvm_auto_test/kvm_test.qcow2,format=qcow2 -netdev tap,fd=26,id=hostnet0 -device e1000,netdev=hostnet0,id=net0,mac=52:54:00:f1:ec:ba,bus=pcie.0

e1000_class_init是网络设备初始化的源头,然后看pci_e1000_realize,

对于e1000_write_config,除了基本的PCI规范

e1000_mmio_write和e1000_mmio_read都是分别调用macreg_writeops和macreg_readops而已

macreg_writeops顾名思义的就是针对于各个写reg的处理,挨着看

mac_reg也本身是数组分配好的事情。

set_dlen,set_mdic也是mac赋值而已,

set_mdic会配置s->phy_reg[addr] = data,同时通过set_ics发送虚拟中断

set_16bit,set_rdt,set_imc,set_ims,set_icr都是mac设置后最多在加一个中断。

set_rx_control配置接收缓存,负责使用qemu_flush_queued_packets刷新队列中的package。

最终看一下set_tctl函数,

start_xmit负责发包

process_tx_desc中开始拼装网络包

xmit_seg继续组装IP协议头部,使用e1000_send_packet进行发包

最终使用tap_receive进行发包,其实就是len = writev(s->fd, iov, iovcnt)向/dev/net/tun进行写入。

在tap_update_fd_handler下,当tun收包可读时,调用tap_send。

qemu_send_packet_async_with_flags继续调用qemu_net_queue_send

在qemu_net_client_setup下有

而在qemu_deliver_packet_iov下,

调用nc->info->receive_iov(nc, iov, iovcnt),即net_e1000_info下的e1000_receive_iov。


QEMU虚拟网络E1000源代码分析来自于OenHan

链接为:oenhan.comhttp://oenhan.com/qemu-virtual-network-e1000

发表评论