尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【OpenAirInterface5g】RRC NR解析之RrcSetupRequest

【OpenAirInterface5g】RRC NR解析之RrcSetupRequest
📅 发布时间:2026/7/24 20:21:54

作者:柒号华仔
个人主页:欢迎访问我的主页
个人信条:星光不问赶路人,岁月不负有心人。
个人方向:专注于4G/5G领域,同时兼顾其他网络协议,编解码协议,C/C++,linux等,感兴趣的小伙伴可以关注我,一起交流。


目录

    • 1. RrcSetupRequest介绍
      • 1.1 发起目的
      • 1.2 信令内容抓包
      • 1.3 gNB回复
    • 2. RrcSetupRequest解析处理流程
    • 3. 相关代码

1. RrcSetupRequest介绍

Rrc setup Request消息由UE发起,携带RRC建立原因和UE标识,用于UE向gNB请求建立RRC 连接,传输信道为CCCH。

1.1 发起目的

  • 建立SRB1无线承载
  • 发送NAS消息

1.2 信令内容抓包

信令抓包

  • ue-Identity为终端标识,类型为randomValue
  • randomValue是长度为39bit的随机值
  • establishmentCause为建立原因mo-Signalling,常见的有mt-Access、mo-Signalling以及mo-Data三种原因。

1.3 gNB回复

gNB进行准入判断,若允许UE接入,回复RRC Connection Setup继续接入流程;若不允许,回复RRC Connection Reject拒绝接入


2. RrcSetupRequest解析处理流程

OAI 调用nr_rrc_gNB_decode_ccch()函数解码CCCH pdu,其解码rrcSetupRequest流程如下:

rrcSetupRequest处理流程

  1. 对于主函数传过来的buffer,调用uper_decode()进行per解码,获得消息ID为rrcSetupRequest。
  2. 根据rnti查找UE上下文rrc_gNB_get_ue_context(),如果能够找到上下文,说明该rnti已经注册,释放掉该UE上下文rrc_gNB_free_mem_UE_context();一般正常情况UE是初次接入,rnti也是唯一的,在上下文中是无法查找到的。
  3. 对ue_Identity类型进行判断,分三种情况:
  • ue_Identity为NR_InitialUE_Identity_PR_randomValue ,即随机值,长度为39bit;
  • ue_Identity为NR_InitialUE_Identity_PR_ng_5G_S_TMSI_Part1 ,5G_S_TMSI长度为48bit,Part1为前39bit。
  • 以上两种均不是。
  1. 对于randomValue或者5G_S_TMSI_Part1,将为该UE创建上下文rrc_gNB_get_next_free_ue_context(),然后生成RRCSetup回复UE,调用函数rrc_gNB_generate_RRCSetup()。
  2. 对于无法识别类型的ue_Identity,将为该UE创建上下文rrc_gNB_get_next_free_ue_context(),然后生成RRCReject拒绝该UE接入,调用函数rrc_gNB_generate_RRCReject()。

3. 相关代码

switch(ul_ccch_msg->message.choice.c1->present){caseNR_UL_CCCH_MessageType__c1_PR_rrcSetupRequest:LOG_D(NR_RRC,"Received RRCSetupRequest on UL-CCCH-Message (UE rnti %x)\n",ctxt_pP->rnti);ue_context_p=rrc_gNB_get_ue_context(gnb_rrc_inst,ctxt_pP->rnti);if(ue_context_p!=NULL){rrc_gNB_free_mem_UE_context(ctxt_pP,ue_context_p);MSC_LOG_RX_DISCARDED_MESSAGE(MSC_RRC_GNB,MSC_RRC_UE,buffer,dec_rval.consumed,MSC_AS_TIME_FMT" NR_RRCSetupRequest UE %x size %u (UE already in context)",MSC_AS_TIME_ARGS(ctxt_pP),ue_context_p->ue_context.rnti,dec_rval.consumed);}else{rrcSetupRequest=&ul_ccch_msg->message.choice.c1->choice.rrcSetupRequest->rrcSetupRequest;if(NR_InitialUE_Identity_PR_randomValue==rrcSetupRequest->ue_Identity.present){/* randomValue BIT STRING (SIZE (39)) */if(rrcSetupRequest->ue_Identity.choice.randomValue.size!=5){// 39-bit random valueLOG_E(NR_RRC,"wrong InitialUE-Identity randomValue size, expected 5, provided %lu",(longunsignedint)rrcSetupRequest->ue_Identity.choice.randomValue.size);return-1;}memcpy(((uint8_t*)&random_value)+3,rrcSetupRequest->ue_Identity.choice.randomValue.buf,rrcSetupRequest->ue_Identity.choice.randomValue.size);/* if there is already a registered UE (with another RNTI) with this random_value, * the current one must be removed from MAC/PHY (zombie UE) */if((ue_context_p=rrc_gNB_ue_context_random_exist(RC.nrrrc[ctxt_pP->module_id],random_value))){LOG_W(NR_RRC,"new UE rnti %x (coming with random value) is already there as UE %x, removing %x from MAC/PHY\n",ctxt_pP->rnti,ue_context_p->ue_context.rnti,ue_context_p->ue_context.rnti);ue_context_p->ue_context.ul_failure_timer=20000;}ue_context_p=rrc_gNB_get_next_free_ue_context(ctxt_pP,RC.nrrrc[ctxt_pP->module_id],random_value);ue_context_p->ue_context.Srb0.Srb_id=0;ue_context_p->ue_context.Srb0.Active=1;memcpy(ue_context_p->ue_context.Srb0.Rx_buffer.Payload,buffer,buffer_length);ue_context_p->ue_context.Srb0.Rx_buffer.payload_size=buffer_length;}elseif(NR_InitialUE_Identity_PR_ng_5G_S_TMSI_Part1==rrcSetupRequest->ue_Identity.present){/* TODO *//* <5G-S-TMSI> = <AMF Set ID><AMF Pointer><5G-TMSI> 48-bit *//* ng-5G-S-TMSI-Part1 BIT STRING (SIZE (39)) */if(rrcSetupRequest->ue_Identity.choice.ng_5G_S_TMSI_Part1.size!=5){LOG_E(NR_RRC,"wrong ng_5G_S_TMSI_Part1 size, expected 5, provided %lu \n",(longunsignedint)rrcSetupRequest->ue_Identity.choice.ng_5G_S_TMSI_Part1.size);return-1;}uint64_ts_tmsi_part1=bitStr_to_uint64(&rrcSetupRequest->ue_Identity.choice.ng_5G_S_TMSI_Part1);if((ue_context_p=rrc_gNB_ue_context_5g_s_tmsi_exist(RC.nrrrc[ctxt_pP->module_id],s_tmsi_part1))){LOG_I(NR_RRC," 5G-S-TMSI-Part1 exists, ue_context_p %p, old rnti %x => %x\n",ue_context_p,ue_context_p->ue_context.rnti,ctxt_pP->rnti);nr_rrc_mac_remove_ue(ctxt_pP->module_id,ue_context_p->ue_context.rnti);RB_REMOVE(rrc_nr_ue_tree_s,&RC.nrrrc[ctxt_pP->module_id]->rrc_ue_head,ue_context_p);/* and insert again, after changing rnti everywhere it has to be changed */ue_context_p->ue_id_rnti=ctxt_pP->rnti;ue_context_p->ue_context.rnti=ctxt_pP->rnti;RB_INSERT(rrc_nr_ue_tree_s,&RC.nrrrc[ctxt_pP->module_id]->rrc_ue_head,ue_context_p);/* reset timers */ue_context_p->ue_context.ul_failure_timer=0;ue_context_p->ue_context.ue_release_timer=0;ue_context_p->ue_context.ue_reestablishment_timer=0;ue_context_p->ue_context.ue_release_timer_s1=0;ue_context_p->ue_context.ue_release_timer_rrc=0;}else{LOG_I(NR_RRC," 5G-S-TMSI-Part1 doesn't exist, setting ng_5G_S_TMSI_Part1 to %p => %ld\n",ue_context_p,s_tmsi_part1);ue_context_p=rrc_gNB_get_next_free_ue_context(ctxt_pP,RC.nrrrc[ctxt_pP->module_id],s_tmsi_part1);if(ue_context_p==NULL){LOG_E(RRC,"%s:%d:%s: rrc_gNB_get_next_free_ue_context returned NULL\n",__FILE__,__LINE__,__FUNCTION__);}if(ue_context_p!=NULL){ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence=TRUE;ue_context_p->ue_context.ng_5G_S_TMSI_Part1=s_tmsi_part1;}}}else{memcpy(((uint8_t*)&random_value)+3,rrcSetupRequest->ue_Identity.choice.randomValue.buf,rrcSetupRequest->ue_Identity.choice.randomValue.size);rrc_gNB_get_next_free_ue_context(ctxt_pP,RC.nrrrc[ctxt_pP->module_id],random_value);LOG_E(NR_RRC,PROTOCOL_NR_RRC_CTXT_UE_FMT" RRCSetupRequest without random UE identity or S-TMSI not supported, let's reject the UE\n",PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));rrc_gNB_generate_RRCReject(ctxt_pP,rrc_gNB_get_ue_context(gnb_rrc_inst,ctxt_pP->rnti),CC_id);break;}ue_context_p->ue_context.establishment_cause=rrcSetupRequest->establishmentCause;rrc_gNB_generate_RRCSetup(ctxt_pP,rrc_gNB_get_ue_context(gnb_rrc_inst,ctxt_pP->rnti),du_to_cu_rrc_container,gnb_rrc_inst->carrier.servingcellconfigcommon,CC_id);}break;}

相关新闻

  • Beyond Compare 5企业级授权终极指南:如何实现全平台永久授权管理
  • 2026金价重返900元!石城县黄金回收全攻略:30年零差评老店,全域免费上门锁高价 - 华金汇黄金回收
  • WallpaperExtractor:解锁Wallpaper Engine壁纸素材的终极免费工具

最新新闻

  • AI大模型与数学 第8课:隐函数求导、参数方程求导
  • 3个核心配置技巧:如何让daily_stock_analysis成为你的专属智能投顾
  • 3分钟搞定!Figma中文界面汉化插件终极指南:免费实现全中文设计环境
  • LinkSwift:九大网盘直链解析的终极技术实现指南
  • STM32F407学习记录(八)Cortex-M3/M4权威指南:第四章架构
  • 魔兽争霸III终极优化方案:5分钟让你的经典游戏焕发新生

日新闻

  • 武汉卡地亚LOVE钻戒与钻石项链回收变现攻略|多家门店行情参考 - 大牌深度测评
  • 2026年无锡地区健康管理如何考量?四家机构业务体系概览
  • 2026图片去水印软件哪个好用 手机电脑免费工具盘点 - 免费软件工具方法教程

周新闻

  • SaaS软件行业GEO实践:AI搜索时代的品牌可见性与获客新路径
  • 什么是PCTFE?医药高端包装的“防潮王牌“材料
  • 【JVM调优实战】16-可视化利器-JConsole-VisualVM-JMC

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号