[U-Boot] [PATCH v3 08/18] net: Refactor to protect access to the NetState variable

Joe Hershberger joe.hershberger at ni.com
Wed May 23 19:59:14 CEST 2012


Changes to NetState now go through an accessor function called
net_set_state()

Signed-off-by: Joe Hershberger <joe.hershberger at ni.com>
Cc: Joe Hershberger <joe.hershberger at gmail.com>
---
Changes for v2:
   - net_set_state changed to static inline
   - States changed to an enum
   - Eliminate CamelCase in new functions.
Changes for v3:
   - Rebased onto other changed patches
   - Added a blank line
   - Renamed NfsDownloadState to nfs_download_state
   - Put net_loop_state values on separate lines

 drivers/net/netconsole.c |    6 +++---
 include/net.h            |   20 ++++++++++++++------
 net/cdp.c                |    2 +-
 net/dns.c                |    8 ++++----
 net/net.c                |   21 ++++++++++++---------
 net/nfs.c                |   12 ++++++------
 net/ping.c               |    4 ++--
 net/sntp.c               |    4 ++--
 net/tftp.c               |    8 ++++----
 9 files changed, 48 insertions(+), 37 deletions(-)

diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
index ba02fd7..28bb955 100644
--- a/drivers/net/netconsole.c
+++ b/drivers/net/netconsole.c
@@ -44,19 +44,19 @@ static void nc_wait_arp_handler(uchar *pkt, unsigned dest,
 				 IPaddr_t sip, unsigned src,
 				 unsigned len)
 {
-	NetState = NETLOOP_SUCCESS; /* got arp reply - quit net loop */
+	net_set_state(NETLOOP_SUCCESS); /* got arp reply - quit net loop */
 }
 
 static void nc_handler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
 			unsigned len)
 {
 	if (input_size)
-		NetState = NETLOOP_SUCCESS; /* got input - quit net loop */
+		net_set_state(NETLOOP_SUCCESS); /* got input - quit net loop */
 }
 
 static void nc_timeout(void)
 {
-	NetState = NETLOOP_SUCCESS;
+	net_set_state(NETLOOP_SUCCESS);
 }
 
 void NcStart(void)
diff --git a/include/net.h b/include/net.h
index 3214830..8dd407e 100644
--- a/include/net.h
+++ b/include/net.h
@@ -391,12 +391,6 @@ extern uchar		NetEtherNullAddr[6];
 extern ushort		NetOurVLAN;		/* Our VLAN */
 extern ushort		NetOurNativeVLAN;	/* Our Native VLAN */
 
-extern int		NetState;		/* Network loop state */
-#define NETLOOP_CONTINUE	1
-#define NETLOOP_RESTART		2
-#define NETLOOP_SUCCESS		3
-#define NETLOOP_FAIL		4
-
 extern int		NetRestartWrap;		/* Tried all network devices */
 
 enum proto_t {
@@ -471,6 +465,20 @@ extern void	NetSetHandler(rxhand_f *);	/* Set RX packet handler */
 extern void net_set_icmp_handler(rxhand_icmp_f *f); /* Set ICMP RX handler */
 extern void	NetSetTimeout(ulong, thand_f *);/* Set timeout handler */
 
+/* Network loop state */
+enum net_loop_state {
+	NETLOOP_CONTINUE,
+	NETLOOP_RESTART,
+	NETLOOP_SUCCESS,
+	NETLOOP_FAIL
+};
+static inline void net_set_state(enum net_loop_state state)
+{
+	extern enum net_loop_state net_state;
+
+	net_state = state;
+}
+
 /* Transmit "NetTxPacket" */
 static inline void NetSendPacket(uchar *pkt, int len)
 {
diff --git a/net/cdp.c b/net/cdp.c
index 3dab6a1..fa92409 100644
--- a/net/cdp.c
+++ b/net/cdp.c
@@ -235,7 +235,7 @@ CDPTimeout(void)
 	if (!CDPOK)
 		NetStartAgain();
 	else
-		NetState = NETLOOP_SUCCESS;
+		net_set_state(NETLOOP_SUCCESS);
 }
 
 static void
diff --git a/net/dns.c b/net/dns.c
index cc7ed51..cc0aa0a 100644
--- a/net/dns.c
+++ b/net/dns.c
@@ -98,7 +98,7 @@ static void
 DnsTimeout(void)
 {
 	puts("Timeout\n");
-	NetState = NETLOOP_FAIL;
+	net_set_state(NETLOOP_FAIL);
 }
 
 static void
@@ -128,7 +128,7 @@ DnsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
 	/* Received 0 answers */
 	if (header->nanswers == 0) {
 		puts("DNS: host not found\n");
-		NetState = NETLOOP_SUCCESS;
+		net_set_state(NETLOOP_SUCCESS);
 		return;
 	}
 
@@ -141,7 +141,7 @@ DnsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
 	/* We sent query class 1, query type 1 */
 	if (&p[5] > e || get_unaligned_be16(p+1) != DNS_A_RECORD) {
 		puts("DNS: response was not an A record\n");
-		NetState = NETLOOP_SUCCESS;
+		net_set_state(NETLOOP_SUCCESS);
 		return;
 	}
 
@@ -191,7 +191,7 @@ DnsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
 			puts("server responded with invalid IP number\n");
 	}
 
-	NetState = NETLOOP_SUCCESS;
+	net_set_state(NETLOOP_SUCCESS);
 }
 
 void
diff --git a/net/net.c b/net/net.c
index e5fbda3..60be978 100644
--- a/net/net.c
+++ b/net/net.c
@@ -149,7 +149,7 @@ uchar		NetEtherNullAddr[6];
 void		(*push_packet)(void *, int len) = 0;
 #endif
 /* Network loop state */
-int		NetState;
+enum net_loop_state net_state;
 /* Tried all network devices */
 int		NetRestartWrap;
 /* Network loop restarted */
@@ -212,7 +212,7 @@ void net_auto_load(void)
 			 * Just use BOOTP/RARP to configure system;
 			 * Do not use TFTP to load the bootfile.
 			 */
-			NetState = NETLOOP_SUCCESS;
+			net_set_state(NETLOOP_SUCCESS);
 			return;
 		}
 #if defined(CONFIG_CMD_NFS)
@@ -290,7 +290,7 @@ int NetLoop(enum proto_t protocol)
 restart:
 	memcpy(NetOurEther, eth_get_dev()->enetaddr, 6);
 
-	NetState = NETLOOP_CONTINUE;
+	net_set_state(NETLOOP_CONTINUE);
 
 	/*
 	 *	Start the ball rolling with the given start function.  From
@@ -399,7 +399,7 @@ restart:
 
 	/*
 	 *	Main packet reception loop.  Loop receiving packets until
-	 *	someone sets `NetState' to a state that terminates.
+	 *	someone sets `net_state' to a state that terminates.
 	 */
 	for (;;) {
 		WATCHDOG_RESET();
@@ -451,7 +451,7 @@ restart:
 		}
 
 
-		switch (NetState) {
+		switch (net_state) {
 
 		case NETLOOP_RESTART:
 			NetRestarted = 1;
@@ -475,6 +475,9 @@ restart:
 
 		case NETLOOP_FAIL:
 			goto done;
+
+		case NETLOOP_CONTINUE:
+			continue;
 		}
 	}
 
@@ -492,7 +495,7 @@ done:
 static void
 startAgainTimeout(void)
 {
-	NetState = NETLOOP_RESTART;
+	net_set_state(NETLOOP_RESTART);
 }
 
 static void
@@ -523,7 +526,7 @@ void NetStartAgain(void)
 
 	if ((!retry_forever) && (NetTryCount >= retrycnt)) {
 		eth_halt();
-		NetState = NETLOOP_FAIL;
+		net_set_state(NETLOOP_FAIL);
 		return;
 	}
 
@@ -540,10 +543,10 @@ void NetStartAgain(void)
 			NetSetTimeout(10000UL, startAgainTimeout);
 			NetSetHandler(startAgainHandler);
 		} else {
-			NetState = NETLOOP_FAIL;
+			net_set_state(NETLOOP_FAIL);
 		}
 	} else {
-		NetState = NETLOOP_RESTART;
+		net_set_state(NETLOOP_RESTART);
 	}
 }
 
diff --git a/net/nfs.c b/net/nfs.c
index b6188fe..db73e93 100644
--- a/net/nfs.c
+++ b/net/nfs.c
@@ -41,7 +41,7 @@ static int nfs_len;
 static char dirfh[NFS_FHSIZE];	/* file handle of directory */
 static char filefh[NFS_FHSIZE]; /* file handle of kernel image */
 
-static int	NfsDownloadState;
+static enum net_loop_state nfs_download_state;
 static IPaddr_t NfsServerIP;
 static int	NfsSrvMountPort;
 static int	NfsSrvNfsPort;
@@ -613,10 +613,10 @@ NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
 	case STATE_UMOUNT_REQ:
 		if (nfs_umountall_reply(pkt, len)) {
 			puts("*** ERROR: Cannot umount\n");
-			NetState = NETLOOP_FAIL;
+			net_set_state(NETLOOP_FAIL);
 		} else {
 			puts("\ndone\n");
-			NetState = NfsDownloadState;
+			net_set_state(nfs_download_state);
 		}
 		break;
 
@@ -660,7 +660,7 @@ NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
 			NfsSend();
 		} else {
 			if (!rlen)
-				NfsDownloadState = NETLOOP_SUCCESS;
+				nfs_download_state = NETLOOP_SUCCESS;
 			NfsState = STATE_UMOUNT_REQ;
 			NfsSend();
 		}
@@ -673,13 +673,13 @@ void
 NfsStart(void)
 {
 	debug("%s\n", __func__);
-	NfsDownloadState = NETLOOP_FAIL;
+	nfs_download_state = NETLOOP_FAIL;
 
 	NfsServerIP = NetServerIP;
 	nfs_path = (char *)nfs_path_buff;
 
 	if (nfs_path == NULL) {
-		NetState = NETLOOP_FAIL;
+		net_set_state(NETLOOP_FAIL);
 		puts("*** ERROR: Fail allocate memory\n");
 		return;
 	}
diff --git a/net/ping.c b/net/ping.c
index f0026cc..9c690d8 100644
--- a/net/ping.c
+++ b/net/ping.c
@@ -72,7 +72,7 @@ static int ping_send(void)
 static void ping_timeout(void)
 {
 	eth_halt();
-	NetState = NETLOOP_FAIL;	/* we did not get the reply */
+	net_set_state(NETLOOP_FAIL);	/* we did not get the reply */
 }
 
 void ping_start(void)
@@ -92,7 +92,7 @@ void ping_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len)
 	case ICMP_ECHO_REPLY:
 		src_ip = NetReadIP((void *)&ip->ip_src);
 		if (src_ip == NetPingIP)
-			NetState = NETLOOP_SUCCESS;
+			net_set_state(NETLOOP_SUCCESS);
 		return;
 	case ICMP_ECHO_REQUEST:
 		debug("Got ICMP ECHO REQUEST, return "
diff --git a/net/sntp.c b/net/sntp.c
index 07d036d..48ce07f 100644
--- a/net/sntp.c
+++ b/net/sntp.c
@@ -45,7 +45,7 @@ static void
 SntpTimeout(void)
 {
 	puts("Timeout\n");
-	NetState = NETLOOP_FAIL;
+	net_set_state(NETLOOP_FAIL);
 	return;
 }
 
@@ -76,7 +76,7 @@ SntpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
 		tm.tm_year, tm.tm_mon, tm.tm_mday,
 		tm.tm_hour, tm.tm_min, tm.tm_sec);
 
-	NetState = NETLOOP_SUCCESS;
+	net_set_state(NETLOOP_SUCCESS);
 }
 
 void
diff --git a/net/tftp.c b/net/tftp.c
index a04a832..bf32eab 100644
--- a/net/tftp.c
+++ b/net/tftp.c
@@ -177,7 +177,7 @@ store_block(unsigned block, uchar *src, unsigned len)
 		rc = flash_write((char *)src, (ulong)(load_addr+offset), len);
 		if (rc) {
 			flash_perror(rc);
-			NetState = NETLOOP_FAIL;
+			net_set_state(NETLOOP_FAIL);
 			return;
 		}
 	} else
@@ -300,7 +300,7 @@ static void tftp_complete(void)
 	}
 #endif
 	puts("\ndone\n");
-	NetState = NETLOOP_SUCCESS;
+	net_set_state(NETLOOP_SUCCESS);
 }
 
 static void
@@ -627,7 +627,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
 			if (MasterClient && (TftpBlock >= TftpEndingBlock)) {
 				puts("\nMulticast tftp done\n");
 				mcast_cleanup();
-				NetState = NETLOOP_SUCCESS;
+				net_set_state(NETLOOP_SUCCESS);
 			}
 		} else
 #endif
@@ -644,7 +644,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
 		case TFTP_ERR_ACCESS_DENIED:
 			puts("Not retrying...\n");
 			eth_halt();
-			NetState = NETLOOP_FAIL;
+			net_set_state(NETLOOP_FAIL);
 			break;
 		case TFTP_ERR_UNDEFINED:
 		case TFTP_ERR_DISK_FULL:
-- 
1.6.0.2



More information about the U-Boot mailing list