【源码】net_device结构
2019独角兽企业重金招聘Python工程师标准>>>
自己对TCP/IP内核有兴趣,一直只是不愠不火的看着,没什么头绪,没什么总结,想借着最近有想写blog的精神,坚持一段时间,看看到底写到什么程度。先分析结构体,再考虑下怎么写初始化。
因为相应出书了,只看书而使自己忘记了看源码本书,两者互相看的话,可能效果更好。
目前没找到更好的排版,只是凑合先这么着,找到更好的换。
http://www.oschina.net/code/explore/linux-2.6.36/include/linux/netdevice.h line778
/**
* The DEVICE structure.
* Actually, this whole structure is a big mistake. It mixes I/O
* data with strictly "high-level" data, and it has to know about
* almost every data structure used in the INET module.
*
* FIXME: cleanup struct net_device such that network protocol info
* moves out.
*/
struct net_device {
/**
* This is the first field of the "visible" part of this structure
* (i.e. as seen by users in the "Space.c" file). It is the name
* of the interface.
*/
char name[IFNAMSIZ];
struct pm_qos_request_list pm_qos_req;
/** device name hash chain */
struct hlist_node name_hlist;
/** snmp alias */
char *ifalias;
/**
* I/O specific fields
* FIXME: Merge these and struct ifmap into one
*/
unsigned long mem_end; /** shared mem end */
unsigned long mem_start; /** shared mem start 用于设备与内核沟通,访问只在驱动层,较高分层不用关心*/
unsigned long base_addr; /** device I/O address 设备内存映射到I/O内存的起始地址*/
unsigned int irq; /** device IRQ number 与内核对话的中断编号,可由多个设备共享 */
/**
* Some hardware also needs these fields, but they are not
* part of the usual set specified in Space.c.
*/
unsigned char if_port; /** Selectable AUI, TP,..*/
unsigned char dma; /** DMA channel 从内核获取和释放DMA通道,由ISA设备使用 */
unsigned long state;
struct list_head dev_list;
struct list_head napi_list;
struct list_head unreg_list;
/** Net device features */
unsigned long features;
#define NETIF_F_SG 1 /** Scatter/gather IO. */
#define NETIF_F_IP_CSUM 2 /** Can checksum TCP/UDP over IPv4. */
#define NETIF_F_NO_CSUM 4 /** Does not require checksum. F.e. loopack. */
#define NETIF_F_HW_CSUM 8 /** Can checksum all the packets. */
#define NETIF_F_IPV6_CSUM 16 /** Can checksum TCP/UDP over IPV6 */
#define NETIF_F_HIGHDMA 32 /** Can DMA to high memory. */
#define NETIF_F_FRAGLIST 64 /** Scatter/gather IO. */
#define NETIF_F_HW_VLAN_TX 128 /** Transmit VLAN hw acceleration */
#define NETIF_F_HW_VLAN_RX 256 /** Receive VLAN hw acceleration */
#define NETIF_F_HW_VLAN_FILTER 512 /** Receive filtering on VLAN */
#define NETIF_F_VLAN_CHALLENGED 1024 /** Device cannot handle VLAN packets */
#define NETIF_F_GSO 2048 /** Enable software GSO. */
#define NETIF_F_LLTX 4096 /** LockLess TX - deprecated. Please */
/** do not use LLTX in new drivers */
#define NETIF_F_NETNS_LOCAL 8192 /** Does not change network namespaces */
#define NETIF_F_GRO 16384 /** Generic receive offload */
#define NETIF_F_LRO 32768 /** large receive offload */
/** the GSO_MASK reserves bits 16 through 23 */
#define NETIF_F_FCOE_CRC (1 << 24) /** FCoE CRC32 */
#define NETIF_F_SCTP_CSUM (1 << 25) /** SCTP checksum offload */
#define NETIF_F_FCOE_MTU (1 << 26) /** Supports max FCoE MTU, 2158 bytes*/
#define NETIF_F_NTUPLE (1 << 27) /** N-tuple filters supported */
#define NETIF_F_RXHASH (1 << 28) /** Receive hashing offload */
/** Segmentation offload features */
#define NETIF_F_GSO_SHIFT 16
#define NETIF_F_GSO_MASK 0x00ff0000
#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
#define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
#define NETIF_F_TSO_ECN (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT)
#define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)
#define NETIF_F_FSO (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT)
/** List of features with software fallbacks. */
#define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | \
NETIF_F_TSO6 | NETIF_F_UFO)
#define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
#define NETIF_F_V4_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM)
#define NETIF_F_V6_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM)
#define NETIF_F_ALL_CSUM (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM)
/**
* If one device supports one of these features, then enable them
* for all in netdev_increment_features.
*/
#define NETIF_F_ONE_FOR_ALL (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \
NETIF_F_SG | NETIF_F_HIGHDMA | \
NETIF_F_FRAGLIST)
/** Interface index. Unique device identifier */
int ifindex;/*以dev_new_index注册时分派给每个设备*/
int iflink; /*由(虚拟)隧道设备使用*/
struct net_device_stats stats;
#ifdef CONFIG_WIRELESS_EXT
/** List of functions to handle Wireless Extensions (instead of ioctl).
* See <net/iw_handler.h> for details. Jean II */
const struct iw_handler_def * wireless_handlers;
/** Instance data managed by the core of Wireless Extensions. */
struct iw_public_data * wireless_data;
#endif
/** Management operations */
const struct net_device_ops *netdev_ops;
const struct ethtool_ops *ethtool_ops; /**设置或取出不同设备参数的配置*/
/** Hardware header description */
const struct header_ops *header_ops;
unsigned int flags; /** interface flags (a la BSD) */
unsigned short gflags; /**标识可以通过ifconifg命令查看*/
unsigned short priv_flags; /** Like 'flags' but invisible to userspace. 由VLAN和Bridge虚拟设备使用*/
unsigned short padded; /** How much padding added by alloc_netdev() */
unsigned char operstate; /** RFC2863 operstate */
unsigned char link_mode; /** mapping policy to operstate */
unsigned int mtu; /** interface MTU value 帧的最大尺寸 */
unsigned short type; /** interface hardware type */
unsigned short hard_header_len; /** hardware hdr length */
/** extra head- and tailroom the hardware may need, but not in all cases
* can this be guaranteed, especially tailroom. Some cases also use
* LL_MAX_HEADER instead to allocate the skb.
*/
unsigned short needed_headroom;
unsigned short needed_tailroom;
struct net_device *master; /** Pointer to master device of a group,
* which this device is member of.
*/
/** Interface address info. */
unsigned char perm_addr[MAX_ADDR_LEN]; /** permanent hw address */
unsigned char addr_assign_type; /** hw address assignment type */
unsigned char addr_len; /** hardware address length */
unsigned short dev_id; /** for shared network cards */
spinlock_t addr_list_lock;
struct netdev_hw_addr_list uc; /** Unicast mac addresses */
struct netdev_hw_addr_list mc; /** Multicast mac addresses */
int uc_promisc;
unsigned int promiscuity;
unsigned int allmulti;
/** Protocol specific pointers */
#ifdef CONFIG_NET_DSA
void *dsa_ptr; /** dsa specific data */
#endif
void *atalk_ptr; /** AppleTalk link */
void *ip_ptr; /** IPv4 specific data */
void *dn_ptr; /** DECnet specific data */
void *ip6_ptr; /** IPv6 specific data */
void *ec_ptr; /** Econet specific data */
void *ax25_ptr; /** AX.25 specific data */
struct wireless_dev *ieee80211_ptr; /** IEEE 802.11 specific data,
assign before registering */
/**
* Cache line mostly used on receive path (including eth_type_trans())
*/
unsigned long last_rx; /** Time of last Rx */
/** Interface address info used in eth_type_trans() */
unsigned char *dev_addr; /** hw address, (before bcast
because most packets are
unicast) */
struct netdev_hw_addr_list dev_addrs; /** list of device
hw addresses */
unsigned char broadcast[MAX_ADDR_LEN]; /** hw bcast add */
#ifdef CONFIG_RPS
struct kset *queues_kset;
struct netdev_rx_queue *_rx;
/** Number of RX queues allocated at alloc_netdev_mq() time */
unsigned int num_rx_queues;
#endif
struct netdev_queue rx_queue;
rx_handler_func_t *rx_handler;
void *rx_handler_data;
struct netdev_queue *_tx ____cacheline_aligned_in_smp;
/** Number of TX queues allocated at alloc_netdev_mq() time */
unsigned int num_tx_queues;
/** Number of TX queues currently active in device */
unsigned int real_num_tx_queues;
/** root qdisc from userspace point of view */
struct Qdisc *qdisc;
unsigned long tx_queue_len; /** Max frames per queue allowed */
spinlock_t tx_global_lock;
/**
* One part is mostly used on xmit path (device)
*/
/** These may be needed for future network-power-down code. */
/**
* trans_start here is expensive for high speed devices on SMP,
* please use netdev_queue->trans_start instead.
*/
unsigned long trans_start; /** Time (in jiffies) of last Tx */
int watchdog_timeo; /** used by dev_watchdog() */
struct timer_list watchdog_timer;
/** Number of references to this device */
atomic_t refcnt ____cacheline_aligned_in_smp;
/** delayed register/unregister */
struct list_head todo_list;
/** device index hash chain */
struct hlist_node index_hlist;
struct list_head link_watch_list;
/** register/unregister state machine */
enum { NETREG_UNINITIALIZED=0,
NETREG_REGISTERED, /** completed register_netdevice */
NETREG_UNREGISTERING, /** called unregister_netdevice */
NETREG_UNREGISTERED, /** completed unregister todo */
NETREG_RELEASED, /** called free_netdev */
NETREG_DUMMY, /** dummy device for NAPI poll */
} reg_state:16;
enum {
RTNL_LINK_INITIALIZED,
RTNL_LINK_INITIALIZING,
} rtnl_link_state:16;
/** Called from unregister, can be used to call free_netdev */
void (*destructor)(struct net_device *dev);
#ifdef CONFIG_NETPOLL
struct netpoll_info *npinfo;
#endif
#ifdef CONFIG_NET_NS
/** Network namespace this network device is inside */
struct net *nd_net;
#endif
/** mid-layer private */
void *ml_priv;
/** GARP */
struct garp_port *garp_port;
/** class/net/name entry */
struct device dev;
/** space for optional device, statistics, and wireless sysfs groups */
const struct attribute_group *sysfs_groups[4];
/** rtnetlink link ops */
const struct rtnl_link_ops *rtnl_link_ops;
/** VLAN feature mask */
unsigned long vlan_features;
/** for setting kernel sock attribute on TCP connection setup */
#define GSO_MAX_SIZE 65536
unsigned int gso_max_size;
#ifdef CONFIG_DCB
/** Data Center Bridging netlink ops */
const struct dcbnl_rtnl_ops *dcbnl_ops;
#endif
#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
/** max exchange id for FCoE LRO by ddp */
unsigned int fcoe_ddp_xid;
#endif
/** n-tuple filter list attached to this device */
struct ethtool_rx_ntuple_list ethtool_ntuple_list;
/** phy device may attach itself for hardware timestamping */
struct phy_device *phydev;
};
参考资料:{应该以这两本为主了,网上资料用来完善}
《深入理解Linux网络技术内幕》
《LDD》
PS:这几个网页资料先录下,没看完
http://wenku.baidu.com/view/f6d0cd4469eae009581bece5.html###
http://blog.21ic.com/user1/1066/archives/2007/40728.html
http://blog.csdn.net/smallnew198705/article/details/5489346
http://blog.sina.com.cn/s/blog_5ceeb9ea0100wzxj.html
http://oss.org.cn/kernel-book/ldd3/ch17s03.html
转载于:https://my.oschina.net/wolflion/blog/90896
【源码】net_device结构相关推荐
- asterisk源码目录结构
版本:asterisk-1.8.7.1 下载地址:asterisk-1.8.7.1.tar.gz main函数所在文件:main/asterisk.c (3182行) 文件夹: addons :ast ...
- 【原创】【专栏】《Linux设备驱动程序》--- LDD3源码目录结构和源码分析经典链接
http://blog.csdn.net/geng823/article/details/37567557 [原创][专栏]<Linux设备驱动程序>--- LDD3源码目录结构和源码分析 ...
- RTOS之uCOS-II源码下载及源码目录结构、常见的RTOS!
RTOS有众多种,用得最火的是FreeRTOS,因为它即使用于商业途径,也是开源免费的:其次是就是uCOS-II和uCOS-III.uCOS-II用于商业途径是需要付费的,但是对于学习研究却是免费的. ...
- linux与安卓系统目录,android系统架构及源码目录结构
1. android系统架构: android系统架构采用了分层架构的思想,如下图所示,从上到下共4层,分别为:应用程序层.应用程序框架层.系统库和android运行时层.linux内核层. 每层功能 ...
- 【lLinux驱动】linux内核源码目录结构
linux内核源码目录结构 代码目录结构 在阅读源码之前,还应知道Linux内核源码的整体分布情况.现代的操作系统一般由进程管理.内存管理.文件系统.驱动程序和网络等组成.Linux内核源码的各个目录 ...
- Pixhawk飞控源码目录结构及编译流程分析
http://blog.csdn.net/xlb7679/article/details/51658956 (PS:这是第一次写博客,以前也有记录一些经验总结心得什么的,不过都是手写笔记或者记在 ...
- Android系统源码学习——源码目录结构介绍
2019独角兽企业重金招聘Python工程师标准>>> Android 4.0源码目录结构: 本文介绍Android源码目录结构,以便读者理清Android编译系统核心代码在Andr ...
- Linux操作系统内核源码目录结构详解
Linux内核源码目录结构 代码目录结构 在阅读源码之前,还应知道Linux内核源码的整体分布情况.现代的操作系统一般由进程管理.内存管理.文件系统.驱动程序和网络等组成.Linux内核源码的各个目录 ...
- Android4.0源码目录结构详解
Android4.0源码目录结构详解 Android4.0与2.1目录差不多 alsa这块,注意external/tinyalsa下有: include/tinyalsa/asoundlib.h mi ...
- ijkplayer源码---FFPlayer结构体4 SDL_Aout
ijkplayer源码---FFPlayer结构体1_qq_15255121的专栏-CSDN博客 ijkplayer源码---FFPlayer结构体2_qq_15255121的专栏-CSDN博客 ij ...
最新文章
- 常见损失函数和评价指标总结
- [值得学习]售前工程师的成长---一个老员工的经验之谈(一)
- 《Adobe Illustrator大师班:经典作品与完美技巧赏析》目录—导读
- ThinkPHP5.0中Redis的使用和封装
- HTML基础(格式标签)
- java enummap_Java EnumMap size()方法与示例
- java构造方法和实例化,10. JavaSE-子类实例化过程 构造方法间调用
- Unity环境下RTMP推流+RTMP播放低延迟解决方案
- 打开数据库_打开这份指南,数据库运维也能优雅、简单!
- 【洛谷P1169】[ZJOI2007]棋盘制作
- C语言 - 判断素数
- ffmpeg的安装和使用教程
- iec104点号_IEC104规约报文说明(104报文解释的较好的文本)
- 分不清蓝牙适配器、蓝牙接收器和蓝牙发射器?伦茨科技为你讲解
- 【我的Android进阶之旅】Android 因为时间设置错误,请求报错 Could not validate certificate: Certificate expired at
- python爬虫网页崩溃怎么处理_《Python网络爬虫》1.2 爬取网页的异常处理
- 微信公众平台素材编辑与自动回复图文教程
- 好文分享:一切都是最好的安排
- 阿里云云呼叫中心——软电话SDK前端接入
- 国内与国际控制学科知名会议
热门文章
- 8/100. Find All Numbers Disappeared in an Array
- 命令行下载利器- Aria2
- 【感想文】找到自己的兴趣所在,坚持下去。写文章,学习,我的坚持。
- JS+HTML画图的几种方法
- 机器翻译 - 日期翻译
- button-xml 中android:clickable=false 属性
- Object-c学习之路三(@class与#import的区别)
- eclipse+pydev添加已存在django项目及其调试方法
- display:block的注意
- Jboss4集群配置【转】