《嵌入式网络设备驱动程序设计(改)》由会员分享,可在线阅读,更多相关《嵌入式网络设备驱动程序设计(改)(46页珍藏版)》请在金锄头文库上搜索。
1、第7章 网络设备驱动程序开发 第7章 嵌入式网络设备驱动程序设计 7.1 嵌入式网络设备驱动程序7.2 基于以太网控制器AX77796的接口设计7.3 Linux网络设备驱动程序实例第7章 网络设备驱动程序开发 7.1 嵌入式网络设备驱动程序 7.1.1 Linux网络设备驱动程序的体系结构第7章 网络设备驱动程序开发 7.1.2 Linux网络设备驱动程序的数据结构在网络驱动程序的两个数据结构:网络设备数据结构devic:其中包括设备初始化时调用的init函数、打开和关闭网络设备 的open和stop函数、处理数据包发送的hard_start_xmit函数等。套接字缓冲区sk_buff:TC
2、P/IP 中不同协议层间,以及与网络驱动程序之间数据包的 传递都是通过这个sk_buff结构体来完成的,这个结构体主要包括传输层、网络层、连接层需要的变量,决定数据区位置和大小的 指针,以及发送接收数据包所用到的具体设备信息等。根据网络 应用的特点,对链表的操作主要是删除链表头的元素和添加元素 到链表尾。第7章 网络设备驱动程序开发 device数据结构 net_device数据结构是为IP层访问该设备提供接口。数据结构device操作的数据对象数据包是通过数据结构sk_buff来封装的,它是在/include/linux/netdevice.h中定义。第7章 网络设备驱动程序开发 struc
3、t net_devicechar nameIFNAMSIZ; /*网络设备特殊文件,每一个名字表示其设备类 型,以太网设备号为/dev/eth0、/dev/eth1等。*/unsigned long rmem_end;/* rmem域段表示接收内存末地址*/unsigned long rmem_start;/* rmem域段表示接收内存首地址*/unsigned long mem_end;/* mem域段表示发送内存末地址*/unsigned long mem_start;/* mem域段表示发送内存首地址*/unsigned long base_addr;/* 设备I/O地址*/unsign
4、ed intirq;/* 设备IRQ号*/unsigned char if_port;/* 记录哪个硬件I/O口正在被接口所用*/unsigned chardma;/* DMA通道*/unsigned longstate;struct net_device*next;/*指向下一个网络设备*/int(*init)(struct net_device *dev);/*指向驱动程序的初始化方法*/第7章 网络设备驱动程序开发 struct net_device *next_sched; /*指向下一个调度*/intifindex; /*设备标识符*/intiflink;struct net_dev
5、ice_stats* (*get_stats)(struct net_device dev);/*返回一个enet_statistic结构,包括发送、接收的统计计信息*/struct iw_statistics* (*get_wireless_stats)(struct net_device *dev);unsigned longtrans_start; /*记录最后一次发送成功的时间*/第7章 网络设备驱动程序开发 unsigned long last_rx; /*记录最后一次接收成功的时间*/unsigned short flags; /*接口标示*/unsigned short gfla
6、gs;unsigned short unused_alignment_fixer; unsigned mtu;unsigned short type; /*物理硬件类型*/unsigned short hard_header_len;/*硬件帧头的长度*/void*priv; /*私有区间指针*/struct net_device*master; /*接口地址信息*/unsigned char broadcastMAX_ADDR_LEN;/*广播网地址*/unsigned char dev_addrMAX_ADDR_LEN;/*硬件地址*/unsigned char addr_len; /*地
7、址长度*/struct dev_mc_list*mc_list; /* mac地址列表*/第7章 网络设备驱动程序开发 struct Qdisc*qdisc_sleeping;struct Qdisc*qdisc_list;struct Qdisc*qdisc_ingress;unsigned longtx_queue_len; /* Max frames per queue allowed */*传输函数指针同步器 */spinlock_txmit_lock;intxmit_lock_owner;spinlock_tqueue_lock;atomic_trefcnt;intdeadbeaf;
8、intfeatures;#define NETIF_F_SG1 /* Scatter/gather IO.*/#define NETIF_F_IP_CSUM 2 /* IPv4上TCP/UDP的检错*/#define NETIF_F_NO_CSUM4 /* 回环时不检错*/#define NETIF_F_HW_CSUM7 /* 检查所有包*/#define NETIF_F_DYNALLOC16#define NETIF_F_HIGHDMA32#define NETIF_F_FRAGLIST64第7章 网络设备驱动程序开发 void (*uninit)(struct net_device *de
9、v);/*释放网络设备时执行该函数*/void(*destructor)(struct net_device *dev);/*撤销器*/int(*open)(struct net_device *dev);/*打开网络接口*/int(*stop)(struct net_device *dev);/*停止网络接口*/int (*hard_start_xmit) (struct sk_buff skb,struct net_device dev);/发送 int(*hard_header) (struct sk_buff *skb, struct net_device *dev,unsigned
10、short type,void *daddr,void *saddr,unsigned len); /*硬件帧头*/int(*rebuild_header)(struct sk_buff *skb);/*在一个包被发送之前重建帧头*/#define HAVE_MULTICAST /*设置多点传输地址链表*/void(*set_multicast_list)(struct net_device *dev);#define HAVE_SET_MAC_ADDR/*当用户调用ioctl类型为SIOCSIFWADDR时需设置设备mac地 址*/第7章 网络设备驱动程序开发 int(*set_mac_ad
11、dress)(struct net_device *dev,void *addr);#define HAVE_PRIVATE_IOCTL /*当用户调用ioctl类型为SIOCDEVPRIVATE和别SIOCDEVPRIVATE+15之间,系统会调用驱动程序的这个方法*/int(*do_ioctl)(struct net_device *dev,struct ifreq *ifr, int cmd);#define HAVE_SET_CONFIG/*当用户调用ioctl类型为SIOCSIFMAP时,系统会调用驱动程序的set_config方法。用户传递一个ifmap结构*/int(*set_c
12、onfig)(struct net_device *dev,struct ifmap *map);#define HAVE_HEADER_CACHEInt(*hard_header_cache)(struct neighbour *neigh,struct hh_cache *hh);void(*header_cache_update)(struct hh_cache *hh,struct net_device *dev,unsigned char * haddr);#define HAVE_CHANGE_MTU int(*change_mtu)(struct net_device *dev,
13、 int new_mtu);#define HAVE_TX_TIMEOUT/*传输超时*/void (*tx_timeout) (struct net_device *dev);第7章 网络设备驱动程序开发 int(*hard_header_parse)(struct sk_buff *skb,unsigned char *haddr);int(*neigh_setup)(struct net_device *dev, struct neigh_parms *);int(*accept_fastpath)(struct net_device *, struct dst_entry*);stru
14、ct module *owner; /* 打开、释放、使用时生成*/struct net_bridge_port*br_port; /* 网桥接口*/#ifdef CONFIG_NET_FASTROUTE#define NETDEV_FASTROUTE_HMASK 0xF/半私有数据,保存在设备结构尾部 rwlock_tfastpath_lock;struct dst_entry*fastpathNETDEV_FASTROUTE_HMASK+1;#endif#ifdef CONFIG_NET_DIVERT/* 每个类型接口初始化时调用*/struct divert_blk*divert;#en
15、dif /* CONFIG_NET_DIVERT */; 第7章 网络设备驱动程序开发 2sk_buff数据结构Linux网络各层之间的数据传送,如:TCP/IP 中不同协议层间,以及与网络驱动程序之间数据包的传递都是通过这个套接字缓冲区sk_buff结构体来完成的,这个结构体主要包括传输层、网络层、连接层需要的变量,决定数据区位置和大小的指针,以及发送接收数据包所用到的具体设备信息等。根据网络应用的特点,对链表的操作主要是删除链表头的元素和添加元素到链表尾。sk_buff数据结构是在/include/linux/skbuff.h文件中定义。 struct sk_buff struct sk_
16、buff* next;/ next指向sk_buff双向链表的后缓冲区结点struct sk_buff* prev;/* Prev指向前一个缓冲区结点*/struct sk_buff_head * list;/* sk_buff_head链表*/struct sock*sk;/* 拥有的Socket套接口*/struct timevalstamp; /* 到达时间*/struct net_device*dev;/* 涉及的设备*/第7章 网络设备驱动程序开发 union /* 传输层数据包头*/struct tcphdr*th;struct udphdr*uh;struct icmphdr*icmph;struct igmphdr*igmph;struct iphdr*ipiph;struct spxhdr*spxh;unsigned char*raw; h;Union /* 网络层数据包头 */st