diff --git a/app/src/main/java/org/onosproject/ngsdn/tutorial/Gsrv6Compres.java b/app/src/main/java/org/onosproject/ngsdn/tutorial/Gsrv6Compres.java new file mode 100755 index 0000000..526c23e --- /dev/null +++ b/app/src/main/java/org/onosproject/ngsdn/tutorial/Gsrv6Compres.java @@ -0,0 +1,274 @@ +package org.onosproject.ngsdn.tutorial; + +import com.google.common.collect.Lists; +import org.onlab.packet.Ip6Address; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.onlab.packet.IpAddress; +import org.onlab.packet.IpPrefix; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.onlab.packet.IpAddress.INET6_BYTE_LENGTH; + +public class Gsrv6Compres { + private static final Logger log = LoggerFactory.getLogger(Gsrv6Compres.class); + public static final int GSIDLEN16 = 16; + public static final int GSIDLEN32 = 32; + public static final int COC16_FLAVOR = 0x02; + public static final int COC32_FLAVOR = 0x01; + public static final int COC16_SI_LEN = 0x3; /*3 bit used for SI*/ + public static final int COC32_SI_LEN = 0x4; /*4 bit used for SI*/ + public static final int COC16_MAX_ELEMENT = 0x8; /*G-SID container number for 16 bit*/ + public static final int COC32_MAX_ELEMENT = 0x4; /*G-SID container number for 32 bit*/ + + + public List SingleSegmentCompress( List segmentList, int CommonPrefixLength, int GSIDLength, int ArgLength) + { + Ip6Address CommonPrefix= null; + IpPrefix ipPrefixFirst = null; + IpPrefix ipPrefixNext = null; + Ip6Address AddrTemp = null; + Ip6Address AddrCotainer = null; + List SingleCompressSid = Lists.newArrayList(); + int ContainElement = 0; + int PrefilBits = 0; + int GSidBits = 0; + int ArgBits = 0; + byte[] AddrArry = null; + + log.info("CommonPrefixLength:{},GSIDLength:{},ArgLength:{}",CommonPrefixLength ,GSIDLength,ArgLength); + log.info("single segment size:{} " ,segmentList.size()); + + if ((0 >= CommonPrefixLength) ||(CommonPrefixLength%8 !=0)|| (0 > ArgLength) || ((GSIDLength != GSIDLEN16)&&(GSIDLength != GSIDLEN32)) ) + { + throw new RuntimeException("CommonPrefixLength " + CommonPrefixLength + "GSIDLength" +GSIDLength +"ArgLength"+ArgLength +"in paraer error"); + } + + if (((GSIDLength == GSIDLEN16) && (ArgLength =COC32_MAX_ELEMENT )||(sidIndex == segmentList.size()-1)) + { + AddrCotainer =Ip6Address.valueOf(AddrArry); + SingleCompressSid.add(AddrCotainer); + AddrArry = new byte[INET6_BYTE_LENGTH]; + ContainElement =0; + + } + } + else + { + for (int gsidIndex = 0; gsidIndex < GSidBits; gsidIndex++) + { + AddrArry[ContainElement*GSidBits+gsidIndex]= TmpAddrArry[PrefilBits+gsidIndex]; + } + ContainElement++; + if (sidIndex != segmentList.size()-1) + { + AddrArry[ContainElement * GSidBits - 1] |= (byte) COC16_FLAVOR; + } + if ((ContainElement>=COC16_MAX_ELEMENT )||(sidIndex == segmentList.size()-1)) + { + AddrCotainer =Ip6Address.valueOf(AddrArry); + SingleCompressSid.add(AddrCotainer); + ContainElement =0; + AddrArry = new byte[INET6_BYTE_LENGTH]; + } + } + } + log.info("SingleCompressSid length:{}",SingleCompressSid.size()); + return SingleCompressSid; + } + + public Ip6Address AddrToSid( Ip6Address NodeAddr) + { + Ip6Address NodeSid =Ip6Address.valueOf(NodeAddr.toOctets()); + return NodeSid; + } + + public boolean NodeGSrv6Ability( Ip6Address NodeAddr) + { + return true; + } + + public int CompressPerfixLenGet( Ip6Address NodeAddr) + { + int CommonPrefixLength =64; + return CommonPrefixLength; + } + + public int CompressGsidLenGet( Ip6Address NodeAddr) + { + int GSIDLength =32; + return GSIDLength; + } + + public int CompressArgLenGet( Ip6Address NodeAddr) + { + int ArgLength =32; + return ArgLength; + } + + public boolean GsidPerfixMatch( Ip6Address GsidFirst,Ip6Address GsidNext,int CommonPrefixLength) + { + IpPrefix ipPrefixFirst = null; + IpPrefix ipPrefixNext = null; + + ipPrefixFirst = IpPrefix.valueOf(GsidFirst,CommonPrefixLength); + ipPrefixNext = IpPrefix.valueOf(GsidNext,CommonPrefixLength); + if (ipPrefixFirst.equals(ipPrefixNext)) + { + return true; + } + else + { + return false; + } + } + + public List GSrv6Compress( List SegmentList,boolean IsSid) + { + List SidListSrc =null; + List GSidList = Lists.newArrayList(); + List SingleSegment =null; + List SingleCompressSegment =null; + Ip6Address CompressSidStart =null; + Ip6Address CompressSidNext =null; + int CommonPrefixLength =0; + int GSIDLength=0; + int ArgLength=0; + int Index =0; + + /*Unified conversion to Sid information that needs to be compressed*/ + if (IsSid) + { + SidListSrc = SegmentList; + } + else + { + SidListSrc = Lists.newArrayList(); + for (int i=0;i