您的位置: 白山信息港 > 娱乐

Linux系统串口上网的简单实现下3

发布时间:2019-11-05 16:27:56

ether_setup()填充一些以太网的缺省设置。dev->hard_header_cache=NULL表示不缓存向本网络接口回复的ARP网络数据包。 IFF_NOARP的标志设置表明本网络接口不使用ARP。ARP的主要功能是获得通信对方的网络接口的硬件地址,本文的伪网络接口的物理地址是程序中设定的伪物理地址,所以我们不需要ARP协议。SET_MODULE_OWNER(dev)这个宏是设置dev结构中owner域(定义为struct module *owner;),使得它指向本模块本身。与字符设备一样,本网络设备也需要定义在其上的操作例程。下面就对ednet_init()中用户定义的设备操作函数做进一步说明。整个伪网络设备操作调用结构如图6所示。 图 6由图6我们看到,ednet_rx()并不是网络设备的一个操作,而是模块中的一个函数。在实际的网卡驱动程序中,当网卡确实接收到数据的时候,由网络中断唤醒等待接收数据的用户进程,也就是说,ednet_rx()应该由那个网络中断处理例程调用。我们这里并没有中断,所以字符设备的 device_write()可以看成是一个"中断例程",也就是说,用户空间往字符写操作的时候,也就调用了网络设备的数据接收内核例程 ednet_rx()了。然后ednet_rx()会把原始的数据包发送到TCP/IP上层进行处理,这一切均依赖于内核API 函数netif_rx()。ednet_rx()就需要sk_buff数据结构(中定义),用来存放从网络接口接收到的原始网络数据,分配后的sk_buff结构将在TCP/IP协议栈上被释放掉。 下面介绍一下网络设备的主要操作例程ednet_open()、ednet_release()、ednet_tx ()、ednet_stats ()、ednet_change_mtu()、ednet_header()。网络设备文件操作结构struct net_device(中有定义)中定义了指向以上函数的函数指针的原形: ednet_open: int (*open)(struct net_device *dev);ednet_release: int (*stop)(struct net_device *dev);ednet_tx: int (*hard_start_xmit) (struct sk_buff *skb,struct net_device *dev);ednet_stats: struct net_device_stats* (*get_stats)(struct net_device *dev);ednet_change_mtu:int(*change_mtu)(struct net_device *dev, int new_mtu);ednet_header: int (*hard_header) (struct sk_buff *skb,struct net_device *dev,unsigned short type,void *daddr,void *saddr,unsigned len);

操作int ednet_open(struct net_device *dev)的作用是打开伪网络接口设备,获得其需要的I/O端口、IRQ等,但是本网络接口不需要和实际硬件打交道,所以不需要自动获得或者赋予I/O端口值,也不需要IRQ中断号,需要程序指定的是其伪硬件地址(这个硬件地址是"0ED000",ifconfig可以看到其硬件地址是 00:45:44:30:30:30,struct net_device中的dev_addr域存放网络接口的物理地址。操作ednet_open()必须调用netif_start_queue()内核 API开启网络接口接收和发送数据队列。 当接口关闭的时候,int ednet_release(struct net_device *dev)例程被系统调用,在ednet_release()中调用netif_stop_queque()将停止接收和发送队列的工作。

类似感冒症状的秋季过敏 可能导致宝宝突发休克!
手部牛皮癣治疗注意什么,这些细节需要留心
视频二、本期话题:什么是种植牙
济南名韩医院葛淑静
济南艾玛妇产医院怎么样
猜你会喜欢的
猜你会喜欢的