资源描述:
《码为uip_arpc中的void uip_arp_arpin(void)函数》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、ARP应答部分代码为uip_arp.c中的voiduip_arp_arpin(void)函数.这个函数是在设备接收到ARP包时,由驱动程序调用的.如果收到是ARP包是一个对本地主机上次发送的ARP请求的应答,那么就从包中取得自己想要的主机的MAC地址,加入自己的ARP缓存表中.如果收到是一个ARP请求,那就把自己的MAC地址打包成一个ARP应答,发送给请求的主机.看代码uip_arp.c的254行:1./*-------------------------------------------------------------------------
2、----------*/2./**3.*ARPprocessingforincomingARPpackets.4.*对传入的ARP包的处理.5.*ThisfunctionshouldbecalledbythedevicedriverwhenanARP6.*packethasbeenreceived.Thefunctionwillactdifferently7.*dependingontheARPpackettype:ifitisareplyforarequest8.*thatwepreviouslysentout,theARPcachewillbef
3、illedinwith9.*thevaluesfromtheARPreply.IftheincomingARPpacketisanARP10.*requestforourIPaddress,anARPreplypacketiscreatedandput11.*intotheuip_buf[]buffer.12.*此函数在收到ARP包时由设备驱动调用,函数行为会因包类型而有不同.如果收到的是一个对前先发送的请求的应答13.*则根据应答的值填充缓存.如果传入的包是对我们的IP的请求,则创建一个ARP应答,并放入uip_buf[]中.14.*Whenthe
4、functionreturns,thevalueoftheglobalvariableuip_len15.*indicateswhetherthedevicedrivershouldsendoutapacketor16.*not.Ifuip_leniszero,nopacketshouldbesent.Ifuip_lenis17.*non-zero,itcontainsthelengthoftheoutboundpacketthatis18.*presentintheuip_buf[]buffer.19.*函数返回时,全局变量uip_len的值指明了
5、设备驱动要不要发送包.若uip_len为0,则不需发送,若uip_len不是0,20.*则其值是uip_buf[]中包含的要传出的包的大小.21.*ThisfunctionexpectsanARPpacketwithaprependedEthernet22.*headerintheuip_buf[]buffer,andthelengthofthepacketinthe23.*globalvariableuip_len.此函数预期中的uip_buf中有一个带以太网头的ARP包.其长度存为uip_len中.24.*/25./*--------------
6、---------------------------------------------------------------------*/26.void27.uip_arp_arpin(void)28.{29.30.if(uip_lenopcode){6.caseHTONS(ARP_REQUEST):7./*ARPrequest.Ifitaskedforouraddress,wesendouta
7、8.reply.如果是一个ARP请求,则发送应答.*/9.if(uip_ipaddr_cmp(BUF->dipaddr,uip_hostaddr)){10./*First,weregistertheonewhomadetherequestinourARP11.table,sinceitislikelythatwewilldomorecommunication12.withthishostinthefuture.首先,我们将发送请求的主机注册到ARP缓存表中,因为我们很可能要跟它要有更多的交流*/13.uip_arp_update(BUF->sipad
8、dr,&BUF->shwaddr);14.15./*Thereplyopcodeis2.应答的操作码为2*/