调试打印ethhdr,iphdr,tcphdr和指定长度的内存块

本文介绍了在解析数据报文过程中,为调试而编写的针对ethhdr, iphdr, tcphdr结构体的打印函数,用于输出指定长度的内存块信息。" 106113993,5671999,Pytest与Allure实战:命令详解与报告生成,"['python', '软件测试', '自动化测试', '测试工具', '报告生成']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解析数据报文时写了几个调试打印输出的小函数


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值