调试打印ethhdr,iphdr,tcphdr和指定长度的内存块
来源:互联网 发布:火花棱镜淘宝 编辑:程序博客网 时间:2024/04/30 23:56
解析数据报文时写了几个调试打印输出的小函数
print_common.h
#ifndef PRINT_COMMON_H#define PRINT_COMMON_H#ifdef __KERNEL__#else#define printk printftypedef enum{false, true}bool;#endif#define NIPQUAD(addr) \((unsigned char *)&addr)[0], \((unsigned char *)&addr)[1], \((unsigned char *)&addr)[2], \((unsigned char *)&addr)[3]static inline void print_ethdr(const struct ethhdr *mach, const unsigned char *level){printk("%s" "MAC:h_dest[%02x:%02x:%02x:%02x:%02x:%02x],h_source[%02x:%02x:%02x:%02x:%02x:%02x],h_proto[%u]\n", level, mach->h_dest[0], mach->h_dest[1], mach->h_dest[2],mach->h_dest[3],mach->h_dest[4],mach->h_dest[5], mach->h_source[0],mach->h_source[1],mach->h_source[2],mach->h_source[3],mach->h_source[4],mach->h_source[5], mach->h_proto);return;}static inline void print_iphdr(const struct iphdr *iph, const unsigned char *level){printk("%s" "IP:version[%u],ihl[%u],tos[%u],tot_len[%u]," "id[%u],frag_off[%u],ttl[%u],protocol[%u]," "check[%u],saddr[%u.%u.%u.%u],daddr[%u.%u.%u.%u]\n", level, iph->version,iph->ihl,iph->tos,ntohs(iph->tot_len), iph->id,iph->frag_off,iph->ttl,iph->protocol, iph->check,NIPQUAD(iph->saddr),NIPQUAD(iph->daddr));return;}static inline void print_tcphdr(const struct tcphdr *tcph, const unsigned char *level){printk("%s" "TCP:source[%u],dest[%u],seq[%u],ack_seq[%u]," "res1[%u],doff[%u],fin[%u],syn[%u],rst[%u]," "psh[%u],ack[%u],urg[%u],ece[%u],cwr[%u]," "window[%u],check[%u],urg_ptr[%u]\n",level, ntohs(tcph->source),ntohs(tcph->dest),ntohl(tcph->seq),ntohl(tcph->ack_seq), tcph->res1,tcph->doff,tcph->fin,tcph->syn,tcph->rst, tcph->psh,tcph->ack,tcph->urg,tcph->ece,tcph->cwr, tcph->window,tcph->check,tcph->urg_ptr);return;}static inline void print_nlhdr(const struct nlmsghdr *nlhdr, const unsigned char *level){printk("%s" "nlhdr:nlmsg_len[%u],nlmsg_type[%u],nlmsg_flags[%u],nlmsg_seq[%u],nlmsg_pid[%u]\n", level, nlhdr->nlmsg_len, nlhdr->nlmsg_type, nlhdr->nlmsg_flags, nlhdr->nlmsg_seq, nlhdr->nlmsg_pid);return;}static unsigned char print_block_m[128];static unsigned char print_block_c[64];static bool can_print[128] = {false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false};static inline void print_memory(unsigned char *ptr, unsigned int len, unsigned char *prefix){register unsigned int loop = 0;register unsigned int m = 0;register unsigned int c = 0;/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */for (loop = 0; loop < len; loop++) {if (loop % 16 == 0) {m += sprintf(print_block_m + m, "%p ", ptr+loop);c += sprintf(print_block_c + c, "\t ");}m += sprintf(print_block_m + m, "%02x ", ptr[loop]);c += sprintf(print_block_c + c, "%c", can_print[ptr[loop]] ? ptr[loop] : '?');if (loop && (loop + 1) % 8 == 0) {m += sprintf(print_block_m + m, " ");if ((loop + 1) % 16 == 0) {print_block_m[m] = '\0';print_block_c[c] = '\0';printk("%s%s\n", prefix, print_block_m);printk("%s%s\n", prefix, print_block_c);m = 0;c = 0;}}}printk("%s\n", prefix);}#endif
0 0
- 调试打印ethhdr,iphdr,tcphdr和指定长度的内存块
- struct ethhdr、ether_header、iphdr、tcphdr、udphdr
- struct ethhdr、ether_header、iphdr、tcphdr、udphdr
- struct ethhdr、ether_header、iphdr、tcphdr、udphdr 收藏
- struct ethhdr、ether_header、iphdr、tcphdr、udphdr
- struct ethhdr、ether_header、iphdr、tcphdr、udphdr
- ethhdr、ether_header、iphdr、tcphdr、udphdr 结构介绍
- struct ethhdr、ether_header、iphdr、tcphdr、udphdr
- ethhdr、ether_header、iphdr、tcphdr、udphdr 结构介绍
- struct ethhdr、ether_header、iphdr、tcphdr、udphdr
- ethhdr、iphdr、tcphdr、udphdr等结构体
- 网络包几种格式struct ethhdr、ether_header、iphdr、tcphdr、udphdr
- struct ethhdr、ether_header、iphdr、tcphdr、udphdr结构体定义
- 网络包几种格式ethhdr、ether_header、iphdr、tcphdr、udphdr
- 网络包几种格式struct ethhdr、ether_header、iphdr、tcphdr、udphdr
- [struct--iphdr -- IP头部]与[tcphdr结构]
- struct--iphdr sk_buff->tcphdr -- IP头部
- iphdr与tcphdr详解(skb_header_pointer函数分析)
- android studio中图片格式的问题
- 关于C语言中二维数组的P+1与*(P+1)个人浅见
- Spring Security Remember Me Example
- 15款开源PHP类库
- linux命令大全
- 调试打印ethhdr,iphdr,tcphdr和指定长度的内存块
- 查看二进制中1的个数
- startActivityForResult用法
- A2DP Sink, AVRCP Controller and HFP Client in Android L
- STL中的set和multiset学习小记
- 欢迎使用CSDN-markdown编辑器
- MP3头部结构体定义(一)
- Extjs4 之单元格编辑 获取列的对象
- POJ - 1018 Communication System