Dhruv Dhody
Committed by Gerrit Code Review

ONOS-2739 - OSPF Basic Packet Structures , which includes encoding and decoding

Change-Id: Ifaaa4d3640c6a4fec4931db54a1f03100cc9d9e6
/*
* Copyright 2016 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.
*/
/**
* Implementation of the OSPF LSA Sub Types.
*/
package org.onosproject.ospf.protocol.lsa.subtypes;
\ No newline at end of file
/*
* Copyright 2016 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.ospf.protocol.lsa.types;
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.ospf.controller.OspfLsaType;
import org.onosproject.ospf.exceptions.OspfErrorType;
import org.onosproject.ospf.exceptions.OspfParseException;
import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
import org.onosproject.ospf.protocol.lsa.TlvHeader;
import org.onosproject.ospf.protocol.lsa.tlvtypes.LinkTlv;
import org.onosproject.ospf.protocol.lsa.tlvtypes.OpaqueTopLevelTlvTypes;
import org.onosproject.ospf.protocol.lsa.tlvtypes.RouterTlv;
import org.onosproject.ospf.protocol.util.OspfParameters;
import java.util.ArrayList;
import java.util.List;
/**
* Representation of an Opaque LSA of type area local (10).
*/
public class OpaqueLsa10 extends OpaqueLsaHeader {
/*
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 Information |
+ +
| ... |
Opaque LSA format
REFERENCE : RFC 5250
*/
private List<TopLevelTlv> topLevelValues = new ArrayList<>();
private byte[] opaqueInfo = null;
/**
* Creates an instance of Opaque type 10 LSA.
*
* @param lsaHeader LSA header instance
*/
public OpaqueLsa10(OpaqueLsaHeader lsaHeader) {
populateHeader(lsaHeader);
}
/**
* Returns the list of top level TLVs.
*
* @return list of top level TLVs
*/
public List<TopLevelTlv> topLevelValues() {
return topLevelValues;
}
/**
* Adds TLV value.
*
* @param value TLV value
*/
public void addValue(TopLevelTlv value) {
topLevelValues.add(value);
}
/**
* Reads from channel buffer and populate instance.
*
* @param channelBuffer channelBuffer instance
* @throws OspfParseException might throws exception while parsing buffer
*/
public void readFrom(ChannelBuffer channelBuffer) throws OspfParseException {
try {
if (this.opaqueId() == OspfParameters.TRAFFIC_ENGINEERING) {
while (channelBuffer.readableBytes() > 0) {
TlvHeader tlvHeader = new TlvHeader();
tlvHeader.setTlvType(channelBuffer.readUnsignedShort());
tlvHeader.setTlvLength(channelBuffer.readUnsignedShort());
if (tlvHeader.tlvType() == OpaqueTopLevelTlvTypes.ROUTER.value()) {
RouterTlv routerTlv = new RouterTlv(tlvHeader);
routerTlv.readFrom(channelBuffer.readBytes(tlvHeader.tlvLength()));
this.addValue(routerTlv);
} else if (tlvHeader.tlvType() == OpaqueTopLevelTlvTypes.LINK.value()) {
LinkTlv linkTlv = new LinkTlv(tlvHeader);
linkTlv.readFrom(channelBuffer.readBytes(tlvHeader.tlvLength()));
this.addValue(linkTlv);
}
}
} else {
int length = channelBuffer.readableBytes();
opaqueInfo = new byte[length];
channelBuffer.readBytes(opaqueInfo, 0, length);
}
} catch (Exception e) {
log.debug("Error::OpaqueLsa10:: {}", e.getMessage());
throw new OspfParseException(OspfErrorType.OSPF_MESSAGE_ERROR,
OspfErrorType.BAD_MESSAGE);
}
}
/**
* Returns instance as bytes.
*
* @return instance as bytes
* @throws Exception might throws exception while parsing packet
*/
public byte[] asBytes() throws Exception {
byte[] lsaMessage = null;
byte[] lsaHeader = getOpaqueLsaHeaderAsByteArray();
byte[] lsaBody = getLsaBodyAsByteArray();
lsaMessage = Bytes.concat(lsaHeader, lsaBody);
return lsaMessage;
}
/**
* Gets the LSA body as byte array.
*
* @return the lsa body as byte array
* @throws Exception might throws exception while parsing packet
*/
public byte[] getLsaBodyAsByteArray() throws Exception {
List<Byte> bodyLst = new ArrayList<>();
if (this.opaqueId() == 1) {
for (TopLevelTlv tlv : this.topLevelValues) {
//Check the sub type of lsa and build bytes accordingly
if (tlv instanceof RouterTlv) {
RouterTlv routerTlv = (RouterTlv) tlv;
bodyLst.addAll(Bytes.asList(routerTlv.asBytes()));
} else if (tlv instanceof LinkTlv) {
LinkTlv linkTlv = (LinkTlv) tlv;
bodyLst.addAll(Bytes.asList(linkTlv.asBytes()));
}
}
} else {
return opaqueInfo;
}
return Bytes.toArray(bodyLst);
}
@Override
public OspfLsaType getOspfLsaType() {
return OspfLsaType.AREA_LOCAL_OPAQUE_LSA;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.omitNullValues()
.add("topLevelValues", topLevelValues)
.add("opaqueInfo", opaqueInfo)
.toString();
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
OpaqueLsa10 that = (OpaqueLsa10) o;
return Objects.equal(topLevelValues, that.topLevelValues) &&
Objects.equal(opaqueInfo, that.opaqueInfo);
}
@Override
public int hashCode() {
return Objects.hashCode(opaqueInfo, topLevelValues);
}
}
\ No newline at end of file
/*
* Copyright 2016 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.ospf.protocol.lsa.types;
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.ospf.exceptions.OspfErrorType;
import org.onosproject.ospf.exceptions.OspfParseException;
import org.onosproject.ospf.protocol.lsa.LsaHeader;
import org.onosproject.ospf.protocol.lsa.subtypes.OspfLsaLink;
import org.onosproject.ospf.protocol.util.OspfUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
/**
* Representation of a Router LSA, and the fields and methods to access them.
*/
public class RouterLsa 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 | 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link State ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertising Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS checksum | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0 |V|E|B| 0 | # links |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | # TOS | metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TOS | 0 | TOS metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
*/
private static final Logger log =
LoggerFactory.getLogger(RouterLsa.class);
private boolean isVirtualEndPoint;
private boolean isAsBoundaryRouter;
private boolean isAreaBorderRouter;
private int noLink;
private List<OspfLsaLink> routerLinks = new ArrayList<>();
/**
* Creates an instance of Router LSA.
*/
public RouterLsa() {
}
/**
* Creates an instance of Router LSA.
*
* @param lsaHeader lsa header instance
*/
public RouterLsa(LsaHeader lsaHeader) {
populateHeader(lsaHeader);
}
/**
* Sets virtual endpoint or not.
*
* @param isVirtualEndPoint true or false
*/
public void setVirtualEndPoint(boolean isVirtualEndPoint) {
this.isVirtualEndPoint = isVirtualEndPoint;
}
/**
* Sets if it is an AS boundary router or not.
*
* @param isAsBoundaryRouter true if AS boundary router else false
*/
public void setAsBoundaryRouter(boolean isAsBoundaryRouter) {
this.isAsBoundaryRouter = isAsBoundaryRouter;
}
/**
* Sets whether it is an ABR or not.
*
* @param isAreaBorderRouter true if ABR else false
*/
public void setAreaBorderRouter(boolean isAreaBorderRouter) {
this.isAreaBorderRouter = isAreaBorderRouter;
}
/**
* Gets number of links.
*
* @return number of links
*/
public int noLink() {
return noLink;
}
/**
* Sets number of links.
*
* @param noLink number of links
*/
public void setNoLink(int noLink) {
this.noLink = noLink;
}
/**
* Adds router link.
*
* @param lsaLink LSA link
*/
public void addRouterLink(OspfLsaLink lsaLink) {
if (!this.routerLinks.contains(lsaLink)) {
this.routerLinks.add(lsaLink);
}
}
/**
* Gets router link.
*
* @return routerLinks LSA link list
*/
public List<OspfLsaLink> routerLink() {
return this.routerLinks;
}
/**
* Reads from channel buffer and populate this.
*
* @param channelBuffer channelBuffer instance.
* @throws OspfParseException might throws exception while parsing buffer
*/
public void readFrom(ChannelBuffer channelBuffer) throws OspfParseException {
try {
int veb = channelBuffer.readByte();
int unUsed = channelBuffer.readByte();
//Convert the byte to veb bits
String strVeb = Integer.toBinaryString(veb);
if (strVeb.length() == 3) {
this.setVirtualEndPoint((Integer.parseInt(Character.toString(strVeb.charAt(0))) == 1) ? true : false);
this.setAsBoundaryRouter((Integer.parseInt(Character.toString(strVeb.charAt(1))) == 1) ? true : false);
this.setAreaBorderRouter((Integer.parseInt(Character.toString(strVeb.charAt(2))) == 1) ? true : false);
} else if (strVeb.length() == 2) {
this.setVirtualEndPoint(false);
this.setAsBoundaryRouter((Integer.parseInt(Character.toString(strVeb.charAt(0))) == 1) ? true : false);
this.setAreaBorderRouter((Integer.parseInt(Character.toString(strVeb.charAt(1))) == 1) ? true : false);
} else if (strVeb.length() == 1) {
this.setVirtualEndPoint(false);
this.setAsBoundaryRouter(false);
this.setAreaBorderRouter((Integer.parseInt(Character.toString(strVeb.charAt(0))) == 1) ? true : false);
}
this.setNoLink(channelBuffer.readUnsignedShort());
while (channelBuffer.readableBytes() >= OspfUtil.TWELVE_BYTES) {
OspfLsaLink ospfLsaLink = new OspfLsaLink();
byte[] tempByteArray = new byte[OspfUtil.FOUR_BYTES];
channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
ospfLsaLink.setLinkId(InetAddress.getByAddress(tempByteArray).getHostName());
tempByteArray = new byte[OspfUtil.FOUR_BYTES];
channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
ospfLsaLink.setLinkData(InetAddress.getByAddress(tempByteArray).getHostName());
ospfLsaLink.setLinkType(channelBuffer.readByte());
ospfLsaLink.setTos(channelBuffer.readByte());
ospfLsaLink.setMetric(channelBuffer.readUnsignedShort());
//add the link
this.addRouterLink(ospfLsaLink);
}
} catch (Exception e) {
log.debug("Error::RouterLsa:: {}", e.getMessage());
throw new OspfParseException(OspfErrorType.OSPF_MESSAGE_ERROR, OspfErrorType.BAD_MESSAGE);
}
}
/**
* Returns instance as bytes.
*
* @return instance as bytes
* @throws OspfParseException might throws exception while parsing packet
*/
public byte[] asBytes() throws OspfParseException {
byte[] lsaMessage = null;
byte[] lsaHeader = getLsaHeaderAsByteArray();
byte[] lsaBody = getLsaBodyAsByteArray();
lsaMessage = Bytes.concat(lsaHeader, lsaBody);
return lsaMessage;
}
/**
* Gets the LSA body as bytes.
*
* @return LSA body as bytes
*/
public byte[] getLsaBodyAsByteArray() {
List<Byte> bodyLst = new ArrayList<>();
try {
int isVirtualEndPointVal = this.isVirtualEndPoint ? 1 : 0;
int isASBoundaryRouterVal = this.isAsBoundaryRouter ? 1 : 0;
int isAreaBorderRouterVal = this.isAreaBorderRouter ? 1 : 0;
StringBuilder sb = new StringBuilder();
sb.append(Integer.toBinaryString(isVirtualEndPointVal));
sb.append(Integer.toBinaryString(isASBoundaryRouterVal));
sb.append(Integer.toBinaryString(isAreaBorderRouterVal));
//added VEB
bodyLst.add((byte) Integer.parseInt(sb.toString(), 2));
//second byte is 0.
bodyLst.add((byte) 0);
//Number of links
bodyLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.noLink())));
//add each link details
for (OspfLsaLink lsaLink : routerLinks) {
bodyLst.addAll(Bytes.asList(InetAddress.getByName(lsaLink.linkId()).getAddress()));
bodyLst.addAll(Bytes.asList(InetAddress.getByName(lsaLink.linkData()).getAddress()));
bodyLst.add((byte) lsaLink.linkType());
bodyLst.add((byte) lsaLink.tos());
bodyLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(lsaLink.metric())));
}
} catch (Exception e) {
log.debug("Error::getLsrBodyAsByteArray {}", e.getMessage());
return Bytes.toArray(bodyLst);
}
return Bytes.toArray(bodyLst);
}
/**
* Increment the link by 1.
*/
public void incrementLinkNo() {
this.noLink++;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.omitNullValues()
.add("isVirtualEndPoint", isVirtualEndPoint)
.add("isAsBoundaryRouter", isAsBoundaryRouter)
.add("isAreaBorderRouter", isAreaBorderRouter)
.add("noLink", noLink)
.add("routerLinks", routerLinks)
.toString();
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
RouterLsa that = (RouterLsa) o;
return Objects.equal(isVirtualEndPoint, that.isVirtualEndPoint) &&
Objects.equal(isAsBoundaryRouter, that.isAsBoundaryRouter) &&
Objects.equal(isAreaBorderRouter, that.isAreaBorderRouter) &&
Objects.equal(noLink, that.noLink) &&
Objects.equal(routerLinks, that.routerLinks);
}
@Override
public int hashCode() {
return Objects.hashCode(isVirtualEndPoint, isAsBoundaryRouter, isAreaBorderRouter,
noLink, routerLinks);
}
}
\ No newline at end of file
/*
* Copyright 2016 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.
*/
/**
* Implementation of the OSPF LSA types.
*/
package org.onosproject.ospf.protocol.lsa.types;
\ No newline at end of file
/*
* Copyright 2016 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.ospf.protocol.ospfpacket;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onlab.packet.Ip4Address;
import org.onosproject.ospf.exceptions.OspfErrorType;
import org.onosproject.ospf.exceptions.OspfParseException;
import org.onosproject.ospf.protocol.ospfpacket.types.DdPacket;
import org.onosproject.ospf.protocol.ospfpacket.types.HelloPacket;
import org.onosproject.ospf.protocol.ospfpacket.types.LsAcknowledge;
import org.onosproject.ospf.protocol.ospfpacket.types.LsRequest;
import org.onosproject.ospf.protocol.ospfpacket.types.LsUpdate;
import org.onosproject.ospf.protocol.util.OspfParameters;
import org.onosproject.ospf.protocol.util.OspfUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A message reader which reads OSPF messages from ChannelBuffer and converts to OspfMessage instances.
*/
public class OspfMessageReader {
private static final Logger log = LoggerFactory.getLogger(OspfMessageReader.class);
/**
* Reads and Converts the channel buffer to OspfMessage instance.
*
* @param channelBuffer channel buffer instance.
* @return OSPF message instance.
* @throws Exception might throws exception while parsing buffer
*/
public OspfMessage readFromBuffer(ChannelBuffer channelBuffer)
throws Exception {
if (channelBuffer.readableBytes() < OspfUtil.PACKET_MINIMUM_LENGTH) {
log.error("Packet should have minimum length...");
throw new OspfParseException(OspfErrorType.MESSAGE_HEADER_ERROR, OspfErrorType.BAD_MESSAGE_LENGTH);
}
try {
OspfPacketHeader ospfHeader = getOspfHeader(channelBuffer);
int len = ospfHeader.ospfPacLength() - OspfUtil.OSPF_HEADER_LENGTH;
OspfMessage ospfMessage = null;
switch (ospfHeader.ospfType()) {
case OspfParameters.HELLO:
ospfMessage = new HelloPacket(ospfHeader);
break;
case OspfParameters.DD:
ospfMessage = new DdPacket(ospfHeader);
break;
case OspfParameters.LSREQUEST:
ospfMessage = new LsRequest(ospfHeader);
break;
case OspfParameters.LSUPDATE:
ospfMessage = new LsUpdate(ospfHeader);
break;
case OspfParameters.LSACK:
ospfMessage = new LsAcknowledge(ospfHeader);
break;
default:
log.debug("Message Reader[Decoder] - Unknown LSA type..!!!");
break;
}
if (ospfMessage != null) {
try {
log.debug("{} Received::Message Length :: {} ", ospfMessage.ospfMessageType(),
ospfHeader.ospfPacLength());
ospfMessage.readFrom(channelBuffer.readBytes(len));
} catch (Exception e) {
throw new OspfParseException(OspfErrorType.OSPF_MESSAGE_ERROR,
OspfErrorType.BAD_MESSAGE);
}
}
return ospfMessage;
} catch (Exception e) {
throw new OspfParseException(OspfErrorType.OSPF_MESSAGE_ERROR,
OspfErrorType.BAD_MESSAGE);
}
}
/**
* Gets the OSPF packet Header.
*
* @param channelBuffer channel buffer instance.
* @return Ospf Header instance.
*/
private OspfPacketHeader getOspfHeader(ChannelBuffer channelBuffer) throws Exception {
OspfPacketHeader ospfPacketHeader = new OspfPacketHeader();
byte[] sourceIpBytes = new byte[OspfUtil.FOUR_BYTES];
channelBuffer.readBytes(sourceIpBytes, 0, OspfUtil.FOUR_BYTES);
Ip4Address sourceIP = Ip4Address.valueOf(sourceIpBytes);
// Determine ospf version & Packet Type
int version = channelBuffer.readByte(); //byte 1 is ospf version
int packetType = channelBuffer.readByte(); //byte 2 is ospf packet type
// byte 3 & 4 combine is packet length.
int packetLength = channelBuffer.readShort();
if (packetLength > channelBuffer.readableBytes() + OspfUtil.FOUR_BYTES) {
log.error("Packet should have minimum length...");
throw new OspfParseException(OspfErrorType.MESSAGE_HEADER_ERROR, OspfErrorType.BAD_MESSAGE_LENGTH);
}
byte[] tempByteArray = new byte[OspfUtil.FOUR_BYTES];
channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
Ip4Address routerId = Ip4Address.valueOf(tempByteArray);
tempByteArray = new byte[OspfUtil.FOUR_BYTES];
channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
Ip4Address areaId = Ip4Address.valueOf(tempByteArray);
int checkSum = channelBuffer.readUnsignedShort();
int auType = channelBuffer.readUnsignedShort();
int authentication = (int) channelBuffer.readLong();
ospfPacketHeader.setSourceIp(sourceIP);
ospfPacketHeader.setOspfVer(version);
ospfPacketHeader.setOspftype(packetType);
ospfPacketHeader.setOspfPacLength(packetLength);
ospfPacketHeader.setRouterId(routerId);
ospfPacketHeader.setAreaId(areaId);
ospfPacketHeader.setChecksum(checkSum);
ospfPacketHeader.setAuthType(auType);
ospfPacketHeader.setAuthentication(authentication);
return ospfPacketHeader;
}
}
\ No newline at end of file
/*
* Copyright 2016 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.ospf.protocol.ospfpacket;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.onosproject.ospf.protocol.util.OspfParameters;
import org.onosproject.ospf.protocol.util.OspfUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A message writer which writes an OspfMessage to ChannelBuffer.
*/
public class OspfMessageWriter {
private static final Logger log = LoggerFactory.getLogger(OspfMessageWriter.class);
/**
* Writes OSPF message to ChannelBuffer.
*
* @param ospfMessage OSPF message
* @param interfaceState interface state
* @param interfaceType interface type
* @return channelBuffer channel buffer instance
* @throws Exception might throws exception while parsing message
*/
public ChannelBuffer writeToBuffer(OspfMessage ospfMessage, int interfaceState,
int interfaceType) throws Exception {
ChannelBuffer buf = null;
switch (ospfMessage.ospfMessageType().value()) {
case OspfParameters.HELLO:
case OspfParameters.LSACK:
buf = writeMessageToBuffer(ospfMessage, interfaceState);
break;
case OspfParameters.DD:
case OspfParameters.LSREQUEST:
case OspfParameters.LSUPDATE:
buf = writeMessageToBuffer(ospfMessage, interfaceState);
break;
default:
log.debug("Message Writer[Encoder] - Unknown Message to encode..!!!");
break;
}
return buf;
}
/**
* Writes an OSPF Message to channel buffer.
*
* @param ospfMessage OSPF Message instance
* @param interfaceState interface state
* @return channelBuffer instance
*/
private ChannelBuffer writeMessageToBuffer(OspfMessage ospfMessage, int interfaceState) throws Exception {
ChannelBuffer channelBuffer = null;
byte[] ospfMessageAsByte = ospfMessage.asBytes();
//Add the length and checksum in byte array at length position 2 & 3 and Checksum position
ospfMessageAsByte = OspfUtil.addLengthAndCheckSum(ospfMessageAsByte, OspfUtil.OSPFPACKET_LENGTH_POS1,
OspfUtil.OSPFPACKET_LENGTH_POS2,
OspfUtil.OSPFPACKET_CHECKSUM_POS1,
OspfUtil.OSPFPACKET_CHECKSUM_POS2);
//Add Interface State Info and destination IP as metadata
if (interfaceState == OspfParameters.DR || interfaceState == OspfParameters.BDR) {
ospfMessageAsByte = OspfUtil.addMetadata(ospfMessageAsByte, OspfUtil.JOIN_ALL_DROUTERS,
ospfMessage.destinationIp());
} else {
ospfMessageAsByte = OspfUtil.addMetadata(ospfMessageAsByte, OspfUtil.ONLY_ALL_SPF_ROUTERS,
ospfMessage.destinationIp());
}
channelBuffer = ChannelBuffers.buffer(ospfMessageAsByte.length);
channelBuffer.writeBytes(ospfMessageAsByte);
return channelBuffer;
}
}
\ No newline at end of file
/*
* Copyright 2016 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.ospf.protocol.ospfpacket.types;
import com.google.common.base.MoreObjects;
import com.google.common.primitives.Bytes;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.ospf.controller.OspfLsa;
import org.onosproject.ospf.exceptions.OspfErrorType;
import org.onosproject.ospf.exceptions.OspfParseException;
import org.onosproject.ospf.protocol.lsa.LsaHeader;
import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
import org.onosproject.ospf.protocol.lsa.types.AsbrSummaryLsa;
import org.onosproject.ospf.protocol.lsa.types.ExternalLsa;
import org.onosproject.ospf.protocol.lsa.types.NetworkLsa;
import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa10;
import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa11;
import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa9;
import org.onosproject.ospf.protocol.lsa.types.RouterLsa;
import org.onosproject.ospf.protocol.lsa.types.SummaryLsa;
import org.onosproject.ospf.protocol.ospfpacket.OspfPacketHeader;
import org.onosproject.ospf.protocol.util.OspfPacketType;
import org.onosproject.ospf.protocol.util.OspfParameters;
import org.onosproject.ospf.protocol.util.OspfUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* Representation of an OSPF Link State Update packet.
* Link State Update packets are OSPF packet type 4. These packets
* implement the flooding of LSAs. Each Link State Update packet
* carries a collection of LSAs one hop further from their origin.
* Several LSAs may be included in a single packet.
*/
public class LsUpdate extends OspfPacketHeader {
/*
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | 4 | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| # LSAs |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+- +-+
| LSAs |
+- +-+
| ... |
*/
private static final Logger log = LoggerFactory.getLogger(LsUpdate.class);
private int numberOfLsa;
private List<OspfLsa> lsaList = new LinkedList<>();
/**
* Creates an instance of Link State Update packet.
*/
public LsUpdate() {
}
/**
* Creates an instance of Link State Update packet.
*
* @param ospfHeader ospf header instance.
*/
public LsUpdate(OspfPacketHeader ospfHeader) {
populateHeader(ospfHeader);
}
/**
* Gets the LSA list.
*
* @return list of LSA
*/
public List getLsaList() {
return lsaList;
}
/**
* Adds the LSA to list.
*
* @param lsa LSA
*/
public void addLsa(OspfLsa lsa) {
if (!lsaList.contains(lsa)) {
lsaList.add(lsa);
}
}
/**
* Gets the number of LSA.
*
* @return number of LSA
*/
public int noLsa() {
return numberOfLsa;
}
/**
* Sets number of LSA.
*
* @param numberOfLsa number of LSA
*/
public void setNumberOfLsa(int numberOfLsa) {
this.numberOfLsa = numberOfLsa;
}
@Override
public OspfPacketType ospfMessageType() {
return OspfPacketType.LSUPDATE;
}
@Override
public void readFrom(ChannelBuffer channelBuffer) throws OspfParseException {
try {
//From header 4 bytes is number of lsa's
this.setNumberOfLsa(channelBuffer.readInt());
//get the remaining bytes represents Number of LSA's present. Add all the LSA's
while (channelBuffer.readableBytes() > OspfUtil.LSA_HEADER_LENGTH) {
LsaHeader header = OspfUtil.readLsaHeader(channelBuffer.readBytes(OspfUtil.LSA_HEADER_LENGTH));
int lsaLength = header.lsPacketLen();
int lsType = header.lsType();
switch (lsType) {
case OspfParameters.LINK_LOCAL_OPAQUE_LSA:
OpaqueLsa9 opaqueLsa9 = new OpaqueLsa9((OpaqueLsaHeader) header);
opaqueLsa9.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
addLsa(opaqueLsa9);
break;
case OspfParameters.AREA_LOCAL_OPAQUE_LSA:
OpaqueLsa10 opaqueLsa10 = new OpaqueLsa10((OpaqueLsaHeader) header);
opaqueLsa10.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
addLsa(opaqueLsa10);
break;
case OspfParameters.AS_OPAQUE_LSA:
OpaqueLsa11 opaqueLsa11 = new OpaqueLsa11((OpaqueLsaHeader) header);
opaqueLsa11.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
addLsa(opaqueLsa11);
break;
case OspfParameters.ROUTER:
RouterLsa routerLsa = new RouterLsa(header);
routerLsa.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
addLsa(routerLsa);
break;
case OspfParameters.NETWORK:
NetworkLsa networkLsa = new NetworkLsa(header);
networkLsa.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
addLsa(networkLsa);
break;
case OspfParameters.ASBR_SUMMARY:
AsbrSummaryLsa asbrSummaryLsa = new AsbrSummaryLsa(header);
asbrSummaryLsa.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
addLsa(asbrSummaryLsa);
break;
case OspfParameters.SUMMARY:
SummaryLsa summaryLSA = new SummaryLsa(header);
summaryLSA.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
addLsa(summaryLSA);
break;
case OspfParameters.EXTERNAL_LSA:
ExternalLsa externalLsa = new ExternalLsa(header);
externalLsa.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
addLsa(externalLsa);
break;
default:
log.debug("LSUpdate::readLsUpdateBody::UnKnown LS Type: {}", lsType);
break;
}
}
} catch (Exception e) {
log.debug("Error::LsUpdate:: {}", e.getMessage());
throw new OspfParseException(OspfErrorType.MESSAGE_HEADER_ERROR, OspfErrorType.BAD_MESSAGE_LENGTH);
}
}
@Override
public byte[] asBytes() {
byte[] lsuMessage = null;
byte[] ospfHeader = getLsuHeaderAsByteArray();
byte[] lsuBody = getLsuBodyAsByteArray();
lsuMessage = Bytes.concat(ospfHeader, lsuBody);
return lsuMessage;
}
/**
* Gets lsu header.
*
* @return lsu header as byte array
*/
public byte[] getLsuHeaderAsByteArray() {
List<Byte> headerLst = new ArrayList<>();
try {
headerLst.add((byte) this.ospfVersion());
headerLst.add((byte) this.ospfType());
headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.ospfPacLength())));
headerLst.addAll(Bytes.asList(this.routerId().toOctets()));
headerLst.addAll(Bytes.asList(this.areaId().toOctets()));
headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.checksum())));
headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.authType())));
//Authentication is 0 always. Total 8 bytes consist of zero
byte[] auth = new byte[OspfUtil.EIGHT_BYTES];
headerLst.addAll(Bytes.asList(auth));
} catch (Exception e) {
log.debug("Error::LSUpdate::getLsuHeaderAsByteArray:: {}", e.getMessage());
return Bytes.toArray(headerLst);
}
return Bytes.toArray(headerLst);
}
/**
* Get lsu body as byte array.
*
* @return lsu body as byte array
*/
public byte[] getLsuBodyAsByteArray() {
List<Byte> bodyLst = new ArrayList<>();
try {
//add number of LSA's
bodyLst.addAll(Bytes.asList(OspfUtil.convertToFourBytes(this.noLsa())));
//for each type of LSA's from the list get lsa bytes
for (OspfLsa ospfLsa : lsaList) {
//Check the type of lsa and build bytes accordingly
switch (ospfLsa.getOspfLsaType().value()) {
case OspfParameters.LINK_LOCAL_OPAQUE_LSA:
OpaqueLsa9 opaqueLsa9 = (OpaqueLsa9) ospfLsa;
bodyLst.addAll(Bytes.asList(opaqueLsa9.asBytes()));
break;
case OspfParameters.AREA_LOCAL_OPAQUE_LSA:
OpaqueLsa10 opaqueLsa10 = (OpaqueLsa10) ospfLsa;
bodyLst.addAll(Bytes.asList(opaqueLsa10.asBytes()));
break;
case OspfParameters.AS_OPAQUE_LSA:
OpaqueLsa11 opaqueLsa11 = (OpaqueLsa11) ospfLsa;
bodyLst.addAll(Bytes.asList(opaqueLsa11.asBytes()));
break;
case OspfParameters.ROUTER:
RouterLsa routerLsa = (RouterLsa) ospfLsa;
bodyLst.addAll(Bytes.asList(routerLsa.asBytes()));
break;
case OspfParameters.NETWORK:
NetworkLsa networkLsa = (NetworkLsa) ospfLsa;
bodyLst.addAll(Bytes.asList(networkLsa.asBytes()));
break;
case OspfParameters.ASBR_SUMMARY:
AsbrSummaryLsa asbrSummaryLsa = (AsbrSummaryLsa) ospfLsa;
bodyLst.addAll(Bytes.asList(asbrSummaryLsa.asBytes()));
break;
case OspfParameters.SUMMARY:
SummaryLsa summaryLsa = (SummaryLsa) ospfLsa;
bodyLst.addAll(Bytes.asList(summaryLsa.asBytes()));
break;
case OspfParameters.EXTERNAL_LSA:
ExternalLsa externalLsa = (ExternalLsa) ospfLsa;
bodyLst.addAll(Bytes.asList(externalLsa.asBytes()));
break;
default:
log.debug("LSUpdate::getLsuBodyAsByteArray::UnKnown ospfLsa: {}", ospfLsa);
break;
}
}
} catch (Exception e) {
log.debug("Error::getLsuBodyAsByteArray {}", e.getMessage());
return Bytes.toArray(bodyLst);
}
return Bytes.toArray(bodyLst);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.omitNullValues()
.add("noLsa", numberOfLsa)
.add("lsaList", lsaList)
.toString();
}
}
\ No newline at end of file
/*
* Copyright 2016 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.ospf.protocol.util;
import org.onosproject.ospf.controller.OspfLsa;
import org.onosproject.ospf.controller.OspfLsaType;
import org.onosproject.ospf.protocol.lsa.types.AsbrSummaryLsa;
import org.onosproject.ospf.protocol.lsa.types.ExternalLsa;
import org.onosproject.ospf.protocol.lsa.types.NetworkLsa;
import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa10;
import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa11;
import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa9;
import org.onosproject.ospf.protocol.lsa.types.RouterLsa;
import org.onosproject.ospf.protocol.lsa.types.SummaryLsa;
import org.onosproject.ospf.protocol.ospfpacket.OspfMessage;
import org.onosproject.ospf.protocol.ospfpacket.types.DdPacket;
import org.onosproject.ospf.protocol.ospfpacket.types.HelloPacket;
import org.onosproject.ospf.protocol.ospfpacket.types.LsAcknowledge;
import org.onosproject.ospf.protocol.ospfpacket.types.LsRequest;
import org.onosproject.ospf.protocol.ospfpacket.types.LsUpdate;
import java.util.Arrays;
/**
* Calculates checksum for different types of OSPF packets.
*/
public class ChecksumCalculator {
/**
* Converts given string to sixteen bits integer.
* If hexasum is more than 16 bit value, needs to be reduced to 16 bit value.
*
* @param strToConvert hexasum value to convert
* @return 16 bit integer value
*/
public static int convertToSixteenBits(String strToConvert) {
StringBuilder sb = new StringBuilder(strToConvert);
sb = sb.reverse();
StringBuilder s1 = new StringBuilder(sb.substring(0, 4));
s1 = s1.reverse();
StringBuilder s2 = new StringBuilder(sb.substring(4, sb.length()));
s2 = s2.reverse();
int num = Integer.parseInt(s1.toString(), 16) + Integer.parseInt(s2.toString(), 16);
return num;
}
/**
* Checks whether checksum is valid or not in the given OSPF message.
*
* @param ospfMessage ospf message instance
* @param checksumPos1 position of checksum bit in packet
* @param checksumPos2 position of checksum bit in packet
* @return true if valid else false
*/
public boolean isValidOspfCheckSum(OspfMessage ospfMessage, int checksumPos1, int checksumPos2) {
switch (ospfMessage.ospfMessageType().value()) {
case OspfParameters.HELLO:
ospfMessage = (HelloPacket) ospfMessage;
break;
case OspfParameters.DD:
ospfMessage = (DdPacket) ospfMessage;
break;
case OspfParameters.LSREQUEST:
ospfMessage = (LsRequest) ospfMessage;
break;
case OspfParameters.LSUPDATE:
ospfMessage = (LsUpdate) ospfMessage;
break;
case OspfParameters.LSACK:
ospfMessage = (LsAcknowledge) ospfMessage;
break;
default:
break;
}
byte[] messageAsBytes = ospfMessage.asBytes();
return validateOspfCheckSum(messageAsBytes, checksumPos1, checksumPos2);
}
/**
* Checks whether checksum is valid or not in the given OSPF LSA.
*
* @param ospfLsa lsa instance
* @param lsType lsa type
* @param lsaChecksumPos1 lsa checksum position in packet
* @param lsaChecksumPos2 lsa checksum position in packet
* @return true if valid else false
* @throws Exception might throw exception while processing
*/
public boolean isValidLsaCheckSum(OspfLsa ospfLsa, int lsType, int lsaChecksumPos1,
int lsaChecksumPos2) throws Exception {
if (lsType == OspfLsaType.ROUTER.value()) {
RouterLsa lsa = (RouterLsa) ospfLsa;
return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
} else if (lsType == OspfLsaType.NETWORK.value()) {
NetworkLsa lsa = (NetworkLsa) ospfLsa;
return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
} else if (lsType == OspfLsaType.SUMMARY.value()) {
SummaryLsa lsa = (SummaryLsa) ospfLsa;
return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
} else if (lsType == OspfLsaType.ASBR_SUMMARY.value()) {
AsbrSummaryLsa lsa = (AsbrSummaryLsa) ospfLsa;
return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
} else if (lsType == OspfLsaType.EXTERNAL_LSA.value()) {
ExternalLsa lsa = (ExternalLsa) ospfLsa;
return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
} else if (lsType == OspfLsaType.LINK_LOCAL_OPAQUE_LSA.value()) {
OpaqueLsa9 lsa = (OpaqueLsa9) ospfLsa;
return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
} else if (lsType == OspfLsaType.AREA_LOCAL_OPAQUE_LSA.value()) {
OpaqueLsa10 lsa = (OpaqueLsa10) ospfLsa;
return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
} else if (lsType == OspfLsaType.AS_OPAQUE_LSA.value()) {
OpaqueLsa11 lsa = (OpaqueLsa11) ospfLsa;
return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
}
return false;
}
/**
* Verifies the checksum is valid in given LSA packet bytes.
*
* @param lsaPacket lsa as byte array
* @param lsaChecksumPos1 position of checksum bit in packet
* @param lsaChecksumPos2 position of checksum bit in packet
* @return true if valid else false
*/
public boolean validateLsaCheckSum(byte[] lsaPacket, int lsaChecksumPos1, int lsaChecksumPos2) {
byte[] checksum = calculateLsaChecksum(lsaPacket, lsaChecksumPos1, lsaChecksumPos2);
if (lsaPacket[lsaChecksumPos1] == checksum[0] && lsaPacket[lsaChecksumPos2] == checksum[1]) {
return true;
}
return false;
}
/**
* Verifies the checksum is valid in given OSPF packet bytes.
*
* @param ospfPacket as byte array
* @param checksumPos1 position of checksum bit in packet
* @param checksumPos2 position of checksum bit in packet
* @return true if valid else false
*/
public boolean validateOspfCheckSum(byte[] ospfPacket, int checksumPos1, int checksumPos2) {
byte[] checkSum = calculateOspfCheckSum(ospfPacket, checksumPos1, checksumPos2);
if (ospfPacket[checksumPos1] == checkSum[0] && ospfPacket[checksumPos2] == checkSum[1]) {
return true;
}
return false;
}
/**
* Calculates the LSA checksum.
*
* @param lsaBytes as byte array
* @param lsaChecksumPos1 position of checksum bit in packet
* @param lsaChecksumPos2 position of checksum bit in packet
* @return checksum bytes
*/
public byte[] calculateLsaChecksum(byte[] lsaBytes, int lsaChecksumPos1, int lsaChecksumPos2) {
byte[] tempLsaByte = Arrays.copyOf(lsaBytes, lsaBytes.length);
int[] checksumOut = {0, 0};
tempLsaByte[lsaChecksumPos1] = 0;
tempLsaByte[lsaChecksumPos2] = 0;
byte[] byteCheckSum = {0, 0};
if (lsaBytes != null) {
for (int i = 2; i < tempLsaByte.length; i++) {
checksumOut[0] = checksumOut[0] + ((int) tempLsaByte[i] & 0xFF);
checksumOut[1] = checksumOut[1] + checksumOut[0];
}
checksumOut[0] = checksumOut[0] % 255;
checksumOut[1] = checksumOut[1] % 255;
}
int byte1 = (int) ((tempLsaByte.length - lsaChecksumPos1 - 1) * checksumOut[0] - checksumOut[1]) % 255;
if (byte1 <= 0) {
byte1 += 255;
}
int byte2 = 510 - checksumOut[0] - byte1;
if (byte2 > 255) {
byte2 -= 255;
}
byteCheckSum[0] = (byte) byte1;
byteCheckSum[1] = (byte) byte2;
return byteCheckSum;
}
/**
* Calculate checksum from hexasum.
*
* @param hexasum total of 16 bits hexadecimal values
* @return checksum value
*/
private int calculateChecksum(int hexasum) {
char[] tempZeros = {'0', '0', '0', '0'};
StringBuffer hexaAsBinaryStr = new StringBuffer(Integer.toBinaryString(hexasum));
int length = hexaAsBinaryStr.length();
while (length > 16) {
if (hexaAsBinaryStr.length() % 4 != 0) {
int offset = hexaAsBinaryStr.length() % 4;
hexaAsBinaryStr.insert(0, tempZeros, 0, 4 - offset);
}
StringBuffer hexaStr1 = new StringBuffer(hexaAsBinaryStr.reverse().substring(0, 16));
String revHexaStr1 = hexaStr1.reverse().toString();
StringBuffer hexaStr2 = new StringBuffer(hexaAsBinaryStr.reverse());
StringBuffer hexaStr3 = new StringBuffer(hexaStr2.reverse().substring(16, hexaStr2.length()));
String revHexaStr3 = hexaStr3.reverse().toString();
int lastSixteenHexaBits = Integer.parseInt(revHexaStr1, 2);
int remainingHexaBits = Integer.parseInt(revHexaStr3, 2);
int totalCheckSum = lastSixteenHexaBits + remainingHexaBits;
hexaAsBinaryStr = new StringBuffer(Integer.toBinaryString(totalCheckSum));
length = hexaAsBinaryStr.length();
}
if (hexaAsBinaryStr.length() < 16) {
int count = 16 - hexaAsBinaryStr.length();
String s = hexaAsBinaryStr.toString();
for (int i = 0; i < count; i++) {
s = "0" + s;
}
hexaAsBinaryStr = new StringBuffer(s);
}
StringBuffer checksum = negate(hexaAsBinaryStr);
return Integer.parseInt(checksum.toString(), 2);
}
/**
* Negates given hexasum.
*
* @param binaryString binary form of hexasum
* @return binary from of calculateChecksum
*/
private StringBuffer negate(StringBuffer binaryString) {
for (int i = 0; i < binaryString.length(); i++) {
if (binaryString.charAt(i) == '1') {
binaryString.replace(i, i + 1, "0");
} else {
binaryString.replace(i, i + 1, "1");
}
}
return binaryString;
}
/**
* Calculates the OSPF checksum for the given packet.
*
* @param packet as byte array
* @param checksumPos1 position of checksum bit in packet
* @param checksumPos2 position of checksum bit in packet
* @return checksum bytes
*/
public byte[] calculateOspfCheckSum(byte[] packet, int checksumPos1, int checksumPos2) {
int hexasum = 0;
for (int i = 0; i < packet.length; i = i + 2) {
if (i != 12) {
byte b1 = packet[i];
String s1 = String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0');
b1 = packet[i + 1];
String s2 = String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0');
String hexa = s1 + s2;
int num1 = Integer.parseInt(hexa, 2);
hexasum = hexasum + num1;
String convertTo16 = Integer.toHexString(hexasum);
if (convertTo16.length() > 4) {
hexasum = convertToSixteenBits(convertTo16);
}
}
}
StringBuilder sb = new StringBuilder(Integer.toHexString(hexasum));
if (sb.length() > 4) {
sb = sb.reverse();
StringBuilder s1 = new StringBuilder(sb.substring(0, 4));
s1 = s1.reverse();
StringBuilder s2 = new StringBuilder(sb.substring(4, sb.length()));
s2 = s2.reverse();
hexasum = Integer.parseInt(s1.toString(), 16) + Integer.parseInt(s2.toString(), 16);
}
int finalChecksum = calculateChecksum(hexasum);
return OspfUtil.convertToTwoBytes(finalChecksum);
}
}
\ No newline at end of file
/*
* Copyright 2016 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.ospf.protocol.lsa.types;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.Ip4Address;
import org.onosproject.ospf.controller.OspfLsaType;
import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
import org.onosproject.ospf.protocol.lsa.TlvHeader;
import org.onosproject.ospf.protocol.lsa.tlvtypes.LinkTlv;
import org.onosproject.ospf.protocol.lsa.tlvtypes.RouterTlv;
import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
/**
* Unit test class for OpaqueLsa10.
*/
public class OpaqueLsa10Test {
private final byte[] packet = {0, 1, 0, 4, 1, 1, 1, 1, 0, 2, 0, 84, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
private OpaqueLsa10 opaqueLsa10;
private TopLevelTlv tlv;
private OpaqueLsaHeader opqueHeader;
private ChannelBuffer channelBuffer;
private byte[] result;
private RouterTlv routerTlv;
private RouterTlv routerTlv1;
private LinkTlv linkTlv;
private LinkTlv linkTlv1;
private OspfLsaType ospflsaType;
private int result1;
private List result2;
@Before
public void setUp() throws Exception {
opaqueLsa10 = new OpaqueLsa10(new OpaqueLsaHeader());
}
@After
public void tearDown() throws Exception {
opaqueLsa10 = null;
tlv = null;
opqueHeader = null;
channelBuffer = null;
result = null;
routerTlv = null;
routerTlv1 = null;
linkTlv1 = null;
ospflsaType = null;
}
/**
* Tests to string method.
*/
@Test
public void testToString() throws Exception {
assertThat(opaqueLsa10.toString(), is(notNullValue()));
}
/**
* Tests addValue() method.
*/
@Test
public void testAddValue() throws Exception {
tlv = new RouterTlv(new TlvHeader());
opaqueLsa10.addValue(tlv);
assertThat(opaqueLsa10, is(notNullValue()));
}
/**
* Tests readFrom() method.
*/
@Test(expected = Exception.class)
public void testReadFrom() throws Exception {
opqueHeader = new OpaqueLsaHeader();
opqueHeader.setLsType(10);
opqueHeader.setLsPacketLen(48);
opqueHeader.setLsCheckSum(10);
opqueHeader.setAge(4);
opqueHeader.setOpaqueId(1);
opqueHeader.setOpaqueType(10);
opqueHeader.setLsSequenceNo(250);
opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
opqueHeader.setOptions(66);
opaqueLsa10 = new OpaqueLsa10(opqueHeader);
channelBuffer = ChannelBuffers.copiedBuffer(packet);
opaqueLsa10.readFrom(channelBuffer);
result = opaqueLsa10.asBytes();
assertThat(result, is(notNullValue()));
}
/**
* Tests asBytes() method.
*/
@Test(expected = Exception.class)
public void testAsBytes() throws Exception {
opqueHeader = new OpaqueLsaHeader();
opqueHeader.setLsType(10);
opqueHeader.setLsPacketLen(48);
opqueHeader.setLsCheckSum(10);
opqueHeader.setAge(4);
opqueHeader.setOpaqueId(1);
opqueHeader.setOpaqueType(10);
opqueHeader.setLsSequenceNo(250);
opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
opqueHeader.setOptions(66);
opaqueLsa10 = new OpaqueLsa10(opqueHeader);
channelBuffer = ChannelBuffers.copiedBuffer(packet);
opaqueLsa10.readFrom(channelBuffer);
result = opaqueLsa10.getLsaBodyAsByteArray();
result = opaqueLsa10.asBytes();
assertThat(result, is(notNullValue()));
}
/**
* Tests getLsaBodyAsByteArray() method.
*/
@Test(expected = Exception.class)
public void testGetLsaBodyAsByteArray() throws Exception {
opqueHeader = new OpaqueLsaHeader();
opqueHeader.setLsType(10);
opqueHeader.setLsPacketLen(48);
opqueHeader.setLsCheckSum(10);
opqueHeader.setAge(4);
opqueHeader.setOpaqueId(1);
opqueHeader.setOpaqueType(10);
opqueHeader.setLsSequenceNo(250);
opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
opqueHeader.setOptions(2);
opaqueLsa10 = new OpaqueLsa10(opqueHeader);
routerTlv = new RouterTlv(new TlvHeader());
linkTlv = new LinkTlv(new TlvHeader());
opaqueLsa10.addValue(routerTlv);
opaqueLsa10.addValue(linkTlv);
routerTlv1 = new RouterTlv(new TlvHeader());
linkTlv1 = new LinkTlv(new TlvHeader());
opaqueLsa10.addValue(routerTlv1);
opaqueLsa10.addValue(linkTlv1);
channelBuffer = ChannelBuffers.copiedBuffer(packet);
opaqueLsa10.readFrom(channelBuffer);
result = opaqueLsa10.getLsaBodyAsByteArray();
assertThat(result, is(notNullValue()));
}
/**
* Tests getLsaBodyAsByteArray() method.
*/
@Test(expected = Exception.class)
public void testGetLsaBodyAsByteArray1() throws Exception {
opqueHeader = new OpaqueLsaHeader();
opqueHeader.setLsType(10);
opqueHeader.setLsPacketLen(48);
opqueHeader.setLsCheckSum(10);
opqueHeader.setAge(4);
opqueHeader.setOpaqueId(1);
opqueHeader.setOpaqueType(10);
opqueHeader.setLsSequenceNo(250);
opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
opqueHeader.setOptions(2);
opaqueLsa10 = new OpaqueLsa10(opqueHeader);
routerTlv = new RouterTlv(new TlvHeader());
opaqueLsa10.addValue(routerTlv);
channelBuffer = ChannelBuffers.copiedBuffer(packet);
result = opaqueLsa10.getLsaBodyAsByteArray();
assertThat(result, is(notNullValue()));
}
/**
* Tests getLsaBodyAsByteArray() method.
*/
@Test(expected = Exception.class)
public void testGetLsaBodyAsByteArray2() throws Exception {
opqueHeader = new OpaqueLsaHeader();
opqueHeader.setLsType(10);
opqueHeader.setLsPacketLen(48);
opqueHeader.setLsCheckSum(10);
opqueHeader.setAge(4);
opqueHeader.setOpaqueId(1);
opqueHeader.setOpaqueType(10);
opqueHeader.setLsSequenceNo(250);
opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
opqueHeader.setOptions(2);
opaqueLsa10 = new OpaqueLsa10(opqueHeader);
linkTlv = new LinkTlv(new TlvHeader());
opaqueLsa10.addValue(linkTlv);
channelBuffer = ChannelBuffers.copiedBuffer(packet);
opaqueLsa10.readFrom(channelBuffer);
result = opaqueLsa10.getLsaBodyAsByteArray();
assertThat(result, is(notNullValue()));
}
/**
* Tests getOspfLsaType() getter method.
*/
@Test
public void testGetOspfLsaType() throws Exception {
opaqueLsa10.setLsType(10);
ospflsaType = opaqueLsa10.getOspfLsaType();
assertThat(ospflsaType, is(notNullValue()));
assertThat(ospflsaType, is(OspfLsaType.AREA_LOCAL_OPAQUE_LSA));
}
/**
* Tests hashCode() method.
*/
@Test
public void testHashcode() throws Exception {
result1 = opaqueLsa10.hashCode();
assertThat(result1, is(notNullValue()));
}
/**
* Tests topLevelValues() method.
*/
@Test
public void testTopLevelValues() throws Exception {
result2 = opaqueLsa10.topLevelValues();
assertThat(result2, is(notNullValue()));
}
}
\ No newline at end of file
/*
* Copyright 2016 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.ospf.protocol.lsa.types;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.Ip4Address;
import org.onosproject.ospf.controller.OspfLsaType;
import org.onosproject.ospf.protocol.lsa.LsaHeader;
import org.onosproject.ospf.protocol.lsa.subtypes.OspfLsaLink;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
/**
* Unit test class for RouterLsa.
*/
public class RouterLsaTest {
private RouterLsa routerLsa;
private int result1;
private OspfLsaLink ospflsaLink;
private byte[] inputArray;
private LsaHeader lsaHeader;
private ChannelBuffer channelBuffer;
private byte[] result2;
private OspfLsaType result3;
@Before
public void setUp() throws Exception {
routerLsa = new RouterLsa();
}
@After
public void tearDown() throws Exception {
routerLsa = null;
ospflsaLink = null;
inputArray = null;
lsaHeader = null;
channelBuffer = null;
result2 = null;
result3 = null;
}
/**
* Tests virtualEndPoint() setter method.
*/
@Test
public void testSetVirtualEndPoint() throws Exception {
routerLsa.setVirtualEndPoint(true);
assertThat(routerLsa, is(notNullValue()));
}
/**
* Tests isAsBoundaryRouter() setter method.
*/
@Test
public void testSetAsBoundaryRouter() throws Exception {
routerLsa.setAsBoundaryRouter(true);
assertThat(routerLsa, is(notNullValue()));
}
/**
* Tests areaBorderRouter() setter method.
*/
@Test
public void testSetAreaBorderRouter() throws Exception {
routerLsa.setAreaBorderRouter(true);
assertThat(routerLsa, is(notNullValue()));
}
/**
* Tests noLink() getter method.
*/
@Test
public void testGetNoLink() throws Exception {
routerLsa.setNoLink(10);
result1 = routerLsa.noLink();
assertThat(result1, is(10));
}
/**
* Tests noLink() setter method.
*/
@Test
public void testSetNoLink() throws Exception {
routerLsa.setNoLink(10);
result1 = routerLsa.noLink();
assertThat(result1, is(10));
}
/**
* Tests addRouterLink() method.
*/
@Test
public void testAddRouterLink() throws Exception {
routerLsa.setNoLink(0);
ospflsaLink = createOspfLsaLink();
routerLsa.addRouterLink(ospflsaLink);
routerLsa.incrementLinkNo();
result1 = routerLsa.noLink();
assertThat(result1, is(1));
}
/**
* Tests readFrom() method.
*/
@Test
public void testReadFrom() throws Exception {
ospflsaLink = createOspfLsaLink();
routerLsa.addRouterLink(ospflsaLink);
inputArray = createByteForRouterLsa();
lsaHeader = createLsaHeader();
routerLsa = new RouterLsa(lsaHeader);
channelBuffer = ChannelBuffers.copiedBuffer(inputArray);
routerLsa.readFrom(channelBuffer);
assertThat(routerLsa, is(notNullValue()));
}
/**
* Tests readFrom() method.
*/
@Test(expected = Exception.class)
public void testReadFrom1() throws Exception {
byte[] temp = {0, 0, 0};
ospflsaLink = createOspfLsaLink();
routerLsa.addRouterLink(ospflsaLink);
inputArray = temp;
lsaHeader = createLsaHeader();
routerLsa = new RouterLsa(lsaHeader);
channelBuffer = ChannelBuffers.copiedBuffer(inputArray);
routerLsa.readFrom(channelBuffer);
assertThat(routerLsa, is(notNullValue()));
}
/**
* Tests asBytes() method.
*/
@Test
public void testAsBytes() throws Exception {
result2 = routerLsa.asBytes();
assertThat(result2, is(notNullValue()));
}
/**
* Tests getLsaBodyAsByteArray() method.
*/
@Test
public void testGetLsaBodyAsByteArray() throws Exception {
routerLsa.setAreaBorderRouter(true);
routerLsa.setVirtualEndPoint(true);
routerLsa.setAreaBorderRouter(true);
ospflsaLink = createOspfLsaLink();
routerLsa.addRouterLink(ospflsaLink);
result2 = routerLsa.getLsaBodyAsByteArray();
assertThat(result2, is(notNullValue()));
}
/**
* Tests getOspfLsaType() getter method.
*/
@Test
public void testGetOspfLsaType() throws Exception {
routerLsa.setLsType(1);
result3 = routerLsa.getOspfLsaType();
assertThat(result3, is(OspfLsaType.ROUTER));
}
/**
* Tests incrementLinkNo() method.
*/
@Test
public void testIncrementLinkNo() throws Exception {
routerLsa.setNoLink(1);
routerLsa.incrementLinkNo();
assertThat(routerLsa.noLink(), is(2));
}
/**
* Tests lsaHeader() method.
*/
@Test
public void testGetLsaHeader() throws Exception {
lsaHeader = (LsaHeader) routerLsa.lsaHeader();
assertThat(lsaHeader, instanceOf(RouterLsa.class));
}
/**
* Tests to string method.
*/
@Test
public void testToString() throws Exception {
assertThat(routerLsa.toString(), is(notNullValue()));
}
/**
* Utility method used by junit methods.
*/
private OspfLsaLink createOspfLsaLink() {
ospflsaLink = new OspfLsaLink();
ospflsaLink.setLinkId("10.226.165.164");
ospflsaLink.setMetric(10);
ospflsaLink.setTos(50);
ospflsaLink.setLinkType(2);
ospflsaLink.setLinkData("10.226.165.170");
return ospflsaLink;
}
/**
* Utility method used by junit methods.
*/
private byte[] createByteForRouterLsa() {
byte[] packet = {2, 1, 1, 52, -64, -88, 56, 1, -64, -88, 56, 1, 0, 100, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, -64,
-88, 56, 1, 0, 10, 1, 1, 0, 0, 0, 40, -64, -88, 56, 1, -64, -88, 56, 1, -64, -88, 56, 1, -64, -88, 56,
1};
return packet;
}
/**
* Utility method used by junit methods.
*/
private LsaHeader createLsaHeader() {
lsaHeader = new LsaHeader();
lsaHeader.setLsType(1);
lsaHeader.setLsPacketLen(48);
lsaHeader.setLsCheckSum(10);
lsaHeader.setAge(4);
lsaHeader.setLinkStateId("10.226.165.164");
lsaHeader.setLsSequenceNo(250);
lsaHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
lsaHeader.setOptions(2);
return lsaHeader;
}
/**
* Tests hashcode() method.
*/
@Test
public void testHashcode() throws Exception {
result1 = routerLsa.hashCode();
assertThat(result1, is(notNullValue()));
}
}
/*
* Copyright 2016 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.ospf.protocol.ospfpacket;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
/**
* Unit test class for OspfMessageReader.
*/
public class OspfMessageReaderTest {
private final byte[] packet1 = {1, 1, 1, 1, 2, 1, 0, 44, -64, -88, -86, 8,
0, 0, 0, 1, 39, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0,
10, 2, 1, 0, 0, 0, 40, -64, -88, -86, 8, 0, 0, 0, 0};
private final byte[] packet2 = {1, 1, 1, 1, 2, 2, 0, 52, -64, -88, -86, 8, 0,
0, 0, 1, -96, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, -36, 2, 7, 65, 119,
-87, 126, 0, 23, 2, 1, 10, 10, 10, 10, 10, 10, 10, 10, -128, 0, 0, 6,
-69, 26, 0, 36};
private final byte[] packet3 = {1, 1, 1, 1, 2, 3, 0, 36, -64, -88, -86, 3, 0,
0, 0, 1, -67, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -64, -88,
-86, 8, -64, -88, -86, 8};
private final byte[] packet4 = {1, 1, 1, 1, 2, 4, 1, 36, -64, -88, -86, 3, 0,
0, 0, 1, 54, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0,
2, 2, 1, -64, -88, -86, 3, -64, -88, -86, 3, -128, 0
, 0, 1, 58, -100, 0, 48, 2, 0, 0, 2, -64, -88, -86
, 0, -1, -1, -1, 0, 3, 0, 0, 10, -64, -88, -86, 0,
-1, -1, -1, 0, 3, 0, 0, 10, 0, 3, 2, 5, 80, -44,
16, 0, -64, -88, -86, 2, -128, 0, 0, 1, 42, 73, 0,
36, -1, -1, -1, -1, -128, 0, 0, 20, 0, 0, 0, 0, 0,
0, 0, 0, 0, 3, 2, 5, -108, 121, -85, 0, -64, -88,
-86, 2, -128, 0, 0, 1, 52, -91, 0, 36, -1, -1, -1,
0, -128, 0, 0, 20, -64, -88, -86, 1, 0, 0, 0, 0, 0,
3, 2, 5, -64, -126, 120, 0, -64, -88, -86, 2, -128, 0,
0, 1, -45, 25, 0, 36, -1, -1, -1, 0, -128, 0, 0, 20,
0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 5, -64, -88, 0, 0,
-64, -88, -86, 2, -128, 0, 0, 1, 55, 8, 0, 36, -1, -1
, -1, 0, -128, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3, 2, 5, -64, -88, 1, 0, -64, -88, -86, 2, -128, 0, 0,
1, 44, 18, 0, 36, -1, -1, -1, 0, -128, 0, 0, 20, 0, 0,
0, 0, 0, 0, 0, 0, 0, 3, 2, 5, -64, -88, -84, 0, -64,
-88, -86, 2, -128, 0, 0, 1, 51, 65, 0, 36, -1, -1, -1, 0,
-128, 0, 0, 20, -64, -88, -86, 10, 0, 0, 0, 0};
private final byte[] packet5 = {1, 1, 1, 1, 2, 5, 0, 44, -64, -88, -86, 8, 0, 0,
0, 1, -30, -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 16, 2, 1, -64, -88, -86,
2, -64, -88, -86, 2, -128, 0, 0, 1, 74, -114, 0, 48};
private OspfMessageReader ospfMessageReader;
private ChannelBuffer channelBuffer;
@Before
public void setUp() throws Exception {
ospfMessageReader = new OspfMessageReader();
}
@After
public void tearDown() throws Exception {
ospfMessageReader = null;
channelBuffer = null;
}
/**
* Tests readFromBuffer() method.
*/
@Test
public void testReadFromBuffer() throws Exception {
channelBuffer = ChannelBuffers.copiedBuffer(packet1);
ospfMessageReader.readFromBuffer(channelBuffer);
channelBuffer = ChannelBuffers.copiedBuffer(packet2);
ospfMessageReader.readFromBuffer(channelBuffer);
channelBuffer = ChannelBuffers.copiedBuffer(packet3);
ospfMessageReader.readFromBuffer(channelBuffer);
channelBuffer = ChannelBuffers.copiedBuffer(packet4);
ospfMessageReader.readFromBuffer(channelBuffer);
channelBuffer = ChannelBuffers.copiedBuffer(packet5);
ospfMessageReader.readFromBuffer(channelBuffer);
assertThat(ospfMessageReader, is(notNullValue()));
}
}
/*
* Copyright 2016 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.ospf.protocol.ospfpacket;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.Ip4Address;
import org.onosproject.ospf.protocol.ospfpacket.types.DdPacket;
import org.onosproject.ospf.protocol.ospfpacket.types.HelloPacket;
import org.onosproject.ospf.protocol.ospfpacket.types.LsAcknowledge;
import org.onosproject.ospf.protocol.ospfpacket.types.LsRequest;
import org.onosproject.ospf.protocol.ospfpacket.types.LsUpdate;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
/**
* Unit test class for OspfMessageWriter.
*/
public class OspfMessageWriterTest {
private OspfMessageWriter ospfMessageWriter;
private HelloPacket helloPacket;
private DdPacket ddPacket;
private LsAcknowledge lsAck;
private LsRequest lsReq;
private LsUpdate lsUpdate;
@Before
public void setUp() throws Exception {
ospfMessageWriter = new OspfMessageWriter();
}
@After
public void tearDown() throws Exception {
ospfMessageWriter = null;
helloPacket = null;
ddPacket = null;
lsAck = null;
lsReq = null;
lsUpdate = null;
}
/**
* Tests writeToBuffer() method.
*/
@Test
public void testWriteToBuffer() throws Exception {
helloPacket = new HelloPacket();
helloPacket.setAuthType(1);
helloPacket.setOspftype(1);
helloPacket.setRouterId(Ip4Address.valueOf("10.226.165.164"));
helloPacket.setAreaId(Ip4Address.valueOf("10.226.165.100"));
helloPacket.setChecksum(201);
helloPacket.setAuthentication(2);
helloPacket.setOspfPacLength(48);
helloPacket.setOspfVer(2);
helloPacket.setNetworkMask(Ip4Address.valueOf("255.255.255.255"));
helloPacket.setOptions(2); //not setting now
helloPacket.setHelloInterval(10);
helloPacket.setRouterPriority(1);
helloPacket.setRouterDeadInterval(40);
helloPacket.setDr(Ip4Address.valueOf("1.1.1.1"));
helloPacket.setBdr(Ip4Address.valueOf("2.2.2.2"));
helloPacket.addNeighbor(Ip4Address.valueOf("8.8.8.8"));
helloPacket.setDestinationIp(Ip4Address.valueOf("5.5.5.5"));
ospfMessageWriter.writeToBuffer(helloPacket, 7, 1);
assertThat(ospfMessageWriter, is(notNullValue()));
}
@Test(expected = Exception.class)
public void testWriteToBuffer1() throws Exception {
ddPacket = new DdPacket();
ddPacket.setAuthType(1);
ddPacket.setOspftype(2);
ddPacket.setRouterId(Ip4Address.valueOf("10.226.165.164"));
ddPacket.setAreaId(Ip4Address.valueOf("10.226.165.100"));
ddPacket.setChecksum(201);
ddPacket.setAuthentication(2);
ddPacket.setOspfPacLength(48);
ddPacket.setOspfVer(2);
ospfMessageWriter.writeToBuffer(ddPacket, 1, 1);
assertThat(ospfMessageWriter, is(notNullValue()));
}
@Test(expected = Exception.class)
public void testWriteToBuffer2() throws Exception {
lsAck = new LsAcknowledge();
lsAck.setAuthType(1);
lsAck.setOspftype(5);
lsAck.setRouterId(Ip4Address.valueOf("10.226.165.164"));
lsAck.setAreaId(Ip4Address.valueOf("10.226.165.100"));
lsAck.setChecksum(201);
lsAck.setAuthentication(2);
lsAck.setOspfPacLength(48);
lsAck.setOspfVer(2);
ospfMessageWriter.writeToBuffer(lsAck, 1, 1);
assertThat(ospfMessageWriter, is(notNullValue()));
}
@Test(expected = Exception.class)
public void testWriteToBuffer3() throws Exception {
lsReq = new LsRequest();
lsReq.setAuthType(1);
lsReq.setOspftype(3);
lsReq.setRouterId(Ip4Address.valueOf("10.226.165.164"));
lsReq.setAreaId(Ip4Address.valueOf("10.226.165.100"));
lsReq.setChecksum(201);
lsReq.setAuthentication(2);
lsReq.setOspfPacLength(48);
lsReq.setOspfVer(2);
ospfMessageWriter.writeToBuffer(lsReq, 1, 1);
assertThat(ospfMessageWriter, is(notNullValue()));
}
@Test(expected = Exception.class)
public void testWriteToBuffer4() throws Exception {
lsUpdate = new LsUpdate();
lsUpdate.setAuthType(1);
lsUpdate.setOspftype(3);
lsUpdate.setRouterId(Ip4Address.valueOf("10.226.165.164"));
lsUpdate.setAreaId(Ip4Address.valueOf("10.226.165.100"));
lsUpdate.setChecksum(201);
lsUpdate.setAuthentication(2);
lsUpdate.setOspfPacLength(48);
lsUpdate.setOspfVer(2);
ospfMessageWriter.writeToBuffer(lsUpdate, 1, 1);
assertThat(ospfMessageWriter, is(notNullValue()));
}
/**
* Tests writeToBuffer() method.
*/
@Test(expected = Exception.class)
public void testWriteToBuffer5() throws Exception {
lsAck = new LsAcknowledge();
lsAck.setAuthType(1);
lsAck.setOspftype(5);
lsAck.setRouterId(Ip4Address.valueOf("10.226.165.164"));
lsAck.setAreaId(Ip4Address.valueOf("10.226.165.100"));
lsAck.setChecksum(201);
lsAck.setAuthentication(2);
lsAck.setOspfPacLength(48);
lsAck.setOspfVer(2);
ospfMessageWriter.writeToBuffer(lsAck, 1, 1);
}
}
\ No newline at end of file
/*
* Copyright 2016 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.ospf.protocol.ospfpacket.types;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.Ip4Address;
import org.onosproject.ospf.controller.OspfLsa;
import org.onosproject.ospf.protocol.lsa.LsaHeader;
import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
import org.onosproject.ospf.protocol.lsa.types.AsbrSummaryLsa;
import org.onosproject.ospf.protocol.lsa.types.ExternalLsa;
import org.onosproject.ospf.protocol.lsa.types.NetworkLsa;
import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa10;
import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa11;
import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa9;
import org.onosproject.ospf.protocol.lsa.types.RouterLsa;
import org.onosproject.ospf.protocol.lsa.types.SummaryLsa;
import org.onosproject.ospf.protocol.ospfpacket.OspfPacketHeader;
import org.onosproject.ospf.protocol.util.OspfPacketType;
import java.util.List;
import java.util.Vector;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.assertThat;
/**
* Unit test class for LsUpdate.
*/
public class LsUpdateTest {
private final byte[] packet1 = {0, 0, 0, 2, 0, 10, 2, 1, 7, 7, 7, 7, 7, 7, 7, 7,
-128, 0, 0, 2, 46, -126, 0, 48, 0, 0, 0, 2, 1, 1, 1, 1, 10, 10, 10, 7, 1,
0, 0, 10, 10, 10, 10, 0, -1, -1, -1, 0, 3, 0, 0, 10, 0, 10, 66, 10, 1, 0,
0, 1, 7, 7, 7, 7, -128, 0, 0, 1, -64, 79, 0, 116, 0, 1, 0, 4, 0, 0, 0, 0,
0, 2, 0, 84, 0, 1, 0, 1, 1, 0, 0, 0, 0, 2, 0, 4, 10, 10, 10, 0, 0, 5, 0,
4, 0, 0, 0, 0, 0, 6, 0, 4, 73, -104, -106, -128, 0, 7, 0, 4, 73, -104, -106,
-128, 0, 8, 0, 32, 73, -104, -106, -128, 73, -104, -106, -128, 73, -104, -106,
-128, 73, -104, -106, -128, 73, -104, -106, -128, 73, -104, -106, -128, 73,
-104, -106, -128, 73, -104, -106, -128, 0, 9, 0, 4, 0, 0, 0, 0};
private final byte[] packet3 = {0, 0, 0, 1, 0, 100, 2, 10, 1, 0, 0, 1, 9, 9, 9, 9,
-128, 0, 0, 1, -7, 62, 0, -124, 0, 2, 0, 108, 0, 1, 0, 1, 2, 0, 0, 0, 0, 2,
0, 4, -64, -88, 7, -91, 0, 3, 0, 4, -64, -88, 7, -91, 0, 4, 0, 4, 0, 0, 0,
0, 0, 5, 0, 4, 0, 0, 0, 1, 0, 6, 0, 4, 0, 0, 0, 0, 0, 7, 0, 4, 0, 0, 0, 0,
0, 8, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 0, 0, 0, 0, -128, 2, 0, 4, 0,
0, 0, 1};
private final byte[] packet2 = {0, 0,
0, 1, 0, 1, 2, 2, -64, -88,
-86, 8, -64, -88, -86, 8, -128, 0, 0, 1, 55, -73, 0, 32, -1, -1, -1, 0, -64,
-88, -86, 3, -64, -88, -86, 8};
private final byte[] packet4 = {0, 0, 0, 1, 0, 100, 2, 9, 1, 0, 0, 1, 9, 9, 9, 9, -128,
0, 0, 1, -7, 62, 0, -124, 0, 2, 0, 108, 0, 1, 0, 1, 2, 0, 0, 0, 0, 2, 0, 4, -64,
-88, 7, -91, 0, 3, 0, 4, -64, -88, 7, -91, 0, 4, 0, 4, 0, 0, 0, 0, 0, 5, 0, 4, 0,
0, 0, 1, 0, 6, 0, 4, 0, 0, 0, 0, 0, 7, 0, 4, 0, 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 9, 0, 4, 0, 0, 0, 0, -128, 2, 0, 4, 0, 0, 0, 1};
private final byte[] packet5 = {0, 0, 0, 1, 0, 100, 2, 11, 1, 0, 0, 1, 9, 9, 9, 9, -128, 0,
0, 1, -7, 62, 0, -124, 0, 2, 0, 108, 0, 1, 0, 1, 2, 0, 0, 0, 0, 2, 0, 4, -64, -88,
7, -91, 0, 3, 0, 4, -64, -88, 7, -91, 0, 4, 0, 4, 0, 0, 0, 0, 0, 5, 0, 4, 0, 0, 0,
1, 0, 6, 0, 4, 0, 0, 0, 0, 0, 7, 0, 4, 0, 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9, 0, 4, 0, 0, 0, 0, -128, 2, 0, 4, 0, 0, 0, 1};
private final byte[] packet6 = {0, 0, 0, 1, 0, 100, 2, 3, 1, 0, 0, 1, 9, 9, 9, 9, -128,
0, 0, 1, -7, 62, 0, -124, 0, 2, 0, 108, 0, 1, 0, 1, 2, 0, 0, 0, 0, 2, 0, 4, -64,
-88, 7, -91, 0, 3, 0, 4, -64, -88, 7, -91, 0, 4, 0, 4, 0, 0, 0, 0, 0, 5, 0, 4,
0, 0, 0, 1, 0, 6, 0, 4, 0, 0, 0, 0, 0, 7, 0, 4, 0, 0, 0, 0, 0, 8, 0, 32, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 9, 0, 4, 0, 0, 0, 0, -128, 2, 0, 4, 0, 0, 0, 1};
private final byte[] packet7 = {0, 0, 0, 1, 0, 100, 2, 4, 1, 0, 0, 1, 9, 9, 9, 9, -128,
0, 0, 1, -7, 62, 0, -124, 0, 2, 0, 108, 0, 1, 0, 1, 2, 0, 0, 0, 0, 2, 0, 4, -64,
-88, 7, -91, 0, 3, 0, 4, -64, -88, 7, -91, 0, 4, 0, 4, 0, 0, 0, 0, 0, 5, 0, 4, 0,
0, 0, 1, 0, 6, 0, 4, 0, 0, 0, 0, 0, 7, 0, 4, 0, 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 9, 0, 4, 0, 0, 0, 0, -128, 2, 0, 4, 0, 0, 0, 1};
private final byte[] packet8 = {0, 0, 0, 2, 1, 4, 2, 1, 5, 5, 5, 5, 5, 5, 5, 5, -128, 0, 0,
4, -39, -84, 0, 36, 1, 0, 0, 1, -64, -88, 7, 90, -64, -88, 7, 92, 2, 0, 0, 10, 1, 4,
2, 4, -34, -34, -34, -34, 5, 5, 5, 5, -128, 0, 0, 1, 31, -93, 0, 28, 0, 0, 0, 0, 0,
0, 0, 10};
private LsUpdate lsUpdate;
private RouterLsa ospflsa;
private NetworkLsa ospflsa1;
private SummaryLsa ospflsa2;
private AsbrSummaryLsa ospflsa3;
private ExternalLsa ospflsa4;
private Vector<OspfLsa> listLSA = new Vector();
private List lsa;
private int result;
private OspfPacketType ospfMessageType;
private OspfPacketHeader ospfPacketHeader;
private byte[] result1;
private ChannelBuffer channelBuffer;
private OpaqueLsa10 opaqueLsa10;
private OpaqueLsa9 opaqueLsa9;
private OpaqueLsa11 opaqueLsa11;
@Before
public void setUp() throws Exception {
lsUpdate = new LsUpdate();
ospflsa = new RouterLsa();
lsUpdate.setAuthType(1);
lsUpdate.setOspftype(2);
lsUpdate.setRouterId(Ip4Address.valueOf("10.226.165.164"));
lsUpdate.setAreaId(Ip4Address.valueOf("10.226.165.100"));
lsUpdate.setChecksum(201);
lsUpdate.setAuthentication(2);
lsUpdate.setOspfPacLength(48);
lsUpdate.setOspfVer(2);
ospflsa.setLsType(1);
lsUpdate.addLsa(ospflsa);
ospflsa1 = new NetworkLsa();
ospflsa1.setNetworkMask(Ip4Address.valueOf("10.226.165.164"));
ospflsa1.setLsType(2);
lsUpdate.addLsa(ospflsa1);
ospflsa2 = new SummaryLsa(new LsaHeader());
ospflsa2.setLsType(3);
lsUpdate.addLsa(ospflsa2);
ospflsa3 = new AsbrSummaryLsa(new LsaHeader());
ospflsa3.setNetworkMask(Ip4Address.valueOf("10.226.165.164"));
ospflsa3.setLsType(4);
lsUpdate.addLsa(ospflsa3);
ospflsa4 = new ExternalLsa(new LsaHeader());
ospflsa4.setLsType(5);
lsUpdate.addLsa(ospflsa4);
}
@After
public void tearDown() throws Exception {
lsUpdate = null;
ospflsa = null;
ospflsa1 = null;
ospflsa2 = null;
ospflsa3 = null;
ospflsa4 = null;
listLSA.clear();
lsa = null;
ospfMessageType = null;
ospfPacketHeader = null;
result1 = null;
channelBuffer = null;
opaqueLsa9 = null;
opaqueLsa10 = null;
opaqueLsa11 = null;
}
/**
* Tests getLsaList() getter method.
*/
@Test
public void testGetListLsa() throws Exception {
lsUpdate.addLsa(ospflsa);
lsUpdate.addLsa(ospflsa);
lsa = lsUpdate.getLsaList();
assertThat(lsa, is(notNullValue()));
assertThat(lsa.size(), is(5));
}
/**
* Tests addLsa() method.
*/
@Test
public void testAddLsa() throws Exception {
lsUpdate.addLsa(ospflsa);
assertThat(lsUpdate, is(notNullValue()));
}
/**
* Tests noLsa() getter method.
*/
@Test
public void testGetNoLsa() throws Exception {
lsUpdate.setNumberOfLsa(5);
result = lsUpdate.noLsa();
assertThat(result, is(notNullValue()));
assertThat(result, is(5));
}
/**
* Tests noLsa() setter method.
*/
@Test
public void testSetNoLsa() throws Exception {
lsUpdate.setNumberOfLsa(5);
result = lsUpdate.noLsa();
assertThat(result, is(notNullValue()));
assertThat(result, is(5));
}
/**
* Tests ospfMessageType() getter method.
*/
@Test
public void testGetOspfMessageType() throws Exception {
ospfMessageType = lsUpdate.ospfMessageType();
assertThat(ospfMessageType, is(OspfPacketType.LSUPDATE));
}
/**
* Tests readFrom() method.
*/
@Test
public void testReadFrom() throws Exception {
ospfPacketHeader = new OspfPacketHeader();
ospfPacketHeader.setAreaId(Ip4Address.valueOf("1.1.1.1"));
ospfPacketHeader.setAuthentication(0);
ospfPacketHeader.setAuthType(0);
ospfPacketHeader.setChecksum(12345);
ospfPacketHeader.setDestinationIp(Ip4Address.valueOf("10.10.10.10"));
ospfPacketHeader.setOspfPacLength(56);
ospfPacketHeader.setOspftype(4);
ospfPacketHeader.setOspfVer(2);
ospfPacketHeader.setRouterId(Ip4Address.valueOf("2.2.2.2"));
ospfPacketHeader.setSourceIp(Ip4Address.valueOf("3.3.3.3"));
lsUpdate = new LsUpdate(ospfPacketHeader);
result1 = createLsUpdatePacket();
channelBuffer = ChannelBuffers.copiedBuffer(result1);
lsUpdate.readFrom(channelBuffer);
channelBuffer = ChannelBuffers.copiedBuffer(packet1);
lsUpdate.readFrom(channelBuffer);
channelBuffer = ChannelBuffers.copiedBuffer(packet2);
lsUpdate.readFrom(channelBuffer);
channelBuffer = ChannelBuffers.copiedBuffer(packet3);
lsUpdate.readFrom(channelBuffer);
channelBuffer = ChannelBuffers.copiedBuffer(packet4);
lsUpdate.readFrom(channelBuffer);
channelBuffer = ChannelBuffers.copiedBuffer(packet5);
lsUpdate.readFrom(channelBuffer);
channelBuffer = ChannelBuffers.copiedBuffer(packet6);
lsUpdate.readFrom(channelBuffer);
channelBuffer = ChannelBuffers.copiedBuffer(packet7);
lsUpdate.readFrom(channelBuffer);
channelBuffer = ChannelBuffers.copiedBuffer(packet8);
lsUpdate.readFrom(channelBuffer);
assertThat(lsUpdate, is(notNullValue()));
assertThat(lsUpdate.ospfMessageType(), is(OspfPacketType.LSUPDATE));
}
/**
* Tests asBytes() method.
*/
@Test
public void testAsBytes() throws Exception {
result1 = lsUpdate.asBytes();
assertThat(result1, is(notNullValue()));
}
/**
* Tests getLsuHeaderAsByteArray() method.
*/
@Test
public void testGetLsuHeaderAsByteArray() throws Exception {
result1 = lsUpdate.getLsuHeaderAsByteArray();
assertThat(result1, is(notNullValue()));
}
/**
* Tests getLsuBodyAsByteArray() method.
*/
@Test
public void testGetLsuBodyAsByteArray() throws Exception {
lsUpdate.setNumberOfLsa(8);
lsUpdate.addLsa(ospflsa3);
opaqueLsa9 = new OpaqueLsa9(new OpaqueLsaHeader());
opaqueLsa9.setLsType(9);
lsUpdate.addLsa(opaqueLsa9);
opaqueLsa10 = new OpaqueLsa10(new OpaqueLsaHeader());
opaqueLsa10.setLsType(10);
lsUpdate.addLsa(opaqueLsa10);
opaqueLsa11 = new OpaqueLsa11(new OpaqueLsaHeader());
opaqueLsa10.setLsType(11);
lsUpdate.addLsa(opaqueLsa11);
result1 = lsUpdate.getLsuBodyAsByteArray();
assertThat(result1, is(notNullValue()));
}
@Test
public void testGetLsuBodyAsByteArray1() throws Exception {
lsUpdate.setNumberOfLsa(8);
opaqueLsa10 = new OpaqueLsa10(new OpaqueLsaHeader());
opaqueLsa10.setLsType(10);
lsUpdate.addLsa(opaqueLsa10);
assertThat(result1, is(nullValue()));
}
@Test
public void testGetLsuBodyAsByteArray2() throws Exception {
opaqueLsa11 = new OpaqueLsa11(new OpaqueLsaHeader());
opaqueLsa11.setLsType(11);
lsUpdate.addLsa(opaqueLsa11);
result1 = lsUpdate.getLsuBodyAsByteArray();
assertThat(result1, is(notNullValue()));
}
/**
* Tests to string method.
*/
@Test
public void testToString() throws Exception {
assertThat(lsUpdate.toString(), is(notNullValue()));
}
/**
* Utility method used by junit methods.
*/
private byte[] createLsUpdatePacket() {
byte[] lsUpdatePacket = {0, 0, 0, 7, 0, 2, 2,
1, -64, -88, -86, 3, -64, -88, -86, 3, -128, 0, 0, 1, 58,
-100, 0, 48, 2, 0, 0, 2, -64, -88, -86, 0, -1, -1, -1, 0,
3, 0, 0, 10, -64, -88, -86, 0, -1, -1, -1, 0, 3, 0, 0, 10
, 0, 3, 2, 5, 80, -44, 16, 0, -64, -88, -86, 2, -128, 0, 0
, 1, 42, 73, 0, 36, -1, -1, -1, -1, -128, 0, 0, 20, 0, 0,
0, 0, 0, 0, 0, 0, 0, 3, 2, 5, -108, 121, -85, 0, -64, -88
, -86, 2, -128, 0, 0, 1, 52, -91, 0, 36, -1, -1, -1, 0,
-128, 0, 0, 20, -64, -88, -86, 1, 0, 0, 0, 0, 0, 3, 2, 5
, -64, -126, 120, 0, -64, -88, -86, 2, -128, 0, 0, 1, -45,
25, 0, 36, -1, -1, -1, 0, -128, 0, 0, 20, 0, 0, 0, 0, 0,
0, 0, 0, 0, 3, 2, 5, -64, -88, 0, 0, -64, -88, -86, 2,
-128, 0, 0, 1, 55, 8, 0, 36, -1, -1, -1, 0, -128, 0, 0,
20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 5, -64, -88, 1, 0,
-64, -88, -86, 2, -128, 0, 0, 1, 44, 18, 0, 36, -1, -1, -1, 0, -128, 0,
0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 5, -64, -88, -84, 0, -64, -88,
-86, 2, -128, 0, 0, 1, 51, 65, 0, 36, -1, -1, -1, 0, -128, 0, 0, 20, -64,
-88, -86, 10, 0, 0, 0, 0};
return lsUpdatePacket;
}
}
\ No newline at end of file
/*
* Copyright 2016 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.ospf.protocol.util;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.Ip4Address;
import org.onosproject.ospf.protocol.lsa.LsaHeader;
import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
import org.onosproject.ospf.protocol.lsa.types.AsbrSummaryLsa;
import org.onosproject.ospf.protocol.lsa.types.ExternalLsa;
import org.onosproject.ospf.protocol.lsa.types.NetworkLsa;
import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa10;
import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa11;
import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa9;
import org.onosproject.ospf.protocol.lsa.types.RouterLsa;
import org.onosproject.ospf.protocol.lsa.types.SummaryLsa;
import org.onosproject.ospf.protocol.ospfpacket.types.DdPacket;
import org.onosproject.ospf.protocol.ospfpacket.types.HelloPacket;
import org.onosproject.ospf.protocol.ospfpacket.types.LsAcknowledge;
import org.onosproject.ospf.protocol.ospfpacket.types.LsRequest;
import org.onosproject.ospf.protocol.ospfpacket.types.LsUpdate;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
/**
* Unit test class for ChecksumCalculator.
*/
public class ChecksumCalculatorTest {
private final int ospfChecksumPos1 = 12;
private final int ospfChecksumPos2 = 13;
private final int lsaChecksumPos1 = 16;
private final int lsaChecksumPos2 = 17;
private final byte[] updatePacket = {1, 1, 1, 1, 2, 4, 0, -96, 9, 9, 9, 9, 5, 5, 5, 5, 62, 125,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 100, 2, 10, 1, 0, 0, 1, 9, 9, 9, 9, -128,
0, 0, 1, -7, 62, 0, -124, 0, 2, 0, 108, 0, 1, 0, 1, 2, 0, 0, 0, 0, 2, 0, 4, -64, -88,
7, -91, 0, 3, 0, 4, -64, -88, 7, -91, 0, 4, 0, 4, 0, 0, 0, 0, 0, 5, 0, 4, 0, 0, 0, 1,
0, 6, 0, 4, 0, 0, 0, 0, 0, 7, 0, 4, 0, 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
0, 4, 0, 0, 0, 0, -128, 2, 0, 4, 0, 0, 0, 1};
private final byte[] helloPacket = {2, 1, 0, 44, -64, -88, -86, 8, 0, 0, 0, 1, 39, 59,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 10, 2, 1, 0, 0, 0, 40, -64, -88,
-86, 8, 0, 0, 0, 0};
private final byte[] rlsa = {14, 16, 2, 1, -64, -88, -86, 2, -64, -88, -86, 2, -128, 0,
0, 1, 74, -114, 0, 48, 2, 0, 0, 2, -64, -88, -86, 0, -1, -1, -1, 0, 3, 0, 0, 10,
-64, -88, -86, 0, -1, -1, -1, 0, 3, 0, 0, 10};
private ChecksumCalculator checksumCalculator;
private boolean validate;
private HelloPacket hello;
private LsUpdate message;
private DdPacket message1;
private LsRequest message2;
private RouterLsa router;
private LsAcknowledge lsack;
private ExternalLsa external;
private NetworkLsa external1;
private SummaryLsa external2;
private AsbrSummaryLsa external3;
private OpaqueLsa9 external4;
private OpaqueLsa10 external5;
private OpaqueLsa11 external6;
private byte[] result;
@Before
public void setUp() throws Exception {
checksumCalculator = new ChecksumCalculator();
}
@After
public void tearDown() throws Exception {
checksumCalculator = null;
hello = null;
message = null;
message1 = null;
message2 = null;
router = null;
lsack = null;
external = null;
external1 = null;
external2 = null;
external3 = null;
result = null;
}
/**
* Tests convertToSixteenBits() method.
*/
@Test
public void testConvertToSixteenBits() throws Exception {
int num = checksumCalculator.convertToSixteenBits("16cdd");
assertThat(num, is(27870));
}
/**
* Tests isValidOspfCheckSum() method.
*/
@Test
public void testIsValidOspfCheckSum() throws Exception {
hello = new HelloPacket();
hello.setOspfVer(2);
hello.setOspftype(1);
hello.setOspfPacLength(172);
hello.setRouterId(Ip4Address.valueOf("192.168.170.3"));
hello.setAreaId(Ip4Address.valueOf("0.0.0.1"));
hello.setChecksum(5537);
hello.setAuthType(0);
hello.setAuthentication(0);
validate = checksumCalculator.isValidOspfCheckSum(hello, ospfChecksumPos1, ospfChecksumPos2);
assertThat(validate, is(false));
lsack = new LsAcknowledge();
lsack.setOspfVer(2);
lsack.setOspftype(5);
lsack.setOspfPacLength(172);
lsack.setRouterId(Ip4Address.valueOf("192.168.170.3"));
lsack.setAreaId(Ip4Address.valueOf("0.0.0.1"));
lsack.setChecksum(37537);
lsack.setAuthType(0);
lsack.setAuthentication(0);
validate = checksumCalculator.isValidOspfCheckSum(lsack, ospfChecksumPos1, ospfChecksumPos2);
assertThat(validate, is(true));
message = new LsUpdate();
message.setOspfVer(2);
message.setOspftype(5);
message.setOspfPacLength(172);
message.setRouterId(Ip4Address.valueOf("192.168.170.3"));
message.setAreaId(Ip4Address.valueOf("0.0.0.1"));
message.setChecksum(37537);
message.setAuthType(0);
message.setAuthentication(0);
validate = checksumCalculator.isValidOspfCheckSum(message, ospfChecksumPos1, ospfChecksumPos2);
assertThat(validate, is(true));
message1 = new DdPacket();
message1.setOspfVer(2);
message1.setOspftype(5);
message1.setOspfPacLength(172);
message1.setRouterId(Ip4Address.valueOf("192.168.170.3"));
message1.setAreaId(Ip4Address.valueOf("0.0.0.1"));
message1.setChecksum(37537);
message1.setAuthType(0);
message1.setAuthentication(0);
validate = checksumCalculator.isValidOspfCheckSum(message1, ospfChecksumPos1, ospfChecksumPos2);
assertThat(validate, is(true));
message2 = new LsRequest();
message2.setOspfVer(2);
message2.setOspftype(5);
message2.setOspfPacLength(172);
message2.setRouterId(Ip4Address.valueOf("192.168.170.3"));
message2.setAreaId(Ip4Address.valueOf("0.0.0.1"));
message2.setChecksum(37537);
message2.setAuthType(0);
message2.setAuthentication(0);
validate = checksumCalculator.isValidOspfCheckSum(message2, ospfChecksumPos1, ospfChecksumPos2);
assertThat(validate, is(true));
}
/**
* Tests isValidLsaCheckSum() method.
*/
@Test
public void testIsValidLsaCheckSum() throws Exception {
router = new RouterLsa();
router.setAge(1);
router.setOptions(2);
router.setLsType(1);
router.setLinkStateId("192.168.170.3");
router.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.3"));
router.setLsSequenceNo(2147483649L);
router.setLsCheckSum(49499);
router.setLsPacketLen(48);
validate = checksumCalculator.isValidLsaCheckSum(router, router.lsType(), lsaChecksumPos1, lsaChecksumPos2);
assertThat(validate, is(true));
}
/**
* Tests isValidLsaCheckSum() method.
*/
@Test
public void testIsValidLsaCheckSum4() throws Exception {
external = new ExternalLsa(new LsaHeader());
external.setAge(2);
external.setOptions(2);
external.setLsType(5);
external.setLinkStateId("80.212.16.0");
external.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
external.setLsSequenceNo(2147483649L);
external.setLsCheckSum(25125);
external.setLsPacketLen(36);
validate = checksumCalculator.isValidLsaCheckSum(external, external.lsType(), lsaChecksumPos1, lsaChecksumPos2);
assertThat(validate, is(false));
}
/**
* Tests isValidLsaCheckSum() method.
*/
@Test(expected = Exception.class)
public void testIsValidLsaCheckSum5() throws Exception {
external1 = new NetworkLsa();
external1.setAge(2);
external1.setOptions(2);
external1.setLsType(2);
external1.setLinkStateId("80.212.16.0");
external1.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
external1.setLsSequenceNo(2147483649L);
external1.setLsCheckSum(25125);
external1.setLsPacketLen(36);
validate = checksumCalculator.isValidLsaCheckSum(external1, external1.lsType(),
lsaChecksumPos1, lsaChecksumPos2);
assertThat(validate, is(false));
}
/**
* Tests isValidLsaCheckSum() method.
*/
@Test
public void testIsValidLsaCheckSum6() throws Exception {
external2 = new SummaryLsa(new LsaHeader());
external2.setAge(2);
external2.setOptions(2);
external2.setLsType(3);
external2.setLinkStateId("80.212.16.0");
external2.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
external2.setLsSequenceNo(2147483649L);
external2.setLsCheckSum(25125);
external2.setLsPacketLen(36);
validate = checksumCalculator.isValidLsaCheckSum(external2, external2.lsType(),
lsaChecksumPos1, lsaChecksumPos2);
assertThat(validate, is(false));
}
/**
* Tests isValidLsaCheckSum() method.
*/
@Test(expected = Exception.class)
public void testIsValidLsaCheckSum7() throws Exception {
external3 = new AsbrSummaryLsa(new LsaHeader());
external3.setAge(2);
external3.setOptions(2);
external3.setLsType(4);
external3.setLinkStateId("80.212.16.0");
external3.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
external3.setLsSequenceNo(2147483649L);
external3.setLsCheckSum(25125);
external3.setLsPacketLen(36);
validate = checksumCalculator.isValidLsaCheckSum(external3, external3.lsType(),
lsaChecksumPos1, lsaChecksumPos2);
assertThat(validate, is(false));
}
/**
* Tests isValidLsaCheckSum() method.
*/
@Test(expected = Exception.class)
public void testIsValidLsaCheckSum1() throws Exception {
external4 = new OpaqueLsa9(new OpaqueLsaHeader());
external4.setAge(2);
external4.setOptions(2);
external4.setLsType(9);
external4.setLinkStateId("80.212.16.0");
external4.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
external4.setLsSequenceNo(2147483649L);
external4.setLsCheckSum(25125);
external4.setLsPacketLen(36);
validate = checksumCalculator.isValidLsaCheckSum(external4, external4.lsType(),
lsaChecksumPos1, lsaChecksumPos2);
assertThat(validate, is(false));
}
/**
* Tests isValidLsaCheckSum() method.
*/
@Test(expected = Exception.class)
public void testIsValidLsaCheckSum2() throws Exception {
external5 = new OpaqueLsa10(new OpaqueLsaHeader());
external5.setAge(2);
external5.setOptions(2);
external5.setLsType(10);
external5.setLinkStateId("80.212.16.0");
external5.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
external5.setLsSequenceNo(2147483649L);
external5.setLsCheckSum(25125);
external5.setLsPacketLen(36);
validate = checksumCalculator.isValidLsaCheckSum(external5, external5.lsType(),
lsaChecksumPos1, lsaChecksumPos2);
assertThat(validate, is(false));
}
/**
* Tests isValidLsaCheckSum() method.
*/
@Test(expected = Exception.class)
public void testIsValidLsaCheckSum3() throws Exception {
external6 = new OpaqueLsa11(new OpaqueLsaHeader());
external6.setAge(2);
external6.setOptions(2);
external6.setLsType(10);
external6.setLinkStateId("80.212.16.0");
external6.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
external6.setLsSequenceNo(2147483649L);
external6.setLsCheckSum(25125);
external6.setLsPacketLen(36);
validate = checksumCalculator.isValidLsaCheckSum(external6, external6.lsType(),
lsaChecksumPos1, lsaChecksumPos2);
assertThat(validate, is(false));
}
/**
* Tests validateLsaCheckSum() method.
*/
@Test
public void testValidateLsaCheckSum() throws Exception {
assertThat(checksumCalculator.validateLsaCheckSum(rlsa, lsaChecksumPos1,
lsaChecksumPos2), is(true));
}
/**
* Tests validateOspfCheckSum() method.
*/
@Test
public void testValidateOspfCheckSum() throws Exception {
assertThat(checksumCalculator.validateOspfCheckSum(helloPacket, ospfChecksumPos1,
ospfChecksumPos2), is(true));
}
/**
* Tests calculateLsaChecksum() method.
*/
@Test
public void testCalculateLsaChecksum() throws Exception {
result = checksumCalculator.calculateLsaChecksum(rlsa, lsaChecksumPos1, lsaChecksumPos2);
assertThat(result, is(notNullValue()));
}
/**
* Tests calculateOspfCheckSum() method.
*/
@Test
public void testCalculateOspfCheckSum() throws Exception {
result = checksumCalculator.calculateOspfCheckSum(helloPacket, ospfChecksumPos1,
ospfChecksumPos2);
assertThat(result, is(notNullValue()));
result = checksumCalculator.calculateOspfCheckSum(updatePacket, ospfChecksumPos1,
ospfChecksumPos2);
assertThat(result, is(notNullValue()));
}
}
\ No newline at end of file