%description: Test the IPv6 fragmentation reassembly buffer (IPv6FragBuf class) Adapted from IPFragBuf_1.test. %includes: #include #include "inet/networklayer/ipv6/IPv6FragBuf.h" #include "inet/networklayer/ipv6/IPv6Datagram.h" #include "inet/networklayer/ipv6/IPv6ExtensionHeaders.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(IPv6FragBuf& fragbuf, Frag& f) { IPv6Datagram *frag = new IPv6Datagram(); frag->setSrcAddress(IPv6Address(0,0,0,f.src)); frag->setDestAddress(IPv6Address(0,0,0,f.dest)); IPv6FragmentHeader *fh = new IPv6FragmentHeader(); fh->setIdentification(f.id); fh->setFragmentOffset(f.offset); fh->setMoreFragments(!f.islast); frag->addExtensionHeader(fh); frag->setByteLength(40+8+f.bytes); IPv6Datagram *dgram = fragbuf.addFragment(frag, fh, 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 IPv6FragBuf 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 IPv6FragBuf fragbuf3; for (i=0, num=0; i