blob: e51672f51dc9efc32eea7cee5e50b0d7cf439bcd [file] [log] [blame]
Dhruv Dhody43f3ce62016-02-16 22:44:21 +05301/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Dhruv Dhody43f3ce62016-02-16 22:44:21 +05303 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.ospf.protocol.ospfpacket;
18
19import org.jboss.netty.buffer.ChannelBuffer;
20import org.onlab.packet.Ip4Address;
sunishvkf7c56552016-07-18 16:02:39 +053021import org.onosproject.ospf.controller.OspfMessage;
Dhruv Dhody43f3ce62016-02-16 22:44:21 +053022import org.onosproject.ospf.exceptions.OspfErrorType;
23import org.onosproject.ospf.exceptions.OspfParseException;
24import org.onosproject.ospf.protocol.ospfpacket.types.DdPacket;
25import org.onosproject.ospf.protocol.ospfpacket.types.HelloPacket;
26import org.onosproject.ospf.protocol.ospfpacket.types.LsAcknowledge;
27import org.onosproject.ospf.protocol.ospfpacket.types.LsRequest;
28import org.onosproject.ospf.protocol.ospfpacket.types.LsUpdate;
29import org.onosproject.ospf.protocol.util.OspfParameters;
30import org.onosproject.ospf.protocol.util.OspfUtil;
31import org.slf4j.Logger;
32import org.slf4j.LoggerFactory;
33
34/**
35 * A message reader which reads OSPF messages from ChannelBuffer and converts to OspfMessage instances.
36 */
37public class OspfMessageReader {
38 private static final Logger log = LoggerFactory.getLogger(OspfMessageReader.class);
39
40 /**
41 * Reads and Converts the channel buffer to OspfMessage instance.
42 *
43 * @param channelBuffer channel buffer instance.
44 * @return OSPF message instance.
Ray Milkey019fba42018-01-31 14:07:47 -080045 * @throws OspfParseException might throws exception while parsing buffer
Dhruv Dhody43f3ce62016-02-16 22:44:21 +053046 */
47 public OspfMessage readFromBuffer(ChannelBuffer channelBuffer)
Ray Milkey019fba42018-01-31 14:07:47 -080048 throws OspfParseException {
Dhruv Dhody43f3ce62016-02-16 22:44:21 +053049
Dhruv Dhody43f3ce62016-02-16 22:44:21 +053050 try {
51 OspfPacketHeader ospfHeader = getOspfHeader(channelBuffer);
Dhruv Dhody43f3ce62016-02-16 22:44:21 +053052 OspfMessage ospfMessage = null;
53 switch (ospfHeader.ospfType()) {
54 case OspfParameters.HELLO:
55 ospfMessage = new HelloPacket(ospfHeader);
56 break;
57 case OspfParameters.DD:
58 ospfMessage = new DdPacket(ospfHeader);
59 break;
60 case OspfParameters.LSREQUEST:
61 ospfMessage = new LsRequest(ospfHeader);
62 break;
63 case OspfParameters.LSUPDATE:
64 ospfMessage = new LsUpdate(ospfHeader);
65 break;
66 case OspfParameters.LSACK:
67 ospfMessage = new LsAcknowledge(ospfHeader);
68 break;
69 default:
70 log.debug("Message Reader[Decoder] - Unknown LSA type..!!!");
71 break;
72 }
73
74 if (ospfMessage != null) {
75 try {
76 log.debug("{} Received::Message Length :: {} ", ospfMessage.ospfMessageType(),
77 ospfHeader.ospfPacLength());
sunishvkf7c56552016-07-18 16:02:39 +053078 ospfMessage.readFrom(channelBuffer.readBytes(ospfHeader.ospfPacLength() -
79 OspfUtil.OSPF_HEADER_LENGTH));
Dhruv Dhody43f3ce62016-02-16 22:44:21 +053080 } catch (Exception e) {
81 throw new OspfParseException(OspfErrorType.OSPF_MESSAGE_ERROR,
82 OspfErrorType.BAD_MESSAGE);
83 }
84
85 }
86
87 return ospfMessage;
88 } catch (Exception e) {
89 throw new OspfParseException(OspfErrorType.OSPF_MESSAGE_ERROR,
90 OspfErrorType.BAD_MESSAGE);
91 }
92 }
93
94 /**
95 * Gets the OSPF packet Header.
96 *
97 * @param channelBuffer channel buffer instance.
98 * @return Ospf Header instance.
99 */
Ray Milkey019fba42018-01-31 14:07:47 -0800100 private OspfPacketHeader getOspfHeader(ChannelBuffer channelBuffer) {
Dhruv Dhody43f3ce62016-02-16 22:44:21 +0530101 OspfPacketHeader ospfPacketHeader = new OspfPacketHeader();
102
sunishvkf7c56552016-07-18 16:02:39 +0530103 // Determine OSPF version & Packet Type
Dhruv Dhody43f3ce62016-02-16 22:44:21 +0530104 int version = channelBuffer.readByte(); //byte 1 is ospf version
105 int packetType = channelBuffer.readByte(); //byte 2 is ospf packet type
106
107 // byte 3 & 4 combine is packet length.
108 int packetLength = channelBuffer.readShort();
109
Dhruv Dhody43f3ce62016-02-16 22:44:21 +0530110 byte[] tempByteArray = new byte[OspfUtil.FOUR_BYTES];
111 channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
112 Ip4Address routerId = Ip4Address.valueOf(tempByteArray);
113
114 tempByteArray = new byte[OspfUtil.FOUR_BYTES];
115 channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
116 Ip4Address areaId = Ip4Address.valueOf(tempByteArray);
117
118 int checkSum = channelBuffer.readUnsignedShort();
119 int auType = channelBuffer.readUnsignedShort();
120 int authentication = (int) channelBuffer.readLong();
121
Dhruv Dhody43f3ce62016-02-16 22:44:21 +0530122 ospfPacketHeader.setOspfVer(version);
123 ospfPacketHeader.setOspftype(packetType);
124 ospfPacketHeader.setOspfPacLength(packetLength);
125 ospfPacketHeader.setRouterId(routerId);
126 ospfPacketHeader.setAreaId(areaId);
127 ospfPacketHeader.setChecksum(checkSum);
128 ospfPacketHeader.setAuthType(auType);
129 ospfPacketHeader.setAuthentication(authentication);
130
131 return ospfPacketHeader;
132 }
133}