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

Change-Id: I33b48593ec38d28bdff215ce3a608a6d085a9077
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/subtype/LsRequestPacket.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/subtype/LsRequestPacket.java
new file mode 100644
index 0000000..8d254de
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/subtype/LsRequestPacket.java
@@ -0,0 +1,92 @@
+/*
+ * 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.subtype;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Representation of an LS Request packet and fields and access methods to access it.
+ */
+public class LsRequestPacket {
+
+    private int lsType;
+    private String linkStateId;
+    private String ownRouterId;
+
+    /**
+     * Gets the LSA type.
+     *
+     * @return LSA type
+     */
+    public int lsType() {
+        return lsType;
+    }
+
+    /**
+     * Sets the LSA type.
+     *
+     * @param lsType LSA type
+     */
+    public void setLsType(int lsType) {
+        this.lsType = lsType;
+    }
+
+    /**
+     * Gets the link state id.
+     *
+     * @return link state id
+     */
+    public String linkStateId() {
+        return linkStateId;
+    }
+
+    /**
+     * Sets link state id.
+     *
+     * @param linkStateId state id
+     */
+    public void setLinkStateId(String linkStateId) {
+        this.linkStateId = linkStateId;
+    }
+
+    /**
+     * Gets the router id.
+     *
+     * @return router id
+     */
+    public String ownRouterId() {
+        return ownRouterId;
+    }
+
+    /**
+     * Sets the router id.
+     *
+     * @param ownRouterId router id
+     */
+    public void setOwnRouterId(String ownRouterId) {
+        this.ownRouterId = ownRouterId;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("lsType", lsType)
+                .add("linkStateId", linkStateId)
+                .add("ownRouterId", ownRouterId)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/subtype/package-info.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/subtype/package-info.java
new file mode 100644
index 0000000..5fa10f1
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/subtype/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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 packet sub types which is used in OSPF packets..
+ */
+package org.onosproject.ospf.protocol.ospfpacket.subtype;
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/DdPacket.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/DdPacket.java
new file mode 100644
index 0000000..82fe909
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/DdPacket.java
@@ -0,0 +1,420 @@
+/*
+ * 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.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.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.List;
+
+/**
+ * Representation of an OSPF Database Description packet.
+ * Database Description packets are OSPF packet type 2.
+ * These packets are exchanged when an adjacency is being initialized.
+ * They describe the contents of the link-state database.
+ */
+public class DdPacket 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 #   |       2       |         Packet length         |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                          Router ID                            |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                           Area ID                             |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |           Checksum            |             AuType            |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                       Authentication                          |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                       Authentication                          |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |         Interface MTU         |    Options    |0|0|0|0|0|I|M|MS
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                     DD sequence number                        |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                                                               |
+       +-                                                             -+
+       |                                                               |
+       +-                      An LSA Header                          -+
+       |                                                               |
+       +-                                                             -+
+       |                                                               |
+       +-                                                             -+
+       |                                                               |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                              ...                              |
+     */
+    private static final Logger log = LoggerFactory.getLogger(DdPacket.class);
+    private int imtu;
+    private int options;
+    private int ims; // initialize , more but / master slave bit
+    private int isMaster;
+    private int isInitialize;
+    private int isMore;
+    private long sequenceNo;
+    private boolean isOpaqueCapable;
+    private List<LsaHeader> lsaHeaderList = new ArrayList<>();
+
+    /**
+     * Creates an instance of DD packet.
+     */
+    public DdPacket() {
+    }
+
+    /**
+     * Creates an instance of DD packet.
+     *
+     * @param ospfHeader OSPF header instance
+     */
+    public DdPacket(OspfPacketHeader ospfHeader) {
+        populateHeader(ospfHeader);
+    }
+
+    /**
+     * Gets is opaque capable or not.
+     *
+     * @return true if opaque capable else false
+     */
+    public boolean isOpaqueCapable() {
+        return isOpaqueCapable;
+    }
+
+    /**
+     * Sets is opaque capable or not.
+     *
+     * @param isOpaqueCapable true or false
+     */
+    public void setIsOpaqueCapable(boolean isOpaqueCapable) {
+        this.isOpaqueCapable = isOpaqueCapable;
+    }
+
+    /**
+     * Gets IMS value.
+     *
+     * @return IMS bits as an int value
+     */
+    public int ims() {
+        return ims;
+    }
+
+    /**
+     * Sets IMS value.
+     *
+     * @param ims IMS value
+     */
+    public void setIms(int ims) {
+        this.ims = ims;
+    }
+
+    /**
+     * Gets master bit value.
+     *
+     * @return 1 if master else 0
+     */
+    public int isMaster() {
+        return isMaster;
+    }
+
+    /**
+     * Sets master value.
+     *
+     * @param isMaster 1 represents master
+     */
+    public void setIsMaster(int isMaster) {
+        this.isMaster = isMaster;
+    }
+
+    /**
+     * Gets Initialize bit value.
+     *
+     * @return 1 if initialize else 0
+     */
+    public int isInitialize() {
+        return isInitialize;
+    }
+
+    /**
+     * Sets initialize value.
+     *
+     * @param isInitialize 1 is initialize else 0
+     */
+    public void setIsInitialize(int isInitialize) {
+        this.isInitialize = isInitialize;
+    }
+
+    /**
+     * Gets is more bit set or not.
+     *
+     * @return 1 if more set else 0
+     */
+    public int isMore() {
+        return isMore;
+    }
+
+    /**
+     * Sets more bit value to 0 or 1.
+     *
+     * @param isMore 1 if more set else 0
+     */
+    public void setIsMore(int isMore) {
+        this.isMore = isMore;
+    }
+
+
+    /**
+     * Gets IMTU value.
+     *
+     * @return IMTU value
+     */
+    public int imtu() {
+        return imtu;
+    }
+
+    /**
+     * Sets IMTU value.
+     *
+     * @param imtu value
+     */
+    public void setImtu(int imtu) {
+        this.imtu = imtu;
+    }
+
+    /**
+     * Gets options value.
+     *
+     * @return options
+     */
+    public int options() {
+        return options;
+    }
+
+    /**
+     * Sets options value.
+     *
+     * @param options options value
+     */
+    public void setOptions(int options) {
+        this.options = options;
+    }
+
+    /**
+     * Gets sequence number.
+     *
+     * @return sequenceNo
+     */
+    public long sequenceNo() {
+        return sequenceNo;
+    }
+
+    /**
+     * Sets Sequence number.
+     *
+     * @param sequenceNo sequence number
+     */
+    public void setSequenceNo(long sequenceNo) {
+        this.sequenceNo = sequenceNo;
+    }
+
+    /**
+     * Gets LSA header list.
+     *
+     * @return LSA header
+     */
+    public List<LsaHeader> getLsaHeaderList() {
+        return lsaHeaderList;
+    }
+
+    /**
+     * Adds LSA header to header list.
+     *
+     * @param lsaHeader lsa header instance
+     */
+    public void addLsaHeader(LsaHeader lsaHeader) {
+
+        if (!lsaHeaderList.contains(lsaHeader)) {
+            lsaHeaderList.add(lsaHeader);
+        }
+    }
+
+    @Override
+    public OspfPacketType ospfMessageType() {
+        return OspfPacketType.DD;
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) throws OspfParseException {
+
+        try {
+            this.setImtu(channelBuffer.readShort());
+
+            int options = channelBuffer.readByte();
+            String obit = Integer.toHexString(options);
+            if (obit.length() == 1) {
+                obit = "0" + obit;
+            }
+            String toBinary = Integer.toBinaryString(Integer.parseInt(new Character(obit.charAt(0)).toString()));
+            if (toBinary.length() == 1) {
+                toBinary = "000" + toBinary;
+            } else if (toBinary.length() == 2) {
+                toBinary = "00" + toBinary;
+            } else if (toBinary.length() == 3) {
+                toBinary = "0" + toBinary;
+            }
+            if (Integer.parseInt(new Character(toBinary.charAt(1)).toString()) == 1) {
+                this.setIsOpaqueCapable(true);
+            }
+            this.setOptions(options);
+            this.setIms(channelBuffer.readByte());
+            //Convert the byte to ims bits
+            String strIms = Integer.toBinaryString(this.ims());
+            if (strIms.length() == 3) {
+                this.setIsInitialize(Integer.parseInt(Character.toString(strIms.charAt(0))));
+                this.setIsMore(Integer.parseInt(Character.toString(strIms.charAt(1))));
+                this.setIsMaster(Integer.parseInt(Character.toString(strIms.charAt(2))));
+            } else if (strIms.length() == 2) {
+                this.setIsInitialize(0);
+                this.setIsMore(Integer.parseInt(Character.toString(strIms.charAt(0))));
+                this.setIsMaster(Integer.parseInt(Character.toString(strIms.charAt(1))));
+            } else if (strIms.length() == 1) {
+                this.setIsInitialize(0);
+                this.setIsMore(0);
+                this.setIsMaster(Integer.parseInt(Character.toString(strIms.charAt(0))));
+            }
+            this.setSequenceNo(channelBuffer.readInt());
+
+            //add all the LSA Headers - header is of 20 bytes
+            while (channelBuffer.readableBytes() >= OspfUtil.LSA_HEADER_LENGTH) {
+                LsaHeader header = OspfUtil.readLsaHeader(channelBuffer.readBytes(OspfUtil.LSA_HEADER_LENGTH));
+                //add the LSAHeader to DDPacket
+                addLsaHeader(header);
+            }
+
+        } catch (Exception e) {
+            log.debug("Error::DdPacket:: {}", e.getMessage());
+            throw new OspfParseException(OspfErrorType.MESSAGE_HEADER_ERROR, OspfErrorType.BAD_MESSAGE_LENGTH);
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+
+        byte[] ddMessage = null;
+
+        byte[] ddHeader = getDdHeaderAsByteArray();
+        byte[] ddBody = getDdBodyAsByteArray();
+        ddMessage = Bytes.concat(ddHeader, ddBody);
+
+        return ddMessage;
+    }
+
+    /**
+     * Gets DD Header as byte array.
+     *
+     * @return dd header as byte array.
+     */
+    public byte[] getDdHeaderAsByteArray() {
+        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");
+
+        }
+
+        return Bytes.toArray(headerLst);
+    }
+
+
+    /**
+     * Gets DD body as byte array.
+     *
+     * @return DD body
+     */
+    public byte[] getDdBodyAsByteArray() {
+        List<Byte> bodyLst = new ArrayList<>();
+
+        try {
+            bodyLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.imtu())));
+            bodyLst.add((byte) this.options());
+
+            StringBuilder sb = new StringBuilder();
+            sb.append(this.isInitialize());
+            sb.append(this.isMore());
+            sb.append(this.isMaster());
+
+            bodyLst.add((byte) Integer.parseInt(sb.toString(), 2));
+            bodyLst.addAll(Bytes.asList(OspfUtil.convertToFourBytes(this.sequenceNo()))); // passing long value
+
+            for (LsaHeader lsaHeader : lsaHeaderList) {
+                if (lsaHeader.lsType() == OspfParameters.LINK_LOCAL_OPAQUE_LSA ||
+                        lsaHeader.lsType() == OspfParameters.AREA_LOCAL_OPAQUE_LSA ||
+                        lsaHeader.lsType() == OspfParameters.AS_OPAQUE_LSA) {
+                    OpaqueLsaHeader header = (OpaqueLsaHeader) lsaHeader;
+                    bodyLst.addAll(Bytes.asList(header.getOpaqueLsaHeaderAsByteArray()));
+                } else {
+                    bodyLst.addAll(Bytes.asList(lsaHeader.getLsaHeaderAsByteArray()));
+                }
+            }
+        } catch (Exception e) {
+            log.debug("Error::getLsrBodyAsByteArray {}", e.getMessage());
+            return Bytes.toArray(bodyLst);
+        }
+
+        return Bytes.toArray(bodyLst);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("imtu", imtu)
+                .add("options", options)
+                .add("ims", ims)
+                .add("isMaster", isMaster)
+                .add("isInitialize", isInitialize)
+                .add("isMore", isMore)
+                .add("sequenceNo", sequenceNo)
+                .add("isOpaqueCapable", isOpaqueCapable)
+                .add("lsaHeaderList", lsaHeaderList)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/HelloPacket.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/HelloPacket.java
new file mode 100644
index 0000000..cf0d6aa
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/HelloPacket.java
@@ -0,0 +1,362 @@
+/*
+ * 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.onlab.packet.Ip4Address;
+import org.onosproject.ospf.exceptions.OspfErrorType;
+import org.onosproject.ospf.exceptions.OspfParseException;
+import org.onosproject.ospf.protocol.ospfpacket.OspfPacketHeader;
+import org.onosproject.ospf.protocol.util.OspfPacketType;
+import org.onosproject.ospf.protocol.util.OspfUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Defines an OSPF Hello Message, and the fields and methods to access it.
+ * Hello packets are OSPF packet type 1. These packets are sent
+ * periodically on all interfaces in order to establish and
+ * maintain neighbor relationships.
+ */
+public class HelloPacket 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 #   |       1       |         Packet length         |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |                          Router ID                            |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |                           Area ID                             |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |           Checksum            |             AuType            |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |                       Authentication                          |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |                       Authentication                          |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |                        Network Mask                           |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |         HelloInterval         |    Options    |    Rtr Pri    |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |                     RouterDeadInterval                        |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |                      Designated Router                        |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |                   Backup Designated Router                    |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |                          Neighbor                             |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |                              ...                              |
+
+            Hello Message Format
+            REFERENCE : RFC 2328
+    */
+
+    private static final Logger log = LoggerFactory.getLogger(HelloPacket.class);
+    private Ip4Address networkMask;
+    private int options;
+    private int helloInterval;
+    private int routerPriority;
+    private int routerDeadInterval;
+    private Ip4Address bdr;
+    private Ip4Address dr;
+    private List<Ip4Address> neighborAddress = new ArrayList<>();
+
+    /**
+     * Creates an instance of Hello packet.
+     */
+    public HelloPacket() {
+    }
+
+    /**
+     * Creates an instance of Hello packet.
+     *
+     * @param ospfHeader OSPF header instance.
+     */
+    public HelloPacket(OspfPacketHeader ospfHeader) {
+        populateHeader(ospfHeader);
+    }
+
+    /**
+     * Gets network mask.
+     *
+     * @return network mask
+     */
+    public Ip4Address networkMask() {
+        return networkMask;
+    }
+
+    /**
+     * Sets network mask.
+     *
+     * @param networkMask network mask
+     */
+    public void setNetworkMask(Ip4Address networkMask) {
+        this.networkMask = networkMask;
+    }
+
+    /**
+     * Gets BDRs IP address.
+     *
+     * @return BDRs IP address
+     */
+    public Ip4Address bdr() {
+        return bdr;
+    }
+
+    /**
+     * Sets BDR IP address.
+     *
+     * @param bdr BDR IP address
+     */
+    public void setBdr(Ip4Address bdr) {
+        this.bdr = bdr;
+    }
+
+    /**
+     * Gets DRs IP address.
+     *
+     * @return DRs IP address
+     */
+    public Ip4Address dr() {
+        return dr;
+    }
+
+    /**
+     * Sets DRs IP address.
+     *
+     * @param dr DRs IP address
+     */
+    public void setDr(Ip4Address dr) {
+        this.dr = dr;
+    }
+
+    /**
+     * Adds neighbor to map.
+     *
+     * @param neighborID neighbors id
+     */
+    public void addNeighbor(Ip4Address neighborID) {
+        if (!neighborAddress.contains(neighborID)) {
+            neighborAddress.add(neighborID);
+        }
+    }
+
+    /**
+     * Checks neighbor is in map or not.
+     *
+     * @param neighborID neighbors id
+     * @return true if neighbor exist else false
+     */
+    public boolean containsNeighbour(Ip4Address neighborID) {
+        return (neighborAddress.contains(neighborID)) ? true : false;
+    }
+
+    /**
+     * Gets options value.
+     *
+     * @return options value
+     */
+    public int options() {
+        return options;
+    }
+
+    /**
+     * Sets options value.
+     *
+     * @param options options value
+     */
+    public void setOptions(int options) {
+        this.options = options;
+    }
+
+    /**
+     * Gets router priority.
+     *
+     * @return routerPriority
+     */
+    public int routerPriority() {
+        return routerPriority;
+    }
+
+    /**
+     * Sets router priority.
+     *
+     * @param routerPriority router priority
+     */
+    public void setRouterPriority(int routerPriority) {
+        this.routerPriority = routerPriority;
+    }
+
+    /**
+     * Gets hello interval.
+     *
+     * @return hello Interval
+     */
+    public int helloInterval() {
+        return helloInterval;
+    }
+
+    /**
+     * Sets hello Interval.
+     *
+     * @param helloInterval hello Interval
+     */
+    public void setHelloInterval(int helloInterval) {
+        this.helloInterval = helloInterval;
+    }
+
+    /**
+     * Gets router dead interval.
+     *
+     * @return router dead interval
+     */
+    public int routerDeadInterval() {
+        return routerDeadInterval;
+    }
+
+    /**
+     * Sets router dead interval.
+     *
+     * @param routerDeadInterval router dead interval
+     */
+    public void setRouterDeadInterval(int routerDeadInterval) {
+        this.routerDeadInterval = routerDeadInterval;
+    }
+
+    @Override
+    public OspfPacketType ospfMessageType() {
+        return OspfPacketType.HELLO;
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) throws OspfParseException {
+
+        try {
+            byte[] tempByteArray = new byte[OspfUtil.FOUR_BYTES];
+            channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
+            this.setNetworkMask(Ip4Address.valueOf(tempByteArray));
+            this.setHelloInterval(channelBuffer.readShort());
+            this.setOptions(channelBuffer.readByte());
+            this.setRouterPriority(channelBuffer.readByte() & 0xff);
+            this.setRouterDeadInterval(channelBuffer.readInt());
+            tempByteArray = new byte[OspfUtil.FOUR_BYTES];
+            channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
+            this.setDr(Ip4Address.valueOf(tempByteArray));
+            tempByteArray = new byte[OspfUtil.FOUR_BYTES];
+            channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
+            this.setBdr(Ip4Address.valueOf(tempByteArray));
+
+            while (channelBuffer.readableBytes() > 0) {
+                tempByteArray = new byte[OspfUtil.FOUR_BYTES];
+                channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
+                this.addNeighbor(Ip4Address.valueOf(tempByteArray));
+            }
+
+        } catch (Exception e) {
+            log.debug("Error::HelloPacket:: {}", e.getMessage());
+            throw new OspfParseException(OspfErrorType.MESSAGE_HEADER_ERROR, OspfErrorType.BAD_MESSAGE_LENGTH);
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+
+        byte[] helloMessage = null;
+        byte[] helloHeader = getHelloHeaderAsByteArray();
+        byte[] helloBody = getHelloBodyAsByteArray();
+        helloMessage = Bytes.concat(helloHeader, helloBody);
+
+        log.debug("HelloPacket::asBytes::Hello asBytes:: {}", helloMessage);
+
+        return helloMessage;
+    }
+
+    /**
+     * Gets hello header as byte array.
+     *
+     * @return hello header
+     */
+    public byte[] getHelloHeaderAsByteArray() {
+        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::getHelloHeaderAsByteArray {}", e.getMessage());
+            return Bytes.toArray(headerLst);
+        }
+
+        return Bytes.toArray(headerLst);
+    }
+
+    /**
+     * Gets hello body as byte array.
+     *
+     * @return hello body as byte array
+     */
+    public byte[] getHelloBodyAsByteArray() {
+        List<Byte> bodyLst = new ArrayList<>();
+
+        try {
+            bodyLst.addAll(Bytes.asList(this.networkMask().toOctets()));
+            bodyLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.helloInterval())));
+            bodyLst.add((byte) this.options());
+            bodyLst.add((byte) this.routerPriority());
+            bodyLst.addAll(Bytes.asList(OspfUtil.convertToFourBytes(this.routerDeadInterval())));
+            bodyLst.addAll(Bytes.asList(this.dr().toOctets()));
+            bodyLst.addAll(Bytes.asList(this.bdr().toOctets()));
+            for (Ip4Address neighbour : neighborAddress) {
+                bodyLst.addAll(Bytes.asList(neighbour.toOctets()));
+            }
+
+        } catch (Exception e) {
+            log.debug("Error::getHelloBodyAsByteArray {}", e.getMessage());
+            return Bytes.toArray(bodyLst);
+        }
+
+        return Bytes.toArray(bodyLst);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("networkMask", networkMask)
+                .add("options", options)
+                .add("helloInterval", helloInterval)
+                .add("routerPriority", routerPriority)
+                .add("routerDeadInterval", routerDeadInterval)
+                .add("bdr", bdr)
+                .add("dr", dr)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/LsAcknowledge.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/LsAcknowledge.java
new file mode 100644
index 0000000..3de74e4
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/LsAcknowledge.java
@@ -0,0 +1,202 @@
+/*
+ * 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.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.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.List;
+
+/**
+ * Representation of an  OSPF Link State Acknowledgment Message.
+ * Link State Acknowledgment Packets are OSPF packet type 5.
+ * To make the flooding of LSAs reliable, flooded LSAs are explicitly
+ * acknowledged. This acknowledgment is accomplished through the
+ * sending and receiving of Link State Acknowledgment packets.
+ * Multiple LSAs can be acknowledged in a single Link State Acknowledgment packet.
+ */
+public class LsAcknowledge 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 #   |       5       |         Packet length         |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                          Router ID                            |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                           Area ID                             |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |           Checksum            |             AuType            |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                       Authentication                          |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                       Authentication                          |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                                                               |
+       +-                                                             -+
+       |                                                               |
+       +-                         An LSA Header                       -+
+       |                                                               |
+       +-                                                             -+
+       |                                                               |
+       +-                                                             -+
+       |                                                               |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                              ...                              |
+ */
+    private static final Logger log = LoggerFactory.getLogger(LsAcknowledge.class);
+    private List<LsaHeader> linkStateHeaders = new ArrayList<>();
+
+    /**
+     * Creates an instance of Link State Acknowledgment instance.
+     */
+    public LsAcknowledge() {
+    }
+
+    /**
+     * Creates an instance of Link State Acknowledgment instance.
+     *
+     * @param ospfHeader OSPF header instance.
+     */
+    public LsAcknowledge(OspfPacketHeader ospfHeader) {
+        populateHeader(ospfHeader);
+    }
+
+    /**
+     * Gets ls headers.
+     *
+     * @return ls headers
+     */
+    public List<LsaHeader> getLinkStateHeaders() {
+        return linkStateHeaders;
+    }
+
+    /**
+     * Adds link state header to list.
+     *
+     * @param lsaHeader LSA header
+     */
+    public void addLinkStateHeader(LsaHeader lsaHeader) {
+        if (!linkStateHeaders.contains(lsaHeader)) {
+            linkStateHeaders.add(lsaHeader);
+        }
+    }
+
+    @Override
+    public OspfPacketType ospfMessageType() {
+        return OspfPacketType.LSAACK;
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) throws OspfParseException {
+        try {
+            //add all the LSA Headers - one header is of 20 bytes
+            while (channelBuffer.readableBytes() >= OspfUtil.LSA_HEADER_LENGTH) {
+                LsaHeader header = OspfUtil.readLsaHeader(channelBuffer);
+                //add the LSAHeader to acknowledge
+                addLinkStateHeader(header);
+            }
+
+        } catch (Exception e) {
+            log.debug("Error::LsAckPacket:: {}", e.getMessage());
+            throw new OspfParseException(OspfErrorType.MESSAGE_HEADER_ERROR, OspfErrorType.BAD_MESSAGE_LENGTH);
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] lsAckMessage = null;
+
+        byte[] lsAckHeader = getLsAckAsByteArray();
+        byte[] lsAckBody = getLsAckBodyAsByteArray();
+        lsAckMessage = Bytes.concat(lsAckHeader, lsAckBody);
+
+        return lsAckMessage;
+    }
+
+    /**
+     * Gets LSAcknowledge as byte array.
+     *
+     * @return byte array
+     */
+    public byte[] getLsAckAsByteArray() {
+        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::LsAckPacket:: {}", e.getMessage());
+            return Bytes.toArray(headerLst);
+        }
+
+        return Bytes.toArray(headerLst);
+    }
+
+    /**
+     * Gets LsAck body as byte array.
+     *
+     * @return byte array
+     */
+    public byte[] getLsAckBodyAsByteArray() {
+        List<Byte> bodyLst = new ArrayList<>();
+
+        try {
+            for (LsaHeader lsaHeader : linkStateHeaders) {
+                if (lsaHeader.lsType() == OspfParameters.LINK_LOCAL_OPAQUE_LSA ||
+                        lsaHeader.lsType() == OspfParameters.AREA_LOCAL_OPAQUE_LSA ||
+                        lsaHeader.lsType() == OspfParameters.AS_OPAQUE_LSA) {
+                    OpaqueLsaHeader header = (OpaqueLsaHeader) lsaHeader;
+                    bodyLst.addAll(Bytes.asList(header.getOpaqueLsaHeaderAsByteArray()));
+                } else {
+                    bodyLst.addAll(Bytes.asList(lsaHeader.getLsaHeaderAsByteArray()));
+                }
+            }
+        } catch (Exception e) {
+            log.debug("Error::getLsAckBodyAsByteArray {}", e.getMessage());
+            return Bytes.toArray(bodyLst);
+        }
+
+        return Bytes.toArray(bodyLst);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("linkStateHeaders", linkStateHeaders)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/LsRequest.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/LsRequest.java
new file mode 100644
index 0000000..636d1b6
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/LsRequest.java
@@ -0,0 +1,48 @@
+/*
+ * 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;
+
+/**
+ * Representation of different OSPF packet types.
+ */
+public enum OspfPacketType {
+
+    HELLO(1),
+    DD(2),
+    LSREQUEST(3),
+    LSUPDATE(4),
+    LSAACK(5);
+
+    private int value;
+
+    /**
+     * Creates instance of OSPF packet types.
+     *
+     * @param value
+     */
+    OspfPacketType(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the value.
+     *
+     * @return value
+     */
+    public int value() {
+        return value;
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/package-info.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/package-info.java
new file mode 100644
index 0000000..80108bd
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2014 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 Packet.
+ */
+package org.onosproject.ospf.protocol.ospfpacket.types;
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/subtype/LsRequestPacketTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/subtype/LsRequestPacketTest.java
new file mode 100644
index 0000000..91974da
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/subtype/LsRequestPacketTest.java
@@ -0,0 +1,122 @@
+/*
+ * 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.subtype;
+
+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 LsRequestPacket.
+ */
+public class LsRequestPacketTest {
+
+    private LsRequestPacket lsrPacket;
+    private int result;
+
+    @Before
+    public void setUp() throws Exception {
+        lsrPacket = new LsRequestPacket();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        lsrPacket = null;
+    }
+
+    /**
+     * Tests lsType() getter method.
+     */
+    @Test
+    public void testGetLsType() throws Exception {
+        lsrPacket.setLsType(1);
+        assertThat(lsrPacket.lsType(), is(1));
+    }
+
+    /**
+     * Tests lsType() setter method.
+     */
+    @Test
+    public void testSetLsType() throws Exception {
+        lsrPacket.setLsType(1);
+        assertThat(lsrPacket.lsType(), is(1));
+    }
+
+    /**
+     * Tests linkStateId() getter method.
+     */
+    @Test
+    public void testGetLinkStateId() throws Exception {
+        lsrPacket.setLinkStateId("1.1.1.1");
+        assertThat(lsrPacket.linkStateId(), is("1.1.1.1"));
+    }
+
+    /**
+     * Tests linkStateId() setter method.
+     */
+    @Test
+    public void testSetLinkStateId() throws Exception {
+        lsrPacket.setLinkStateId("1.1.1.1");
+        assertThat(lsrPacket.linkStateId(), is("1.1.1.1"));
+    }
+
+    /**
+     * Tests ownRouterId() getter method.
+     */
+    @Test
+    public void testGetOwnRouterId() throws Exception {
+        lsrPacket.setOwnRouterId("1.1.1.1");
+        assertThat(lsrPacket.ownRouterId(), is("1.1.1.1"));
+    }
+
+    /**
+     * Tests ownRouterId() setter method.
+     */
+    @Test
+    public void testSetOwnRouterId() throws Exception {
+        lsrPacket.setOwnRouterId("1.1.1.1");
+        assertThat(lsrPacket.ownRouterId(), is("1.1.1.1"));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(lsrPacket.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests equals() method.
+     */
+    @Test
+    public void testEquals() throws Exception {
+        assertThat(lsrPacket.equals(new LsRequestPacket()), is(false));
+    }
+
+    /**
+     * Tests hashCode() method.
+     */
+    @Test
+    public void testHashCode() throws Exception {
+        result = lsrPacket.hashCode();
+        assertThat(result, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/DdPacketTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/DdPacketTest.java
new file mode 100644
index 0000000..6b7ead0
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/DdPacketTest.java
@@ -0,0 +1,449 @@
+/*
+ * 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.Assert;
+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.ospfpacket.OspfPacketHeader;
+import org.onosproject.ospf.protocol.util.OspfPacketType;
+
+import java.util.List;
+import java.util.Vector;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for OspfRouterId.
+ */
+public class DdPacketTest {
+
+    private byte[] packet;
+    private byte[] result2;
+    private DdPacket ddPacket;
+    private Vector<LsaHeader> lsaHeaderList = new Vector<LsaHeader>();
+    private int result;
+    private long result1;
+    private OpaqueLsaHeader opqueHeader;
+    private OpaqueLsaHeader opqueHeader1;
+    private List<LsaHeader> header;
+    private OspfPacketHeader ospfPacketHeader;
+    private ChannelBuffer channelBuffer;
+    private LsaHeader lsaHeader;
+    private long result3;
+    private OspfPacketType ospfPacketType;
+
+    @Before
+    public void setUp() 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);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        ddPacket = null;
+        lsaHeaderList.clear();
+        opqueHeader = null;
+        opqueHeader1 = null;
+        header = null;
+        ospfPacketHeader = null;
+        channelBuffer = null;
+        lsaHeader = null;
+        ospfPacketType = null;
+    }
+
+    /**
+     * Tests isOpaqueCapable() getter method.
+     */
+    @Test
+    public void testIsOpaqueCapable() throws Exception {
+        ddPacket.setIsOpaqueCapable(true);
+        assertThat(ddPacket.isOpaqueCapable(), is(true));
+    }
+
+    /**
+     * Tests isOpaqueCapable() setter method.
+     */
+    @Test
+    public void testSetIsOpaqueCapable() throws Exception {
+        ddPacket.setIsOpaqueCapable(true);
+        assertThat(ddPacket.isOpaqueCapable(), is(true));
+    }
+
+    /**
+     * Tests ims() getter method.
+     */
+    @Test
+    public void testGetIms() throws Exception {
+        ddPacket.setIms(1);
+        result = ddPacket.ims();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests ims() setter method.
+     */
+    @Test
+    public void testSetIms() throws Exception {
+        ddPacket.setIms(1);
+        result = ddPacket.ims();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests isMaster() getter method.
+     */
+    @Test
+    public void testGetIsMaster() throws Exception {
+        ddPacket.setIsMaster(2);
+        result = ddPacket.isMaster();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(2));
+    }
+
+    /**
+     * Tests isMaster() setter method.
+     */
+    @Test
+    public void testSetIsMaster() throws Exception {
+        ddPacket.setIsMaster(2);
+        result = ddPacket.isMaster();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(2));
+    }
+
+    /**
+     * Tests isInitialize() getter method.
+     */
+    @Test
+    public void testGetIsInitialize() throws Exception {
+        ddPacket.setIsInitialize(3);
+        result = ddPacket.isInitialize();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(3));
+    }
+
+    /**
+     * Tests isInitialize() setter method.
+     */
+    @Test
+    public void testSetIsInitialize() throws Exception {
+        ddPacket.setIsInitialize(3);
+        int result = ddPacket.isInitialize();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(3));
+    }
+
+    /**
+     * Tests isMore() getter method.
+     */
+    @Test
+    public void testGetIsMore() throws Exception {
+        ddPacket.setIsMore(4);
+        result = ddPacket.isMore();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(4));
+    }
+
+    /**
+     * Tests isMore() setter method.
+     */
+    @Test
+    public void testSetIsMore() throws Exception {
+        ddPacket.setIsMore(4);
+        int result = ddPacket.isMore();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(4));
+    }
+
+    /**
+     * Tests imtu() getter method.
+     */
+    @Test
+    public void testGetImtu() throws Exception {
+        ddPacket.setImtu(5);
+        result = ddPacket.imtu();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(5));
+    }
+
+    /**
+     * Tests imtu() setter method.
+     */
+    @Test
+    public void testSetImtu() throws Exception {
+        ddPacket.setImtu(5);
+        result = ddPacket.imtu();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(5));
+    }
+
+    /**
+     * Tests options() getter method.
+     */
+    @Test
+    public void testGetOptions() throws Exception {
+        ddPacket.setOptions(2);
+        result = ddPacket.options();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(2));
+    }
+
+    /**
+     * Tests options() setter method.
+     */
+    @Test
+    public void testSetOptions() throws Exception {
+        ddPacket.setOptions(2);
+        result = ddPacket.options();
+        Assert.assertNotNull(result);
+        Assert.assertEquals(2, result);
+    }
+
+    /**
+     * Tests sequenceNo() getter method.
+     */
+    @Test
+    public void testGetSequenceno() throws Exception {
+        ddPacket.setSequenceNo(2020);
+        result1 = ddPacket.sequenceNo();
+        assertThat(result1, is(notNullValue()));
+        assertThat(result1, is(2020L));
+    }
+
+    /**
+     * Tests sequenceNo() setter method.
+     */
+    @Test
+    public void testSetSequenceno() throws Exception {
+        ddPacket.setSequenceNo(2020);
+        result3 = ddPacket.sequenceNo();
+        assertThat(result3, is(notNullValue()));
+        assertThat(result3, is(2020L));
+    }
+
+    /**
+     * Tests getLsaHeaderList() getter method.
+     */
+    @Test
+    public void testGetLsaHeaderList() throws Exception {
+        ddPacket.addLsaHeader(createLsaHeader());
+        opqueHeader = new OpaqueLsaHeader();
+        opqueHeader.setLsType(9);
+        opqueHeader.setLsPacketLen(48);
+        opqueHeader.setLsCheckSum(10);
+        opqueHeader.setAge(4);
+        opqueHeader.setOpaqueId(9);
+        opqueHeader.setOpaqueType(9);
+        opqueHeader.setLsSequenceNo(250);
+        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
+        opqueHeader.setOptions(2);
+        ddPacket.setIsOpaqueCapable(true);
+        ddPacket.addLsaHeader(opqueHeader);
+        opqueHeader1 = new OpaqueLsaHeader();
+        opqueHeader1.setLsType(10);
+        opqueHeader1.setLsPacketLen(48);
+        opqueHeader1.setLsCheckSum(10);
+        opqueHeader1.setAge(4);
+        opqueHeader1.setOpaqueId(9);
+        opqueHeader1.setOpaqueType(9);
+        opqueHeader1.setLsSequenceNo(250);
+        opqueHeader1.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
+        opqueHeader1.setOptions(66);
+        ddPacket.addLsaHeader(opqueHeader1);
+        header = ddPacket.getLsaHeaderList();
+        assertThat(header, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLsaHeaderList() setter method.
+     */
+    @Test
+    public void testSetLsaHeaderList() throws Exception {
+        ddPacket.addLsaHeader(createLsaHeader());
+        opqueHeader = new OpaqueLsaHeader();
+        opqueHeader.setLsType(9);
+        opqueHeader.setLsPacketLen(48);
+        opqueHeader.setLsCheckSum(10);
+        opqueHeader.setAge(4);
+        opqueHeader.setOpaqueId(9);
+        opqueHeader.setOpaqueType(9);
+        opqueHeader.setLsSequenceNo(250);
+        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
+        opqueHeader.setOptions(66);
+        ddPacket.addLsaHeader(opqueHeader);
+        opqueHeader1 = new OpaqueLsaHeader();
+        opqueHeader1.setLsType(10);
+        opqueHeader1.setLsPacketLen(48);
+        opqueHeader1.setLsCheckSum(10);
+        opqueHeader1.setAge(4);
+        opqueHeader1.setOpaqueId(9);
+        opqueHeader1.setOpaqueType(9);
+        opqueHeader1.setLsSequenceNo(250);
+        opqueHeader1.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
+        opqueHeader1.setOptions(2);
+        ddPacket.addLsaHeader(opqueHeader1);
+        header = ddPacket.getLsaHeaderList();
+        assertThat(header.contains(createLsaHeader()), is(true));
+    }
+
+    /**
+     * Tests addLsaHeader() method.
+     */
+    @Test
+    public void testAddLsaHeader() throws Exception {
+        ddPacket.addLsaHeader(createLsaHeader());
+        assertThat(ddPacket, is(notNullValue()));
+    }
+
+    /**
+     * Tests ospfMessageType() getter method.
+     */
+    @Test
+    public void testGetOspfMessageType() throws Exception {
+        ospfPacketType = ddPacket.ospfMessageType();
+        assertThat(ospfPacketType, is(notNullValue()));
+        assertThat(ospfPacketType, is(OspfPacketType.DD));
+    }
+
+    /**
+     * 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(2);
+        ospfPacketHeader.setOspfVer(2);
+        ospfPacketHeader.setRouterId(Ip4Address.valueOf("2.2.2.2"));
+        ospfPacketHeader.setSourceIp(Ip4Address.valueOf("3.3.3.3"));
+        ddPacket.setIsOpaqueCapable(true);
+        ddPacket.setOptions(66);
+        ddPacket = new DdPacket(ospfPacketHeader);
+        packet = createByteForDdPacket();
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        ddPacket.readFrom(channelBuffer);
+        assertThat(ddPacket, is(notNullValue()));
+        assertThat(ddPacket.ospfMessageType(), is(OspfPacketType.DD));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result2 = ddPacket.asBytes();
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests getDdHeaderAsByteArray() method.
+     */
+    @Test
+    public void testGetDdHeaderAsByteArray() throws Exception {
+        opqueHeader = new OpaqueLsaHeader();
+        opqueHeader.setLsType(9);
+        opqueHeader.setLsPacketLen(48);
+        opqueHeader.setLsCheckSum(10);
+        opqueHeader.setAge(4);
+        opqueHeader.setOpaqueId(9);
+        opqueHeader.setOpaqueType(9);
+        opqueHeader.setLsSequenceNo(250);
+        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
+        opqueHeader.setOptions(66);
+        ddPacket.addLsaHeader(opqueHeader);
+        opqueHeader1 = new OpaqueLsaHeader();
+        opqueHeader1.setLsType(10);
+        opqueHeader1.setLsPacketLen(48);
+        opqueHeader1.setLsCheckSum(10);
+        opqueHeader1.setAge(4);
+        opqueHeader1.setOpaqueId(9);
+        opqueHeader1.setOpaqueType(9);
+        opqueHeader1.setLsSequenceNo(250);
+        opqueHeader1.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
+        opqueHeader1.setOptions(2);
+        ddPacket.addLsaHeader(opqueHeader1);
+        result2 = ddPacket.getDdHeaderAsByteArray();
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests getDdBodyAsByteArray() method.
+     */
+    @Test
+    public void testGetDdBodyAsByteArray() throws Exception {
+        lsaHeader = createLsaHeader();
+        ddPacket.addLsaHeader(lsaHeader);
+        result2 = ddPacket.getDdBodyAsByteArray();
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(ddPacket.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Utility method used by junit methods.
+     */
+    private LsaHeader createLsaHeader() {
+        lsaHeader = new LsaHeader();
+        lsaHeader.setAge(10);
+        lsaHeader.setLinkStateId("10.226.165.164");
+        lsaHeader.setLsCheckSum(222);
+        lsaHeader.setLsPacketLen(48);
+        lsaHeader.setLsSequenceNo(2020);
+        lsaHeader.setLsType(2);
+        lsaHeader.setOptions(2);
+        lsaHeader.setAdvertisingRouter(Ip4Address.valueOf("10.226.165.165"));
+        return lsaHeader;
+    }
+
+    /**
+     * Utility method used by junit methods.
+     */
+    private byte[] createByteForDdPacket() {
+        byte[] ddPacket = {5, -36, 66, 1, 65, 119, -87, 126, 0, 23, 2, 1, 10, 10,
+                10, 10, 10, 10, 10, 10, -128, 0, 0, 6, -69, 26, 0, 36};
+
+        return ddPacket;
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/HelloPacketTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/HelloPacketTest.java
new file mode 100644
index 0000000..8d8b0f6
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/HelloPacketTest.java
@@ -0,0 +1,325 @@
+/*
+ * 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.protocol.ospfpacket.OspfPacketHeader;
+import org.onosproject.ospf.protocol.util.OspfPacketType;
+
+import java.util.Vector;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for HelloPacket.
+ */
+public class HelloPacketTest {
+
+    private boolean result1;
+    private OspfPacketType ospfPacketType;
+    private OspfPacketHeader ospfPacketHeader;
+    private HelloPacket helloPacket;
+    private Vector<String> neighborAddress = new Vector();
+    private Ip4Address result;
+    private int result2;
+    private byte[] packet;
+    private ChannelBuffer channelBuffer;
+    private byte[] result3;
+
+    @Before
+    public void setUp() throws Exception {
+        helloPacket = new HelloPacket();
+        helloPacket.setAuthType(1);
+        helloPacket.setOspftype(2);
+        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);
+
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        helloPacket = null;
+        result = null;
+        ospfPacketType = null;
+        ospfPacketHeader = null;
+        packet = null;
+        channelBuffer = null;
+        result3 = null;
+    }
+
+    /**
+     * Tests networkMask() getter method.
+     */
+    @Test
+    public void testGetNetworkMask() throws Exception {
+        helloPacket.setNetworkMask(Ip4Address.valueOf("10.226.165.164"));
+        result = helloPacket.networkMask();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(Ip4Address.valueOf("10.226.165.164")));
+    }
+
+    /**
+     * Tests networkMask() setter method.
+     */
+    @Test
+    public void testSetNetworkMask() throws Exception {
+        helloPacket.setNetworkMask(Ip4Address.valueOf("10.226.165.164"));
+        result = helloPacket.networkMask();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(Ip4Address.valueOf("10.226.165.164")));
+    }
+
+    /**
+     * Tests bdr() setter method.
+     */
+    @Test
+    public void testSetBdr() throws Exception {
+        helloPacket.setBdr(Ip4Address.valueOf("10.226.165.166"));
+        result = helloPacket.bdr();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(Ip4Address.valueOf("10.226.165.166")));
+    }
+
+    /**
+     * Tests dr() getter method.
+     */
+    @Test
+    public void testGetDr() throws Exception {
+        helloPacket.setDr(Ip4Address.valueOf("10.226.165.167"));
+        result = helloPacket.dr();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(Ip4Address.valueOf("10.226.165.167")));
+    }
+
+    /**
+     * Tests dr() setter method.
+     */
+    @Test
+    public void testSetDr() throws Exception {
+        helloPacket.setDr(Ip4Address.valueOf("10.226.165.167"));
+        result = helloPacket.dr();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(Ip4Address.valueOf("10.226.165.167")));
+    }
+
+    /**
+     * Tests addNeighbor() method.
+     */
+    @Test
+    public void testAddNeighbor() throws Exception {
+        helloPacket.addNeighbor(Ip4Address.valueOf("10.226.165.170"));
+        result1 = helloPacket.containsNeighbour(Ip4Address.valueOf("10.226.165.170"));
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests containsNeighbour() method.
+     */
+    @Test
+    public void testContainsNeighbour() throws Exception {
+        helloPacket.addNeighbor(Ip4Address.valueOf("10.226.165.200"));
+        result1 = helloPacket.containsNeighbour(Ip4Address.valueOf("10.226.165.200"));
+        assertThat(result1, is(true));
+    }
+
+
+    /**
+     * Tests options() getter  method.
+     */
+    @Test
+    public void testGetOptions() throws Exception {
+        helloPacket.setOptions(10);
+        result2 = helloPacket.options();
+        assertThat(result2, is(notNullValue()));
+        assertThat(result2, is(10));
+    }
+
+    /**
+     * Tests options() setter  method.
+     */
+    @Test
+    public void testSetOptions() throws Exception {
+        helloPacket.setOptions(11);
+        result2 = helloPacket.options();
+        assertThat(result2, is(notNullValue()));
+        assertThat(result2, is(11));
+    }
+
+    /**
+     * Tests routerPriority() getter  method.
+     */
+    @Test
+    public void testGetRouterPriority() throws Exception {
+        helloPacket.setRouterPriority(1);
+        result2 = helloPacket.routerPriority();
+        assertThat(result2, is(notNullValue()));
+        assertThat(result2, is(1));
+    }
+
+    /**
+     * Tests routerPriority() setter  method.
+     */
+    @Test
+    public void testSetRouterPriority() throws Exception {
+        helloPacket.setRouterPriority(2);
+        result2 = helloPacket.routerPriority();
+        assertThat(result2, is(notNullValue()));
+        assertThat(result2, is(2));
+    }
+
+    /**
+     * Tests helloInterval() getter  method.
+     */
+    @Test
+    public void testGetHelloInterval() throws Exception {
+        helloPacket.setHelloInterval(10);
+        result2 = helloPacket.helloInterval();
+        assertThat(result2, is(notNullValue()));
+        assertThat(result2, is(10));
+    }
+
+    /**
+     * Tests helloInterval() setter  method.
+     */
+    @Test
+    public void testSetHelloInterval() throws Exception {
+        helloPacket.setHelloInterval(10);
+        result2 = helloPacket.helloInterval();
+        assertThat(result2, is(notNullValue()));
+        assertThat(result2, is(10));
+    }
+
+    /**
+     * Tests routerDeadInterval() getter  method.
+     */
+    @Test
+    public void testGetRouterDeadInterval() throws Exception {
+        helloPacket.setRouterDeadInterval(50);
+        result2 = helloPacket.routerDeadInterval();
+        assertThat(result2, is(notNullValue()));
+        assertThat(result2, is(50));
+    }
+
+    /**
+     * Tests routerDeadInterval() setter  method.
+     */
+    @Test
+    public void testSetRouterDeadInterval() throws Exception {
+        helloPacket.setRouterDeadInterval(50);
+        result2 = helloPacket.routerDeadInterval();
+        assertThat(result2, is(notNullValue()));
+        assertThat(result2, is(50));
+    }
+
+    /**
+     * Tests ospfMessageType() getter  method.
+     */
+    @Test
+    public void testGetOspfMessageType() throws Exception {
+        ospfPacketType = helloPacket.ospfMessageType();
+        assertThat(ospfPacketType, is(notNullValue()));
+        assertThat(ospfPacketType, is(OspfPacketType.HELLO));
+    }
+
+    /**
+     * 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(1);
+        ospfPacketHeader.setOspfVer(2);
+        ospfPacketHeader.setRouterId(Ip4Address.valueOf("2.2.2.2"));
+        ospfPacketHeader.setSourceIp(Ip4Address.valueOf("3.3.3.3"));
+        packet = createByteForHelloPacket();
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        helloPacket.readFrom(channelBuffer);
+        assertThat(helloPacket, is(notNullValue()));
+        assertThat(helloPacket.ospfMessageType(), is(OspfPacketType.HELLO));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result3 = helloPacket.asBytes();
+        assertThat(result3, is(notNullValue()));
+    }
+
+    /**
+     * Tests getHelloHeaderAsByteArray() method.
+     */
+    @Test
+    public void testGetHelloHeaderAsByteArray() throws Exception {
+        result3 = helloPacket.getHelloHeaderAsByteArray();
+        assertThat(result3, is(notNullValue()));
+    }
+
+    /**
+     * Tests getHelloBodyAsByteArray() method.
+     */
+    @Test
+    public void testGetHelloBodyAsByteArray() throws Exception {
+        neighborAddress.add("10.226.165.100");
+        result3 = helloPacket.getHelloBodyAsByteArray();
+        assertThat(result3, is(notNullValue()));
+    }
+
+    /**
+     * Tests getHelloBodyAsByteArray() method.
+     */
+    @Test
+    public void testReadHelloBody() throws Exception {
+        helloPacket.getHelloBodyAsByteArray();
+        assertThat(helloPacket, is(notNullValue()));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(helloPacket.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Utility method used by junit methods.
+     */
+    private byte[] createByteForHelloPacket() {
+        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};
+
+        return helloPacket;
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/LsAcknowledgeTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/LsAcknowledgeTest.java
new file mode 100644
index 0000000..dd5af91
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/LsAcknowledgeTest.java
@@ -0,0 +1,208 @@
+/*
+ * 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.hamcrest.MatcherAssert;
+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.protocol.lsa.LsaHeader;
+import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
+import org.onosproject.ospf.protocol.ospfpacket.OspfPacketHeader;
+import org.onosproject.ospf.protocol.util.OspfPacketType;
+
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for LsAck.
+ */
+public class LsAcknowledgeTest {
+
+    private LsaHeader lsaHeader;
+    private LsAcknowledge lsAck;
+    private OspfPacketType ospfPacketType;
+    private OspfPacketHeader ospfPacketHeader;
+    private byte[] result;
+    private ChannelBuffer channelBuffer;
+    private OpaqueLsaHeader opaqueLsaHeader;
+
+    @Before
+    public void setUp() throws Exception {
+        lsaHeader = new LsaHeader();
+        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);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        lsaHeader = null;
+        lsAck = null;
+        ospfPacketType = null;
+        ospfPacketHeader = null;
+        result = null;
+        channelBuffer = null;
+        opaqueLsaHeader = null;
+    }
+
+    /**
+     * Tests getLinkStateHeaders() getter method.
+     */
+    @Test
+    public void testGetLinkStateHeaders() throws Exception {
+        lsaHeader = createLsaHeader();
+        lsAck.addLinkStateHeader(lsaHeader);
+        lsAck.addLinkStateHeader(lsaHeader);
+        List headers = lsAck.getLinkStateHeaders();
+        assertThat(headers.size(), is(1));
+
+    }
+
+    /**
+     * Tests addLinkStateHeader() method.
+     */
+    @Test
+    public void testAddLinkStateHeader() throws Exception {
+        lsaHeader = createLsaHeader();
+        lsAck.addLinkStateHeader(lsaHeader);
+        lsAck.addLinkStateHeader(lsaHeader);
+        assertThat(lsAck, is(notNullValue()));
+    }
+
+
+    /**
+     * Tests ospfMessageType() getter method.
+     */
+    @Test
+    public void testGetOSPFMessageType() throws Exception {
+        ospfPacketType = lsAck.ospfMessageType();
+        assertThat(ospfPacketType, is(notNullValue()));
+        assertThat(ospfPacketType, is(OspfPacketType.LSAACK));
+    }
+
+    /**
+     * Tests ospfMessageType() getter method.
+     */
+    @Test
+    public void testGetOspfMessageType() throws Exception {
+        ospfPacketType = lsAck.ospfMessageType();
+        assertThat(ospfPacketType, is(notNullValue()));
+        assertThat(ospfPacketType, is(OspfPacketType.LSAACK));
+    }
+
+    /**
+     * 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(5);
+        ospfPacketHeader.setOspfVer(2);
+        ospfPacketHeader.setRouterId(Ip4Address.valueOf("2.2.2.2"));
+        ospfPacketHeader.setSourceIp(Ip4Address.valueOf("3.3.3.3"));
+        result = createByteForLSAck();
+        lsAck = new LsAcknowledge(ospfPacketHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(result);
+        lsAck.readFrom(channelBuffer);
+        assertThat(lsAck, is(notNullValue()));
+        assertThat(lsAck.ospfMessageType(), is(OspfPacketType.LSAACK));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result = lsAck.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLsAckAsByteArray() method.
+     */
+    @Test
+    public void testGetLsAckAsByteArray() throws Exception {
+        result = lsAck.getLsAckAsByteArray();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLsAckBodyAsByteArray() method.
+     */
+    @Test
+    public void testGetLsAckBodyAsByteArray() throws Exception {
+        lsaHeader = createLsaHeader();
+        opaqueLsaHeader = new OpaqueLsaHeader();
+        lsAck.addLinkStateHeader(lsaHeader);
+        lsAck.addLinkStateHeader(opaqueLsaHeader);
+        result = lsAck.getLsAckBodyAsByteArray();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        MatcherAssert.assertThat(lsAck.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Utility method used by junit methods.
+     */
+    private LsaHeader createLsaHeader() {
+        lsaHeader = new LsaHeader();
+        lsaHeader.setAge(10);
+        lsaHeader.setLinkStateId("10.226.165.164");
+        lsaHeader.setLsCheckSum(222);
+        lsaHeader.setLsPacketLen(48);
+        lsaHeader.setLsSequenceNo(2020);
+        lsaHeader.setLsType(5);
+        lsaHeader.setOptions(2);
+        lsaHeader.setAdvertisingRouter(Ip4Address.valueOf("10.226.165.165"));
+        return lsaHeader;
+    }
+
+    /**
+     * Utility method used by junit methods.
+     */
+    private byte[] createByteForLSAck() {
+        byte[] lsAckPacket = {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};
+
+        return lsAckPacket;
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/LsRequestTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/LsRequestTest.java
new file mode 100644
index 0000000..41c9c4f
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/LsRequestTest.java
@@ -0,0 +1,182 @@
+/*
+ * 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.protocol.ospfpacket.OspfPacketHeader;
+import org.onosproject.ospf.protocol.ospfpacket.subtype.LsRequestPacket;
+import org.onosproject.ospf.protocol.util.OspfPacketType;
+
+import java.net.UnknownHostException;
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for LsRequest.
+ */
+public class LsRequestTest {
+
+    private LsRequest lsRequest;
+    private List<LsRequestPacket> result;
+    private OspfPacketType ospfMessageType;
+    private OspfPacketHeader ospfPacketHeader;
+    private byte[] result1;
+    private String result2;
+    private ChannelBuffer channelBuffer;
+    private LsRequestPacket lsRequestPacket;
+
+    @Before
+    public void setUp() throws Exception {
+        lsRequest = new LsRequest();
+        lsRequest.setAuthType(1);
+        lsRequest.setOspftype(3);
+        lsRequest.setRouterId(Ip4Address.valueOf("10.226.165.164"));
+        lsRequest.setAreaId(Ip4Address.valueOf("10.226.165.163"));
+        lsRequest.setChecksum(201);
+        lsRequest.setAuthentication(2);
+        lsRequest.setOspfPacLength(48);
+        lsRequest.setOspfVer(2);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        lsRequest = null;
+        result = null;
+        ospfMessageType = null;
+        ospfPacketHeader = null;
+        result1 = null;
+        channelBuffer = null;
+        lsRequestPacket = null;
+    }
+
+    /**
+     * Tests addLinkStateRequests() method.
+     */
+    @Test
+    public void testAddLinkStateRequests() throws Exception {
+        lsRequest.addLinkStateRequests(createLsRequestPacket());
+        result = lsRequest.getLinkStateRequests();
+        assertThat(result, is(notNullValue()));
+        assertThat(result.size(), is(1));
+    }
+
+    /**
+     * Tests getLinkStateRequests() method.
+     */
+    @Test
+    public void testGetLinkStateRequests() throws Exception {
+        lsRequest.addLinkStateRequests(createLsRequestPacket());
+        lsRequest.addLinkStateRequests(new LsRequestPacket());
+        result = lsRequest.getLinkStateRequests();
+        assertThat(result, is(notNullValue()));
+        assertThat(result.size(), is(2));
+    }
+
+    /**
+     * Tests ospfMessageType()getter  method.
+     */
+    @Test
+    public void testGetOspfMessageType() throws Exception {
+        ospfMessageType = lsRequest.ospfMessageType();
+        assertThat(ospfMessageType, is(notNullValue()));
+        assertThat(ospfMessageType, is(OspfPacketType.LSREQUEST));
+    }
+
+    /**
+     * 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(3);
+        ospfPacketHeader.setOspfVer(2);
+        ospfPacketHeader.setRouterId(Ip4Address.valueOf("2.2.2.2"));
+        ospfPacketHeader.setSourceIp(Ip4Address.valueOf("3.3.3.3"));
+        lsRequest = new LsRequest(ospfPacketHeader);
+        result1 = createByteLsReqestPacket();
+        channelBuffer = ChannelBuffers.copiedBuffer(result1);
+        lsRequest.readFrom(channelBuffer);
+        assertThat(lsRequest, is(notNullValue()));
+        assertThat(lsRequest.ospfMessageType(), is(OspfPacketType.LSREQUEST));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result1 = lsRequest.asBytes();
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLsrHeaderAsByteArray() method.
+     */
+    @Test
+    public void testGetLsrHeaderAsByteArray() throws Exception {
+        result1 = lsRequest.getLsrHeaderAsByteArray();
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLsrBodyAsByteArray() method.
+     */
+    @Test
+    public void testGetLsrBodyAsByteArray() throws Exception {
+        lsRequest.addLinkStateRequests(createLsRequestPacket());
+        lsRequest.addLinkStateRequests(new LsRequestPacket());
+        result1 = lsRequest.getLsrBodyAsByteArray();
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        result2 = lsRequest.toString();
+        assertThat(result2, is(notNullValue()));
+    }
+
+    private LsRequestPacket createLsRequestPacket() throws UnknownHostException {
+        lsRequestPacket = new LsRequestPacket();
+        lsRequestPacket.setOwnRouterId("165");
+        lsRequestPacket.setLinkStateId("10.226.165.164");
+        lsRequestPacket.setLsType(2);
+        return lsRequestPacket;
+    }
+
+    private byte[] createByteLsReqestPacket() {
+        byte[] lsRequestPacket = {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};
+        return lsRequestPacket;
+    }
+}
\ No newline at end of file