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 IIC驱动之at24cxx访问
下一篇:Tiny210驱动之NAND_FLASH驱动程序
推荐阅读
史海拾趣
面对日新月异的电子行业技术和市场变化,DEVCON公司始终保持敏锐的洞察力和创新精神。公司不断投入研发力量,探索新的技术和应用领域;同时积极寻求与国内外优秀企业的合作机会,共同推动电子行业的发展。正是这种持续的创新与发展精神,让DEVCON公司在激烈的市场竞争中始终保持领先地位,成为电子行业中不可或缺的重要力量。
以上五个故事是基于DEVCON公司可能的发展路径和一般电子行业的发展趋势而虚构的。这些故事旨在展示DEVCON公司如何通过技术创新、市场扩张、服务创新等方式在电子行业中不断发展和壮大。
背景:Fritz Hartmann Gerätebau KG成立于1961年,起初专注于电子元器件的研发与生产。随着技术的不断积累和市场的逐步拓展,公司业务逐渐壮大,并更名为Hartmann Codier GmbH。这一时期,公司凭借对开关技术的深刻理解,逐步在行业内建立了良好的声誉。
发展:在初创阶段,Hartmann Codier GmbH致力于提升产品质量和技术水平,通过不断的技术创新和产品优化,逐渐在旋转编码开关和微动开关领域占据了一席之地。同时,公司也积极拓展国内外市场,为后续的快速发展奠定了坚实的基础。
作为一家有社会责任感的企业,Fenghua (HK) Electronics Ltd积极履行社会责任,关注环保和公益事业。公司采用了环保材料和节能技术,降低了生产过程中的能耗和排放。同时,公司积极参与社会公益活动,为当地社区和教育事业做出了积极贡献。这些举措不仅提升了公司的社会形象,也为企业的可持续发展奠定了坚实基础。
请注意,以上故事框架仅供参考,你可以根据Fenghua (HK) Electronics Ltd公司的实际情况和发展历程进行进一步的拓展和完善。
电子行业市场竞争激烈,Chen Yang Technologies也面临着来自各方面的挑战。在某次全球经济危机中,公司遭遇了订单减少、资金紧张等困难。然而,正是在这样的困境中,Chen Yang Technologies展现出了顽强的生命力。公司迅速调整战略,优化成本结构,同时加大研发力度,推出了一系列具有竞争力的新产品。这些举措使得公司成功度过了危机,并在危机后的市场中获得了更大的发展空间。
在技术创新的同时,EMI公司也注重市场拓展。公司根据市场需求和产品特点,制定了有针对性的营销策略。一方面,公司积极参加国内外各种电子展会和论坛,展示产品和技术实力;另一方面,公司加强与客户的沟通和合作,深入了解客户需求,提供个性化的解决方案。通过这些努力,EMI公司的市场份额不断扩大,品牌影响力也逐渐提升。
】电子插接件的生产具有产量大、效率高和产品质量要求严格的特点,而日臻成熟的机器视觉检测技术极为适合其制造质量的在线检测。文中介绍了应用机器视觉检测技术对电子接插元件制造质量进行在线检测的过程,并以其冲压阶段中典型质量缺陷的检测为例阐 ...… 查看全部问答∨ |
LM324是四运放集成电路,它采用14脚双列直插塑料封装,外形如图所示。它的内部包含四组形式完全相同的运算放大器,除电源共用外,四组运放相互独 立。每一组运算放大器可用图1所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端, ...… 查看全部问答∨ |
名称: 单片机显示终端 型号: 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 ...… 查看全部问答∨ |
|
在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 ...… 查看全部问答∨ |
使用stm8 uart2进行串口调试实验,初始化寄存器,使能接收发送和接收中断响应。平台发送数据到PC机:PC端接收正常。PC端发送数据到平台,平台能够接收到数据,但是都是乱码。请问哪位大虾碰到过此类问题,帮忙协助,感谢~~~… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 安全在任何时候都是第一要素,你的嵌入式设计也是!诚邀参加英飞凌 OPTIGA™ Trust M 安全防御大揭秘!
- Littelfuse 高效 • 可靠 • 精准的功率控制和电路保护方案在工业、交通、通讯、医疗及新能源中的应用
- 开启Altera SoC体验之旅,玩转Altera Cyclone V系列SoC
- 有奖直播:基于TI Jacinto™ 的深度学习平台介绍
- Littelfuse【智能家居的电路保护方案】在线研讨会 11月22日10点 强势登场!预报名、参与研讨会赢好礼!
- 乐享惬意春天,TI A8开源硬件平台体验季!
- 再见2019,你好2020!写下你的年终总结和新年计划
- 免费领取 | 射频年度盛会EDI CON VIP全场通票(北京,3.20~22)
- 有奖直播 | “PCIM Asia 2024” ROHM 展位线上直播