移植pjsip到rv1126bp注册失败问题分析

问题描述:

移植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

请先登录后发表评论
  • 最新评论
  • 总共0条评论