diff options
author | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 08:00:11 +0000 |
---|---|---|
committer | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 17:53:07 -0500 |
commit | 228041893c2b6f79326f4b49ee7b3b3a90e90e8e (patch) | |
tree | 347b2ac6dc73cb5a345bfb2325d7ad26b092d777 /net | |
parent | e94070c443bdc9c0231abeca920d9f9362701aec (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>
Diffstat (limited to 'net')
-rw-r--r-- | net/arp.c | 22 | ||||
-rw-r--r-- | net/arp.h | 2 |
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); |