Message ID | 20200325134200.18959-1-m.szyprowski@samsung.com |
---|---|
State | Changes Requested |
Delegated to: | Tom Rini |
Headers | show |
Series | net: ping: reset stored IP once the command finishes | expand |
On Wed, Mar 25, 2020 at 02:42:00PM +0100, Marek Szyprowski wrote: > Reset stored ping IP address before leaving the netloop to ensure that > the subsequent calls to the netloop, especially for the other protocols, > won't be interrupted by the received ICMP_ECHO_REPLY packet. > > Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> > --- > net/ping.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/net/ping.c b/net/ping.c > index 633c942..d912e3d 100644 > --- a/net/ping.c > +++ b/net/ping.c > @@ -63,6 +63,7 @@ static int ping_send(void) > static void ping_timeout_handler(void) > { > eth_halt(); > + net_ping_ip.s_addr = 0; > net_set_state(NETLOOP_FAIL); /* we did not get the reply */ > } > > @@ -84,8 +85,10 @@ void ping_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len) > switch (icmph->type) { > case ICMP_ECHO_REPLY: > src_ip = net_read_ip((void *)&ip->ip_src); > - if (src_ip.s_addr == net_ping_ip.s_addr) > + if (src_ip.s_addr == net_ping_ip.s_addr) { > + net_ping_ip.s_addr = 0; > net_set_state(NETLOOP_SUCCESS); > + } > return; > case ICMP_ECHO_REQUEST: > eth_hdr_size = net_update_ether(et, et->et_src, PROT_IP); This breaks a number of tests in test/dm/eth.c. Can you please adjust the tests as well to not rely on the behavior you're fixing? Thanks!
Hi Tom, On 12.06.2020 18:04, Tom Rini wrote: > On Wed, Mar 25, 2020 at 02:42:00PM +0100, Marek Szyprowski wrote: >> Reset stored ping IP address before leaving the netloop to ensure that >> the subsequent calls to the netloop, especially for the other protocols, >> won't be interrupted by the received ICMP_ECHO_REPLY packet. >> >> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> >> --- >> net/ping.c | 5 ++++- >> 1 file changed, 4 insertions(+), 1 deletion(-) >> >> diff --git a/net/ping.c b/net/ping.c >> index 633c942..d912e3d 100644 >> --- a/net/ping.c >> +++ b/net/ping.c >> @@ -63,6 +63,7 @@ static int ping_send(void) >> static void ping_timeout_handler(void) >> { >> eth_halt(); >> + net_ping_ip.s_addr = 0; >> net_set_state(NETLOOP_FAIL); /* we did not get the reply */ >> } >> >> @@ -84,8 +85,10 @@ void ping_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len) >> switch (icmph->type) { >> case ICMP_ECHO_REPLY: >> src_ip = net_read_ip((void *)&ip->ip_src); >> - if (src_ip.s_addr == net_ping_ip.s_addr) >> + if (src_ip.s_addr == net_ping_ip.s_addr) { >> + net_ping_ip.s_addr = 0; >> net_set_state(NETLOOP_SUCCESS); >> + } >> return; >> case ICMP_ECHO_REQUEST: >> eth_hdr_size = net_update_ether(et, et->et_src, PROT_IP); > This breaks a number of tests in test/dm/eth.c. Can you please adjust > the tests as well to not rely on the behavior you're fixing? Thanks! I've checked and it turned out that it is not possible to fix the net_retry test. It clearly shows that the net_retry feature relies on the fact that the state machine of the net related commands are preserved between the calls. I wonder how to fix this without breaking the netretry feature. The only solution I see is to clear net_ping_ip at the beginning of the net_loop() if the protocol is not equal to PING. Quite ugly... Best regards
diff --git a/net/ping.c b/net/ping.c index 633c942..d912e3d 100644 --- a/net/ping.c +++ b/net/ping.c @@ -63,6 +63,7 @@ static int ping_send(void) static void ping_timeout_handler(void) { eth_halt(); + net_ping_ip.s_addr = 0; net_set_state(NETLOOP_FAIL); /* we did not get the reply */ } @@ -84,8 +85,10 @@ void ping_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len) switch (icmph->type) { case ICMP_ECHO_REPLY: src_ip = net_read_ip((void *)&ip->ip_src); - if (src_ip.s_addr == net_ping_ip.s_addr) + if (src_ip.s_addr == net_ping_ip.s_addr) { + net_ping_ip.s_addr = 0; net_set_state(NETLOOP_SUCCESS); + } return; case ICMP_ECHO_REQUEST: eth_hdr_size = net_update_ether(et, et->et_src, PROT_IP);
Reset stored ping IP address before leaving the netloop to ensure that the subsequent calls to the netloop, especially for the other protocols, won't be interrupted by the received ICMP_ECHO_REPLY packet. Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> --- net/ping.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)