| includes | ||
| libcli@a1bb371d3a | ||
| libicmp@1a4a007dbb | ||
| src | ||
| tests | ||
| .gitignore | ||
| .gitmodules | ||
| autogen.sh | ||
| configure.ac | ||
| LICENSE | ||
| Makefile.am | ||
| README.md | ||
net-tools
A collection of ICMPv4 network utilities as an alternative to standard system commands (ping, ...).
Code Style
- Allman braces: opening and closing braces each on their own line
- Yoda conditions: constant on the left (e.g. 0 == val, NULL != ptr)
- C99 compliant
- Tabs only, width 4
- snake_case for functions and variables, SCREAMING_SNAKE_CASE for macros
- System includes, then a blank line, then local includes
- Variable declarations aligned with tabs within the function body
- Static helper functions are forward-declared at the top of the file and defined after the main public function
- Function definitions (not forward declarations or prototypes) have a newline between the return type and the function name
- Line continuations are indented 2 tabs past the base scope indentation
Dependencies
- clang (C99)
- make
- bash (configure script)
- POSIX-compliant OS
- libc
For tests only:
- criterion
Binaries
ft_ping
Alternative to inetutils ping. Sends ICMPv4 ECHO_REQUEST packets to network hosts and reports RTT statistics. Requires root (raw socket).
ft_ping - Send ICMP ECHO_REQUEST to network hosts
Usage: ft_ping [options] <destination>
Options:
-h, --help Display this help and exit
-V, --version Display version information and exit
-v, --verbose Verbose output
-q, --quiet Quiet mode (only show summary)
-c, --count <NUM> Stop after sending N packets
-i, --interval <SEC> Wait N seconds between packets
-t, --ttl <TTL> Set Time To Live
-s, --size <SIZE> Packet size in bytes
-W, --timeout <SEC> Timeout for replies in seconds
-w, --deadline <SEC> Exit after N seconds regardless of packets sent/received
-f, --flood Flood mode
-M, --dont-fragment Set the Don't Fragment bit
Modules
libicmp
Handles everything ICMP at the socket level: open a raw socket, build and send echo requests, receive and parse replies. No loop, no display. Just a clean interface over the kernel socket.
src/cli
Shared CLI parsing layer used by all binaries. Provides a generic getopt wrapper and primitive parsers (int, float) that each binary plugs into.
src//cli
Per-binary argument parsing. Defines the accepted options, validates them, and fills the binary-specific config struct.
src/ping/core
Drives the ping session for one destination. ping_run() creates the socket and calls ping_one() for each destination. ping_one() sets up state, runs the loop, and prints the summary. ping_loop() uses select() to wait for packets and reacts to send/stop flags. ping_send_one() builds the payload and calls libicmp. ping_callback() handles incoming replies and errors.
src/ping/scheduler
Manages timing and signals. Installs SIGALRM (triggers send) and SIGINT (triggers stop). Arms a one-shot timer via setitimer() after each send. Signal handlers only write a flag -- the loop does the actual work.
src/ping/tracker
A 128-slot circular buffer indexed by (seq % 128). Records when each packet was sent and marks it when a reply arrives. Used to compute RTT and detect duplicates.
src/ping/stats
Accumulates RTT samples (min, max, sum, sum of squares) in nanoseconds. Computes min/avg/max/mdev in milliseconds on demand.
src/ping/output
All user-facing output: the opening line, per-packet lines, ICMP error messages, the final statistics summary, and flood mode dots.
License
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
Authors
- lohhiiccc - GitHub