A Rust-based subnet calculator that replicates and extends the functionality of the original sipcalc
tool.
- Multiple input formats (CIDR, dotted decimal netmask, hex netmask)
- Network address, broadcast address, and usable range calculations
- Binary representation of addresses and masks
- Subnet splitting with various mask formats
- Classful network information
- Network interface address retrieval
- Flexible IPv6 input formats (compressed and expanded)
- Address type identification (Global Unicast, Link-Local, etc.)
- IPv4-in-IPv6 embedded address detection
- Reverse DNS pointer generation
- Subnet splitting for IPv6 networks
- Network range calculations
- JSON output format for easy integration with other tools
- Enhanced IPv6 support including interface queries
- Cross-platform compatibility (Linux, macOS)
- DNS resolution for hostnames
- Batch processing via stdin
- Comprehensive error handling
The table below summarizes feature parity between ripcalc and the original sipcalc tool. A feature is marked supported only if ripcalc has both unit tests covering it and a captured “golden” output test comparing against sipcalc
.
Feature | ripcalc | sipcalc |
---|---|---|
IPv4 CIDR notation (/ ) |
✓ | ✓ |
IPv4 dotted decimal mask | ✓ | ✓ |
IPv4 hex netmask | ✓ | ✓ |
IPv4 subnet splitting (-s ) |
✓ | ✓ |
IPv4 extra subnets (-n ) |
✓ | ✓ |
IPv4 classful info (-c ) |
✓ | ✓ |
IPv4 CIDR bitmap (-b ) |
✓ | ✓ |
IPv4 classful bitmap (-x ) |
✓ | ✓ |
IPv6 CIDR notation (/ ) |
✓ | ✓ |
IPv6 reverse DNS (-r ) |
✓ | ✓ |
IPv6 IPv4‐in‐IPv6 (-e ) |
✓ | ✓ |
IPv6 subnet splitting (-S ) |
✓ | ✓ |
git clone https://github.com/bedecarroll/ripcalc.git
cd ripcalc
cargo build --release
The binary will be available at target/release/ripcalc
.
# Install manpage system-wide
./scripts/install-manpage.sh
# Install shell completions (bash, zsh, fish)
./scripts/install-completions.sh
# Coming soon
cargo install ripcalc # crates.io
brew install ripcalc # Homebrew
# IPv4 CIDR notation
ripcalc 192.168.1.0/24
# IPv4 with dotted decimal netmask
ripcalc "192.168.1.5 255.255.255.0"
# IPv4 with hex netmask
ripcalc "10.0.0.1 0xFFFFFF00"
# IPv6 subnet
ripcalc 2001:db8::/48
# Multiple inputs
ripcalc 192.168.1.0/24 10.0.0.0/16 2001:db8::/32
# All information (sipcalc compatible)
ripcalc -a 192.168.1.0/24
# CIDR and classful bitmaps
ripcalc -b 192.168.1.0/24 # CIDR bitmap
ripcalc -x 192.168.1.0/24 # Classful bitmap
# Classful vs CIDR information
ripcalc -c 192.168.1.0/24 # Classful address info
ripcalc -i 192.168.1.0/24 # CIDR address info (default)
# Subnet splitting (sipcalc compatible)
ripcalc -s 26 192.168.1.0/24 # Split IPv4 into /26 subnets
ripcalc -S 64 2001:db8::/48 # Split IPv6 into /64 subnets
ripcalc -s 28 -u 192.168.1.0/24 # Verbose subnet splitting
# Extra subnets
ripcalc -n 3 192.168.1.0/24 # Show next 3 subnets
ripcalc -n 0 192.168.10.0/26 # Show all /24 subnets containing this network
# IPv6 specific options
ripcalc -r 2001:db8::1/64 # IPv6 reverse DNS
ripcalc -e ::ffff:192.0.2.1 # IPv4-in-IPv6 information
# Address specification flags
ripcalc -4 192.168.1.0/24 -6 2001:db8::/48 # Specify IPv4 and IPv6
ripcalc -I eth0 # Interface addresses
# DNS resolution
ripcalc -d google.com # Enable DNS resolution
# Modern extensions
ripcalc --json 192.168.1.0/24 # JSON output
# Batch processing from stdin
echo -e "192.168.1.0/24\\n10.0.0.0/16" | ripcalc
ripcalc - # Read from stdin
Global Options:
-a, --all
: All possible information-d, --resolve
: Enable name resolution-I, --addr-int <INT>
: Add an interface-n, --subnets <NUM>
: Display NUM extra subnets (starting from current subnet)-u, --split-verbose
: Verbose split-4, --addr-ipv4 <ADDR>
: Add an IPv4 address-6, --addr-ipv6 <ADDR>
: Add an IPv6 address-h, --help
: Display help-V, --version
: Version information
IPv4 Options:
-b, --cidr-bitmap
: CIDR bitmap-c, --classful-addr
: Classful address information-i, --cidr-addr
: CIDR address information (default)-s, --v4split <MASK>
: Split the current network into subnets of MASK size-w, --wildcard
: Display information for a wildcard (inverse mask)-x, --classful-bitmap
: Classful bitmap
IPv6 Options:
-e, --v4inv6
: IPv4 compatible IPv6 information-r, --v6rev
: IPv6 reverse DNS output-S, --v6split <MASK>
: Split the current network into subnets of MASK size-t, --v6-standard
: Standard IPv6 (default)
Modern Extensions:
--json
: Output results in JSON format
-[ipv4 : 192.168.1.0/24] - 0
[CIDR]
Host address - 192.168.1.0
Host address (decimal) - 3232235776
Host address (hex) - C0A80100
Network address - 192.168.1.0
Network mask - 255.255.255.0
Network mask (bits) - 24
Network mask (hex) - FFFFFF00
Broadcast address - 192.168.1.255
Cisco wildcard - 0.0.0.255
Addresses in network - 256
Network range - 192.168.1.0 - 192.168.1.255
Usable range - 192.168.1.1 - 192.168.1.254
-
-[ipv6 : 2001:db8::/48] - 0
[IPv6]
Expanded Address - 2001:0db8:0000:0000:0000:0000:0000:0000
Compressed Address - 2001:db8::
Subnet prefix - 2001:db8::/48
Address ID - ::
Prefix address - ffff:ffff:ffff::
Prefix length - 48
Address type - Documentation
Network range - 2001:db8:: - 2001:db8:0:ffff:ffff:ffff:ffff:ffff
Reverse DNS - 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
-
The --json
flag produces structured output suitable for programmatic consumption:
{
"type": "ipv4",
"input": "192.168.1.0/24",
"index": 0,
"host_address": "192.168.1.0",
"host_address_decimal": 3232235776,
"host_address_hex": "C0A80100",
"network_address": "192.168.1.0",
"network_mask": "255.255.255.0",
"network_mask_bits": 24,
"network_mask_hex": "FFFFFF00",
"broadcast_address": "192.168.1.255",
"cisco_wildcard": "0.0.0.255",
"addresses_in_network": 256,
"usable_addresses": 254,
"network_range": {
"start": "192.168.1.0",
"end": "192.168.1.255"
},
"usable_range": {
"start": "192.168.1.1",
"end": "192.168.1.254"
}
}
ripcalc
is designed to be a drop-in replacement for sipcalc
with the same command-line interface and output format. All original sipcalc
functionality is supported, plus additional modern features.
ripcalc deliberately uses modern IPv6 address classification that diverges from sipcalc for better accuracy.
Address Type | sipcalc (outdated) | ripcalc (modern) |
---|---|---|
2001:db8::/32 |
"Aggregatable Global Unicast" | "Documentation Address" ✅ |
Global addresses | Generic classification | Regional identification (ARIN, RIPE, etc.) ✅ |
Special-purpose | Limited detection | Comprehensive (Teredo, 6to4, etc.) ✅ |
This provides more accurate and useful information for modern IPv6 networks, following current IANA registries and RFC specifications as of 2024.
clap
: Command-line argument parsingipnetwork
: IP network calculationsserde
&serde_json
: JSON serializationget_if_addrs
: Network interface enumerationdns-lookup
: DNS resolutionanyhow
: Error handlingtokio
: Async runtime
MIT License
This project maintains highest quality standards with comprehensive linting and testing.
# Clone and build
git clone https://github.com/bedecarroll/ripcalc.git
cd ripcalc
cargo build
# Run with our comprehensive quality checks
cargo fmt --all
cargo clippy --all-targets -- -D warnings -W clippy::pedantic -W clippy::nursery
cargo test
This project maintains clippy compliance at nursery level - the highest available lint level in Rust:
- Zero warnings allowed in CI/CD
- No
#[allow]
bypasses for actual issues - fix the underlying problem - Comprehensive linting: pedantic + nursery + all lint groups
- High code quality: const functions, proper Self usage, documented design decisions
See AGENTS.md for complete development workflow and quality guidelines.
Contributions are welcome! Please ensure all development workflow steps pass before submitting:
- Follow the development workflow
- Maintain code quality standards
- Submit issues and pull requests via GitHub
All changes must pass our comprehensive linting and testing before merge.