net: Refactor to separate the UDP handler from the ARP handler

Call a built-in dummy if none is registered... don't require
protocols to register a handler (eliminating dummies)
NetConsole now uses the ARP handler when waiting on arp
(instead of needing a #define hack in arp.c)
Clear handlers at the end of net loop

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Acked-by: Simon Glass <sjg@chromium.org>
diff --git a/net/net.c b/net/net.c
index 60be978..72fafd8 100644
--- a/net/net.c
+++ b/net/net.c
@@ -178,10 +178,13 @@
 /* Receive packet */
 uchar *NetRxPackets[PKTBUFSRX];
 
-/* Current RX packet handler */
-static rxhand_f *packetHandler;
+/* Current UDP RX packet handler */
+static rxhand_f *udp_packet_handler;
+/* Current ARP RX packet handler */
+static rxhand_f *arp_packet_handler;
 #ifdef CONFIG_CMD_TFTPPUT
-static rxhand_icmp_f *packet_icmp_handler;	/* Current ICMP rx handler */
+/* Current ICMP rx handler */
+static rxhand_icmp_f *packet_icmp_handler;
 #endif
 /* Current timeout handler */
 static thand_f *timeHandler;
@@ -250,6 +253,18 @@
 	return;
 }
 
+static void net_clear_handlers(void)
+{
+	net_set_udp_handler(NULL);
+	net_set_arp_handler(NULL);
+	NetSetTimeout(0, NULL);
+}
+
+static void net_cleanup_loop(void)
+{
+	net_clear_handlers();
+}
+
 /**********************************************************************/
 /*
  *	Main network processing loop.
@@ -257,6 +272,7 @@
 
 int NetLoop(enum proto_t protocol)
 {
+	int	i;
 	bd_t *bd = gd->bd;
 	int ret = -1;
 
@@ -267,17 +283,15 @@
 	NetTryCount = 1;
 
 	ArpInit();
+	net_clear_handlers();
 
-	if (!NetTxPacket) {
-		int	i;
-		/*
-		 *	Setup packet buffers, aligned correctly.
-		 */
-		NetTxPacket = &PktBuf[0] + (PKTALIGN - 1);
-		NetTxPacket -= (ulong)NetTxPacket % PKTALIGN;
-		for (i = 0; i < PKTBUFSRX; i++)
-			NetRxPackets[i] = NetTxPacket + (i+1)*PKTSIZE_ALIGN;
-	}
+	/*
+	 *	Setup packet buffers, aligned correctly.
+	 */
+	NetTxPacket = &PktBuf[0] + (PKTALIGN - 1);
+	NetTxPacket -= (ulong)NetTxPacket % PKTALIGN;
+	for (i = 0; i < PKTBUFSRX; i++)
+		NetRxPackets[i] = NetTxPacket + (i+1)*PKTSIZE_ALIGN;
 
 	bootstage_mark_name(BOOTSTAGE_ID_ETH_START, "eth_start");
 	eth_halt();
@@ -416,6 +430,7 @@
 		 *	Abort if ctrl-c was pressed.
 		 */
 		if (ctrlc()) {
+			net_cleanup_loop();
 			eth_halt();
 			puts("\nAbort\n");
 			goto done;
@@ -458,6 +473,7 @@
 			goto restart;
 
 		case NETLOOP_SUCCESS:
+			net_cleanup_loop();
 			if (NetBootFileXferSize > 0) {
 				char buf[20];
 				printf("Bytes transferred = %ld (%lx hex)\n",
@@ -474,6 +490,7 @@
 			goto done;
 
 		case NETLOOP_FAIL:
+			net_cleanup_loop();
 			goto done;
 
 		case NETLOOP_CONTINUE:
@@ -484,7 +501,7 @@
 done:
 #ifdef CONFIG_CMD_TFTPPUT
 	/* Clear out the handlers */
-	NetSetHandler(NULL);
+	net_set_udp_handler(NULL);
 	net_set_icmp_handler(NULL);
 #endif
 	return ret;
@@ -498,13 +515,6 @@
 	net_set_state(NETLOOP_RESTART);
 }
 
-static void
-startAgainHandler(uchar *pkt, unsigned dest, IPaddr_t sip,
-		  unsigned src, unsigned len)
-{
-	/* Totally ignore the packet */
-}
-
 void NetStartAgain(void)
 {
 	char *nretry;
@@ -541,7 +551,7 @@
 		NetRestartWrap = 0;
 		if (NetDevExists) {
 			NetSetTimeout(10000UL, startAgainTimeout);
-			NetSetHandler(startAgainHandler);
+			net_set_udp_handler(NULL);
 		} else {
 			net_set_state(NETLOOP_FAIL);
 		}
@@ -555,17 +565,36 @@
  *	Miscelaneous bits.
  */
 
-rxhand_f *
-NetGetHandler(void)
+static void dummy_handler(uchar *pkt, unsigned dport,
+			IPaddr_t sip, unsigned sport,
+			unsigned len)
 {
-	return packetHandler;
 }
 
-
-void
-NetSetHandler(rxhand_f *f)
+rxhand_f *net_get_udp_handler(void)
 {
-	packetHandler = f;
+	return udp_packet_handler;
+}
+
+void net_set_udp_handler(rxhand_f *f)
+{
+	if (f == NULL)
+		udp_packet_handler = dummy_handler;
+	else
+		udp_packet_handler = f;
+}
+
+rxhand_f *net_get_arp_handler(void)
+{
+	return arp_packet_handler;
+}
+
+void net_set_arp_handler(rxhand_f *f)
+{
+	if (f == NULL)
+		arp_packet_handler = dummy_handler;
+	else
+		arp_packet_handler = f;
 }
 
 #ifdef CONFIG_CMD_TFTPPUT
@@ -1091,11 +1120,11 @@
 		/*
 		 *	IP header OK.  Pass the packet to the current handler.
 		 */
-		(*packetHandler)((uchar *)ip + IP_UDP_HDR_SIZE,
-					ntohs(ip->udp_dst),
-					src_ip,
-					ntohs(ip->udp_src),
-					ntohs(ip->udp_len) - UDP_HDR_SIZE);
+		(*udp_packet_handler)((uchar *)ip + IP_UDP_HDR_SIZE,
+				ntohs(ip->udp_dst),
+				src_ip,
+				ntohs(ip->udp_src),
+				ntohs(ip->udp_len) - UDP_HDR_SIZE);
 		break;
 	}
 }