kamailio setflag说明
kamailio.cfg 文件的开头部分可以看到这些标志位的定义:
1 | #!define FLT_ACC 1 |
标志位说明:
- FLT_ACC (1):用于事务级计费
- FLT_ACCMISSED (2):用于未接来电计费
- FLT_ACCFAILED (3):用于失败事务计费
- FLT_DLG (4):用于对话级计费(CDR生成)
- FLT_NATS (5):用于NAT相关处理
使用方式:
- 设置标志:setflag(FLT_ACC)
- 检查标志:isflagset(FLT_ACC)
- 重置标志:resetflag(FLT_ACC)
这些标志位是 Kamailio 的事务标志(transaction flags),用于在消息处理过程中标记特定的处理需求,比如计费、NAT处理、来源标识等。每个标志位用一个唯一的数字标识,在整个 SIP 事务处理过程中保持有效。
工作机制
在 Kamailio 中,setflag() 的工作机制是这样的:
标志位存储机制:
- 位图存储:事务标志是用位图(bitmap)方式存储的,每个标志位占用一个二进制位
- 独立设置:每次调用 setflag(n) 只会将第 n 位设置为 1,不影响其他位的值
- 累积效果:多个标志位可以同时设置,形成一个标志位组合
示例:
1 | setflag(FLT_ACC); # 设置标志位 1 |
实际存储的是一个二进制数,其中对应的位都被设置为 1:
- 标志位 1 (FLT_ACC) = 1
- 标志位 3 (FLT_ACCFAILED) = 1
- 标志位 4 (FLT_DLG) = 1
- 其他位 = 0
检查标志位:
1 | if(isflagset(FLT_ACC)) { # 检查标志位 1 是否设置 |
这种设计允许在同一个事务中同时设置多个不同的处理标志,每种处理逻辑可以独立检查和响应相应的标志位。