@Override public String toString() { return toStringHelper(getClass()) .add("hardwareType", Short.toString(hardwareType)) .add("protocolType", Short.toString(protocolType)) .add("hardwareAddressLength", Byte.toString(hardwareAddressLength)) .add("protocolAddressLength", Byte.toString(protocolAddressLength)) .add("opCode", Short.toString(opCode)) .add("senderHardwareAddress", MacAddress.valueOf(senderHardwareAddress)) .add("senderProtocolAddress", Ip4Address.valueOf(senderProtocolAddress)) .add("targetHardwareAddress", MacAddress.valueOf(targetHardwareAddress)) .add("targetProtocolAddress", Ip4Address.valueOf(targetProtocolAddress)) .toString(); }
/** * Converts a CIDR (slash) notation string (e.g., "10.1.0.0/16") into an IPv4 prefix. * * @param address an IP prefix in string form (e.g., "10.1.0.0/16") * @return an IPv4 prefix * @throws IllegalArgumentException if the arguments are invalid */ public static Ip4Prefix valueOf(String address) { final String[] parts = address.split("/"); if (parts.length != 2) { String msg = "Malformed IPv4 prefix string: " + address + "." + "Address must take form \"x.x.x.x/y\""; throw new IllegalArgumentException(msg); } Ip4Address ipAddress = Ip4Address.valueOf(parts[0]); int prefixLength = Integer.parseInt(parts[1]); return new Ip4Prefix(ipAddress, prefixLength); }
/** * Builds an ARP reply based on a request. * * @param srcIp the IP address to use as the reply source * @param srcMac the MAC address to use as the reply source * @param request the ARP request we got * @return an Ethernet frame containing the ARP reply */ public static Ethernet buildArpReply(Ip4Address srcIp, MacAddress srcMac, Ethernet request) { Ethernet eth = new Ethernet(); eth.setDestinationMACAddress(request.getSourceMAC()); eth.setSourceMACAddress(srcMac); eth.setEtherType(Ethernet.TYPE_ARP); eth.setVlanID(request.getVlanID()); ARP arp = new ARP(); arp.setOpCode(ARP.OP_REPLY); arp.setProtocolType(ARP.PROTO_TYPE_IP); arp.setHardwareType(ARP.HW_TYPE_ETHERNET); arp.setProtocolAddressLength((byte) Ip4Address.BYTE_LENGTH); arp.setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH); arp.setSenderHardwareAddress(srcMac.toBytes()); arp.setTargetHardwareAddress(request.getSourceMACAddress()); arp.setTargetProtocolAddress(((ARP) request.getPayload()).getSenderProtocolAddress()); arp.setSenderProtocolAddress(srcIp.toInt()); eth.setPayload(arp); return eth; }
/** * Converts a byte array and a prefix length into an IPv4 prefix. * * @param address the IPv4 address value stored in network byte order * @param prefixLength the prefix length * @return an IPv4 prefix * @throws IllegalArgumentException if the prefix length value is invalid */ public static Ip4Prefix valueOf(byte[] address, int prefixLength) { return new Ip4Prefix(Ip4Address.valueOf(address), prefixLength); }