深入理解linux網路內幕 API總結

2021-06-26 21:59:47 字數 2974 閱讀 8599

1. unsigned char *skb_put(struct sk_buff *skb, unsigned int len)

新增資料到sk_buff的尾部(tail)

2.unsigned char *skb_push(struct sk_buff *skb, unsigned int len)

新增資料到sk_buff的頭部,

3. unsigned char *skb_pull(struct sk_buff *skb, unsigned int len)

//從sk_buffer的開始移除資料,skb_pull和skb_push時相反的過程

4. void skb_reserve(struct sk_buff *skb, int len)  

//預留空間,只能針對空buffer有效

5. struct sk_buff *alloc_skb(unsigned int size,gfp_t priority)

//分配乙個緩衝區

6.struct sk_buff *netdev_alloc_skb(struct net_device *dev,

unsigned int length)

//特定網路裝置驅動用於在中斷處理函式中,分配乙個緩衝區,

7. void kfree_skb(struct sk_buff *skb)

//減少skb_buffer的引用計數,如果為0,則釋放記憶體

8. void skb_queue_head_init(struct sk_buff_head *list) //初始化緩衝區佇列

void skb_queue_head(struct sk_buff_head *list, struct sk_buff *newsk)//把sk_buffer放在佇列頭部

void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk)//把sk_buffer放在佇列尾部

struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list)//從佇列尾部獲取sk_buffer

struct sk_buff *skb_dequeue(struct sk_buff_head *list)//從佇列頭部獲取sk_buffer

skb_queue_walk(queue,skb)

9.給裝置新增多播位址

int dev_mc_add(struct net_device *dev, const unsigned char *addr)

int dev_mc_del(struct net_device *dev, const unsigned char *addr)

10.分配net_device裝置

struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,

void (*setup)(struct net_device *),

unsigned int txqs, unsigned int rxqs)

alloc_netdev和alloc_netdev_mq是此函式的封裝

11 net_device傳送佇列開啟/關閉

void netif_tx_start_all_queues(struct net_device *dev)//清除標誌位

void netif_wake_subqueue(struct net_device *dev, u16 queue_index)//清除標誌位,並重新排程

void netif_tx_stop_all_queues(struct net_device *dev)

void netif_stop_subqueue(struct net_device *dev, u16 queue_index)//停止某乙個佇列

void __netif_schedule(struct qdisc *q) //add a tx task,and raise softtx irq

2.6.26之前的api介面是

void netif_start_queue(struct net_device *dev)

void netif_stop_queue(struct net_device *dev)

12.傳送資料

int dev_queue_xmit(struct sk_buff *skb)//最終通過net_device的ndo_start_xmit傳送出去

13.獲取網路裝置

//通過網路裝置名字獲取

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

//通過網路裝置index獲取

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

14.開啟裝置傳輸載波功能

void netif_carrier_off(struct net_device *dev)

void netif_carrier_on(struct net_device *dev)

15.irq相關函式

__raise_softirq_irqoff(unsigned int nr)//標記軟中斷為未決狀態

raise_softirq_irqoff(unsigned int nr)//標記軟體中斷為未決狀態,如果為非interrupt上下文,則喚醒softirqd

local_bh_enable() //使能cpu下部分中斷

local_bh_disable()//關閉cpu下部分中斷

in_interrupt()//判斷是否為硬中斷和軟體中斷上下文

in_irq()//判斷是否為硬中斷上下文

preempt_disabel() //禁止搶占

preempt_enable() //使能搶占

《深入理解Linux網路技術內幕》閱讀筆記(五)

通過中斷,nic能夠告知其驅動程式幾種不同的事情,包括 1.接收一幀。2.傳輸失敗。3.dma傳輸已成功完成。給定乙個幀傳輸,當幀上載至nic的記憶體準備在此媒介上傳輸時,驅動程式就會將持有該幀的緩衝區釋放掉。使用同步傳輸時 無dma 當該幀已上傳至nic,驅動程式就會立刻知道。但使用dma時,也就...

《深入理解Linux網路技術內幕》閱讀筆記(六)

pci的優點之一是,其支援尋找irq和每個裝置所需的其他資源的探測方式相當優雅。模組可以在載入期間接收一些輸入引數,以告知該如何配置其所負責的所有裝置。但是,有些時候,特別是pci這類匯流排,讓驅動程式自行檢查系統上的裝置,然後為其負責的那些裝置做配置會比較簡單一點。必要時,可以退回到手動配置。探測...

《深入理解Linux網路技術內幕》閱讀筆記(九)

當特定事件發生時,裝置驅動程式會代表核心指示裝置產生硬體中斷。處理函式會把該幀排入佇列某處,然後通知核心。該技術是低流量負載下的最佳選擇。遺憾的是,在高流量負載下就無法良好運作 每接收乙個幀就強制產生中斷,很快就會讓cpu為處理中斷事件浪費所有的時間。負責接收幀的 分成兩部分,首先,驅動程式把該幀拷...