使用Asterisk 的chan_dahdi 时必须用到的一个命令是dahdi_cfg ,我很好奇dahdi_cfg 这个命令里面究竟做了些什么,有句话说:源码面前了无秘密!本篇从源码角度分析理解 dahdi_cfg 的作用。
dahdi_cfg 的源码在 dahdi-tools-2.11.1\dahdi_cfg.c 里。
先看两个宏定义:
可以猜测出 dahi_cfg 是读取/etc/dahdi/system.conf 文件内容,并通过 /dev/dahdi/ctl 将配置写入到dahdi 驱动中。
我们来跟踪一下:
这里面打开 /etc/dahdi/system.conf 文件,并逐行读取数据,取 = 号左边的字符串与 handlers 数组的keyword进行匹配,执行对应的func.
handers 数组定义如下,可以看到支持的关键字有下面这些。
再来看之前 /etc/dahdi/system.conf 的内容,来看每一行的作用。
loadzone=cn
defaultzone=cn
fxsks=1
echocanceller=OSLEC,1
loadzone=cn
其中 tone_zone_find 根据国家字母,在 builtin_zones 数组中 查找匹配的 tone_zone数据,builtin_zones 定义在 dahdi-tools-2.11.1\zonedata.c 中,截取如下:
tone_zone_register_zone 的核心部分截取如下:
其调用了
ioctl(fd, DAHDI_FREEZONE, &x)
ioctl(fd, DAHDI_LOADZONE, &h)
同样的跟踪方法,可以看出
defaultzone=cn
ioctl(fd, DAHDI_DEFAULTZONE, &deftonezone)
fxsks=1
ioctl(fd, DAHDI_CHANCONFIG, &cc[x])
echocanceller=OSLEC,1
ioctl(fd, DAHDI_ATTACH_ECHOCAN, &ae[x])
总的来说其实就是通过 /dev/dahdi/ctl 的 ioctl 接口来对dahdi 驱动进行配置。