问题描述:
移植pjsip到rv1126bp,gcc使用的是aarch64-buildroot-linux-gnu,测试发现,PJSIP第一次发Register请求之后,服务器返回401,但pjsip没有继续发送带认证的注册请求,直接返回注册失败。

问题1:64位编译生成的头文件与32位编译头文件不一致。
问题2:注册失败出现在事务一致性检查,事务缓存认为已经有了相同的tsx请求,所以失败了。
最后分析代码到下面的方法:
PJ_DEF(pj_status_t) pjsip_tsx_create_uac2(pjsip_module *tsx_user,
pjsip_tx_data *tdata,
pj_grp_lock_t *grp_lock,
pjsip_transaction **p_tsx){
//.....
/* Generate branch parameter if it doesn't exist. */
if (via->branch_param.slen == 0) {
pj_str_t tmp;
via->branch_param.ptr = (char*)
pj_pool_alloc(tsx->pool, PJSIP_MAX_BRANCH_LEN);
via->branch_param.slen = PJSIP_MAX_BRANCH_LEN;
pj_memcpy(via->branch_param.ptr, PJSIP_RFC3261_BRANCH_ID,
PJSIP_RFC3261_BRANCH_LEN);
tmp.ptr = via->branch_param.ptr + PJSIP_RFC3261_BRANCH_LEN + 2;
*(tmp.ptr-2) = 80; *(tmp.ptr-1) = 106;
pj_generate_unique_string( &tmp );
/* Save branch parameter. */
tsx->branch = via->branch_param;
} else {
/* Copy branch parameter. */
pj_strdup(tsx->pool, &tsx->branch, &via->branch_param);
}增加打印日志发现,pj_generate_unique_string返回了相同的随机字符串作为branch标识,导致事务检查失败。
问题出在:
pjlib/build/os-auto.mak方法中,引用的随机数方法是guid_uuid.c,而原来旧有板子使用的是 guid_simple.o,并且在CFLAGS标识中,还包括了-luuid的库文件。
替换为guid_simple.o后,问题解决。
-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com
