MME2 changes - Propped commits from openmme/paging branch. Added scripts
for code gen
Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/scripts/GtpV2StackCodeGen/tts/grpieinsttemplate.cpp.tt b/scripts/GtpV2StackCodeGen/tts/grpieinsttemplate.cpp.tt
new file mode 100644
index 0000000..60935b4
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/grpieinsttemplate.cpp.tt
@@ -0,0 +1,261 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "[% tempdata.fileName %].h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+[% FOREACH ieData IN tempdata.ieList -%]
+#include "[% ieData.ieFileName %].h"
+[% END -%]
+
+[% tempdata.msgClassName %]::
+[% tempdata.msgClassName %]()
+{
+[% PROCESS MandIeList %]
+}
+
+[% tempdata.msgClassName %]::
+~[% tempdata.msgClassName %]()
+{
+
+}
+bool [% tempdata.msgClassName %]::
+encode[% tempdata.msgClassName %](MsgBuffer &buffer,
+ [% tempdata.msgClassName %]Data
+ const &data)
+{
+ bool rc = false;
+ GtpV2IeHeader header;
+ Uint16 startIndex = 0;
+ Uint16 endIndex = 0;
+ Uint16 length = 0;
+[% FOREACH ieData IN tempdata.ieList -%]
+
+[% IF ieData.iePresence != 'M' -%]
+ if (data.[% ieData.ieVarName %]IePresent)
+ {
+ [% INCLUDE tts/msgEncode.tt FILTER indent%]
+ if (!(rc))
+ {
+ errorStream.add((char *)"Failed to encode IE: [% ieData.ieVarName %]\n");
+ return false;
+ }
+ }
+[% ELSE %]
+ [% INCLUDE tts/msgEncode.tt -%]
+ if (!(rc))
+ {
+ errorStream.add((char *)"Failed to encode IE: [% ieData.ieVarName %]\n");
+ return false;
+ }
+[% END -%]
+[% END -%]
+ return rc;
+}
+
+bool [% tempdata.msgClassName %]::
+decode[% tempdata.msgClassName %](MsgBuffer &buffer,
+ [% tempdata.msgClassName %]Data
+ &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){
+[% FOREACH ieTypeEntry IN tempdata.ieTypeList -%]
+ case [% ieTypeEntry %]IeType:
+ {
+ [% ieTypeEntry %]Ie ieObject =
+ dynamic_cast<
+ [% ieTypeEntry %]Ie&>(GtpV2IeFactory::getInstance().
+ getIeObject([% ieTypeEntry %]IeType));
+[% SET first = 1 -%]
+[% FOREACH ieTypeData IN tempdata.ieList -%]
+[% IF ieTypeData.ieType == ieTypeEntry -%]
+
+[% IF first == 1 -%]
+[% SET first = 0 %]
+ if(ieHeader.instance == [% ieTypeData.instance %])
+[% ELSE -%]
+ else if(ieHeader.instance == [% ieTypeData.instance %])
+[% END -%]
+ {
+
+ [% INCLUDE tts/msgDecode.tt %]
+[% IF ieTypeData.ieCardinality == 1 %][% IF ieTypeData.iePresence != "M" -%]
+ data.[% ieTypeData.ieVarName %]IePresent = true;
+[% END %][% END -%]
+ if (!(rc))
+ {
+ errorStream.add((char *)"Failed to decode IE: [% ieTypeData.ieVarName %]\n");
+ return false;
+ }
+[% IF ieTypeData.iePresence == 'M' -%]
+ Uint16 mandIe = [% ieTypeEntry %]IeType;
+ mandIe = (mandIe << 8) | [% ieTypeData.instance %];
+ mandatoryIeLocalList.erase(mandIe);
+[% END -%]
+ }
+[% END -%]
+[% END -%]
+ else
+ {
+ // Unknown IE instance print error TODO
+ errorStream.add((char *)"Unknown IE Type: ");
+ errorStream.add(ieHeader.ieType);
+ errorStream.endOfLine();
+ buffer.skipBytes(ieHeader.length);
+ }
+ break;
+ }
+[% END -%]
+ default:
+ {
+ // Unknown IE print error
+ errorStream.add((char *)"Unknown IE Type: ");
+ errorStream.add(ieHeader.ieType);
+ errorStream.endOfLine();
+ buffer.skipBytes(ieHeader.length);
+ }
+ }
+ }
+ if (!mandatoryIeLocalList.empty())
+ {
+ // some mandatory IEs are missing
+ errorStream.add((char *)"Missing Mandatory IEs:");
+ errorStream.endOfLine();
+ while (!mandatoryIeLocalList.empty())
+ {
+ Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+ mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+ Uint16 missingInstance = missingMandIe & 0x00FF;
+ Uint16 missingIeType = (missingMandIe >> 8);
+ errorStream.add ((char *)"Missing Ie type: ");
+ errorStream.add (missingIeType);
+ errorStream.add ((char *)" Instance: ");
+ errorStream.add (missingInstance);
+ errorStream.endOfLine();
+ }
+ rc = false;
+
+ }
+ return rc;
+}
+
+void [% tempdata.msgClassName %]::
+display[% tempdata.msgClassName %]Data_v
+([% tempdata.msgClassName %]Data const &data, Debug &stream)
+{
+ stream.incrIndent();
+ stream.add((char *)"[% tempdata.msgClassName %]:");
+ stream.endOfLine();
+ stream.incrIndent();
+[% FOREACH ieData IN tempdata.ieList -%]
+
+[% IF ieData.iePresence != 'M' -%][% IF ieData.ieCardinality == 1 -%]
+ if (data.[% ieData.ieVarName %]IePresent)
+ {
+
+[% IF ieData.ieCardinality == 1 -%]
+ stream.add((char *)"[% ieData.ieVarName %]:");
+ stream.endOfLine();
+ [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+ dynamic_cast<
+ [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+ [% PROCESS ieDisplay_grp %]
+[% ELSE -%]
+ for (Uint8 i = 0; i < data.[% ieData.ieVarName %]Count; i++)
+ {
+ stream.add((char *)"IE - [% ieData.ieVarName %]:");
+ stream.endOfLine();
+ [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+ dynamic_cast<[% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+ [% PROCESS ieDisplay_grp %]
+ }
+[% END -%]
+ }
+[% ELSE -%]
+[% IF ieData.ieCardinality == 1 -%]
+ stream.add((char *)"[% ieData.ieVarName %]:");
+ stream.endOfLine();
+ [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+ dynamic_cast<
+ [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+[% PROCESS ieDisplay_grp -%]
+[% ELSE -%]
+ for (Uint8 i = 0; i < data.[% ieData.ieVarName %]Count; i++)
+ {
+ stream.add((char *)"IE - [% ieData.ieVarName %]:");
+ stream.endOfLine();
+ [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+ dynamic_cast<[% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+ [% PROCESS ieDisplay_grp -%]
+ }
+[% END -%]
+[% END %][% END -%]
+[% END -%]
+
+ stream.decrIndent();
+ stream.decrIndent();
+}
+
+
+[% BLOCK ieDisplay_grp -%]
+[% IF ieData.grouped == "Yes" -%]
+ [% ieData.grpIeInstClassName %] groupedIeInstance =
+ dynamic_cast<
+ [% ieData.grpIeInstClassName %]&>([% ieData.ieLocalVar %].getGroupedIe(msgType, [% ieData.instance %]));
+ groupedIeInstance.display[% ieData.grpIeInstClassName %]Data_v(data.[% ieData.ieVarName %][% PROCESS cardinalIndex %], stream);
+[% ELSE -%]
+ [% ieData.ieLocalVar %].display[% ieData.ieType %]Ie_v(data.[% ieData.ieVarName %][% PROCESS cardinalIndex %], stream);
+[% END -%]
+[% END -%]
+
+[% BLOCK cardinalIndex -%]
+[% IF ieData.ieCardinality != 1 %][i][% END -%]
+[% END -%]
+
+
+[% BLOCK MandIeList -%]
+[% SET first = 1 -%]
+[% FOREACH ieData IN tempdata.ieList -%]
+[% IF ieData.iePresence == 'M' -%]
+[% IF first == 1 -%]
+ Uint16 mandIe;
+[% SET first = 0 -%]
+[% END -%]
+ mandIe = [% ieData.ieType %]IeType;
+ mandIe = (mandIe << 8) | [% ieData.instance %]; // [% ieData.ieVarName %]
+ mandatoryIeSet.insert(mandIe);
+[% END -%]
+[% END -%]
+[% END -%]
\ No newline at end of file