blob: fe149c609664c5890aa6750a5513ccb8763130d6 [file] [log] [blame]
/*
* Copyright 2016-present Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.isis.io.isispacket;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.isis.controller.IsisMessage;
import org.onosproject.isis.exceptions.IsisErrorType;
import org.onosproject.isis.exceptions.IsisParseException;
import org.onosproject.isis.io.isispacket.pdu.Csnp;
import org.onosproject.isis.io.isispacket.pdu.L1L2HelloPdu;
import org.onosproject.isis.io.isispacket.pdu.LsPdu;
import org.onosproject.isis.io.isispacket.pdu.P2PHelloPdu;
import org.onosproject.isis.io.isispacket.pdu.Psnp;
import org.onosproject.isis.io.util.IsisConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Represents ISIS message reader.
*/
public class IsisMessageReader {
protected static final Logger log = LoggerFactory.getLogger(IsisMessageReader.class);
/**
* Reads from ISIS packet from buffer.
*
* @param channelBuffer buffer
* @return ISIS message
* @throws Exception exception
*/
public IsisMessage readFromBuffer(ChannelBuffer channelBuffer) throws Exception {
int dataLength = channelBuffer.readableBytes();
log.debug("IsisMessageReader::readFromBuffer Data length {}", dataLength);
if (channelBuffer.readableBytes() < IsisConstants.PDU_LENGTH) {
log.debug("Packet should have minimum length...");
throw new IsisParseException(IsisErrorType.MESSAGE_HEADER_ERROR, IsisErrorType.BAD_MESSAGE_LENGTH);
}
IsisHeader isisHeader = getIsisHeader(channelBuffer);
int totalLength = 0;
IsisMessage isisMessage = null;
switch (isisHeader.isisPduType()) {
case L1HELLOPDU:
case L2HELLOPDU:
isisMessage = new L1L2HelloPdu(isisHeader);
totalLength = channelBuffer.getShort(IsisConstants.PDULENGTHPOSITION);
break;
case P2PHELLOPDU:
isisMessage = new P2PHelloPdu(isisHeader);
totalLength = channelBuffer.getShort(IsisConstants.PDULENGTHPOSITION);
break;
case L1LSPDU:
case L2LSPDU:
isisMessage = new LsPdu(isisHeader);
totalLength = channelBuffer.getShort(8);
break;
case L1CSNP:
case L2CSNP:
isisMessage = new Csnp(isisHeader);
totalLength = channelBuffer.getShort(8);
break;
case L1PSNP:
case L2PSNP:
isisMessage = new Psnp(isisHeader);
totalLength = channelBuffer.getShort(8);
break;
default:
log.debug("Message Reader[Decoder] - Unknown PDU type..!!!");
break;
}
if (isisMessage != null) {
try {
int bodyLength = totalLength - IsisConstants.COMMONHEADERLENGTH;
isisMessage.readFrom(channelBuffer.readBytes(bodyLength));
} catch (Exception e) {
throw new IsisParseException(IsisErrorType.ISIS_MESSAGE_ERROR,
IsisErrorType.BAD_MESSAGE);
}
}
return isisMessage;
}
/**
* Gets ISIS header.
*
* @param channelBuffer ISIS header
* @return ISIS header
* @throws Exception
*/
private IsisHeader getIsisHeader(ChannelBuffer channelBuffer) throws Exception {
IsisHeader isisHeader = new IsisHeader();
isisHeader.setIrpDiscriminator(channelBuffer.readByte());
isisHeader.setPduHeaderLength(channelBuffer.readByte());
isisHeader.setVersion(channelBuffer.readByte());
isisHeader.setIdLength(channelBuffer.readByte());
isisHeader.setIsisPduType(channelBuffer.readByte());
isisHeader.setVersion2(channelBuffer.readByte());
isisHeader.setReserved(channelBuffer.readByte());
isisHeader.setMaximumAreaAddresses(channelBuffer.readByte());
return isisHeader;
}
}