serializer.test 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. %description:
  2. Test serializing frames
  3. %inifile: omnetpp.ini
  4. [General]
  5. #debugger-attach-on-startup=true
  6. #debugger-attach-on-error=true
  7. %includes:
  8. #include <stdio.h>
  9. #include <iostream>
  10. #include "inet/common/serializer/SerializerBase.h"
  11. #include "inet/common/serializer/headerserializers/EthernetCRC.h"
  12. #include "inet/common/serializer/headerserializers/ethernet/EthernetSerializer.h"
  13. #include "inet/common/serializer/headerserializers/ieee80211/Ieee80211Serializer.h"
  14. %global:
  15. using namespace inet;
  16. using namespace inet::serializer;
  17. #define PCAP_MAGIC 0xa1b2c3d4
  18. /* "libpcap" file header (minus magic number). */
  19. struct pcap_hdr
  20. {
  21. uint32_t magic; /* magic */
  22. uint16_t version_major; /* major version number */
  23. uint16_t version_minor; /* minor version number */
  24. uint32_t thiszone; /* GMT to local correction */
  25. uint32_t sigfigs; /* accuracy of timestamps */
  26. uint32_t snaplen; /* max length of captured packets, in octets */
  27. uint32_t network; /* data link type */
  28. };
  29. /* "libpcap" record header. */
  30. struct pcaprec_hdr
  31. {
  32. int32_t ts_sec; /* timestamp seconds */
  33. uint32_t ts_usec; /* timestamp microseconds */
  34. uint32_t incl_len; /* number of octets of packet saved in file */
  35. uint32_t orig_len; /* actual length of packet */
  36. };
  37. uint16_t swapByteOrder16(uint16_t v)
  38. {
  39. return ((v & 0xFF) << 8) | ((v & 0xFF00) >> 8);
  40. }
  41. uint32_t swapByteOrder32(uint32_t v)
  42. {
  43. return ((v & 0xFFL) << 24) | ((v & 0xFF00L) << 8) | ((v & 0xFF0000L) >> 8) | ((v & 0xFF000000L) >> 24);
  44. }
  45. #if OMNETPP_VERSION < 0x0500
  46. //cClassDescriptor compatibility
  47. #define getFieldValueAsString(a, b, c) getFieldAsString((a), (b), (c))
  48. #define getFieldProperty(a, b) getFieldProperty(nullptr, (a), (b))
  49. #define getFieldName(a) getFieldName(nullptr, (a))
  50. #define getFieldIsCObject(a) getFieldIsCObject(nullptr, (a))
  51. #define getFieldCount() getFieldCount(nullptr)
  52. #define getFieldTypeString(a) getFieldTypeString(nullptr, (a))
  53. #define getFieldIsArray(a) getFieldIsArray(nullptr, (a))
  54. #define getFieldArraySize(a, b) getArraySize((a), (b))
  55. #define getFieldStructValuePointer(a, b, c) getFieldStructPointer((a), (b), (c))
  56. #define getFieldTypeFlags(a) getFieldTypeFlags(nullptr, (a))
  57. #define getFieldStructName(a) getFieldStructName(nullptr, (a))
  58. #endif // OMNETPP_VERSION < 0x0500
  59. static void printobject(cObject* object)
  60. {
  61. EV << object->getClassName() << ":" << endl;
  62. cClassDescriptor *descriptor = object->getDescriptor();
  63. for (int i = 0; i < descriptor->getFieldCount(); i++) {
  64. EV << " " << descriptor->getFieldName(i) << ": ";
  65. if (descriptor->getFieldIsArray(i)) {
  66. for (int j = 0; j < descriptor->getFieldArraySize(object, i); j++) {
  67. EV << " [" << j << "]: " << descriptor->getFieldValueAsString(object,i,j) << endl;
  68. }
  69. }
  70. else
  71. EV << descriptor->getFieldValueAsString(object,i,0) << endl;
  72. }
  73. }
  74. static void testRecord(const char* filename, bool fcs = true)
  75. {
  76. FILE *pcapFile;
  77. struct pcap_hdr fileHeader;
  78. struct pcaprec_hdr recordHeader;
  79. static uint8_t readBuf[60000];
  80. static uint8_t writeBuf[60000];
  81. memset((void*)&readBuf, 0, sizeof(readBuf));
  82. memset((void*)&writeBuf, 0, sizeof(writeBuf));
  83. EV << "=== Testing file " << filename << endl;
  84. pcapFile = fopen(filename, "rb");
  85. if (!pcapFile)
  86. throw cRuntimeError("pcap file '%s' can not opened.", filename);
  87. size_t err = fread(&fileHeader, sizeof(fileHeader), 1, pcapFile);
  88. if (err != 1)
  89. throw cRuntimeError("Can not read pcap fileheader from file '%s', errno is %ld.", filename, err);
  90. if (fileHeader.magic == 0xa1b2c3d4)
  91. {
  92. }
  93. else if (fileHeader.magic == 0xd4c3b2a1)
  94. {
  95. fileHeader.version_major = swapByteOrder16(fileHeader.version_major);
  96. fileHeader.version_minor = swapByteOrder16(fileHeader.version_minor);
  97. fileHeader.thiszone = swapByteOrder32(fileHeader.thiszone);
  98. fileHeader.sigfigs = swapByteOrder32(fileHeader.sigfigs);
  99. fileHeader.snaplen = swapByteOrder32(fileHeader.snaplen);
  100. fileHeader.network = swapByteOrder32(fileHeader.network);
  101. }
  102. else
  103. throw cRuntimeError("unknown pcap fileheader from file '%s'", filename);
  104. err = fread(&recordHeader, sizeof(recordHeader), 1, pcapFile);
  105. if (err != 1)
  106. throw cRuntimeError("Can not read pcap recordheader from file '%s', errno is %ld.", filename, err);
  107. if (fileHeader.magic != 0xa1b2c3d4)
  108. {
  109. recordHeader.ts_sec = swapByteOrder32(recordHeader.ts_sec);
  110. recordHeader.ts_usec = swapByteOrder32(recordHeader.ts_usec);
  111. recordHeader.orig_len = swapByteOrder32(recordHeader.orig_len);
  112. recordHeader.incl_len = swapByteOrder32(recordHeader.incl_len);
  113. }
  114. fread(&readBuf, recordHeader.incl_len, 1, pcapFile);
  115. fclose(pcapFile);
  116. uint32_t serializedLength = 0;
  117. uint32_t incl_len = recordHeader.incl_len;
  118. if (! fcs && fileHeader.network == LINKTYPE_ETHERNET && recordHeader.incl_len == recordHeader.orig_len) {
  119. // add FCS
  120. Buffer b(readBuf, incl_len + 4);
  121. b.seek(incl_len);
  122. uint32_t fcs = ethernetCRC(b._getBuf(), b.getPos());
  123. b.writeUint32(fcs);
  124. incl_len = b.getPos();
  125. }
  126. Buffer rb(readBuf, incl_len);
  127. Buffer wb(writeBuf, sizeof(writeBuf));
  128. Context c;
  129. cPacket *frame = SerializerBase::lookupAndDeserialize(rb, c, LINKTYPE, fileHeader.network);
  130. ASSERT(frame);
  131. for (cPacket *temp = frame; temp; temp = temp->getEncapsulatedPacket())
  132. printobject(temp);
  133. SerializerBase::lookupAndSerialize(frame, wb, c, LINKTYPE, fileHeader.network);
  134. serializedLength = wb.getPos();
  135. delete frame;
  136. if(incl_len == serializedLength)
  137. EV << "Frame lengths are the same" << endl;
  138. else
  139. EV << "Frame lengths are not the same: " << incl_len << " ws " << serializedLength << endl;
  140. if(incl_len == serializedLength && !memcmp(readBuf, writeBuf, fcs ? serializedLength : serializedLength - 4))
  141. EV << "Frames are the same" << endl;
  142. else
  143. EV << "Frames are not the same" << endl;
  144. }
  145. %activity:
  146. testRecord("../../pcap/rarp_request.pcap", false);
  147. testRecord("../../pcap/rarp_req_reply.pcap", false);
  148. testRecord("../../pcap/Ethernet_Pause_Frame.pcap", false);
  149. testRecord("../../pcap/eth_fcs_good.pcap", true);
  150. //testRecord("../../pcap/v6.pcap", false);
  151. //testRecord("../../pcap/tcp_ok_capture.pcap", false);
  152. //testRecord("../../pcap/80211ack.pcap", false);
  153. %contains-regex: stdout
  154. === Testing file ../../pcap/rarp_request.pcap
  155. .*
  156. Frames are the same
  157. === Testing file ../../pcap/rarp_req_reply.pcap
  158. .*
  159. Frames are the same
  160. === Testing file ../../pcap/Ethernet_Pause_Frame.pcap
  161. .*
  162. Frames are the same
  163. === Testing file ../../pcap/eth_fcs_good.pcap
  164. .*
  165. Frames are the same
  166. %not-contains: stdout
  167. Frames are not the same