14 Star 9 Fork 0

zhangruoxu/demo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
arp_data.c 9.33 KB
一键复制 编辑 原始数据 按行查看 历史
#include "basetype.h"
#include "common.h"
#include"debug_lib.h"
#include "addr_lib.h"
#include"timer_data.h"
#include "arp_data.h"
#define ARP_NODE_AGING 48
ARP_DEVICE_S g_astArpDevice[DEVICE_MAX_ID];
static UINT32 g_uiTimeId;
VOID CheckArpTimeOut(UINT32 auiPara[4])
{
UINT32 i;
UINT32 NowTime;
UINT8 aucIPAddrString[IPV4_STRING_MAXLEN];
UINT8 aucMacAddrString[MAC_STRING_MAXLEN];
ARP_DEVICE_S* pstDevice;
ARP_NODE_S* pstArpNode, * pstArpTmpNext;
NowTime = TimerData_GetTimeNow();
DebugLib_Printf(MODULE_ARP, "-----------------ArpCheckTimeOut-----------------NowTime: %d-----------------\n", NowTime);
for (i = 0; i < DEVICE_MAX_ID; i++)
{
pstDevice = &g_astArpDevice[i];
if (DEVICE_ID_INVALID == pstDevice->usDeviceId)
{
continue;
}
pstArpNode = g_astArpDevice[i].stArpList.pstNext;
for (;;)
{
if (NULL == pstArpNode)
{
//return NULL;
break;
}
pstArpTmpNext = pstArpNode->pstNext;
if (NowTime >= pstArpNode->uiAgingTime + ARP_NODE_AGING)
{
// DebugLib_Printf(MODULE_ARP, "---------------------------delete---------------------------\n");
AddrLib_InttoDotString(pstArpNode->uiIPv4Addr, aucIPAddrString);
AddrLib_HextoMacString(pstArpNode->aucMacAddr, aucMacAddrString);
DebugLib_Printf(MODULE_ARP, "[delete] ----> DeviceId:%-6d\tIP:%-10s\t\tMAC:%-10s\tIfNum:%-6d\n",
pstDevice->usDeviceId, aucIPAddrString, aucMacAddrString, pstArpNode->usIfNum);
ArpData_DelArp(pstDevice, pstArpNode->uiIPv4Addr, pstArpNode->usIfNum);
}
pstArpNode = pstArpTmpNext;
}
}
DebugLib_Printf(MODULE_ARP, "\n\n");
return;
}
/*
description: 这个函数用于初始化ARP模块,并启动一个定时器用于检查ARP表项是否超时。
input: 无
output: 无
return: 无
tip: 无
*/
VOID ArpData_Init(VOID)
{
UINT32 i;
for (i = 0; i < DEVICE_MAX_ID; i++)
{
g_astArpDevice[i].usDeviceId = DEVICE_ID_INVALID;
}
UINT32 auiPara[4];
g_uiTimeId = TimerData_Add(2, TIMER_FLAG_ROUTINE, auiPara, (pfTimeOutFunc)CheckArpTimeOut);
return;
}
/*
description: 将设备添加到ARP设备列表中。
input:
usDeviceId: 设备ID,一个无符号16位整数。
output: 无
return: 无
tip:无
*/
INT32 ArpData_AddDevice(UINT16 usDeviceId)
{
g_astArpDevice[usDeviceId].usDeviceId = usDeviceId;
g_astArpDevice[usDeviceId].stArpList.pstNext = NULL;
return 0;
}
/*
description: 从ARP设备列表中删除给定ID的设备。
input:
usDeviceId: 要删除的设备的ID,一个无符号16位整数。
output: 无
return: 无
tip: 无
*/
VOID ArpData_DelDevice(UINT16 usDeviceId)
{
g_astArpDevice[usDeviceId].usDeviceId = DEVICE_ID_INVALID;
return;
}
/*
description: 查找指定设备ID的ARP_DEVICE_S结构体。
input:
usDeviceId: 设备ID,一个无符号16位整数。
output:
返回对应设备ID的ARP_DEVICE_S结构体指针。
return:
ARP_DEVICE_S结构体指针。
tip:无
*/
ARP_DEVICE_S* ArpData_FindDevice(UINT16 usDeviceId)
{
return &g_astArpDevice[usDeviceId];
}
/*
description: 添加一条 ARP 记录到指定设备的 ARP 表中。
input:
pstArpDevice: 要添加 ARP 记录的设备的 ARP_DEVICE_S 结构体指针。
uiIPv4Addr: 要添加 ARP 记录的 IP 地址,一个无符号32位整数。
aucMac: 要添加 ARP 记录的 MAC 地址,一个长度为 6 的无符号8位整数数组。
usIfNum: 要添加 ARP 记录的接口编号,一个无符号16位整数。
uiAgingTime: ARP 记录的时效性,一个无符号32位整数。如果值为 0x80000000,则表示这是一个静态 ARP 记录,否则表示这是一个动态 ARP 记录,其值为当前时间。
output: 无
return: 添加成功返回 ERROR_SUCCESS,否则返回 ERROR_NOTENOUGH_MEMORY。
tip:pstArpDevice->stArpList 是指向 ARP_NODE_S 结构体链表头部的指针,链表按照 IP 地址从小到大排序。
*/
INT32 ArpData_AddArp(ARP_DEVICE_S* pstArpDevice, UINT32 uiIPv4Addr, UINT8* aucMac, UINT16 usIfNum, UINT16 uiAgingTime)
{
ARP_NODE_S* pstArpNodeNew;
ARP_NODE_S* pstArpNodePre;
ARP_NODE_S* pstArpNode;
UINT32 uiNowTime = TimerData_GetTimeNow();
pstArpNode = ArpData_FindArp(pstArpDevice, uiIPv4Addr);
if (NULL != pstArpNode)
{
return ERROR_SUCCESS;
}
pstArpNodeNew = malloc(sizeof(ARP_NODE_S));
if (NULL == pstArpNodeNew)
{
return ERROR_NOTENOUGH_MEMORY;
}
pstArpNodeNew->uiIPv4Addr = uiIPv4Addr;
memcpy(pstArpNodeNew->aucMacAddr, aucMac, MAC_BYTE);
pstArpNodeNew->usIfNum = usIfNum;
if (0x80000000 == uiAgingTime)//静态表项
{
pstArpNodeNew->uiAgingTime = uiAgingTime;
}
else//动态表项
{
pstArpNodeNew->uiAgingTime = uiNowTime;
}
pstArpNodePre = &pstArpDevice->stArpList;
pstArpNode = pstArpDevice->stArpList.pstNext;
for (;;)
{
if (NULL == pstArpNode)
{
pstArpNodePre->pstNext = pstArpNodeNew;
pstArpNodeNew->pstNext = NULL;
return ERROR_SUCCESS;
}
if (pstArpNode->uiIPv4Addr > pstArpNodeNew->uiIPv4Addr)
{
pstArpNodePre->pstNext = pstArpNodeNew;
pstArpNodeNew->pstNext = pstArpNode;
return ERROR_SUCCESS;
}
pstArpNodePre = pstArpNode;
pstArpNode = pstArpNode->pstNext;
}
}
/*
description: 从指定设备的 ARP 表中删除一条 ARP 记录。
input:
pstArpDevice: 要删除 ARP 记录的设备的 ARP_DEVICE_S 结构体指针。
uiIPv4Addr: 要删除 ARP 记录的 IP 地址,一个无符号32位整数。
usIfNum: 要删除 ARP 记录的接口编号,一个无符号16位整数。
output: 无
return: 无
tip:pstArpDevice->stArpList 是指向 ARP_NODE_S 结构体链表头部的指针,链表按照 IP 地址从小到大排序。
*/
VOID ArpData_DelArp(ARP_DEVICE_S* pstArpDevice, UINT32 uiIPv4Addr, UINT16 usIfNum)
{
ARP_NODE_S* pstArpNodePre;
ARP_NODE_S* pstArpNode;
pstArpNodePre = &pstArpDevice->stArpList;
pstArpNode = pstArpDevice->stArpList.pstNext;
for (;;)
{
if (NULL == pstArpNode)
{
return;
}
if ((uiIPv4Addr == pstArpNode->uiIPv4Addr) && (usIfNum == pstArpNode->usIfNum))
{
pstArpNodePre->pstNext = pstArpNode->pstNext;
free(pstArpNode);
return;
}
pstArpNodePre = pstArpNode;
pstArpNode = pstArpNode->pstNext;
}
}
/*
description: 在指定设备的 ARP 表中查找指定 IP 地址对应的 ARP 记录。
input:
pstArpDevice: 要查找 ARP 记录的设备的 ARP_DEVICE_S 结构体指针。
uiIPv4Addr: 要查找 ARP 记录的 IP 地址,一个无符号32位整数。
output: 无
return: 如果找到对应的 ARP 记录,则返回对应的 ARP_NODE_S 结构体指针,否则返回 NULL。
tip:pstArpDevice->stArpList 是指向 ARP_NODE_S 结构体链表头部的指针,链表按照 IP 地址从小到大排序。
*/
ARP_NODE_S* ArpData_FindArp(ARP_DEVICE_S* pstArpDevice, UINT32 uiIPv4Addr)
{
ARP_NODE_S* pstArpNode;
UINT32 uiNowTime = TimerData_GetTimeNow();
pstArpNode = pstArpDevice->stArpList.pstNext;
for (;;)
{
if (NULL == pstArpNode)
{
return NULL;
}
if (uiIPv4Addr == pstArpNode->uiIPv4Addr)
{
if (0x80000000 != pstArpNode->uiAgingTime)
{
//如果ARP表项已经存在,刷新其老化时间,重置成最大值.
pstArpNode->uiAgingTime = uiNowTime;
}
return pstArpNode;
}
pstArpNode = pstArpNode->pstNext;
}
}
/*
description: 打印指定设备的 ARP 表中的所有 ARP 记录。
input:
pstArpDevice: 要打印 ARP 记录的设备的 ARP_DEVICE_S 结构体指针。
output: 无
return: 打印成功返回 ERROR_SUCCESS,否则返回 NULL。
tip:pstArpDevice->stArpList 是指向 ARP_NODE_S 结构体链表头部的指针,链表按照 IP 地址从小到大排序。
*/
INT32 ArpData_Print(ARP_DEVICE_S* pstArpDevice)
{
ARP_NODE_S* pstArpNode;
UINT32 uiTimeNow;
UINT8 aucIPAddrString[IPV4_STRING_MAXLEN];
UINT8 aucMacAddrString[MAC_STRING_MAXLEN];
UINT8 aucArpAging[UINT_STRING_MAXLEN] = { 0 };
pstArpNode = pstArpDevice->stArpList.pstNext;
printf("IP Address\t\tMac Address\t\tInterface\tAge\n");
for (;;)
{
if (NULL == pstArpNode)
{
return ERROR_SUCCESS;
}
if (0x80000000 != pstArpNode->uiAgingTime)
{
uiTimeNow = TimerData_GetTimeNow();
AddrLib_InttoDotString(pstArpNode->uiIPv4Addr, aucIPAddrString);
AddrLib_HextoMacString(pstArpNode->aucMacAddr, aucMacAddrString);
sprintf(aucArpAging, "%d", ARP_NODE_AGING + pstArpNode->uiAgingTime - uiTimeNow); // 一定是正数,不可能小于等于 0
printf(" %8s\t\t%6s\t\t%6d\t %6s\n", aucIPAddrString, aucMacAddrString, pstArpNode->usIfNum,
aucArpAging);
}
else
{
printf("%8s\t\t%6s\t\t%6d\t\t%6s\n", aucIPAddrString, aucMacAddrString, pstArpNode->usIfNum,
"forever");
}
pstArpNode = pstArpNode->pstNext;
}
return ERROR_SUCCESS;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zhangruoxudada/demo.git
git@gitee.com:zhangruoxudada/demo.git
zhangruoxudada
demo
demo
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385