blob: 7664a8df8349eeb5e74f92f6b4d03697a430bd54 [file] [log] [blame]
/*
* Copyright (c) 2017,2020 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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdint.h>
#include "hton.h" /* for htonl*/
#include "RNDISAggregationTestFixture.h"
#include "Constants.h"
#include "TestsUtils.h"
#include "linux/msm_ipa.h"
#define IPV4_DST_ADDR_OFFSET (16)
#define IPV4_DST_ADDR_OFFSET_IN_ETH \
(16 /* IP */ + 14 /* ethernet */)
#define IPV4_DST_ADDR_OFFSET_IN_RNDIS \
(IPV4_DST_ADDR_OFFSET_IN_ETH + \
sizeof(struct RndisHeader))
#define NUM_PACKETS (4)
class RNDISAggregationSanityTest: public RNDISAggregationTestFixture {
public:
/////////////////////////////////////////////////////////////////////////////////
RNDISAggregationSanityTest()
{
m_name = "RNDISAggregationSanityTest";
m_description = "RNDISAggregationSanityTest - Send one packet "
"and expect same packet.";
}
/////////////////////////////////////////////////////////////////////////////////
virtual bool AddRules()
{
return AddRulesNoAgg();
} // AddRules()
/////////////////////////////////////////////////////////////////////////////////
bool TestLogic()
{
//The packets that will be sent
Byte pPacket[MAX_PACKET_SIZE];
//Buffer for the packet that will be received
Byte pReceivedPacket[2*MAX_PACKET_SIZE];
//Total size of all sent packets (this is the max size of the aggregated
//packet minus the size of the header and the NDP)
//int nTotalPacketsSize = MAX_PACKET_SIZE - (4 * NUM_PACKETS) - 24;
uint32_t nIPv4DSTAddr;
size_t pIpPacketsSize;
//initialize the packets
// Load input data (Ethernet packet) from file
pIpPacketsSize = MAX_PACKET_SIZE;
if (!RNDISAggregationHelper::LoadEtherPacket(m_eIP, pPacket, pIpPacketsSize))
{
LOG_MSG_ERROR("Failed default Packet");
return false;
}
nIPv4DSTAddr = ntohl(0x7F000001);
memcpy (&pPacket[IPV4_DST_ADDR_OFFSET_IN_ETH],&nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
//send the packet
LOG_MSG_DEBUG("Sending packet into the A2 EMB pipe(%d bytes)\n",
pIpPacketsSize);
size_t nBytesSent = m_UsbToIpaPipe.Send(pPacket, pIpPacketsSize);
if (pIpPacketsSize != nBytesSent)
{
LOG_MSG_ERROR("Sending packet into the A2 EMB pipe(%d bytes) "
"failed!\n", pIpPacketsSize);
return false;
}
//receive the packet
LOG_MSG_DEBUG("Reading packet from the A2 EMB pipe(%d bytes should be there)"
"\n", pIpPacketsSize);
size_t nBytesReceived = m_IpaToUsbPipe.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (pIpPacketsSize != nBytesReceived)
{
LOG_MSG_ERROR("Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", pIpPacketsSize);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
return RNDISAggregationHelper::ComparePackets(pReceivedPacket, nBytesReceived,
pPacket, pIpPacketsSize);
}
/////////////////////////////////////////////////////////////////////////////////
};
class RNDISAggregationDeaggregation1PacketTest: public RNDISAggregationTestFixture {
public:
/////////////////////////////////////////////////////////////////////////////////
RNDISAggregationDeaggregation1PacketTest()
{
m_name = "RNDISAggregationDeaggregation1PacketTest";
m_description = "RNDISAggregationDeaggregation1PacketTest - Send 1 RNDIS packet "
"and expect Ethernet packet.";
}
/////////////////////////////////////////////////////////////////////////////////
virtual bool AddRules()
{
return AddRulesDeAggEther();
} // AddRules()
/////////////////////////////////////////////////////////////////////////////////
bool TestLogic()
{
//The packets that will be sent
Byte pPacket[MAX_PACKET_SIZE];
//Buffer for the packet that will be received
Byte pReceivedPacket[2*MAX_PACKET_SIZE];
//Total size of all sent packets (this is the max size of the aggregated
//packet minus the size of the header and the NDP)
//int nTotalPacketsSize = MAX_PACKET_SIZE - (4 * NUM_PACKETS) - 24;
uint32_t nIPv4DSTAddr;
size_t pIpPacketsSize;
//initialize the packets
// Load input data (IP packet) from file
pIpPacketsSize = MAX_PACKET_SIZE;
if (!RNDISAggregationHelper::LoadRNDISPacket(m_eIP, pPacket, pIpPacketsSize))
{
LOG_MSG_ERROR("Failed to load RNDIS Packet");
return false;
}
nIPv4DSTAddr = ntohl(0x7F000001);
memcpy (&pPacket[IPV4_DST_ADDR_OFFSET_IN_RNDIS],&nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
//send the packet
LOG_MSG_DEBUG("Sending packet into the A2 TETH pipe(%d bytes)\n",
pIpPacketsSize);
size_t nBytesSent = m_UsbToIpaPipeDeagg.Send(pPacket, pIpPacketsSize);
if (pIpPacketsSize != nBytesSent)
{
LOG_MSG_ERROR("Sending packet into the A2 EMB pipe(%d bytes) "
"failed!\n", pIpPacketsSize);
return false;
}
//receive the packet
LOG_MSG_DEBUG("Reading packet from the A2 TETH pipe(%d bytes should be there)"
"\n", pIpPacketsSize);
size_t nBytesReceived = m_IpaToUsbPipe.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (pIpPacketsSize - sizeof(struct RndisHeader) != nBytesReceived)
{
LOG_MSG_ERROR("Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", pIpPacketsSize);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
return RNDISAggregationHelper::CompareEthervsRNDISPacket(pReceivedPacket, nBytesReceived,
pPacket, pIpPacketsSize);
}
/////////////////////////////////////////////////////////////////////////////////
};
class RNDISAggregation1PacketTest: public RNDISAggregationTestFixture {
public:
/////////////////////////////////////////////////////////////////////////////////
RNDISAggregation1PacketTest()
{
m_name = "RNDISAggregation1PacketTest";
m_description = "RNDISAggregation1PacketTest - Send 1 IP packet "
"and expect RNDIS packet.";
}
/////////////////////////////////////////////////////////////////////////////////
virtual bool AddRules()
{
return AddRulesAggTimeLimit();
} // AddRules()
/////////////////////////////////////////////////////////////////////////////////
bool TestLogic()
{
//The packets that will be sent
Byte pPacket[MAX_PACKET_SIZE];
//Buffer for the packet that will be received
Byte pReceivedPacket[2*MAX_PACKET_SIZE];
//Total size of all sent packets (this is the max size of the aggregated
//packet minus the size of the header and the NDP)
//int nTotalPacketsSize = MAX_PACKET_SIZE - (4 * NUM_PACKETS) - 24;
uint32_t nIPv4DSTAddr;
size_t pIpPacketsSize;
//initialize the packets
// Load input data (IP packet) from file
pIpPacketsSize = MAX_PACKET_SIZE;
if (!LoadDefaultPacket(m_eIP, pPacket, pIpPacketsSize))
{
LOG_MSG_ERROR("Failed to load Ethernet Packet");
return false;
}
nIPv4DSTAddr = ntohl(0x7F000001);
memcpy (&pPacket[IPV4_DST_ADDR_OFFSET],&nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
//send the packet
LOG_MSG_DEBUG("Sending packet into the USB pipe(%d bytes)\n",
pIpPacketsSize);
size_t nBytesSent = m_HsicToIpaPipe.Send(pPacket, pIpPacketsSize);
if (pIpPacketsSize != nBytesSent)
{
LOG_MSG_ERROR("Sending packet into the USB pipe(%d bytes) "
"failed!\n", pIpPacketsSize);
return false;
}
//receive the packet
LOG_MSG_DEBUG("Reading packet from the USB pipe(%d bytes should be there)"
"\n", pIpPacketsSize);
size_t nBytesReceived = m_IpaToUsbPipeAggTime.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (pIpPacketsSize != nBytesReceived - sizeof(struct RndisEtherHeader))
{
LOG_MSG_ERROR("Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", pIpPacketsSize);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
return RNDISAggregationHelper::CompareIPvsRNDISPacket(pPacket, pIpPacketsSize,
pReceivedPacket, nBytesReceived);
}
/////////////////////////////////////////////////////////////////////////////////
};
class RNDISAggregationSuspendWaTest: public RNDISAggregationTestFixture {
public:
/////////////////////////////////////////////////////////////////////////////////
RNDISAggregationSuspendWaTest()
{
m_name = "RNDISAggregationSuspendWaTest";
m_description = "RNDISAggregationSuspendWaTest - Send 3 IP packet instead 4, suspend the pipe"
" and expect aggregation to be closed.";
m_minIPAHwType = IPA_HW_v3_0;
// WA not needed in IPA_3_5
m_maxIPAHwType = IPA_HW_v3_1;
}
/////////////////////////////////////////////////////////////////////////////////
virtual bool AddRules()
{
return AddRulesAggByteLimit();
} // AddRules()
/////////////////////////////////////////////////////////////////////////////////
bool Setup()
{
bool bRetVal = true;
bRetVal = RNDISAggregationTestFixture::Setup();
if (bRetVal == false) {
return bRetVal;
}
/* register test framework suspend handler to from_ipa_devs */
bRetVal = RegSuspendHandler(false, true, 0);
return bRetVal;
}
bool TestLogic()
{
/*The packets that will be sent*/
Byte pPackets[NUM_PACKETS][MAX_PACKET_SIZE];
/*Buffer for the packet that will be received*/
Byte pReceivedPacket[2*MAX_PACKET_SIZE];
/*
*Total size of all sent packets
* (this is the max size of the aggregated
*packet minus the size of the header and the NDP)
*/
uint32_t nIPv4DSTAddr;
size_t pIpPacketsSizes[NUM_PACKETS];
size_t ExpectedPacketSize = (NUM_PACKETS - 1) * sizeof(struct RndisEtherHeader);
struct ipa_test_ep_ctrl ep_ctrl;
/* send one packet less than aggregation size in order to see the force close */
for(int i = 0; i < (NUM_PACKETS - 1); i++) {
/*
*initialize the packets
*Load input data (IP packet) from file
*/
pIpPacketsSizes[i] = MAX_PACKET_SIZE;
if (!LoadDefaultPacket(m_eIP, pPackets[i], pIpPacketsSizes[i]))
{
LOG_MSG_ERROR("Failed to load Ethernet Packet");
return false;
}
nIPv4DSTAddr = ntohl(0x7F000001);
memcpy (&pPackets[i][IPV4_DST_ADDR_OFFSET],&nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
for(int j = pIpPacketsSizes[i]; j < MAX_PACKET_SIZE / NUM_PACKETS + 1; j++) {
pPackets[i][j] = j & 0xFF;
}
pIpPacketsSizes[i] = MAX_PACKET_SIZE / NUM_PACKETS + 1;
/* send the packet */
LOG_MSG_DEBUG("Sending packet into the A2 TETH pipe(%d bytes)\n",
pIpPacketsSizes[i]);
size_t nBytesSent = m_HsicToIpaPipe.Send(pPackets[i], pIpPacketsSizes[i]);
if (pIpPacketsSizes[i] != nBytesSent)
{
LOG_MSG_ERROR("Sending packet into the USB pipe(%d bytes) "
"failed!\n", pIpPacketsSizes[i]);
return false;
}
ExpectedPacketSize += pIpPacketsSizes[i];
}
/* suspend the pipe */
ep_ctrl.from_dev_num = 0;
ep_ctrl.ipa_ep_delay = false;
ep_ctrl.ipa_ep_suspend = true;
configure_ep_ctrl(&ep_ctrl);
/* receive the packet */
LOG_MSG_DEBUG(
"Reading packet from the USB pipe(%d bytes should be there)"
"\n", ExpectedPacketSize);
size_t nBytesReceived = m_IpaToUsbPipeAgg
.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (ExpectedPacketSize != nBytesReceived)
{
LOG_MSG_ERROR(
"Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
for(int i = 0; i < (NUM_PACKETS - 1); i++) {
if (!RNDISAggregationHelper::
CompareIPvsRNDISPacket(pPackets[i], pIpPacketsSizes[i],
pReceivedPacket + (i * ExpectedPacketSize / (NUM_PACKETS - 1)),
ExpectedPacketSize / (NUM_PACKETS - 1)))
return false;
}
return true;
}
bool Teardown()
{
bool bRetVal = true;
bRetVal = RNDISAggregationTestFixture::Teardown();
if (bRetVal == false) {
return bRetVal;
}
/* unregister the test framework suspend handler */
bRetVal = RegSuspendHandler(false, false, 0);
return bRetVal;
}
};
class RNDISAggregationByteLimitTest: public RNDISAggregationTestFixture {
public:
/////////////////////////////////////////////////////////////////////////////////
RNDISAggregationByteLimitTest()
{
m_name = "RNDISAggregationByteLimitTest";
m_description = "RNDISAggregationByteLimitTest - Send 2 IP packet "
"and expect aggregated RNDIS packet.";
}
/////////////////////////////////////////////////////////////////////////////////
virtual bool AddRules()
{
return AddRulesAggByteLimit();
} // AddRules()
/////////////////////////////////////////////////////////////////////////////////
bool TestLogic()
{
/*The packets that will be sent*/
Byte pPackets[NUM_PACKETS][MAX_PACKET_SIZE];
/*Buffer for the packet that will be received*/
Byte pReceivedPacket[2*MAX_PACKET_SIZE];
/*Total size of all sent packets
* (this is the max size of the aggregated
*packet minus the size of the header and the NDP)
*/
uint32_t nIPv4DSTAddr;
size_t pIpPacketsSizes[NUM_PACKETS];
size_t ExpectedPacketSize = NUM_PACKETS * sizeof(struct RndisEtherHeader);
for(int i = 0; i < NUM_PACKETS; i++) {
/*
*initialize the packets
*Load input data (IP packet) from file
*/
pIpPacketsSizes[i] = MAX_PACKET_SIZE;
if (!LoadDefaultPacket(m_eIP, pPackets[i], pIpPacketsSizes[i]))
{
LOG_MSG_ERROR("Failed to load Ethernet Packet");
return false;
}
nIPv4DSTAddr = ntohl(0x7F000001);
memcpy (&pPackets[i][IPV4_DST_ADDR_OFFSET],&nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
for(int j = pIpPacketsSizes[i]; j < MAX_PACKET_SIZE / NUM_PACKETS + 1; j++) {
pPackets[i][j] = j & 0xFF;
}
pIpPacketsSizes[i] = MAX_PACKET_SIZE / NUM_PACKETS + 1;
/* send the packet */
LOG_MSG_DEBUG("Sending packet into the A2 TETH pipe(%d bytes)\n",
pIpPacketsSizes[i]);
size_t nBytesSent = m_HsicToIpaPipe.Send(pPackets[i], pIpPacketsSizes[i]);
if (pIpPacketsSizes[i] != nBytesSent)
{
LOG_MSG_ERROR("Sending packet into the USB pipe(%d bytes) "
"failed!\n", pIpPacketsSizes[i]);
return false;
}
ExpectedPacketSize += pIpPacketsSizes[i];
}
/* receive the packet */
LOG_MSG_DEBUG(
"Reading packet from the USB pipe(%d bytes should be there)"
"\n", ExpectedPacketSize);
size_t nBytesReceived = m_IpaToUsbPipeAgg
.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (ExpectedPacketSize != nBytesReceived)
{
LOG_MSG_ERROR(
"Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
for(int i = 0; i < NUM_PACKETS; i++) {
if (!RNDISAggregationHelper::
CompareIPvsRNDISPacket(pPackets[i], pIpPacketsSizes[i],
pReceivedPacket + (i * ExpectedPacketSize / NUM_PACKETS),
ExpectedPacketSize / NUM_PACKETS))
return false;
}
return true;
}
};
class RNDISAggregationByteLimitTestFC : public RNDISAggregationTestFixture {
public:
/////////////////////////////////////////////////////////////////////////////////
RNDISAggregationByteLimitTestFC() {
m_name = "RNDISAggregationByteLimitTestFC";
m_description = "RNDISAggregationByteLimitTestFC - Send 4 IP packet with FC"
"and expect 4 aggregated RNDIS packets.";
}
/////////////////////////////////////////////////////////////////////////////////
virtual bool AddRules() {
return AddRulesAggByteLimit(true);
} // AddRules()
/////////////////////////////////////////////////////////////////////////////////
bool TestLogic() {
/*The packets that will be sent*/
Byte pPackets[NUM_PACKETS][MAX_PACKET_SIZE];
/*Buffer for the packets that will be received*/
Byte pReceivedPacket[NUM_PACKETS][MAX_PACKET_SIZE];
/*Total size of all sent packets
* (this is the max size of the aggregated
*packet minus the size of the header and the NDP)
*/
uint32_t nIPv4DSTAddr;
size_t pIpPacketsSizes[NUM_PACKETS];
size_t ExpectedPacketSize =
sizeof(struct RndisEtherHeader) + MAX_PACKET_SIZE / NUM_PACKETS + 1;
for (int i = 0; i < NUM_PACKETS; i++) {
/*
*initialize the packets
*Load input data (IP packet) from file
*/
pIpPacketsSizes[i] = MAX_PACKET_SIZE;
if (!LoadDefaultPacket(m_eIP, pPackets[i], pIpPacketsSizes[i])) {
LOG_MSG_ERROR("Failed to load Ethernet Packet");
return false;
}
nIPv4DSTAddr = ntohl(0x7F000001);
memcpy(&pPackets[i][IPV4_DST_ADDR_OFFSET], &nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
for (int j = pIpPacketsSizes[i]; j < MAX_PACKET_SIZE / NUM_PACKETS + 1; j++) {
pPackets[i][j] = j & 0xFF;
}
pIpPacketsSizes[i] = MAX_PACKET_SIZE / NUM_PACKETS + 1;
/* send the packet */
LOG_MSG_DEBUG("Sending packet into the A2 TETH pipe(%d bytes)\n",
pIpPacketsSizes[i]);
size_t nBytesSent = m_HsicToIpaPipe.Send(pPackets[i], pIpPacketsSizes[i]);
if (pIpPacketsSizes[i] != nBytesSent) {
LOG_MSG_ERROR("Sending packet into the USB pipe(%d bytes) "
"failed!\n", pIpPacketsSizes[i]);
return false;
}
}
/* receive the packet */
LOG_MSG_DEBUG(
"Reading packets from the USB pipe(%d bytes for each)"
"\n", ExpectedPacketSize);
for (int i = 0; i < NUM_PACKETS; i++) {
size_t nBytesReceived = m_IpaToUsbPipeAgg
.Receive(pReceivedPacket[i], MAX_PACKET_SIZE);
if (ExpectedPacketSize != nBytesReceived) {
LOG_MSG_ERROR(
"Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacket[i], nBytesReceived);
return false;
}
print_buff(pReceivedPacket, nBytesReceived);
}
for (int i = 0; i < NUM_PACKETS; i++) {
if (!RNDISAggregationHelper::CompareIPvsRNDISPacket(
pPackets[i],
pIpPacketsSizes[i],
pReceivedPacket[i],
ExpectedPacketSize)) return false;
}
return true;
}
};
class RNDISAggregationDualDpTestFC : public RNDISAggregationTestFixture {
public:
/////////////////////////////////////////////////////////////////////////////////
RNDISAggregationDualDpTestFC() {
m_name = "RNDISAggregationDualDpTestFC";
m_description = "RNDISAggregationDualDpTestFC - Send IP packets "
"on two datapathes: one with FC and one without. "
"Expect 2 aggregated RNDIS packets on pipe with FC. "
"Expect one aggregated RNDIS packet on pipe without FC. ";
}
/////////////////////////////////////////////////////////////////////////////////
virtual bool AddRules() {
return AddRulesAggDualFC();
}
/////////////////////////////////////////////////////////////////////////////////
bool TestLogic() {
int i;
/* The packets that will be sent */
Byte pPackets[NUM_PACKETS][MAX_PACKET_SIZE];
/* Buffer for the packets that will be received */
Byte pReceivedPacket[(NUM_PACKETS / 2) * MAX_PACKET_SIZE];
Byte pReceivedPacketFC[NUM_PACKETS / 2][MAX_PACKET_SIZE];
/*
* Total size of all sent packets
* (this is the max size of the aggregated
* packet minus the size of the header and the NDP)
*/
uint32_t nIPv4DSTAddr;
size_t nBytesReceived;
size_t pIpPacketsSizes[NUM_PACKETS];
size_t ExpectedPacketSize =
sizeof(struct RndisEtherHeader) + MAX_PACKET_SIZE / NUM_PACKETS + 1;
for (i = 0; i < NUM_PACKETS; i++) {
/*
* Initialize the packets
* Load input data (IP packet) from file
*/
pIpPacketsSizes[i] = MAX_PACKET_SIZE;
if (!LoadDefaultPacket(m_eIP, pPackets[i], pIpPacketsSizes[i])) {
LOG_MSG_ERROR("Failed to load Ethernet Packet");
return false;
}
/*
* Half of the packets will go to 127.0.0.1
* and the other half to 127.0.0.2
*/
nIPv4DSTAddr = ntohl(0x7F000001 + (i & 0x1));
memcpy(&pPackets[i][IPV4_DST_ADDR_OFFSET], &nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
for (int j = pIpPacketsSizes[i]; j < MAX_PACKET_SIZE / NUM_PACKETS + 1; j++) {
pPackets[i][j] = j & 0xFF;
}
pIpPacketsSizes[i] = MAX_PACKET_SIZE / NUM_PACKETS + 1;
/* send the packet */
LOG_MSG_DEBUG("Sending packet into the m_HsicToIpaPipe pipe (%d bytes)\n",
pIpPacketsSizes[i]);
print_buff(pPackets[i], pIpPacketsSizes[i]);
size_t nBytesSent = m_HsicToIpaPipe.Send(pPackets[i], pIpPacketsSizes[i]);
if (pIpPacketsSizes[i] != nBytesSent) {
LOG_MSG_ERROR("Sending packet into the m_HsicToIpaPipe pipe (%d bytes) "
"failed!\n", pIpPacketsSizes[i]);
return false;
}
}
/* receive the packets from FC pipe */
LOG_MSG_DEBUG(
"Reading packets from the m_IpaToUsbPipeAgg pipe (%d bytes for each)"
"\n", ExpectedPacketSize);
for (i = 0; i < NUM_PACKETS / 2; i++) {
nBytesReceived = m_IpaToUsbPipeAgg
.Receive(pReceivedPacketFC[i], MAX_PACKET_SIZE);
if (ExpectedPacketSize != nBytesReceived) {
LOG_MSG_ERROR(
"Receiving aggregated packet from the m_IpaToUsbPipeAgg pipe (%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacketFC[i], nBytesReceived);
return false;
}
}
for (i = 0; i < NUM_PACKETS / 2; i++) {
if (!RNDISAggregationHelper::CompareIPvsRNDISPacket(
pPackets[i * 2],
pIpPacketsSizes[i * 2],
pReceivedPacketFC[i],
ExpectedPacketSize)) return false;
}
/* receive the packet from non-FC pipe */
LOG_MSG_DEBUG(
"Reading packet from the m_IpaToUsbPipeAggPktLimit pipe (%d bytes)"
"\n", ExpectedPacketSize * 2);
nBytesReceived = m_IpaToUsbPipeAggPktLimit
.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (ExpectedPacketSize * 2 != nBytesReceived) {
LOG_MSG_ERROR(
"Receiving aggregated packets from the m_IpaToUsbPipeAggPktLimit pipe (%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
for (int i = 0; i < NUM_PACKETS; i += 2) {
if (!RNDISAggregationHelper::CompareIPvsRNDISPacket(
pPackets[i + 1], // Odd packets are in the second pipe
pIpPacketsSizes[i + 1],
pReceivedPacket + (i * ExpectedPacketSize / 2),
ExpectedPacketSize))
return false;
}
return true;
}
};
class RNDISAggregationDualDpTestFcRoutingBased : public RNDISAggregationTestFixture {
public:
/////////////////////////////////////////////////////////////////////////////////
RNDISAggregationDualDpTestFcRoutingBased() {
m_name = "RNDISAggregationDualDpTestFcRoutingBased";
m_description = "RNDISAggregationDualDpTestFcRoutingBased - Send IP packets "
"on two datapathes: one with RT based FC and one without. "
"Expect 2 aggregated RNDIS packets on pipe with RT based FC. "
"Expect one aggregated RNDIS packet on pipe without RT based FC. ";
}
/////////////////////////////////////////////////////////////////////////////////
virtual bool AddRules() {
return AddRulesAggDualFcRoutingBased();
}
/////////////////////////////////////////////////////////////////////////////////
bool TestLogic() {
int i;
/* The packets that will be sent */
Byte pPackets[NUM_PACKETS][MAX_PACKET_SIZE];
/* Buffer for the packets that will be received */
Byte pReceivedPacket[(NUM_PACKETS / 2) * MAX_PACKET_SIZE];
Byte pReceivedPacketFC[NUM_PACKETS / 2][MAX_PACKET_SIZE];
/*
* Total size of all sent packets
* (this is the max size of the aggregated
* packet minus the size of the header and the NDP)
*/
uint32_t nIPv4DSTAddr;
size_t nBytesReceived;
size_t pIpPacketsSizes[NUM_PACKETS];
size_t ExpectedPacketSize =
sizeof(struct RndisEtherHeader) + MAX_PACKET_SIZE / NUM_PACKETS + 1;
for (i = 0; i < NUM_PACKETS; i++) {
/*
* Initialize the packets
* Load input data (IP packet) from file
*/
pIpPacketsSizes[i] = MAX_PACKET_SIZE;
if (!LoadDefaultPacket(m_eIP, pPackets[i], pIpPacketsSizes[i])) {
LOG_MSG_ERROR("Failed to load Ethernet Packet");
return false;
}
/*
* Half of the packets will go to 127.0.0.1
* and the other half to 127.0.0.2
*/
nIPv4DSTAddr = ntohl(0x7F000001 + (i & 0x1));
memcpy(&pPackets[i][IPV4_DST_ADDR_OFFSET], &nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
for (int j = pIpPacketsSizes[i]; j < MAX_PACKET_SIZE / NUM_PACKETS + 1; j++) {
pPackets[i][j] = j & 0xFF;
}
pIpPacketsSizes[i] = MAX_PACKET_SIZE / NUM_PACKETS + 1;
/* send the packet */
LOG_MSG_DEBUG("Sending packet into the m_HsicToIpaPipe pipe (%d bytes)\n",
pIpPacketsSizes[i]);
print_buff(pPackets[i], pIpPacketsSizes[i]);
size_t nBytesSent = m_HsicToIpaPipe.Send(pPackets[i], pIpPacketsSizes[i]);
if (pIpPacketsSizes[i] != nBytesSent) {
LOG_MSG_ERROR("Sending packet into the m_HsicToIpaPipe pipe (%d bytes) "
"failed!\n", pIpPacketsSizes[i]);
return false;
}
}
/* receive the packets from FC pipe */
LOG_MSG_DEBUG(
"Reading packets from the m_IpaToUsbPipeAgg pipe (%d bytes for each)"
"\n", ExpectedPacketSize);
for (i = 0; i < NUM_PACKETS / 2; i++) {
nBytesReceived = m_IpaToUsbPipeAgg
.Receive(pReceivedPacketFC[i], MAX_PACKET_SIZE);
if (ExpectedPacketSize != nBytesReceived) {
LOG_MSG_ERROR(
"Receiving aggregated packet from the m_IpaToUsbPipeAgg pipe (%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacketFC[i], nBytesReceived);
return false;
}
}
for (i = 0; i < NUM_PACKETS / 2; i++) {
if (!RNDISAggregationHelper::CompareIPvsRNDISPacket(
pPackets[i * 2],
pIpPacketsSizes[i * 2],
pReceivedPacketFC[i],
ExpectedPacketSize)) return false;
}
/* receive the packet from non-FC pipe */
LOG_MSG_DEBUG(
"Reading packet from the m_IpaToUsbPipeAggPktLimit pipe (%d bytes)"
"\n", ExpectedPacketSize * 2);
nBytesReceived = m_IpaToUsbPipeAggPktLimit
.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (ExpectedPacketSize * 2 != nBytesReceived) {
LOG_MSG_ERROR(
"Receiving aggregated packets from the m_IpaToUsbPipeAggPktLimit pipe (%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
for (int i = 0; i < NUM_PACKETS; i += 2) {
if (!RNDISAggregationHelper::CompareIPvsRNDISPacket(
pPackets[i + 1], // Odd packets are in the second pipe
pIpPacketsSizes[i + 1],
pReceivedPacket + (i * ExpectedPacketSize / 2),
ExpectedPacketSize))
return false;
}
return true;
}
};
class RNDISAggregationDeaggregationNumPacketsTest:
public RNDISAggregationTestFixture {
public:
RNDISAggregationDeaggregationNumPacketsTest()
{
m_name = "RNDISAggregationDeaggregationNumPacketsTest";
m_description = "RNDISAggregationByteLimitTest - Send on IP packet "
"and expect aggregated RNDIS packet.";
}
virtual bool AddRules()
{
return AddRulesDeAggEther();
} /* AddRules()*/
bool TestLogic()
{
/*the packets that will be sent*/
Byte pPacket[MAX_PACKET_SIZE];
//Buffer for the packet that will be received
Byte pReceivedPacket[2*MAX_PACKET_SIZE];
//Total size of all sent packets (this is the max size of the aggregated
//packet minus the size of the header and the NDP)
uint32_t nIPv4DSTAddr;
size_t pIpPacketsSize;
size_t pAggrPacketsSize = 0;
for(int i = 0; i < NUM_PACKETS; i++) {
//initialize the packets
// Load input data (RNDIS packet) from file
pIpPacketsSize = MAX_PACKET_SIZE;
if (!RNDISAggregationHelper::LoadRNDISPacket(m_eIP, pPacket + pAggrPacketsSize, pIpPacketsSize))
{
LOG_MSG_ERROR("Failed to load Ethernet Packet");
return false;
}
pAggrPacketsSize += pIpPacketsSize;
nIPv4DSTAddr = ntohl(0x7F000001);
memcpy (&((pPacket + i * pIpPacketsSize)[IPV4_DST_ADDR_OFFSET_IN_RNDIS]),&nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
}
print_buff(pPacket, pAggrPacketsSize);
/*send the packet*/
LOG_MSG_DEBUG("Sending packet into the A2 TETH pipe(%d bytes)\n",
pIpPacketsSize * NUM_PACKETS);
size_t nBytesSent = m_UsbToIpaPipeDeagg.Send(pPacket, pAggrPacketsSize);
if (pAggrPacketsSize != nBytesSent)
{
LOG_MSG_ERROR("Sending packet into the USB pipe(%d bytes) "
"failed!\n", pIpPacketsSize * NUM_PACKETS);
return false;
}
for(int i = 0; i < NUM_PACKETS; i++) {
//receive the packet, one by one
LOG_MSG_DEBUG("Reading packet from the USB pipe(%d bytes should be there)"
"\n", pIpPacketsSize - sizeof(struct RndisHeader));
size_t nBytesReceived = m_IpaToUsbPipe.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (pIpPacketsSize - sizeof(struct RndisHeader) != nBytesReceived)
{
LOG_MSG_ERROR("Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
if (!RNDISAggregationHelper::CompareEthervsRNDISPacket(pReceivedPacket,
nBytesReceived,
pPacket + i * pIpPacketsSize,
pIpPacketsSize))
return false;
}
return true;
}
/////////////////////////////////////////////////////////////////////////////////
};
class RNDISAggregationDeaggregationExceptionPacketsTest:
public RNDISAggregationTestFixture {
public:
RNDISAggregationDeaggregationExceptionPacketsTest()
{
m_name = "RNDISAggregationDeaggregationExceptionPacketsTest";
m_description = "RNDISAggregationDeaggregationExceptionPacketsTest - Send 5 frames "
"of size 43 bytes, 1025 bytes, 43 bytes, 981 bytes, and 1024 bytes "
"and expect aggregated RNDIS packet.";
}
virtual bool AddRules()
{
return AddRulesDeAggEther();
} /* AddRules()*/
bool TestLogic()
{
/*the packets that will be sent*/
Byte pPacket[MAX_PACKET_SIZE];
Byte pPacket1[MAX_PACKET_SIZE +1];
Byte pPacket2[MAX_PACKET_SIZE];
Byte pPacket3[MAX_PACKET_SIZE];
//Buffer for the packet that will be received
Byte pReceivedPacket[2*MAX_PACKET_SIZE];
//Total size of all sent packets (this is the max size of the aggregated
//packet minus the size of the header and the NDP)
uint32_t nIPv4DSTAddr;
size_t pIpPacketsSize;
size_t pAggrPacketsSize = 0;
size_t nBytesSent;
size_t nBytesReceived;
/* Create the frame of size 43 bytes which is one less byte than RNDIS header */
pAggrPacketsSize = sizeof(struct RndisHeader) - 1;
struct RndisHeader *pRndisHeader = (struct RndisHeader*)pPacket;
memset(pRndisHeader, 0, (sizeof(struct RndisHeader) - 1));
pRndisHeader->MessageType = 0x01;
pRndisHeader->MessageLength = pAggrPacketsSize;
pRndisHeader->DataOffset = 0x24;
pRndisHeader->DataLength = 0;
nIPv4DSTAddr = ntohl(0x7F000001);
memcpy (&((pPacket)[IPV4_DST_ADDR_OFFSET_IN_RNDIS]),&nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
print_buff(pPacket, pAggrPacketsSize);
/* Send the first frame */
LOG_MSG_DEBUG("Sending packet into the A2 TETH pipe(%d bytes)\n",
pAggrPacketsSize);
nBytesSent = m_UsbToIpaPipeDeagg.Send(pPacket, pAggrPacketsSize);
if (pAggrPacketsSize != nBytesSent)
{
LOG_MSG_ERROR("Sending packet into the USB pipe(%d bytes) "
"failed!\n", pAggrPacketsSize);
return false;
}
/* This is deaggregation exception packet, this packet should not arrive at this pipe */
LOG_MSG_DEBUG("Reading packet from the USB pipe(0 bytes should be there)\n");
nBytesReceived = m_IpaToUsbPipe.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (0 != nBytesReceived)
{
LOG_MSG_ERROR("Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
/* Create a frame of size 1025 bytes */
pAggrPacketsSize = 0;
for(int i = 0; i < 8; i++) {
//initialize the packets
// Load input data (RNDIS packet) from file
pIpPacketsSize = MAX_PACKET_SIZE;
if (!RNDISAggregationHelper::LoadRNDISPacket(m_eIP, pPacket1 + pAggrPacketsSize, pIpPacketsSize))
{
LOG_MSG_ERROR("Failed to load Ethernet Packet");
return false;
}
pAggrPacketsSize += pIpPacketsSize;
nIPv4DSTAddr = ntohl(0x7F000001);
memcpy (&((pPacket1 + i * pIpPacketsSize)[IPV4_DST_ADDR_OFFSET_IN_RNDIS]),&nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
}
pPacket1[pAggrPacketsSize] = 0xdd;
pAggrPacketsSize = pAggrPacketsSize + 1;
print_buff(pPacket1, pAggrPacketsSize);
/* Send the 2nd frame */
LOG_MSG_DEBUG("Sending packet into the A2 TETH pipe(%d bytes)\n",
pAggrPacketsSize);
nBytesSent = m_UsbToIpaPipeDeagg.Send(pPacket1, pAggrPacketsSize);
if (pAggrPacketsSize != nBytesSent)
{
LOG_MSG_ERROR("Sending packet into the USB pipe(%d bytes) "
"failed!\n", pAggrPacketsSize);
return false;
}
for(int i = 0; i < 8; i++) {
//Receive the packet, one by one
LOG_MSG_DEBUG("Reading packet from the USB pipe(%d bytes should be there)"
"\n", pIpPacketsSize - sizeof(struct RndisHeader));
size_t nBytesReceived = m_IpaToUsbPipe.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (pIpPacketsSize - sizeof(struct RndisHeader) != nBytesReceived)
{
LOG_MSG_ERROR("Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
if (!RNDISAggregationHelper::CompareEthervsRNDISPacket(pReceivedPacket,
nBytesReceived,
pPacket1 + i * pIpPacketsSize,
pIpPacketsSize))
return false;
}
/* Create a frame of size 1024 bytes and send as 2 frames */
pAggrPacketsSize = 0;
for(int i = 0; i < 8; i++) {
//initialize the packets
// Load input data (RNDIS packet) from file
pIpPacketsSize = MAX_PACKET_SIZE;
if (!RNDISAggregationHelper::LoadRNDISPacket(m_eIP, pPacket2 + pAggrPacketsSize, pIpPacketsSize))
{
LOG_MSG_ERROR("Failed to load Ethernet Packet");
return false;
}
pAggrPacketsSize += pIpPacketsSize;
nIPv4DSTAddr = ntohl(0x7F000001);
memcpy (&((pPacket2 + i * pIpPacketsSize)[IPV4_DST_ADDR_OFFSET_IN_RNDIS]),&nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
}
print_buff(pPacket2, pAggrPacketsSize);
/* Send the 3rd frame */
LOG_MSG_DEBUG("Sending packet into the A2 TETH pipe(%d bytes)\n", 43);
nBytesSent = m_UsbToIpaPipeDeagg.Send(pPacket2, 43);
if (43 != nBytesSent)
{
LOG_MSG_ERROR("Sending packet into the USB pipe(%d bytes) "
"failed!\n", 43);
return false;
}
/* This is deaggregation exception packet, this packet should not arrive at this pipe */
LOG_MSG_DEBUG("Reading packet from the USB pipe(0 bytes should be there)\n");
nBytesReceived = m_IpaToUsbPipe.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (0 != nBytesReceived)
{
LOG_MSG_ERROR("Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
/* Send the 4rd frame */
LOG_MSG_DEBUG("Sending packet into the A2 TETH pipe(%d bytes)\n",
pAggrPacketsSize - 43 );
nBytesSent = m_UsbToIpaPipeDeagg.Send((pPacket2 + 43), pAggrPacketsSize - 43);
if ((pAggrPacketsSize - 43) != nBytesSent)
{
LOG_MSG_ERROR("Sending packet into the USB pipe(%d bytes) "
"failed!\n", pAggrPacketsSize - 43);
return false;
}
/* This is deaggregation exception packet, this packet should not arrive at this pipe */
LOG_MSG_DEBUG("Reading packet from the USB pipe(0 bytes should be there)\n");
nBytesReceived = m_IpaToUsbPipe.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (0 != nBytesReceived)
{
LOG_MSG_ERROR("Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
/* Create a frame of size 1024 bytes */
pAggrPacketsSize = 0;
for(int i = 0; i < 8; i++) {
//initialize the packets
//Load input data (RNDIS packet) from file
pIpPacketsSize = MAX_PACKET_SIZE;
if (!RNDISAggregationHelper::LoadRNDISPacket(m_eIP, pPacket3 + pAggrPacketsSize, pIpPacketsSize))
{
LOG_MSG_ERROR("Failed to load Ethernet Packet");
return false;
}
pAggrPacketsSize += pIpPacketsSize;
nIPv4DSTAddr = ntohl(0x7F000001);
memcpy (&((pPacket3 + i * pIpPacketsSize)[IPV4_DST_ADDR_OFFSET_IN_RNDIS]),&nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
}
print_buff(pPacket3, pAggrPacketsSize);
/* Send the 5th frame */
LOG_MSG_ERROR("blend-3 Sending packet into the A2 TETH pipe(%d bytes)\n",
pAggrPacketsSize);
nBytesSent = m_UsbToIpaPipeDeagg.Send(pPacket3, pAggrPacketsSize);
if (pAggrPacketsSize != nBytesSent)
{
LOG_MSG_ERROR("Sending packet into the USB pipe(%d bytes) "
"failed!\n", pAggrPacketsSize);
return false;
}
for(int i = 0; i < 8; i++) {
//Receive the packet, one by one
LOG_MSG_DEBUG("Reading packet from the USB pipe(%d bytes should be there)"
"\n", pIpPacketsSize - sizeof(struct RndisHeader));
size_t nBytesReceived = m_IpaToUsbPipe.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (pIpPacketsSize - sizeof(struct RndisHeader) != nBytesReceived)
{
LOG_MSG_ERROR("Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
if (!RNDISAggregationHelper::CompareEthervsRNDISPacket(pReceivedPacket,
nBytesReceived,
pPacket3 + i * pIpPacketsSize,
pIpPacketsSize))
return false;
}
return true;
}
};
class RNDISAggregationPacketLimitTest: public RNDISAggregationTestFixture {
public:
/////////////////////////////////////////////////////////////////////////////////
RNDISAggregationPacketLimitTest()
{
m_name = "RNDISAggregationPacketLimitTest";
m_description = "RNDISAggregationPacketLimitTest - Send 2 IP packet "
"and expect aggregated RNDIS packet.";
}
/////////////////////////////////////////////////////////////////////////////////
virtual bool AddRules()
{
return AddRulesAggPacketLimit();
} // AddRules()
/////////////////////////////////////////////////////////////////////////////////
bool TestLogic()
{
//The packets that will be sent
Byte pPackets[2][MAX_PACKET_SIZE];
//Buffer for the packet that will be received
Byte pReceivedPacket[2*MAX_PACKET_SIZE];
//Total size of all sent packets (this is the max size of the aggregated
//packet minus the size of the header and the NDP)
uint32_t nIPv4DSTAddr;
size_t pIpPacketsSizes[2];
size_t ExpectedPacketSize = 2 * sizeof(struct RndisEtherHeader);
for(int i = 0; i < 2; i++) {
//initialize the packets
// Load input data (IP packet) from file
pIpPacketsSizes[i] = MAX_PACKET_SIZE;
if (!LoadDefaultPacket(m_eIP, pPackets[i], pIpPacketsSizes[i]))
{
LOG_MSG_ERROR("Failed to load Ethernet Packet");
return false;
}
nIPv4DSTAddr = ntohl(0x7F000001);
memcpy (&pPackets[i][IPV4_DST_ADDR_OFFSET],&nIPv4DSTAddr,
sizeof(nIPv4DSTAddr));
//send the packet
LOG_MSG_DEBUG("Sending packet into the A2 TETH pipe(%d bytes)\n",
pIpPacketsSizes[i]);
size_t nBytesSent = m_HsicToIpaPipe.Send(pPackets[i], pIpPacketsSizes[i]);
if (pIpPacketsSizes[i] != nBytesSent)
{
LOG_MSG_ERROR("Sending packet into the USB pipe(%d bytes) "
"failed!\n", pIpPacketsSizes[i]);
return false;
}
ExpectedPacketSize += pIpPacketsSizes[i];
}
//receive the packet
LOG_MSG_DEBUG("Reading packet from the USB pipe(%d bytes should be there)"
"\n", ExpectedPacketSize);
size_t nBytesReceived = m_IpaToUsbPipeAggPktLimit.Receive(pReceivedPacket, MAX_PACKET_SIZE);
if (ExpectedPacketSize != nBytesReceived)
{
LOG_MSG_ERROR("Receiving aggregated packet from the USB pipe(%d bytes) "
"failed!\n", nBytesReceived);
print_buff(pReceivedPacket, nBytesReceived);
return false;
}
for(int i = 0; i < 2; i++) {
if (!RNDISAggregationHelper::CompareIPvsRNDISPacket(pPackets[i], pIpPacketsSizes[i],
pReceivedPacket + (i * ExpectedPacketSize / 2), ExpectedPacketSize / 2))
return false;
}
return true;
}
/////////////////////////////////////////////////////////////////////////////////
};
static RNDISAggregationSanityTest aRNDISAggregationSanityTest;
static RNDISAggregationDeaggregation1PacketTest aRNDISAggregationDeaggregation1PacketTest;
static RNDISAggregation1PacketTest aRNDISAggregation1PacketTest;
static RNDISAggregationSuspendWaTest aRNDISAggregationSuspendWaTest;
static RNDISAggregationByteLimitTest aRNDISAggregationByteLimitTest;
static RNDISAggregationByteLimitTestFC aRNDISAggregationByteLimitTestFC;
static RNDISAggregationDualDpTestFC aRNDISAggregationDualDpTestFC;
static RNDISAggregationDualDpTestFcRoutingBased aRNDISAggregationDualDpTestFcRoutingBased;
static RNDISAggregationDeaggregationNumPacketsTest aRNDISAggregationDeaggregationNumPacketsTest;
static RNDISAggregationDeaggregationExceptionPacketsTest aRNDISAggregationDeaggregationExceptionPacketsTest;
static RNDISAggregationPacketLimitTest aRNDISAggregationPacketLimitTest;
/////////////////////////////////////////////////////////////////////////////////
// EOF ////
/////////////////////////////////////////////////////////////////////////////////