net: Refactor to protect access to the NetState variable

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

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
master
Joe Hershberger 12 years ago
parent adf5d93e44
commit 22f6e99d5b
  1. 6
      drivers/net/netconsole.c
  2. 20
      include/net.h
  3. 2
      net/cdp.c
  4. 8
      net/dns.c
  5. 21
      net/net.c
  6. 12
      net/nfs.c
  7. 4
      net/ping.c
  8. 4
      net/sntp.c
  9. 8
      net/tftp.c

@ -44,19 +44,19 @@ static void nc_wait_arp_handler(uchar *pkt, unsigned dest,
IPaddr_t sip, unsigned src, IPaddr_t sip, unsigned src,
unsigned len) 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, static void nc_handler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
unsigned len) unsigned len)
{ {
if (input_size) 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) static void nc_timeout(void)
{ {
NetState = NETLOOP_SUCCESS; net_set_state(NETLOOP_SUCCESS);
} }
void NcStart(void) void NcStart(void)

@ -391,12 +391,6 @@ extern uchar NetEtherNullAddr[6];
extern ushort NetOurVLAN; /* Our VLAN */ extern ushort NetOurVLAN; /* Our VLAN */
extern ushort NetOurNativeVLAN; /* Our Native 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 */ extern int NetRestartWrap; /* Tried all network devices */
enum proto_t { 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 net_set_icmp_handler(rxhand_icmp_f *f); /* Set ICMP RX handler */
extern void NetSetTimeout(ulong, thand_f *);/* Set timeout 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" */ /* Transmit "NetTxPacket" */
static inline void NetSendPacket(uchar *pkt, int len) static inline void NetSendPacket(uchar *pkt, int len)
{ {

@ -235,7 +235,7 @@ CDPTimeout(void)
if (!CDPOK) if (!CDPOK)
NetStartAgain(); NetStartAgain();
else else
NetState = NETLOOP_SUCCESS; net_set_state(NETLOOP_SUCCESS);
} }
static void static void

@ -98,7 +98,7 @@ static void
DnsTimeout(void) DnsTimeout(void)
{ {
puts("Timeout\n"); puts("Timeout\n");
NetState = NETLOOP_FAIL; net_set_state(NETLOOP_FAIL);
} }
static void static void
@ -128,7 +128,7 @@ DnsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
/* Received 0 answers */ /* Received 0 answers */
if (header->nanswers == 0) { if (header->nanswers == 0) {
puts("DNS: host not found\n"); puts("DNS: host not found\n");
NetState = NETLOOP_SUCCESS; net_set_state(NETLOOP_SUCCESS);
return; 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 */ /* We sent query class 1, query type 1 */
if (&p[5] > e || get_unaligned_be16(p+1) != DNS_A_RECORD) { if (&p[5] > e || get_unaligned_be16(p+1) != DNS_A_RECORD) {
puts("DNS: response was not an A record\n"); puts("DNS: response was not an A record\n");
NetState = NETLOOP_SUCCESS; net_set_state(NETLOOP_SUCCESS);
return; 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"); puts("server responded with invalid IP number\n");
} }
NetState = NETLOOP_SUCCESS; net_set_state(NETLOOP_SUCCESS);
} }
void void

@ -149,7 +149,7 @@ uchar NetEtherNullAddr[6];
void (*push_packet)(void *, int len) = 0; void (*push_packet)(void *, int len) = 0;
#endif #endif
/* Network loop state */ /* Network loop state */
int NetState; enum net_loop_state net_state;
/* Tried all network devices */ /* Tried all network devices */
int NetRestartWrap; int NetRestartWrap;
/* Network loop restarted */ /* Network loop restarted */
@ -212,7 +212,7 @@ void net_auto_load(void)
* Just use BOOTP/RARP to configure system; * Just use BOOTP/RARP to configure system;
* Do not use TFTP to load the bootfile. * Do not use TFTP to load the bootfile.
*/ */
NetState = NETLOOP_SUCCESS; net_set_state(NETLOOP_SUCCESS);
return; return;
} }
#if defined(CONFIG_CMD_NFS) #if defined(CONFIG_CMD_NFS)
@ -290,7 +290,7 @@ int NetLoop(enum proto_t protocol)
restart: restart:
memcpy(NetOurEther, eth_get_dev()->enetaddr, 6); 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 * Start the ball rolling with the given start function. From
@ -399,7 +399,7 @@ restart:
/* /*
* Main packet reception loop. Loop receiving packets until * 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 (;;) { for (;;) {
WATCHDOG_RESET(); WATCHDOG_RESET();
@ -451,7 +451,7 @@ restart:
} }
switch (NetState) { switch (net_state) {
case NETLOOP_RESTART: case NETLOOP_RESTART:
NetRestarted = 1; NetRestarted = 1;
@ -475,6 +475,9 @@ restart:
case NETLOOP_FAIL: case NETLOOP_FAIL:
goto done; goto done;
case NETLOOP_CONTINUE:
continue;
} }
} }
@ -492,7 +495,7 @@ done:
static void static void
startAgainTimeout(void) startAgainTimeout(void)
{ {
NetState = NETLOOP_RESTART; net_set_state(NETLOOP_RESTART);
} }
static void static void
@ -523,7 +526,7 @@ void NetStartAgain(void)
if ((!retry_forever) && (NetTryCount >= retrycnt)) { if ((!retry_forever) && (NetTryCount >= retrycnt)) {
eth_halt(); eth_halt();
NetState = NETLOOP_FAIL; net_set_state(NETLOOP_FAIL);
return; return;
} }
@ -540,10 +543,10 @@ void NetStartAgain(void)
NetSetTimeout(10000UL, startAgainTimeout); NetSetTimeout(10000UL, startAgainTimeout);
NetSetHandler(startAgainHandler); NetSetHandler(startAgainHandler);
} else { } else {
NetState = NETLOOP_FAIL; net_set_state(NETLOOP_FAIL);
} }
} else { } else {
NetState = NETLOOP_RESTART; net_set_state(NETLOOP_RESTART);
} }
} }

@ -41,7 +41,7 @@ static int nfs_len;
static char dirfh[NFS_FHSIZE]; /* file handle of directory */ static char dirfh[NFS_FHSIZE]; /* file handle of directory */
static char filefh[NFS_FHSIZE]; /* file handle of kernel image */ 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 IPaddr_t NfsServerIP;
static int NfsSrvMountPort; static int NfsSrvMountPort;
static int NfsSrvNfsPort; static int NfsSrvNfsPort;
@ -613,10 +613,10 @@ NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
case STATE_UMOUNT_REQ: case STATE_UMOUNT_REQ:
if (nfs_umountall_reply(pkt, len)) { if (nfs_umountall_reply(pkt, len)) {
puts("*** ERROR: Cannot umount\n"); puts("*** ERROR: Cannot umount\n");
NetState = NETLOOP_FAIL; net_set_state(NETLOOP_FAIL);
} else { } else {
puts("\ndone\n"); puts("\ndone\n");
NetState = NfsDownloadState; net_set_state(nfs_download_state);
} }
break; break;
@ -660,7 +660,7 @@ NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
NfsSend(); NfsSend();
} else { } else {
if (!rlen) if (!rlen)
NfsDownloadState = NETLOOP_SUCCESS; nfs_download_state = NETLOOP_SUCCESS;
NfsState = STATE_UMOUNT_REQ; NfsState = STATE_UMOUNT_REQ;
NfsSend(); NfsSend();
} }
@ -673,13 +673,13 @@ void
NfsStart(void) NfsStart(void)
{ {
debug("%s\n", __func__); debug("%s\n", __func__);
NfsDownloadState = NETLOOP_FAIL; nfs_download_state = NETLOOP_FAIL;
NfsServerIP = NetServerIP; NfsServerIP = NetServerIP;
nfs_path = (char *)nfs_path_buff; nfs_path = (char *)nfs_path_buff;
if (nfs_path == NULL) { if (nfs_path == NULL) {
NetState = NETLOOP_FAIL; net_set_state(NETLOOP_FAIL);
puts("*** ERROR: Fail allocate memory\n"); puts("*** ERROR: Fail allocate memory\n");
return; return;
} }

@ -72,7 +72,7 @@ static int ping_send(void)
static void ping_timeout(void) static void ping_timeout(void)
{ {
eth_halt(); 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) 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: case ICMP_ECHO_REPLY:
src_ip = NetReadIP((void *)&ip->ip_src); src_ip = NetReadIP((void *)&ip->ip_src);
if (src_ip == NetPingIP) if (src_ip == NetPingIP)
NetState = NETLOOP_SUCCESS; net_set_state(NETLOOP_SUCCESS);
return; return;
case ICMP_ECHO_REQUEST: case ICMP_ECHO_REQUEST:
debug("Got ICMP ECHO REQUEST, return " debug("Got ICMP ECHO REQUEST, return "

@ -45,7 +45,7 @@ static void
SntpTimeout(void) SntpTimeout(void)
{ {
puts("Timeout\n"); puts("Timeout\n");
NetState = NETLOOP_FAIL; net_set_state(NETLOOP_FAIL);
return; 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_year, tm.tm_mon, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec); tm.tm_hour, tm.tm_min, tm.tm_sec);
NetState = NETLOOP_SUCCESS; net_set_state(NETLOOP_SUCCESS);
} }
void void

@ -177,7 +177,7 @@ store_block(unsigned block, uchar *src, unsigned len)
rc = flash_write((char *)src, (ulong)(load_addr+offset), len); rc = flash_write((char *)src, (ulong)(load_addr+offset), len);
if (rc) { if (rc) {
flash_perror(rc); flash_perror(rc);
NetState = NETLOOP_FAIL; net_set_state(NETLOOP_FAIL);
return; return;
} }
} else } else
@ -300,7 +300,7 @@ static void tftp_complete(void)
} }
#endif #endif
puts("\ndone\n"); puts("\ndone\n");
NetState = NETLOOP_SUCCESS; net_set_state(NETLOOP_SUCCESS);
} }
static void static void
@ -627,7 +627,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
if (MasterClient && (TftpBlock >= TftpEndingBlock)) { if (MasterClient && (TftpBlock >= TftpEndingBlock)) {
puts("\nMulticast tftp done\n"); puts("\nMulticast tftp done\n");
mcast_cleanup(); mcast_cleanup();
NetState = NETLOOP_SUCCESS; net_set_state(NETLOOP_SUCCESS);
} }
} else } else
#endif #endif
@ -644,7 +644,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
case TFTP_ERR_ACCESS_DENIED: case TFTP_ERR_ACCESS_DENIED:
puts("Not retrying...\n"); puts("Not retrying...\n");
eth_halt(); eth_halt();
NetState = NETLOOP_FAIL; net_set_state(NETLOOP_FAIL);
break; break;
case TFTP_ERR_UNDEFINED: case TFTP_ERR_UNDEFINED:
case TFTP_ERR_DISK_FULL: case TFTP_ERR_DISK_FULL:

Loading…
Cancel
Save