|
@@ -595,6 +595,9 @@ int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport,
|
|
|
int payload_len)
|
|
|
{
|
|
|
uchar *pkt;
|
|
|
+ int need_arp = 0;
|
|
|
+ int eth_hdr_size;
|
|
|
+ int pkt_hdr_size;
|
|
|
|
|
|
/* convert to new style broadcast */
|
|
|
if (dest == 0)
|
|
@@ -609,40 +612,43 @@ int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport,
|
|
|
* an ARP request
|
|
|
*/
|
|
|
if (memcmp(ether, NetEtherNullAddr, 6) == 0) {
|
|
|
+ need_arp = 1;
|
|
|
+ pkt = NetArpWaitTxPacket;
|
|
|
+ } else
|
|
|
+ pkt = (uchar *)NetTxPacket;
|
|
|
+
|
|
|
+ eth_hdr_size = NetSetEther(pkt, ether, PROT_IP);
|
|
|
+ pkt += eth_hdr_size;
|
|
|
+ net_set_udp_header(pkt, dest, dport, sport, payload_len);
|
|
|
+ pkt_hdr_size = eth_hdr_size + IP_UDP_HDR_SIZE;
|
|
|
|
|
|
- debug("sending ARP for %08x\n", dest);
|
|
|
+ if (need_arp) {
|
|
|
+ debug("sending ARP for %pI4\n", &dest);
|
|
|
|
|
|
+ /* save the ip and eth addr for the packet to send after arp */
|
|
|
NetArpWaitPacketIP = dest;
|
|
|
NetArpWaitPacketMAC = ether;
|
|
|
|
|
|
- pkt = NetArpWaitTxPacket;
|
|
|
- pkt += NetSetEther(pkt, NetArpWaitPacketMAC, PROT_IP);
|
|
|
-
|
|
|
- net_set_udp_header(pkt, dest, dport, sport, payload_len);
|
|
|
+ /*
|
|
|
+ * Copy the packet data from the NetTxPacket into the
|
|
|
+ * NetArpWaitTxPacket to send after arp
|
|
|
+ */
|
|
|
memcpy(pkt + IP_UDP_HDR_SIZE, (uchar *)NetTxPacket +
|
|
|
- (pkt - (uchar *)NetArpWaitTxPacket) +
|
|
|
- IP_UDP_HDR_SIZE, payload_len);
|
|
|
+ pkt_hdr_size, payload_len);
|
|
|
|
|
|
/* size of the waiting packet */
|
|
|
- NetArpWaitTxPacketSize = (pkt - NetArpWaitTxPacket) +
|
|
|
- IP_UDP_HDR_SIZE + payload_len;
|
|
|
+ NetArpWaitTxPacketSize = pkt_hdr_size + payload_len;
|
|
|
|
|
|
/* and do the ARP request */
|
|
|
NetArpWaitTry = 1;
|
|
|
NetArpWaitTimerStart = get_timer(0);
|
|
|
ArpRequest();
|
|
|
return 1; /* waiting */
|
|
|
+ } else {
|
|
|
+ debug("sending UDP to %pI4/%pM\n", &dest, ether);
|
|
|
+ eth_send(NetTxPacket, pkt_hdr_size + payload_len);
|
|
|
+ return 0; /* transmitted */
|
|
|
}
|
|
|
-
|
|
|
- debug("sending UDP to %08x/%pM\n", dest, ether);
|
|
|
-
|
|
|
- pkt = (uchar *)NetTxPacket;
|
|
|
- pkt += NetSetEther(pkt, ether, PROT_IP);
|
|
|
- net_set_udp_header(pkt, dest, dport, sport, payload_len);
|
|
|
- eth_send(NetTxPacket, (pkt - NetTxPacket) + IP_UDP_HDR_SIZE +
|
|
|
- payload_len);
|
|
|
-
|
|
|
- return 0; /* transmitted */
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_IP_DEFRAG
|