finish packet: MINPacket

This commit is contained in:
free will committed 2021-03-15 12:58:17 +08:00
1 parent 997eaa12ac
commit 0a945ada8e
2 files changed
+159 -12

No files matched your search

+159
View File
@@ -0,0 +1,159 @@
package packet;
import component.IdentifierField;
import component.MutableField;
import component.ReadOnlyField;
import encoding.*;
/*
* @Author: Wang Feng
* @Description: 表示一个MIN网络层包的通用结构
* todo: 需要在signature完成之后取消signatureField的注释
* @Version: 1.0.0
* @Date: 22:07 2021/3/13
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
*/
public class MINPacket implements IEncodingAble {
private IdentifierField identifierField; // 标识区
// private SignatureField signatureField; // 签名区
private ReadOnlyField readOnlyField; // 只读区
private MutableField mutableField; // 可变区
private VlInt packetType; // 包类型
/**
* 判断 MIN 包是否是一个有效的包
* @return
*/
public boolean isPacketValid(){
return TLV.isValidPacketType(packetType);
}
/**
* 将 Packet 线速编码为 TLV
* @param encoder
* @return
*/
@Override
public int wireEncode(Encoder encoder) {
if(!this.isPacketValid()){
return 0;
}
int totalLength=0;
// 编码 TLV-VALUE
// 可变区
int tmplen=this.mutableField.wireEncode(encoder);
if(tmplen<=0){
return 0;
}
totalLength+=tmplen;
// 只读区
tmplen=this.readOnlyField.wireEncode(encoder);
if(tmplen<=0){
return 0;
}
totalLength+=tmplen;
// 签名区
// tmplen=this.signatureField.wireEncode(encoder);
// if(tmplen<=0){
// return 0;
// }
// totalLength+=tmplen;
// 标识区
tmplen=this.identifierField.wireEncode(encoder);
if(tmplen<=0){
return 0;
}
totalLength+=tmplen;
// 编码包 TLV-LENGTH
tmplen=encoder.prependVarNumber(new VlInt(totalLength));
if(tmplen<=0){
return 0;
}
totalLength+=tmplen;
// 编码包 TLV-TYPE
tmplen=encoder.prependVarNumber(this.packetType);
if(tmplen<=0){
return 0;
}
totalLength+=tmplen;
return totalLength;
}
/**
* 线速解码,将 MIN包 TLV 中的四个区域分别解析出来
* @param block
* @return
*/
@Override
public boolean wireDecode(Block block) {
// 首先判断包是否有效
if(!block.isValid()){
return false;
}
// 首先解析子 Block
if(!block.parseSubElements()){
return false;
}
// 标记,用来记录是否满足必要条件
boolean existIdentifier=false;
// 解析四个标识区
int elementSize=block.getSubElements().length();
for (int i=0;i<elementSize;i++) {
Block cacheBlock=block.getSubElements().getBlock(i);
switch (cacheBlock.getType().getVlIntValue2Int()){
case TLV.TlvIdentifierField: // 目的标识区
// 解析标识区,保证其中至少存在一个标识
if(!cacheBlock.parseSubElements()){
return false;
}
if(!cacheBlock.hasSubElement()){
return false;
}
// 解析标识区
if(!this.identifierField.wireDecode(cacheBlock)){
return false;
}
// 标示解析到了至少一个以上的合法标识
existIdentifier=true;
case TLV.TlvSignatureField: // 签名区
// 解析签名区,保证如果存在签名,则签名均符合格式
// if(!this.signatureField.wireDecode(cacheBlock)){
// return false;
// }
case TLV.TlvReadOnlyField: // 只读区
// 解析只读区
if(!this.readOnlyField.wireDecode(cacheBlock)){
return false;
}
case TLV.TlvMutableField: // 可变区
// 解析可变区
if(!this.mutableField.wireDecode(cacheBlock)){
return false;
}
default:
return false;
}
}
// 判断是否有必须的组件缺失
if(!existIdentifier){
return false;
}
return true;
}
}
-12
View File
@@ -1,12 +0,0 @@
package packet;
/*
* @Author: Wang Feng
* @Description:
* @Version: 1.0.0
* @Date: 22:07 2021/3/13
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
*/
public class Packet {
}