%description: Test the IP fragmentation reassembly buffer (IPv4FragBuf class) %includes: #include #include "inet/networklayer/ipv4/IPv4FragBuf.h" #include "inet/networklayer/ipv4/IPv4Datagram.h" %global: using namespace inet; struct Frag { ushort id; long src; long dest; ushort offset; ushort bytes; bool islast; }; typedef std::vector FragVector; bool insertFragment(IPv4FragBuf& fragbuf, Frag& f) { IPv4Datagram *frag = new IPv4Datagram(); frag->setIdentification(f.id); frag->setSrcAddress(IPv4Address(f.src)); frag->setDestAddress(IPv4Address(f.dest)); frag->setFragmentOffset(f.offset); frag->setMoreFragments(!f.islast); frag->setHeaderLength(24); frag->setByteLength(24+f.bytes); IPv4Datagram *dgram = fragbuf.addFragment(frag, 0); delete dgram; return dgram!=NULL; } %activity: // create a number of fragmented datagrams FragVector v; Frag f; int numdatagrams = 0; for (f.src=1024; f.src<1026; f.src++) { for (f.dest=2048; f.dest<2050; f.dest++) { for (f.id=0; f.id<80; f.id++) { numdatagrams++; int n = f.id/10+2; for (int i=0; i" << f.dest << ":" << f.id << " " << f.offset << " (" << f.bytes << ") " << (f.islast?"LAST":"") << "\n"; } EV << numdatagrams << " datagrams in " << v.size() << " fragments\n"; // try assemble them, fragments in original order IPv4FragBuf fragbuf1; int i, num; for (i=0, num=0; i=0; i--) if (insertFragment(fragbuf2, v[i])) num++; EV << "assembled in reverse order: " << num << "\n"; // shuffle fragments for (i=0; i<100000; i++) { int a = intrand(v.size()); int b = intrand(v.size()); f = v[a]; v[a] = v[b]; v[b] = f; } // try assemble shuffled fragments IPv4FragBuf fragbuf3; for (i=0, num=0; i