Hey everyone,
I am diving into Kamailio & trying to wrap my head around how to handle some custom SIP scenarios, when it comes to module integration. I have gone through some of the docs but still feel a bit lost on choosing the right modules & how they interact for use cases such as custom header manipulation or building out a basic call-routing logic beyond the default examples.
I am not sure if I should be using `dialog`, `tm`, or maybe even `uac` for this. Also, does anyone here have experience using Kamailio with external APIs for call control or authentication purposes? Any examples, tips or gotchas I should be aware of ? Also i have check this <a href="https://www.kamailio.org/w/features/">https://www.kamailio.org/w/features/</a>
<a href="https://www.igmguru.com/project-management/capm-certification-training">capm course</a> witch is good still need your help.
I appreciate if someone could point me to a working config or give some practical advice from experience. Still new to SIP routing logic, so trying to learn the right way early on.
Thank you.:)
Module: kamailio
Branch: master
Commit: 64635de552896fbf354e52656ec4ee93f1d87e6f
URL: https://github.com/kamailio/kamailio/commit/64635de552896fbf354e52656ec4ee9…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: 2025-06-30T08:33:35+02:00
secsipid: docs update to reflect better the use of private/public key
---
Modified: src/modules/secsipid/doc/secsipid_admin.xml
---
Diff: https://github.com/kamailio/kamailio/commit/64635de552896fbf354e52656ec4ee9…
Patch: https://github.com/kamailio/kamailio/commit/64635de552896fbf354e52656ec4ee9…
---
diff --git a/src/modules/secsipid/doc/secsipid_admin.xml b/src/modules/secsipid/doc/secsipid_admin.xml
index 4009f745149..ed70d1d2ea1 100644
--- a/src/modules/secsipid/doc/secsipid_admin.xml
+++ b/src/modules/secsipid/doc/secsipid_admin.xml
@@ -203,9 +203,9 @@ modparam("secsipid", "libopt", "CacheExpires=0")
<function moreinfo="none">secsipid_check_identity(keyPath)</function>
</title>
<para>
- Check the validity of the Identity header using the keys stored
+ Check the validity of the Identity header using the public keys stored
in the file specified by "keyPath". If the parameter is empty,
- the function is downloading the key using the URL from "info"
+ the function is downloading the public key using the URL from "info"
parameter of the Identity header, using the value of "timeout"
parameter to limit the download time. The validity of the JWT
body in the Identity header is also checked against the "expire"
@@ -271,9 +271,9 @@ request_route {
<function moreinfo="none">secsipid_check(sIdentity, keyPath)</function>
</title>
<para>
- Check the validity of the "sIdentity" parameter using the keys stored
+ Check the validity of the "sIdentity" parameter using the public keys stored
in the file specified by "keyPath". If the keyPath parameter is empty,
- the function is downloading the key using the URL from "info"
+ the function is downloading the public key using the URL from "info"
parameter of the sIdentity, using the value of "timeout"
parameter to limit the download time. The validity of the JWT
in the sIdentity value is also checked against the "expire"
@@ -384,7 +384,7 @@ request_route {
<function moreinfo="none">secsipid_add_identity(origTN, destTN, attest, origID, x5u, keyPath)</function>
</title>
<para>
- Add Identity header using the key specified by "keyPath" to sign the JWT body.
+ Add Identity header using the private key specified by "keyPath" to sign the JWT body.
If origID is empty, a UUID string is generated to fill the field. The origTN
represents the origination telephone number; destTN represents the destination
telephone number; x5u is the HTTP URL referencing to the public key that
@@ -416,7 +416,7 @@ request_route {
<function moreinfo="none">secsipid_build_identity(origTN, destTN, attest, origID, x5u, keyPath)</function>
</title>
<para>
- Build Identity value using the key specified by "keyPath" to sign the JWT body.
+ Build Identity value using the key specified by private "keyPath" to sign the JWT body.
If origID is empty, a UUID string is generated to fill the field. The origTN
represents the origination telephone number; destTN represents the destination
telephone number; x5u is the HTTP URL referencing to the public key that
@@ -482,7 +482,7 @@ request_route {
<function moreinfo="none">secsipid_sign(sheaders, spaypload, keyPath)</function>
</title>
<para>
- Build Identity value using the key specified by "keyPath" to sign the JWT body.
+ Build Identity value using the private key specified by "keyPath" to sign the JWT body.
The sheaders and spayload have to be string representation of JSON
headers and payload to be signed. On success, the Indentity value is
stored in variable $secsipid(val). It also sets $secsipid(ret) to
Module: kamailio
Branch: master
Commit: b2ac541e934bba5758c7af4e59091da24bc96ca6
URL: https://github.com/kamailio/kamailio/commit/b2ac541e934bba5758c7af4e59091da…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: 2025-06-30T08:19:55+02:00
core: formatted the list of dns error messages
---
Modified: src/core/dns_cache.c
---
Diff: https://github.com/kamailio/kamailio/commit/b2ac541e934bba5758c7af4e59091da…
Patch: https://github.com/kamailio/kamailio/commit/b2ac541e934bba5758c7af4e59091da…
---
diff --git a/src/core/dns_cache.c b/src/core/dns_cache.c
index fbc5e83f27c..6c5f8c38e1b 100644
--- a/src/core/dns_cache.c
+++ b/src/core/dns_cache.c
@@ -120,14 +120,24 @@ static atomic_t *dns_servers_up = NULL;
#endif
-static const char *dns_str_errors[] = {"no error",
- "no more records", /* not an error, but and end condition */
- "unknown error", "internal error", "bad SRV entry",
- "unresolvable SRV request", "bad A or AAAA entry",
- "unresolvable A or AAAA request", "invalid ip in A or AAAA record",
- "blocklisted ip", "name too long ", /* try again with a shorter name */
- "ip AF mismatch", /* address family mismatch */
- "unresolvable NAPTR request", "bug - critical error"};
+/* clang-format off */
+static const char *dns_str_errors[] = {
+ "no error",
+ "no more records", /* not an error, but and end condition */
+ "unknown error",
+ "internal error",
+ "bad SRV entry",
+ "unresolvable SRV request",
+ "bad A or AAAA entry",
+ "unresolvable A or AAAA request",
+ "invalid ip in A or AAAA record",
+ "blocklisted ip",
+ "name too long ", /* try again with a shorter name */
+ "ip AF mismatch", /* address family mismatch */
+ "unresolvable NAPTR request",
+ "bug - critical error"
+};
+/* clang-format on */
void dns_set_local_ttl(int ttl)