Skip to content
choco-technologiesPublic

About

ICMP protocol implementation

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

dmicmp

License CI

dmicmp DMOD library module.

Description

dmicmp builds and parses ICMP messages (RFC 792 for ICMPv4, RFC 4443 for ICMPv6) and plugs into dmip's protocol dispatch: it registers as the handler for ICMP's own IP protocol number (answering an incoming Echo Request with an Echo Reply inline, no extra thread needed) and as dmip's default handler, replying with an ICMPv4 Destination Unreachable to any IP packet whose protocol nobody else claimed. See docs/dmicmp.md for the full design rationale, including the deliberate, temporary IPv6-send gap (no dmip_v6_send() yet) and the echo-reply listener registry used for sending our own Echo Request ("ping").

Building

Using CMake

mkdir -p build
cd build
cmake ..
cmake --build .

Pass -DDMOD_DIR=/path/to/local/dmod to build against a local dmod checkout instead of fetching develop from GitHub.

Using Make

make DMOD_MODE=DMOD_MODULE DMOD_DIR=/path/to/dmod

Testing

Tests are built automatically alongside the module (see tests/). Once built, run them with ctest:

cd build
ctest --output-on-failure

ctest installs the test module's dependencies with dmf-get and then runs it through dmod_loader. To run it manually instead:

export DMOD_DMF_DIR=$(pwd)/build/dmf
dmf-get install -d ${DMOD_DMF_DIR}/test_dmicmp-local.dmd -y
dmod_loader build/dmf/test_dmicmp.dmf

Usage

dmicmp needs no setup from other modules to do its core job (answering pings, reporting an unclaimed protocol) - it registers itself with dmip automatically in dmod_init(). A module that wants to send its own ping or report its own delivery failure calls it directly:

#include "dmicmp.h"

/* Report "port unreachable" for a UDP datagram nobody's listening for */
dmicmp_v4_send_dest_unreachable(dmicmp_v4_dest_unreachable_port,
                                 original_ip_packet, original_ip_packet_len,
                                 DMARP_DEFAULT_TIMEOUT_MS);

/* Send a ping and find out about the reply */
dmicmp_register_echo_listener(my_identifier, my_echo_reply_handler);
dmicmp_v4_send_echo_request(&dst, my_identifier, 1, NULL, 0, DMARP_DEFAULT_TIMEOUT_MS);

Tools

  • tools/ping - CLI to send ICMPv4 Echo Requests to a host and report the replies, built on the API below. It's its own Application-type DMOD module (ping), released alongside dmicmp itself in every tagged release.

Running as a service

dmicmp answers pings as soon as it's loaded and enabled, but being a Library-type module it has no main() to spawn on its own - something still needs to load it. configs/ has a dmsystem/libsystemd unit (icmp.ini, exec=dmicmp type=library) that registers dmicmp directly as a service - no separate loader script needed. service start icmp/service stop icmp load+enable / disable+unload it. See docs/service.md for the full setup.

API

Function Description
dmicmp_build_header() / _parse_header() Build/parse the 8-byte common ICMP header
dmicmp_v4_checksum_valid() / _v6_checksum_valid() Verify a received ICMP message's checksum
dmicmp_v4_send_error() General-purpose: send an arbitrary ICMPv4 error message (any type/code) about some undeliverable original packet
dmicmp_v4_send_dest_unreachable() Thin wrapper over dmicmp_v4_send_error() for the common Destination Unreachable case
dmicmp_v4_send_echo_request() Send an ICMPv4 Echo Request ("ping")
dmicmp_register_echo_listener() / _unregister_echo_listener() Learn about the Echo Reply matching a ping's identifier

See include/dmicmp.h for the full declarations and docs/api-reference.md for the complete reference.

Documentation

See the docs/ directory:

View documentation using dmf-man dmicmp.

Project Structure

dmicmp/
├── configs/           # dmsystem unit (type=library) to register dmicmp as a service
│   └── icmp.ini
├── docs/              # Documentation (markdown format)
├── include/           # Public headers
│   └── dmicmp.h
├── src/
│   └── dmicmp.c
├── tests/
│   ├── CMakeLists.txt
│   └── dmicmp_test.c
├── tools/
│   ├── CMakeLists.txt
│   └── ping/          # ping CLI - its own Application-type module, see tools/ping/README.md
├── CMakeLists.txt
├── Makefile
├── dmicmp.dmr
└── manifest.dmm

Author

Patryk Kubiak

License

MIT

About

ICMP protocol implementation

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages