blob: e71aa20360292b69c355e6dfa61f8d9a30a5594c [file] [log] [blame]
/*
*
* Copyright (c) 2019 Google LLC
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file
* This file defines common preprocessor defintions, constants,
* functions, and globals for unit and functional tests for the
* Inet layer.
*
*/
#ifndef WEAVE_TEST_INETLAYER_COMMON_HPP
#define WEAVE_TEST_INETLAYER_COMMON_HPP
#include <stddef.h>
#include <stdint.h>
#include <InetLayer/InetError.h>
#include <InetLayer/InetInterface.h>
#include <InetLayer/RawEndPoint.h>
#include <InetLayer/UDPEndPoint.h>
#include <SystemLayer/SystemPacketBuffer.h>
using namespace ::nl;
using namespace ::nl::Weave;
// Preprocessor Macros
#define SetStatusFailed(aTestStatus) do { (aTestStatus).mFailed = true; fprintf(stderr, "Test failed at %s:%u!\n", __func__, __LINE__); } while (0)
#define kToolOptBase 1000
#define kToolOptInterface 'I'
#define kToolOptIPv4Only '4'
#define kToolOptIPv6Only '6'
#define kToolOptInterval 'i'
#define kToolOptListen 'l'
#define kToolOptRawIP 'r'
#define kToolOptSendSize 's'
#define kToolOptUDPIP 'u'
// Type Definitions
enum OptFlagsCommon
{
kOptFlagUseIPv4 = 0x00000001,
kOptFlagUseIPv6 = 0x00000002,
kOptFlagUseRawIP = 0x00000004,
kOptFlagUseUDPIP = 0x00000008,
kOptFlagListen = 0x00000010,
};
enum kICMPTypeIndex
{
kICMP_EchoRequestIndex = 0,
kICMP_EchoReplyIndex = 1
};
struct Stats
{
uint32_t mExpected;
uint32_t mActual;
};
struct TransferStats
{
struct Stats mReceive;
struct Stats mTransmit;
};
struct TestStatus
{
bool mFailed;
bool mSucceeded;
};
// Global Variables
static const uint16_t kUDPPort = 4242;
static const size_t kICMPv4_FilterTypes = 2;
static const size_t kICMPv6_FilterTypes = 2;
extern const uint8_t gICMPv4Types[kICMPv4_FilterTypes];
extern const uint8_t gICMPv6Types[kICMPv6_FilterTypes];
extern bool gSendIntervalExpired;
extern uint32_t gSendIntervalMs;
extern const char * gInterfaceName;
extern Inet::InterfaceId gInterfaceId;
extern uint16_t gSendSize;
extern uint32_t gOptFlags;
// Function Prototypes
namespace Common
{
extern bool IsReceiver(void);
extern bool IsSender(void);
extern bool IsTesting(const TestStatus &aTestStatus);
extern bool WasSuccessful(const TestStatus &aTestStatus);
extern System::PacketBuffer *MakeDataBuffer(uint16_t aDesiredLength, uint8_t aFirstValue);
extern System::PacketBuffer *MakeDataBuffer(uint16_t aDesiredLength);
extern System::PacketBuffer *MakeICMPv4DataBuffer(uint16_t aDesiredUserLength);
extern System::PacketBuffer *MakeICMPv6DataBuffer(uint16_t aDesiredUserLength);
extern bool HandleDataReceived(const System::PacketBuffer *aBuffer, TransferStats &aStats, bool aStatsByPacket, bool aCheckBuffer, uint8_t aFirstValue);
extern bool HandleDataReceived(const System::PacketBuffer *aBuffer, TransferStats &aStats, bool aStatsByPacket, bool aCheckBuffer);
extern bool HandleICMPv4DataReceived(System::PacketBuffer *aBuffer, TransferStats &aStats, bool aStatsByPacket, bool aCheckBuffer);
extern bool HandleICMPv6DataReceived(System::PacketBuffer *aBuffer, TransferStats &aStats, bool aStatsByPacket, bool aCheckBuffer);
// Timer Callback Handler
extern void HandleSendTimerComplete(System::Layer *aSystemLayer, void *aAppState, System::Error aError);
// Raw Endpoint Callback Handlers
extern void HandleRawMessageReceived(const Inet::IPEndPointBasis *aEndPoint, const System::PacketBuffer *aBuffer, const Inet::IPPacketInfo *aPacketInfo);
extern void HandleRawReceiveError(const Inet::IPEndPointBasis *aEndPoint, const INET_ERROR &aError, const Inet::IPPacketInfo *aPacketInfo);
// UDP Endpoint Callback Handlers
extern void HandleUDPMessageReceived(const Inet::IPEndPointBasis *aEndPoint, const System::PacketBuffer *aBuffer, const Inet::IPPacketInfo *aPacketInfo);
extern void HandleUDPReceiveError(const Inet::IPEndPointBasis *aEndPoint, const INET_ERROR &aError, const Inet::IPPacketInfo *aPacketInfo);
}; // namespace Common
// Period send function to be implemented by individual tests but
// referenced by common code.
extern void DriveSend(void);
#endif // WEAVE_TEST_INETLAYER_COMMON_HPP