diff options
Diffstat (limited to 'framework/src/onos/utils/misc/src/main/java/org/onlab/packet/Ethernet.java')
-rw-r--r-- | framework/src/onos/utils/misc/src/main/java/org/onlab/packet/Ethernet.java | 718 |
1 files changed, 0 insertions, 718 deletions
diff --git a/framework/src/onos/utils/misc/src/main/java/org/onlab/packet/Ethernet.java b/framework/src/onos/utils/misc/src/main/java/org/onlab/packet/Ethernet.java deleted file mode 100644 index 9ab5cab1..00000000 --- a/framework/src/onos/utils/misc/src/main/java/org/onlab/packet/Ethernet.java +++ /dev/null @@ -1,718 +0,0 @@ -/* - * Copyright 2014-2015 Open Networking Laboratory - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -package org.onlab.packet; - -import org.onlab.packet.ndp.NeighborAdvertisement; -import org.onlab.packet.ndp.NeighborSolicitation; -import org.onlab.packet.ndp.Redirect; -import org.onlab.packet.ndp.RouterAdvertisement; -import org.onlab.packet.ndp.RouterSolicitation; - -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import static com.google.common.base.Preconditions.checkNotNull; -import static org.onlab.packet.PacketUtils.checkHeaderLength; -import static org.onlab.packet.PacketUtils.checkInput; - -/** - * - */ -public class Ethernet extends BasePacket { - private static final String HEXES = "0123456789ABCDEF"; - - public static final short TYPE_ARP = EthType.EtherType.ARP.ethType().toShort(); - public static final short TYPE_RARP = EthType.EtherType.RARP.ethType().toShort(); - public static final short TYPE_IPV4 = EthType.EtherType.IPV4.ethType().toShort(); - public static final short TYPE_IPV6 = EthType.EtherType.IPV6.ethType().toShort(); - public static final short TYPE_LLDP = EthType.EtherType.LLDP.ethType().toShort(); - public static final short TYPE_VLAN = EthType.EtherType.VLAN.ethType().toShort(); - public static final short TYPE_BSN = EthType.EtherType.BDDP.ethType().toShort(); - - public static final short MPLS_UNICAST = EthType.EtherType.MPLS_UNICAST.ethType().toShort();; - public static final short MPLS_MULTICAST = EthType.EtherType.MPLS_MULTICAST.ethType().toShort(); - - - public static final short VLAN_UNTAGGED = (short) 0xffff; - - public static final short ETHERNET_HEADER_LENGTH = 14; // bytes - public static final short VLAN_HEADER_LENGTH = 4; // bytes - - public static final short DATALAYER_ADDRESS_LENGTH = 6; // bytes - - private static final Map<Short, Deserializer<? extends IPacket>> ETHERTYPE_DESERIALIZER_MAP = - new HashMap<>(); - - static { - for (EthType.EtherType ethType : EthType.EtherType.values()) { - if (ethType.deserializer() != null) { - ETHERTYPE_DESERIALIZER_MAP.put(ethType.ethType().toShort(), ethType.deserializer()); - } - } - } - - protected MacAddress destinationMACAddress; - protected MacAddress sourceMACAddress; - protected byte priorityCode; - protected short vlanID; - protected short etherType; - protected boolean pad = false; - - /** - * By default, set Ethernet to untagged. - */ - public Ethernet() { - super(); - this.vlanID = Ethernet.VLAN_UNTAGGED; - } - - /** - * Gets the destination MAC address. - * - * @return the destination MAC as a byte array - */ - public byte[] getDestinationMACAddress() { - return this.destinationMACAddress.toBytes(); - } - - /** - * Gets the destination MAC address. - * - * @return the destination MAC - */ - public MacAddress getDestinationMAC() { - return this.destinationMACAddress; - } - - /** - * Sets the destination MAC address. - * - * @param destMac the destination MAC to set - * @return the Ethernet frame - */ - public Ethernet setDestinationMACAddress(final MacAddress destMac) { - this.destinationMACAddress = checkNotNull(destMac); - return this; - } - - /** - * Sets the destination MAC address. - * - * @param destMac the destination MAC to set - * @return the Ethernet frame - */ - public Ethernet setDestinationMACAddress(final byte[] destMac) { - this.destinationMACAddress = MacAddress.valueOf(destMac); - return this; - } - - /** - * Sets the destination MAC address. - * - * @param destMac the destination MAC to set - * @return the Ethernet frame - */ - public Ethernet setDestinationMACAddress(final String destMac) { - this.destinationMACAddress = MacAddress.valueOf(destMac); - return this; - } - - /** - * Gets the source MAC address. - * - * @return the source MACAddress as a byte array - */ - public byte[] getSourceMACAddress() { - return this.sourceMACAddress.toBytes(); - } - - /** - * Gets the source MAC address. - * - * @return the source MACAddress - */ - public MacAddress getSourceMAC() { - return this.sourceMACAddress; - } - - /** - * Sets the source MAC address. - * - * @param sourceMac the source MAC to set - * @return the Ethernet frame - */ - public Ethernet setSourceMACAddress(final MacAddress sourceMac) { - this.sourceMACAddress = checkNotNull(sourceMac); - return this; - } - - /** - * Sets the source MAC address. - * - * @param sourceMac the source MAC to set - * @return the Ethernet frame - */ - public Ethernet setSourceMACAddress(final byte[] sourceMac) { - this.sourceMACAddress = MacAddress.valueOf(sourceMac); - return this; - } - - /** - * Sets the source MAC address. - * - * @param sourceMac the source MAC to set - * @return the Ethernet frame - */ - public Ethernet setSourceMACAddress(final String sourceMac) { - this.sourceMACAddress = MacAddress.valueOf(sourceMac); - return this; - } - - /** - * Gets the priority code. - * - * @return the priorityCode - */ - public byte getPriorityCode() { - return this.priorityCode; - } - - /** - * Sets the priority code. - * - * @param priority the priorityCode to set - * @return the Ethernet frame - */ - public Ethernet setPriorityCode(final byte priority) { - this.priorityCode = priority; - return this; - } - - /** - * Gets the VLAN ID. - * - * @return the vlanID - */ - public short getVlanID() { - return this.vlanID; - } - - /** - * Sets the VLAN ID. - * - * @param vlan the vlanID to set - * @return the Ethernet frame - */ - public Ethernet setVlanID(final short vlan) { - this.vlanID = vlan; - return this; - } - - /** - * Gets the Ethernet type. - * - * @return the etherType - */ - public short getEtherType() { - return this.etherType; - } - - /** - * Sets the Ethernet type. - * - * @param ethType the etherType to set - * @return the Ethernet frame - */ - public Ethernet setEtherType(final short ethType) { - this.etherType = ethType; - return this; - } - - /** - * @return True if the Ethernet frame is broadcast, false otherwise - */ - public boolean isBroadcast() { - assert this.destinationMACAddress.length() == 6; - return this.destinationMACAddress.isBroadcast(); - } - - /** - * @return True is the Ethernet frame is multicast, False otherwise - */ - public boolean isMulticast() { - return this.destinationMACAddress.isMulticast(); - } - - /** - * Pad this packet to 60 bytes minimum, filling with zeros? - * - * @return the pad - */ - public boolean isPad() { - return this.pad; - } - - /** - * Pad this packet to 60 bytes minimum, filling with zeros? - * - * @param pd - * the pad to set - * @return this - */ - public Ethernet setPad(final boolean pd) { - this.pad = pd; - return this; - } - - @Override - public byte[] serialize() { - byte[] payloadData = null; - if (this.payload != null) { - this.payload.setParent(this); - payloadData = this.payload.serialize(); - } - int length = 14 + (this.vlanID == Ethernet.VLAN_UNTAGGED ? 0 : 4) - + (payloadData == null ? 0 : payloadData.length); - if (this.pad && length < 60) { - length = 60; - } - final byte[] data = new byte[length]; - final ByteBuffer bb = ByteBuffer.wrap(data); - bb.put(this.destinationMACAddress.toBytes()); - bb.put(this.sourceMACAddress.toBytes()); - if (this.vlanID != Ethernet.VLAN_UNTAGGED) { - bb.putShort(TYPE_VLAN); - bb.putShort((short) (this.priorityCode << 13 | this.vlanID & 0x0fff)); - } - bb.putShort(this.etherType); - if (payloadData != null) { - bb.put(payloadData); - } - if (this.pad) { - Arrays.fill(data, bb.position(), data.length, (byte) 0x0); - } - return data; - } - - @Override - public IPacket deserialize(final byte[] data, final int offset, - final int length) { - if (length <= 0) { - return null; - } - final ByteBuffer bb = ByteBuffer.wrap(data, offset, length); - if (this.destinationMACAddress == null) { - this.destinationMACAddress = MacAddress.valueOf(new byte[6]); - } - final byte[] dstAddr = new byte[MacAddress.MAC_ADDRESS_LENGTH]; - bb.get(dstAddr); - this.destinationMACAddress = MacAddress.valueOf(dstAddr); - - if (this.sourceMACAddress == null) { - this.sourceMACAddress = MacAddress.valueOf(new byte[6]); - } - final byte[] srcAddr = new byte[MacAddress.MAC_ADDRESS_LENGTH]; - bb.get(srcAddr); - this.sourceMACAddress = MacAddress.valueOf(srcAddr); - - short ethType = bb.getShort(); - if (ethType == TYPE_VLAN) { - final short tci = bb.getShort(); - this.priorityCode = (byte) (tci >> 13 & 0x07); - this.vlanID = (short) (tci & 0x0fff); - ethType = bb.getShort(); - } else { - this.vlanID = Ethernet.VLAN_UNTAGGED; - } - this.etherType = ethType; - - IPacket payload; - Deserializer<? extends IPacket> deserializer; - if (Ethernet.ETHERTYPE_DESERIALIZER_MAP.containsKey(ethType)) { - deserializer = Ethernet.ETHERTYPE_DESERIALIZER_MAP.get(ethType); - } else { - deserializer = Data.deserializer(); - } - try { - this.payload = deserializer.deserialize(data, bb.position(), - bb.limit() - bb.position()); - this.payload.setParent(this); - } catch (DeserializationException e) { - return this; - } - return this; - } - - /** - * Checks to see if a string is a valid MAC address. - * - * @param macAddress string to test if it is a valid MAC - * @return True if macAddress is a valid MAC, False otherwise - */ - public static boolean isMACAddress(final String macAddress) { - final String[] macBytes = macAddress.split(":"); - if (macBytes.length != 6) { - return false; - } - for (int i = 0; i < 6; ++i) { - if (Ethernet.HEXES.indexOf(macBytes[i].toUpperCase().charAt(0)) == -1 - || Ethernet.HEXES.indexOf(macBytes[i].toUpperCase().charAt( - 1)) == -1) { - return false; - } - } - return true; - } - - /** - * Accepts a MAC address of the form 00:aa:11:bb:22:cc, case does not - * matter, and returns a corresponding byte[]. - * - * @param macAddress - * The MAC address to convert into a byte array - * @return The macAddress as a byte array - */ - public static byte[] toMACAddress(final String macAddress) { - return MacAddress.valueOf(macAddress).toBytes(); - } - - /** - * Accepts a MAC address and returns the corresponding long, where the MAC - * bytes are set on the lower order bytes of the long. - * - * @param macAddress MAC address as a byte array - * @return a long containing the mac address bytes - */ - public static long toLong(final byte[] macAddress) { - return MacAddress.valueOf(macAddress).toLong(); - } - - /** - * Converts a long MAC address to a byte array. - * - * @param macAddress MAC address set on the lower order bytes of the long - * @return the bytes of the mac address - */ - public static byte[] toByteArray(final long macAddress) { - return MacAddress.valueOf(macAddress).toBytes(); - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - final int prime = 7867; - int result = super.hashCode(); - result = prime * result + this.destinationMACAddress.hashCode(); - result = prime * result + this.etherType; - result = prime * result + this.vlanID; - result = prime * result + this.priorityCode; - result = prime * result + (this.pad ? 1231 : 1237); - result = prime * result + this.sourceMACAddress.hashCode(); - return result; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (!super.equals(obj)) { - return false; - } - if (!(obj instanceof Ethernet)) { - return false; - } - final Ethernet other = (Ethernet) obj; - if (!this.destinationMACAddress.equals(other.destinationMACAddress)) { - return false; - } - if (this.priorityCode != other.priorityCode) { - return false; - } - if (this.vlanID != other.vlanID) { - return false; - } - if (this.etherType != other.etherType) { - return false; - } - if (this.pad != other.pad) { - return false; - } - if (!this.sourceMACAddress.equals(other.sourceMACAddress)) { - return false; - } - return true; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#toString(java.lang.Object) - */ - @Override - public String toString() { - - final StringBuffer sb = new StringBuffer("\n"); - - final IPacket pkt = this.getPayload(); - - if (pkt instanceof ARP) { - sb.append("arp"); - } else if (pkt instanceof LLDP) { - sb.append("lldp"); - } else if (pkt instanceof ICMP) { - sb.append("icmp"); - } else if (pkt instanceof IPv4) { - sb.append("ip"); - } else if (pkt instanceof DHCP) { - sb.append("dhcp"); - } else { - sb.append(this.getEtherType()); - } - - sb.append("\ndl_vlan: "); - if (this.getVlanID() == Ethernet.VLAN_UNTAGGED) { - sb.append("untagged"); - } else { - sb.append(this.getVlanID()); - } - sb.append("\ndl_vlan_pcp: "); - sb.append(this.getPriorityCode()); - sb.append("\ndl_src: "); - sb.append(bytesToHex(this.getSourceMACAddress())); - sb.append("\ndl_dst: "); - sb.append(bytesToHex(this.getDestinationMACAddress())); - - if (pkt instanceof ARP) { - final ARP p = (ARP) pkt; - sb.append("\nnw_src: "); - sb.append(IPv4.fromIPv4Address(IPv4.toIPv4Address(p - .getSenderProtocolAddress()))); - sb.append("\nnw_dst: "); - sb.append(IPv4.fromIPv4Address(IPv4.toIPv4Address(p - .getTargetProtocolAddress()))); - } else if (pkt instanceof LLDP) { - sb.append("lldp packet"); - } else if (pkt instanceof ICMP) { - final ICMP icmp = (ICMP) pkt; - sb.append("\nicmp_type: "); - sb.append(icmp.getIcmpType()); - sb.append("\nicmp_code: "); - sb.append(icmp.getIcmpCode()); - } else if (pkt instanceof IPv4) { - final IPv4 p = (IPv4) pkt; - sb.append("\nnw_src: "); - sb.append(IPv4.fromIPv4Address(p.getSourceAddress())); - sb.append("\nnw_dst: "); - sb.append(IPv4.fromIPv4Address(p.getDestinationAddress())); - sb.append("\nnw_tos: "); - sb.append(p.getDiffServ()); - sb.append("\nnw_proto: "); - sb.append(p.getProtocol()); - - IPacket payload = pkt.getPayload(); - if (payload != null) { - if (payload instanceof TCP) { - sb.append("\ntp_src: "); - sb.append(((TCP) payload).getSourcePort()); - sb.append("\ntp_dst: "); - sb.append(((TCP) payload).getDestinationPort()); - - } else if (payload instanceof UDP) { - sb.append("\ntp_src: "); - sb.append(((UDP) payload).getSourcePort()); - sb.append("\ntp_dst: "); - sb.append(((UDP) payload).getDestinationPort()); - } else if (payload instanceof ICMP) { - final ICMP icmp = (ICMP) payload; - sb.append("\nicmp_type: "); - sb.append(icmp.getIcmpType()); - sb.append("\nicmp_code: "); - sb.append(icmp.getIcmpCode()); - } - } - } else if (pkt instanceof IPv6) { - final IPv6 ipv6 = (IPv6) pkt; - sb.append("\nipv6_src: "); - sb.append(Ip6Address.valueOf(ipv6.getSourceAddress()).toString()); - sb.append("\nipv6_dst: "); - sb.append(Ip6Address.valueOf(ipv6.getDestinationAddress()).toString()); - sb.append("\nipv6_proto: "); - sb.append(ipv6.getNextHeader()); - - IPacket payload = pkt.getPayload(); - if (payload != null && payload instanceof ICMP6) { - final ICMP6 icmp6 = (ICMP6) payload; - sb.append("\nicmp6_type: "); - sb.append(icmp6.getIcmpType()); - sb.append("\nicmp6_code: "); - sb.append(icmp6.getIcmpCode()); - - payload = payload.getPayload(); - if (payload != null) { - if (payload instanceof NeighborSolicitation) { - final NeighborSolicitation ns = (NeighborSolicitation) payload; - sb.append("\nns_target_addr: "); - sb.append(Ip6Address.valueOf(ns.getTargetAddress()).toString()); - ns.getOptions().forEach(option -> { - sb.append("\noption_type: "); - sb.append(option.type()); - sb.append("\noption_data: "); - sb.append(bytesToHex(option.data())); - }); - } else if (payload instanceof NeighborAdvertisement) { - final NeighborAdvertisement na = (NeighborAdvertisement) payload; - sb.append("\nna_target_addr: "); - sb.append(Ip6Address.valueOf(na.getTargetAddress()).toString()); - sb.append("\nna_solicited_flag: "); - sb.append(na.getSolicitedFlag()); - sb.append("\nna_router_flag: "); - sb.append(na.getRouterFlag()); - sb.append("\nna_override_flag: "); - sb.append(na.getOverrideFlag()); - na.getOptions().forEach(option -> { - sb.append("\noption_type: "); - sb.append(option.type()); - sb.append("\noption_data: "); - sb.append(bytesToHex(option.data())); - }); - } else if (payload instanceof RouterSolicitation) { - final RouterSolicitation rs = (RouterSolicitation) payload; - sb.append("\nrs"); - rs.getOptions().forEach(option -> { - sb.append("\noption_type: "); - sb.append(option.type()); - sb.append("\noption_data: "); - sb.append(bytesToHex(option.data())); - }); - } else if (payload instanceof RouterAdvertisement) { - final RouterAdvertisement ra = (RouterAdvertisement) payload; - sb.append("\nra_hop_limit: "); - sb.append(ra.getCurrentHopLimit()); - sb.append("\nra_mflag: "); - sb.append(ra.getMFlag()); - sb.append("\nra_oflag: "); - sb.append(ra.getOFlag()); - sb.append("\nra_reachable_time: "); - sb.append(ra.getReachableTime()); - sb.append("\nra_retransmit_time: "); - sb.append(ra.getRetransmitTimer()); - sb.append("\nra_router_lifetime: "); - sb.append(ra.getRouterLifetime()); - ra.getOptions().forEach(option -> { - sb.append("\noption_type: "); - sb.append(option.type()); - sb.append("\noption_data: "); - sb.append(bytesToHex(option.data())); - }); - } else if (payload instanceof Redirect) { - final Redirect rd = (Redirect) payload; - sb.append("\nrd_target_addr: "); - sb.append(Ip6Address.valueOf(rd.getTargetAddress()).toString()); - rd.getOptions().forEach(option -> { - sb.append("\noption_type: "); - sb.append(option.type()); - sb.append("\noption_data: "); - sb.append(bytesToHex(option.data())); - }); - } - } - } - } else if (pkt instanceof DHCP) { - sb.append("\ndhcp packet"); - } else if (pkt instanceof Data) { - sb.append("\ndata packet"); - } else if (pkt instanceof LLC) { - sb.append("\nllc packet"); - } else { - sb.append("\nunknown packet"); - } - - return sb.toString(); - } - - public static String bytesToHex(byte[] in) { - final StringBuilder builder = new StringBuilder(); - for (byte b : in) { - builder.append(String.format("%02x", b)); - } - return builder.toString(); - } - - /** - * Deserializer function for Ethernet packets. - * - * @return deserializer function - */ - public static Deserializer<Ethernet> deserializer() { - return (data, offset, length) -> { - checkInput(data, offset, length, ETHERNET_HEADER_LENGTH); - - byte[] addressBuffer = new byte[DATALAYER_ADDRESS_LENGTH]; - - ByteBuffer bb = ByteBuffer.wrap(data, offset, length); - Ethernet eth = new Ethernet(); - // Read destination MAC address into buffer - bb.get(addressBuffer); - eth.setDestinationMACAddress(addressBuffer); - - // Read source MAC address into buffer - bb.get(addressBuffer); - eth.setSourceMACAddress(addressBuffer); - - short ethType = bb.getShort(); - if (ethType == TYPE_VLAN) { - checkHeaderLength(length, ETHERNET_HEADER_LENGTH + VLAN_HEADER_LENGTH); - final short tci = bb.getShort(); - eth.setPriorityCode((byte) (tci >> 13 & 0x07)); - eth.setVlanID((short) (tci & 0x0fff)); - ethType = bb.getShort(); - } else { - eth.setVlanID(Ethernet.VLAN_UNTAGGED); - } - eth.setEtherType(ethType); - - IPacket payload; - Deserializer<? extends IPacket> deserializer; - if (Ethernet.ETHERTYPE_DESERIALIZER_MAP.containsKey(ethType)) { - deserializer = Ethernet.ETHERTYPE_DESERIALIZER_MAP.get(ethType); - } else { - deserializer = Data.deserializer(); - } - payload = deserializer.deserialize(data, bb.position(), - bb.limit() - bb.position()); - payload.setParent(eth); - eth.setPayload(payload); - - return eth; - }; - } - -} |