summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Hershberger <joe.hershberger@ni.com>2012-05-23 08:00:11 +0000
committerJoe Hershberger <joe.hershberger@ni.com>2012-05-23 17:53:07 -0500
commit228041893c2b6f79326f4b49ee7b3b3a90e90e8e (patch)
tree347b2ac6dc73cb5a345bfb2325d7ad26b092d777
parente94070c443bdc9c0231abeca920d9f9362701aec (diff)
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>
-rw-r--r--net/arp.c22
-rw-r--r--net/arp.h2
2 files changed, 15 insertions, 9 deletions
diff --git a/net/arp.c b/net/arp.c
index 4a73a0fb35f..908ebf53165 100644
--- a/net/arp.c
+++ b/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)
diff --git a/net/arp.h b/net/arp.h
index 956fc5e570f..bfd57e01053 100644
--- a/net/arp.h
+++ b/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);