如何在uboot中添加ping命令
答案:3 悬赏:80 手机版
解决时间 2021-01-03 18:25
- 提问者网友:姑娘长的好罪过
- 2021-01-03 15:39
如何在uboot中添加ping命令
最佳答案
- 五星知识达人网友:空山清雨
- 2021-01-03 16:52
首先icmp和arp是没有关系的!icmp承载于网络层他的协议号好像是1,其中有8种类型比如host不可达、超时等这是用来测试网络连通性的一种控制信息协议。ARP是以太网技术中最重要的一种协议地址解析协议,它承载于osi第二层类型号好像是806,因为以太网是多路访问的一种,所以为了解析其以太网物理MAC地址必须要用ARP协议,这种协议发送的request包中目标MAC地址为全1广播地址,reply包以自己的mac和IP地址为源,目标地址以目标主机MAC和IP地址为目标封装成帧后发送出去!虽然说它是链路层协议,但是他有网络层的概念IP地址,我抓包看到过ARP协议中有协议类型800这是IP协议的类型,因为他要用IP地址来解析MAC地址,所以每个网络层以上的设备都会有基于ARP的缓存,路由交换设备中的命令是showarp!windows中的命令是arp-a,有了这种缓存大大提高了互联网访问速度!好了说了这么多可能楼主认为我说的是废话!那么我就开始所问所答了!第一,ping命令是ICMP的一种形式,它属于ICMP,当然tracert也属于ICMP!ICMP与ARP没有任何关系,一个是网络层协议,一个是数据链路层协议!在功能方面上也没有什么交集的地方,唯一共同点就是都涉及IP地址。第二,我不会写什么UBOOT代码,但是既然承载在internet上那么他就应该遵循网络体系结构为了让网络统一化,IEEE和国际标准化组织iso统一定义了接入层及上层协议标准!当你ping时会发送ARP帧是因为你在以太网的环境中,为什么会发送ARP是因为在计算机刚刚启动的时候是没有对方主机的通信地址的!ping是为了测试与对方主机的连通性,所以需要知道对方主机的地址虽然你知道了目的的IP地址,但还需要其MAC地址,所以在ping之前就会发送ARP帧,主机中ARP默认缓存老化时间应该是10分钟。也就是说,自ARP解析10分钟后ARP缓存条目会自动清除。第三,arp帧发送和恢复确实不一样!一个用广播一个是单播好了!不管我写的是不是废话!辛辛苦苦写了这些不容易啊!接下来就看LZ你的了!^_^!
全部回答
- 1楼网友:天凉才是好个秋
- 2021-01-03 17:15
NetLoop函数调用的PingStart()函数。
static void PingStart(void)
{
#if defined(CONFIG_NET_MULTI)//这个我们不用理
printf ("Using %s device\n", eth_get_name());
#endif
NetSetTimeout (10 * CFG_HZ, PingTimeout);
NetSetHandler (PingHandler);
PingSend();
}
第一、CFG_HZ
在fs2410.h中,我们队CFG_HZ的定义如下:
#define CFG_HZ 1562500,看看smdk2410开发板的作者是怎么注释的
//the PWM TImer 4 uses a counter of 15625 for 10 ms, so we need it to wrap 100 times
//(total 1562500) to get 1 sec.
fs2410.h就是仿smdk2410.h改写的,所以这个值没变,
这个时间应该就是cpu查询CS8900的时间间隔,通过定时的查询检查是否收到数据包。
第二、NetSetTimeout 函数
下面让我们来看看NetSetTimeout 这个函数:
void
NetSetTimeout(ulong iv, thand_f * f)
{
if (iv == 0) {
timeHandler = (thand_f *)0;
} else {
timeHandler = f;
timeStart = get_timer(0);
timeDelta = iv;
}
}
在NetSetTimeout函数中,因为CFG_HZ不为0,所以执行else分支。
timeHandler 的定义如下(定义在net.c中):
static thand_f *timeHandler; // Current timeout handler
而thand_f的定义如下(定义在net.h中)
typedef void thand_f(void);//thand_f是一个无参数无返回的函数,typedef的作用是定义一种类型,例如上面的static thand_f *timeHandler就相当于static void (*thand_f)(void)即定义了一个函数型指针,所谓函数型指针就是指向函数入口地址的指针。
NetSetTimeout函数的参数2也是一个指向函数的指针,这个函数将指向PingTimeout函数,timeHandler=f其实是调用了PingTimeout函数。这个函数内容如下:
static void
PingTimeout (void)
{
eth_halt();
NetState = NETLOOP_FAIL;
}
显然PingTimeout 使CS8900停止工作,并将NetState赋值为NETLOOP_FAIL表示没有收到应答
随后将当前时间赋给timeStart,并或的时间的间隔值
这个函数:NetSetHandler (PingHandler);调用了PingHandler函数。PingHandler函数将ping的ip地址和返回的ip数据报的ip地址进行对标,如果相同则执行该语句NetState = NETLOOP_SUCCESS;
三、pingSend函数
这个函数不在分析,函数的功能是组建ARP请求报文并发送
- 2楼网友:夜余生
- 2021-01-03 17:07
首先icmp和arp是没有关系的!icmp承载于网络层他的协议号好像是1,其中有8种类型比如host不可达、超时等这是用来测试网络连通性的一种控制信息协议。ARP是以太网技术中最重要的一种协议地址解析协议,它承载于osi第二层类型号好像是806,因为以太网是多路访问的一种,所以为了解析其以太网物理MAC地址必须要用ARP协议,这种协议发送的request包中目标MAC地址为全1广播地址,reply包以自己的mac和IP地址为源,目标地址以目标主机MAC和IP地址为目标封装成帧后发送出去!虽然说它是链路层协议,但是他有网络层的概念IP地址,我抓包看到过ARP协议中有协议类型800这是IP协议的类型,因为他要用IP地址来解析MAC地址,所以每个网络层以上的设备都会有基于ARP的缓存,路由交换设备中的命令是showarp!windows中的命令是arp-a,有了这种缓存大大提高了互联网访问速度!好了说了这么多可能楼主认为我说的是废话!那么我就开始所问所答了!第一,ping命令是ICMP的一种形式,它属于ICMP,当然tracert也属于ICMP!ICMP与ARP没有任何关系,一个是网络层协议,一个是数据链路层协议!在功能方面上也没有什么交集的地方,唯一共同点就是都涉及IP地址。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯