| /* |
| * Copyright 2016-present Open Networking Foundation |
| * |
| * 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.ospf.protocol.lsa; |
| |
| import com.google.common.base.MoreObjects; |
| import com.google.common.base.Objects; |
| import com.google.common.primitives.Bytes; |
| import org.onosproject.ospf.protocol.util.OspfUtil; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * Defines the Opaque LSA header, fields and the methods to access them. |
| */ |
| public class OpaqueLsaHeader extends LsaHeader { |
| /* |
| 0 1 2 3 |
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | LS age | Options | 9, 10, or 11 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Opaque Type | Opaque ID | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Advertising Router | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | LS Sequence Number | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | LS checksum | Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Opaque LSA header format |
| REFERENCE : RFC 5250 |
| */ |
| private int opaqueId; |
| private int opaqueType; |
| |
| /** |
| * Populates the header from the lsaHeader instance. |
| * |
| * @param lsaHeader lsa header instance. |
| */ |
| public void populateHeader(OpaqueLsaHeader lsaHeader) { |
| //assign all the header values |
| this.setAge(lsaHeader.age()); |
| this.setOptions(lsaHeader.options()); |
| this.setLsType(lsaHeader.lsType()); |
| this.setLinkStateId(lsaHeader.linkStateId()); |
| this.setAdvertisingRouter(lsaHeader.advertisingRouter()); |
| this.setLsSequenceNo(lsaHeader.lsSequenceNo()); |
| this.setLsCheckSum(lsaHeader.lsCheckSum()); |
| this.setLsPacketLen(lsaHeader.lsPacketLen()); |
| this.setOpaqueId(lsaHeader.opaqueId()); |
| this.setOpaqueType(lsaHeader.opaqueType()); |
| } |
| |
| /** |
| * Gets the opaque id. |
| * |
| * @return opaque id |
| */ |
| public int opaqueId() { |
| return opaqueId; |
| } |
| |
| /** |
| * Sets the opaque id. |
| * |
| * @param opaqueId opaque id |
| */ |
| public void setOpaqueId(int opaqueId) { |
| this.opaqueId = opaqueId; |
| } |
| |
| /** |
| * Gets opaque type. |
| * |
| * @return opaque type |
| */ |
| public int opaqueType() { |
| return opaqueType; |
| } |
| |
| /** |
| * Sets opaque type. |
| * |
| * @param opaqueType opaque type |
| */ |
| public void setOpaqueType(int opaqueType) { |
| this.opaqueType = opaqueType; |
| } |
| |
| /** |
| * Gets header as byte array. |
| * |
| * @return header as byte array |
| */ |
| public byte[] getOpaqueLsaHeaderAsByteArray() { |
| List<Byte> headerLst = new ArrayList<>(); |
| try { |
| headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.age()))); |
| headerLst.add((byte) this.options()); |
| headerLst.add((byte) this.lsType()); |
| headerLst.add((byte) this.opaqueType()); |
| headerLst.addAll(Bytes.asList(OspfUtil.convertToThreeBytes(this.opaqueId()))); |
| headerLst.addAll(Bytes.asList(this.advertisingRouter().toOctets())); |
| headerLst.addAll(Bytes.asList(OspfUtil.convertToFourBytes(this.lsSequenceNo()))); |
| headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.lsCheckSum()))); |
| headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.lsPacketLen()))); |
| } catch (Exception e) { |
| log.debug("Error::getLsaHeaderAsByteArray {}", e.getMessage()); |
| return Bytes.toArray(headerLst); |
| } |
| return Bytes.toArray(headerLst); |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| if (this == o) { |
| return true; |
| } |
| if (o == null || getClass() != o.getClass()) { |
| return false; |
| } |
| OpaqueLsaHeader that = (OpaqueLsaHeader) o; |
| return Objects.equal(opaqueId, that.opaqueId) && |
| Objects.equal(opaqueType, that.opaqueType) && |
| Objects.equal(age(), that.age()) && |
| Objects.equal(options(), that.options()) && |
| Objects.equal(lsType(), that.lsType()) && |
| Objects.equal(lsSequenceNo(), that.lsSequenceNo()) && |
| Objects.equal(lsCheckSum(), that.lsCheckSum()) && |
| Objects.equal(lsPacketLen(), that.lsPacketLen()) && |
| Objects.equal(linkStateId(), that.linkStateId()) && |
| Objects.equal(advertisingRouter(), that.advertisingRouter()); |
| } |
| |
| @Override |
| public int hashCode() { |
| return Objects.hashCode(opaqueId, opaqueType); |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .omitNullValues() |
| .add("opaqueId", this.opaqueId) |
| .add("opaqueType", opaqueType) |
| .toString(); |
| } |
| } |