add Packet: LpPacket

This commit is contained in:
free will committed 2021-04-07 11:53:35 +08:00
1 parent 472821754a
commit 69315b0b74
3 files changed
+224 -16

No files matched your search

+118 -6
View File
@@ -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());
}
}
}
+9 -9
View File
@@ -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();
/**
* 获取内容兴趣包的名字
+97 -1
View File
@@ -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());
}
}
}