Currently, upon receiving an appropriate ARP reply, the packet in net_tx_packet is sent. However, this is a common buffer used by other protocol as well, so it may not be the original packet waiting to be sent after ARP.
This patch repurposes another buffer, arp_tx_packet to store the waiting packet and use the net_tx_packet to prepare ARP request. Signed-off-by: Tran Tien Dat <peter.trantien...@gmail.com> --- net/arp.c | 18 ++++++++++-------- net/arp.h | 1 + net/net.c | 3 +++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/net/arp.c b/net/arp.c index b8a71684cd..f5e2c0b0cf 100644 --- a/net/arp.c +++ b/net/arp.c @@ -35,8 +35,8 @@ int arp_wait_tx_packet_size; ulong arp_wait_timer_start; int arp_wait_try; -static uchar *arp_tx_packet; /* THE ARP transmit packet */ -static uchar arp_tx_packet_buf[PKTSIZE_ALIGN + PKTALIGN]; +uchar *arp_wait_tx_packet; /* THE waiting transmit packet after ARP */ +static uchar arp_wait_tx_packet_buf[PKTSIZE_ALIGN + PKTALIGN]; void arp_init(void) { @@ -45,8 +45,8 @@ void arp_init(void) net_arp_wait_packet_ip.s_addr = 0; net_arp_wait_reply_ip.s_addr = 0; arp_wait_tx_packet_size = 0; - arp_tx_packet = &arp_tx_packet_buf[0] + (PKTALIGN - 1); - arp_tx_packet -= (ulong)arp_tx_packet % PKTALIGN; + arp_wait_tx_packet = &arp_wait_tx_packet_buf[0] + (PKTALIGN - 1); + arp_wait_tx_packet -= (ulong)arp_wait_tx_packet % PKTALIGN; } void arp_raw_request(struct in_addr source_ip, const uchar *target_ethaddr, @@ -58,7 +58,7 @@ void arp_raw_request(struct in_addr source_ip, const uchar *target_ethaddr, debug_cond(DEBUG_DEV_PKT, "ARP broadcast %d\n", arp_wait_try); - pkt = arp_tx_packet; + pkt = net_tx_packet; eth_hdr_size = net_set_ether(pkt, net_bcast_ethaddr, PROT_ARP); pkt += eth_hdr_size; @@ -76,7 +76,7 @@ void arp_raw_request(struct in_addr source_ip, const uchar *target_ethaddr, memcpy(&arp->ar_tha, target_ethaddr, ARP_HLEN); /* target ET addr */ net_write_ip(&arp->ar_tpa, target_ip); /* target IP addr */ - net_send_packet(arp_tx_packet, eth_hdr_size + ARP_HDR_SIZE); + net_send_packet(net_tx_packet, eth_hdr_size + ARP_HDR_SIZE); } void arp_request(void) @@ -217,9 +217,11 @@ void arp_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len) /* set the mac address in the waiting packet's header and transmit it */ - memcpy(((struct ethernet_hdr *)net_tx_packet)->et_dest, + memcpy(((struct ethernet_hdr *)arp_wait_tx_packet) + ->et_dest, &arp->ar_sha, ARP_HLEN); - net_send_packet(net_tx_packet, arp_wait_tx_packet_size); + net_send_packet(arp_wait_tx_packet, + arp_wait_tx_packet_size); /* no arp request pending now */ net_arp_wait_packet_ip.s_addr = 0; diff --git a/net/arp.h b/net/arp.h index afb86958f3..65d73927a7 100644 --- a/net/arp.h +++ b/net/arp.h @@ -20,6 +20,7 @@ extern uchar *arp_wait_packet_ethaddr; extern int arp_wait_tx_packet_size; extern ulong arp_wait_timer_start; extern int arp_wait_try; +extern uchar *arp_wait_tx_packet; void arp_init(void); void arp_request(void); diff --git a/net/net.c b/net/net.c index f35695b4fc..6325ad3e1a 100644 --- a/net/net.c +++ b/net/net.c @@ -836,6 +836,9 @@ int net_send_udp_packet(uchar *ether, struct in_addr dest, int dport, int sport, /* size of the waiting packet */ arp_wait_tx_packet_size = pkt_hdr_size + payload_len; + /* copy current packet to ARP waiting packet buffer */ + memcpy(arp_wait_tx_packet, net_tx_packet, + arp_wait_tx_packet_size); /* and do the ARP request */ arp_wait_try = 1; -- 2.18.0 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot