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

测试部分

相关推荐
阿拉伯柠檬2 小时前
传输层与传输层协议UDP
linux·网络·网络协议·面试·udp
六个九十度2 小时前
用C语言把BCD编码的数字转换成普通16进制
c语言·bcd
CoderCodingNo2 小时前
【GESP】C++五级真题(数论、埃氏筛思想考点) luogu-B3969 [GESP202403 五级] B-smooth 数
开发语言·c++·算法
历程里程碑2 小时前
破解三数之和:双指针高效解法
c语言·数据结构·c++·经验分享·算法·leetcode·排序算法
Vect__2 小时前
25.12.27 算法日记——双指针
c++·算法
wangchen_03 小时前
C++<fstream> 深度解析:文件 I/O 全指南
开发语言·前端·c++
行稳方能走远3 小时前
Android C++ 学习笔记
android·c++
运维行者_3 小时前
网络流量分析入门:从流量监控与 netflow 看懂核心作用
运维·开发语言·网络·云原生·容器·kubernetes·php
Ccjf酷儿3 小时前
计算机网络 (郑烇) 6 链路层和局域网
网络·计算机网络