xref: /kvmtool/net/uip/arp.c (revision 42a6c572af1499be7a43780144e35432e6bdeb09)
1*9f74838fSAsias He #include "kvm/uip.h"
2*9f74838fSAsias He 
uip_tx_do_arp(struct uip_tx_arg * arg)3*9f74838fSAsias He int uip_tx_do_arp(struct uip_tx_arg *arg)
4*9f74838fSAsias He {
5*9f74838fSAsias He 	struct uip_arp *arp, *arp2;
6*9f74838fSAsias He 	struct uip_info *info;
7*9f74838fSAsias He 	struct uip_buf *buf;
8*9f74838fSAsias He 
9*9f74838fSAsias He 	info = arg->info;
10*9f74838fSAsias He 	buf = uip_buf_clone(arg);
11*9f74838fSAsias He 
12*9f74838fSAsias He 	arp	 = (struct uip_arp *)(arg->eth);
13*9f74838fSAsias He 	arp2	 = (struct uip_arp *)(buf->eth);
14*9f74838fSAsias He 
15*9f74838fSAsias He 	/*
16*9f74838fSAsias He 	 * ARP replay code: 2
17*9f74838fSAsias He 	 */
18*9f74838fSAsias He 	arp2->op   = htons(0x2);
19*9f74838fSAsias He 	arp2->dmac = arp->smac;
20*9f74838fSAsias He 	arp2->dip  = arp->sip;
21*9f74838fSAsias He 
22*9f74838fSAsias He 	if (arp->dip == htonl(info->host_ip)) {
23*9f74838fSAsias He 		arp2->smac = info->host_mac;
24*9f74838fSAsias He 		arp2->sip = htonl(info->host_ip);
25*9f74838fSAsias He 
26*9f74838fSAsias He 		uip_buf_set_used(info, buf);
27*9f74838fSAsias He 	}
28*9f74838fSAsias He 
29*9f74838fSAsias He 	return 0;
30*9f74838fSAsias He }
31