IPFragBuf_1.test 2.5 KB

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