虚拟网卡驱动学习记录

简介: 虚拟网卡驱动学习记录

字符设备
读写的效率比较低,主要关注数据流转和实时性。
驱动程序,会注册file_operation函数,有相应的read write函数
块设备
是以固定大小的块(一般为512字节或4KB)进行读写的设备,例如硬盘、SSD等。它们通常需要进行缓存和寻址,能够支持随机访问,并且提供了更高层次的抽象,如文件系统。侧重于缓存管理、数据组织与文件系统交互等。

怎么写虚拟网卡驱动程序?

1. 分配一个net_device结构体

    static struct net_device *vnet_dev;
    vnet_dev = alloc_netdev(0, "vnet%d", ether_setup);

2. 设置:

2.1 发包函数: hard_start_xmit

    vnet_dev->hard_start_xmit = virtual_net_send_packet;

2.2 收到数据时(在中断处理函数里)用netif_rx上报数据
2.3 其他设置,设置MAC地址等

    vnet_dev->dev_addr[0] = 0x00;
    vnet_dev->dev_addr[1] = 0xFF;
    vnet_dev->dev_addr[2] = 0x52;
    vnet_dev->dev_addr[3] = 0xDC;
    vnet_dev->dev_addr[4] = 0xAB;
    vnet_dev->dev_addr[5] = 0xD6;
    vnet_dev->flags           |= IFF_NOARP;
    vnet_dev->features        |= NETIF_F_NO_CSUM;

3. 注册

register_netdev(vnet_dev);

部分源码

static void virtual_rx_packet(struct sk_buff *skb, struct net_device *dev)
{
       
    unsigned char *type;
    struct iphdr *ih;
    __be32 *saddr, *daddr, tmp;
    unsigned char    tmp_dev_addr[ETH_ALEN];
    struct ethhdr *ethhdr;

    struct sk_buff *rx_skb;

    // 从硬件读出/保存数据
    /* 对调"源/目的"的mac地址 */
    ethhdr = (struct ethhdr *)skb->data;
    memcpy(tmp_dev_addr, ethhdr->h_dest, ETH_ALEN);
    memcpy(ethhdr->h_dest, ethhdr->h_source, ETH_ALEN);
    memcpy(ethhdr->h_source, tmp_dev_addr, ETH_ALEN);

    /* 对调"源/目的"的ip地址 */    
    ih = (struct iphdr *)(skb->data + sizeof(struct ethhdr));
    saddr = &ih->saddr;
    daddr = &ih->daddr;

    tmp = *saddr;
    *saddr = *daddr;
    *daddr = tmp;    
    type = skb->data + sizeof(struct ethhdr) + sizeof(struct iphdr);    
    *type = 0; /* 0表示reply */

    ih->check = 0;           /* and rebuild the checksum (ip needs it) */
    ih->check = ip_fast_csum((unsigned char *)ih,ih->ihl);

    // 构造一个sk_buff, 目的是把收到的数据同时又发出去,用来测试ping命令,因为ping自己网卡的IP,不涉及到发包,其它的IP会就会涉及到发包。
    rx_skb = dev_alloc_skb(skb->len + 2);
    skb_reserve(rx_skb, 2); /* align IP on 16B boundary */    
    memcpy(skb_put(rx_skb, skb->len), skb->data, skb->len);

    /* Write metadata, and then pass to the receive level */
    rx_skb->dev = dev;
    rx_skb->protocol = eth_type_trans(rx_skb, dev);
    rx_skb->ip_summed = CHECKSUM_UNNECESSARY; /* don't check it */
    dev->stats.rx_packets++;
    dev->stats.rx_bytes += skb->len;
    netif_rx(rx_skb);
}

static int virtual_net_send_packet(struct sk_buff *skb, struct net_device *dev)
{
   
    static int cnt = 0;
    printk("virt_net_send_packet cnt = %d\n", ++cnt);

    /* 对于真实的网卡, 把skb里的数据通过网卡发送出去 */
    netif_stop_queue(dev); /* 停止该网卡的队列 */
    /* ...... */           /* 把skb的数据写入网卡 */

    /* 构造一个虚拟的sk_buff,上报 */
    virtual_rx_packet(skb, dev);

    dev_kfree_skb (skb);   /* 释放skb */
    netif_wake_queue(dev); /* 数据全部发送出去后,唤醒网卡的队列 */

    /* 更新统计信息 */
    dev->stats.tx_packets++;
    dev->stats.tx_bytes += skb->len;

    return 0;
}

缺陷

发送skbuf部分,如果真实网卡,会相应的一系列寄存器的操作,才能把数据发出去。

相关文章
|
存储 缓存 固态存储
存储性能软件加速库(SPDK)
存储性能软件加速库(SPDK)
|
编译器 API 数据安全/隐私保护
深入对比:Qt 的 QFile/QFileInfo 和与 C++17 Filesystem 和标准文件流 的细节剖析
深入对比:Qt 的 QFile/QFileInfo 和与 C++17 Filesystem 和标准文件流 的细节剖析
1068 3
|
Linux 虚拟化 云计算
虚拟化技术及实时虚拟化概述
本文探讨了实时虚拟化技术,它是虚拟化技术的一种,旨在保证严格的时间约束和高可靠性。文章介绍了虚拟化的起源、分时系统的历史以及虚拟化技术在云计算时代的复兴。内容涵盖分时系统、虚拟化技术的定义、类型(全虚拟化、半虚拟化、硬件辅助完全虚拟化和操作系统级虚拟化)及其优缺点。此外,还讨论了不同类型虚拟化技术的实现方式,如Type-1和Type-2虚拟化,以及容器技术。文章强调了实时虚拟化在工业实时控制、汽车、通信等领域的应用,并预告后续将重点讨论实时虚拟化技术。
972 0
虚拟化技术及实时虚拟化概述
|
数据采集 运维 监控
DataphinV4.0来啦:自定义全局角色 ,实时研发覆盖全部署场景,个性化企业配置看本期
本次V4.0版本升级,Dataphin支持自定义全局角色、自定义逻辑表命名规范、Flink on K8s的部署模式,提升企业级适配能力,灵活匹配企业特色;将集成任务快速从组件模式切换为脚本模式、支持外部触发类型节点等,提升研发平台易用性,助力高效开发便捷运维。
91518 1
|
固态存储 网络协议 Linux
SPDK NVMe-oF Target
SPDK NVMe-oF Target
SPDK NVMe-oF Target
|
XML JSON 测试技术
如何用好Postman中的变量?
如何用好Postman中的变量?
155 0
|
存储 固态存储 Linux
开启全新存储时代:SPDK文件系统项目实战指南
开启全新存储时代:SPDK文件系统项目实战指南
|
NoSQL Unix Linux
Linux下gdb调试生成core文件并调试core文件
Linux下gdb调试生成core文件并调试core文件
2726 1
Linux下gdb调试生成core文件并调试core文件
|
网络协议 Cloud Native 关系型数据库
【云原生 | 从零开始学Docker】六、如何写出自己的镜像——Docker file
在上一篇文章中其实有一个点我没有说,那就是如何实现两个或者多个容器之间数据共享。
445 0
【云原生 | 从零开始学Docker】六、如何写出自己的镜像——Docker file
|
消息中间件 弹性计算 JSON
抢占式实例接收中断消息指南
抢占式实例在提供低至1折的极大优惠之外, 同时带来了实例有可能被中断之痛. 本文总结了几种方式, 方便您感知中断信息, 缓解中断影响。
抢占式实例接收中断消息指南

热门文章

最新文章