Linux内核数据包格式
生活随笔
收集整理的這篇文章主要介紹了
Linux内核数据包格式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
LInux kernel中MAC頭,IP頭,TCP頭結(jié)構(gòu)體定義,內(nèi)核打印方式。
?
MAC頭:
//內(nèi)核中MAC頭結(jié)構(gòu)體 #defein ETH_ALEN 6 struct ethhdr {unsigned char h_dest[ETH_ALEN]; //48位目的MAC地址 unsigned char h_source[ETH_ALEN]; //48位源MAC地址__be16 h_proto; //16位協(xié)議類型 } __attribute__((packed));?
//有這樣兩個宏可以方便地打印mac地址: #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地址結(jié)構(gòu)體 struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD)__u8 ihl:4, version:4; #elif defined (__BIG_ENDIAN_BITFIELD)__u8 version:4, //4位版本號ihl:4; //4位首部長度 #else #error "Please fix <asm/byteorder.h>" #endif__u8 tos; //8位服務(wù)類型__be16 tot_len; //16位總長度__be16 id; //16位標(biāo)識__be16 frag_off; //3位標(biāo)志,13位片偏移__u8 ttl; //8位生存時間__u8 protocol; //8位協(xié)議__sum16 check; //16位首部校驗和__be32 saddr; //32位源地址__be32 daddr; //32位目的地址/*The options start here. */ }; //打印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結(jié)構(gòu)體 struct tcphdr {__be16 source; //16位源端口號__be16 dest; //16位目的端口號__be32 seq; //32位序號__be32 ack_seq; //32位確認(rèn)序號 #if defined(__LITTLE_ENDIAN_BITFIELD)__u16 res1:4,doff:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,cwr:1; #elif defined(__BIG_ENDIAN_BITFIELD)__u16 doff:4,res1:4,cwr:1,ece:1,urg:1,ack:1,psh:1,rst:1,syn:1,fin:1; #else #error "Adjust your <asm/byteorder.h> defines" #endif__be16 window;__sum16 check;__be16 urg_ptr;}; //打印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位的主機字節(jié)序轉(zhuǎn)換到網(wǎng)絡(luò)字節(jié)序 uint16_t htons(uint16_t hostshort);//16位的主機字節(jié)序轉(zhuǎn)換到網(wǎng)絡(luò)字節(jié)序 uint32_t ntohl(uint32_t netlong);//32位的網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換到主機字節(jié)序 uint16_t ntohs(uint16_t netshort);//16位的網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換到主機字節(jié)序?
總結(jié)
以上是生活随笔為你收集整理的Linux内核数据包格式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【leetcode】剑指 Offer 2
- 下一篇: 看直播显示服务器崩溃,迪丽热巴直播,把服