14 Star 9 Fork 0

zhangruoxu/demo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
arp_lib.c 3.71 KB
一键复制 编辑 原始数据 按行查看 历史
fishobone 提交于 2023-07-24 17:01 . vlan功能完成
#include"basetype.h"
#include"common.h"
#include "packet_lib.h"
/*
description: 这个函数用于编码ARP报文。
input:
pucSrcMac: 发送者MAC地址,指向一个长度为6的无符号8位整数数组。
pucDstMac: 接收者MAC地址,指向一个长度为6的无符号8位整数数组。
uiSrcIPv4Addr: 发送者IPv4地址,一个32位无符号整数。
uiDstIPv4Addr: 接收者IPv4地址,一个32位无符号整数。
ucOpCode: 操作类型,一个无符号8位整数。
pucBuffer: 指向用于存储编码后ARP报文的无符号8位整数数组。
output:
返回编码后ARP报文的长度,一个无符号16位整数。
return:
返回编码后ARP报文的长度,一个无符号16位整数。
tip:无
*/
UINT16 ArpLib_EncodeArp(UINT8* pucSrcMac, UINT8* pucDstMac,
UINT32 uiSrcIPv4Addr, UINT32 uiDstIPv4Addr, UINT8 ucOpCode,
UINT8* pucBuffer)
{
UINT8* pucPointer = pucBuffer;
pucPointer = pucPointer + ETHERHEAD_OFFSET_LENGTH;
UINT16 Hardware_Type = 0x0001;//以太硬件类型
*pucPointer = (Hardware_Type & 0xFF00) >> 8;
pucPointer++;
*pucPointer = (Hardware_Type & 0x00FF);
pucPointer++;
//memcpy(pucPointer, &Hardware_Type, Hardware_Type_LEN);
//pucPointer += Hardware_Type_LEN;
*pucPointer = (ETHERNET_PROTOCOL_IPV4 & 0xFF00) >> 8;//上层协议类型
pucPointer++;
*pucPointer = (ETHERNET_PROTOCOL_IPV4 & 0x00FF);
pucPointer++;
*pucPointer = MAC_BYTE;//MAC地址长度 6
pucPointer++;
*pucPointer = IPV4_BYTE;//IP地址长度 4
pucPointer++;
*pucPointer = (ucOpCode & 0xFF00) >> 8;
pucPointer++;
*pucPointer = (ucOpCode & 0x00FF);
pucPointer++;
//memcpy(pucPointer, &ucOpCode, 2); //操作类型
//pucPointer += 2;
memcpy(pucPointer, pucSrcMac, MAC_BYTE);
pucPointer += MAC_BYTE;
memcpy(pucPointer, PacketLib_Displacement(uiSrcIPv4Addr), IPV4_BYTE);
pucPointer += IPV4_BYTE;
memcpy(pucPointer, pucDstMac, MAC_BYTE);
pucPointer += MAC_BYTE;
memcpy(pucPointer, PacketLib_Displacement(uiDstIPv4Addr), IPV4_BYTE);
pucPointer += IPV4_BYTE;
return 28;
}
/*
description: 这个函数用于解码ARP报文。
input:
pstArpHeader: 指向ARP头部结构体的指针。
pucBuffer: 指向需要解码的ARP报文的无符号8位整数数组。
usPacketLen: ARP报文的长度,一个无符号32位整数。
output: 无
return: 无
tip:无
*/
VOID ArpLib_DecodeArp(ARPHEAD_S* pstArpHeader, UINT8* pucBuffer, UINT32 usPacketLen)
{
UINT8* pucPointer = pucBuffer;
// 参数 报文长度 usPacketLen
if (usPacketLen < 42)
{
printf("Arp header message length error\n");
exit(-1);
}
if (42 == usPacketLen)
{
pucPointer = pucPointer + ETHERHEAD_OFFSET_LENGTH;
}
else
{
pucPointer = pucPointer + ETHERHEAD_OFFSET_LENGTH + 4;//加上vlan的4字节
}
//硬件类型
pstArpHeader->Hardware_Type_LEN = ((UINT16)(*pucPointer) << 8);
pucPointer++;
pstArpHeader->Hardware_Type_LEN += (UINT16)(*pucPointer);
pucPointer++;
//协议类型
pstArpHeader->Treaty_Type_LEN = ((UINT16)(*pucPointer) << 8);
pucPointer++;
pstArpHeader->Treaty_Type_LEN += (UINT16)(*pucPointer);
pucPointer++;
//硬件地址长度
pstArpHeader->MAC_LEN = (*pucPointer);
pucPointer++;
//协议地址长度
pstArpHeader->IP_LEN = (*pucPointer);
pucPointer++;
//操作类型
pstArpHeader->ucOpCode = (UINT16)(*pucPointer << 8);
pucPointer++;
pstArpHeader->ucOpCode += (UINT16)(*pucPointer);
pucPointer++;
//源MAC地址
memcpy(pstArpHeader->pucSrcMac, pucPointer, MAC_BYTE);
pucPointer += MAC_BYTE;
//源IP地址
pstArpHeader->uiSrcIPv4Addr = PacketLib_Undisplacement(pucPointer);
pucPointer += IPV4_BYTE;
//目的MAC地址
memcpy(pstArpHeader->pucDstMac, pucPointer, MAC_BYTE);
pucPointer += MAC_BYTE;
//目的IP地址
pstArpHeader->uiDstIPv4Addr = PacketLib_Undisplacement(pucPointer);
pucPointer += IPV4_BYTE;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zhangruoxudada/demo.git
git@gitee.com:zhangruoxudada/demo.git
zhangruoxudada
demo
demo
master

搜索帮助