1 将RLC SDU组成RLC PDU1.1 功能介绍发送UM RLC实体/AM RLC实体的发送侧将RLC SDU组成UMD PDU时,它们将:- 根据低层通知的特定发送时机以与由低层指示的RLC PDU的总大小,将RLC SDU分段和/或串接成合适的RLC PDU〔UMD PDU/ AMD PDU〕- 在RLC PDU中包含相应的RLC PDU头.Figure 1.1-1: RLC PDU Structure1.2数据结构和宏MIN_PDU_DATA_SIZE宏值,表示PDU数据域元素的最小长度〔>=1〕.PDU_Header_Ext表示PDU头扩展部分的结构类型,包含E和LI位域.PDU表示一个RLC PDU结构的类型,包含的数据成员有:ü PDU头固定部分:UM和AM模式的PDU头不同,不同模式,包含各自的所有的位域;ü PDU头扩展部分:指向PDU_HeaderExt的指针;数据域:每个元素为一个字节的数组.SDU_context: 表示SDU上下文的结构类型,并包含的数据成员有:BYTE *tbuff:指向存放RLC SDU的缓存器;SDU_leftsize:RLC SDU的长度,初始表示当前顺序从buffer里取出的RLC SDU的长度,每次组建后更新为剩下的RLC SDU的长度;Segment:表示RLC SDU分段的标识,初始为0,每次顺序取到一个RLC SDU,如果标识为1,表示是一个RLC SDU分段;否则,表示是一个RLC SDU;PDU_context: 表示PDU上下文的结构类型,并包含的数据成员有:PDU_SN:下一个将要发送的UMD PDU的 SN.PDU_leftsize〔PDU剩余大小〕:表示组建当前RLC PDU时,该PDU还可以包含的字节数.初始值为此发送时机低层指示的RLC PDU的总大小;ElemNo:该变量计数RLC PDU数据域元素的个数,初始为0;每次组建一个RLC PDU结束,ElemNo更新为0.PDU_finish:表示组建一个RLC PDU结束的标识.值为0,表示正在组建一个RLC PDU;值为1,表示组建一个RLC PDU结束,也表示下一次将要组建一个新的RLCPDU.初始为1,每次组建后,如果正在组建的RLC PDU未结束,更新为0;1.3算法流程1.4详细设计函数原型void Rlc_Pdu_Process描述RLC SDU分段或串接成RLC PDU输入SDU上下文:* tbuff 指向存放RLC SDU的缓存器SDU_leftsize RLC SDU的〔剩余〕长度segment表示RLC SDU分段的标识输出SDU上下文〔记录发送buffer的第一个RLC SDU的信息〕1. 在MAC通知的发送时机,初始化PDU上下文;2. 从发送Buffer里顺序取出一个RLC SDU,更新SDU上下文,如果PDU上下文里的PDU_finish=1,该SDU将用于组建一个新的RLC PDU,转到3;否则,转到4;3. 创建一个新的RLC PDUØ 首先创建一个初始的RLC PDU;Ø 根据SDU上下文里的SDU分段标识segment确定PDU头固定部分的FI域的第一位:即如果segment为0,该RLC SDU是一个完整的SDU,FI第一位为0;否则,它是一个SDU分段,FI的第一位为1;Ø 并更新PDU_leftsize= PDU_leftsize-2〔PDU头的固定部分大小〕.4. 比较PDU_leftsize与SDU_leftsize, 如果:1) PDU_leftsize < SDU_leftsize:SDU需要分段将RLC SDU分段,把长度等于PDU_leftsize的SDU前面分段拷贝到RLC PDU的数据域后面〔正好映射到RLC PDU的最后一个数据域元素〕;更新SDU上下文:SDU_leftsize = SDU_leftsize - PDU_leftsize;segment = 1;更新PDU上下文:PDU_leftsize = 0;ElemNo ++;PDU_finish=1〔PDU数据域组建完成〕;确定RLC PDU头的固定部分:FI域的后一位 = 1;如果RLC PDU 只有一个数据域元素〔即ElemNo=1〕,没有扩展部分,PDU头固定部分的E域 = 0;否则,有扩展部分,PDU头固定部分的E域=1;确定SN域等于发送状态变量〔VT〔US〕或VT〔S〕〕.对AM PDU,确定D/C域 = 1, RF域 = 0, P域〔跟轮询机制有关〕.确定RLC PDU头扩展部分:〔该SDU前面分段在扩展部分没有E和LI;〕如果ElemNo > 1,扩展部分的最后一个E域为0,即扩展部分第 1,扩展部分的最后一个E域为0,即扩展部分第〔ElemNo-1〕个E域=0.〔第1到ElemNo个E域已经确定,这里只需确定最后一个E域〕如果ElemNo为奇数,在最后一个LI后加四个填充比特,组建一个RLC PDU结束.实例:以下面的UMD PDU为例,假设这次组建结束后,当前的ElemNo =1,那么,该SDU是RLC PDU的唯一的一个数据域元素,没有扩展部分;固定部分如上所述,其中FI=00或10, E= 0;3) PDU_leftsize > SDU_leftsize: SDU串接把该RLC SDU串接到RLC PDU的当前最后的数据域元素的后面.更新PDU上下文:PDU_leftsize = PDU_leftsize-SDU_leftsize;Ø 如果PDU_leftsize+*0.5-1.5 >= MIN_PDU_DATA_SIZE,〔1.5是PDU头扩展部分一个E和LI域的字节数,当k=ElemNo是奇数是,0.5是当前补充比特的字节数,MIN_PDU_DATA_SIZE是初始定义的宏> 且Buffer不为空,那么还可以继续串接RLC SDU来组建该RLC PDU,- 更新PDU上下文: ElemNo++;PDU_finish= 0;PDU_leftsize = PDU_leftsize-<1.5* ElemNo+*0.5> v ElemNo奇数PDU_leftsize = PDU_leftsize-〔1.5* ElemNo +0.5〕; v ElemNo偶数PDU_leftsize = PDU_leftsize-1.5* ElemNo;- 确定RLC PDU头的固定部分:确定PDU头固定部分的E为1;确定SN域等于发送状态变量〔VT〔US〕或VT〔S〕〕;对AM PDU,确定D/C域 = 1; RF域 = 0; P域与轮询机制有关.- 确定PDU头扩展部分:PDU头的扩展部分包括第ElemNo个PDU_Header_Ext对象,即一个E和LIk域〔k=ElemNo〕;确定LIk=SDU_leftsize〔或者用偏移量来表示〕;确定扩展部分的上一个〔第k-1个〕的E域为1;- 更新SDU上下文:SDU_leftsize = 0;segment = 0;- 循环回到 2,即继续顺序取出发送Buffer里第一个RLC SDU,开始继续串接该RLC SDU或一部分来组成RLC PDU;实例:以下面的AMD PDU为例,假设这次串接结束后,当前的ElemNo = k+1,那么,扩展部分新增的E和LIk+1是当前串接的SDU的E和LI域;固定部分如上所述,其中E=1;扩展部分第k个E=1;第〔K+1〕个E = 0;LIk+1 = SDU_leftsize ;Ø 否则,如果发送Buffer为空,或者0< PDU_leftsize + *0.5-1.5 < MIN_PDU_DATA_SIZERLC PDU后面不能串接一个RLC SDU,该SDU是RLC PDU的最后一个数据域元素,不需要继续串接,- 更新PDU上下文: PDU_finish = 0;PDU_leftsize = 0;- 更新SDU上下文:SDU_leftsize = 0;segment = 0;ElemNo++- 确定RLC PDU头的固定部分:确定FI域的后一位为 0 ;如果RLC PDU 只有一个数据域元素〔即ElemNo=1〕,没有扩展部分, PDU头固定部分的E域 = 0;否则,有扩展部分,PDU头固定部分的E域=1;确定SN域等于发送状态变量〔VT〔US〕或VT〔S〕〕.对AM PDU,确定D/C域 = 1, RF域 = 0, P域这里不设置.- 确定PDU头扩展部分:〔该RLC SDU在扩展部分没有E和LI域;〕如果ElemNo > 1,扩展部分的最后一个E域为0,即扩展部分第ElemNo-1个E域=0;〔第1到ElemNo-2个E域已经确定,这里只需确定最后一个E域,所有的LI域已确定〕- 如果ElemNo为奇数,在最后一个LI后加四个填充比特,组建一个RLC PDU结束.以下面的AMD PDU为例,假设这次串接结束后,当前的ElemNo = k,那么,扩展部分没有当前串接的SDU的E和LI域;固定部分如上所述,其中FI=00或10;E=0;扩展部分第k个E=1;5. 将组建结束的RLC PDU递交给低层,同时更新发送状态变量加1,结束.1.5 AMD PDUv 什么时候用到AMD PDU分段?当重传AMD PDU的大小大于本次发送通知中对MAC SDU长度的要求时,可以对AMD PDU进行再分段,形成AMD PDU分段.v 结构再分段只是对数据域的分段,AMD PDU分段中头的部分除了RF域、新增的LSF域和SO域外都与再分段前的AMD PDU相同.2 将RLC PDU重组为RLC SDU2.1接收UM RLC实体SDU重组2.1.1模块介绍2.1.1.1功能需求在接收UM RLC实体接收UMD PDU后,它:- 将完成重排序的UMD PDU〔不考虑已检测到丢失的RLC PDU〕重组RLC 。