解析数据报文时写了几个调试打印输出的小函数
print_common.h
#ifndef PRINT_COMMON_H
#define PRINT_COMMON_H
#ifdef __KERNEL__
#else
#define printk printf
typedef 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