[SLOF] [PATCH 1/2] ping: use gateway address for routing

Nikunj A Dadhania nikunj at linux.vnet.ibm.com
Fri Apr 22 17:39:33 AEST 2016


Thomas Huth <thuth at redhat.com> writes:

> On 22.04.2016 07:23, Nikunj A Dadhania wrote:
>> Thomas Huth <thuth at redhat.com> writes:
>> 
>>> On 13.04.2016 09:03, Nikunj A Dadhania wrote:
>>>> ping was failing for machine across the subnet with
>>>> statically assinged IP address. The parsed gateway address
>>>> was ignored in the stack because the router variable was not
>>>> set.
>>>>
>>>> Currently, ping does not take a netmask parameter, set netmask parameter
>>>> with the common top order bits of client IP and gateway IP.
>>>>
>>>> Signed-off-by: Nikunj A Dadhania <nikunj at linux.vnet.ibm.com>
>>>> ---
>>>>  clients/net-snk/app/netapps/ping.c | 6 ++++++
>>>>  1 file changed, 6 insertions(+)
>>>>
>>>> diff --git a/clients/net-snk/app/netapps/ping.c b/clients/net-snk/app/netapps/ping.c
>>>> index 2c7dadb..1522792 100644
>>>> --- a/clients/net-snk/app/netapps/ping.c
>>>> +++ b/clients/net-snk/app/netapps/ping.c
>>>> @@ -163,6 +163,12 @@ ping(int argc, char *argv[])
>>>>  
>>>>  	} else {
>>>>  		memcpy(&fn_ip.own_ip, &ping_args.client_ip.integer, 4);
>>>> +		if (ping_args.gateway_ip.integer) {
>>>> +			uint32_t netmask;
>>>> +			netmask = ping_args.gateway_ip.integer & ping_args.client_ip.integer;
>>>> +			set_ipv4_netmask(netmask & 0xFFFFFF00);
>>>
>>> That netmask calculation looks somewhat strange to me ... what's the
>>> rationale here?
>> 
>> Ping currently only supports IPv4. Case here was that subnet mask is not
>> provided and we are trying to guess the subnet mask. Dont think this
>> will be accurate always, but will work.
>
> I think this will be very fragile. For example, let's assume client
> address is 192.168.1.10, router address is 192.168.1.1 and TFTP server
> address is 192.168.3.2 (i.e. TFTP server is in another subnet).
>
> With your calculation, you get netmask = 192.168.1.0.

Oops, yes, i should have got it as 255.255.255.0

> When the
> send_ipv4() code then tries to find out whether the TFTP server is in
> the same network as the client (to find out whether a router MAC has to
> be used), it does:
>
>    if((subnet_mask & own_ip) == (subnet_mask & ip->ip_dst)) ...
>
> and thus in above example, it will think that the TFTP server is in the
> same subnet as the client and fail to use the router address.
>
>>> If you need automatic netmask calculation, shouldn't
>>> that rather be done by the type of IP address that has been specified?
>> 
>> Here its only IPv4. We still dont have ipv6 support here. I have that in
>> my list though.
>
> I didn't mean IPv6, I was talking about IPv4 address classes (sorry,
> should have used that term). For Class A, B and C, the default netmask
> should be applied as long as no CIDR prefix length has been specified
> (see the first table on
> https://en.wikipedia.org/wiki/IPv4_subnetting_reference)
>
>>> (or maybe via an "/xx" suffix of the specified IP address string?)
>> 
>> I am not sure about this, can you please elaborate?
>
> Sorry again for not using the right terms ... I meant the specifying the
> prefix length (and thus the netmask) with a CIDR prefix notation, see
> https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation
>
> That means, it might maybe be useful to support specifying the client
> address with a prefix length like this:
>
>  load net:192.168.3.2,filename,192.168.1.10/24
>
> What do you think?

So that will be client-ip/nn, we need to take care we dont break old
cases. how about

Currently, its this

[bootp,ipv6,dhcp,]siaddr,filename,ciaddr,giaddr,bootp-retries,tftp-retries

Change that to:

[bootp,ipv6,dhcp,]siaddr,filename,ciaddr,giaddr,bootp-retries,tftp-retries,netmask


One more argument at the end.

Regards
Nikunj



More information about the SLOF mailing list