Browse Source

net: Separate ArpRequest() into lower-level func

Link-local support will need to send ARP packets, but needs more
fine-grained control over the contents.  Split the implementation
into 2 parts so link-local can share the code.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Joe Hershberger 12 years ago
parent
commit
228041893c
2 changed files with 15 additions and 9 deletions
  1. 13 9
      net/arp.c
  2. 2 0
      net/arp.h

+ 13 - 9
net/arp.c

@@ -48,7 +48,8 @@ void ArpInit(void)
 	NetArpTxPacket -= (ulong)NetArpTxPacket % PKTALIGN;
 }
 
-void ArpRequest(void)
+void arp_raw_request(IPaddr_t sourceIP, const uchar *targetEther,
+	IPaddr_t targetIP)
 {
 	uchar *pkt;
 	struct arp_hdr *arp;
@@ -69,12 +70,16 @@ void ArpRequest(void)
 	arp->ar_pln = ARP_PLEN;
 	arp->ar_op = htons(ARPOP_REQUEST);
 
-	/* source ET addr */
-	memcpy(&arp->ar_sha, NetOurEther, ARP_HLEN);
-	/* source IP addr */
-	NetWriteIP(&arp->ar_spa, NetOurIP);
-	/* dest ET addr = 0 */
-	memset(&arp->ar_tha, 0, ARP_HLEN);
+	memcpy(&arp->ar_sha, NetOurEther, ARP_HLEN);	/* source ET addr */
+	NetWriteIP(&arp->ar_spa, sourceIP);		/* source IP addr */
+	memcpy(&arp->ar_tha, targetEther, ARP_HLEN);	/* target ET addr */
+	NetWriteIP(&arp->ar_tpa, targetIP);		/* target IP addr */
+
+	NetSendPacket(NetArpTxPacket, eth_hdr_size + ARP_HDR_SIZE);
+}
+
+void ArpRequest(void)
+{
 	if ((NetArpWaitPacketIP & NetOurSubnetMask) !=
 	    (NetOurIP & NetOurSubnetMask)) {
 		if (NetOurGatewayIP == 0) {
@@ -87,8 +92,7 @@ void ArpRequest(void)
 		NetArpWaitReplyIP = NetArpWaitPacketIP;
 	}
 
-	NetWriteIP(&arp->ar_tpa, NetArpWaitReplyIP);
-	NetSendPacket(NetArpTxPacket, eth_hdr_size + ARP_HDR_SIZE);
+	arp_raw_request(NetOurIP, NetEtherNullAddr, NetArpWaitReplyIP);
 }
 
 void ArpTimeoutCheck(void)

+ 2 - 0
net/arp.h

@@ -22,6 +22,8 @@ extern int NetArpWaitTry;
 
 void ArpInit(void);
 void ArpRequest(void);
+void arp_raw_request(IPaddr_t sourceIP, const uchar *targetEther,
+	IPaddr_t targetIP);
 void ArpTimeoutCheck(void);
 void ArpReceive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len);