libre is a Generic library for real-time communications with async IO support.
- Copyright (C) 2010 - 2020 Creytiv.com
- Copyright (C) 2020 - 2023 Baresip Foundation (https://github.com/baresip)
- SIP Stack (RFC 3261)
- SDP
- RTP and RTCP
- SRTP and SRTCP (Secure RTP)
- DNS-Client
- STUN/TURN/ICE stack
- BFCP
- HTTP-stack with client/server
- Websockets
- Jitter-buffer
- Async I/O (select, epoll, kqueue)
- UDP/TCP/TLS/DTLS transport
- JSON parser
- Real Time Messaging Protocol (RTMP)
libre is using CMake. CMake and OpenSSL development headers must be installed before building.
$ cmake -B build
$ cmake --build build -j
$ sudo cmake --install build
$ sudo ldconfig
cmake -B build && cmake --build build -t retest -j
build/test/retest -rv
On some distributions, /usr/local/lib may not be included in ld.so.conf.
You can check with grep "/usr/local/lib" /etc/ld.so.conf.d/*.conf
and add if necessary:
$ echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/libc.conf
$ sudo ldconfig
$ cmake -B build -DCMAKE_BUILD_TYPE=Release
$ cmake --build build -j
$ sudo cmake --install build
$ sudo ldconfig
$ cmake -B build -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
$ cmake --build build -j
$ sudo cmake --install build
$ sudo ldconfig
Coding examples are available from the redemo project
The libre project is using the BSD license.
Patches can sent via Github Pull-Requests
- Portable POSIX source code (ISO C99 and C11 standard)
- Robust, fast, low memory footprint
- RFC compliance
- IPv4 and IPv6 support
Name | Status | Description |
---|---|---|
aes | stable | AES (Advanced Encryption Standard) |
async | testing | Async module |
base64 | stable | Base-64 encoding/decoding functions |
bfcp | stable | The Binary Floor Control Protocol (BFCP) |
conf | stable | Configuration file parser |
crc32 | stable | 32-bit CRC defined in ITU V.42 |
dbg | stable | Debug printing |
dns | stable | DNS resolving (NAPTR, SRV, A) |
fmt | stable | Formatted printing and regular expression |
hash | stable | Hashmap table |
hmac | stable | HMAC: Keyed-Hashing for Message Authentication |
http | stable | HTTP parser (RFC 2616) |
httpauth | stable | HTTP-based Authentication (RFC 2617) |
ice | stable | Interactive Connectivity Establishment (ICE) |
jbuf | stable | Jitter buffer |
json | stable | JavaScript Object Notation (JSON) |
list | stable | Sortable doubly-linked list handling |
main | stable | Main poll loop |
mbuf | stable | Linear memory buffers |
md5 | stable | The MD5 Message-Digest Algorithm (RFC 1321) |
mem | stable | Memory referencing |
mod | stable | Run-time module loading |
mqueue | stable | Thread-safe message queue |
msg | stable | Generic message component library |
net | stable | Networking routines |
odict | stable | Ordered Dictionary |
rtmp | stable | Real Time Messaging Protocol |
rtp | stable | Real-time Transport Protocol |
sa | stable | Socket Address functions |
sdp | stable | Session Description Protocol |
sha | stable | Secure Hash Standard, NIST, FIPS PUB 180-1 |
sip | stable | Core SIP library |
sipevent | stable | SIP Event framework |
sipreg | stable | SIP register client |
sipsess | stable | SIP Sessions |
srtp | stable | Secure Real-time Transport Protocol (SRTP) |
stun | stable | Session Traversal Utilities for NAT (STUN) |
sys | stable | System information |
tcp | stable | TCP transport |
telev | stable | Telephony Events (RFC 4733) |
thread | testing | C11 threads (with pthread and win32 emulation) |
tls | stable | Transport Layer Security |
tmr | stable | Timer handling |
turn | stable | Obtaining Relay Addresses from STUN (TURN) |
trace | testing | Trace Helpers JSON traces (chrome://tracing) |
udp | stable | UDP transport |
unixsock | testing | Unix domain sockets |
uri | stable | Generic URI library |
websock | stable | WebSocket Client and Server |
legend:
- stable - code complete; stable code and stable API
- testing - code complete, but API might change
- unstable - code complete but not completely tested
- development - code is under development
- RFC 1321 - The MD5 Message-Digest Algorithm
- RFC 1886 - DNS Extensions to support IP version 6
- RFC 2032 - RTP Payload Format for H.261 Video Streams
- RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1
- RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication
- RFC 2782 - A DNS RR for Specifying the Location of Services (DNS SRV)
- RFC 2915 - The Naming Authority Pointer (NAPTR) DNS Resource Record
- RFC 3261 - SIP: Session Initiation Protocol
- RFC 3262 - SIP Reliability of Provisional Responses
- RFC 3263 - Locating SIP Servers
- RFC 3264 - An Offer/Answer Model with SDP
- RFC 3265 - SIP-Specific Event Notification
- RFC 3311 - The SIP UPDATE Method
- RFC 3327 - SIP Extension Header Field for Registering Non-Adjacent Contacts
- RFC 3428 - SIP Extension for Instant Messaging
- RFC 3489 - STUN - Simple Traversal of UDP Through NATs
- RFC 3515 - The SIP Refer Method
- RFC 3550 - RTP: A Transport Protocol for Real-Time Applications
- RFC 3551 - RTP Profile for Audio and Video Conferences with Minimal Control
- RFC 3555 - MIME Type Registration of RTP Payload Formats
- RFC 3556 - SDP Bandwidth Modifiers for RTCP Bandwidth
- RFC 3581 - An Extension to SIP for Symmetric Response Routing
- RFC 3605 - RTCP attribute in SDP
- RFC 3711 - The Secure Real-time Transport Protocol (SRTP)
- RFC 3969 - The IANA URI Parameter Registry for SIP
- RFC 3994 - Indication of Message Composition for Instant Messaging
- RFC 4566 - SDP: Session Description Protocol
- RFC 4582 - The Binary Floor Control Protocol (BFCP)
- RFC 4582bis - The Binary Floor Control Protocol (BFCP)
- RFC 4585 - Extended RTP Profile for RTCP-Based Feedback
- RFC 4733 - RTP Payload for DTMF Digits, Telephony Tones, and Teleph. Signals
- RFC 4961 - Symmetric RTP / RTP Control Protocol (RTCP)
- RFC 5104 - Codec Control Messages in AVPF
- RFC 5118 - SIP Torture Test Messages for IPv6
- RFC 5245 - Interactive Connectivity Establishment (ICE)
- RFC 5246 - The TLS Protocol Version 1.2
- RFC 5389 - Session Traversal Utilities for NAT (STUN)
- RFC 5626 - Managing Client-Initiated Connections in SIP
- RFC 5761 - Multiplexing RTP Data and Control Packets on a Single Port
- RFC 5766 - Traversal Using Relays around NAT (TURN)
- RFC 5768 - Indicating Support for ICE in SIP
- RFC 5769 - Test vectors for STUN
- RFC 5780 - NAT Behaviour Discovery Using STUN
- RFC 6026 - Correct Transaction Handling for 2xx Resp. to SIP INVITE Requests
- RFC 6156 - TURN Extension for IPv6
- RFC 6188 - The Use of AES-192 and AES-256 in Secure RTP
- RFC 6455 - The WebSocket Protocol
- RFC 7159 - JavaScript Object Notation (JSON)
- RFC 7350 - DTLS as Transport for STUN
- RFC 7714 - AES-GCM Authenticated Encryption in SRTP
System | Support type | Supported versions | Notes |
---|---|---|---|
Linux | Tier 1 | glibc >= 2.27 (Ubuntu 18.04) | |
macOS | Tier 1 | macOS >= 10.10 | |
Windows | Tier 1 | >= Windows 8 | MinGW-w64, >= VS 2019 |
Android | Tier 2 | ||
iOS | Tier 2 | ||
FreeBSD | Tier 2 | >= 11 | |
OpenBSD | Tier 2 | >= 6.7 | |
Linux | Tier 2 | uClibc |
-
Tier 1: Officially supported and tested with CI. Any contributed patch MUST NOT break such systems.
-
Tier 2: Officially supported, but not necessarily tested with CI. These systems are maintained to the best of collaborators ability, without being a top priority.
-
Tier 3: Community maintained. These systems may inadvertently break and the community and interested parties are expected to help with the maintenance.
- Android bionic
- BSD libc
- GNU C Library (glibc)
- Windows C Run-Time Libraries (CRT)
- uClibc
- gcc 4.9 or later
- MSVC 2019
- clang 3.x or later
- OpenSSL version 1.1.1
- OpenSSL version 3.0.x
- OpenSSL version 3.1.x
- LibreSSL version 3.x
- Use enum for constants where appropriate
- Use const as much as possible (where appropriate)
- Use C99 data types (intN_t, uintN_t, bool)
- Hide data-types in .c files where possible (use struct foo)
- Avoid malloc/free, use mem_alloc/mem_deref instead
- CVS/svn/git tags are NOT allowed in the code!
- Avoid bit-fields in structs which are not portable
- Use dummy handlers for timing-critical callbacks
- return err, return alloced objects as pointer-pointers
- in allocating functions, first arg is always double pointer
- Use POSIX error-codes; EINVAL for invalid args, EBADMSG for parse errors and EPROTO for protocol errors
TCP | UDP | TLS | DTLS | |
---|---|---|---|---|
BFCP | - | yes | - | - |
DNS | yes | yes | - | - |
HTTP | yes | n/a | yes | n/a |
ICE | - | yes | - | - |
RTP | - | yes | - | - |
RTCP | - | yes | - | - |
RTMP | yes | - | yes | - |
SIP | yes | yes | yes | - |
STUN | yes | yes | yes | yes |
TURN | yes | yes | yes | yes |
WEBSOCK | yes | n/a | yes | n/a |