调试打印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