net: lwip: provide net_start_again()
Implement net_start_again() when NET_LWIP=y in a very similar way to NET. This will be used in a future commit to determine if a failed ping needs to be tried again on a different interface. Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -471,6 +471,9 @@ static inline struct in_addr env_get_ip(char *var)
|
|||||||
|
|
||||||
int net_init(void);
|
int net_init(void);
|
||||||
|
|
||||||
|
/* Called when a network operation fails to know if it should be re-tried */
|
||||||
|
int net_start_again(void);
|
||||||
|
|
||||||
/* NET compatibility */
|
/* NET compatibility */
|
||||||
enum proto_t;
|
enum proto_t;
|
||||||
int net_loop(enum proto_t protocol);
|
int net_loop(enum proto_t protocol);
|
||||||
|
@@ -347,9 +347,6 @@ extern int net_ntp_time_offset; /* offset time from UTC */
|
|||||||
|
|
||||||
int net_loop(enum proto_t);
|
int net_loop(enum proto_t);
|
||||||
|
|
||||||
/* Load failed. Start again. */
|
|
||||||
int net_start_again(void);
|
|
||||||
|
|
||||||
/* Get size of the ethernet header when we send */
|
/* Get size of the ethernet header when we send */
|
||||||
int net_eth_hdr_size(void);
|
int net_eth_hdr_size(void);
|
||||||
|
|
||||||
|
@@ -21,6 +21,8 @@
|
|||||||
#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
|
#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
|
||||||
void (*push_packet)(void *, int len) = 0;
|
void (*push_packet)(void *, int len) = 0;
|
||||||
#endif
|
#endif
|
||||||
|
static int net_try_count;
|
||||||
|
static int net_restarted;
|
||||||
int net_restart_wrap;
|
int net_restart_wrap;
|
||||||
static uchar net_pkt_buf[(PKTBUFSRX) * PKTSIZE_ALIGN + PKTALIGN];
|
static uchar net_pkt_buf[(PKTBUFSRX) * PKTSIZE_ALIGN + PKTALIGN];
|
||||||
uchar *net_rx_packets[PKTBUFSRX];
|
uchar *net_rx_packets[PKTBUFSRX];
|
||||||
@@ -339,3 +341,42 @@ u32_t sys_now(void)
|
|||||||
{
|
{
|
||||||
return get_timer(0);
|
return get_timer(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int net_start_again(void)
|
||||||
|
{
|
||||||
|
char *nretry;
|
||||||
|
int retry_forever = 0;
|
||||||
|
unsigned long retrycnt = 0;
|
||||||
|
|
||||||
|
nretry = env_get("netretry");
|
||||||
|
if (nretry) {
|
||||||
|
if (!strcmp(nretry, "yes"))
|
||||||
|
retry_forever = 1;
|
||||||
|
else if (!strcmp(nretry, "no"))
|
||||||
|
retrycnt = 0;
|
||||||
|
else if (!strcmp(nretry, "once"))
|
||||||
|
retrycnt = 1;
|
||||||
|
else
|
||||||
|
retrycnt = simple_strtoul(nretry, NULL, 0);
|
||||||
|
} else {
|
||||||
|
retrycnt = 0;
|
||||||
|
retry_forever = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!retry_forever) && (net_try_count > retrycnt)) {
|
||||||
|
eth_halt();
|
||||||
|
/*
|
||||||
|
* We don't provide a way for the protocol to return an error,
|
||||||
|
* but this is almost always the reason.
|
||||||
|
*/
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
net_try_count++;
|
||||||
|
|
||||||
|
eth_halt();
|
||||||
|
#if !defined(CONFIG_NET_DO_NOT_TRY_ANOTHER)
|
||||||
|
eth_try_another(!net_restarted);
|
||||||
|
#endif
|
||||||
|
return eth_init();
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user