schweikert / fping

High performance ping tool

Home Page:https://fping.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Inconsistent limits for address generation via `-g`, `--generator` using either range or CIDR

auerswal opened this issue · comments

When using fping -g with a range, the number of addresses that may be generated is limited (via the MAX_GENERATE constant in src/fping.c):

$ fping -q --stats -g 127.0.0.1 127.1.255.254
./src/fping: -g parameter generates too many addresses

But this limit is not applied when using CIDR notation:

$ ipcalc 127.0.0.0/15 | grep 'HostM[ai][nx]'
HostMin:      127.0.0.1
HostMax:      127.1.255.254
$ fping -q --stats -g 127.0.0.0/15

  131070 targets
  131070 alive
       0 unreachable
       0 unknown addresses

       0 timeouts (waiting for response)
  131070 ICMP Echos sent
  131070 ICMP Echo Replies received
       0 other ICMP received

 0.005 ms (min round trip time)
 0.033 ms (avg round trip time)
 0.166 ms (max round trip time)
     1328.103 sec (elapsed real time)

I have mentioned this in a comment on issue #59, because I think that applying a consistent limit to address generation is a prerequisite for expanding -g functionality to include IPv6, but I'd prefer to track this issue independently.

I can refresh my respective patches that have been part of the IPv6 generator pull request #254 and submit them as a new pull request. Just let me know if this desired.

To collect relevant information in one place:

  • The restrictions for address generation are not documented (neither man page nor --help output mention them).

  • There is also an inconsistency (off-by-one) in the comment describing the constant used to limit address generation when using start and end addresses:

    $ git grep -n MAX_GENERATE
    src/fping.c:142:#define MAX_GENERATE 100000 /* maximum number of hosts that -g can generate */
    src/fping.c:1342:    if (end_long > start_long + MAX_GENERATE) {
    $ ./src/fping -q -s -g 127.0.0.1 127.1.134.162
    ./src/fping: -g parameter generates too many addresses
    $ ./src/fping -q -s -g 127.0.0.1 127.1.134.161
    
      100001 targets
      100001 alive
           0 unreachable
           0 unknown addresses
    
           0 timeouts (waiting for response)
      100001 ICMP Echos sent
      100001 ICMP Echo Replies received
           0 other ICMP received
    
     0.006 ms (min round trip time)
     0.032 ms (avg round trip time)
     0.321 ms (max round trip time)
         1012.501 sec (elapsed real time)
    
    

Another point to consider: Using --generate with a large CIDR subnet can result in problems, e.g., using too much memory:

$ ./src/fping -q -s -g 127.0.0.0/8
Killed
$ dmesg -t | grep -E '^(oom-kill|Out of memory)'
oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/user@1000.service,task=fping,pid=10558,uid=1000
Out of memory: Killed process 10558 (fping) total-vm:5346240kB, anon-rss:5343568kB, file-rss:172kB, shmem-rss:0kB, UID:1000 pgtables:10504kB oom_score_adj:0

Therefore I'd say that having a limit is useful.