手写TCP/IP协议——实现ping的响应

理论部分

本课程中ICMP主要负责2项任务:检查连通性,差错报告,交换路由器之间的信息通信码

代码实现部分

在xnet_tinny.h中添加ICMP协议

cpp 复制代码
typedef enum _xnet_protocol_t
{
	XNET_PROTOCOL_ARP = 0x0806,
	XNET_PROTOCOL_IP = 0x0800,
	XNET_PROTOCOL_ICMP = 1,
}xnet_protocol_t;

xnet_tinny.c中IP协议处理中向上层协议交付可添加ICMP协议的处理部分

cpp 复制代码
#define xipaddr_from_buf(dest,buf) ((dest)->addr = *(uint32_t*)(buf))


switch (iphdr->protocol)
	{
	case XNET_PROTOCOL_ICMP:
		remove_header(packet, header_size);
		ximcp_in(&src_ip, packet);
	default:
		break;
	}

接下来实现xicmp_in函数

铺垫工作:

cpp 复制代码
void xicmp_init(void);
void xicmp_in(xipaddr_t* src_ip, xnet_packet_t* packet);
cpp 复制代码
void xnet_init(void)
{
	ethernet_init();
	xarp_init();
	xip_init();
	xicmp_init();
}

ICMP数据包格式

cpp 复制代码
typedef struct _xicmp_hdr_t
{
	uint8_t type;
	uint8_t code;
	uint16_t checksum;
	uint16_t id;
	uint16_t seq;
}xicmp_hdr_t;
cpp 复制代码
#define XICMP_CODE_ECHO_REQUEST  8    //ICMP回显请求
#define XICMP_CODE_ECHO_REPLY    0    //ICMP回显响应

xicmp_in函数实现:

cpp 复制代码
void xicmp_in(xipaddr_t* src_ip, xnet_packet_t* packet)
{
	xicmp_hdr_t* icmphdr = (xicmp_hdr_t*)packet->data;
	
	if ((packet->size >= sizeof(xicmp_hdr_t)) && (icmphdr->type == XICMP_CODE_ECHO_REQUEST))
		reply_icmp_request(icmphdr, src_ip, packet);
}

reply_icmp_request函数实现:

cpp 复制代码
static xnet_err_t reply_icmp_request(xicmp_hdr_t* icmp_hdr, xipaddr_t* src_ip, xnet_packet_t* packet)
{
	xicmp_hdr_t* reply_hdr;
	xnet_packet_t* tx = xnet_alloc_for_send(packet->size);

	reply_hdr = (xicmp_hdr_t*)tx->data;
	reply_hdr->type = XICMP_CODE_ECHO_REPLY;
	reply_hdr->code = 0;
	reply_hdr->id = icmp_hdr->id;
	reply_hdr->seq = icmp_hdr->seq;
	reply_hdr->checksum = 0;
	memcpy(((uint8_t*)reply_hdr) + sizeof(xicmp_hdr_t), ((uint8_t*)icmp_hdr) + sizeof(xicmp_hdr_t),
		packet->size - sizeof(xicmp_hdr_t));
	reply_hdr->checksum = checksum16((uint16_t*)reply_hdr, tx->size, 0, 1);

	return xip_out(XNET_PROTOCOL_ICMP, src_ip, tx);
}

测试部分

相关推荐
YuMiao4 小时前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
肆忆_1 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星1 天前
虚函数表:C++ 多态背后的那个男人
c++
Jony_3 天前
高可用移动网络连接
网络协议
端平入洛3 天前
delete又未完全delete
c++
chilix3 天前
Linux 跨网段路由转发配置
网络协议
祈安_3 天前
C语言内存函数
c语言·后端
端平入洛4 天前
auto有时不auto
c++
DianSan_ERP5 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
norlan_jame5 天前
C-PHY与D-PHY差异
c语言·开发语言