net: make ARP timeout configurable
PATCH 1/1 net: make ARP timeout configurable
Currently the timeout waiting for an ARP reply is hard set to 5 seconds. On i.MX31ADS due to a hardware "strangeness" up to four first IP packets to the boards get lost, which typically are ARP replies. By configuring the timeout to a lower value we significantly improve the first network transfer time on this board. The timeout is specified in deciseconds, because it has to be converted to hardware ticks, and CFG_HZ ranges from 900 to 27000000 on different boards.
---
README +4 -0
@@ -1547,6 +1547,10 @@ The following options need to be configured: before giving up the operation. If not defined, a default value of 5 is used. + CONFIG_ARP_TIMEOUT + + Timeout waiting for an ARP reply in deciseconds. + - Command Interpreter: CONFIG_AUTO_COMPLETE
net/net.c +11 -6
@@ -94,11 +94,16 @@DECLARE_GLOBAL_DATA_PTR ; -#define ARP_TIMEOUT 5UL/* Seconds before trying ARP again */ +#ifndef CONFIG_ARP_TIMEOUT +# define ARP_TIMEOUT 50UL/* Deciseconds before trying ARP again */ +#else +# define ARP_TIMEOUT CONFIG_ARP_TIMEOUT +#endif +#ifndef CONFIG_NET_RETRY_COUNT -# define ARP_TIMEOUT_COUNT 5/* # of timeouts before giving up */ +# define ARP_TIMEOUT_COUNT 5/* # of timeouts before giving up */ #else -# define ARP_TIMEOUT_COUNT (CONFIG_NET_RETRY_COUNT) +# define ARP_TIMEOUT_COUNT CONFIG_NET_RETRY_COUNT#endif #if 0
@@ -129,7 +134,7 @@ uchar NetOurEther[6]; /* Our ethernet address */uchar NetServerEther[6 ] =/* Boot server enet address */ {0 ,0 ,0 ,0 ,0 ,0 };IPaddr_t NetOurIP;/* Our IP addr (0 = unknown) */ -IPaddr_t NetServerIP;/* Our IP addr (0 = unknown) */ +IPaddr_t NetServerIP;/* Server IP addr (0 = unknown) */ volatile uchar *NetRxPkt;/* Current receive packet */ int NetRxPktLen;/* Current rx packet length */ unsigned NetIPID;/* IP packet ID */
@@ -253,7 +258,7 @@ void ArpTimeoutCheck(void) t =get_timer (0 );/* check for arp timeout */ -if ((t - NetArpWaitTimerStart) >ARP_TIMEOUT *CFG_HZ ) { +if ((t - NetArpWaitTimerStart) >ARP_TIMEOUT *CFG_HZ /10 ) { NetArpWaitTry++;if (NetArpWaitTry >=ARP_TIMEOUT_COUNT ) {
@@ -494,7 +499,7 @@ restart:* Check the ethernet for a new packet. The ethernet * receive routine will process it. */ -eth_rx (); +eth_rx ();/* * Abort if ctrl-c was pressed.
PATCH 1/1 net: make ARP timeout configurable
Hi Guennadi,
Quoted 9 lines · Guennadi Liakhovetski
Currently the timeout waiting for an ARP reply is hard set to 5 seconds. On i.MX31ADS due to a hardware "strangeness" up to four first IP packets to the boards get lost, which typically are ARP replies. By configuring the timeout to a lower value we significantly improve the first network transfer time on this board. The timeout is specified in deciseconds, because it has to be converted to hardware ticks, and
CFG_HZranges from 900 to 27000000 on different boards.
I like this, but let's stick to SI units please, probably ms. This isn't an important enough calculation to worry about precision, only overflow, so just make sure you handle order of operations properly and it should be fine. If I'm not thinking this through properly, which is entirely possible, make the code do a /100 to get into ds rather than asking the user to provide it. I'm concerned that people will say ***WTF is a decisecond!***
Quoted 62 lines
Signed-off-by Guennadi Liakhovetski <[email protected]>---
README +4
-0@@ -1547,6 +1547,10 @@ The following options need to be configured: before giving up the operation. If not defined, a default value of 5 is used. + CONFIG_ARP_TIMEOUT + + Timeout waiting for an ARP reply in deciseconds. + - Command Interpreter: CONFIG_AUTO_COMPLETEnet/net.c +10
-5@@ -94,11 +94,16 @@DECLARE_GLOBAL_DATA_PTR ; -#define ARP_TIMEOUT 5UL/* Seconds before trying ARP again */ +#ifndef CONFIG_ARP_TIMEOUT +# define ARP_TIMEOUT 50UL/* Deciseconds before trying ARP again */ +#else +# define ARP_TIMEOUT CONFIG_ARP_TIMEOUT +#endif +#ifndef CONFIG_NET_RETRY_COUNT -# define ARP_TIMEOUT_COUNT 5/* # of timeouts before giving up */ +# define ARP_TIMEOUT_COUNT 5/* # of timeouts before giving up */ #else -# define ARP_TIMEOUT_COUNT (CONFIG_NET_RETRY_COUNT) +# define ARP_TIMEOUT_COUNT CONFIG_NET_RETRY_COUNT#endif #if 0 @@ -129,7 +134,7 @@ uchar NetOurEther[6]; /* Our ethernet address */uchar NetServerEther[6 ] =/* Boot server enet address */ {0 ,0 ,0 ,0 ,0 ,0 };IPaddr_t NetOurIP;/* Our IP addr (0 = unknown) */ -IPaddr_t NetServerIP;/* Our IP addr (0 = unknown) */ +IPaddr_t NetServerIP;/* Server IP addr (0 = unknown) */ volatile uchar *NetRxPkt;/* Current receive packet */ int NetRxPktLen;/* Current rx packet length */ unsigned NetIPID;/* IP packet ID */ @@ -253,7 +258,7 @@ void ArpTimeoutCheck(void) t =get_timer (0 );/* check for arp timeout */ -if ((t - NetArpWaitTimerStart) >ARP_TIMEOUT *CFG_HZ ) { +if ((t - NetArpWaitTimerStart) >ARP_TIMEOUT *CFG_HZ /10 ) { NetArpWaitTry++;if (NetArpWaitTry >=ARP_TIMEOUT_COUNT ) {
net/net.c restart: · line 503
Quoted 6 lines
net/net.c +1
-1@@ -494,7 +499,7 @@ restart:* Check the ethernet for a new packet. The ethernet * receive routine will process it. */ -eth_rx (); +eth_rx ();
Not sure why you did this. Is it indented from the if() once applied?
regards,
Ben
PATCH 1/1 net: make ARP timeout configurable
Quoted 11 lines · Ben Warren
Hi Guennadi,
Quoted 8 lines · Guennadi Liakhovetski
Currently the timeout waiting for an ARP reply is hard set to 5 seconds. On i.MX31ADS due to a hardware "strangeness" up to four first IP packets to the boards get lost, which typically are ARP replies. By configuring the timeout to a lower value we significantly improve the first network transfer time on this board. The timeout is specified in deciseconds, because it has to be converted to hardware ticks, and
CFG_HZranges from 900 to 27000000 on different boards.
Quoted 6 lines
I like this, but let's stick to SI units please, probably ms. This isn't an important enough calculation to worry about precision, only overflow, so just make sure you handle order of operations properly and it should be fine. If I'm not thinking this through properly, which is entirely possible, make the code do a /100 to get into ds rather than asking the user to provide it. I'm concerned that people will say ***WTF is a decisecond!***
Ok, expect a new version shortly.
Quoted 7 lines
Quoted 7 lines
net/net.c +1
-1@@ -253,7 +258,7 @@ void ArpTimeoutCheck(void) t =get_timer (0 );/* check for arp timeout */ -if ((t - NetArpWaitTimerStart) >ARP_TIMEOUT *CFG_HZ ) { +if ((t - NetArpWaitTimerStart) >ARP_TIMEOUT *CFG_HZ /10 ) { NetArpWaitTry++;if (NetArpWaitTry >=ARP_TIMEOUT_COUNT ) {
Quoted 8 lines
net/net.c restart: · line 503
Quoted 7 lines
net/net.c +1
-1@@ -494,7 +499,7 @@ restart:* Check the ethernet for a new packet. The ethernet * receive routine will process it. */ -eth_rx (); +eth_rx ();Not sure why you did this. Is it indented from the
if()once applied?
It is not under an if - it is another hunk.
Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de
PATCH 1/1 net: make ARP timeout configurable
Quoted 45 lines · Guennadi Liakhovetski
Quoted 13 lines · Ben Warren
Hi Guennadi,
Quoted 9 lines · Guennadi Liakhovetski
Currently the timeout waiting for an ARP reply is hard set to 5 seconds. On i.MX31ADS due to a hardware "strangeness" up to four first IP packets to the boards get lost, which typically are ARP replies. By configuring the timeout to a lower value we significantly improve the first network transfer time on this board. The timeout is specified in deciseconds, because it has to be converted to hardware ticks, and
CFG_HZranges from 900 to 27000000 on different boards.Quoted 7 lines
I like this, but let's stick to SI units please, probably ms. This isn't an important enough calculation to worry about precision, only overflow, so just make sure you handle order of operations properly and it should be fine. If I'm not thinking this through properly, which is entirely possible, make the code do a /100 to get into ds rather than asking the user to provide it. I'm concerned that people will say ***WTF is a decisecond!***
Ok, expect a new version shortly.
Quoted 8 lines
Quoted 8 lines
net/net.c +1
-1@@ -253,7 +258,7 @@ void ArpTimeoutCheck(void) t =get_timer (0 );/* check for arp timeout */ -if ((t - NetArpWaitTimerStart) >ARP_TIMEOUT *CFG_HZ ) { +if ((t - NetArpWaitTimerStart) >ARP_TIMEOUT *CFG_HZ /10 ) { NetArpWaitTry++;if (NetArpWaitTry >=ARP_TIMEOUT_COUNT ) {@@ -494,7 +499,7 @@ restart:Quoted 9 lines
net/net.c restart:
Quoted 7 lines
net/net.c +1
-1* Check the ethernet for a new packet. The ethernet * receive routine will process it. */ -eth_rx (); +eth_rx ();Not sure why you did this. Is it indented from the
if()once applied?
Quoted 2 lines
It is not under an if - it is another hunk.
Oh yeah. Sorry.
regards,
Ben