MME2 changes - Propped commits from openmme/paging branch. Added scripts
for code gen

Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/src/gtpV2Codec/msgClasses/deleteSessionResponseMsg.cpp b/src/gtpV2Codec/msgClasses/deleteSessionResponseMsg.cpp
new file mode 100644
index 0000000..292fe40
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/deleteSessionResponseMsg.cpp
@@ -0,0 +1,788 @@
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+
+/******************************************************************************
+ *
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/GtpV2StackCodeGen/tts/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "deleteSessionResponseMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/causeIe.h"
+#include "../ieClasses/recoveryIe.h"
+#include "../ieClasses/pcoIe.h"
+#include "../ieClasses/indicationIe.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/pgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/pgwsApnLevelLoadControlInformationInDeleteSessionResponse.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/sgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/pgwsOverloadControlInformationInDeleteSessionResponse.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInDeleteSessionResponse.h"
+#include "../ieClasses/epcoIe.h"
+
+DeleteSessionResponseMsg::DeleteSessionResponseMsg()
+{
+    msgType = DeleteSessionResponseMsgType;
+    Uint16 mandIe;
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+}
+
+DeleteSessionResponseMsg::~DeleteSessionResponseMsg()
+{
+
+}
+
+bool DeleteSessionResponseMsg::encodeDeleteSessionResponseMsg(MsgBuffer &buffer,
+                        DeleteSessionResponseMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+    if (data.recoveryIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RecoveryIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        rc = recovery.encodeRecoveryIe(buffer, data.recovery);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: recovery\n");
+            return false;
+        }
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+    if (data.indicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        rc = indication.encodeIndicationIe(buffer, data.indicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: indicationFlags\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        PgwsNodeLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+         PgwsNodeLevelLoadControlInformationInDeleteSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodePgwsNodeLevelLoadControlInformationInDeleteSessionResponse(buffer, data.pgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsApnLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        PgwsApnLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+         PgwsApnLevelLoadControlInformationInDeleteSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodePgwsApnLevelLoadControlInformationInDeleteSessionResponse(buffer, data.pgwsApnLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsApnLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        SgwsNodeLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+         SgwsNodeLevelLoadControlInformationInDeleteSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 2));
+        rc = groupedIeInstance.encodeSgwsNodeLevelLoadControlInformationInDeleteSessionResponse(buffer, data.sgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        PgwsOverloadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+         PgwsOverloadControlInformationInDeleteSessionResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodePgwsOverloadControlInformationInDeleteSessionResponse(buffer, data.pgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInDeleteSessionResponse&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInDeleteSessionResponse(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EpcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        rc = epco.encodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: extendedProtocolConfigurationOptions\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool DeleteSessionResponseMsg::decodeDeleteSessionResponseMsg(MsgBuffer &buffer,
+ DeleteSessionResponseMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RecoveryIeType:
+            {
+                RecoveryIe ieObject =
+                dynamic_cast<
+                RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRecoveryIe(buffer, data.recovery, ieHeader.length);
+
+                    data.recoveryIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: recovery\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IndicationIeType:
+            {
+                IndicationIe ieObject =
+                dynamic_cast<
+                IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIndicationIe(buffer, data.indicationFlags, ieHeader.length);
+
+                    data.indicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: indicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case LoadControlInformationIeType:
+            {
+                LoadControlInformationIe ieObject =
+                dynamic_cast<
+                LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					PgwsNodeLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+					dynamic_cast<
+					PgwsNodeLevelLoadControlInformationInDeleteSessionResponse&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodePgwsNodeLevelLoadControlInformationInDeleteSessionResponse(buffer, data.pgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.pgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					PgwsApnLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+					dynamic_cast<
+					PgwsApnLevelLoadControlInformationInDeleteSessionResponse&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodePgwsApnLevelLoadControlInformationInDeleteSessionResponse(buffer, data.pgwsApnLevelLoadControlInformation, ieHeader.length);
+
+                    data.pgwsApnLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsApnLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					SgwsNodeLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+					dynamic_cast<
+					SgwsNodeLevelLoadControlInformationInDeleteSessionResponse&>(ieObject.getGroupedIe(msgType, 2));
+					rc = groupedIeInstance.decodeSgwsNodeLevelLoadControlInformationInDeleteSessionResponse(buffer, data.sgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.sgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					PgwsOverloadControlInformationInDeleteSessionResponse groupedIeInstance =
+					dynamic_cast<
+					PgwsOverloadControlInformationInDeleteSessionResponse&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodePgwsOverloadControlInformationInDeleteSessionResponse(buffer, data.pgwsOverloadControlInformation, ieHeader.length);
+
+                    data.pgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					SgwsOverloadControlInformationInDeleteSessionResponse groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInDeleteSessionResponse&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInDeleteSessionResponse(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EpcoIeType:
+            {
+                EpcoIe ieObject =
+                dynamic_cast<
+                EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions, ieHeader.length);
+
+                    data.extendedProtocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: extendedProtocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void DeleteSessionResponseMsg::
+displayDeleteSessionResponseMsgData_v(DeleteSessionResponseMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"DeleteSessionResponseMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+        stream.add((char *)"IE - cause:");
+        stream.endOfLine();
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        cause.displayCauseIe_v(data.cause, stream);
+
+    if (data.recoveryIePresent)
+    {
+
+
+        stream.add((char *)"IE - recovery:");
+        stream.endOfLine();
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        recovery.displayRecoveryIe_v(data.recovery, stream);
+
+    }
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+    if (data.indicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - indicationFlags:");
+        stream.endOfLine();
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        indication.displayIndicationIe_v(data.indicationFlags, stream);
+
+    }
+    if (data.pgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            PgwsNodeLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+        PgwsNodeLevelLoadControlInformationInDeleteSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayPgwsNodeLevelLoadControlInformationInDeleteSessionResponseData_v(data.pgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.pgwsApnLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsApnLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            PgwsApnLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+        PgwsApnLevelLoadControlInformationInDeleteSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displayPgwsApnLevelLoadControlInformationInDeleteSessionResponseData_v(data.pgwsApnLevelLoadControlInformation, stream);
+
+    }
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            SgwsNodeLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+        SgwsNodeLevelLoadControlInformationInDeleteSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 2));
+        groupedIeInstance.displaySgwsNodeLevelLoadControlInformationInDeleteSessionResponseData_v(data.sgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.pgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            PgwsOverloadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+        PgwsOverloadControlInformationInDeleteSessionResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayPgwsOverloadControlInformationInDeleteSessionResponseData_v(data.pgwsOverloadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInDeleteSessionResponse&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displaySgwsOverloadControlInformationInDeleteSessionResponseData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - extendedProtocolConfigurationOptions:");
+        stream.endOfLine();
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        epco.displayEpcoIe_v(data.extendedProtocolConfigurationOptions, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+