Linux核心資料報格式

2021-10-01 07:20:33 字數 1829 閱讀 9953

linux kernel中mac頭,ip頭,tcp頭結構體定義,核心列印方式。

mac頭:

//核心中mac頭結構體

#defein eth_alen 6

struct ethhdr __attribute__((packed));

#define mac_fmt "%02x:%02x:%02x:%02x:%02x:%02x"

#define mac_arg(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]

//使用樣例如下:

const struct ethhdr* eh = eth_hdr(skb);

printk(kern_info "source mac:" mac_fmt "\n", mac_arg(eh->h_source));

printk(kern_info "dest mac:" mac_fmt "\n", mac_arg(eh->h_dest));

ip頭:

//linux kernel中ip位址結構體

struct iphdr ;

//列印ip位址

#define nipquad(addr) \

((unsigned char *)&addr)[0], \

((unsigned char *)&addr)[1], \

((unsigned char *)&addr)[2], \

((unsigned char *)&addr)[3]

struct iphdr *nh;

struct sk_buff *skb;

nh = ip_hdr(skb);

printk(kern_info "src: %u.%u.%u.%u, dst: %u.%u.%u.%u\n",

nipquad(nh->saddr), nipquad(nh->daddr));

tcp頭定義:

//linux kernel 中tcp結構體

struct tcphdr ;

//列印tcp埠號

const struct tcphdr* th = tcp_hdr(skb);

printk(kern_info "src_port: %d, dst_port: %d\n",

ntohs(th->source), ntohs(th->dest));

uint32_t htonl(uint32_t hostlong);//32位的主機位元組序轉換到網路位元組序 

uint16_t htons(uint16_t hostshort);//16位的主機位元組序轉換到網路位元組序

uint32_t ntohl(uint32_t netlong);//32位的網路位元組序轉換到主機位元組序

uint16_t ntohs(uint16_t netshort);//16位的網路位元組序轉換到主機位元組序

Linux核心資料報處理流程 資料報接收 2

四 網絡卡的資料接收 核心如何從網絡卡接受資料,傳統的經典過程 1 資料到達網絡卡 2 網絡卡產生乙個中斷給核心 3 核心使用i o指令,從網絡卡i o區域中去讀取資料 我們在許多網絡卡驅動中,都可以在網絡卡的中斷函式中見到這一過程。但是,這一種方法,有一種重要的問題,就是大流量的資料來到,網絡卡會...

Linux核心資料報處理流程 資料報接收 3

五 佇列層 1 軟中斷與下半部 當用中斷處理的時候,為了減少中斷處理的工作量,比如,一般中斷處理時,需要遮蔽其它中斷,如果中斷處理時間過長,那麼其它中斷 有可能得不到及時處理,也以,有一種機制,就是把 不必馬上處理 的工作,推遲一點,讓它在中斷處理後的某乙個時刻得到處理。這就 是下半部。下半部只是乙...

Linux核心資料結構

一 概述 linux核心提供了一些常用的資料結構並建議開發者盡量重用,而不需要再去實現一些類似的資料結構。這篇部落格主要描述一下linux核心提供的鍊錶 佇列 對映及二叉樹這四種常用資料結構。當然這裡提到的每一種資料結構要說清楚都需要不少的篇幅,而這篇博文只是簡要分析一下linux核心設計的理念,以...