|
| 1 | +package uk.ipfreely.sets; |
| 2 | + |
| 3 | +import uk.ipfreely.Addr; |
| 4 | +import uk.ipfreely.Family; |
| 5 | + |
| 6 | +import static java.util.Objects.requireNonNull; |
| 7 | +import static uk.ipfreely.sets.AddressSets.parseCidr; |
| 8 | + |
| 9 | +/** |
| 10 | + * Select IANA special purpose address sets. |
| 11 | + * <p> |
| 12 | + * See |
| 13 | + * <a href="https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xml" |
| 14 | + * >IPv4 Special-Purpose Address Space</a> |
| 15 | + * and |
| 16 | + * <a href="https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xml" |
| 17 | + * >IPv6 Special-Purpose Address Space</a>. |
| 18 | + * </p> |
| 19 | + */ |
| 20 | +public final class SpecialPurpose { |
| 21 | + private SpecialPurpose() {} |
| 22 | + |
| 23 | + // TODO: singletons |
| 24 | + |
| 25 | + /** |
| 26 | + * Loopback addresses. |
| 27 | + * Includes the localhost address. |
| 28 | + * |
| 29 | + * @param f IP family |
| 30 | + * @return loopback addresses |
| 31 | + * @param <A> address family |
| 32 | + */ |
| 33 | + public static <A extends Addr<A>> AddressSet<A> loopback(Family<A> f) { |
| 34 | + var expr = (requireNonNull(f) == Family.v4()) ? "127.0.0.0/8" : "::1/128"; |
| 35 | + return parseCidr(f, expr); |
| 36 | + } |
| 37 | + |
| 38 | + /** |
| 39 | + * Addresses reserved for private networks. |
| 40 | + * |
| 41 | + * @param f IP family |
| 42 | + * @param inUse set to true to only return currently allocated ranges |
| 43 | + * @return private use addresses |
| 44 | + * @param <A> address family |
| 45 | + */ |
| 46 | + public static <A extends Addr<A>> AddressSet<A> localUse(Family<A> f, boolean inUse) { |
| 47 | + if (requireNonNull(f) == Family.v4()) { |
| 48 | + var ten = parseCidr(f, "10.0.0.0/8"); |
| 49 | + var oneSevenTwo = parseCidr(f, "172.16.0.0/12"); |
| 50 | + var oneNineTwo = parseCidr(f, "192.168.0.0/16"); |
| 51 | + return AddressSets.of(ten, oneSevenTwo, oneNineTwo); |
| 52 | + } |
| 53 | + if (inUse) { |
| 54 | + return parseCidr(f, "FD00::/8"); |
| 55 | + } |
| 56 | + return parseCidr(f, "FC00::/7"); |
| 57 | + } |
| 58 | + |
| 59 | + /** |
| 60 | + * Link-local addresses for use in subnets. |
| 61 | + * |
| 62 | + * @param f IP family |
| 63 | + * @return link-local addresses |
| 64 | + * @param <A> address family |
| 65 | + */ |
| 66 | + public static <A extends Addr<A>> AddressSet<A> linkLocal(Family<A> f) { |
| 67 | + var expr = (requireNonNull(f) == Family.v4()) ? "169.254.0.0/16" : "fe80::/10"; |
| 68 | + return parseCidr(f, expr); |
| 69 | + } |
| 70 | + |
| 71 | + /** |
| 72 | + * Addresses reserved for documentation. |
| 73 | + * |
| 74 | + * @param f IP family |
| 75 | + * @return documentation addresses |
| 76 | + * @param <A> address family |
| 77 | + */ |
| 78 | + public static <A extends Addr<A>> AddressSet<A> documentation(Family<A> f) { |
| 79 | + if (requireNonNull(f) == Family.v4()) { |
| 80 | + var oneNineTwo = parseCidr(f, "192.0.2.0/24"); |
| 81 | + var oneNineEight = parseCidr(f, "198.51.100.0/24"); |
| 82 | + var twoOhThree = parseCidr(f, "203.0.113.0/24"); |
| 83 | + return AddressSets.of(oneNineTwo, oneNineEight, twoOhThree); |
| 84 | + } |
| 85 | + var twoThouOne = parseCidr(f, "2001:db8::/32"); |
| 86 | + var threeFs = parseCidr(f, "3fff::/20"); |
| 87 | + return AddressSets.of(twoThouOne, threeFs); |
| 88 | + } |
| 89 | +} |
0 commit comments