Linux--Socket Buffer--Netowrk Devices--Network Drivers

目录(?)[+]

1. ISO参考模型与TCP/IP参考模型

Linux--Socket Buffer--Netowrk Devices--Network Drivers_第1张图片

Linux--Socket Buffer--Netowrk Devices--Network Drivers_第2张图片

Linux--Socket Buffer--Netowrk Devices--Network Drivers_第3张图片

2. 在kernel中如何管理网络包(Network Packets)

2.1 定义Socket Buffers

       Socket Buffers 由以下两部分组成:

       1) Packet data: 它是在网络上传输的数据,其存储位置对应的PDU (Protocol Data Unit)

       2) Management data: 当包在kernel中进行处理时,kernel需要另外一些数据,如pointer, timers等,它们是协议实体间交换信息的ICI(Interface Control Information)

       Socket Buffer构成如下图所示:

Linux--Socket Buffer--Netowrk Devices--Network Drivers_第4张图片

         在Kernel处理过程中,网络数据以Socket Buffer的形式存在。

      当app通过socket发送数据时,socket将创建一个对应的socket buffer,并把需要发送的数据(payload)放于其中。当它通过各个协议层时,每一层的包头将被插入到payload的前面,在创建socket buffer时,为包头预留了足够空间。按此方案,payload被copy两次:

      1) 从用户空间copy到kernel空间

      2) 发送数据到network adapter

      在协议层间传递时,其数据变化如下图所示:

Linux--Socket Buffer--Netowrk Devices--Network Drivers_第5张图片

  Socket Buffer数据结构如下所示:

[cpp]  view plain copy
  1. struct sk_buff {  
  2.     /* These two members must be first. */  
  3.     struct sk_buff      *next;  
  4.     struct sk_buff      *prev;  
  5.   
  6.     ktime_t         tstamp;  
  7.   
  8.     struct sock     *sk;  
  9.     struct net_device   *dev;  
  10.   
  11.     /* 
  12.      * This is the control buffer. It is free to use for every 
  13.      * layer. Please put your private variables there. If you 
  14.      * want to keep them across layers you have to do a skb_clone() 
  15.      * first. This is owned by whoever has the skb queued ATM. 
  16.      */  
  17.     char            cb[48] __aligned(8);  
  18.   
  19.     unsigned long       _skb_refdst;  
  20. #ifdef CONFIG_XFRM  
  21.     struct  sec_path    *sp;  
  22. #endif  
  23.     unsigned int        len,  
  24.                 data_len;  
  25.     __u16           mac_len,  
  26.                 hdr_len;  
  27.     union {  
  28.         __wsum      csum;  
  29.         struct {  
  30.             __u16   csum_start;  
  31.             __u16   csum_offset;  
  32.         };  
  33.     };  
  34.     __u32           priority;  
  35.     kmemcheck_bitfield_begin(flags1);  
  36.     __u8            local_df:1,  
  37.                 cloned:1,  
  38.                 ip_summed:2,  
  39.                 nohdr:1,  
  40.                 nfctinfo:3;  
  41.     __u8            pkt_type:3,  
  42.                 fclone:2,  
  43.                 ipvs_property:1,  
  44.                 peeked:1,  
  45.                 nf_trace:1;  
  46.     kmemcheck_bitfield_end(flags1);  
  47.     __be16          protocol;  
  48.   
  49.     void            (*destructor)(struct sk_buff *skb);  
  50. #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)  
  51.     struct nf_conntrack *nfct;  
  52. #endif  
  53. #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED  
  54.     struct sk_buff      *nfct_reasm;  
  55. #endif  
  56. #ifdef CONFIG_BRIDGE_NETFILTER  
  57.     struct nf_bridge_info   *nf_bridge;  
  58. #endif  
  59.   
  60.     int         skb_iif;  
  61. #ifdef CONFIG_NET_SCHED  
  62.     __u16           tc_index;   /* traffic control index */  
  63. #ifdef CONFIG_NET_CLS_ACT  
  64.     __u16           tc_verd;    /* traffic control verdict */  
  65. #endif  
  66. #endif  
  67.   
  68.     __u32           rxhash;  
  69.   
  70.     __u16           queue_mapping;  
  71.     kmemcheck_bitfield_begin(flags2);  
  72. #ifdef CONFIG_IPV6_NDISC_NODETYPE  
  73.     __u8            ndisc_nodetype:2;  
  74. #endif  
  75.     __u8            ooo_okay:1;  
  76.     kmemcheck_bitfield_end(flags2);  
  77.   
  78.     /* 0/13 bit hole */  
  79.   
  80. #ifdef CONFIG_NET_DMA  
  81.     dma_cookie_t        dma_cookie;  
  82. #endif  
  83. #ifdef CONFIG_NETWORK_SECMARK  
  84.     __u32           secmark;  
  85. #endif  
  86.     union {  
  87.         __u32       mark;  
  88.         __u32       dropcount;  
  89.     };  
  90.   
  91.     __u16           vlan_tci;  
  92.   
  93.     sk_buff_data_t      transport_header; //传输层头  
  94.     sk_buff_data_t      network_header;   //网络层头  
  95.     sk_buff_data_t      mac_header;       //链路层头  
  96.     /* These elements must be at the end, see alloc_skb() for details.  */  
  97.     sk_buff_data_t      tail;  
  98.     sk_buff_data_t      end;  
  99.     unsigned char       *head,  
  100.                 *data;  
  101.     unsigned int        truesize;  
  102.     atomic_t        users;  
  103. }  


      对Socket Buffers的操作分为以下三类:

      1) 创建、释放和复制sokcet buffers

      2) 操作sk_buff结构中的参数和指针,主要是改变包数据空间的操作

      3) 管理socket buffer队列

2.1.1 创建、释放和复制sokcet buffers

      其相关函数如下所示:

alloc_skb()                include/linux/skbuff.h 
dev_alloc_skb()        net/core/skbuff.c 
skb_copy()                net/core/skbuff.c  
skb_copy_expand()  net/core/skbuff.c 
skb_clone()               net/core/skbuff.c 
kfree_skb()               net/core/skbuff.c 
dev_kfree_skb()       include/linux/skbuff.h 
kfree_skbmem()       net/core/skbuff.c

Linux--Socket Buffer--Netowrk Devices--Network Drivers_第6张图片

Linux--Socket Buffer--Netowrk Devices--Network Drivers_第7张图片


2.1.2 操作包数据空间

include/linux/skbuff.h 
skb_get()
skb_unshare()
skb_put()
skb_push()
skb_pull()
skb_tailroom()
skb_headroom()
skb_realloc_headroom()
skb_reserve()
skb_trim()
skb_cow()


2.2 定义Socket-Buffer Queues

      如果Socket Buffer不是正在被处理,则它被sk_buff_head管理,它通过双向链表进行管理,如下图所示:
Linux--Socket Buffer--Netowrk Devices--Network Drivers_第8张图片


[cpp]  view plain copy
  1. struct sk_buff_head {  
  2.     /* These two members must be first. */  
  3.     struct sk_buff  *next;  
  4.     struct sk_buff  *prev;  
  5.   
  6.     __u32       qlen;  
  7.     spinlock_t  lock;  
  8. };  

2.2.1 队列操作

include/linux/skbuff.h
skb_queue_head_init()
skb_queue_empty()
skb_queue_len()


2.2.2 队列中socket Buffer操作

include/linux/skbuff.h
skb_queue_head()
skb_queue_tail()
skb_dequeue()
skb_dequeue_tail()
skb_queue_purge()
skb_insert()
skb_append()
skb_unlink()
skb_peek()
skb_peek_tail()


3. Network Devices

      在Linux系统中的网络架构,基于软件的协议(software-based protocol)与网络适配器(network adapters)间的接口通过network devices来实现。一个network-device接口需要满足以下要求:
     1) 是network adapter的技术抽象
     2) 提供统一的接口供协议实体访问

Linux--Socket Buffer--Netowrk Devices--Network Drivers_第9张图片     

3.1 net_device定义

      【网络设备】不同于【字符设备】和【块设备】,其主要区别如下:

       1) 网络设备在/dev下不存在对应的设备名,即不可通过read和write进行读写操作

       2) 网络设备基于包进行处理,且必须经过复杂协议的处理(如TCP和UDP)

       net_device定义如下:

 

[cpp]  view plain copy
  1. struct net_device {  
  2.   
  3.     /* 
  4.      * This is the first field of the "visible" part of this structure 
  5.      * (i.e. as seen by users in the "Space.c" file).  It is the name 
  6.      * of the interface. 
  7.      */  
  8.     char            name[IFNAMSIZ];  
  9.   
  10.     struct pm_qos_request_list pm_qos_req;  
  11.   
  12.     /* device name hash chain */  
  13.     struct hlist_node   name_hlist;  
  14.     /* snmp alias */  
  15.     char            *ifalias;  
  16.   
  17.     // 硬件相关的信息  
  18.     /* 
  19.      *  I/O specific fields 
  20.      *  FIXME: Merge these and struct ifmap into one 
  21.      */  
  22.     unsigned long       mem_end;    /* shared mem end   */  
  23.     unsigned long       mem_start;  /* shared mem start */  
  24.     unsigned long       base_addr;  /* device I/O address   */  
  25.     unsigned int        irq;        /* device IRQ number    */  
  26.   
  27.     /* 
  28.      *  Some hardware also needs these fields, but they are not 
  29.      *  part of the usual set specified in Space.c. 
  30.      */  
  31.   
  32.     unsigned long       state;  
  33.   
  34.     struct list_head    dev_list;  
  35.     struct list_head    napi_list;  
  36.     struct list_head    unreg_list;  
  37.   
  38.     /* currently active device features */  
  39.     u32         features;  
  40.     /* user-changeable features */  
  41.     u32         hw_features;  
  42.     /* user-requested features */  
  43.     u32         wanted_features;  
  44.     /* mask of features inheritable by VLAN devices */  
  45.     u32         vlan_features;  
  46.   
  47.     /* Interface index. Unique device identifier    */  
  48.     int         ifindex;  
  49.     int         iflink;  
  50.   
  51.     struct net_device_stats stats;  
  52.     atomic_long_t       rx_dropped; /* dropped packets by core network 
  53.                          * Do not use this in drivers. 
  54.                          */  
  55.     // 管理操作  
  56.     /* Management operations */  
  57.     const struct net_device_ops *netdev_ops; // 最终调用网络设备驱动方法  
  58.     const struct ethtool_ops *ethtool_ops;  
  59.   
  60.     // 硬件头描述  
  61.     /* Hardware header description */  
  62.     const struct header_ops *header_ops;  
  63.   
  64.     unsigned int        flags;  /* interface flags (a la BSD)   */  
  65.     unsigned int        priv_flags; /* Like 'flags' but invisible to userspace. */  
  66.     unsigned short      gflags;  
  67.     unsigned short      padded; /* How much padding added by alloc_netdev() */  
  68.   
  69.     unsigned char       operstate; /* RFC2863 operstate */  
  70.     unsigned char       link_mode; /* mapping policy to operstate */  
  71.   
  72.     unsigned char       if_port;    /* Selectable AUI, TP,..*/  
  73.     unsigned char       dma;        /* DMA channel      */  
  74.   
  75.     unsigned int        mtu;    /* interface MTU value      */  
  76.     unsigned short      type;   /* interface hardware type  */  
  77.     unsigned short      hard_header_len;    /* hardware hdr length  */  
  78.   
  79.     /* extra head- and tailroom the hardware may need, but not in all cases 
  80.      * can this be guaranteed, especially tailroom. Some cases also use 
  81.      * LL_MAX_HEADER instead to allocate the skb. 
  82.      */  
  83.     unsigned short      needed_headroom;  
  84.     unsigned short      needed_tailroom;  
  85.   
  86.     // 接口地址信息  
  87.     /* Interface address info. */  
  88.     unsigned char       perm_addr[MAX_ADDR_LEN]; /* permanent hw address */  
  89.     unsigned char       addr_assign_type; /* hw address assignment type */  
  90.     unsigned char       addr_len;   /* hardware address length  */  
  91.     unsigned short          dev_id;     /* for shared network cards */  
  92.   
  93.     spinlock_t      addr_list_lock;  
  94.     struct netdev_hw_addr_list  uc; /* Unicast mac addresses */  
  95.     struct netdev_hw_addr_list  mc; /* Multicast mac addresses */  
  96.     int         uc_promisc;  
  97.     unsigned int        promiscuity;  
  98.     unsigned int        allmulti;  
  99.   
  100.     // 协议相关的指针  
  101.     /* Protocol specific pointers */  
  102.     void            *atalk_ptr; /* AppleTalk link   */  
  103.     struct in_device __rcu  *ip_ptr;    /* IPv4 specific data   */  
  104.     struct dn_dev __rcu     *dn_ptr;        /* DECnet specific data */  
  105.     struct inet6_dev __rcu  *ip6_ptr;       /* IPv6 specific data */  
  106.     void            *ec_ptr;    /* Econet specific data */  
  107.     void            *ax25_ptr;  /* AX.25 specific data */  
  108.     struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data, 
  109.                            assign before registering */  
  110.                               
  111.     // 在接收通道中需要缓存的数据     
  112.     /* 
  113.      * Cache lines mostly used on receive path (including eth_type_trans()) 
  114.      */  
  115.     unsigned long       last_rx;    /* Time of last Rx 
  116.                          * This should not be set in 
  117.                          * drivers, unless really needed, 
  118.                          * because network stack (bonding) 
  119.                          * use it if/when necessary, to 
  120.                          * avoid dirtying this cache line. 
  121.                          */  
  122.   
  123.     struct net_device   *master; /* Pointer to master device of a group, 
  124.                       * which this device is member of. 
  125.                       */  
  126.   
  127.     /* Interface address info used in eth_type_trans() */  
  128.     unsigned char       *dev_addr;  /* hw address, (before bcast 
  129.                            because most packets are 
  130.                            unicast) */  
  131.   
  132.     struct netdev_hw_addr_list  dev_addrs; /* list of device 
  133.                               hw addresses */  
  134.   
  135.     unsigned char       broadcast[MAX_ADDR_LEN];    /* hw bcast add */  
  136.   
  137. #ifdef CONFIG_RPS  
  138.     struct kset     *queues_kset;  
  139.   
  140.     struct netdev_rx_queue  *_rx;  
  141.   
  142.     /* Number of RX queues allocated at register_netdev() time */  
  143.     unsigned int        num_rx_queues;  
  144.   
  145.     /* Number of RX queues currently active in device */  
  146.     unsigned int        real_num_rx_queues;  
  147.   
  148. #ifdef CONFIG_RFS_ACCEL  
  149.     /* CPU reverse-mapping for RX completion interrupts, indexed 
  150.      * by RX queue number.  Assigned by driver.  This must only be 
  151.      * set if the ndo_rx_flow_steer operation is defined. */  
  152.     struct cpu_rmap     *rx_cpu_rmap;  
  153. #endif  
  154. #endif  
  155.   
  156.     rx_handler_func_t __rcu *rx_handler;  
  157.     void __rcu      *rx_handler_data;  
  158.   
  159.     struct netdev_queue __rcu *ingress_queue;  
  160.       
  161.     // 在发送通道中需要缓存的数据  
  162.   
  163.     /* 
  164.      * Cache lines mostly used on transmit path 
  165.      */  
  166.     struct netdev_queue *_tx ____cacheline_aligned_in_smp;  
  167.   
  168.     /* Number of TX queues allocated at alloc_netdev_mq() time  */  
  169.     unsigned int        num_tx_queues;  
  170.   
  171.     /* Number of TX queues currently active in device  */  
  172.     unsigned int        real_num_tx_queues;  
  173.   
  174.     /* root qdisc from userspace point of view */  
  175.     struct Qdisc        *qdisc;  
  176.   
  177.     unsigned long       tx_queue_len;   /* Max frames per queue allowed */  
  178.     spinlock_t      tx_global_lock;  
  179.   
  180. #ifdef CONFIG_XPS  
  181.     struct xps_dev_maps __rcu *xps_maps;  
  182. #endif  
  183.   
  184.     /* These may be needed for future network-power-down code. */  
  185.   
  186.     /* 
  187.      * trans_start here is expensive for high speed devices on SMP, 
  188.      * please use netdev_queue->trans_start instead. 
  189.      */  
  190.     unsigned long       trans_start;    /* Time (in jiffies) of last Tx */  
  191.   
  192.     int         watchdog_timeo; /* used by dev_watchdog() */  
  193.     struct timer_list   watchdog_timer;  
  194.   
  195.     /* Number of references to this device */  
  196.     int __percpu        *pcpu_refcnt;  
  197.   
  198.     /* delayed register/unregister */  
  199.     struct list_head    todo_list;  
  200.     /* device index hash chain */  
  201.     struct hlist_node   index_hlist;  
  202.   
  203.     struct list_head    link_watch_list;  
  204.   
  205.     /* register/unregister state machine */  
  206.     enum { NETREG_UNINITIALIZED=0,  
  207.            NETREG_REGISTERED,   /* completed register_netdevice */  
  208.            NETREG_UNREGISTERING,    /* called unregister_netdevice */  
  209.            NETREG_UNREGISTERED, /* completed unregister todo */  
  210.            NETREG_RELEASED,     /* called free_netdev */  
  211.            NETREG_DUMMY,        /* dummy device for NAPI poll */  
  212.     } reg_state:8;  
  213.   
  214.     bool dismantle; /* device is going do be freed */  
  215.   
  216.     enum {  
  217.         RTNL_LINK_INITIALIZED,  
  218.         RTNL_LINK_INITIALIZING,  
  219.     } rtnl_link_state:16;  
  220.   
  221.     /* Called from unregister, can be used to call free_netdev */  
  222.     void (*destructor)(struct net_device *dev);  
  223.   
  224. #ifdef CONFIG_NETPOLL  
  225.     struct netpoll_info *npinfo;  
  226. #endif  
  227.   
  228. #ifdef CONFIG_NET_NS  
  229.     /* Network namespace this network device is inside */  
  230.     struct net      *nd_net;  
  231. #endif  
  232.   
  233.     /* mid-layer private */  
  234.     union {  
  235.         void                *ml_priv;  
  236.         struct pcpu_lstats __percpu *lstats; /* loopback stats */  
  237.         struct pcpu_tstats __percpu *tstats; /* tunnel stats */  
  238.         struct pcpu_dstats __percpu *dstats; /* dummy stats */  
  239.     };  
  240.     /* GARP */  
  241.     struct garp_port __rcu  *garp_port;  
  242.   
  243.     /* class/net/name entry */  
  244.     struct device       dev;  
  245.     /* space for optional device, statistics, and wireless sysfs groups */  
  246.     const struct attribute_group *sysfs_groups[4];  
  247.   
  248.     /* rtnetlink link ops */  
  249.     const struct rtnl_link_ops *rtnl_link_ops;  
  250.   
  251.     /* for setting kernel sock attribute on TCP connection setup */  
  252. #define GSO_MAX_SIZE        65536  
  253.     unsigned int        gso_max_size;  
  254.   
  255.     u8 num_tc;  
  256.     struct netdev_tc_txq tc_to_txq[TC_MAX_QUEUE];  
  257.     u8 prio_tc_map[TC_BITMASK + 1];  
  258.   
  259.     /* n-tuple filter list attached to this device */  
  260.     struct ethtool_rx_ntuple_list ethtool_ntuple_list;  
  261.   
  262.     /* phy device may attach itself for hardware timestamping */  
  263.     struct phy_device *phydev;  
  264.   
  265.     /* group the device belongs to */  
  266.     int group;  
  267. }  

       net_device是每个网络设备的基础,它不仅包含network adapter硬件信息(如:interrupt, ports, driver functions等),也包含高层网络协议的配置数据(如:IP address, subnet mask等).
     在/sys/class/net下列出来所有网络设备的名字,如我的为:
     shell@android:/sys/class/net # ll
     lrwxrwxrwx root     root              2013-07-05 17:08 ip6tnl0 
     lrwxrwxrwx root     root              2013-07-05 17:08 lo  (loopback设备)
     lrwxrwxrwx root     root              2013-07-05 17:08 sit0 
     lrwxrwxrwx root     root              2000-01-01 08:00 wlan0 (Wifi设备)

3.2 管理net_device

      从上面的协议实例看net_device。

 Linux--Socket Buffer--Netowrk Devices--Network Drivers_第10张图片     

3.2.1注册和注销网络设备(net_device)

       位于文件:kernel/net/core/dev.c

       int register_netdev(struct net_device *dev)

       void unregister_netdev(struct net_device *dev)

       网络设备(net_device)与一个已经存在的network adapter一一对应。

3.2.2 打开和关闭网络设备(net_device)

       位于文件:kernel/net/core/dev.c

       int dev_open(struct net_device *dev)

       int dev_close(struct net_device *dev)

3.2.3 创建、释放和查找网络设备(net_device)

       位于文件:kernel/net/core/dev.c

       struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
                                                  void (*setup)(struct net_device *),
                                                  unsigned int txqs, unsigned int rxqs)

       void free_netdev(struct net_device *dev)

       int dev_alloc_name(struct net_device *dev, const char *name)

       struct net_device *dev_get_by_index(struct net *net, int ifindex)

       struct net_device *dev_get_by_name(struct net *net, const char *name)

       void dev_load(struct net *net, const char *name)

3.2.4网络设备通知上层协议状态变化

        int call_netdevice_notifiers(unsigned long val, struct net_device *dev)

     Linux--Socket Buffer--Netowrk Devices--Network Drivers_第11张图片

       网络状态有如下值:

       NETDEV_UP: 激活一个网络设备 (dev_open)
       NETDEV_DOWN: 禁止一个网络设备 (dev_close)
       NETDEV_CHANGE: 通知网络设备状态变化
       NETDEV_REGISTER: 网络设备已经被注册,但是没有打开实例
       NETDEV_UNREGISTER: 网络设备已经被删除
       NETDEV_CHANGEMTU: 网络设备MTU被修改
       NETDEV_CHANGEADDR: 网络设备硬件地址被修改
       NETDEV_CHANGENAME:网络设备名字被修改

3.2.5 通过net_device发送数据

       int dev_queue_xmit(struct sk_buff *skb)   // kernel/net/core/dev.c

      它由高层的协议实例调用,以通过一个net_device(skb->dev)发送一个socket buffer.

3.3 net_device_ops     

[cpp]  view plain copy
  1. struct net_device_ops {  
  2.     int         (*ndo_init)(struct net_device *dev);  
  3.     void            (*ndo_uninit)(struct net_device *dev);  
  4.     int         (*ndo_open)(struct net_device *dev);  
  5.     int         (*ndo_stop)(struct net_device *dev);  
  6.     netdev_tx_t     (*ndo_start_xmit) (struct sk_buff *skb,  
  7.                            struct net_device *dev);  
  8.     u16         (*ndo_select_queue)(struct net_device *dev,  
  9.                             struct sk_buff *skb);  
  10.     void            (*ndo_change_rx_flags)(struct net_device *dev,  
  11.                                int flags);  
  12.     void            (*ndo_set_rx_mode)(struct net_device *dev);  
  13.     void            (*ndo_set_multicast_list)(struct net_device *dev);  
  14.     int         (*ndo_set_mac_address)(struct net_device *dev,  
  15.                                void *addr);  
  16.     int         (*ndo_validate_addr)(struct net_device *dev);  
  17.     int         (*ndo_do_ioctl)(struct net_device *dev,  
  18.                             struct ifreq *ifr, int cmd);  
  19.     int         (*ndo_set_config)(struct net_device *dev,  
  20.                               struct ifmap *map);  
  21.     int         (*ndo_change_mtu)(struct net_device *dev,  
  22.                           int new_mtu);  
  23.     int         (*ndo_neigh_setup)(struct net_device *dev,  
  24.                            struct neigh_parms *);  
  25.     void            (*ndo_tx_timeout) (struct net_device *dev);  
  26.   
  27.     struct rtnl_link_stats64* (*ndo_get_stats64)(struct net_device *dev,  
  28.                              struct rtnl_link_stats64 *storage);  
  29.     struct net_device_stats* (*ndo_get_stats)(struct net_device *dev);  
  30.   
  31.     void            (*ndo_vlan_rx_register)(struct net_device *dev,  
  32.                                 struct vlan_group *grp);  
  33.     void            (*ndo_vlan_rx_add_vid)(struct net_device *dev,  
  34.                                unsigned short vid);  
  35.     void            (*ndo_vlan_rx_kill_vid)(struct net_device *dev,  
  36.                                 unsigned short vid);  
  37. #ifdef CONFIG_NET_POLL_CONTROLLER  
  38.     void                    (*ndo_poll_controller)(struct net_device *dev);  
  39.     int         (*ndo_netpoll_setup)(struct net_device *dev,  
  40.                              struct netpoll_info *info);  
  41.     void            (*ndo_netpoll_cleanup)(struct net_device *dev);  
  42. #endif  
  43.     int         (*ndo_set_vf_mac)(struct net_device *dev,  
  44.                           int queue, u8 *mac);  
  45.     int         (*ndo_set_vf_vlan)(struct net_device *dev,  
  46.                            int queue, u16 vlan, u8 qos);  
  47.     int         (*ndo_set_vf_tx_rate)(struct net_device *dev,  
  48.                               int vf, int rate);  
  49.     int         (*ndo_get_vf_config)(struct net_device *dev,  
  50.                              int vf,  
  51.                              struct ifla_vf_info *ivf);  
  52.     int         (*ndo_set_vf_port)(struct net_device *dev,  
  53.                            int vf,  
  54.                            struct nlattr *port[]);  
  55.     int         (*ndo_get_vf_port)(struct net_device *dev,  
  56.                            int vf, struct sk_buff *skb);  
  57.     int         (*ndo_setup_tc)(struct net_device *dev, u8 tc);  
  58. #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)  
  59.     int         (*ndo_fcoe_enable)(struct net_device *dev);  
  60.     int         (*ndo_fcoe_disable)(struct net_device *dev);  
  61.     int         (*ndo_fcoe_ddp_setup)(struct net_device *dev,  
  62.                               u16 xid,  
  63.                               struct scatterlist *sgl,  
  64.                               unsigned int sgc);  
  65.     int         (*ndo_fcoe_ddp_done)(struct net_device *dev,  
  66.                              u16 xid);  
  67.     int         (*ndo_fcoe_ddp_target)(struct net_device *dev,  
  68.                                u16 xid,  
  69.                                struct scatterlist *sgl,  
  70.                                unsigned int sgc);  
  71. #define NETDEV_FCOE_WWNN 0  
  72. #define NETDEV_FCOE_WWPN 1  
  73.     int         (*ndo_fcoe_get_wwn)(struct net_device *dev,  
  74.                             u64 *wwn, int type);  
  75. #endif  
  76. #ifdef CONFIG_RFS_ACCEL  
  77.     int         (*ndo_rx_flow_steer)(struct net_device *dev,  
  78.                              const struct sk_buff *skb,  
  79.                              u16 rxq_index,  
  80.                              u32 flow_id);  
  81. #endif  
  82.     int         (*ndo_add_slave)(struct net_device *dev,  
  83.                          struct net_device *slave_dev);  
  84.     int         (*ndo_del_slave)(struct net_device *dev,  
  85.                          struct net_device *slave_dev);  
  86.     u32         (*ndo_fix_features)(struct net_device *dev,  
  87.                             u32 features);  
  88.     int         (*ndo_set_features)(struct net_device *dev,  
  89.                             u32 features);  
  90. }  

4. Network Drivers

4.1 初始化网络适配器(Network Adapter)

      在net_device被激活之前,我们必须找到一个匹配的network adapter。网络驱动(network driver)的初始化函数(init/probe)负责找到一个匹配的network adapter并且使用对应的信息初始化net_device。在驱动的probe函数中,主要完成以下任务:(参考:kernel/drivers/net/pci-skeleton.c)

      1) 创建net_device

      2) 填充相关的硬件信息

      3) 调用register_netdev进行注册

      4) 设置net_device->netdev_ops (netdev_ops由驱动实现)

4.2 打开、关闭网络适配器

      1) 打开: ifconfig wlan0 up->ioctl->dev_open->net_device.netdev_ops.ndo_open

      2) 关闭: ifconfig wlan0 down->ioctl->dev_close->net_device.netdev_ops.ndo_stop

4.3 发送数据

      在驱动中实现与ndo_start_xmit对应的函数

4.4 接收数据

      其流程如下图所示:

     Linux--Socket Buffer--Netowrk Devices--Network Drivers_第12张图片

        在网络驱动的中断处理函数中,首先调用dev_alloc_skb创建socket buffer,然后把接收到的数据copy到其中,最后调用netif_rx把socket buffer放入队列中,供协议层处理。

      int netif_rx(struct sk_buff *skb)  // kernel/net/core/dev.c

5. Data-Link Layer

Linux--Socket Buffer--Netowrk Devices--Network Drivers_第13张图片
     1) 逻辑链路控制(LLC)层由Linux内核实现,网络适配器通过net_device连接到操作系统内核。

     2) 数据链路层(Data-Link Layer)由LLC和MAC组成。LLC隐藏了所有不同传输介质的差异,从而以上层协议提供统一的接口;而MAC层则反应了不同传输技术(传输协议,如802.3与802.11不同)的差异。

        逻辑链路控制 LLC (Logical Link Control)子层
        媒体接入控制 MAC (Medium Access Control)子层
        与接入到传输媒体有关的内容都放在 MAC子层,而LLC 子层则与传输媒体无关,不管采用何种协议的局域网对 LLC 子层来说都是透明的。

Linux--Socket Buffer--Netowrk Devices--Network Drivers_第14张图片

5.1 接收网络包流程

Linux--Socket Buffer--Netowrk Devices--Network Drivers_第15张图片

5.2 发送网络包流程

Linux--Socket Buffer--Netowrk Devices--Network Drivers_第16张图片

你可能感兴趣的:(Linux--Socket Buffer--Netowrk Devices--Network Drivers)