rcl consists of functions and structs (pure C) organized into ROS concepts:
- Nodes
 
- Publisher
 
- Subscription
 
- Service Client
 
- Service Server
 
- Timer
 
It also has some machinery that is necessary to wait on and act on these concepts:
- Initialization and shutdown management (global for now)
 
- Wait sets for waiting on messages/service requests and responses/timers to be ready
 
- Guard conditions for waking up wait sets asynchronously
 
- Functions for introspecting and getting notified of changes of the ROS graph
 
Further still there are some useful abstractions and utilities:
- Allocator concept, which can used to control allocation in 
rcl_* functions
 
- Concept of ROS Time and access to steady and system wall time
 
- Error handling functionality (C style)
 
- Macros
 
- Return code types
 
- Macros for controlling symbol visibility on the library