
1. Use size static member instead of method 2. Add missing arguments in a call inside default constructor Change-Id: Ib1b508e7d67742957551012c73f40d399651bb15 Acked-by: Eliad Ben Yishay <ebenyish@qti.qualcomm.com> Signed-off-by: Ilia Lin <quic_ilial@quicinc.com>
206 lines
8.7 KiB
C++
206 lines
8.7 KiB
C++
/*
|
|
* 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;
|
|
}
|