libre README
libre is a Generic library for real-time communications with async IO support.
![OpenSSL no-deprecated and LibreSSL](https://github.com/baresip/re/workflows/OpenSSL%20no-deprecated%20and%20LibreSSL/badge.svg)
Features
- 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
- Async I/O (select, epoll, kqueue)
- UDP/TCP/TLS/DTLS transport
- JSON parser
- Real Time Messaging Protocol (RTMP)
Building
libre is using CMake. CMake and OpenSSL development headers must be
installed before building.
Build with debug enabled
$ cmake -B build
$ cmake --build build -j
$ sudo cmake --install build
$ sudo ldconfig
Build/run tests
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
Build with release
$ cmake -B build -DCMAKE_BUILD_TYPE=Release
$ cmake --build build -j
$ sudo cmake --install build
$ sudo ldconfig
Build with clang compiler
$ cmake -B build -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
$ cmake --build build -j
$ sudo cmake --install build
$ sudo ldconfig
Examples
Coding examples are available from the
redemo project.
License
The libre project is using the BSD license.
Contributing
Patches can sent via Github
Pull-Requests
Design goals
- Portable POSIX source code (ISO C99 and C11 standard)
- Robust, fast, low memory footprint
- RFC compliance
- IPv4 and IPv6 support
Modules
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) |
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
Features
- RFC 1321 - The MD5 Message-Digest Algorithm
- RFC 1886 - DNS Extensions to support IP version 6
- 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 7616 - HTTP Digest Access Authentication
- RFC 7714 - AES-GCM Authenticated Encryption in SRTP
Supported platforms
System |
Support type |
Supported versions |
Notes |
Linux |
Tier 1 |
glibc >= 2.27 |
|
Linux |
Tier 1 |
musl >= 1.2 |
|
macOS |
Tier 1 |
macOS >= 10.10 |
|
Windows |
Tier 1 |
>= Windows 8 |
MinGW-w64, >= VS 2019 |
Android |
Tier 2 |
|
|
iOS |
Tier 2 |
|
|
FreeBSD |
Tier 2 |
>= 12 |
|
OpenBSD |
Tier 2 |
>= 7.4 |
|
Linux |
Tier 2 |
uClibc |
|
Support types
-
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.
Supported versions of C Standard library
- Android bionic
- BSD libc
- GNU C Library (glibc)
- Windows C Run-Time Libraries (CRT)
- uClibc
- musl
Supported compilers:
- gcc 4.9 or later
- MSVC 2019
- clang 3.x or later
Supported versions of OpenSSL
- OpenSSL version 1.1.1
- OpenSSL version 3.x.x
- LibreSSL version 3.x
Coding guidelines
- 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
Transport protocols
|
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 |
Related projects
References
https://github.com/creytiv/re