arp_in.c,v

来自「TCP-IP红宝书源代码」· C,V 代码 · 共 107 行

C,V
107
字号
head	1.2;
access;
symbols;
locks
	dls:1.2; strict;
comment	@ * @;


1.2
date	97.09.21.19.21.16;	author dls;	state Dist;
branches;
next	1.1;

1.1
date	94.09.24.01.04.50;	author dls;	state Old;
branches;
next	;


desc
@@


1.2
log
@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.1
log
@Initial revision
@
text
@d59 1
a59 2
		arplen = sizeof(struct arp) +
			2*(parp->ar_prlen + parp->ar_hwlen);
@

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?