LTE中RLC分段、串接、重组及实现_第1页
LTE中RLC分段、串接、重组及实现_第2页
LTE中RLC分段、串接、重组及实现_第3页
LTE中RLC分段、串接、重组及实现_第4页
LTE中RLC分段、串接、重组及实现_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实用文案1 将RLCSDU组成RLCPDU1.1 功能介绍发送UMRLC实体/AMRLC 实体的发送侧将 RLCSDU组成UMDPDU 时,它们将:- 根据低层通知的特定发送时机以及由低层指示的 RLCPDU(s)的总大小,将RLCSDU分段和/或串接成合适的RLCPDU(UMDPDU/AMDPDU )在RLCPDU中包含相应的RLCPDU头。RLCSDUnn+1n+2n+3......RLCheader RLCheaderRLCPDUFigure1.1-1:RLCPDUStructure1.2数据结构和宏MIN_PDU_DATA_SIZE 宏值,表示PDU数据域元素的最小长度( >=1)。PDU_Header_Ext 表示PDU头扩展部分的结构类型, 包含E和LI位域。PDU表示一个RLCPDU结构的类型,包含的数据成员有:? PDU头固定部分:UM和AM模式的PDU头不同,不同模式,包含各自的所标准文档实用文案有的位域;PDU头扩展部分:指向PDU_HeaderExt的指针;数据域:每个元素为一个字节的数组。SDU_context: 表示SDU上下文的结构类型,并包含的数据成员有:BYTE *tbuff :指向存放RLCSDU的缓存器;SDU_leftsize :RLCSDU的长度,初始表示当前顺序从 buffer 里取出的RLCSDU的长度,每次组建后更新为剩下的 RLCSDU的长度;Segment :表示RLCSDU分段的标识,初始为0,每次顺序取到一个 RLCSDU,如果标识为1,表示是一个RLCSDU分段;否则,表示是一个 RLCSDU;PDU_context: 表示PDU上下文的结构类型,并包含的数据成员有:PDU_SN:下一个将要发送的 UMDPDU 的SN。PDU_leftsize (PDU剩余大小):表示组建当前 RLCPDU时,该PDU还可以包含的字节数。初始值为此发送时机低层指示的 RLCPDU的总大小;ElemNo:该变量计数RLCPDU数据域元素的个数,初始为0;每次组建一个RLCPDU结束,ElemNo 更新为0。PDU_finish :表示组建一个RLCPDU结束的标识。 值为0,表示正在组建一个 RLCPDU;值为1,表示组建一个RLCPDU结束,也表示下一次将要组建一个新的 RLCPDU。 初始为1,每次组建后,如果正在组建的 RLCPDU未结束,更新为 0;标准文档实用文案1.3算法流程开始在此发送时机, 宏定义、初始化SDU上下文、PDU上下文N发送Buffer里还有RLCSDU?Y按顺序从Buffer里取出第一个RLCNSDU将用于组建一个新的RLCPDU?即PDU_finish==1?Y生成一个初始的RLCPDU,更新SDU上下文Y NRLCSDU是一个SDU分段?确定FI的第 确定FI的第一位为1 一位为0PDU_leftsize=PDU_leftsize -2PDU_leftsize<SDU_leftsizeY NSDU分段,把大小等于PDU_leftsize的该RLCSDU的前面部分映射到RLCPDU的最后一个数据域元素更新SDU上下文和PDU上下文以及 SDUstruct ;确定RLCPDU头的各个位域, 组建一个RLCPDU结束。PDU_leftsize==SDU_leftsizeY

N把该RLCSDU映射到RLCPDU的最后一个数据域元素;更新PDU上下文,确定RLCPDU头的各个位域, 组建一个RLCPDU结束。把该SDU串接到正在组建的RLCPDU后面。N

Y需要继续串接SDU且发送Buffer不为空?更新PDU上下文,确定RLCPDU头的各 更新PDU上下文,确定RLCPDU头个位域,组建一个RLCPDU结束。 的部分位域,继续串接。将组建结束的RLCPDU递交给低层, 同时更新发送状态变量返回,结束标准文档实用文案1.4详细设计函数原型 voidRlc_Pdu_Process( SDU_context& )描述 RLCSDU分段或串接成 RLCPDU输入 SDU上下文:*tbuff 指向存放RLCSDU的缓存器SDU_leftsize RLCSDU的(剩余)长度segment 表示RLCSDU分段的标识输出 SDU上下文(记录发送 buffer 的第一个RLCSDU的信息)在MAC通知的发送时机,初始化PDU上下文;从发送Buffer里顺序取出一个RLCSDU,更新SDU上下文,如果PDU上下文里的PDU_finish =1,该SDU将用于组建一个新的 RLCPDU,转到3;否则,转到4;创建一个新的RLCPDU首先创建一个初始的RLCPDU;根据SDU上下文里的SDU分段标识segment确定PDU头固定部分的FI域的第一位:即如果 segment 为0,该RLCSDU是一个完整的SDU,FI第一位为0;否则,它是一个 SDU分段,FI的第一位为1;并更新PDU_leftsize=PDU_leftsize-2(PDU头的固定部分大小)。比较PDU_leftsize与SDU_leftsize,如果:1) PDU_leftsize<SDU_leftsize :SDU需要分段标准文档实用文案将RLCSDU分段,把长度等于PDU_leftsize的SDU前面分段拷贝到RLCPDU的数据域后面(正好映射到RLCPDU的最后一个数据域元素);更新SDU上下文:SDU_leftsize=SDU_leftsize-PDU_leftsize ;segment=1 ;更新PDU上下文:PDU_leftsize=0 ;ElemNo++ ;PDU_finish=1(PDU数据域组建完成);确定RLCPDU头的固定部分:FI域的后一位 =1;如果RLCPDU只有一个数据域元素(即 ElemNo=1),没有扩展部分, PDU头固定部分的E域=0;否则,有扩展部分,PDU头固定部分的E域=1;确定SN域等于发送状态变量(VT(US)或VT(S))。对AMPDU,确定D/C域=1,RF域=0,P域(跟轮询机制有关)。确定RLCPDU头扩展部分:(该SDU前面分段在扩展部分没有 E和LI;)如果ElemNo >1,扩展部分的最后一个 E域为0,即扩展部分第(ElemNo-1 )个E域=0。(第1到ElemNo 个E域已经确定,这里只需确定最后一个 E域)如果ElemNo 为奇数,在最后一个 LI后加四个填充比特,组建一个 RLCPDU结束。实例:以下面的AMDPDU 为例,假设这次分段结束后,当前的ElemNo =k+1,标准文档实用文案D/CRFPFIESNOct1SNOct2ELI1Oct3LI1ELI2Oct4LI2Oct5...ELIK-1Oct[2+1.5*K-2]LIK-1ELIKOct[2+1.5*K-1]LIKOct[2+1.5*K]DataOct[2+1.5*K+1]...OctN该SDU前面分段那么,该SDU前面分段是RLCPDU的最后一个数据域元素,没有E和LI域;固定部分如上所述,其中 FI=01或11,E=1;扩展部分从第1个到第k-1个E=1;LI1~k为各自数据域元素长度;第K个E=0。2) PDU_leftsize==SDU_leftsize :直接映射直接把该RLCSDU映射到RLCPDU的最后一个数据域元素( 拷贝)。更新SDU上下文:SDU_leftsize=0 ;segment=0 ;更新PDU上下文:PDU_leftsize=0 ;PDU_finish=1 ;ElemNo++ 。确定RLCPDU头的固定部分:FI域的后一位 =0;如果RLCPDU只有一个数据域元素(即ElemNo=1),没有扩展部分, PDU头固定部分的E域=0;否则,有扩展部分,PDU头固定部分的E域=1;确定SN域等于发送状态变量(VT(US)或VT(S))。对AMPDU,确定D/C域=1,RF域=0,P域这里不设置。确定PDU头扩展部分:(该RLCSDU在扩展部分没有E和LI;)如果ElemNo>1,扩展部分的最后一个E域为0,即扩展部分第(ElemNo-1)个E域=0。(第1到ElemNo 个E域已经确定,这里只需确定最后一个 E域)标准文档实用文案如果ElemNo为奇数,在最后一个LI后加四个填充比特,组建一个RLCPDU结束。实例:以下面的UMDPDU为例,假设这次组建结束后,当前的ElemNo=1,R1R1R1FIESNOct1SNOct2DataOct3...当前的SDUOctN那么,该SDU是RLCPDU的唯一的一个数据域元素,没有扩展部分;固定部分如上所述,其中 FI=00或10,E=0;3) PDU_leftsize>SDU_leftsize: SDU串接把该RLCSDU串接到RLCPDU的当前最后的数据域元素的后面。更新PDU上下文:PDU_leftsize =PDU_leftsize-SDU_leftsize;? 如果 PDU_leftsize+(k%2)*0.5 -1.5>=MIN_PDU_DATA_SIZE ,(1.5是PDU头扩展部分一个 E和LI域的字节数, 当k=ElemNo 是奇数是,0.5是当前补充比特的字节数, MIN_PDU_DATA_SIZE 是初始定义的宏) 且Buffer 不为空,那么还可以继续串接 RLCSDU来组建该RLCPDU,更新PDU上下文:ElemNo++;PDU_finish=0;PDU_leftsize =PDU_leftsize-(1.5*ElemNo +(ElemNo%2)*0.5)? ElemNo 奇数PDU_leftsize =PDU_leftsize-(1.5* ElemNo+0.5);? ElemNo 偶数PDU_leftsize =PDU_leftsize-1.5*ElemNo ;确定RLCPDU头的固定部分:确定PDU头固定部分的E为1;标准文档实用文案确定SN域等于发送状态变量(VT(US)或VT(S));对AMPDU,确定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里第一个RLCSDU,开始继续串接该RLCSDU或一部分来组成RLCPDU;实例:以下面的AMDPDU 为例,假设这次串接结束后,当前的 ElemNo =k+1,D/CRFPFIESNOct1SNOct2ELI1Oct3LI1ELI2Oct4LI2Oct5...ELIK-1Oct[2+1.5*K-2]LIK-1ELIKOct[2+1.5*K-1]LIKOct[2+1.5*K]E=0DataLIk+1Oct[2+1.5*K+1]LIk+1...DATA(前k个数据域元素)OctN当前串接的SDUPDU_leftsize+(k%2)*0.5-1.5>MIN_PDU_DATA_SIZE那么,扩展部分新增的 E和LIk+1是当前串接的SDU的E和LI域;固定部分如上所述,其中 E=1;扩展部分第k个E=1;第(K+1)个E=0;LIk+1=SDU_leftsize ;? 否则,如果发送Buffer 为空,或者0<PDU_leftsize+(k%2)*0.5 -1.5标准文档实用文案<MIN_PDU_DATA_SIZERLCPDU后面不能串接一个 RLCSDU,该SDU是RLCPDU的最后一个数据域元素,不需要继续串接,- 更新PDU上下文: PDU_finish=0 ;PDU_leftsize =0;- 更新SDU上下文:SDU_leftsize=0 ;segment=0 ;ElemNo++确定RLCPDU头的固定部分:确定FI域的后一位为0;如果RLCPDU只有一个数据域元素(即ElemNo=1),没有扩展部分,PDU头固定部分的E域=0;否则,有扩展部分,PDU头固定部分的E域=1;确定SN域等于发送状态变量(VT(US)或VT(S))。对AMPDU,确定D/C域=1,RF域=0,P域这里不设置。确定PDU头扩展部分:(该RLCSDU在扩展部分没有 E和LI域;)如果ElemNo >1,扩展部分的最后一个 E域为0,即扩展部分第ElemNo-1个E域=0 ;(第1到ElemNo-2 个E域已经确定,这里只需确定最后一个 E域,所有的LI域已确定)如果ElemNo为奇数,在最后一个LI后加四个填充比特,组建一个RLCPDU结束。以下面的AMDPDU 为例,假设这次串接结束后,当前的 ElemNo =k,标准文档实用文案D/CRFPFIESNOct1SNOct2ELI1Oct3LI1ELI2Oct4LI2Oct5...ELIK-1Oct[2+1.5*K-2]LIK-1ELIKOct[2+1.5*K-1]LIKOct[2+1.5*K]DataOct[2+1.5*K+1]...DATA(前k个数据域元素)OctN当前串接的SDU最后一个数据域元素PDU_leftsize+(k%2)*0.5-1.5<MIN_PDU_DATA_Elem_SIZE那么,扩展部分没有当前串接的 SDU的E和LI域;固定部分如上所述,其中 FI=00或10;E=0;扩展部分第k个E=1;5. 将组建结束的RLCPDU递交给低层, 同时更新发送状态变量加 1,结束。标准文档实用文案1.5AMDPDU什么时候用到AMDPDU分段?当重传AMDPDU 的大小大于本次发送通知中对 MACSDU长度的要求时,可以对AMDPDU 进行再分段,形成AMDPDU 分段。结构再分段只是对数据域的分段,AMD PDU分段中头的部分除了 RF域、新增的LSF域和SO域外都与再分段前的 AMDPDU 相同。2 将RLCPDU 重组为RLCSDU2.1 接收UMRLC 实体SDU重组 模块介绍功能需求在接收UMRLC实体接收UMDPDU后,它:将完成重排序的UMDPDU(不考虑已检测到丢失的RLCPDU)重组RLCSDU,并将完成重组的RLCSDU按序递交给高层(先重排序,再重组)由于某个RLCSDU的一个UMDPDU在低层丢失,导致收到的UMDPDU不能重组为RLCSDU,则丢弃这些UMDPDU标准文档实用文案 算法描述针对当前接收Buffer里已重排序的UMDPDUs按序循环进行重组:(重组是按照SN从小大到的顺序)从最小的SN的UMDPDU开始,循环遍历下一个SN(假设SN=x)的UMDPDU。每次循环,顺序遍历UMDPDU的数据域元素,并把该数据域元素和上一次重组保留的RLCSDU分段(如果有的话)一起进行重组(按照SN从小大到的顺序):如果重组后的RLCSDU之前没有递交过,将完成重组的RLCSDU按序递交给高层;将由于某个UMDPDU在低层丢失而不能重组为RLCSDU的PDU丢弃(丢失的PDU为SDU的前面部分分段或中间部分分段);将没有完成重组的RLCSDU分段保留(SDU的后面部分分段没有收到)。 数据结构设计PDULeft:结构类型,表示每次重组之后, 没有完成重组的 RLCSDU的相关信息 ,用于下一次按序重组,包含下面的成员:SN_Left:整型变量,记录当前没有完成重组的RLCSDU包含的PDU的最大的SN,初始值为-1;若某次重组之后,当前被重组的 UMDPDU 的数据域有剩余,SN_Left更新为该PDU的SN;SDU_Left:数组,保留重组之后剩余的RLCPDU数据部分(即没有完成重组的 RLC标准文档实用文案SDU分段),也就是0个、1个或多个SDU分段。初始为空数组。注:PDULeft对象设计为静态对象。标准文档实用文案 算法流程开始重排序结束后,PDULeft对象初始化N接收Buffer里已重排序的UMDPDU(s)循环重组没有结束?YN接受Buffer里SN=x的UMDPDU是否存在?YN Y如果PDU头固定部分FI的第一位为1?

结束更新PDULeft对象;x=x+1;YPDULeft对象的SN==x-1?N把UMDPDU的第一个数据域元素直接把UMDPDU第一个数据域元素和PDULeft对象的SDUs重组为RLC重组为RLCSDUSDU;

丢弃该UMDPDU;更新PDULeft对象;x=x+1;Y PDU头固顶部分E域==1?N将完成重组的RLCSDU按序递交给高层;N当前E域==1?Y按序遍历PDU头的扩展部分下一个数据域元素的E和LI域;直接把下一个数据域元素重组为一个完整的RLCSDU;更新PDULeft对象:SN=-1;SDUs清空;将该完成重组的RLCSDU按序递交给高层;

把UMDPDU的最后一个数据域元素直接重组为RLCSDUY NFI的后一位为0?更新PDULeft对象:SN=更新PDULeft对象:x;SDUs清空;SN=x;SDUs=当前将完成重组的RLC重组后没有完成重组SDU按序递交给高层;的RLCSDU;x=x+1标准文档实用文案 详细设计函数原型 voidRlc_Reassemble_UM _Process(PDU_Left& ,SN_MIX, SN_MAX)描述 将RLCPDU重组成RLCSDU输入 PDU_Left:SN_LeftSDU_LeftSN_MIX: 要重组的最小的 SNSN_MAX:要重组的最大的 SN输出 PDU_Left当前接收Buffer里已重排序的UMDPDU(s)最小的SN=SN_MIX;循环对SN=x的UMDPDU进行重组,循环直到接收Buffer里已重排序的最后一个SN(SN=SN_MAX)的UMDPDU重组后结束;PDULeft 对象保留上一次重组后没有完成重组 RLCSDU的信息。看下面的例子: 假设开始重组SN=x 的UMDPDU ,此时:标准文档实用文案PDULeft对象:RLCSDU1SDU_Left (分段)SN_Left=x-1,SN=x的UMDPDUheaderRLCSDU1RLCSDU4RLCSDU2RLCSDU3(分段)(分段)FI=11固定部分E=1第1步:判断接受Buffer里SN=x的UMDPDU 是否存在,如果不存在,该UMDPDU在低层丢失,那么:丢弃PDULeft对象保留的没有完成重组的 RLCSDU,即清空SDU_Left;更新PDULeft对象的SN成员=-1;x=x+1;(下一个SN)循环回到第1步;如果存在,继续第2步;第2步:检查SN=x的UMDPDU 头固定部分FI和E域,如果:如果E==0,那么该UMDPDU只有一个数据域元素,又? 如果FI的第一位为1,那么该UMDPDU 的第一个数据域元素是一个 SDU的后面分段(前面分段和后面分段根据 2个SDU分段在原来的SDU中的相对位置而言),判断PDULeft 对象的成员SN,如果SN!=x-1,包含该SDU的前面分段的UMDPDU 已经丢失,那么:直接丢弃该UMDPDU;更新PDULeft对象: 如果SN != -1, 丢弃的SDUs成员保留的数标准文档实用文案据;然后SN=-1;x=x+1;循环回到第1步;否则SN==x-1,PDULeft对象的SDUs成员保留了该SDU的前面分段,那么:去掉PDU头,将这2个SDU分段按序重组(SN升序)为RLCSDU;这时,如果FI的后一位为0,那么:更新PDULeft 对象:SN=-1;SDUs清空;将完成重组的RLCSDU按序递交给高层;否则FI的后一位为1,那么更新PDULeft 对象:SN=x;SDUs= 当前重组后没有完成重组的 RLCSDU;x=x+1;循环回到第1步;否则,FI的第一位为0,那么:去掉PDU头,把PDU的数据域直接重组为 RLCSDU;这时,如果FI的后一位为0,那么:将该完成重组的 RLCSDU按序递交给高层;更新PDULeft对象:SN=-1;SDU_Left 清空;否则FI的后一位为1,那么:更新PDULeft 对象: SN=x;SDUs= 当前重组后没有完成重组的 RLCSDU;标准文档实用文案x=x+1;循环回到第1步;否则E=1,该UMDPDU有多个数据域元素,那么:(一) 遍历PDU头扩展部分第一个数据域元素的 E和LI域,该数据域元素长度= LI;如果FI的第一位为1,该UMDPDU的第一个数据域元素是一个SDU的后面分段,那么:判断PDULeft对象的成员SN:如果SN!=x-1,包含该SDU的部分前面分段的UMDPDU已经丢失,那么:直接丢弃该UMDPDU 的第一个数据域元素;更新PDULeft对象:如果SN!=-1, 丢弃SDUs成员保留的数据;然后SN=-1;否则SN==x-1 ,PDULeft对象的SDUs成员保留了该SDU的前面分段,那么:将这2个SDU分段按序重组为RLCSDU;将完成重组的RLCSDU按序递交给高层;更新PDULeft对象:SN=-1;SDUs清空;此时,上面的例子的变化:PDULeft对象更新为:SDUs: 空SN=-1标准文档实用文案SN=x的UMDPDUheaderRLCSDU2RLCSDU4RLCSDU3(分段)否则FI的第一位为0,那么:把第一个数据域元素直接重组为 RLC SDU;将完成重组的RLCSDU按序递交给高层;(二) 检查当前遍历的 E域,循环执行下面的操作:如果E==0,该UMDPDU只剩下的最后一个数据域元素,那么:去掉PDU头,把PDU的最后一个数据域元素直接重组为 RLCSDU;如果FI的后一位为0,那么:将该完成重组的 RLCSDU按序递交给高层;更新PDULeft对象:SN=-1;SDUs清空;否则FI的后一位为1,那么:更新PDULeft 对象: SN=x;SDUs= 当前重组后没有完成重组的 RLCSDU;x=x+1;循环回到第1步;最后,关于上面的例子:RLCSDU1、RLCSDU2、RLCSDU3 提交给高层;标准文档实用文案PDULeft对象更新为:RLCSDU4SDUs:SN=x否则E==1,该UMDPDU还剩下多个数据域元素,那么:按序遍历PDU头的扩展部分下一个数据域元素的 E和LI域,下一个数据域元素长度 =LI;直接把下一个数据域元素重组为一个完整的 RLC SDU;更新PDULeft对象:SN=-1;SDUs清空;将该完成重组的RLCSDU按序递交给高层;循环回到(二)。第3步,循环结束,返回。2.2 AMRLC 实体接收侧 SDU重组 模块介绍功能需求AMRLC实体的接收侧收到 RLC数据PDU后,它:将完成重排序的RLC数据PDU(完整的PDU)重组成RLCSDU,并将完成重组的RLCSDU按序递交给高层标准文档实用文案 算法描述将落在接收窗外的SN所对应的AMDPDU的任何字节分段和SN=VR(R)的AMDPDU的连续字节分段进行重组:从最小SN的AMDPDU或AMDPDU分段开始, 循环遍历下一个SN的AMDPDU或AMDPDU分段。每次循环,有下面 2种情况:对AMDPDU:根据E域和LI域,顺序遍历AMDPDU的数据域元素,把该PDU的数据域进行重组,重组时去掉RLC头:如果重组后的RLCSDU之前没有递交过,将完成重组的RLCSDU按序递交给高层;将没有完成重组的RLCSDU保留, 等到下一次继续重组。对AMDPDU分段:首先根据LSF域和SO域将AMDPDU分段重组为AMDPDU,然后再根据同上把AMDPDU重组为RLCSDU。按当前遍历的相同SN的AMDPDU分段在原AMDPDU中的顺序,把该AMDPDU的可以被重组的连续的字节分段进行重组,重组时去掉 RLC头。 数据结构设计PDULeft:结构类型,表示每次重组之后, 没有完成重组的 RLCSDU的相关信息 ,用于下一次按序重组,包含下面的成员:SN_Left:整型变量,记录当前没有完成重组的RLCSDU包含的PDU的最大的SN,初始值为-1;若某次重组之后,当前被重组的 UMDPDU 的数据域有剩余,SN_Left标准文档实用文案更新为该PDU的SN;SDU_Left:数组,保留重组之后剩余的RLCPDU数据部分(即没有完成重组的 RLCSDU分段),也就是0个、1个或多个SDU分段。初始为空数组。注:PDULeft对象设计为静态对象。AMD_SegContext: 表示AMDPDU 分段上下文, 包含下面的变量:SN:AMDPDU 分段的SN,初始为-1;SO:没有被全部重组的 AMDPDU 分段在原AMD PDU中的偏移量;初始为0,每次重组之后更新;CSO(字节分段偏移):没有被重组的第一个字节分段在原 AMD PDU中的偏移,初始为0;LISN:没有被重组的连续字节分段的所有的 LI中,顺序最小的LI的序号;初始为1;LISN=0表示这些连续字节分段是 AMD PDU最后一个数据域元素; LISN=k(正整数),表示这些连续字节分段对应的顺序最小的 LI的序号。注:AMD_SegContext 对象设计为静态对象。标准文档实用文案 算法流程开始PDULeft对象初始化, AMD_SegContext 对象初始化Y循环对落在接收窗外的SN的 RLC PDU(s) 重组是否结束?NRF==1?NY把相同SN的所有的AMDPDU分段串接成原AMDPDU;RF=0;如果PDU头固定部分把UMD PDU 的第一个数据域元素直接重组为 RLCSDU

FI的第一位为1?YYPDULeft对象的SN==x-N1?把AMDPDU第一个数据域元素和错误,返回PDULeft对象的SDUs重组为RLCSDU;YPDU头固顶部分E域==1?N将完成重组的RLCSDU按序递交给高层;把UMDPDU的最后一个N数据域元素直接重组为当前E域==1?RLCSDUY按序遍历 PDU 头的扩展部分下一个数据域元素的E和LI域;直接把下一个数据域元素重组为一个完整的RLCSDU;更新PDULeft对象:SN=-1;SDUs清空;的RLC将该完成重组SDU按序递交给高层;没有接收到任何SN=VR(R)的字节分段N

YFI的后一位为更新PDULeft对象:SN=x;SDUs清空;RLC将完成重组的SDU按序递交给高层;x=x+1Y

N?更新 PDULeft 对象:SN=x ; SDUs= 当前重组后没有完成重组的 RLCSDU ;最小的 SO==0PDU头固顶部分E域==1?

NN

结束计算未被重组的连续 AMD PDU 分段的总长度(设为 length );当前E域==1?NY得到AMDPDU分段头扩展部分的第LISN个E和LI域;LI=<length-CSO?NYYCSO==0且分段头FI的第一位为1?N把AMDPDU第一个数据域元素(长度把当前长度为LI的连续字节为LI)和PDULeft对象的SDUs重组分段重组为一个完整的RLC为RLCSDU;SDU;将该完成重组的 RLCSDU 按序递交给高层;length=length-LI ;更新 PDULeft 对象: SN=-1 ; SDUs 清空;更新 AMD_SegContext 对象。标准文档实用文案 详细设计落在接收窗外的最小的 SN=x, 循环开始对SN=x的RLC PDU进行重组,循环结束条件: SN==VR(R);PDULeft 对象初始化,以后保留上一次重组后没有完成重组 RLCSDU的信息;AMD_SegContext 对象初始化,以后记录上一次重组后 AMDPDU 分段的上下文信息。第1步:对SN=x的RLCPDU(s),执行:如果RLCPDU头RF域=1,表示该RLCPDUs是一些AMDPDU分段,那么:1)执行循环,循环结束条件为LSF=1,LSF初始为0,每次循环,循环体里执行:(按SO升序)得到对应的 AMDPDU 分段;(按序)把当前 AMD PDU分段的数据域串接,组成 AMD PDU的数据域;LSF=当前AMDPDU 分段头的LSF域;循环回到(1);加上该AMD PDU的头,RF域修改为0,接着转到第2步对该AMD PDU进行重组。附注:下面红色的部分是上面“ 1“的另一种方法:(按照AMDPDU 分段重组)1. 如果RLCPDU头RF域=1,表示这些RLCPDUs是一些AMDPDU 分段,那么:检查AMDPDU 分段头E域:? 如果E==0,即SN=VR(R)的原AMDPDU 只有一个数据域元素,那么:标准文档实用文案执行循环,循环结束条件为 LSF=1,LSF初始为0,每次循环,循环体里执行:(按SO升序)得到对应的 AMDPDU 分段;(按序)把当前 AMDPDU 分段的数据域串接,重组为 RLCSDU;LSF=当前AMDPDU 分段头的LSF域;接着,检查分段头 FI域:如果FI的第一位为1,那么重组后的 RLCSDU是一个SDU的后面分段,显然PDULeft对象的SDUs成员保留了该SDU的前面分段,那么:将这2个SDU分段按序重组为一个 RLCSDU;这时,如果FI的后一位为0,那么:更新PDULeft 对象:SN=-1;SDUs清空;将完成重组的RLCSDU按序递交给高层;否则FI的后一位为1,那么:更新PDULeft 对象:SN=x;SDUs= 当前重组后没有完成重组的 RLCSDU;否则,FI的第一位为0,且如果FI的后一位为0,那么:将该完成重组的 RLCSDU按序递交给高层;更新PDULeft对象:SN=-1;SDUs清空;否则FI的后一位为1,那么:更新PDULeft 对象:SN=x;SDUs= 当前重组后没有完成重组的 RLCSDU;更新AMD_SegContext 对象:(初始值)CSO=0;标准文档实用文案SN=-1;LISN=1;SO=0;x=x+1;循环回到第1步;否则E域==1,即该SN的AMDPDU有多个数据域元素,那么:检查AMD_SegContext对象的SN是否指示接收窗外最小的SN:如果SN==x,即在上次重组过程中,该RLCPDUs的一部分连续的字节分段已经被重组为 RLCSDU,那么:如果LISN=0,即剩下的RLCPDUs对应于原AMD PDU的最后的数据域元素,那么:设置循环变量E=0;(转到(1))否则, SN=x的RLCPDUs不是最小SN的AMDPDU 分段。(1)执行循环:循环结束条件为 E==0,(循环变量E初始为1),在循环体里,执行:根据AMD_SegContext 对象的LISN,找到AMDPDU 分段头扩展部分的第LISN个E和LI域;更新循环变量E=第LISN个E域;计算得到长度为 LI的连续字节分段,返回当前的 AMD PDU分段的SO;(计算时, 用到SO和AMDPDU 分段长)检查CSO,判断这些连续的字节分段是否从第一个字节分段开始的,即:标准文档实用文案如果CSO==0 且分段头FI的第一位为1,即这些第一个连续字节分段是一个 SDU的后面分段, 显然PDULeft 对象的SDUs成员保留了该 SDU的前面分段,那么:将这2个SDU分段按序重组为 RLCSDU;将该完成重组的RLCSDU按序递交给高层;否则,CSO!=0 或FI的第一位为0,那么:把这些连续字节分段重组为 RLCSDU;将该完成重组的RLCSDU按序递交给高层;更新PDULeft对象:SN=-1;SDUs清空;更新AMD_SegContext 对象:CSO=CSO+LI;如果E=1,LISN++;否则LISN=0;如果LI==length –CSO,SO=当前AMDPDU 分段的SO+分段长度;否则(LI<length –CSO)SO=当前AMDPDU 分段的SO;循环回到(1);循环结束后,即循环变量 E=0,那么剩下的 RLCPDUs正好对应于原AMDPDU 的最后的数据域元素, 那么:执行循环,循环结束条件为 LSF=1,LSF初始为0,每次循环,循环体里执行:(按SO升序)得到对应的 AMDPDU 分段;标准文档实用文案(按序)把当前AMDPDU 分段的数据域串接,从而重组为RLCSDU;LSF=当前AMDPDU 分段头的LSF域;继续检查分段头 FI域如果FI的后一位为0,那么:将该完成重组的 RLCSDU按序递交给高层;更新PDULeft对象:SN=-1;SDUs清空;否则FI的后一位为1,那么:更新PDULeft对象:SN=x;SDUs= 当前重组后没有完成重组的 RLCSDU;更新AMD_SegContext 对象:(初始值)CSO=0;SN=-1;LISN=1;SO=0;x=x+1;循环回到第1步;如果RLCPDU头RF域=0,检查SN=x(x<VR(R))的AMDPDU头FI和E域,即:如果E==0,该AMDPDU只有一个数据域元素,又如果FI的第一位为1,那么该AMDPDU 的第一个数据域元素是一个 SDU的后面分段,显然PDULeft对象的SDUs成员保留了该SDU的前面分段,那么:标准文档实用文案去掉PDU头,将这2个SDU分段按序重组(SN升序)为RLCSDU;这时,如果FI的后一位为0,那么:更新PDULeft 对象:SN=-1;SDUs清空;将完成重组的RLCSDU按序递交给高层;否则FI的后一位为1,那么更新PDULeft 对象:SN=x;SDUs= 当前重组后没有完成重组的 RLCSDU;否则,FI的第一位为0,那么:去掉PDU头,把PDU的数据域直接重组为 RLCSDU;这时,如果FI的后一位为0,那么:将该完成重组的 RLCSDU按序递交给高层;更新PDULeft对象:SN=-1;SDUs清空;否则FI的后一位为1,那么:更新PDULeft 对象:SN=x;SDUs= 当前重组后没有完成重组的 RLCSDU;x=x+1;循环回到第1步;否则E=1,该UMDPDU有多个数据域元素,那么:(一) 遍历PDU头扩展部分第一个数据域元素的 E和LI域,该数据域元素长度= LI;然后判断:如果FI的第一位为1,该UMDPDU 的第一个数据域元素是一个 SDU的后面分段,显然PDULeft对象的SDUs成员保留了该SDU的前面分段,标准文档实用文案那么:将这2个SDU分段按序重组为RLCSDU;将完成重组的RLCSDU按序递交给高层;更新PDULeft对象:SN=-1;SDUs清空;否则FI的第一位为0,那么:把第一个数据域元素直接重组为 RLC SDU;将完成重组的RLCSDU按序递交给高层;(二) 检查当前遍历的 E域,循环执行下面的操作:如果E==0,该AMDPDU只剩下的最后一个数据域元素,那么:把PDU的最后一个数据域元素直接重组为 RLCSDU;如果FI的后一位为0,那么:将该完成重组的 RLCSDU按序递交给高层;更新PDULeft对象:SN=-1;SDUs清空;否则FI的后一位为1,那么:更新PDULeft对象:SN=x;SDUs= 当前重组后没有完成重组的 RLCSDU;x=x+1;循环回到第1步;否则E==1,该UMDPDU还剩下多个数据域元素,那么:按序遍历PDU头的扩展部分下一个数据域元素的 E和LI域,下一个数据域元素长度 =LI;直接把下一个数据域元素重组为一个完整的 RLC SDU;标准文档实用文案将该完成重组的 RLCSDU按序递交给高层;更新PDULeft对象:SN=-1;SDUs清空;循环回到(二)。第2步:尝试对SN=VR(R)的未完整接收的AMDPDU 的连续字节分段进行重组:有下面的例子:对SN=VR(R)的未完整接收的 AMDPDU 的连续字节分段进行重组,第3个分段还没有接收到。PDULeft对象:RLCSDUSDUs:SN=VR(R)-1原SN=VR(R)的AMDPDU:头RLCSDU1RLCSDU2RLCSDU3RLCSDU4(分段)(分段)FI=11固定部分E=1SN=VR(R)的AMDPDU分段:(分为3段)分段头数据1分段头数据2FI=11FI=11固定部分E=1固定部分E=1SO=0SO=数据1长LSF=0LSF=0分段头 数据3FI=11固定部分E=1SO=数据1长+数据2长LSF=1如果没有接收到SN=VR(R)的AMDPDU任何字节分段,RLCSDU重组结束,返回。标准文档实用文案- 否则,尝试对从AMDPDU 第一个字节分段开始的连续的字节分段进行重组, 第一个不连续的字节分段之后的所有字节分段不进行重组, 那么:检查所有的AMDPDU 分段头的SO:如果最小的SO>0,不对该AMDPDU的任何字节分段进行重组,RLCSDU重组结束,返回。如果最小的SO==0,那么:检查AMDPDU分段头E域:如果E==0,即SN=VR(R)的AMDPDU 只有一个数据域元素, 显然这些字节分段不能被重组, 那么:RLCSDU重组结束,返回。否则E==1,即SN=VR(R)的AMDPDU 有多个数据域元素,那么:计算未被重组的连续 AMDPDU 分段的总长度(设为 length);(1)执行结束条件为 E=0的循环(表示遍历到 AMD PDU的最后的未完整接收的数据域元素),在循环体里,执行:得到AMDPDU 分段头扩展部分的第 LISN个E和LI域;更新循环条件的 E=当前E域;比较LI和length –CSO,即:? 如果LI =<length-CSO, 从CSO开始长度为LI的连续字节分段可以被重组, 那么:计算得到长度为 LI的连续字节分段,以及当前的 AMDPDU分段的SO如果CSO==0 且分段头FI的第一位为1,即这些第一个连续字节分段是一个 SDU的后面分段,显然PDULeft标准文档实用文案对象的SDUs成员保留了该SDU的前面分段,那么:将这2个SDU分段按序重组为 RLCSDU;将该完成重组的RLCSDU按序递交给高层;否则,CSO!=0 或FI的第一位为0,那么:把这些连续字节分段重组为 RLCSDU;将该完成重组的RLCSDU按序递交给高层;更新PDULeft 对象:SN=-1;SDUs清空;更新length :length=length –LI;更新AMD_SegContext 对象:CSO=CSO+LI;SN=VR(R);如果E=1,LISN++;否则LISN=0;如果LI==length –CSO,SO=当前AMDPDU 分段的SO+分段长度;否则(LI<length –CSO)SO=当前AMDPDU 分段的SO;循环回到(1);如果LI>length-CSO,没有满足长度为LI的连续字节分段,那么:退出循环, RLCSDU重组结束。循环结束, 返回。最后,关于上面的例子:标准文档实用文案RLCSDU1、RLCSDU2 提交给高层;更新PDULeft 对象:SN=-1;SDUs 清空;更新AMD_SegContext 对象:CSO=LI1+LI2;SN=VR(R);LISN=3;SO= 数据1长实例一、分段和串接RLCSDUnn+1n+2n+3n+4......RLCheaderRLCheader3RLCPDU42RLCheaderRLC SN=1header最主要的就是要确定 RLCPDU头的位域RLCPDU 数据域只有一个 RLCSDU或RLCSDU分段标准文档实用文案R1R1R1FIESNOct1SNOct2DataOct3一个RLCSDU.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论