net: Refactor NetSendUDPPacket to share more code

Share more of the code that is common between ARP vs not.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Acked-by: Simon Glass <sjg@chromium.org>
master
Joe Hershberger 12 years ago
parent 4b11c9166b
commit 9214637a56
  1. 44
      net/net.c

@ -595,6 +595,9 @@ int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport,
int payload_len) int payload_len)
{ {
uchar *pkt; uchar *pkt;
int need_arp = 0;
int eth_hdr_size;
int pkt_hdr_size;
/* convert to new style broadcast */ /* convert to new style broadcast */
if (dest == 0) if (dest == 0)
@ -609,40 +612,43 @@ int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport,
* an ARP request * an ARP request
*/ */
if (memcmp(ether, NetEtherNullAddr, 6) == 0) { 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; NetArpWaitPacketIP = dest;
NetArpWaitPacketMAC = ether; NetArpWaitPacketMAC = ether;
pkt = NetArpWaitTxPacket; /*
pkt += NetSetEther(pkt, NetArpWaitPacketMAC, PROT_IP); * Copy the packet data from the NetTxPacket into the
* NetArpWaitTxPacket to send after arp
net_set_udp_header(pkt, dest, dport, sport, payload_len); */
memcpy(pkt + IP_UDP_HDR_SIZE, (uchar *)NetTxPacket + memcpy(pkt + IP_UDP_HDR_SIZE, (uchar *)NetTxPacket +
(pkt - (uchar *)NetArpWaitTxPacket) + pkt_hdr_size, payload_len);
IP_UDP_HDR_SIZE, payload_len);
/* size of the waiting packet */ /* size of the waiting packet */
NetArpWaitTxPacketSize = (pkt - NetArpWaitTxPacket) + NetArpWaitTxPacketSize = pkt_hdr_size + payload_len;
IP_UDP_HDR_SIZE + payload_len;
/* and do the ARP request */ /* and do the ARP request */
NetArpWaitTry = 1; NetArpWaitTry = 1;
NetArpWaitTimerStart = get_timer(0); NetArpWaitTimerStart = get_timer(0);
ArpRequest(); ArpRequest();
return 1; /* waiting */ 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 #ifdef CONFIG_IP_DEFRAG

Loading…
Cancel
Save