kamailio setflag说明

kamailio.cfg 文件的开头部分可以看到这些标志位的定义:

1
2
3
4
5
6
7
8
9
10
11
#!define FLT_ACC 1
#!define FLT_ACCMISSED 2
#!define FLT_ACCFAILED 3
#!define FLT_DLG 4
#!define FLT_NATS 5

#!define FLB_NATB 6
#!define FLB_NATSIPPING 7

#!define FLT_FROM_CORE 20
#!define FLT_FROM_PUBLIC 21

标志位说明:

  1. FLT_ACC (1):用于事务级计费
  2. FLT_ACCMISSED (2):用于未接来电计费
  3. FLT_ACCFAILED (3):用于失败事务计费
  4. FLT_DLG (4):用于对话级计费(CDR生成)
  5. FLT_NATS (5):用于NAT相关处理

使用方式:

  • 设置标志:setflag(FLT_ACC)
  • 检查标志:isflagset(FLT_ACC)
  • 重置标志:resetflag(FLT_ACC)

这些标志位是 Kamailio 的事务标志(transaction flags),用于在消息处理过程中标记特定的处理需求,比如计费、NAT处理、来源标识等。每个标志位用一个唯一的数字标识,在整个 SIP 事务处理过程中保持有效。

工作机制

在 Kamailio 中,setflag() 的工作机制是这样的:

标志位存储机制:

  1. 位图存储:事务标志是用位图(bitmap)方式存储的,每个标志位占用一个二进制位
  2. 独立设置:每次调用 setflag(n) 只会将第 n 位设置为 1,不影响其他位的值
  3. 累积效果:多个标志位可以同时设置,形成一个标志位组合

示例:

1
2
3
setflag(FLT_ACC);     # 设置标志位 1
setflag(FLT_DLG); # 设置标志位 4
setflag(FLT_ACCFAILED); # 设置标志位 3

实际存储的是一个二进制数,其中对应的位都被设置为 1:

  • 标志位 1 (FLT_ACC) = 1
  • 标志位 3 (FLT_ACCFAILED) = 1
  • 标志位 4 (FLT_DLG) = 1
  • 其他位 = 0

检查标志位:

1
2
3
4
5
6
7
if(isflagset(FLT_ACC)) {      # 检查标志位 1 是否设置
# 处理计费逻辑
}

if(isflagset(FLT_DLG)) { # 检查标志位 4 是否设置
# 处理CDR逻辑
}

这种设计允许在同一个事务中同时设置多个不同的处理标志,每种处理逻辑可以独立检查和响应相应的标志位。