代码拉取完成,页面将自动刷新
#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;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。