diff mbox series

net: ping: reset stored IP once the command finishes

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

Commit Message

Marek Szyprowski March 25, 2020, 1:42 p.m. UTC
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(-)

Comments

Tom Rini June 12, 2020, 4:04 p.m. UTC | #1
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!
Marek Szyprowski June 15, 2020, 8:47 a.m. UTC | #2
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 mbox series

Patch

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);