From 0a945ada8ec1a537b2ee154335c1ed3ee56d02a0 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Mon, 15 Mar 2021 12:58:17 +0800 Subject: [PATCH] finish packet: MINPacket --- src/main/java/packet/MINPacket.java | 159 ++++++++++++++++++++++++++++ src/main/java/packet/Packet.java | 12 --- 2 files changed, 159 insertions(+), 12 deletions(-) create mode 100644 src/main/java/packet/MINPacket.java delete mode 100644 src/main/java/packet/Packet.java diff --git a/src/main/java/packet/MINPacket.java b/src/main/java/packet/MINPacket.java new file mode 100644 index 0000000..0c8fac4 --- /dev/null +++ b/src/main/java/packet/MINPacket.java @@ -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