手写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);
}

测试部分

相关推荐
2401_8414956413 分钟前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr26 分钟前
2607C++,soui与安卓
c++·soui
andxe2 小时前
安科士 AndXe 技术博客:400G QSFP112 SR4 光模块|AI 算力与超算短距互联最优方案
网络·人工智能·光模块·光通信
shiyi.十一3 小时前
第2章:应用层 — 知识要点与架构
网络·计算机网络·架构
DFT计算杂谈4 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
fqbqrr4 小时前
2607C++,使用微软detours勾挂工具
c++
人邮异步社区4 小时前
怎么把C语言学到精通?
c语言·开发语言
中微极客6 小时前
2026主流AI Agent框架技术选型与性能对比
运维·网络·人工智能
蓝悦无人机7 小时前
C++基础 — 函数总结
开发语言·c++
我不是懒洋洋8 小时前
从零实现一个分布式监控:Prometheus的核心设计
c++