📄 arp_in.c,v
字号:
head 1.2;access;symbols;locks dls:1.2; strict;comment @ * @;1.2date 97.09.21.19.21.16; author dls; state Dist;branches;next 1.1;1.1date 94.09.24.01.04.50; author dls; state Old;branches;next ;desc@@1.2log@Pre-3e code@text@/* arp_in.c - arp_in */#include <conf.h>#include <kernel.h>#include <network.h>struct arpentry *arpfind(), *arpadd();/*------------------------------------------------------------------------ * arp_in - handle ARP packet coming in from Ethernet network * N.B. - Called by ni_in-- SHOULD NOT BLOCK *------------------------------------------------------------------------ */int arp_in(pni, pep)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)) { blkcopy(pae->ae_hwa, SHA(parp), pae->ae_hwlen); pae->ae_ttl = ARP_TIMEOUT; } if (!blkequ(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; blkcopy(TPA(parp), SPA(parp), parp->ar_prlen); blkcopy(THA(parp), SHA(parp), parp->ar_hwlen); blkcopy(pep->ep_dst, THA(parp), EP_ALEN); blkcopy(SHA(parp), pni->ni_hwa.ha_addr, pni->ni_hwa.ha_len); blkcopy(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;}@1.1log@Initial revision@text@d59 1a59 2 arplen = sizeof(struct arp) + 2*(parp->ar_prlen + parp->ar_hwlen);@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -