Files
android_kernel_samsung_sm86…/kernel-tests/network_traffic/main.cpp
Ilia Lin e1eceb1b3f dataipa: network-traffic: unit test compile-time fixes
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>
2021-11-21 04:03:43 -08:00

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;
}