Skip to content
Snippets Groups Projects
Commit 22804189 authored by Joe Hershberger's avatar Joe Hershberger
Browse files

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: default avatarJoe Hershberger <joe.hershberger@ni.com>
parent e94070c4
No related branches found
No related tags found
No related merge requests found
...@@ -48,7 +48,8 @@ void ArpInit(void) ...@@ -48,7 +48,8 @@ void ArpInit(void)
NetArpTxPacket -= (ulong)NetArpTxPacket % PKTALIGN; NetArpTxPacket -= (ulong)NetArpTxPacket % PKTALIGN;
} }
void ArpRequest(void) void arp_raw_request(IPaddr_t sourceIP, const uchar *targetEther,
IPaddr_t targetIP)
{ {
uchar *pkt; uchar *pkt;
struct arp_hdr *arp; struct arp_hdr *arp;
...@@ -69,12 +70,16 @@ void ArpRequest(void) ...@@ -69,12 +70,16 @@ void ArpRequest(void)
arp->ar_pln = ARP_PLEN; arp->ar_pln = ARP_PLEN;
arp->ar_op = htons(ARPOP_REQUEST); arp->ar_op = htons(ARPOP_REQUEST);
/* source ET addr */ memcpy(&arp->ar_sha, NetOurEther, ARP_HLEN); /* source ET addr */
memcpy(&arp->ar_sha, NetOurEther, ARP_HLEN); NetWriteIP(&arp->ar_spa, sourceIP); /* source IP addr */
/* source IP addr */ memcpy(&arp->ar_tha, targetEther, ARP_HLEN); /* target ET addr */
NetWriteIP(&arp->ar_spa, NetOurIP); NetWriteIP(&arp->ar_tpa, targetIP); /* target IP addr */
/* dest ET addr = 0 */
memset(&arp->ar_tha, 0, ARP_HLEN); NetSendPacket(NetArpTxPacket, eth_hdr_size + ARP_HDR_SIZE);
}
void ArpRequest(void)
{
if ((NetArpWaitPacketIP & NetOurSubnetMask) != if ((NetArpWaitPacketIP & NetOurSubnetMask) !=
(NetOurIP & NetOurSubnetMask)) { (NetOurIP & NetOurSubnetMask)) {
if (NetOurGatewayIP == 0) { if (NetOurGatewayIP == 0) {
...@@ -87,8 +92,7 @@ void ArpRequest(void) ...@@ -87,8 +92,7 @@ void ArpRequest(void)
NetArpWaitReplyIP = NetArpWaitPacketIP; NetArpWaitReplyIP = NetArpWaitPacketIP;
} }
NetWriteIP(&arp->ar_tpa, NetArpWaitReplyIP); arp_raw_request(NetOurIP, NetEtherNullAddr, NetArpWaitReplyIP);
NetSendPacket(NetArpTxPacket, eth_hdr_size + ARP_HDR_SIZE);
} }
void ArpTimeoutCheck(void) void ArpTimeoutCheck(void)
......
...@@ -22,6 +22,8 @@ extern int NetArpWaitTry; ...@@ -22,6 +22,8 @@ extern int NetArpWaitTry;
void ArpInit(void); void ArpInit(void);
void ArpRequest(void); void ArpRequest(void);
void arp_raw_request(IPaddr_t sourceIP, const uchar *targetEther,
IPaddr_t targetIP);
void ArpTimeoutCheck(void); void ArpTimeoutCheck(void);
void ArpReceive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len); void ArpReceive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment