| /* |
| * Copyright 2016-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.onosproject.isis.io.isispacket.pdu; |
| |
| import com.google.common.base.MoreObjects; |
| import com.google.common.base.Objects; |
| import com.google.common.primitives.Bytes; |
| import org.jboss.netty.buffer.ChannelBuffer; |
| import org.onosproject.isis.io.isispacket.IsisHeader; |
| import org.onosproject.isis.io.isispacket.tlv.IsisTlv; |
| import org.onosproject.isis.io.isispacket.tlv.TlvFinder; |
| import org.onosproject.isis.io.isispacket.tlv.TlvHeader; |
| import org.onosproject.isis.io.isispacket.tlv.TlvType; |
| import org.onosproject.isis.io.isispacket.tlv.TlvsToBytes; |
| import org.onosproject.isis.io.util.IsisUtil; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * Representation of L1L2 hello PDU. |
| */ |
| public class L1L2HelloPdu extends HelloPdu { |
| |
| /* |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Intra-domain Routing Protocol Discriminator | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Length Indicator | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Version/Protocol ID Extension | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | ID Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | R | R | R | PDU Type | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Version | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Reserved | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Maximum area address | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Circuit Type | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Source ID | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Holding Time | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | PDU Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | PDU Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | R | Priority | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | LAN ID | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Variable Lengths Fields | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Hello Message Format |
| REFERENCE : ISO/IECĀ 10589 |
| */ |
| |
| private byte priority; |
| private String lanId; |
| |
| /** |
| * Parametrized constructor. |
| * |
| * @param isisHeader ISIs header |
| */ |
| public L1L2HelloPdu(IsisHeader isisHeader) { |
| populateHeader(isisHeader); |
| } |
| |
| /** |
| * Returns the LAN ID. |
| * |
| * @return LAN ID |
| */ |
| |
| public String lanId() { |
| return lanId; |
| } |
| |
| /** |
| * Sets the LAN ID. |
| * |
| * @param lanId LAN ID |
| */ |
| public void setLanId(String lanId) { |
| this.lanId = lanId; |
| } |
| |
| /** |
| * Returns the priority. |
| * |
| * @return priority |
| */ |
| public byte priority() { |
| return priority; |
| } |
| |
| /** |
| * Sets priority. |
| * |
| * @param priority priority |
| */ |
| public void setPriority(byte priority) { |
| this.priority = priority; |
| } |
| |
| @Override |
| public void readFrom(ChannelBuffer channelBuffer) { |
| this.setCircuitType(channelBuffer.readByte()); |
| //sorce id |
| byte[] tempByteArray = new byte[IsisUtil.ID_SIX_BYTES]; |
| channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_SIX_BYTES); |
| this.setSourceId(IsisUtil.systemId(tempByteArray)); |
| this.setHoldingTime(channelBuffer.readUnsignedShort()); |
| this.setPduLength(channelBuffer.readUnsignedShort()); |
| this.setPriority(channelBuffer.readByte()); |
| //landid id + 1 value |
| tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE]; |
| channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE); |
| this.setLanId(IsisUtil.systemIdPlus(tempByteArray)); |
| //tlv here |
| while (channelBuffer.readableBytes() > 0) { |
| TlvHeader tlvHeader = new TlvHeader(); |
| tlvHeader.setTlvType(channelBuffer.readUnsignedByte()); |
| tlvHeader.setTlvLength(channelBuffer.readUnsignedByte()); |
| TlvType tlvType = TlvType.get(tlvHeader.tlvType()); |
| if (tlvType != null) { |
| IsisTlv tlv = TlvFinder.findTlv(tlvHeader, channelBuffer.readBytes(tlvHeader.tlvLength())); |
| if (tlv != null) { |
| this.variableLengths.add(tlv); |
| } |
| } else { |
| channelBuffer.readBytes(tlvHeader.tlvLength()); |
| } |
| } |
| } |
| |
| @Override |
| public byte[] asBytes() { |
| byte[] helloMessage = null; |
| byte[] helloHeader = l1l2IsisPduHeader(); |
| byte[] helloBody = l1l2HelloPduBody(); |
| helloMessage = Bytes.concat(helloHeader, helloBody); |
| return helloMessage; |
| } |
| |
| /** |
| * Parse the ISIS L1L2 PDU header. |
| * |
| * @return ISIS L1L2 PDU header |
| */ |
| public byte[] l1l2IsisPduHeader() { |
| List<Byte> headerLst = new ArrayList<>(); |
| headerLst.add(this.irpDiscriminator()); |
| headerLst.add((byte) IsisUtil.getPduHeaderLength(this.pduType())); |
| headerLst.add(this.version()); |
| headerLst.add(this.idLength()); |
| headerLst.add((byte) this.pduType()); |
| headerLst.add(this.version2()); |
| headerLst.add(this.reserved()); |
| headerLst.add(this.maximumAreaAddresses()); |
| return Bytes.toArray(headerLst); |
| } |
| |
| /** |
| * Parse the ISIS L1L2 PDU body. |
| * |
| * @return ISIS L1L2 PDU body |
| */ |
| public byte[] l1l2HelloPduBody() { |
| List<Byte> bodyLst = new ArrayList<>(); |
| |
| bodyLst.add(this.circuitType()); |
| bodyLst.addAll(IsisUtil.sourceAndLanIdToBytes(this.sourceId())); |
| bodyLst.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.holdingTime()))); |
| bodyLst.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.pduLength()))); |
| bodyLst.add(this.priority); |
| bodyLst.addAll(IsisUtil.sourceAndLanIdToBytes(this.lanId())); |
| for (IsisTlv isisTlv : variableLengths) { |
| bodyLst.addAll(TlvsToBytes.tlvToBytes(isisTlv)); |
| } |
| return Bytes.toArray(bodyLst); |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .omitNullValues() |
| .add("priority", priority) |
| .add("lanId", lanId) |
| .toString(); |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| if (this == o) { |
| return true; |
| } |
| if (o == null || getClass() != o.getClass()) { |
| return false; |
| } |
| L1L2HelloPdu that = (L1L2HelloPdu) o; |
| return Objects.equal(priority, that.priority) && |
| Objects.equal(lanId, that.lanId); |
| } |
| |
| @Override |
| public int hashCode() { |
| return Objects.hashCode(priority, lanId); |
| } |
| } |