上一篇里面,我们讲述了DMA的过程,本文里面,我们讲述virtio报文的格式和处理工作。
virtio 报文如下图所示
除了我们常见的报文头 + 报文载荷以外(蓝色部分),以网络为例,还会增加一个virtio_net_hdr,这个virtio_net_hdr 主要用在virtio前后端传输使用,前端用这个头告诉后端一些信息,如buffer数量,特殊卸载过程、参数等等,这些都可以是自定义的。所以我们在代码里面会看到,在报文的头部会追加virtio_net_hdr。virtio_net_hdr 在DPDK的实现里面,可以放在一个新的mbuf中,也可以放在报文的mbuf中,通过can_push参数进行控制。
既然 virtio_net_hdr 主要用在virtio前后端传输使用,就只会在前后端之间存在,在前后端的终点进行终结。下图提现了报文的处理过程
从做往右看,
左侧:IP stack 发出标准的报文,前端驱动会在保准报文前面追加 virtio_net_hdr,然后从前端送往后端。后端可以是软件实现,硬件实现,也可以是软硬件结合的实现,所以对应的virtio_net_hdr可以在软件剥离或硬件剥离,具体实现依赖于厂商决定。剥离了virtio_net_hdr后,报文送往MAC,发送到NETWORK上。
右侧:MAC收到报文,按照和左边对应的方式,由软件或硬件添加virtio_net_hdr报文头并填充响应的处理信息,哪个进行添加依赖于厂商定义,然后送往前端驱动中,前端驱动处理了virtio_net_hdr后,进行剥离,最后标准报文送往IP 协议栈,完成处理。
另外,我们可以看到,后端使用virtio_net_hdr就足以处理转发的报文,也就是处理不需要送往guest OS的转发报文。
好了,今天先到这里,谢谢观看
参考文档: