diff --git a/src/main/java/component/LpPacketHeader.java b/src/main/java/component/LpPacketHeader.java index 2bdf7e4..1161b3e 100644 --- a/src/main/java/component/LpPacketHeader.java +++ b/src/main/java/component/LpPacketHeader.java @@ -1,8 +1,8 @@ package component; -import encoding.Block; -import encoding.Encoder; -import encoding.IEncodingAble; +import com.sun.org.apache.regexp.internal.RE; +import encoding.*; +import packet.LpPacket; /* * @Author: Wang Feng @@ -13,9 +13,43 @@ import encoding.IEncodingAble; */ public class LpPacketHeader implements TlvComponentBase, IEncodingAble { // 成员变量 - private LpPacketFragmentId lpPacketFragmentId; - private LpPacketFragmentNum lpPacketFragmentNum; - private LpPacketFragmentSeq lpPacketFragmentSeq; + private LpPacketFragmentId lpPacketFragmentId=new LpPacketFragmentId(); + private LpPacketFragmentNum lpPacketFragmentNum=new LpPacketFragmentNum(); + private LpPacketFragmentSeq lpPacketFragmentSeq=new LpPacketFragmentSeq(); + + public LpPacketHeader(){ + } + + public LpPacketHeader(LpPacketFragmentId id, + LpPacketFragmentNum num,LpPacketFragmentSeq seq){ + this.lpPacketFragmentId=id; + this.lpPacketFragmentNum=num; + this.lpPacketFragmentSeq=seq; + } + + public LpPacketFragmentId getLpPacketFragmentId() { + return lpPacketFragmentId; + } + + public void setLpPacketFragmentId(LpPacketFragmentId lpPacketFragmentId) { + this.lpPacketFragmentId = lpPacketFragmentId; + } + + public LpPacketFragmentNum getLpPacketFragmentNum() { + return lpPacketFragmentNum; + } + + public void setLpPacketFragmentNum(LpPacketFragmentNum lpPacketFragmentNum) { + this.lpPacketFragmentNum = lpPacketFragmentNum; + } + + public LpPacketFragmentSeq getLpPacketFragmentSeq() { + return lpPacketFragmentSeq; + } + + public void setLpPacketFragmentSeq(LpPacketFragmentSeq lpPacketFragmentSeq) { + this.lpPacketFragmentSeq = lpPacketFragmentSeq; + } /** * 将 LpPacketHeader 线速编码为一个 TLV @@ -24,7 +58,48 @@ public class LpPacketHeader implements TlvComponentBase, IEncodingAble { */ @Override public int wireEncode(Encoder encoder) throws ComponentException { + try{ + int totalLength=0; + // 编码 TLV-VALUE + // seq + int tmpLen=this.lpPacketFragmentSeq.wireEncode(encoder); + if(tmpLen<=0){ + return -1; + } + totalLength+=tmpLen; + // num + tmpLen=this.lpPacketFragmentNum.wireEncode(encoder); + if(tmpLen<=0){ + return -1; + } + totalLength+=tmpLen; + + // id + tmpLen=this.lpPacketFragmentId.wireEncode(encoder); + if(tmpLen<=0){ + return -1; + } + totalLength+=tmpLen; + + // 编码 TLV-LENGTH + tmpLen=encoder.prependVarNumber(new VlInt(totalLength)); + if(tmpLen<=0){ + return -1; + } + totalLength+=tmpLen; + + // 编码 TLV-TYPE + tmpLen=encoder.prependVarNumber(new VlInt(TLV.TlvLpPacketHeader)); + if(tmpLen<=0){ + return -1; + } + totalLength+=tmpLen; + + return totalLength; + } catch (EncoderException e) { + throw new ComponentException("LpPacketHeader.wireEncode: "+e.getMessage()); + } } /** @@ -34,6 +109,43 @@ public class LpPacketHeader implements TlvComponentBase, IEncodingAble { */ @Override public boolean wireDecode(Block block) throws ComponentException { + try { + // 检查 Type 是否正确 + if (!TLV.expectType(block.getType(), new VlInt(TLV.TlvLpPacketHeader))) { + return false; + } + // 解析子组件 + if(!block.parseSubElements()){ + return false; + } + + ElementContainer elementContainer=block.getSubElements(); + for (int i = 0; i < elementContainer.length(); i++) { + Block newBlock=elementContainer.getBlock(i); + int type=newBlock.getType().getVlIntValue2Int(); + switch (type){ + case TLV.TlvLpPacketFragmentId: + if(!this.lpPacketFragmentId.wireDecode(newBlock)){ + return false; + } + break; + case TLV.TlvLpPacketFragmentNum: + if(!this.lpPacketFragmentNum.wireDecode(newBlock)){ + return false; + } + break; + case TLV.TlvLpPacketFragmentSeq: + if(!this.lpPacketFragmentSeq.wireDecode(newBlock)){ + return false; + } + break; + } + } + + return true; + } catch (VlIntException | BlockException e) { + throw new ComponentException("LpPacketHeader.wireDecode: "+e.getMessage()); + } } } diff --git a/src/main/java/packet/Interest.java b/src/main/java/packet/Interest.java index a2dd630..98bb348 100644 --- a/src/main/java/packet/Interest.java +++ b/src/main/java/packet/Interest.java @@ -39,16 +39,16 @@ import encoding.*; public class Interest implements InteractWithField, IEncodingAble { public MINPacket minPacket=new MINPacket(); public CanBePrefix canBePrefix=new CanBePrefix(); - private MustBeRefresh mustBeRefresh=new MustBeRefresh(); - private InterestLifeTime interestLifeTime=new InterestLifeTime(); - private Nonce nonce=new Nonce(); - private HopLimit hopLimit=new HopLimit(); - private Payload payload=new Payload(); - private CongestionMark congestionMark=new CongestionMark(); - private TTL ttl=new TTL(); - private NackHeader nackHeader=new NackHeader(); + public MustBeRefresh mustBeRefresh=new MustBeRefresh(); + public InterestLifeTime interestLifeTime=new InterestLifeTime(); + public Nonce nonce=new Nonce(); + public HopLimit hopLimit=new HopLimit(); + public Payload payload=new Payload(); + public CongestionMark congestionMark=new CongestionMark(); + public TTL ttl=new TTL(); + public NackHeader nackHeader=new NackHeader(); - private Identifier name=new Identifier(); + public Identifier name=new Identifier(); /** * 获取内容兴趣包的名字 diff --git a/src/main/java/packet/LpPacket.java b/src/main/java/packet/LpPacket.java index 6b4ac63..9eacd2f 100644 --- a/src/main/java/packet/LpPacket.java +++ b/src/main/java/packet/LpPacket.java @@ -1,5 +1,10 @@ package packet; +import component.ComponentException; +import component.LpPacketHeader; +import component.Payload; +import encoding.*; + /* * @Author: Wang Feng * @Description: @@ -7,5 +12,96 @@ package packet; * @Date: 17:33 2021/4/2 * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 */ -public class LpPacket { +public class LpPacket implements IEncodingAble { + public LpPacketHeader lpPacketHeader=new LpPacketHeader(); + public Payload payload=new Payload(); + + /** + * 将 LpPacket 线速编码为一个 TLV + * @param encoder + * @return + * @throws ComponentException + * @throws PacketException + */ + @Override + public int wireEncode(Encoder encoder) throws PacketException { + try { + int totalLength = 0; + // 编码 TLV-VALUE + // LpHeader + int tmpLen = this.lpPacketHeader.wireEncode(encoder); + if(tmpLen<=0){ + return -1; + } + totalLength+=tmpLen; + // Fragment + tmpLen = this.payload.wireEncode(encoder); + if(tmpLen<=0){ + return -1; + } + totalLength+=tmpLen; + + // 编码 TLV-LENGTH + tmpLen = encoder.prependVarNumber(new VlInt(totalLength)); + if(tmpLen<=0){ + return -1; + } + totalLength+=tmpLen; + + // 编码 TLV-TYPE + tmpLen = encoder.prependVarNumber(new VlInt(TLV.TlvLpPacket)); + if(tmpLen<=0){ + return -1; + } + totalLength+=tmpLen; + + return totalLength; + } catch (ComponentException | EncoderException e) { + throw new PacketException("LpPacket.wireEncode: "+e.getMessage()); + } + } + + /** + * 从 Block TLV 中解码出一个 LpPacket + * @param block + * @return + * @throws ComponentException + * @throws PacketException + */ + @Override + public boolean wireDecode(Block block) throws PacketException { + try { + // 检查 Type 是否正确 + if (!TLV.expectType(block.getType(), new VlInt(TLV.TlvLpPacket))) { + return false; + } + + // 解析子组件 + if(!block.parseSubElements()){ + return false; + } + + ElementContainer elementContainer=block.getSubElements(); + for (int i = 0; i < elementContainer.length(); i++) { + Block newBlock=elementContainer.getBlock(i); + int type=newBlock.getType().getVlIntValue2Int(); + switch (type){ + case TLV.TlvLpPacketHeader: + if(!this.lpPacketHeader.wireDecode(newBlock)){ + return false; + } + break; + case TLV.TlvPayload: + if(!this.payload.wireDecode(newBlock)){ + return false; + } + break; + } + } + + return true; + } catch (VlIntException | BlockException | ComponentException e) { + throw new PacketException("LpPacket.wireDecode: "+e.getMessage()); + } + } }