/** * Construct from address and network mask. * * @param address address * @param networkMask network mask */ private IPv6Network(IPv6Address address, IPv6NetworkMask networkMask) { super(address.maskWithNetworkMask(networkMask), address.maximumAddressWithNetworkMask(networkMask)); this.address = address.maskWithNetworkMask(networkMask); this.networkMask = networkMask; }
/** * Construct from address and network mask. * * @param address address * @param networkMask network mask */ private IPv6Network(IPv6Address address, IPv6NetworkMask networkMask) { super(address.maskWithNetworkMask(networkMask), address.maximumAddressWithNetworkMask(networkMask)); this.address = address.maskWithNetworkMask(networkMask); this.networkMask = networkMask; }
private Ipv6Address parseSrv6SidAddress(final String locatorIp, final String locatorLength, final Long opcode) { com.googlecode.ipv6.IPv6Address ip = com.googlecode.ipv6.IPv6Address.fromString(locatorIp); IPv6NetworkMask mask = IPv6NetworkMask.fromPrefixLength(parseInt(locatorLength)); com.googlecode.ipv6.IPv6Address srv6Sid = ip.maskWithNetworkMask(mask); return new Ipv6Address(srv6Sid.add(opcode.intValue()).toString()); }
/** * Create an IPv6 network from the two addresses within the network. This will construct the smallest possible network ("longest prefix * length") which contains both addresses. * * @param one address one * @param two address two, should be bigger than address one * @return ipv6 network */ public static IPv6Network fromTwoAddresses(IPv6Address one, IPv6Address two) { final IPv6NetworkMask longestPrefixLength = IPv6NetworkMask.fromPrefixLength(IPv6NetworkHelpers.longestPrefixLength(one, two)); return new IPv6Network(one.maskWithNetworkMask(longestPrefixLength), longestPrefixLength); }
/** * Create an IPv6 network from the two addresses within the network. This will construct the smallest possible network ("longest prefix * length") which contains both addresses. * * @param one address one * @param two address two, should be bigger than address one * @return ipv6 network */ public static IPv6Network fromTwoAddresses(IPv6Address one, IPv6Address two) { final IPv6NetworkMask longestPrefixLength = IPv6NetworkMask.fromPrefixLength(IPv6NetworkHelpers.longestPrefixLength(one, two)); return new IPv6Network(one.maskWithNetworkMask(longestPrefixLength), longestPrefixLength); }
Ipv6Address resolveSidAddress(@Nonnull final Prefix locPrefix, @Nonnull Sid localSid) { com.googlecode.ipv6.IPv6Address ip = com.googlecode.ipv6.IPv6Address.fromString(locPrefix.getAddress().getValue()); IPv6NetworkMask mask = IPv6NetworkMask.fromPrefixLength(locPrefix.getLength().getValue()); // strip function part if present ip = ip.maskWithNetworkMask(mask); //add new function part based on opcode String locIp = ip.add(localSid.getOpcode().getValue().intValue()).toString(); return new Ipv6Address(locIp); }
/** * Extracts Operational code (SRv6 endpoint function) from provided SID value. SID value consists of two parts. * First part is Locator defined by its IPv6 address and length (stored in mappingContext referenced * by locator name). Second part is Operational code (endpoint function). Locator length(number of bits) divides SID * address to bits used for locator value and bits used for endpoint function. * * @see <a href="https://tools.ietf.org/html/draft-filsfils-spring-srv6-network-programming-04"> * SRv6 network programming (SRv6 Segment)</a> * @see <a href="https://tools.ietf.org/html/draft-raza-spring-srv6-yang-01"> * * SRv6 Yang (SRv6 Types)</a> * * @param sid provided SRv6 SIDs IPv6 address * @param mappingContext mapping context which stores mapping for locator length * @param locName locator name used as a key to retrieve locator length from mapping context * @return operational code (endpoint function) of SRv6 SID address */ private Srv6FuncOpcodeUnreserved extractOpCode(Ipv6Address sid, MappingContext mappingContext, final String locName) { int locLength = LocatorContextManager.parseLength(locatorContext.getLocator(locName, mappingContext)); com.googlecode.ipv6.IPv6Address ip = com.googlecode.ipv6.IPv6Address.fromString(sid.getValue()); IPv6NetworkMask mask = IPv6NetworkMask.fromPrefixLength(locLength); com.googlecode.ipv6.IPv6Address locator = ip.maskWithNetworkMask(mask); long function = ip.toBigInteger().subtract(locator.toBigInteger()).longValue(); return new Srv6FuncOpcodeUnreserved(function); }
private Ipv6Address extractLocator(Ipv6Address sid, final MappingContext mappingContext, String locName) { /* * TODO(HC2VPP-353): VPP does not support locator length, therefore it is necessary to use default value for * locator length, if there is no other way of getting the value (e.g. hc2vpp starts with configuration already * present in VPP). * */ int locLength = locName == null ? DEFAULT_LOCATOR_LENGTH : LocatorContextManager.parseLength(locatorCtx.getLocator(locName, mappingContext)); com.googlecode.ipv6.IPv6Address ip = com.googlecode.ipv6.IPv6Address.fromString(sid.getValue()); IPv6NetworkMask mask = IPv6NetworkMask.fromPrefixLength(locLength); // strip function part if present ip = ip.maskWithNetworkMask(mask); return new Ipv6AddressNoZone(ip.toString()); }