/* * Copyright 2014-present 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.util.Identifier; /** * Representation of a VLAN identifier. */ public final class VlanId extends Identifier<Short> { // Based on convention used elsewhere? Check and change if needed public static final short UNTAGGED = (short) 0xffff; // In a traffic selector, this means that a VLAN ID must be present, but // can have any value. We use the same value as OpenFlow, but this is not // required. public static final short ANY_VALUE = (short) 0x1000; public static final short NO_VID = 0; // 0 is not used for VLAN ID public static final short RESERVED = 4095; // represents all tagged traffic public static final VlanId NONE = VlanId.vlanId(UNTAGGED); public static final VlanId ANY = VlanId.vlanId(ANY_VALUE); private static final String STRING_NONE = "None"; private static final String STRING_NUMERIC_NONE = "-1"; private static final String STRING_ANY = "Any"; // A VLAN ID is actually 12 bits of a VLAN tag. public static final short MAX_VLAN = 4095; // Constructor for serialization. private VlanId() { super(UNTAGGED); } // Creates a VLAN identifier for the specified VLAN number. private VlanId(short value) { super(value); } /** * Creates a VLAN identifier for untagged VLAN. * * @return VLAN identifier */ public static VlanId vlanId() { return new VlanId(UNTAGGED); } /** * Creates a VLAN identifier using the supplied VLAN identifier. * * @param value VLAN identifier expressed as short * @return VLAN identifier */ public static VlanId vlanId(short value) { if (value == UNTAGGED) { return new VlanId(); } if (value == ANY_VALUE) { return new VlanId(ANY_VALUE); } if (value > MAX_VLAN) { throw new IllegalArgumentException( "value exceeds allowed maximum VLAN ID value (4095)"); } return new VlanId(value); } /** * Creates a VLAN identifier Object using the supplied VLAN identifier. * * @param value VLAN identifier expressed as string * @return VLAN identifier */ public static VlanId vlanId(String value) { if (value.equals(STRING_NONE) || value.equals(STRING_NUMERIC_NONE)) { return new VlanId(); } if (value.equals(STRING_ANY)) { return new VlanId(ANY_VALUE); } try { return VlanId.vlanId(Short.parseShort(value)); } catch (NumberFormatException e) { throw new IllegalArgumentException(e); } } /** * Returns the backing VLAN number. * * @return VLAN number */ public short toShort() { return this.identifier; } @Override public String toString() { if (this.identifier == ANY_VALUE) { return "Any"; } if (this.identifier == UNTAGGED) { return "None"; } return String.valueOf(this.identifier); } }