历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2018年10月12日 | Tiny210驱动之虚拟网卡驱动

发布者:闪耀的星空 来源: eefocus关键字:Tiny210驱动  虚拟网卡  驱动 手机看文章 扫描二维码
随时随地手机看文章

virt_net.c驱动:

// 参考 drivers\net\cs89x0.c

 

#include "linux/module.h"

#include "linux/errno.h"

#include "linux/netdevice.h"

#include "linux/etherdevice.h"

#include "linux/kernel.h"

#include "linux/types.h"

#include "linux/fcntl.h"

#include "linux/interrupt.h"

#include "linux/ioport.h"

#include "linux/in.h"

#include "linux/skbuff.h"

#include "linux/slab.h"

#include "linux/spinlock.h"

#include "linux/string.h"

#include "linux/init.h"

#include "linux/bitops.h"

#include "linux/delay.h"

#include "linux/ip.h"

#include "asm/system.h"

#include "asm/io.h"

#include "asm/irq.h"

static struct net_device *vnet_dev;

static void emulator_rx_packet(struct sk_buff *skb, struct net_device *dev)

{

    // 参考LDD3 

    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;

    

    //((u8 *)saddr)[2] ^= 1; // change the third octet (class C) 

    //((u8 *)daddr)[2] ^= 1;

    type = skb->data + sizeof(struct ethhdr) + sizeof(struct iphdr);

    //printk("tx package type = x\n", *type);

    // 修改类型, 原来0x8表示ping

    *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

    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;

    // 提交sk_buff

    netif_rx(rx_skb);

}

static int virt_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,上报 

    emulator_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;

}

static const struct net_device_ops virt_netdev_ops = {

    .ndo_start_xmit = virt_net_send_packet,

};

static int virt_net_init(void)

{

    // 1. 分配一个net_device结构体 

    vnet_dev = alloc_netdev(0, "vnet%d", ether_setup);  // alloc_etherdev 

    // 2. 设置 

    vnet_dev->netdev_ops    = &virt_netdev_ops;

    // 设置MAC地址 

    vnet_dev->dev_addr[0] = 0x08;

    vnet_dev->dev_addr[1] = 0x89;

    vnet_dev->dev_addr[2] = 0x89;

    vnet_dev->dev_addr[3] = 0x89;

    vnet_dev->dev_addr[4] = 0x89;

    vnet_dev->dev_addr[5] = 0x11;

    // 设置下面两项才能ping通 

    vnet_dev->flags           |= IFF_NOARP;

    vnet_dev->features        |= NETIF_F_NO_CSUM;    

    // 3. 注册 

    //register_netdevice(vnet_dev);

    register_netdev(vnet_dev);

    

    return 0;

}

static void virt_net_exit(void)

{

    unregister_netdev(vnet_dev);

    free_netdev(vnet_dev);

}

module_init(virt_net_init);

module_exit(virt_net_exit);

MODULE_AUTHOR("thisway.diy@163.com,17653039@qq.com");

MODULE_LICENSE("GPL");


关键字:Tiny210驱动  虚拟网卡  驱动 引用地址:Tiny210驱动之虚拟网卡驱动

上一篇:Tiny210 IIC驱动之at24cxx访问
下一篇:Tiny210驱动之NAND_FLASH驱动程序

推荐阅读

start.S文件:.globl _start_start:1、硬件相关的设置:把外设的基地址告诉CPU 0 ~ 0x6fff ffff为内存的地址空间,0x7000 0000 ~ 0x7fff ffff为外设寄存器的地址空间 ldr r0, =0x70000000 orr r0, r0, #0x13 mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff) 2、关看门狗 ,往WTCON(0x7E004000)写0 ldr r...
随着自动化需求的持续释放,机器人产业发展正在步入加速阶段,我国机器人市场已成为全球火热的竞争风口之一。在通往自动智能生产的道路上,传统机器人企业、科技巨头、机械厂商和初创企业纷纷入场。据不完全统计,在2019年8月,国内机器人领域融资事件也发生了不下二十余起,有新创企业收获种子轮融资,开启新征程;也有老牌企业获得新一轮融资,深化发展...
2020年第一季度,中国彩电市场销售规模创下至2016年以来单季度最低值,在行业艰难时期,激光电视仍保持增长态势不变,行业发展迅速。行业低迷,液晶电视陷入价格战泥潭近年来,中国彩电市场规模持续负增长,在疫情影响下,市场更是雪上加霜,据奥维云网监测数据显示,2020年第一季度,中国彩电零售量为996万台,同比下降20.1%;零售额达238亿元,同比下降3...
左蓝微电子亮相国际电子展:国产射频滤波器展现技术硬实力5G与物联网的发展带来了射频前端器件需求不断上升。然而,在全球半导体产能紧缺和中美贸易摩擦背景下,“缺芯涨价”状况愈演愈烈,如何在艰难时期保证企业正常运转、维持产品供给,是中国企业不得不思考的问题。对关键器件自主可控日益重视的国内终端厂商与本土射频器件供应商的合作意愿日渐强烈。...

史海拾趣

问答坊 | AI 解惑

机器视觉检测在电子接插件制造工业中的应用

】电子插接件的生产具有产量大、效率高和产品质量要求严格的特点,而日臻成熟的机器视觉检测技术极为适合其制造质量的在线检测。文中介绍了应用机器视觉检测技术对电子接插元件制造质量进行在线检测的过程,并以其冲压阶段中典型质量缺陷的检测为例阐 ...…

查看全部问答∨

LM324集成四运算放大器的应用

LM324是四运放集成电路,它采用14脚双列直插塑料封装,外形如图所示。它的内部包含四组形式完全相同的运算放大器,除电源共用外,四组运放相互独 立。每一组运算放大器可用图1所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端, ...…

查看全部问答∨

数字电压表

1.实验任务   利用单片机AT89S51与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。 2.电路原理图                  图1.28.1 3.系统板上硬件连线 a)把“单片 ...…

查看全部问答∨

单片机控制真彩色液晶显示方案PVA050-256

名称: 单片机显示终端 型号: PVA050-256 平望显示控制产品核心电路采用ALTERA公司的大规模可编程集成电路(FPGA) EPM3128 编程实现,性能稳定可靠。 适配于cpu:51、96、X86、8088、Z80、DSP等,采用ALTERA公司大规模可编程集成电路( FPGA ) EP ...…

查看全部问答∨

我编了一个交通灯的程序,没法验证请高手看一下是否正确

50S 5S 70S 5S …… 东西道 红灯R1亮 黄灯Y1亮 绿灯G1亮 黄灯Y1亮 …… 南北道 绿灯G2亮 黄灯Y2亮 红灯R2亮 黄灯Y2亮 …… #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit R1=P2^0 ...…

查看全部问答∨

好心人

好心的大哥大姐,谁能传一份关于电子的毕业论文呀!只要是有关电子的都行。感谢了!…

查看全部问答∨

16位的屏幕,直接写屏为什么颜色会变掉?

在ce系统中,屏幕是16位的,我创建了一个dib section:         BITMAPINFO bi={0};         bi.bmiHeader.biSize=sizeof(bi.bmiHeader);         bi.bmiHeader.biWidth=320; &nb ...…

查看全部问答∨

sst51(8位)单片机,4段数码管显示,在keil中可以编译,但不能调试,显示disassembly windows

下面是我的程序,挺简单的,本来不应该有问题,但调试时却总出现disassembly窗口。 在附件里,有我的单片机开发板。 先谢谢大家了!!! DBUFF        EQU        5AH WBUFF      &n ...…

查看全部问答∨

stm uart通信问题求助

使用stm8 uart2进行串口调试实验,初始化寄存器,使能接收发送和接收中断响应。平台发送数据到PC机:PC端接收正常。PC端发送数据到平台,平台能够接收到数据,但是都是乱码。请问哪位大虾碰到过此类问题,帮忙协助,感谢~~~…

查看全部问答∨

放大器的问题

有一个课题,做的是简单开关电源。要求我用比较器实现过流保护。具体是这样的:我在回路里串联一个小电阻,然后采集电阻的电压,有了电压和电阻就能求出电流了。    用采集的电压和一个具体电压比较(当然用比较器),如果超过折断 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved