blob: 28c62caa25448827d8e7638a7c32342ac585a733 [file] [log] [blame]
/*
* Copyright (c) 2017-2018,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.
*
* Changes from Qualcomm Innovation Center are provided under the following license:
*
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted (subject to the limitations in the
* disclaimer below) 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 Qualcomm Innovation Center, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
* GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
* HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 "InterfaceAbstraction.h"
#include "Constants.h"
#include "Logger.h"
#include "TestsUtils.h"
#include "linux/msm_ipa.h"
#include "RoutingDriverWrapper.h"
#include "Filtering.h"
#include "IPAFilteringTable.h"
#define TOS_FIELD_OFFSET (1)
#define IPV4_TTL_OFFSET (8)
#define IPV4_CSUM_OFFSET (10)
#define DST_ADDR_LSB_OFFSET_IPV4 (19)
#define SRC_ADDR_LSB_OFFSET_IPV4 (15)
#define DST_ADDR_MSB_OFFSET_IPV6 (24)
#define DST_ADDR_LSB_OFFSET_IPV6 (39)
#define TRAFFIC_CLASS_MSB_OFFSET_IPV6 (0)
#define TRAFFIC_CLASS_LSB_OFFSET_IPV6 (1)
#define FLOW_CLASS_MSB_OFFSET_IPV6 (1)
#define FLOW_CLASS_MB_OFFSET_IPV6 (2)
#define FLOW_CLASS_LSB_OFFSET_IPV6 (3)
#define HOP_LIMIT_OFFSET_IPV6 (7)
#define IPV4_DST_PORT_OFFSET (20+2)
#define IPV6_SRC_PORT_OFFSET (40)
#define IPV6_DST_PORT_OFFSET (40+2)
#define IPv4_TCP_FLAGS_OFFSET (20+13)
#define IPv6_TCP_FLAGS_OFFSET (40+13)
#define TCP_ACK_FLAG_MASK (0x10)
extern Logger g_Logger;
class IpaRoutingBlockTestFixture:public TestBase
{
public:
IpaRoutingBlockTestFixture():
m_sendSize (BUFF_MAX_SIZE),
m_sendSize2 (BUFF_MAX_SIZE),
m_sendSize3 (BUFF_MAX_SIZE),
m_IpaIPType(IPA_IP_v4)
{
memset(m_sendBuffer, 0, sizeof(m_sendBuffer));
memset(m_sendBuffer2, 0, sizeof(m_sendBuffer2));
memset(m_sendBuffer3, 0, sizeof(m_sendBuffer3));
m_testSuiteName.push_back("Routing");
}
static int SetupKernelModule(bool en_status = false)
{
int retval;
struct ipa_channel_config from_ipa_channels[3];
struct test_ipa_ep_cfg from_ipa_cfg[3];
struct ipa_channel_config to_ipa_channels[1];
struct test_ipa_ep_cfg to_ipa_cfg[1];
struct ipa_test_config_header header = {0};
struct ipa_channel_config *to_ipa_array[1];
struct ipa_channel_config *from_ipa_array[3];
/* From ipa configurations - 3 pipes */
memset(&from_ipa_cfg[0], 0, sizeof(from_ipa_cfg[0]));
prepare_channel_struct(&from_ipa_channels[0],
header.from_ipa_channels_num++,
IPA_CLIENT_TEST2_CONS,
(void *)&from_ipa_cfg[0],
sizeof(from_ipa_cfg[0]), en_status);
from_ipa_array[0] = &from_ipa_channels[0];
memset(&from_ipa_cfg[1], 0, sizeof(from_ipa_cfg[1]));
prepare_channel_struct(&from_ipa_channels[1],
header.from_ipa_channels_num++,
IPA_CLIENT_TEST3_CONS,
(void *)&from_ipa_cfg[1],
sizeof(from_ipa_cfg[1]), en_status);
from_ipa_array[1] = &from_ipa_channels[1];
memset(&from_ipa_cfg[2], 0, sizeof(from_ipa_cfg[2]));
prepare_channel_struct(&from_ipa_channels[2],
header.from_ipa_channels_num++,
IPA_CLIENT_TEST4_CONS,
(void *)&from_ipa_cfg[2],
sizeof(from_ipa_cfg[2]), en_status);
from_ipa_array[2] = &from_ipa_channels[2];
/* To ipa configurations - 1 pipes */
memset(&to_ipa_cfg[0], 0, sizeof(to_ipa_cfg[0]));
prepare_channel_struct(&to_ipa_channels[0],
header.to_ipa_channels_num++,
IPA_CLIENT_TEST_PROD,
(void *)&to_ipa_cfg[0],
sizeof(to_ipa_cfg[0]));
to_ipa_array[0] = &to_ipa_channels[0];
prepare_header_struct(&header, from_ipa_array, to_ipa_array);
retval = GenericConfigureScenario(&header);
return retval;
}
bool Setup(bool en_status)
{
bool bRetVal = true;
bRetVal = SetupKernelModule(en_status);
if (bRetVal != true) {
return bRetVal;
}
m_producer.Open(INTERFACE0_TO_IPA_DATA_PATH, INTERFACE0_FROM_IPA_DATA_PATH);
m_consumer.Open(INTERFACE1_TO_IPA_DATA_PATH, INTERFACE1_FROM_IPA_DATA_PATH);
m_consumer2.Open(INTERFACE2_TO_IPA_DATA_PATH, INTERFACE2_FROM_IPA_DATA_PATH);
m_defaultConsumer.Open(INTERFACE3_TO_IPA_DATA_PATH, INTERFACE3_FROM_IPA_DATA_PATH);
if (!m_routing.DeviceNodeIsOpened()) {
printf("Routing block is not ready for immediate commands!\n");
return false;
}
if (!m_filtering.DeviceNodeIsOpened()) {
printf("Filtering block is not ready for immediate commands!\n");
return false;
}
m_routing.Reset(IPA_IP_v4);
m_routing.Reset(IPA_IP_v6);
return true;
} /* Setup()*/
bool Setup()
{
return Setup(false);
}
bool Teardown()
{
if (!m_routing.DeviceNodeIsOpened()) {
printf("Routing block is not ready for immediate commands!\n");
return false;
}
if (!m_filtering.DeviceNodeIsOpened()) {
printf("Filtering block is not ready for immediate commands!\n");
return false;
}
m_producer.Close();
m_consumer.Close();
m_consumer2.Close();
m_defaultConsumer.Close();
return true;
} /* Teardown() */
bool LoadFiles(enum ipa_ip_type ip)
{
string fileName;
if (IPA_IP_v4 == ip) {
fileName = "Input/IPv4_1";
} else {
fileName = "Input/IPv6";
}
if (!LoadDefaultPacket(ip, m_sendBuffer, m_sendSize)) {
LOG_MSG_ERROR("Failed loading default Packet");
return false;
}
if (!LoadDefaultPacket(ip, m_sendBuffer2, m_sendSize2)) {
LOG_MSG_ERROR("Failed loading default Packet");
return false;
}
if (!LoadDefaultPacket(ip, m_sendBuffer3, m_sendSize3)) {
LOG_MSG_ERROR("Failed loading default Packet");
return false;
}
return true;
}
bool ReceivePacketAndCompareFrom(InterfaceAbstraction& cons, Byte* send,
size_t send_sz, bool shouldBeHit)
{
size_t receivedSize = 0;
bool isSuccess = true;
/* Receive results*/
Byte *rxBuff1 = new Byte[0x400];
if (NULL == rxBuff1)
{
printf("Memory allocation error.\n");
return false;
}
receivedSize = cons.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, cons.m_fromChannelName.c_str());
// Compare results
isSuccess &= CompareResultVsGolden_w_Status(send, send_sz, rxBuff1, receivedSize);
if (shouldBeHit) {
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheHit_v5_0(send_sz, receivedSize, rxBuff1) : IsCacheHit(send_sz, receivedSize, rxBuff1);
}
else
{
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(send_sz, receivedSize, rxBuff1) : IsCacheMiss(send_sz, receivedSize, rxBuff1);
}
size_t recievedBufferSize = receivedSize * 3;
size_t sentBufferSize = m_sendSize * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
// char * p = recievedBuffer;
size_t j;
for(j = 0; j < m_sendSize; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", send[j]);
for(j = 0; j < receivedSize; j++)
// recievedBuffer += sprintf(recievedBuffer, "%02X", rxBuff1[i]);
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff1[j]);
printf("Expected Value (%zu)\n%s\n, Received Value1(%zu)\n%s\n",send_sz,sentBuffer,receivedSize,recievedBuffer);
delete[] rxBuff1;
delete[] recievedBuffer;
delete[] sentBuffer;
return isSuccess;
}
bool ReceivePacketsAndCompare()
{
size_t receivedSize = 0;
size_t receivedSize2 = 0;
size_t receivedSize3 = 0;
bool pkt1_cmp_succ, pkt2_cmp_succ, pkt3_cmp_succ;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
Byte *rxBuff2 = new Byte[0x400];
Byte *rxBuff3 = new Byte[0x400];
if (NULL == rxBuff1 || NULL == rxBuff2 || NULL == rxBuff3)
{
printf("Memory allocation error.\n");
return false;
}
memset(rxBuff1, 0, 0x400);
memset(rxBuff2, 0, 0x400);
memset(rxBuff3, 0, 0x400);
receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
receivedSize2 = m_consumer2.ReceiveData(rxBuff2, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize2, m_consumer2.m_fromChannelName.c_str());
receivedSize3 = m_defaultConsumer.ReceiveData(rxBuff3, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize3, m_defaultConsumer.m_fromChannelName.c_str());
/* Compare results */
pkt1_cmp_succ = CompareResultVsGolden(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
pkt2_cmp_succ = CompareResultVsGolden(m_sendBuffer2, m_sendSize2, rxBuff2, receivedSize2);
pkt3_cmp_succ = CompareResultVsGolden(m_sendBuffer3, m_sendSize3, rxBuff3, receivedSize3);
size_t recievedBufferSize =
MAX3(receivedSize, receivedSize2, receivedSize3) * 3;
size_t sentBufferSize =
MAX3(m_sendSize, m_sendSize2, m_sendSize3) * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
if (NULL == recievedBuffer || NULL == sentBuffer) {
printf("Memory allocation error\n");
return false;
}
size_t j;
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
for(j = 0; j < m_sendSize; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", m_sendBuffer[j]);
for(j = 0; j < receivedSize; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff1[j]);
printf("Expected Value1(%zu)\n%s\n, Received Value1(%zu)\n%s\n-->Value1 %s\n",
m_sendSize,sentBuffer,receivedSize,recievedBuffer,
pkt1_cmp_succ?"Match":"no Match");
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
for(j = 0; j < m_sendSize2; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", m_sendBuffer2[j]);
for(j = 0; j < receivedSize2; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff2[j]);
printf("Expected Value2 (%zu)\n%s\n, Received Value2(%zu)\n%s\n-->Value2 %s\n",
m_sendSize2,sentBuffer,receivedSize2,recievedBuffer,
pkt2_cmp_succ?"Match":"no Match");
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
for(j = 0; j < m_sendSize3; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", m_sendBuffer3[j]);
for(j = 0; j < receivedSize3; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff3[j]);
printf("Expected Value3 (%zu)\n%s\n, Received Value3(%zu)\n%s\n-->Value3 %s\n",
m_sendSize3,sentBuffer,receivedSize3,recievedBuffer,
pkt3_cmp_succ?"Match":"no Match");
delete[] recievedBuffer;
delete[] sentBuffer;
delete[] rxBuff1;
delete[] rxBuff2;
delete[] rxBuff3;
return pkt1_cmp_succ && pkt2_cmp_succ && pkt3_cmp_succ;
}
void print_packets(size_t receivedSize, size_t m_sendSize, size_t recievedBufferSize, size_t sentBufferSize, Byte *rxBuff, Byte *m_sendBuffer, char *recievedBuffer, char *sentBuffer)
{
size_t j;
for(j = 0; j < m_sendSize; j++) {
snprintf(&sentBuffer[3 * j], sentBufferSize - 3 * j,
" %02X", m_sendBuffer[j]);
}
for(j = 0; j < receivedSize; j++) {
snprintf(&recievedBuffer[3 * j], recievedBufferSize- 3 * j,
" %02X", rxBuff[j]);
}
printf("Expected Value (%zu)\n%s\n, Received Value(%zu)\n%s\n",m_sendSize,sentBuffer,receivedSize,recievedBuffer);
}
~IpaRoutingBlockTestFixture()
{
m_sendSize = 0;
m_sendSize2 = 0;
m_sendSize3 = 0;
}
void InitFilteringBlock()
{
IPAFilteringTable fltTable;
struct ipa_ioc_get_rt_tbl st_rt_tbl;
struct ipa_flt_rule_add flt_rule_entry;
memset(&st_rt_tbl, 0, sizeof(st_rt_tbl));
memset(&flt_rule_entry, 0, sizeof(flt_rule_entry));
strlcpy(st_rt_tbl.name, "LAN", sizeof(st_rt_tbl.name));
st_rt_tbl.ip = m_IpaIPType;
fltTable.Init(m_IpaIPType, IPA_CLIENT_TEST_PROD, false, 1);
m_routing.GetRoutingTable(&st_rt_tbl);
flt_rule_entry.rule.rt_tbl_hdl = st_rt_tbl.hdl;
fltTable.AddRuleToTable(flt_rule_entry);
m_filtering.AddFilteringRule(fltTable.GetFilteringTable());
}
inline bool VerifyStatusReceived(size_t SendSize, size_t RecvSize)
{
size_t stts_size = sizeof(struct ipa3_hw_pkt_status);
if (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) {
stts_size = sizeof(struct ipa3_hw_pkt_status_hw_v5_0);
}
if ((RecvSize <= SendSize) ||
((RecvSize - SendSize) != stts_size)){
printf("received buffer size does not match! sent:receive [%zu]:[%zu]\n",SendSize,RecvSize);
return false;
}
return true;
}
inline bool IsCacheHit(size_t SendSize, size_t RecvSize, void *Buff)
{
struct ipa3_hw_pkt_status *pStatus = (struct ipa3_hw_pkt_status *)Buff;
if (VerifyStatusReceived(SendSize,RecvSize) == false){
return false;
}
if((bool)pStatus->route_hash){
printf ("%s::cache hit!! \n",__FUNCTION__);
return true;
}
printf ("%s::cache miss!! \n",__FUNCTION__);
return false;
}
inline bool IsCacheHit_v5_0(size_t SendSize, size_t RecvSize, void *Buff)
{
struct ipa3_hw_pkt_status_hw_v5_0 *pStatus = (struct ipa3_hw_pkt_status_hw_v5_0 *)Buff;
if (VerifyStatusReceived(SendSize,RecvSize) == false){
return false;
}
if((bool)pStatus->route_hash){
printf ("%s::cache hit!! \n",__FUNCTION__);
return true;
}
printf ("%s::cache miss!! \n",__FUNCTION__);
return false;
}
inline bool IsCacheMiss(size_t SendSize, size_t RecvSize, void *Buff)
{
struct ipa3_hw_pkt_status *pStatus = (struct ipa3_hw_pkt_status *)Buff;
if (VerifyStatusReceived(SendSize,RecvSize) == false){
return false;
}
if(!((bool)pStatus->route_hash)){
printf ("%s::cache miss!! \n",__FUNCTION__);
return true;
}
printf ("%s::cache hit!! \n",__FUNCTION__);
return false;
}
inline bool IsCacheMiss_v5_0(size_t SendSize, size_t RecvSize, void *Buff)
{
struct ipa3_hw_pkt_status_hw_v5_0 *pStatus = (struct ipa3_hw_pkt_status_hw_v5_0 *)Buff;
if (VerifyStatusReceived(SendSize,RecvSize) == false){
return false;
}
if(!((bool)pStatus->route_hash)){
printf ("%s::cache miss!! \n",__FUNCTION__);
return true;
}
printf ("%s::cache hit!! \n",__FUNCTION__);
return false;
}
inline bool IsTTLUpdated_v5_5(size_t SendSize, size_t RecvSize, void *Buff)
{
struct ipa3_hw_pkt_status_hw_v5_5 *pStatus = (struct ipa3_hw_pkt_status_hw_v5_5 *)Buff;
if (VerifyStatusReceived(SendSize,RecvSize) == false){
return false;
}
if(!((bool)pStatus->ttl_dec)){
printf ("%s::cache miss!! \n",__FUNCTION__);
return true;
}
printf ("%s::cache hit!! \n",__FUNCTION__);
return false;
}
static RoutingDriverWrapper m_routing;
static Filtering m_filtering;
static const size_t BUFF_MAX_SIZE = 1024;
InterfaceAbstraction m_producer;
InterfaceAbstraction m_consumer;
InterfaceAbstraction m_consumer2;
InterfaceAbstraction m_defaultConsumer;
Byte m_sendBuffer[BUFF_MAX_SIZE]; // First input file / IP packet
Byte m_sendBuffer2[BUFF_MAX_SIZE]; // Second input file / IP packet
Byte m_sendBuffer3[BUFF_MAX_SIZE]; // Third input file (default) / IP packet
size_t m_sendSize;
size_t m_sendSize2;
size_t m_sendSize3;
enum ipa_ip_type m_IpaIPType;
private:
};
RoutingDriverWrapper IpaRoutingBlockTestFixture::m_routing;
Filtering IpaRoutingBlockTestFixture::m_filtering;
/*---------------------------------------------------------------------------*/
/* Test1: Tests routing by destination address */
/*---------------------------------------------------------------------------*/
class IpaRoutingBlockTest1 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest1()
{
m_name = "IpaRoutingBlockTest1";
m_description =" \
Routing block test 001 - Destination address exact match\1. Generate and commit a single routing tables. \
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == (192.169.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.2.255 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v4;
Register(*this);
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("Failed memory allocation for rt_rule\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802FF;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*---------------------------------------------------------------------------*/
/* Test2: Tests routing by destination address with a subnet (mask) */
/*---------------------------------------------------------------------------*/
class IpaRoutingBlockTest2 : IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest2()
{
m_name = "IpaRoutingBlockTest2";
m_description =" \
Routing block test 002 - Destination address subnet match \
1. Generate and commit a single routing tables. \
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == (192.169.170.0 & 255.255.255.0)traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.255.0 & 255.255.255.0)traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v4;
Register(*this);
}
bool Run()
{
bool res = false;
bool isSuccess = false;
printf("ENTRY: IpaRoutingBlockTest2::Run()\n");
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[18] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[18] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
printf("ENTRY: IpaRoutingBlockTest2::AddRules()\n");
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A8FF00;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFF00;
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A8AA00;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFF00;
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
printf("Before calling m_routing.AddRoutingRule()\n");
printf("m_routing = %p\n", &m_routing);
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*---------------------------------------------------------------------------*/
/* Test3: Tests routing by TOS (Type Of Service) */
/*---------------------------------------------------------------------------*/
class IpaRoutingBlockTest3 : IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest3()
{
m_name = "IpaRoutingBlockTest3";
m_description = " \
Routing block test 003 - TOS exact match\
1. Generate and commit a single routing tables. \
2. Generate and commit Three routing rules: (DST & Mask Match). \
All TOS == 0xBF traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All TOS == 0x3A traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v4;
Register(*this);
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[TOS_FIELD_OFFSET] = 0xBF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[TOS_FIELD_OFFSET] = 0x3A;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if (!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl;
// gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_TOS;
rt_rule_entry->rule.attrib.u.v4.tos = 0xBF;
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_TOS;
rt_rule_entry->rule.attrib.u.v4.tos = 0x3A;
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*---------------------------------------------------------------------------*/
/* Test4: Destination address exact match and TOS exact match */
/*---------------------------------------------------------------------------*/
class IpaRoutingBlockTest4 : IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest4()
{
m_name = "IpaRoutingBlockTest4";
m_description =" \
Routing block test 004 - Source and Destination address and TOS exact match \
1. Generate and commit a single routing tables. \
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == (192.169.2.255 & 255.255.255.255) and TOS == 0xFF traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.2.170 & 255.255.255.255) and TOS == 0xAA traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All DST_IP == (192.168.2.85 & 255.255.255.255) and SRC_IP == (192.168.2.241 & 255.255.255.255) TOS == 0x24 traffic goes to pipe IPA_CLIENT_TEST3_CONS";
m_IpaIPType = IPA_IP_v4;
Register(*this);
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[TOS_FIELD_OFFSET] = 0xFF;
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[TOS_FIELD_OFFSET] = 0xAA;
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
m_sendBuffer3[TOS_FIELD_OFFSET] = 0x24;
m_sendBuffer3[DST_ADDR_LSB_OFFSET_IPV4] = 0x55;
m_sendBuffer3[SRC_ADDR_LSB_OFFSET_IPV4] = 0xF1;
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_TOS | IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.tos = 0xFF;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802FF;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_TOS | IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.tos = 0xAA;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_TOS | IPA_FLT_DST_ADDR | IPA_FLT_SRC_ADDR;
rt_rule_entry->rule.attrib.u.v4.tos = 0x24;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A80255;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v4.src_addr = 0xC0A802F1;
rt_rule_entry->rule.attrib.u.v4.src_addr_mask = 0xFFFFFFFF;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*---------------------------------------------------------------------------*/
/* Test5: IPv6 - Tests routing by destination address */
/*---------------------------------------------------------------------------*/
class IpaRoutingBlockTest5 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest5()
{
m_name = "IpaRoutingBlockTest5";
m_description =" \
Routing block test 005 - IPv6 Destination address exact match \
1. Generate and commit a single routing tables. \
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF \
traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF \
traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
Register(*this);
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000AA;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*---------------------------------------------------------------------------*/
/* Test6: IPv6 - Tests routing by destination address */
/*---------------------------------------------------------------------------*/
class IpaRoutingBlockTest006 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest006()
{
m_name = "IpaRoutingBlockTest006";
m_description =" \
Routing block test 006 - IPv6 Destination address Subnet match \
1. Generate and commit a single routing tables. \
2. Generate and commit Three routing rules: (DST & Mask Match 0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x0000000). \
All DST_IP == 0X11020000 \
0x00000000 \
0x00000000 \
0X0000000C \
traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == 0X22020000 \
0x00000000 \
0x00000000 \
0X0000000C \
traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
Register(*this);
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_MSB_OFFSET_IPV6] = 0x11;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_MSB_OFFSET_IPV6] = 0x22;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // TODO: Header Insertion gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0X11020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X0000000C;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // TODO: Header Insertion gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0X22020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X0000000C;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*---------------------------------------------------------------------------*/
/* Test7: IPv6 - Tests routing by destination address */
/*---------------------------------------------------------------------------*/
class IpaRoutingBlockTest007 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest007()
{
m_name = "IpaRoutingBlockTest007";
m_description = " \
Routing block test 007 - IPv6 Exact Traffic Class Match \
1. Generate and commit a single routing tables. \
2. Generate and commit Three routing rules: (DST & Mask Match). \
All Traffic Class == 0xAA traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All Traffic Class == 0xBB traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
Register(*this);
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[TRAFFIC_CLASS_MSB_OFFSET_IPV6] &= 0xF0;
m_sendBuffer[TRAFFIC_CLASS_MSB_OFFSET_IPV6] |= 0x0A;
m_sendBuffer[TRAFFIC_CLASS_LSB_OFFSET_IPV6] &= 0x0F;
m_sendBuffer[TRAFFIC_CLASS_LSB_OFFSET_IPV6] |= 0xA0;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[TRAFFIC_CLASS_MSB_OFFSET_IPV6] &= 0xF0;
m_sendBuffer2[TRAFFIC_CLASS_MSB_OFFSET_IPV6] |= 0x0B;
m_sendBuffer2[TRAFFIC_CLASS_LSB_OFFSET_IPV6] &= 0x0F;
m_sendBuffer2[TRAFFIC_CLASS_LSB_OFFSET_IPV6] |= 0xB0;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // TODO: Header Insertion gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_TC;
rt_rule_entry->rule.attrib.u.v6.tc = 0xAA;
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // TODO: Header Insertion gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_TC;
rt_rule_entry->rule.attrib.u.v6.tc = 0xBB;
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*---------------------------------------------------------------------------*/
/* Test8: IPv6 - Tests routing by destination address */
/*---------------------------------------------------------------------------*/
class IpaRoutingBlockTest008 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest008()
{
m_name = "IpaRoutingBlockTest008";
m_description = " \
Routing block test 008 - IPv6 Destination address exact match and Traffic Class Match \
1. Generate and commit a single routing tables. \
2. Generate and commit Three routing rules: (DST & Mask Match). \
All Traffic Class == 0xAA & IPv6 DST Addr 0xFF020000...00AA traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All Traffic Class == 0xBB & IPv6 DST Addr 0xFF020000...00BB traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
Register(*this);
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[TRAFFIC_CLASS_MSB_OFFSET_IPV6] &= 0xF0;
m_sendBuffer[TRAFFIC_CLASS_MSB_OFFSET_IPV6] |= 0x0A;
m_sendBuffer[TRAFFIC_CLASS_LSB_OFFSET_IPV6] &= 0x0F;
m_sendBuffer[TRAFFIC_CLASS_LSB_OFFSET_IPV6] |= 0xA0;
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[TRAFFIC_CLASS_MSB_OFFSET_IPV6] &= 0xF0;
m_sendBuffer2[TRAFFIC_CLASS_MSB_OFFSET_IPV6] |= 0x0B;
m_sendBuffer2[TRAFFIC_CLASS_LSB_OFFSET_IPV6] &= 0x0F;
m_sendBuffer2[TRAFFIC_CLASS_LSB_OFFSET_IPV6] |= 0xB0;
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR | IPA_FLT_TC;
rt_rule_entry->rule.attrib.u.v6.tc = 0xAA;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR | IPA_FLT_TC;
rt_rule_entry->rule.attrib.u.v6.tc = 0xBB;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000AA;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*---------------------------------------------------------------------------*/
/* Test9: IPv6 - Tests routing by destination address */
/*---------------------------------------------------------------------------*/
class IpaRoutingBlockTest009 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest009()
{
m_name = "IpaRoutingBlockTest009";
m_description = " \
Routing block test 009 - IPv6 Exact Flow Label Match \
1. Generate and commit a single routing tables. \
2. Generate and commit Three routing rules: (DST & Mask Match). \
All Flow Label == 0xABCDE traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All Flow Label == 0x12345 traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
Register(*this);
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[FLOW_CLASS_MSB_OFFSET_IPV6] &= 0xF0;
m_sendBuffer[FLOW_CLASS_MSB_OFFSET_IPV6] |= 0x0A;
m_sendBuffer[FLOW_CLASS_MB_OFFSET_IPV6] = 0xBC;
m_sendBuffer[FLOW_CLASS_LSB_OFFSET_IPV6] = 0xDE;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[FLOW_CLASS_MSB_OFFSET_IPV6] &= 0xF0;
m_sendBuffer2[FLOW_CLASS_MSB_OFFSET_IPV6] |= 0x01;
m_sendBuffer2[FLOW_CLASS_MB_OFFSET_IPV6] = 0x23;
m_sendBuffer2[FLOW_CLASS_LSB_OFFSET_IPV6] = 0x45;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_FLOW_LABEL;
rt_rule_entry->rule.attrib.u.v6.flow_label = 0xABCDE;
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_FLOW_LABEL;
rt_rule_entry->rule.attrib.u.v6.flow_label = 0x12345;
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*--------------------------------------------------------------------------*/
/* Test10: IPv4 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest010 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest010()
{
m_name = "IpaRoutingBlockTest10";
m_description =" \
Routing block test 010 - Destination address exact match non hashable priority higher than hashable \
both match the packet but only non hashable should hit\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == (192.168.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v4;
m_minIPAHwType = IPA_HW_v3_0;
Register(*this);
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA; //192.168.02.170
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA; //192.168.02.170
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool ReceivePacketsAndCompare()
{
size_t receivedSize = 0;
size_t receivedSize2 = 0;
size_t receivedSize3 = 0;
bool isSuccess = true;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
Byte *rxBuff2 = new Byte[0x400];
Byte *rxBuff3 = new Byte[0x400];
if (NULL == rxBuff1 || NULL == rxBuff2 || NULL == rxBuff3)
{
printf("Memory allocation error.\n");
return false;
}
receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
receivedSize2 = m_consumer.ReceiveData(rxBuff2, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize2, m_consumer2.m_fromChannelName.c_str());
receivedSize3 = m_defaultConsumer.ReceiveData(rxBuff3, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize3, m_defaultConsumer.m_fromChannelName.c_str());
/* Compare results */
isSuccess &= CompareResultVsGolden(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
isSuccess &= CompareResultVsGolden(m_sendBuffer2, m_sendSize2, rxBuff2, receivedSize2);
isSuccess &= CompareResultVsGolden(m_sendBuffer3, m_sendSize3, rxBuff3, receivedSize3);
size_t recievedBufferSize = receivedSize * 3;
size_t sentBufferSize = m_sendSize * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
print_packets(receivedSize, m_sendSize, recievedBufferSize, sentBufferSize, rxBuff1, m_sendBuffer, recievedBuffer, sentBuffer);
print_packets(receivedSize2, m_sendSize2, recievedBufferSize, sentBufferSize, rxBuff2, m_sendBuffer2, recievedBuffer, sentBuffer);
print_packets(receivedSize3, m_sendSize3, recievedBufferSize, sentBufferSize, rxBuff3, m_sendBuffer3, recievedBuffer, sentBuffer);
delete[] recievedBuffer;
delete[] sentBuffer;
delete[] rxBuff1;
delete[] rxBuff2;
delete[] rxBuff3;
return isSuccess;
}
};
/*--------------------------------------------------------------------------*/
/* Test11: IPv4 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest011 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest011()
{
m_name = "IpaRoutingBlockTest011";
m_description =" \
Routing block test 011 - Destination address exact match hashable priority higher than non hashable \
both match the packet but only hashable should hit, second packet should get cache hit\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == (192.168.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v4;
m_minIPAHwType = IPA_HW_v3_0;
Register(*this);
}
bool Setup()
{
return IpaRoutingBlockTestFixture:: Setup(true);
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA; //192.168.02.170
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA; //192.168.02.170
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool ReceivePacketsAndCompare()
{
size_t receivedSize = 0;
size_t receivedSize2 = 0;
size_t receivedSize3 = 0;
bool isSuccess = true;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
Byte *rxBuff2 = new Byte[0x400];
Byte *rxBuff3 = new Byte[0x400];
if (NULL == rxBuff1 || NULL == rxBuff2 || NULL == rxBuff3)
{
printf("Memory allocation error.\n");
return false;
}
receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
receivedSize2 = m_consumer.ReceiveData(rxBuff2, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize2, m_consumer2.m_fromChannelName.c_str());
receivedSize3 = m_defaultConsumer.ReceiveData(rxBuff3, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize3, m_defaultConsumer.m_fromChannelName.c_str());
/* Compare results */
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer2, m_sendSize2, rxBuff2, receivedSize2);
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer3, m_sendSize3, rxBuff3, receivedSize3);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize, receivedSize, rxBuff1) : IsCacheMiss(m_sendSize,receivedSize,rxBuff1);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheHit_v5_0(m_sendSize2, receivedSize2, rxBuff2) : IsCacheHit(m_sendSize2,receivedSize2,rxBuff2);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize3, receivedSize3, rxBuff3) : IsCacheMiss(m_sendSize3,receivedSize3,rxBuff3);
size_t recievedBufferSize = receivedSize * 3;
size_t sentBufferSize = m_sendSize * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
print_packets(receivedSize, m_sendSize, recievedBufferSize, sentBufferSize, rxBuff1, m_sendBuffer, recievedBuffer, sentBuffer);
print_packets(receivedSize2, m_sendSize2, recievedBufferSize, sentBufferSize, rxBuff2, m_sendBuffer2, recievedBuffer, sentBuffer);
print_packets(receivedSize3, m_sendSize3, recievedBufferSize, sentBufferSize, rxBuff3, m_sendBuffer3, recievedBuffer, sentBuffer);
delete[] recievedBuffer;
delete[] sentBuffer;
delete[] rxBuff1;
delete[] rxBuff2;
delete[] rxBuff3;
return isSuccess;
}
};
/*--------------------------------------------------------------------------*/
/* Test12: IPv4 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest012 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest012()
{
m_name = "IpaRoutingBlockTest012";
m_description =" \
Routing block test 012 - Destination address exact match hashable priority lower than non hashable \
no match on non hashable rule (with higher priority), match on hashable rule. two packets with\
different tuple are sent (but match the rule) cache miss expected\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == (192.168.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.2.171 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v4;
m_minIPAHwType = IPA_HW_v3_0;
Register(*this);
}
bool Setup()
{
return IpaRoutingBlockTestFixture:: Setup(true);
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AB; //192.168.02.171
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA; //192.168.02.170
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
unsigned short port;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
port = ntohs(547);//DHCP Client Port
memcpy (&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
port = ntohs(546);//DHCP Client Port
memcpy (&m_sendBuffer2[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool ReceivePacketsAndCompare()
{
size_t receivedSize = 0;
size_t receivedSize2 = 0;
size_t receivedSize3 = 0;
bool isSuccess = true;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
Byte *rxBuff2 = new Byte[0x400];
Byte *rxBuff3 = new Byte[0x400];
if (NULL == rxBuff1 || NULL == rxBuff2 || NULL == rxBuff3)
{
printf("Memory allocation error.\n");
return false;
}
receivedSize = m_consumer2.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer2.m_fromChannelName.c_str());
receivedSize2 = m_consumer2.ReceiveData(rxBuff2, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize2, m_consumer2.m_fromChannelName.c_str());
receivedSize3 = m_defaultConsumer.ReceiveData(rxBuff3, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize3, m_defaultConsumer.m_fromChannelName.c_str());
/* Compare results */
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer2, m_sendSize2, rxBuff2, receivedSize2);
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer3, m_sendSize3, rxBuff3, receivedSize3);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize, receivedSize, rxBuff1) : IsCacheMiss(m_sendSize,receivedSize,rxBuff1);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize2, receivedSize2, rxBuff2) : IsCacheMiss(m_sendSize2,receivedSize2,rxBuff2);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize3, receivedSize3, rxBuff3) : IsCacheMiss(m_sendSize3,receivedSize3,rxBuff3);
size_t recievedBufferSize = receivedSize * 3;
size_t sentBufferSize = m_sendSize * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
print_packets(receivedSize, m_sendSize, recievedBufferSize, sentBufferSize, rxBuff1, m_sendBuffer, recievedBuffer, sentBuffer);
print_packets(receivedSize2, m_sendSize2, recievedBufferSize, sentBufferSize, rxBuff2, m_sendBuffer2, recievedBuffer, sentBuffer);
print_packets(receivedSize3, m_sendSize3, recievedBufferSize, sentBufferSize, rxBuff3, m_sendBuffer3, recievedBuffer, sentBuffer);
delete[] recievedBuffer;
delete[] sentBuffer;
delete[] rxBuff1;
delete[] rxBuff2;
delete[] rxBuff3;
return isSuccess;
}
};
/*--------------------------------------------------------------------------*/
/* Test13: IPv4 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest013 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest013()
{
m_name = "IpaRoutingBlockTest013";
m_description =" \
Routing block test 013 - Destination address exact match \
no match on non hashable rule (with lower priority), match on hashable rule. two packets with\
different tuple are sent (but match the rule) cache miss expected\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == (192.168.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.2.171 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v4;
m_minIPAHwType = IPA_HW_v3_0;
Register(*this);
}
bool Setup()
{
return IpaRoutingBlockTestFixture:: Setup(true);
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA; //192.168.02.170
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AB; //192.168.02.171
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
unsigned short port;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
port = ntohs(547);//DHCP Client Port
memcpy (&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
port = ntohs(546);//DHCP Client Port
memcpy (&m_sendBuffer2[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool ReceivePacketsAndCompare()
{
size_t receivedSize = 0;
size_t receivedSize2 = 0;
size_t receivedSize3 = 0;
bool isSuccess = true;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
Byte *rxBuff2 = new Byte[0x400];
Byte *rxBuff3 = new Byte[0x400];
if (NULL == rxBuff1 || NULL == rxBuff2 || NULL == rxBuff3)
{
printf("Memory allocation error.\n");
return false;
}
receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
receivedSize2 = m_consumer.ReceiveData(rxBuff2, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize2, m_consumer.m_fromChannelName.c_str());
receivedSize3 = m_defaultConsumer.ReceiveData(rxBuff3, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize3, m_defaultConsumer.m_fromChannelName.c_str());
/* Compare results */
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer2, m_sendSize2, rxBuff2, receivedSize2);
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer3, m_sendSize3, rxBuff3, receivedSize3);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize, receivedSize, rxBuff1) : IsCacheMiss(m_sendSize,receivedSize,rxBuff1);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize2, receivedSize2, rxBuff2) : IsCacheMiss(m_sendSize2,receivedSize2,rxBuff2);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize3, receivedSize3, rxBuff3) : IsCacheMiss(m_sendSize3,receivedSize3,rxBuff3);
size_t recievedBufferSize = receivedSize * 3;
size_t sentBufferSize = m_sendSize * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
print_packets(receivedSize, m_sendSize, recievedBufferSize, sentBufferSize, rxBuff1, m_sendBuffer, recievedBuffer, sentBuffer);
print_packets(receivedSize2, m_sendSize2, recievedBufferSize, sentBufferSize, rxBuff2, m_sendBuffer2, recievedBuffer, sentBuffer);
print_packets(receivedSize3, m_sendSize3, recievedBufferSize, sentBufferSize, rxBuff3, m_sendBuffer3, recievedBuffer, sentBuffer);
delete[] recievedBuffer;
delete[] sentBuffer;
delete[] rxBuff1;
delete[] rxBuff2;
delete[] rxBuff3;
return isSuccess;
}
};
/*--------------------------------------------------------------------------*/
/* Test14: IPv4 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest014 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest014()
{
m_name = "IpaRoutingBlockTest014";
m_description =" \
Routing block test 014 - Destination address exact match \
no match on non hashable rule(with higher priority) , match on hashable rule. two identical\
packets are sent cache hit expected on the second one\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == (192.168.2.171 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v4;
m_minIPAHwType = IPA_HW_v3_0;
Register(*this);
}
bool Setup()
{
return IpaRoutingBlockTestFixture:: Setup(true);
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("Failed memory allocation for rt_rule\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AB; //192.168.02.171
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA; //192.168.02.170
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
free(rt_rule);
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool ReceivePacketsAndCompare()
{
size_t receivedSize = 0;
size_t receivedSize2 = 0;
size_t receivedSize3 = 0;
bool isSuccess = true;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
Byte *rxBuff2 = new Byte[0x400];
Byte *rxBuff3 = new Byte[0x400];
if (NULL == rxBuff1 || NULL == rxBuff2 || NULL == rxBuff3)
{
printf("Memory allocation error.\n");
return false;
}
receivedSize = m_consumer2.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer2.m_fromChannelName.c_str());
receivedSize2 = m_consumer2.ReceiveData(rxBuff2, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize2, m_consumer2.m_fromChannelName.c_str());
receivedSize3 = m_defaultConsumer.ReceiveData(rxBuff3, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize3, m_defaultConsumer.m_fromChannelName.c_str());
/* Compare results */
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer2, m_sendSize2, rxBuff2, receivedSize2);
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer3, m_sendSize3, rxBuff3, receivedSize3);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize, receivedSize, rxBuff1) : IsCacheMiss(m_sendSize,receivedSize,rxBuff1);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheHit_v5_0(m_sendSize2, receivedSize2, rxBuff2) : IsCacheHit(m_sendSize2,receivedSize2,rxBuff2);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize3, receivedSize3, rxBuff3) : IsCacheMiss(m_sendSize3,receivedSize3,rxBuff3);
size_t recievedBufferSize = receivedSize * 3;
size_t sentBufferSize = m_sendSize * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
print_packets(receivedSize, m_sendSize, recievedBufferSize, sentBufferSize, rxBuff1, m_sendBuffer, recievedBuffer, sentBuffer);
print_packets(receivedSize2, m_sendSize2, recievedBufferSize, sentBufferSize, rxBuff2, m_sendBuffer2, recievedBuffer, sentBuffer);
print_packets(receivedSize3, m_sendSize3, recievedBufferSize, sentBufferSize, rxBuff3, m_sendBuffer3, recievedBuffer, sentBuffer);
delete[] recievedBuffer;
delete[] sentBuffer;
delete[] rxBuff1;
delete[] rxBuff2;
delete[] rxBuff3;
return isSuccess;
}
};
/*--------------------------------------------------------------------------*/
/* Test15: IPv4 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest015 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest015()
{
m_name = "IpaRoutingBlockTest015";
m_description =" \
Routing block test 015 - Destination address exact match \
no match on non hashable rule(with lower priority) , match on hashable rule. two identical\
packets are sent cache hit expected on the second one\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == (192.168.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.2.171 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v4;
m_minIPAHwType = IPA_HW_v3_0;
Register(*this);
}
bool Setup()
{
return IpaRoutingBlockTestFixture:: Setup(true);
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("Failed memory allocation for rt_rule\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA; //192.168.02.170
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AB; //192.168.02.171
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
for (int i = 0; i < rt_rule->num_rules; i++) {
uRtRuleHdl[i] = rt_rule->rules[i].rt_rule_hdl;
}
uNumRtRules = rt_rule->num_rules;
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool RemoveLastRule(enum ipa_ip_type ipType)
{
struct ipa_ioc_del_rt_rule *ruleTable;
ruleTable = (struct ipa_ioc_del_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_del_rt_rule) +
sizeof(struct ipa_rt_rule_del));
ruleTable->commit = 1;
ruleTable->ip = ipType;
ruleTable->num_hdls = 1;
ruleTable->hdl[0].hdl = uRtRuleHdl[uNumRtRules - 1];
ruleTable->hdl[0].status = 0;
if (false == m_routing.DeleteRoutingRule(ruleTable))
{
printf("Routing rule deletion failed!\n");
return false;
}
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool ReceivePacketsAndCompare()
{
size_t receivedSize = 0;
size_t receivedSize2 = 0;
size_t receivedSize3 = 0;
bool isSuccess = true;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
Byte *rxBuff2 = new Byte[0x400];
Byte *rxBuff3 = new Byte[0x400];
if (NULL == rxBuff1 || NULL == rxBuff2 || NULL == rxBuff3)
{
printf("Memory allocation error.\n");
return false;
}
receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
receivedSize2 = m_consumer.ReceiveData(rxBuff2, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize2, m_consumer.m_fromChannelName.c_str());
receivedSize3 = m_defaultConsumer.ReceiveData(rxBuff3, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize3, m_defaultConsumer.m_fromChannelName.c_str());
/* Compare results */
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer2, m_sendSize2, rxBuff2, receivedSize2);
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer3, m_sendSize3, rxBuff3, receivedSize3);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize, receivedSize, rxBuff1) : IsCacheMiss(m_sendSize,receivedSize,rxBuff1);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheHit_v5_0(m_sendSize2, receivedSize2, rxBuff2) : IsCacheHit(m_sendSize2,receivedSize2,rxBuff2);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize3, receivedSize3, rxBuff3) : IsCacheMiss(m_sendSize3,receivedSize3,rxBuff3);
size_t recievedBufferSize = receivedSize * 3;
size_t sentBufferSize = m_sendSize * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
print_packets(receivedSize, m_sendSize, recievedBufferSize, sentBufferSize, rxBuff1, m_sendBuffer, recievedBuffer, sentBuffer);
print_packets(receivedSize2, m_sendSize2, recievedBufferSize, sentBufferSize, rxBuff2, m_sendBuffer2, recievedBuffer, sentBuffer);
print_packets(receivedSize3, m_sendSize3, recievedBufferSize, sentBufferSize, rxBuff3, m_sendBuffer3, recievedBuffer, sentBuffer);
delete[] recievedBuffer;
delete[] sentBuffer;
delete[] rxBuff1;
delete[] rxBuff2;
delete[] rxBuff3;
return isSuccess;
}
bool ReceivePacketsAndCompareSpecial()
{
size_t receivedSize = 0;
bool isSuccess = true;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
if (NULL == rxBuff1)
{
printf("Memory allocation error.\n");
return false;
}
receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
/* Compare results */
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize, receivedSize, rxBuff1) : IsCacheMiss(m_sendSize,receivedSize,rxBuff1);
size_t recievedBufferSize = receivedSize * 3;
size_t sentBufferSize = m_sendSize * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
size_t j;
for(j = 0; j < m_sendSize; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - 3 * j,
" %02X", m_sendBuffer[j]);
for(j = 0; j < receivedSize; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - 3 * j,
" %02X", rxBuff1[j]);
printf("Expected Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n",m_sendSize,sentBuffer,receivedSize,recievedBuffer);
delete[] rxBuff1;
return isSuccess;
}
protected:
uint32_t uRtRuleHdl[3];
uint8_t uNumRtRules;
};
/*--------------------------------------------------------------------------*/
/* Test16: IPv4 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest016 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest016()
{
m_name = "IpaRoutingBlockTest016";
m_description =" \
Routing block test 016 - Destination address exact match max priority for non hashable \
match on both rule, non hashable rule should win because max priority\
packets are sent. No cache hit is expected\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == (192.168.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v4;
m_minIPAHwType = IPA_HW_v3_0;
Register(*this);
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("Failed memory allocation for rt_rule\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA; //192.168.02.170
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA; //192.168.02.170
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry->rule.max_prio = 1; // max priority
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool ReceivePacketsAndCompare()
{
size_t receivedSize = 0;
size_t receivedSize2 = 0;
size_t receivedSize3 = 0;
bool isSuccess = true;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
Byte *rxBuff2 = new Byte[0x400];
Byte *rxBuff3 = new Byte[0x400];
if (NULL == rxBuff1 || NULL == rxBuff2 || NULL == rxBuff3)
{
printf("Memory allocation error.\n");
return false;
}
receivedSize = m_consumer2.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
receivedSize2 = m_consumer2.ReceiveData(rxBuff2, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize2, m_consumer.m_fromChannelName.c_str());
receivedSize3 = m_defaultConsumer.ReceiveData(rxBuff3, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize3, m_defaultConsumer.m_fromChannelName.c_str());
/* Compare results */
isSuccess &= CompareResultVsGolden(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
isSuccess &= CompareResultVsGolden(m_sendBuffer2, m_sendSize2, rxBuff2, receivedSize2);
isSuccess &= CompareResultVsGolden(m_sendBuffer3, m_sendSize3, rxBuff3, receivedSize3);
size_t recievedBufferSize = receivedSize * 3;
size_t sentBufferSize = m_sendSize * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
print_packets(receivedSize, m_sendSize, recievedBufferSize, sentBufferSize, rxBuff1, m_sendBuffer, recievedBuffer, sentBuffer);
print_packets(receivedSize2, m_sendSize2, recievedBufferSize, sentBufferSize, rxBuff2, m_sendBuffer2, recievedBuffer, sentBuffer);
print_packets(receivedSize3, m_sendSize3, recievedBufferSize, sentBufferSize, rxBuff3, m_sendBuffer3, recievedBuffer, sentBuffer);
delete[] recievedBuffer;
delete[] sentBuffer;
delete[] rxBuff1;
delete[] rxBuff2;
delete[] rxBuff3;
return isSuccess;
}
};
/*--------------------------------------------------------------------------*/
/* Test17: IPv4 - Tests routing hashable, non hashable, */
/* cache/hash invalidation test on rule addition */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest017 : public IpaRoutingBlockTest015
{
public:
IpaRoutingBlockTest017()
{
m_name = "IpaRoutingBlockTest017";
m_description =" \
Routing block test 017 - this test perform test 015 and then commits another rule\
another identical packet is sent: DST_IP == 192.168.02.170 and expected to get cache miss";
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
if (false == isSuccess)
{
printf("ReceivePacketsAndCompare failure.\n");
return false;
}
// until here test 15 was run, now we test hash invalidation
// commit the rules again to clear the cache
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// send the packet again
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// validate we got cache miss
isSuccess = ReceivePacketsAndCompareSpecial();
if (false == isSuccess)
{
printf("ReceivePacketsAndCompareSpecial failure.\n");
}
return isSuccess;
} // Run()
};
/*--------------------------------------------------------------------------*/
/* Test18: IPv4 - Tests routing hashable, non hashable, */
/* cache/hash invalidation test on rule delition */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest018 : public IpaRoutingBlockTest015
{
public:
IpaRoutingBlockTest018()
{
m_name = "IpaRoutingBlockTest018";
m_description =" \
Routing block test 018 - this test perform test 015 and then removes last rule\
another identical packet is sent: DST_IP == 192.168.02.170 and expected to get cache miss";
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
if (false == isSuccess)
{
printf("ReceivePacketsAndCompare failure.\n");
return false;
}
// until here test 15 was run, now we test hash invalidation
// delete the last rule, this should clear the cache
res = RemoveLastRule(IPA_IP_v4);
if (false == res) {
printf("Failed removing filtering rules.\n");
return false;
}
// send the packet again
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// validate we got cache miss
isSuccess = ReceivePacketsAndCompareSpecial();
if (false == isSuccess)
{
printf("ReceivePacketsAndCompareSpecial failure.\n");
}
return isSuccess;
} // Run()
};
/*--------------------------------------------------------------------------*/
/* Test20: IPv6 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest020 : public IpaRoutingBlockTest010
{
public:
IpaRoutingBlockTest020()
{
m_name = "IpaRoutingBlockTest20";
m_description =" \
Routing block test 020 - Destination address exact match non hashable priority higher than hashable \
both match the packet but only non hashable should hit\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF \
traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF \
traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
m_minIPAHwType = IPA_HW_v3_0;
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("Failed memory allocation for rt_rule\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
rt_rule_entry->rule.hashable = 0; // non hashable
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
free(rt_rule);
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
};
/*--------------------------------------------------------------------------*/
/* Test21: IPv6 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest021 : public IpaRoutingBlockTest011
{
public:
IpaRoutingBlockTest021()
{
m_name = "IpaRoutingBlockTest021";
m_description =" \
Routing block test 021 - Destination address exact match hashable priority higher than non hashable \
both match the packet but only hashable should hit, second packet should get cache hit\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF - hashable\
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF - non hahsable \
traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
m_minIPAHwType = IPA_HW_v3_0;
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("Failed memory allocation for rt_rule\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
rt_rule_entry->rule.hashable = 0; // non hashable
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
free(rt_rule);
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
};
/*--------------------------------------------------------------------------*/
/* Test22: IPv6 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest022 : public IpaRoutingBlockTest012
{
public:
IpaRoutingBlockTest022()
{
m_name = "IpaRoutingBlockTest022";
m_description =" \
Routing block test 022 - Destination address exact match hashable priority higher than non hashable \
no match on non hashable rule (with higher priority), match on hashable rule. two packets with\
different tuple are sent (but match the rule) cache miss expected\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000AA - non hashable\
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF - hahsable \
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
m_minIPAHwType = IPA_HW_v3_0;
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("Failed memory allocation for rt_rule\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000AA;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
rt_rule_entry->rule.hashable = 0; // non hashable
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
free(rt_rule);
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
unsigned short port;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
port = ntohs(546);//DHCP Client Port
memcpy (&m_sendBuffer[IPV6_DST_PORT_OFFSET], &port, sizeof(port));
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
port = ntohs(547);//DHCP Client Port
memcpy (&m_sendBuffer2[IPV6_DST_PORT_OFFSET], &port, sizeof(port));
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
};
/*--------------------------------------------------------------------------*/
/* Test23: IPv6 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest023 : public IpaRoutingBlockTest013
{
public:
IpaRoutingBlockTest023()
{
m_name = "IpaRoutingBlockTest023";
m_description =" \
Routing block test 023 - Destination address exact match \
no match on non hashable rule (with lower priority), match on hashable rule. two packets with\
different tuple are sent (but match the rule) cache miss expected\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF - hashable\
traffic goes to pipe IPA_CLIENT_TEST2_CONS\
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000AA - non hahsable \
traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
m_minIPAHwType = IPA_HW_v3_0;
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("Failed memory allocation for rt_rule\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000AA;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
rt_rule_entry->rule.hashable = 0; // non hashable
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
free(rt_rule);
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
unsigned short port;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
port = ntohs(546);//DHCP Client Port
memcpy (&m_sendBuffer[IPV6_DST_PORT_OFFSET], &port, sizeof(port));
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
port = ntohs(547);//DHCP Client Port
memcpy (&m_sendBuffer2[IPV6_DST_PORT_OFFSET], &port, sizeof(port));
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
};
/*--------------------------------------------------------------------------*/
/* Test24: IPv6 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest024 : public IpaRoutingBlockTest014
{
public:
IpaRoutingBlockTest024()
{
m_name = "IpaRoutingBlockTest024";
m_description =" \
Routing block test 024 - Destination address exact match \
no match on non hashable rule(with higher priority) , match on hashable rule. two identical\
packets are sent cache hit expected on the second one\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000AA - non hashable\
traffic goes to pipe IPA_CLIENT_TEST2_CONS\
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF - hahsable \
traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
m_minIPAHwType = IPA_HW_v3_0;
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("Failed memory allocation for rt_rule\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000AA;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
rt_rule_entry->rule.hashable = 0; // non hashable
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
free(rt_rule);
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
};
/*--------------------------------------------------------------------------*/
/* Test25: IPv6 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest025 : public IpaRoutingBlockTest015
{
public:
IpaRoutingBlockTest025()
{
m_name = "IpaRoutingBlockTest025";
m_description =" \
Routing block test 025 - Destination address exact match \
no match on non hashable rule(with lower priority) , match on hashable rule. two identical\
packets are sent cache hit expected on the second one\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF - hashable\
traffic goes to pipe IPA_CLIENT_TEST2_CONS\
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000AA - non hahsable \
traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
m_minIPAHwType = IPA_HW_v3_0;
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("Failed memory allocation for rt_rule\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000AA;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
rt_rule_entry->rule.hashable = 0; // non hashable
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
free(rt_rule);
return false;
}
for (int i = 0; i < rt_rule->num_rules; i++) {
uRtRuleHdl[i] = rt_rule->rules[i].rt_rule_hdl;
}
uNumRtRules = rt_rule->num_rules;
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
};
/*--------------------------------------------------------------------------*/
/* Test26: IPv6 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest026 : public IpaRoutingBlockTest016
{
public:
IpaRoutingBlockTest026()
{
m_name = "IpaRoutingBlockTest026";
m_description =" \
Routing block test 026 - Destination address exact match max priority for non hashable \
match on both rule, non hashable rule should win because max priority\
packets are sent cache hit expected on the second one\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF - hashable\
traffic goes to pipe IPA_CLIENT_TEST2_CONS\
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF - non hahsable max prio \
traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
m_minIPAHwType = IPA_HW_v3_0;
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("Failed memory allocation for rt_rule\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry->rule.max_prio = 1; // max prio
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
rt_rule_entry->rule.hashable = 0; // non hashable
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
free(rt_rule);
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
};
/*--------------------------------------------------------------------------*/
/* Test27: IPv6 - Tests routing hashable, non hashable, */
/* cache/hash invalidation test on rule addition */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest027 : public IpaRoutingBlockTest025
{
public:
IpaRoutingBlockTest027()
{
m_name = "IpaRoutingBlockTest027";
m_description =" \
Routing block test 027 - this test perform test 025 and then commits another rule\
another identical packet is sent: DST_IP == 192.168.02.170 and expected to get cache miss";
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
if (false == isSuccess)
{
printf("ReceivePacketsAndCompare failure.\n");
return false;
}
// until here test 25 was run, now we test hash invalidation
// commit the rules again to clear the cache
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// send the packet again
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// validate we got cache miss
isSuccess = ReceivePacketsAndCompareSpecial();
if (false == isSuccess)
{
printf("ReceivePacketsAndCompareSpecial failure.\n");
}
return isSuccess;
} // Run()
};
/*--------------------------------------------------------------------------*/
/* Test28: IPv6 - Tests routing hashable, non hashable, */
/* cache/hash invalidation test on rule delition */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest028 : public IpaRoutingBlockTest025
{
public:
IpaRoutingBlockTest028()
{
m_name = "IpaRoutingBlockTest028";
m_description =" \
Routing block test 028 - this test perform test 025 and then deletes last rule\
another identical packet is sent: DST_IP == 192.168.02.170 and expected to get cache miss";
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
if (false == isSuccess)
{
printf("ReceivePacketsAndCompare failure.\n");
return false;
}
// until here test 25 was run, now we test hash invalidation
// delete the last rule, this should clear the cache
res = RemoveLastRule(IPA_IP_v6);
if (false == res) {
printf("Failed removing filtering rules.\n");
return false;
}
// send the packet again
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// validate we got cache miss
isSuccess = ReceivePacketsAndCompareSpecial();
if (false == isSuccess)
{
printf("ReceivePacketsAndCompareSpecial failure.\n");
}
return isSuccess;
} // Run()
};
/*--------------------------------------------------------------------------*/
/* Test30: Pure ack packet matching */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest030 : IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest030()
{
m_name = "IpaRoutingBlockTest030";
m_description =" \
Routing block test 030 - Pure Ack packet matching \
1. Generate and commit a single routing table. \
2. Generate and commit Three routing rules: \
All TCP pure ack traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.2.200 & 255.255.255.255) traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v4;
m_minIPAHwType = IPA_HW_v4_5;
Register(*this);
}
bool LoadPackets()
{
if (!LoadNoPayloadPacket(m_IpaIPType, m_sendBuffer, m_sendSize)) {
LOG_MSG_ERROR("Failed loading No Payload Packet");
return false;
}
if (!LoadDefaultPacket(m_IpaIPType, m_sendBuffer2, m_sendSize2)) {
LOG_MSG_ERROR("Failed loading default Packet");
return false;
}
if (!LoadDefaultPacket(m_IpaIPType, m_sendBuffer3, m_sendSize3)) {
LOG_MSG_ERROR("Failed loading default Packet");
return false;
}
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load IP packets
res = LoadPackets();
if (false == res) {
printf("Failed loading packets\n");
return false;
}
// Send first packet
m_sendBuffer[IPv4_TCP_FLAGS_OFFSET] |= TCP_ACK_FLAG_MASK;
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xC8;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[IPv4_TCP_FLAGS_OFFSET] |= TCP_ACK_FLAG_MASK;
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xC8;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
m_sendBuffer3[IPv4_TCP_FLAGS_OFFSET] |= TCP_ACK_FLAG_MASK;
m_sendBuffer3[DST_ADDR_LSB_OFFSET_IPV4] = 0x64;
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_IS_PURE_ACK;
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802C8;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*--------------------------------------------------------------------------*/
/* Test31: IPv6 Pure ack packet matching */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest031 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest031()
{
m_name = "IpaRoutingBlockTest031";
m_description =" \
Routing block test 031 - IPv6 Pure Ack packet matching \
1. Generate and commit a single routing table. \
2. Generate and commit Three routing rules: \
All TCP pure ack traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000F5 \
traffic goes to pipe IPA_CLIENT_TEST3_CONS \
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS";
m_IpaIPType = IPA_IP_v6;
m_minIPAHwType = IPA_HW_v4_5;
Register(*this);
}
bool LoadPackets()
{
if (!LoadNoPayloadPacket(m_IpaIPType, m_sendBuffer, m_sendSize)) {
LOG_MSG_ERROR("Failed loading No Payload Packet");
return false;
}
if (!LoadNoPayloadPacket(m_IpaIPType, m_sendBuffer2, m_sendSize2)) {
LOG_MSG_ERROR("Failed loading default Packet");
return false;
}
if (!LoadNoPayloadPacket(m_IpaIPType, m_sendBuffer3, m_sendSize3)) {
LOG_MSG_ERROR("Failed loading default Packet");
return false;
}
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet)
res = LoadPackets();
if (false == res) {
printf("Failed loading packets\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xF5;
m_sendBuffer[IPv6_TCP_FLAGS_OFFSET] |= TCP_ACK_FLAG_MASK;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xF5;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES*sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_IS_PURE_ACK;
rt_rule_entry = &rt_rule->rules[1];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000F5;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry = &rt_rule->rules[2];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*---------------------------------------------------------------------------*/
/* Test100: Cache LRU behavior test */
/*---------------------------------------------------------------------------*/
#define CHACHE_ENTRIES 64
#define CHACHE_PLUS_ONE (CHACHE_ENTRIES +1)
class IpaRoutingBlockTest040 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest040()
{
m_name = "IpaRoutingBlockTest040";
m_description = " \
Routing block test 40 - Cache LRU behavior test \
1. Preload the cache by sending 64 packets for different connections \
2. Send another packet for 65th connection \
3. Send packets for first 64 connections \
4. Verify that 1st connectionÂ’s entry was reclaimed";
m_IpaIPType = IPA_IP_v4;
m_minIPAHwType = IPA_HW_v4_0;
Register(*this);
}
bool Setup()
{
return IpaRoutingBlockTestFixture:: Setup(true);
}
virtual bool AddRules()
{
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
printf("Entering %s, %s()\n", __FUNCTION__, __FILE__);
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
CHACHE_PLUS_ONE * sizeof(struct ipa_rt_rule_add));
if(!rt_rule) {
printf("Failed memory allocation for rt_rule\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = CHACHE_PLUS_ONE;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
for (int i = 0; i < CHACHE_PLUS_ONE; i++) {
rt_rule_entry = &rt_rule->rules[i];
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A80101 + i; // DST_IP == 192.168.1.(1+i)
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1;
}
// The last rule has to be catch all, otherwize no rule will work
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0x0;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
printf("Leaving %s, %s()\n",__FUNCTION__, __FILE__);
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
printf("Entering %s, %s()\n", __FUNCTION__, __FILE__);
// Add the relevant filtering rules
res = AddRules();
if (false == res) {
printf("Failed adding filtering rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send the first CHACHE_ENTRIES packets
// Receive packets from the channels and compare results
// All rules should be cache miss
for (int i = 0; i < CHACHE_ENTRIES; i++) {
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0x1 + i;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
isSuccess = ReceivePacketAndCompareFrom(m_consumer, m_sendBuffer, m_sendSize, false);
if (false == isSuccess) {
printf("%s:%d: ReceivePacketAndCompareFrom failure.\n", __FUNCTION__, __LINE__);
return false;
}
}
// Send again the first CHACHE_ENTRIES packets
// Receive packets from the channels and compare results
// All rules should be cache hit
for (int i = 0; i < CHACHE_ENTRIES; i++) {
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0x1 + i;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
isSuccess = ReceivePacketAndCompareFrom(m_consumer, m_sendBuffer, m_sendSize, true);
if (false == isSuccess) {
printf("%s:%d: ReceivePacketAndCompareFrom failure.\n", __FUNCTION__, __LINE__);
return false;
}
}
// Send a packet to a new filter entry, this should trigger the LRU clear
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0x1 + CHACHE_ENTRIES;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess) {
printf("SendData failure.\n");
return false;
}
// receive and verify that cache was missed
isSuccess = ReceivePacketAndCompareFrom(m_consumer, m_sendBuffer, m_sendSize, false);
if (false == isSuccess) {
printf("%s:%d: ReceivePacketAndCompareFrom failure.\n", __FUNCTION__, __LINE__);
return false;
}
// send the first packet again
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0x1;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess) {
printf("SendData failure.\n");
return false;
}
// receive and verify that cache was missed
isSuccess = ReceivePacketAndCompareFrom(m_consumer, m_sendBuffer, m_sendSize, false);
if (false == isSuccess) {
printf("%s:%d: ReceivePacketAndCompareFrom failure.\n", __FUNCTION__, __LINE__);
return false;
}
printf("Leaving %s, %s(), Returning %d\n",__FUNCTION__, __FILE__, isSuccess);
return isSuccess;
} // Run()
};
/*---------------------------------------------------------------------------*/
/* Test50: Test TTL update by routing to a destination address */
/*---------------------------------------------------------------------------*/
class IpaRoutingBlockTest050 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest050()
{
m_name = "IpaRoutingBlockTest050";
m_description =" \
Routing block test 050 - Destination address exact match\1. Generate and commit a single routing tables. \
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == (192.169.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.2.255 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS \
3. Check if TTL is updated. ";
m_IpaIPType = IPA_IP_v4;
m_minIPAHwType = IPA_HW_v5_5;
Register(*this);
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xFF;
m_sendBuffer[IPV4_TTL_OFFSET] = 5;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
m_sendBuffer2[IPV4_TTL_OFFSET] = 4;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
m_sendBuffer3[IPV4_TTL_OFFSET] = 3;
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool ReceivePacketsAndCompare()
{
size_t receivedSize = 0;
size_t receivedSize2 = 0;
size_t receivedSize3 = 0;
bool pkt1_cmp_succ, pkt2_cmp_succ, pkt3_cmp_succ;
uint16_t csum = 0;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
Byte *rxBuff2 = new Byte[0x400];
Byte *rxBuff3 = new Byte[0x400];
if (NULL == rxBuff1 || NULL == rxBuff2 || NULL == rxBuff3)
{
printf("Memory allocation error.\n");
return false;
}
memset(rxBuff1, 0, 0x400);
memset(rxBuff2, 0, 0x400);
memset(rxBuff3, 0, 0x400);
receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
receivedSize2 = m_consumer2.ReceiveData(rxBuff2, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize2, m_consumer2.m_fromChannelName.c_str());
receivedSize3 = m_defaultConsumer.ReceiveData(rxBuff3, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize3, m_defaultConsumer.m_fromChannelName.c_str());
/* Update TTL values. */
m_sendBuffer[IPV4_TTL_OFFSET] = 4;
m_sendBuffer2[IPV4_TTL_OFFSET] = 3;
/* Update Checksum.*/
csum = *((uint16_t *)(m_sendBuffer + IPV4_CSUM_OFFSET));
csum += 1;
*((uint16_t *)(m_sendBuffer+ IPV4_CSUM_OFFSET)) = csum;
csum = *((uint16_t *)(m_sendBuffer2 + IPV4_CSUM_OFFSET));
csum += 1;
*((uint16_t *)(m_sendBuffer2 + IPV4_CSUM_OFFSET)) = csum;
/* Compare results */
pkt1_cmp_succ = CompareResultVsGolden(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
pkt2_cmp_succ = CompareResultVsGolden(m_sendBuffer2, m_sendSize2, rxBuff2, receivedSize2);
pkt3_cmp_succ = CompareResultVsGolden(m_sendBuffer3, m_sendSize3, rxBuff3, receivedSize3);
size_t recievedBufferSize =
MAX3(receivedSize, receivedSize2, receivedSize3) * 3;
size_t sentBufferSize =
MAX3(m_sendSize, m_sendSize2, m_sendSize3) * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
if (NULL == recievedBuffer || NULL == sentBuffer) {
printf("Memory allocation error\n");
return false;
}
size_t j;
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
for(j = 0; j < m_sendSize; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", m_sendBuffer[j]);
for(j = 0; j < receivedSize; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff1[j]);
printf("Expected Value1(%zu)\n%s\n, Received Value1(%zu)\n%s\n-->Value1 %s\n",
m_sendSize,sentBuffer,receivedSize,recievedBuffer,
pkt1_cmp_succ?"Match":"no Match");
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
for(j = 0; j < m_sendSize2; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", m_sendBuffer2[j]);
for(j = 0; j < receivedSize2; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff2[j]);
printf("Expected Value2 (%zu)\n%s\n, Received Value2(%zu)\n%s\n-->Value2 %s\n",
m_sendSize2,sentBuffer,receivedSize2,recievedBuffer,
pkt2_cmp_succ?"Match":"no Match");
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
for(j = 0; j < m_sendSize3; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", m_sendBuffer3[j]);
for(j = 0; j < receivedSize3; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff3[j]);
printf("Expected Value3 (%zu)\n%s\n, Received Value3(%zu)\n%s\n-->Value3 %s\n",
m_sendSize3,sentBuffer,receivedSize3,recievedBuffer,
pkt3_cmp_succ?"Match":"no Match");
delete[] recievedBuffer;
delete[] sentBuffer;
delete[] rxBuff1;
delete[] rxBuff2;
delete[] rxBuff3;
return pkt1_cmp_succ && pkt2_cmp_succ && pkt3_cmp_succ;
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule_v2 *rt_rule;
struct ipa_rt_rule_add_v2 *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule_v2 *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule_v2));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->rules = (uint64_t)calloc(3, sizeof(struct ipa_rt_rule_add_v2));
if(!rt_rule->rules) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &(((struct ipa_rt_rule_add_v2 *)rt_rule->rules)[0]);
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802FF;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.ttl_update = 1;
rt_rule_entry = &(((struct ipa_rt_rule_add_v2 *)rt_rule->rules)[1]);
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.ttl_update = 1;
rt_rule_entry = &(((struct ipa_rt_rule_add_v2 *)rt_rule->rules)[2]);
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.ttl_update = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*--------------------------------------------------------------------------*/
/* Test51: IPv4 - Tests routing hashable vs non hashable priorities */
/*--------------------------------------------------------------------------*/
class IpaRoutingBlockTest051 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest051()
{
m_name = "IpaRoutingBlockTest051";
m_description =" \
Routing block test 051 - Destination address exact match hashable priority higher than non hashable \
both match the packet but only hashable should hit, second packet should get cache hit, \
Check if TTL is updated.\
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == (192.168.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == (192.168.2.170 & 255.255.255.255)traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS \
3. Check if TTL is updated.";
m_IpaIPType = IPA_IP_v4;
m_minIPAHwType = IPA_HW_v5_5;
Register(*this);
}
bool Setup()
{
return IpaRoutingBlockTestFixture:: Setup(true);
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule_v2 *rt_rule;
struct ipa_rt_rule_add_v2 *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule_v2 *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule_v2));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->rules = (uint64_t)calloc(3, sizeof(struct ipa_rt_rule_add_v2));
if(!rt_rule->rules) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v4;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &(((struct ipa_rt_rule_add_v2 *)rt_rule->rules)[0]);
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA; //192.168.02.170
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 1; // hashable
rt_rule_entry->rule.ttl_update = 1; // TTL Update
rt_rule_entry = &(((struct ipa_rt_rule_add_v2 *)rt_rule->rules)[1]);
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xC0A802AA; //192.168.02.170
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
rt_rule_entry->rule.hashable = 0; // non hashable
rt_rule_entry->rule.ttl_update = 1; // TTL Update
rt_rule_entry = &(((struct ipa_rt_rule_add_v2 *)rt_rule->rules)[2]);
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.ttl_update = 0; // TTL Update
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v4);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
m_sendBuffer[IPV4_TTL_OFFSET] = 5;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV4] = 0xAA;
m_sendBuffer2[IPV4_TTL_OFFSET] = 4;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
m_sendBuffer3[IPV4_TTL_OFFSET] = 3;
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool ReceivePacketsAndCompare()
{
size_t receivedSize = 0;
size_t receivedSize2 = 0;
size_t receivedSize3 = 0;
bool isSuccess = true;
uint16_t csum = 0;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
Byte *rxBuff2 = new Byte[0x400];
Byte *rxBuff3 = new Byte[0x400];
if (NULL == rxBuff1 || NULL == rxBuff2 || NULL == rxBuff3)
{
printf("Memory allocation error.\n");
return false;
}
receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
receivedSize2 = m_consumer.ReceiveData(rxBuff2, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize2, m_consumer2.m_fromChannelName.c_str());
receivedSize3 = m_defaultConsumer.ReceiveData(rxBuff3, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize3, m_defaultConsumer.m_fromChannelName.c_str());
/* Update TTL values. */
m_sendBuffer[IPV4_TTL_OFFSET] = 4;
m_sendBuffer2[IPV4_TTL_OFFSET] = 3;
/* Update Checksum.*/
csum = *((uint16_t *)(m_sendBuffer + IPV4_CSUM_OFFSET));
csum += 1;
*((uint16_t *)(m_sendBuffer+ IPV4_CSUM_OFFSET)) = csum;
csum = *((uint16_t *)(m_sendBuffer2 + IPV4_CSUM_OFFSET));
csum += 1;
*((uint16_t *)(m_sendBuffer2 + IPV4_CSUM_OFFSET)) = csum;
/* Compare results */
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer2, m_sendSize2, rxBuff2, receivedSize2);
isSuccess &= CompareResultVsGolden_w_Status(m_sendBuffer3, m_sendSize3, rxBuff3, receivedSize3);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize, receivedSize, rxBuff1) : IsCacheMiss(m_sendSize,receivedSize,rxBuff1);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheHit_v5_0(m_sendSize2, receivedSize2, rxBuff2) : IsCacheHit(m_sendSize2,receivedSize2,rxBuff2);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
IsCacheMiss_v5_0(m_sendSize3, receivedSize3, rxBuff3) : IsCacheMiss(m_sendSize3,receivedSize3,rxBuff3);
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_5) ?
IsTTLUpdated_v5_5(m_sendSize, receivedSize, rxBuff1) : true;
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_5) ?
IsTTLUpdated_v5_5(m_sendSize2, receivedSize2, rxBuff2) : true;
isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_5) ?
!IsTTLUpdated_v5_5(m_sendSize3, receivedSize3, rxBuff3) : true;
size_t recievedBufferSize = receivedSize * 3;
size_t sentBufferSize = m_sendSize * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
print_packets(receivedSize, m_sendSize, recievedBufferSize, sentBufferSize, rxBuff1, m_sendBuffer, recievedBuffer, sentBuffer);
print_packets(receivedSize2, m_sendSize2, recievedBufferSize, sentBufferSize, rxBuff2, m_sendBuffer2, recievedBuffer, sentBuffer);
print_packets(receivedSize3, m_sendSize3, recievedBufferSize, sentBufferSize, rxBuff3, m_sendBuffer3, recievedBuffer, sentBuffer);
delete[] recievedBuffer;
delete[] sentBuffer;
delete[] rxBuff1;
delete[] rxBuff2;
delete[] rxBuff3;
return isSuccess;
}
};
/*---------------------------------------------------------------------------*/
/* Test52: IPv6 - Test TTL update by routing to destination address */
/*---------------------------------------------------------------------------*/
class IpaRoutingBlockTest052 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest052()
{
m_name = "IpaRoutingBlockTest052";
m_description =" \
Routing block test 052 - IPv6 Destination address exact match and check if TTL is updated \
1. Generate and commit a single routing tables. \
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF \
traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF \
traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS \
3. Check if TTL is updated.";
m_IpaIPType = IPA_IP_v6;
m_minIPAHwType = IPA_HW_v5_5;
Register(*this);
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
m_sendBuffer[HOP_LIMIT_OFFSET_IPV6] = 5;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xAA;
m_sendBuffer2[HOP_LIMIT_OFFSET_IPV6] = 4;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
m_sendBuffer3[HOP_LIMIT_OFFSET_IPV6] = 3;
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool ReceivePacketsAndCompare()
{
size_t receivedSize = 0;
size_t receivedSize2 = 0;
size_t receivedSize3 = 0;
bool pkt1_cmp_succ, pkt2_cmp_succ, pkt3_cmp_succ;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
Byte *rxBuff2 = new Byte[0x400];
Byte *rxBuff3 = new Byte[0x400];
if (NULL == rxBuff1 || NULL == rxBuff2 || NULL == rxBuff3)
{
printf("Memory allocation error.\n");
return false;
}
memset(rxBuff1, 0, 0x400);
memset(rxBuff2, 0, 0x400);
memset(rxBuff3, 0, 0x400);
receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
receivedSize2 = m_consumer2.ReceiveData(rxBuff2, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize2, m_consumer2.m_fromChannelName.c_str());
receivedSize3 = m_defaultConsumer.ReceiveData(rxBuff3, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize3, m_defaultConsumer.m_fromChannelName.c_str());
/* Update TTL values. */
m_sendBuffer[HOP_LIMIT_OFFSET_IPV6] = 4;
m_sendBuffer2[HOP_LIMIT_OFFSET_IPV6] = 3;
/* Compare results */
pkt1_cmp_succ = CompareResultVsGolden(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
pkt2_cmp_succ = CompareResultVsGolden(m_sendBuffer2, m_sendSize2, rxBuff2, receivedSize2);
pkt3_cmp_succ = CompareResultVsGolden(m_sendBuffer3, m_sendSize3, rxBuff3, receivedSize3);
size_t recievedBufferSize =
MAX3(receivedSize, receivedSize2, receivedSize3) * 3;
size_t sentBufferSize =
MAX3(m_sendSize, m_sendSize2, m_sendSize3) * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
if (NULL == recievedBuffer || NULL == sentBuffer) {
printf("Memory allocation error\n");
return false;
}
size_t j;
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
for(j = 0; j < m_sendSize; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", m_sendBuffer[j]);
for(j = 0; j < receivedSize; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff1[j]);
printf("Expected Value1(%zu)\n%s\n, Received Value1(%zu)\n%s\n-->Value1 %s\n",
m_sendSize,sentBuffer,receivedSize,recievedBuffer,
pkt1_cmp_succ?"Match":"no Match");
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
for(j = 0; j < m_sendSize2; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", m_sendBuffer2[j]);
for(j = 0; j < receivedSize2; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff2[j]);
printf("Expected Value2 (%zu)\n%s\n, Received Value2(%zu)\n%s\n-->Value2 %s\n",
m_sendSize2,sentBuffer,receivedSize2,recievedBuffer,
pkt2_cmp_succ?"Match":"no Match");
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
for(j = 0; j < m_sendSize3; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", m_sendBuffer3[j]);
for(j = 0; j < receivedSize3; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff3[j]);
printf("Expected Value3 (%zu)\n%s\n, Received Value3(%zu)\n%s\n-->Value3 %s\n",
m_sendSize3,sentBuffer,receivedSize3,recievedBuffer,
pkt3_cmp_succ?"Match":"no Match");
delete[] recievedBuffer;
delete[] sentBuffer;
delete[] rxBuff1;
delete[] rxBuff2;
delete[] rxBuff3;
return pkt1_cmp_succ && pkt2_cmp_succ && pkt3_cmp_succ;
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule_v2 *rt_rule;
struct ipa_rt_rule_add_v2 *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule_v2 *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule_v2));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->rules = (uint64_t)calloc(3, sizeof(struct ipa_rt_rule_add_v2));
if(!rt_rule->rules) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &(((struct ipa_rt_rule_add_v2 *)rt_rule->rules)[0]);
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.ttl_update = 1; // TTL Update
rt_rule_entry = &(((struct ipa_rt_rule_add_v2 *)rt_rule->rules)[1]);
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000AA;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.ttl_update = 1; // TTL Update
rt_rule_entry = &(((struct ipa_rt_rule_add_v2 *)rt_rule->rules)[2]);
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
rt_rule_entry->rule.ttl_update = 0; // TTL Update
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
};
/*---------------------------------------------------------------------------------------*/
/* Test53: IPv6 - Test TTL update by routing to destination address and check for status */
/*---------------------------------------------------------------------------------------*/
class IpaRoutingBlockTest053 : public IpaRoutingBlockTestFixture
{
public:
IpaRoutingBlockTest053()
{
m_name = "IpaRoutingBlockTest053";
m_description =" \
Routing block test 053 - IPv6 Destination address exact match and check if TTL is updated \
1. Generate and commit a single routing tables. \
2. Generate and commit Three routing rules: (DST & Mask Match). \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF \
traffic goes to pipe IPA_CLIENT_TEST2_CONS \
All DST_IP == 0XFF020000 \
0x00000000 \
0x00000000 \
0X000000FF \
traffic goes to pipe IPA_CLIENT_TEST3_CONS\
All other traffic goes to pipe IPA_CLIENT_TEST4_CONS \
3. Check if TTL is updated and also the status has TTL bit updated.";
m_IpaIPType = IPA_IP_v6;
m_minIPAHwType = IPA_HW_v5_5;
Register(*this);
}
bool Setup()
{
return IpaRoutingBlockTestFixture:: Setup(true);
}
bool Run()
{
bool res = false;
bool isSuccess = false;
// Add the relevant routing rules
res = AddRules();
if (false == res) {
printf("Failed adding routing rules.\n");
return false;
}
// Load input data (IP packet) from file
res = LoadFiles(IPA_IP_v6);
if (false == res) {
printf("Failed loading files.\n");
return false;
}
// Send first packet
m_sendBuffer[DST_ADDR_LSB_OFFSET_IPV6] = 0xFF;
m_sendBuffer[HOP_LIMIT_OFFSET_IPV6] = 5;
isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send second packet
m_sendBuffer2[DST_ADDR_LSB_OFFSET_IPV6] = 0xAA;
m_sendBuffer2[HOP_LIMIT_OFFSET_IPV6] = 4;
isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Send third packet
m_sendBuffer3[HOP_LIMIT_OFFSET_IPV6] = 3;
isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
if (false == isSuccess)
{
printf("SendData failure.\n");
return false;
}
// Receive packets from the channels and compare results
isSuccess = ReceivePacketsAndCompare();
return isSuccess;
} // Run()
bool ReceivePacketsAndCompare()
{
size_t receivedSize = 0;
size_t receivedSize2 = 0;
size_t receivedSize3 = 0;
bool pkt1_cmp_succ, pkt2_cmp_succ, pkt3_cmp_succ;
// Receive results
Byte *rxBuff1 = new Byte[0x400];
Byte *rxBuff2 = new Byte[0x400];
Byte *rxBuff3 = new Byte[0x400];
if (NULL == rxBuff1 || NULL == rxBuff2 || NULL == rxBuff3)
{
printf("Memory allocation error.\n");
return false;
}
memset(rxBuff1, 0, 0x400);
memset(rxBuff2, 0, 0x400);
memset(rxBuff3, 0, 0x400);
receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
receivedSize2 = m_consumer2.ReceiveData(rxBuff2, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize2, m_consumer2.m_fromChannelName.c_str());
receivedSize3 = m_defaultConsumer.ReceiveData(rxBuff3, 0x400);
printf("Received %zu bytes on %s.\n", receivedSize3, m_defaultConsumer.m_fromChannelName.c_str());
/* Update TTL values. */
m_sendBuffer[HOP_LIMIT_OFFSET_IPV6] = 4;
m_sendBuffer2[HOP_LIMIT_OFFSET_IPV6] = 3;
/* Compare results */
pkt1_cmp_succ = CompareResultVsGolden_w_Status(m_sendBuffer, m_sendSize, rxBuff1, receivedSize);
pkt2_cmp_succ = CompareResultVsGolden_w_Status(m_sendBuffer2, m_sendSize2, rxBuff2, receivedSize2);
pkt3_cmp_succ = CompareResultVsGolden_w_Status(m_sendBuffer3, m_sendSize3, rxBuff3, receivedSize3);
pkt1_cmp_succ &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_5) ?
IsTTLUpdated_v5_5(m_sendSize, receivedSize, rxBuff1) : true;
pkt2_cmp_succ &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_5) ?
IsTTLUpdated_v5_5(m_sendSize2, receivedSize2, rxBuff2) : true;
pkt3_cmp_succ &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_5) ?
!IsTTLUpdated_v5_5(m_sendSize3, receivedSize3, rxBuff3) : true;
size_t recievedBufferSize =
MAX3(receivedSize, receivedSize2, receivedSize3) * 3;
size_t sentBufferSize =
MAX3(m_sendSize, m_sendSize2, m_sendSize3) * 3;
char *recievedBuffer = new char[recievedBufferSize];
char *sentBuffer = new char[sentBufferSize];
if (NULL == recievedBuffer || NULL == sentBuffer) {
printf("Memory allocation error\n");
return false;
}
size_t j;
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
for(j = 0; j < m_sendSize; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", m_sendBuffer[j]);
for(j = 0; j < receivedSize; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff1[j]);
printf("Expected Value1(%zu)\n%s\n, Received Value1(%zu)\n%s\n-->Value1 %s\n",
m_sendSize,sentBuffer,receivedSize,recievedBuffer,
pkt1_cmp_succ?"Match":"no Match");
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
for(j = 0; j < m_sendSize2; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", m_sendBuffer2[j]);
for(j = 0; j < receivedSize2; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff2[j]);
printf("Expected Value2 (%zu)\n%s\n, Received Value2(%zu)\n%s\n-->Value2 %s\n",
m_sendSize2,sentBuffer,receivedSize2,recievedBuffer,
pkt2_cmp_succ?"Match":"no Match");
memset(recievedBuffer, 0, recievedBufferSize);
memset(sentBuffer, 0, sentBufferSize);
for(j = 0; j < m_sendSize3; j++)
snprintf(&sentBuffer[3 * j], sentBufferSize - (3 * j + 1), " %02X", m_sendBuffer3[j]);
for(j = 0; j < receivedSize3; j++)
snprintf(&recievedBuffer[3 * j], recievedBufferSize - (3 * j + 1), " %02X", rxBuff3[j]);
printf("Expected Value3 (%zu)\n%s\n, Received Value3(%zu)\n%s\n-->Value3 %s\n",
m_sendSize3,sentBuffer,receivedSize3,recievedBuffer,
pkt3_cmp_succ?"Match":"no Match");
delete[] recievedBuffer;
delete[] sentBuffer;
delete[] rxBuff1;
delete[] rxBuff2;
delete[] rxBuff3;
return pkt1_cmp_succ && pkt2_cmp_succ && pkt3_cmp_succ;
}
bool AddRules()
{
struct ipa_ioc_add_rt_rule_v2 *rt_rule;
struct ipa_rt_rule_add_v2 *rt_rule_entry;
const int NUM_RULES = 3;
rt_rule = (struct ipa_ioc_add_rt_rule_v2 *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule_v2));
if(!rt_rule) {
printf("fail\n");
return false;
}
rt_rule->rules = (uint64_t)calloc(3, sizeof(struct ipa_rt_rule_add_v2));
if(!rt_rule->rules) {
printf("fail\n");
return false;
}
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = IPA_IP_v6;
strlcpy(rt_rule->rt_tbl_name, "LAN", sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &(((struct ipa_rt_rule_add_v2 *)rt_rule->rules)[0]);
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST2_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000FF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.ttl_update = 1; // TTL Update
rt_rule_entry = &(((struct ipa_rt_rule_add_v2 *)rt_rule->rules)[1]);
rt_rule_entry->at_rear = 0;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST3_CONS;
// rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0XFF020000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0x00000000;
rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0X000000AA;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
rt_rule_entry->rule.ttl_update = 1; // TTL Update
rt_rule_entry = &(((struct ipa_rt_rule_add_v2 *)rt_rule->rules)[2]);
rt_rule_entry->at_rear = 1;
rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
rt_rule_entry->rule.ttl_update = 0; // TTL Update
if (false == m_routing.AddRoutingRule(rt_rule))
{
printf("Routing rule addition failed!\n");
return false;
}
printf("rt rule hdl1=%x\n", rt_rule_entry->rt_rule_hdl);
free(rt_rule);
InitFilteringBlock();
return true;
}
};
static class IpaRoutingBlockTest1 ipaRoutingBlockTest1;
static class IpaRoutingBlockTest2 ipaRoutingBlockTest2;
static class IpaRoutingBlockTest3 ipaRoutingBlockTest3;
static class IpaRoutingBlockTest4 ipaRoutingBlockTest4;
static class IpaRoutingBlockTest5 ipaRoutingBlockTest5;
static class IpaRoutingBlockTest006 ipaRoutingBlockTest006;
static class IpaRoutingBlockTest007 ipaRoutingBlockTest007;
static class IpaRoutingBlockTest008 ipaRoutingBlockTest008;
static class IpaRoutingBlockTest009 ipaRoutingBlockTest009;
static class IpaRoutingBlockTest010 ipaRoutingBlockTest010;
static class IpaRoutingBlockTest011 ipaRoutingBlockTest011;
static class IpaRoutingBlockTest012 ipaRoutingBlockTest012;
static class IpaRoutingBlockTest013 ipaRoutingBlockTest013;
static class IpaRoutingBlockTest014 ipaRoutingBlockTest014;
static class IpaRoutingBlockTest015 ipaRoutingBlockTest015;
static class IpaRoutingBlockTest016 ipaRoutingBlockTest016;
static class IpaRoutingBlockTest017 ipaRoutingBlockTest017;
static class IpaRoutingBlockTest018 ipaRoutingBlockTest018;
static class IpaRoutingBlockTest020 ipaRoutingBlockTest020;
static class IpaRoutingBlockTest021 ipaRoutingBlockTest021;
static class IpaRoutingBlockTest022 ipaRoutingBlockTest022;
static class IpaRoutingBlockTest023 ipaRoutingBlockTest023;
static class IpaRoutingBlockTest024 ipaRoutingBlockTest024;
static class IpaRoutingBlockTest025 ipaRoutingBlockTest025;
static class IpaRoutingBlockTest026 ipaRoutingBlockTest026;
static class IpaRoutingBlockTest027 ipaRoutingBlockTest027;
static class IpaRoutingBlockTest028 ipaRoutingBlockTest028;
static class IpaRoutingBlockTest030 ipaRoutingBlockTest030;
static class IpaRoutingBlockTest031 ipaRoutingBlockTest031;
static class IpaRoutingBlockTest040 ipaRoutingBlockTest040;
static class IpaRoutingBlockTest050 ipaRoutingBlockTest050;
static class IpaRoutingBlockTest051 ipaRoutingBlockTest051;
static class IpaRoutingBlockTest052 ipaRoutingBlockTest052;
static class IpaRoutingBlockTest053 ipaRoutingBlockTest053;