arp_in.c
来自「TCP-IP红宝书源代码」· C语言 代码 · 共 65 行
C
65 行
/* arp_in.c - arp_in */
#include <conf.h>
#include <kernel.h>
#include <network.h>
void arpqsend(struct arpentry *);
/*------------------------------------------------------------------------
* arp_in - handle ARP packet coming in from Ethernet network
* N.B. - Called by ni_in-- SHOULD NOT BLOCK
*------------------------------------------------------------------------
*/
int
arp_in(struct netif *pni, struct ep *pep)
{
struct arp *parp = (struct arp *)pep->ep_data;
struct arpentry *pae;
int arplen;
parp->ar_hwtype = net2hs(parp->ar_hwtype);
parp->ar_prtype = net2hs(parp->ar_prtype);
parp->ar_op = net2hs(parp->ar_op);
if (parp->ar_hwtype != pni->ni_hwtype ||
parp->ar_prtype != EPT_IP) {
freebuf(pep);
return OK;
}
if (pae = arpfind(SPA(parp), parp->ar_prtype, pni)) {
memcpy(pae->ae_hwa, SHA(parp), pae->ae_hwlen);
pae->ae_ttl = ARP_TIMEOUT;
}
if (memcmp(TPA(parp), &pni->ni_ip, IP_ALEN)) {
freebuf(pep);
return OK;
}
if (pae == 0)
pae = arpadd(pni, parp);
if (pae->ae_state == AS_PENDING) {
pae->ae_state = AS_RESOLVED;
arpqsend(pae);
}
if (parp->ar_op == AR_REQUEST) {
parp->ar_op = AR_REPLY;
memcpy(TPA(parp), SPA(parp), parp->ar_prlen);
memcpy(THA(parp), SHA(parp), parp->ar_hwlen);
memcpy(pep->ep_dst, THA(parp), EP_ALEN);
memcpy(SHA(parp), pni->ni_hwa.ha_addr,
pni->ni_hwa.ha_len);
memcpy(SPA(parp), &pni->ni_ip, IP_ALEN);
parp->ar_hwtype = hs2net(parp->ar_hwtype);
parp->ar_prtype = hs2net(parp->ar_prtype);
parp->ar_op = hs2net(parp->ar_op);
arplen = ARP_HLEN + 2*(parp->ar_prlen + parp->ar_hwlen);
write(pni->ni_dev, pep, arplen);
} else
freebuf(pep);
return OK;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?