14 Star 9 Fork 0

zhangruoxu/demo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
diagnose_processcmd.c 3.45 KB
一键复制 编辑 原始数据 按行查看 历史
zhangruoxu 提交于 2023-05-14 21:53 . arp_send
#include "basetype.h"
#include "common.h"
#include "packet_lib.h"
#include "ethernet_lib.h"
#include "arp_lib.h"
#include "ipv4_lib.h"
#include "icmp_lib.h"
#include "ethernet_lib.h"
#include "addr_lib.h"
#include "timer_data.h"
#include "device_data.h"
#include "route_data.h"
#include "arp_data.h"
/*
* description: 处理ping 命令调用的函数
*
* input:
* WordArray 命令行
* pucModuleName 当前处理模块名, 此参数在此为 NULL
* pucDeviceName 当前设备的名字
*
* output: NULL
* return: 错误码
* tip:根据设备名字获取设备id, 根据设备id获取设备类型, 判断发送ping 命令设备是否正确, 得到命令行中的IP地址
* 并转换为 UINT32 类型
*/
INT32 Diagnose_ProcessCmd(UINT8* pucModuleName, COMMANDLINE_S* WordArray, UINT8* pucDeviceName)
{
UINT32 uiDstIPv4Addr = 0;
INT32 iRet = ERROR_SUCCESS;
UINT16 usDeviceId = DEVICE_ID_INVALID;
UINT16 usDeviceType;
ICMP_TASK_S* pstIcmp_task = NULL;
UINT32 auiPara[4] = { 0 };
if ('\0' == pucDeviceName[0])
{
return ERROR_INVALID_INPUT;
}
usDeviceId = DeviceData_FindByName(pucDeviceName);//根据设备名字获取设备id
if (DEVICE_ID_INVALID == usDeviceId)
{
return ERROR_DEVICE_NOT_EXSIT;
}
usDeviceType = DeviceData_GetType(usDeviceId);//根据设备id获取设备类型
if (DEVICE_TYPE_SWITCH == usDeviceType)
{
return ERROR_INVALID_INPUT;
}
// ping+IP地址或主机域名+命令参数 ping 192.168.1.1 -t
iRet = AddrLib_DotStringtoInt(WordArray->aacCmd[1], &uiDstIPv4Addr);//转换ip地址
if (iRet != ERROR_SUCCESS)
{
//将来转 DNS
printf("Ping request could not find host %s. Please check the name and try again.\n", WordArray->aacCmd[1]);
return iRet;
}
pstIcmp_task = (ICMP_TASK_S*)malloc(sizeof(ICMP_TASK_S));
if (NULL == pstIcmp_task)
{
printf("ERROR: pstIcmp_task is null.\n");
exit(-1);
}
/*
1.ping 转发5次, 这其中的数据(成功/失败, 定时器的id等)保存在 ICMP_TASK_S
2.IcmpTask_init 初始化,seq 从零开始计算
3.在一次 ping 发送之后, 会创建一个 10s 定时器。
1. 如果自己收到回应, 在 icmp_pktprocess.c 中的 pktprocess_RecvICMP 函数会进行处理,并根据 ICMP_TASK_S 中保存的定时器 id 删除定时器
2. 如果自己没收到回应, 在经过 10s 的系统时间后会调用定时器 (具体实现在 processTimeGo 函数中有)
4.不管是否收到回应, 在5次 ping 后都会调用 IcmpTask_print 打印结果
1.自己在第五次收到了回应, 那么就会在 pktprocess_RecvICMP 中调用 IcmpTask_print 打印, 并删除定时器
2.自己5次都收不到, 则定时器超时, 调用 IcmpTask_print 打印 。
[这与4.1并不冲突,因为如果第五次收到了, 定时器删了, 所以后续定时器不会响。如果没有收到 定时器还在,则一定回响]
zhangruoxu
*/
IcmpTask_Init(usDeviceId, pstIcmp_task, uiDstIPv4Addr, NULL);
//printf("pinging %s.\n", WordArray->aacCmd[1]);
Ping(usDeviceId, pstIcmp_task->uiDstIP, pstIcmp_task->usSeq);
auiPara[0] = usDeviceId;
pstIcmp_task->uiTimerId = TimerData_Add(10, TIMER_ID_INVALID, auiPara, IcmpTask_Timeout);
return ERROR_SUCCESS;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zhangruoxudada/demo.git
git@gitee.com:zhangruoxudada/demo.git
zhangruoxudada
demo
demo
master

搜索帮助