package net.juniper.contrail.sandesh; public class IpAddressUtil { public static final int INADDR4SZ = 4; public static final int INADDR6SZ = 16; public static long getIpv4Address(String sAddr) throws IllegalArgumentException { if (sAddr == null) { return 0; } String[] addr = sAddr.split("\\.", INADDR4SZ + 1); if (addr.length != INADDR4SZ) { throw new IllegalArgumentException("Malformed IPv4 address"); } long result = 0; for (int i = addr.length - 1; i >= 0; i--) { int part = Integer.parseInt(addr[i]); if (part < 0 || part > 255 ) { throw new IllegalArgumentException("Malformed IPv4 address"); } result |= part << (8* (addr.length - 1 - i)); } return result & 0xFFFFFFFFL; } public static int compareV4(String sAddr1, String sAddr2) throws IllegalArgumentException { long addr1 = getIpv4Address(sAddr1); long addr2 = getIpv4Address(sAddr2); return compareV4(addr1, addr2); } public static int compareV4(long addr1, long addr2) throws IllegalArgumentException { if (addr1 < addr2) { return -1; } if (addr1 > addr2) { return 1; } return 0; } public static int[] getIpv6Address(String sAddr) throws IllegalArgumentException { int[] result = new int[INADDR6SZ]; if (sAddr == null) { return result; } String[] addr = sAddr.split(":", INADDR6SZ + 1); for (int i = addr.length - 1; i >= 0; i--) { if (addr[i].trim().equals("")) { continue; } int part = Integer.parseInt(addr[i], 16); if (part < 0 || part > 0xFF ) { throw new IllegalArgumentException("Malformed IPv6 address"); } result[INADDR6SZ - 1 - (addr.length - 1 - i)] = part; } return result; } public static int compareV6(String sAddr1, String sAddr2) throws IllegalArgumentException { int[] addr1 = getIpv6Address(sAddr1); int[] addr2 = getIpv6Address(sAddr2); return compareV6(addr1, addr2); } public static int compareV6(int[] addr1, int[] addr2) throws IllegalArgumentException { if (addr1.length != INADDR6SZ || addr2.length != INADDR6SZ) { throw new IllegalArgumentException(); } for (int i = 0; i < INADDR6SZ; i++) { if ((addr1[i] & 0xFF) < (addr2[i] & 0xFF)) { return -1; } if ((addr1[i] & 0xFF) > ( addr2[i] & 0xFF)) { return 1; } } return 0; } public static int compare(String sAddr1, String sAddr2) throws IllegalArgumentException { if (sAddr1 == null && sAddr2 == null) { return 0; } boolean addr1IpV6 = false, addr2IpV6 = false; long addr1 = 0, addr2 = 0; int[] addr1v6 = null, addr2v6 = null; if (sAddr1 != null) { if (sAddr1.indexOf(':') != -1) { addr1IpV6 = true; addr1v6 = getIpv6Address(sAddr1); } else { addr1 = getIpv4Address(sAddr1); } } if (sAddr2 != null) { if (sAddr2.indexOf(':') != -1) { addr2IpV6 = true; addr2v6 = getIpv6Address(sAddr2); } else { addr2 = getIpv4Address(sAddr2); } } if ((sAddr1 != null && sAddr2 == null) || (!addr1IpV6 && addr2IpV6)) { return -1; } if ((sAddr1 == null && sAddr2 != null) || ((addr1IpV6 && !addr2IpV6))) { return 1; } int cmp = 0; if (!addr1IpV6 && !addr2IpV6) { cmp = compareV4(addr1, addr2); } else { cmp = compareV6(addr1v6, addr2v6); } return cmp; } }