发明内容
本发明的目的是,提供一种无线聚合帧的发送处理方法及对应装置,在MAC硬件不支持聚合的情况下,高效地完成聚合帧的发送。
为了实现上述目的,本发明提供一种无线聚合帧的发送处理方法,包括:
A、协议发送处理单元将发送装置当前所有待发送的MAC协议数据单元MSDU帧依次进行协议上的处理;
B、然后协议发送处理单元对所有处理后的待发送的MSDU帧进行判断,如果判断当前所有待发送的MSDU帧为多个,则根据标准聚合帧中可包括的MSDU帧数目,分离出多条MSDU子链,并在每条子链头部添加一个用于负载聚合帧的MAC业务数据单元MPDU帧,然后把每条子链分别存入当前可用的空闲缓冲区中;如果在本次添加子链之前缓冲区为空,则建立并启动DMA传输事务,以把当前缓冲区中的第一条MSDU子链中的多个MSDU帧拷贝到子链头部的MPDU帧中;
C、在收到聚合完成消息后,协议发送处理单元依次将缓冲区中完成聚合的MPDU帧交给MAC发送单元进行发送,同时为缓冲区中需要聚合的子链建立并启动DMA传输事务。
具体的,所述步骤B中,协议发送处理单元对所有处理后的待发送的MSDU帧进行判断,
如果判断当前所有待发送的仅为单个MSDU帧,且当前缓冲区为空,则将该MSDU帧封装为单个MPDU帧后,交给MAC发送单元进行发送;
如果判断当前所有待发送的仅为单个MSDU帧,且当前缓冲区不为空,则将该MSDU帧封装为单个MPDU帧,并将该单个MPDU帧存入当前可用的空闲缓冲区中。
具体的,所述缓冲区在初始化时申请,可分为多个子区域,每个子区域对应一个数据帧队列和一个聚合标志。
所述步骤B中,将该单个MPDU帧存入当前可用的空闲缓冲区是指,协议发送处理单元在缓冲区中进行查找,当缓冲区中最后一个不为空的子区域中的数据帧队列为存放单个MPDU帧的队列,则将该MPDU帧存入该MPDU帧队列;否则直接将该MPDU帧存入到当前空的子区域中的数据帧队列中,并设置该队列的聚合标志为完成。
所述步骤C中,在收到聚合完成消息后,协议发送处理单元依次将聚合标志为完成的子区域的数据帧队列中的MPDU帧交给MAC发送单元进行发送,并为聚合标志为未完成的数据帧队列建立并启动DMA传输事务。
本发明的另一个目的提供一种聚合帧的发送装置,包括:
缓冲区,用于存储待交给MAC发送单元发送的MPDU帧;
协议发送处理单元,用于对发送装置当前待发送的所有MSDU帧依次进行协议上的处理,然后再用于判断当前所有待发送的MSDU帧为多个时,根据标准聚合帧中可包括的MSDU帧数目,分离出多条MSDU子链,并在每条子链头部添加一个用于负载聚合帧的MPDU帧,然后把每条子链分别存入当前可用的空闲缓冲区中;如果在本次添加子链之前缓冲区为空,则建立并启动DMA传输事务,以把当前缓冲区中的第一条MSDU子链中的多个MSDU帧拷贝到子链头部的MPDU帧中;
聚合DMA控制处理单元,用于完成协议发送处理单元建立的DMA传输事务,并在传输事务完成聚合后通知协议发送处理单元;
所述协议发送处理单元还用于,收到聚合DMA控制处理单元的解聚合完成消息时,依次将缓冲区中完成聚合的MPDU帧交给MAC发送单元进行发送,同时为缓冲区中需要聚合的子链建立并启动DMA传输事务,从而将缓冲区中需要聚合的子链中的多个MSDU帧拷贝到子链头部的MPDU帧中。
具体的,所述协议发送处理单元还用于进行如下判断和执行相应操作,
如果判断当前所有待发送的仅为单个MSDU帧,且当前缓冲区为空,则将该MSDU帧封装为单个MPDU帧后,交给MAC发送单元进行发送;
如果判断当前所有待发送的仅为单个MSDU帧,且当前缓冲区不为空,则将该MSDU帧封装为单个MPDU帧,并将该单个MPDU帧存入当前可用的空闲缓冲区中。
具体的,所述缓冲区在初始化时申请,可分为多个子区域,每个子区域对应一个数据帧队列和一个聚合标志。
具体的,所述聚合DMA控制处理单元包括聚合DMA控制器子单元和聚合DMA完成处理程序子单元,
所述聚合DMA控制器子单元,用于完成协议发送处理单元建立的DMA传输事务;并用于在所有的DMA传输事务完成后,通过中断触发聚合DMA完成处理程序子单元执行相应程序;
所述聚合DMA完成处理程序子单元,用于设置缓冲区中对应子区域的数据帧队列的聚合标志为完成,然后发送聚合完成消息给协议发送处理单元。
具体的,本发明中的所述协议发送处理单元还用于,在收到聚合完成消息后,释放聚合标志为完成的子区域的数据帧队列中的单个MSDU帧,并在将该子区域的数据帧队列中的MPDU帧交给MAC发送单元进行发送后,清空该子区域。
综上,本发明在MAC硬件不支持聚合的情况下,通过硬件DMA控制器完成对多个MSDU帧聚合的拷贝,提高MPDU帧的发送处理效率,并且保证了发送数据帧的顺序。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明作进一步详细说明。
参见图1,为本发明提供的无线聚合帧的发送处理方法实施例的流程图,其具体步骤为:
步骤101、协议发送处理单元将发送装置当前所有待发送的MSDU帧依次进行协议上的处理;
在本步骤中,发送装置一般把需要发送的MSDU存放到MSDU发送队列,然后发送入队消息通知协议发送处理单元;协议发送处理单元接收到MSDU帧的入队消息后,从MSDU发送队列中取出所有的MSDU帧,进行MSDU协议上的相关处理。
步骤102、协议发送处理单元对所有处理后的待发送的MSDU帧进行判断,并根据判断结果不同执行不同的操作:
判断子步骤1021、如果判断当前所有待发送的MSDU帧为多个,则根据标准聚合帧中可包括的MSDU帧数目,分离出多条MSDU子链,并在每条子链头部添加一个用于负载聚合帧的MPDU帧,然后把每条子链分别存入当前可用的空闲缓冲区中;如果在本次添加子链之前缓冲区为空,则建立并启动DMA传输事务,以把当前缓冲区中的第一条MSDU子链中的多个MSDU帧拷贝到子链头部的MPDU帧中。
判断子步骤1022、如果判断当前所有待发送的仅为单个MSDU帧,且当前缓冲区为空,则将该MSDU帧封装为单个MPDU帧后,交给MAC发送单元进行发送;本子步骤中,由于当前缓冲区为空,则说明当前没有需要等待聚合的MSDU帧,即不存在拥塞,同时不存在发送帧的保序问题,可以直接将当前的单个MPDU帧交给MAC发送单元进行发送。
判断子步骤1023、如果判断当前所有待发送的仅为单个MSDU帧,且当前缓冲区不为空,则将该MSDU帧封装为单个MPDU帧,并将该单个MPDU帧存入当前可用的空闲缓冲区中;本子步骤中,由于当前缓冲区不为空,说明有需要聚合的MSDU帧在排队,说明可能存在网络拥塞,所以为了保证数据帧的序列,需要将当前的单个MPDU帧顺序放入缓冲区中用于存放单个的MPDU帧的队列中或者空闲缓冲区中排队。
步骤103、在收到聚合完成消息后,协议发送处理单元依次将缓冲区中完成聚合的MPDU帧交给MAC发送单元进行发送,同时为缓冲区中需要聚合的子链建立并启动DMA传输事务。
在本发明的另一个实施例中,将用于临时存放MPDU帧的缓冲区分为多个子区域,每个子区域对应一个数据帧队列以及一个聚合标志。数据帧队列用来存储单个MPDU帧或者等待聚合的MPDU帧,聚合标志可分为完成和未完成两种类型。当数据帧队列存储的是连续MPDU单帧时,该队列的聚合标志为完成,并称该数据帧队列为MPDU帧队列;当数据帧队列存入的是等待聚合的MPDU帧时,该队列的聚合标志为未完成,该数据帧队列称为聚合帧队列,同时一旦聚合帧队列中的MSDU帧已经全部拷贝到队列首部的MPDU帧后,则该队列的聚合标志变为完成且该队列中的单个的MSDU帧会被删除。
在发送装置的协议发送处理单元对发送装置当前需要发送的所有MSDU帧进行协议上的处理后,开始对所有处理后的待发送的MSDU帧进行判断,根据判断结果不同执行不同的操作,具体为:
如果判断当前所有待发送的MSDU帧为多个,则根据标准聚合帧中可包括的MSDU帧数目,分离出多条MSDU子链,并在每条子链头部添加一个用于负载聚合帧的MPDU帧,然后在缓冲区中查找空闲的子区域,并将当前的MSDU子链分别依次加入到不同空闲子区域的数据帧队列中,并设置该数据帧队列的聚合标志为未完成;如果在本次添加子链之前缓冲区为空,则建立并启动DMA传输事务,以把当前缓冲区中的第一个子区域中数据帧队列的MSDU子链中的多个MSDU帧拷贝到子链头部的MPDU帧中;
如果判断当前所有待发送的仅为单个MSDU帧,且当前缓冲区为空,则将该MSDU帧封装为单个MPDU帧后,交给MAC发送单元进行发送;
如果判断当前所有待发送的仅为单个MSDU帧,且当前缓冲区不为空,则则在缓冲区中进行查找,当缓冲区中最后一个不为空的子区域中的数据帧队列为MPDU帧队列,则将该MPDU帧存入该MPDU帧队列;否则直接将该MPDU帧存入到当前空的子区域中的数据帧队列中,并设置该队列的聚合标志为完成。
在DMA传输事务完成后,一般会发聚合完成消息给协议发送处理单元,协议发送处理单元;在收到聚合完成消息后,协议发送处理单元释放聚合标志为完成的子区域的数据帧队列中的MSDU帧,并在将该子区域的数据帧队列中的MPDU帧交给MAC发送单元后,清空该子区域。如果查找到有聚合标志为未完成的子区域,则停止将MPDU帧交给MAC发送单元,建立并启动多个DMA传输事务,从而将当前子区域对应的数据帧队列中的MSDU帧依次拷贝到数据帧队列头部中的MPDU帧中。
本发明还提供了一种实施上述无线聚合帧发送处理方法的装置实施例,如图2所示,本发送装置包括:
缓冲区,用于存储待交给MAC发送单元发送的MPDU帧;
协议发送处理单元,用于对发送装置当前待发送的所有MPDU帧依次进行协议上的处理,然后再对当前处理后的所有待发送的MPDU帧进行判断,根据判断结果不同执行不同的操作:
判断当前所有待发送的MSDU帧为多个时,根据标准聚合帧中可包括的MSDU帧数目,分离出多条MSDU子链,并在每条子链头部添加一个用于负载聚合帧的MPDU帧,然后把每条子链分别存入当前可用的空闲缓冲区中;如果在本次添加子链之前缓冲区为空,则建立并启动DMA传输事务,以把当前缓冲区中的第一条MSDU子链中的多个MSDU帧拷贝到子链头部的MPDU帧中;
判断当前所有待发送的仅为单个MSDU帧,且当前缓冲区为空,则将该MSDU帧封装为单个MPDU帧后,交给MAC发送单元进行发送;
判断当前所有待发送的仅为单个MSDU帧,且当前缓冲区不为空,则将该MSDU帧封装为单个MPDU帧,并将该单个MPDU帧存入当前可用的空闲缓冲区中;
聚合DMA控制处理单元,用于完成协议发送处理单元建立的DMA传输事务,并在传输事务完成聚合后通知协议发送处理单元;
所述协议发送处理单元还用于,收到聚合DMA控制处理单元的聚合完成消息时,依次将缓冲区中完成聚合的MPDU帧交给MAC发送单元进行发送,同时为缓冲区中需要聚合的子链建立并启动DMA传输事务,从而将缓冲区中需要聚合的子链中的多个MSDU帧拷贝到子链头部的MPDU帧中。
参见图3,是本发明提供的无线聚合帧的发送装置的实施例,包括用于存储待交给MAC发送单元发送的MPDU帧的缓冲区,图4是本发明实施例的缓冲区的结构示意图;本发明的接收装置还包括用于对当前待发送的MSDU帧进行协议上处理,然后再对处理后的所有MSDU帧进行判断,根据判断结果的不同执行不同操作的协议接收处理单元。还包括用于完成协议发送处理单元建立的DMA传输事务,并在传输事务完成聚合后通知协议发送处理单元的聚合DMA控制处理单元。
在本实施例中,聚合DMA控制处理单元包括聚合DMA控制器子单元,用于完成协议发送处理单元建立的DMA传输事务;并用于在所有的DMA传输事务完成后,通过中断触发聚合DMA完成处理程序子单元执行相应程序;还包括聚合DMA完成处理程序子单元,用于设置缓冲区中对应子区域的数据帧队列的聚合标志为完成,然后发送聚合完成消息给协议发送处理单元。
为了更深入的理解本发明,现就本发发明实施例的发送装置实施本发明发送处理方法的具体过程进行详细说明,在本实施例中,定义如下参数:
MPDU-SUB-SIZE表示缓冲区中子区域的个数,
MPDU-AMSDU-IDEX表示正在进行聚合的子区域在缓冲区中的位置,
MPDU-MPDU-IDEX表示可存放MPDU帧的子区域在缓冲区中的位置,
MPDU-EMPTY-IDEX表示空闲的子区域在缓冲区中的位置,
缓冲区各个子区域中数据帧队列的聚合标志具有两个值:Done和Undone,其中Done表示聚合操作完成,而Undone表示聚合操作未完成。
发送装置首先把需要发送的MSDU存放到MSDU发送队列,然后发送入队消息通知协议发送处理单元;协议发送处理单元完成对当前所有待发送的MSDU帧的协议处理后,检测是否需要进行聚合操作,以及在需要聚合操作时执行聚合操作后将聚合帧交给MAC发送单元发送,所以协议发送处理单元执行的具体操作参见如下步骤A01-A03:
步骤A01:协议发送处理单元查询是否有聚合完成消息,如果否,则进行步骤A02的查询及操作,否则进一步判断正在进行聚合的子区域在缓冲区中的位置MPDU-AMSDU-IDEX是否等于空闲的子区域在缓冲区中的位置MPDU-EMPTY-IDEX,如果是,则返回继续进行本步骤A01的查询及操作,否则进一步判断MPDU-AMSDU-IDEX对应子区域的聚合标志是否为Done,如果是,则取出子区域中数据帧队列中的MPDU帧,依次交给MAC发送处理单元,清空该子区域,并设置MPDU-AMSDU-IDEX=(MPDU-AMSDU-IDEX+1)modMSDU-SUB-SIZE,并返回本A01步骤;否则进入步骤A03的操作;
步骤A02:协议发送处理单元查询是否有MSDU入队消息,如果否,则执行步骤A01的查询及操作,否则从MSDU发送队列中取出所有待发送的MSDU帧,并依次对其中的MSDU帧进行协议上的处理,完成对所有待发送的MSDU帧的处理后,开始对处理后的MSDU帧进行如下判断并执行对应的操作,直至对所有的MSDU帧完成判断及对应操作,然后进入步骤A01的查询及操作:
如果当前待发送的所有MSDU帧仅为一个MSDU,且MPDU-AMSDU-IDEX等于MSDU-EMPTY-IDEX,则将该MSDU帧封装为单个MPDU帧后,交给MAC发送单元进行发送;返回本判断步骤;
如果当前待发送的所有MSDU帧仅为一个MSDU,且MPDU-AMSDU-IDEX不等于MSDU-EMPTY-IDEX,则将该MSDU帧封装为单个MPDU帧;然后,如果MPDU-MPDU-IDEX不等于MPDU-EMPTY-IDEX,则把MPDU报文放入MPDU-MPDU-IDEX对应子区域的数据帧队列的尾部,返回本判断步骤;否则,如果(MPDU-EMPTY-IDEX+1)mod MPDU-SUB-SIZE等于MPDU-AMSDU-IDEX,则丢弃该MPDU帧,否则设置MPDU-EMPTY-IDEX=(MPDU-EMPTY-IDEX+1)mod MPDU-SUB-SIZE,把MPDU报文放入MPDU-MPDU-IDEX对应空的子区域的数据帧队列中,设置子区域的聚合标志为Done,返回本判断步骤;
如果当前待发送的所有MSDU帧为多个,则根据标准聚合帧中可包括的MSDU帧数目,分离出一条MSDU子链,并在本MSDU子链头部添加一个负载聚合帧的MPDU帧,然后判断(MPDU-EMPTY-IDEX+1)mod MPDU-SUB-SIZE是否等于MPDU-AMSDU-IDEX,如果是则丢弃当前的MPDU子链,返回本判断步骤,否则把当前MSDU子链存放到MPDU-EMPTY-IDEX对应的空闲子区域的数据帧队列中,并设置子区域数据帧队列的聚合标志为Undone,MPDU-EMPTY-IDEX=(MPDU-EMPTY-IDEX+1)mod MPDU-SUB-SIZE,MPDU-MPDU-IDEX=MPDU-EMPTY-IDEX;如果添加MSDU子链之前,MPDU-AMSDU-IDEX等于MPDU-EMPTY-IDEX,则建立并启动多个DMA传输事务,以把对应MSDU子链表中多个MSDU帧的内容拷贝到MSDU子链头部的MPDU帧处;返回本判断步骤。
步骤A03,协议发送处理单元建立并启动多个DMA传输事务后,协议发送处理单元进入步骤A02的查询及操作;聚合DMA控制器单元执行协议发送处理单元建立的DMA传输事务,以将对应子区域的数据帧队列中的MSDU帧拷贝到头部的MPDU帧中;当所有的DMA传输事务完成后,聚合DMA控制器单元通过中断触发聚合DMA完成处理程序单元执行;聚合DMA完成处理程序单元得到聚合DMA控制器单元的触发通知后,首先设置缓冲区中MPDU-AMSDU-IDEX对应的子区域的聚合标志为Done,然后发送聚合完成消息给协议发送处理单元。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。