123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- /*
- * Copyright (c) 2021 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #include <iostream>
- #include <string>
- #include <cstring>
- #include "UlsoPacket.h"
- using std::cout;
- using std::endl;
- using std::string;
- static uint8_t buf[UlsoPacket<UdpHeader>::maxSize];
- static uint8_t qmapIPv4UdpPacketNoSeg[] = {
- //C=0,Next Header=1,PAD=b'63,MUXID=0,Packet length=30
- 0X7f, 0x00, 0x00, 0x1e,//QMAP header
- //type=3,Next Header=0,IPIDCfg=1,Zero Checksum=1,Additional header size=0,segment size=2
- 0X06, 0xc0, 0x00, 0x02,//QMAP header extension
- //IPv4 header
- 0x45, 0x00, 0x00, 0x1e,//version=4,IHL=5,DSCP=0,ECN=0,length=30
- 0x00, 0x00, 0x00, 0x00,//id=0,flags=0,fragment offset=0
- 0xff, 0x11, 0x00, 0x00,//TTL=255,Protocol=17 (TCP),checksum=
- 0xc0, 0xa8, 0x02, 0x13,//IPv4 SRC Addr 192.168.2.19
- 0xc0, 0xa8, 0x02, 0x68,//IPv4 DST Addr 192.168.2.104
- //UDP header
- 0x04, 0x57, 0x08, 0xae,//source port=1111, destination port=2222
- 0x00, 0x0a, 0x00, 0x00,//length=10,checksum=
- //payload
- 0x00, 0x01
- };
- static uint8_t qmapIPv4UdpPacket[] = {
- //C=0,Next Header=1,PAD=b'63,MUXID=0,Packet length=30
- 0X7f, 0x00, 0x00, 0x1e,//QMAP header
- //type=3,Next Header=0,IPIDCfg=1,Zero Checksum=1,Additional header size=0,segment size=1
- 0X06, 0xc0, 0x00, 0x01,//QMAP header extension
- //IPv4 header
- 0x45, 0x00, 0x00, 0x1e,//version=4,IHL=5,DSCP=0,ECN=0,length=30
- 0x00, 0x00, 0x00, 0x00,//id=0,flags=0,fragment offset=0
- 0xff, 0x11, 0x00, 0x00,//TTL=255,Protocol=17 (TCP),checksum=
- 0xc0, 0xa8, 0x02, 0x13,//IPv4 SRC Addr 192.168.2.19
- 0xc0, 0xa8, 0x02, 0x68,//IPv4 DST Addr 192.168.2.104
- //UDP header
- 0x04, 0x57, 0x08, 0xae,//source port=1111, destination port=2222
- 0x00, 0x0a, 0x00, 0x00,//length=10,checksum=
- //payload
- 0x00, 0x01
- };
- static uint8_t qmapIPv4UdpPacket2[] = {
- //C=0,Next Header=1,PAD=b'63,MUXID=0,Packet length=30
- 0X7f, 0x00, 0x00, 0x20,//QMAP header
- //type=3,Next Header=0,IPIDCfg=0,Zero Checksum=1,Additional header size=0,segment size=1
- 0X06, 0x00, 0x00, 0x01,//QMAP header extension
- //IPv4 header
- 0x45, 0x00, 0x00, 0x20,//version=4,IHL=5,DSCP=0,ECN=0,length=30
- 0x00, 0x00, 0x00, 0x00,//id=0,flags=0,fragment offset=0
- 0xff, 0x11, 0x00, 0x00,//TTL=255,Protocol=17 (TCP),checksum=
- 0xc0, 0xa8, 0x02, 0x13,//IPv4 SRC Addr 192.168.2.19
- 0xc0, 0xa8, 0x02, 0x68,//IPv4 DST Addr 192.168.2.104
- //UDP header
- 0x04, 0x57, 0x08, 0xae,//source port=1111, destination port=2222
- 0x00, 0x0c, 0x00, 0x00,//length=10,checksum=
- //payload
- 0x00, 0x01, 0x02, 0x03
- };
- char sep[] = "---------------------------------------------"
- "---------------------------------------------"
- "---------------------------------------------"
- "---------------------------------------------"
- "---------------------------------------------";
- void printDemoHeadline(const string& name) {
- string full = "###################################################"
- "###################################################";
- string side = "############################";
- string space = " ";
- cout << full << endl << side << space << "Demo " + name << space
- << side << endl << full << endl;
- }
- void demo(UlsoPacket<>& ulsoPacket, const string& name) {
- printDemoHeadline(name);
- cout << ulsoPacket << endl;
- cout << sep << endl;
- vector<UlsoPacket<>> packets = ulsoPacket.segment();
- std::for_each(packets.begin(), packets.end(), [](const auto& p){cout << p << endl;
- cout << sep << endl;});
- }
- void testIpv4Tcp(){
- using L2Type = IPv4Header;
- using L3Type = TcpHeader;
- using PacketType = UlsoPacket<L3Type, L2Type>;
- size_t payloadSize = 91, segmentSize = 32;
- size_t packetSize = QmapHeader::mSize + L2Type::mSize + L3Type::mSize + payloadSize;
- PacketType p1(segmentSize, payloadSize);
- cout << p1 << endl;
- uint8_t ipv4HeaderBuf[packetSize];
- p1.asArray(ipv4HeaderBuf);
- uint8_t *ipv4HeaderPtr = ipv4HeaderBuf;
- uint8_t *goldBuf = QmapIpv4TcpPacket.l2Packet();
- for(unsigned int i=0; i<QmapIpv4TcpPacket.l2PacketSize(); i++){
- if(ipv4HeaderPtr[i] != goldBuf[i]){
- cout << "ipv4HeaderBuf[" << i << "]=" << std::hex << std::setfill('0') << std::setw(2) <<
- static_cast<int>(ipv4HeaderPtr[i]) << std::dec << ", goldBuf[" << i << "]=" << std::setfill('0') <<
- std::setw(2) << std::hex << static_cast<int>(goldBuf[i]) << std::dec << endl;
- }
- }
- }
- void testIpv4Udp(){
- using L2Type = IPv4Header;
- using L3Type = UdpHeader;
- using PacketType = UlsoPacket<L3Type, L2Type>;
- size_t payloadSize = 80, segmentSize = 32;
- size_t packetSize = QmapHeader::mSize + L2Type::mSize + L3Type::mSize + payloadSize;
- PacketType p1(segmentSize, payloadSize);
- cout << p1 << endl;
- uint8_t ipv4UdpHeaderBuf[packetSize];
- p1.asArray(ipv4UdpHeaderBuf);
- uint8_t *udpHeaderPtr = ipv4UdpHeaderBuf + QmapHeader::mSize + L2Type::mSize;
- uint8_t *goldBuf = udpPacket.l3Packet();
- for(unsigned int i=0; i<udpPacket.l3PacketSize(); i++){
- if(udpHeaderPtr[i] != goldBuf[i]){
- cout << "udpPayload[" << i << "]=" << std::hex << std::setfill('0') << std::setw(2) <<
- static_cast<int>(udpHeaderPtr[i]) << std::dec << ", goldBuf[" << i << "]=" << std::setfill('0') <<
- std::setw(2) << std::hex << static_cast<int>(goldBuf[i]) << std::dec << endl;
- }
- }
- }
- template<typename L3Type, typename L2Type>
- size_t packetTestOffset(const struct Packet& p){
- return QmapHeader::mSize + (p.l2Size == 0) * L2Type::mSize + (p.l3Size == 0) * L3Type::mSize;
- }
- template<typename L3Type, typename L2Type>
- bool testPacketConstruction(struct Packet packet, size_t segmentSize=20){
- auto testOffsetFunc = packetTestOffset<L3Type, L2Type>;
- using PacketType = UlsoPacket<L3Type, L2Type>;
- size_t ipPacketSize = packet.l2PacketSize();
- PacketType ulsoPacket(segmentSize, packet.payload(), packet.payloadSize);
- if(ulsoPacket.size() - testOffsetFunc(packet) != ipPacketSize){
- cout << "Error: ULSO packet size = " << ulsoPacket.size() << " expected size = " << ipPacketSize << endl;
- return false;
- }
- uint8_t ulsoPacketBuf[ulsoPacket.size()];
- ulsoPacket.asArray(ulsoPacketBuf);
- uint8_t *ulsoCmpBuf = ulsoPacketBuf + testOffsetFunc(packet);
- uint8_t *goldBuf = packet.l2Packet();
- for(unsigned int i=0; i<ipPacketSize; i++){
- if(ulsoCmpBuf[i] != goldBuf[i]){
- cout << "afterQmapPtr[" << i << "]=" << std::hex << std::setfill('0') << std::setw(2) <<
- static_cast<int>(ulsoCmpBuf[i]) << std::dec << ", goldBuf[" << i << "]=" << std::setfill('0') <<
- std::setw(2) << std::hex << static_cast<int>(goldBuf[i]) << std::dec << endl;
- }
- }
- return true;
- }
- int main() {
- uint8_t arr[UlsoPacket<>::maxSize] = {0};
- UlsoPacket<UdpHeader, IPv4Header> p(19, 100, false);
- p.mQmapHeader.setmIpIdCfg(0);
- cout << p << endl;
- auto v = p.segment();
- for(auto& pSeg: v){
- memset(arr, 0, UlsoPacket<>::maxSize);
- cout << pSeg << endl;
- }
- return 0;
- }
|