网络驱动有关结构体的含义

本文介绍了网络驱动中的两个重要结构体:struct sk_buff和struct net_device。struct sk_buff主要用于描述网络数据包,包含如数据长度、头部信息和缓冲区等关键字段;而struct net_device则包含了设备的I/O特定信息,如设备名、中断号、硬件特性等。这两个结构体在Linux内核网络层中起着核心作用。
摘要由CSDN通过智能技术生成

首先看一下网络驱动必用结构体struct sk_buff

不怎么使用的就没有出现解释:

struct sk_buff {
 /* These two members must be first. */
 struct sk_buff  *next;
 struct sk_buff  *prev;

 struct sock   *sk;  //哪个socket套机字拥有此buffer
 ktime_t    tstamp;  //到达所使用的时间
 struct net_device *dev;

 unsigned long  _skb_dst; //目的入口
#ifdef CONFIG_XFRM
 struct sec_path *sp;
#endif
 /*
  * This is the control buffer. It is free to use for every
  * layer. Please put your private variables there. If you
  * want to keep them across layers you have to do a skb_clone()
  * first. This is owned by whoever has the skb queued ATM.
  */
 char    cb[48];  //可控的缓冲,可以对于每一层自由使用

 unsigned int  len,  //真实的数据长度
      data_len; //数据长度
 __u16    mac_len, //链路层头部长度
      hdr_len; //skb_clone的skb可改写头部的长度
 
 //校验
 union {
  __wsum  csum;
  struct {
   __u16 csum_start;
   __u16 csum_offset;
  };
 };
 __u32   priority;  //包的优先级
 kmemcheck_bitfield_begin(flags1);
 __u8   local_df:1,   //是否允许分片
     cloned:1,   //头部被复制到子分片
     ip_summed:2,  //ip校验和
     nohdr:1,   //有效载荷的参考
     nfctinfo:3;
 __u8   pkt_type:3,   //包的类型
     fclone:2,   //skbuff clone状态
     ipvs_property:1, //ipvs拥有
     peeked:1,   //此包已发送过
     nf_trace:1;   //网络过滤包的追踪标志
 __be16   protocol:16;  //协议版本
 kmemcheck_bitfield_end(flags1);

 void   (*destructor)(struct sk_buff *skb);   //自动释放
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
 struct nf_conntrack *nfct;
 struct sk_buff  *nfct_reasm;
#endif
#ifdef CONFIG_BRIDGE_NETFILTER
 struct nf_bridge_info *nf_bridge;
#endif

 int   iif;
#ifdef CONFIG_NET_SCHED
 __u16   tc_index; /* traffic control index */
#ifdef CONFIG_NET_CLS_ACT
 __u16   tc_verd; /* traffic control verdict */
#endif
#endif

 kmemcheck_bitfield_begin(flags2);
 __u16   queue_mapping:16;
#ifdef CONFIG_IPV6_NDISC_NODETYPE
 __u8   ndisc_nodetype:2;
#endif
 kmemcheck_bitfield_end(flags2);

 /* 0/14 bit hole */

#ifdef CONFIG_NET_DMA
 dma_cookie_t  dma_cookie;
#endif
#ifdef CONFIG_NETWORK_SECMARK
 __u32   secmark;
#endif

 __u32   mark;

 __u16   vlan_tci;

 sk_buff_data_t  transport_header; //如tcp/udp头部
 sk_buff_data_t  network_header;  //ip头部
 sk_buff_data_t  mac_header;   //数据链路层头部 mac头部
 /* These elements must be at the end, see alloc_skb() for details.  */
 sk_buff_data_t  tail;    //有效数据指针尾部
 sk_buff_data_t  end;    //缓冲区结束处

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux驱动程序中,设备通常用一个结构体来进行描述,这个结构体被称为设备结构体(Device Structure),或简称设备(Device)。设备结构体中包含了设备的一些基本信息,例如设备的名称、设备的主从类型、设备的地址、设备的中断信息等等。 在Linux内核中,设备结构体是由struct device结构体来表示的。struct device结构体定义在<linux/device.h>头文件中,其定义如下: ``` struct device { struct device *parent; struct device_private *p; struct kobject kobj; const char *init_name; struct device_type *type; struct mutex mutex; u32 id; struct list_head bus_list; struct bus_type *bus; struct device_driver *driver; void *platform_data; struct dev_pm_info power; #ifdef CONFIG_NUMA int numa_node; #endif u64 *dma_mask; u64 coherent_dma_mask; #ifdef CONFIG_DMA_API_DEBUG const char *dma_debug_name; struct device_dma_parameters *dma_parms; #endif }; ``` 其中,结构体成员的含义如下: - parent:指向父设备的指针; - p:指向设备私有数据的指针; - kobj:kobject对象,用于实现内核对象的基础机制; - init_name:设备名称; - type:设备类型; - mutex:设备的互斥锁; - id:设备的ID号; - bus_list:设备所在总线的链表; - bus:设备所在总线的指针; - driver:设备对应的驱动程序的指针; - platform_data:与平台相关的设备信息,例如设备的寄存器地址等; - power:设备的电源管理信息; - dma_mask:设备的DMA掩码; - coherent_dma_mask:设备的一致性DMA掩码。 通过这个结构体驱动程序可以获取设备的各种信息,包括设备所在的总线、设备的名称、设备的地址等等。同时,驱动程序可以通过该结构体与设备进行交互,例如发送读写请求、注册中断处理程序等等。 ### 回答2: Linux的设备结构体是一种数据结构,用于表示驱动程序管理的设备。它包含了设备的一些重要信息,如主设备号、次设备号、设备文件名称、设备名称、设备的操作函数等。 在Linux驱动程序中,设备结构体是必不可少的。它通常在驱动程序初始化时被创建,用于描述设备和驱动程序之间的关系。设备结构体通常定义在驱动程序的源代码中。作为一个结构体,它由多个成员组成,每个成员包含了特定的设备信息。 设备结构体常用的成员包括: 1. 主设备号(major number)和次设备号(minor number):用于唯一标识设备的类型和实例。主设备号表示设备类型,次设备号表示设备的实例。 2. 设备文件名称(device file name):用于在文件系统中标识设备。它通常位于/dev目录下,用户可以通过在该文件中进行读写来与设备进行交互。 3. 设备名称(device name):用于描述设备的类型和实例。它通常用于调试目的。 4. 设备的操作函数:包括设备的打开(open)、关闭(release)、读取(read)、写入(write)等操作。这些操作函数定义了设备和驱动程序之间的接口。 设备结构体的创建和初始化通常在驱动程序的init函数中完成。在创建设备结构体时,驱动程序需要为其分配内存,并对结构体的成员进行初始化。创建完成后,设备结构体将作为参数传递给其他函数,用于设备的管理和操作。 总之,Linux的设备结构体是用于描述驱动程序管理的设备的一种数据结构。它包含了设备的重要信息,如设备文件名称、设备名称、设备号等,并定义了设备的操作函数。通过设备结构体驱动程序可以有效地管理和操作设备。 ### 回答3: 在Linux中,设备驱动程序是通过设备结构体来表示的。设备结构体是一个包含了设备驱动程序所需要的所有相关信息的数据结构。它通常包括了设备的类型、设备的I/O操作函数、设备的初始化函数、设备的资源信息等。 设备结构体的定义是由Linux内核提供的,驱动程序开发者需要根据设备的具体要求进行相应的配置和初始化。例如,设备结构体中的设备类型字段用于指定设备的类型,可以是字符设备、块设备、网络设备等。 设备结构体还包括了设备操作函数指针,用于定义设备进行I/O操作时所需要调用的函数。这些函数包括读取设备数据的函数、写入设备数据的函数、设备打开和关闭的函数等。这些函数由设备驱动程序提供,并在设备结构体中注册。 此外,设备结构体还提供了设备的资源信息,如设备的内存映射、设备的中断信息等。这些资源信息通常在设备初始化函数中进行初始化,并在设备结构体中进行注册。 总之,设备结构体是Linux设备驱动程序中非常重要的一个数据结构,通过它可以实现设备的管理和操作。驱动程序开发者需要根据设备的要求进行相应的配置和初始化,以提供给应用程序正常使用设备的接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值