资源描述:
《vxworks 对于arp的处理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、vxworks对于arp的处理默认分类2010-05-2223:54:15阅读144评论0 字号:大中小 订阅虽然是vxworks2.0.2版本中的,但是与老土的BSD代码基本一样,事实上,最新的ip协议栈的代码上虽然加上不少新鲜的功能,但是其主体也依旧一样.ifnet也就是协议栈中的接口的概念,跟arp相关处理的最重要的三个成员是:·if_ioctl用于接口上的ioctl命令;·if_resolve用于进行地址解析的函数;·if_output用于在接口上发送数据包;在ipAttach时,这三个值都进行了初始化: pIfp->if_ioctl =(FUNCPTR)ipI
2、octl; pIfp->if_output=ipOutput; pIfp->if_resolve=muxAddrResFuncGet(mib2Tbl.ifType,0x800);其中if_resolve的值,实际上就是arpresolve函数.in_ifaddrin_ifaddr是ifaddr的一种特殊形式,即ipv4版本的的ifaddr.当我们给接口配置ip地址时,实际上要生成一个in_ifaddr结构体,并与ifnet相关联.那么它与arp最相关的内容实际上是在ifaddr结构体中,它们是:·ifa_rtrequest这是一个处理arp相关的函数,在后面我们就会解
3、释到它的用处.·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持
4、有的数据,在arp处理中会使用到,现在只知道它是要通过接口发送的数据包;·la_asked计数,用于统计在接收到arp回应前,发出了多少arp请求.rtentry路由表项,每一条路由都由一个rtentry表示,与arp相关的内容包括·rt_ifp与路由相关联的接口;·rt_ifa与路由相关的接口地址;·rt_genmask用于clone路由时使用;·rt_llinfo指向arp控制结构·rt_gateway表示下一跳信息,可能保存mac地址.·rt_expirearp超时处理使用,如果为0,表示永久有效(用于静态配置的mac).routeroute数据结构主要用于路由处理,它
5、包括两个成员:·ro_rt路由引用的rtentry·ro_dst目的地址数据的发送过程ip_outputip协议栈发送数据总是以intip_output(m0,opt,ro,flags,imo)structmbuf*m0;structmbuf*opt;structroute*ro;intflags;structip_moptions*imo;函数调用开发的,对于其中一些特殊情况的处理我们就不会加以描述,我们只对普通情况说明.m0表示要发送的数据,而ro就是发送的路由.ip_output在进行了一大堆的事情之后,就会调用(*ifp->if_output)(ifp,m, (st
6、ructsockaddr*)dst,ro->ro_rt);发送数据,其中ifp就是根据路由或者什么的,找到的要outgoing接口.前面我们说过,ipAttach时,就已经指定了if_output为ipOutput函数:intipOutput ( registerstructifnet*ifp, structmbuf*m0, structsockaddr*dst, structrtentry*rt0 )上面的几个参数比较明显·ifp为发送数据要使用的接口·m0是要发送的数据;·dst是目的地址;·rt0是使用的路由;在ipOutput中与arp相关的最
7、重要的一环,就是下面的switch-case语句:switch(dst->sa_family) { caseAF_INET: if(ifp->if_resolve!=NULL) if(!ifp->if_resolve(ac,rt,m,dst,edst)) return(0);/*ifnotyetresolved*/ /*Ifbroadcastingonasimplexinterface,loopbackacopy*/