- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
vxworks 对于arp的处理
vxworks 对于arp的处理
默认分类 2010-05-22 23:54:15 阅读144 评论0 ??字号:大中小?订阅
虽然是vxworks2.0.2版本中的,但是与老土的BSD代码基本一样,事实上,最新的ip协议栈的代码上虽然加上不少新鲜的功能,但是其主体也依旧一样.
ifnet
也就是协议栈中的接口的概念,跟arp相关处理的最重要的三个成员是:
if_ioctl 用于接口上的ioctl命令;
if_resolve 用于进行地址解析的函数;
if_output 用于在接口上发送数据包;
在ipAttach时,这三个值都进行了初始化:
?? ?pIfp-if_ioctl ?= (FUNCPTR) ipIoctl;
?? ?pIfp-if_output = ipOutput;
?? ?pIfp-if_resolve = muxAddrResFuncGet(mib2Tbl.ifType, 0x800);
其中if_resolve的值,实际上就是arpresolve函数.
in_ifaddr
in_ifaddr是ifaddr的一种特殊形式,即ipv4版本的的ifaddr.当我们给接口配置ip地址时,实际上要生成一个in_ifaddr结构体,并与ifnet相关联.那么它与arp最相关的内容实际上是在ifaddr结构体中,它们是:
ifa_rtrequest 这是一个处理arp相关的函数,在后面我们就会解释到它的用处.
ia_ifp 与地址相关联的接口.
sockaddr_dl
数据链路层地址,它的作用就是保存MAC地址,其中与ARP处理相关的内容包括:
sdl_len 长度,如果为0,表示mac信息无效,否则就是有效.这点很重要
sdl_data 如果有效,保存有mac信息.
llinfo_arp
它就是arp控制结构,整个系统中的llinfo_arp通过一个双向链表连接起来,链表头就是全局变量llinfo_arp.(C语言中,总是喜欢将全局变量定义成结构体的名字).其中现在我们关心的内容包括
la_rt 指向相关的rtentry,关于rtentry,后面马上就要讲到了.
la_hold 持有的数据,在arp处理中会使用到,现在只知道它是要通过接口发送的数据包;
la_asked 计数,用于统计在接收到arp回应前,发出了多少arp请求.
rtentry
路由表项,每一条路由都由一个rtentry表示,与arp相关的内容包括
rt_ifp 与路由相关联的接口;
rt_ifa 与路由相关的接口地址;
rt_genmask 用于clone路由时使用;
rt_llinfo 指向arp控制结构
rt_gateway 表示下一跳信息,可能保存mac地址.
rt_expire arp超时处理使用,如果为0,表示永久有效(用于静态配置的mac).
route
route数据结构主要用于路由处理,它包括两个成员:
ro_rt 路由引用的rtentry
ro_dst 目的地址
数据的发送过程
ip_output
ip协议栈发送数据总是以
int
ip_output(m0, opt, ro, flags, imo)
struct mbuf *m0;
struct mbuf *opt;
struct route *ro;
int flags;
struct ip_moptions *imo;
函数调用开发的,对于其中一些特殊情况的处理我们就不会加以描述,我们只对普通情况说明.m0表示要发送的数据,而ro就是发送的路由.ip_output在进行了一大堆的事情之后,就会调用
(*ifp-if_output)(ifp, m,
? ?(struct sockaddr *)dst, ro-ro_rt);
发送数据,其中ifp就是根据路由或者什么的,找到的要outgoing接口.前面我们说过,ipAttach时,就已经指定了if_output为ipOutput函数:
int ipOutput
?? ?(
?? ?register struct ifnet *ifp,
?? ?struct mbuf *m0,
?? ?struct sockaddr *dst,
?? ?struct rtentry *rt0
?? ?)
上面的几个参数比较明显
ifp为发送数据要使用的接口
m0是要发送的数据;
dst是目的地址;
rt0是使用的路由;
在ipOutput中与arp相关的最重要的一环,就是下面的switch-case语句:
switch (dst-sa_family)
?? ? ? ?{
?? ? ? ?case AF_INET:
?? ? ? ? ? ?if (ifp-if_resolve != NULL)
?? ? ?
文档评论(0)