網絡基礎部分
網卡驅動基礎部分
每個網絡接口都由一個net_device結構來描述,
該結構可使用如下內核函數動態分配:
1、struct net_device *alloc_netdev(int sizeof_priv, const char
*mask, void (*setup)(struct net_device *))
sizeof_priv 私有數據區大小;mask:設備名;setup 初始化函數
2、struct net_device *alloc_etherdev(int sizeof_priv)
結構net_device 的主要成員包括:
vchar name[IFNAMSIZ]
設備名,如:eth%d 如:eth0,eth1
vunsigned long state
設備狀態
nsigned long base_addr
I/O 基地址
vunsigned int irq
中斷號
int (*init)(struct net_device *dev) 初始化函數。該函數在register_netdev時被調用來完成對net_device 結構的初始化。
int (*open)(struct net_device *dev)打開接口。ifconfig 激活時,接口將被打開。
int (*stop)(struct net_device *dev)停止接口。該什麼時候調用呢?
int (*hard_start_xmit) (struct sk_buff*skb, struct net_device *dev)數據發送函數。
設備注冊
網絡接口驅動的注冊方式與字符驅動不同之處在於它沒有主次設備號,並使用如下函數注冊。
int register_netdev(struct net_device *dev )
Linux內核中的每個網絡數據包都由一個套接字緩沖區結構struct sk_buff 描述,即一個sk_buff結構就是一個網絡包,指 sk_buff的指針通常被稱做skb。
該結構包含如下重要成員:
struct device *dev; //處理該包的設備
__u32 saddr; //IP源地址
__u32 daddr; //IP 目的地址
__u32 raddr; //IP路由器地址
sk_buff
unsigned char *head; //分配空間的開始
unsigned char *data; //有效數據的開始
unsigned char *tail; //有效數據的結束
unsigned char *end; //分配空間的結束
unsigned long len; //有效數據的長度
操作sk_buff的內核函數如下:
struct sk_buff *alloc_skb(unsigned int len,int priority)
分配一個sk_buff 結構,供協議棧代碼使用
struct sk_buff *dev_alloc_skb(unsigned intlen)
分配一個sk_buff 結構,供驅動代碼使用
Skb操作函數
unsigned char *skb_push(struct sk_buff*skb, int len) 後移動skb的tail指針,並返回tail移動之前的值。
unsigned char *skb_put(struct sk_buff *skb,int len)前移動skb的head指針,並返回head移動之後的值。
kfree_skb(struct sk_buff *skb)釋放一個sk_buff 結構,供協議棧代碼使用
dev_kfree_skb(structsk_buff *skb)釋放一個sk_buff 結構,供驅動代碼使用