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核心設計的理念,以...