IPv6FragBuf_1.test 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. %description:
  2. Test the IPv6 fragmentation reassembly buffer (IPv6FragBuf class)
  3. Adapted from IPFragBuf_1.test.
  4. %includes:
  5. #include <vector>
  6. #include "inet/networklayer/ipv6/IPv6FragBuf.h"
  7. #include "inet/networklayer/ipv6/IPv6Datagram.h"
  8. #include "inet/networklayer/ipv6/IPv6ExtensionHeaders.h"
  9. %global:
  10. using namespace inet;
  11. struct Frag
  12. {
  13. ushort id;
  14. long src;
  15. long dest;
  16. ushort offset;
  17. ushort bytes;
  18. bool islast;
  19. };
  20. typedef std::vector<Frag> FragVector;
  21. bool insertFragment(IPv6FragBuf& fragbuf, Frag& f)
  22. {
  23. IPv6Datagram *frag = new IPv6Datagram();
  24. frag->setSrcAddress(IPv6Address(0,0,0,f.src));
  25. frag->setDestAddress(IPv6Address(0,0,0,f.dest));
  26. IPv6FragmentHeader *fh = new IPv6FragmentHeader();
  27. fh->setIdentification(f.id);
  28. fh->setFragmentOffset(f.offset);
  29. fh->setMoreFragments(!f.islast);
  30. frag->addExtensionHeader(fh);
  31. frag->setByteLength(40+8+f.bytes);
  32. IPv6Datagram *dgram = fragbuf.addFragment(frag, fh, 0);
  33. delete dgram;
  34. return dgram!=NULL;
  35. }
  36. %activity:
  37. // create a number of fragmented datagrams
  38. FragVector v;
  39. Frag f;
  40. int numdatagrams = 0;
  41. for (f.src=1024; f.src<1026; f.src++) {
  42. for (f.dest=2048; f.dest<2050; f.dest++) {
  43. for (f.id=0; f.id<80; f.id++) {
  44. numdatagrams++;
  45. int n = f.id/10+2;
  46. for (int i=0; i<n; i++) {
  47. f.offset=i*80;
  48. f.bytes=80;
  49. f.islast = (i==n-1);
  50. v.push_back(f);
  51. }
  52. }
  53. }
  54. }
  55. // dump
  56. for (int j=0; j<v.size(); j++)
  57. {
  58. Frag& f = v[j];
  59. EV << f.src << ">" << f.dest << ":" << f.id << " " << f.offset << " (" << f.bytes << ") " << (f.islast?"LAST":"") << "\n";
  60. }
  61. EV << numdatagrams << " datagrams in " << v.size() << " fragments\n";
  62. // try assemble them, fragments in original order
  63. IPv6FragBuf fragbuf1;
  64. int i, num;
  65. for (i=0, num=0; i<v.size(); i++)
  66. if (insertFragment(fragbuf1, v[i]))
  67. num++;
  68. EV << "assembled in original order: " << num << "\n";
  69. // try assemble fragments in reverse order
  70. IPv6FragBuf fragbuf2;
  71. for (i=v.size()-1, num=0; i>=0; i--)
  72. if (insertFragment(fragbuf2, v[i]))
  73. num++;
  74. EV << "assembled in reverse order: " << num << "\n";
  75. // shuffle fragments
  76. for (i=0; i<100000; i++)
  77. {
  78. int a = intrand(v.size());
  79. int b = intrand(v.size());
  80. f = v[a]; v[a] = v[b]; v[b] = f;
  81. }
  82. // try assemble shuffled fragments
  83. IPv6FragBuf fragbuf3;
  84. for (i=0, num=0; i<v.size(); i++)
  85. if (insertFragment(fragbuf3, v[i]))
  86. num++;
  87. EV << "assembled in random order: " << num << "\n";
  88. %contains: stdout
  89. 320 datagrams in 1760 fragments
  90. assembled in original order: 320
  91. assembled in reverse order: 320
  92. assembled in random order: 320