/* * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of The Linux Foundation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * =========================================================================== * * INCLUDE FILES FOR MODULE * * =========================================================================== */ #include #include #include #include #include #include /* for proto definitions */ #include "ipa_nat_drv.h" #include "ipa_nat_drvi.h" #undef array_sz #define array_sz(a) \ ( sizeof(a)/sizeof(a[0]) ) #define u32 uint32_t #define u16 uint16_t #define u8 uint8_t #define RAN_ADDR rand_ip_addr() #define RAN_PORT rand_ip_port() static inline u32 rand_ip_addr() { static char buf[64]; snprintf( buf, sizeof(buf), "%u.%u.%u.%u", (rand() % 254) + 1, rand() % 255, rand() % 255, (rand() % 254) + 1); return (u32) inet_addr(buf); } static inline u16 rand_ip_port() { return (u16) ((rand() % 60535) + 5000); } /*============ Preconditions to run NAT Test cases =========*/ #define IPA_NAT_TEST_PRE_COND_TE 20 #define CHECK_ERR(x) \ if ( x ) { \ IPAERR("Abrupt end of %s with " \ "err: %d at line: %d\n", \ __FUNCTION__, x, __LINE__); \ return -1; \ } #define CHECK_ERR_TBL_STOP(x, th) \ if ( th ) { \ int _ter_ = ipa_nat_validate_ipv4_table(th); \ if ( _ter_ ) { \ if ( sep ) { \ ipa_nat_del_ipv4_tbl(th); \ } \ IPAERR("Abrupt end of %s with " \ "err: %d at line: %d\n", \ __FUNCTION__, _ter_, __LINE__); \ return -1; \ } \ } \ if ( x ) { \ if ( th ) { \ ipa_nat_dump_ipv4_table(th); \ if( sep ) { \ ipa_nat_del_ipv4_tbl(th); \ } \ } \ IPAERR("Abrupt end of %s with " \ "err: %d at line: %d\n", \ __FUNCTION__, x, __LINE__); \ return -1; \ } #define CHECK_ERR_TBL_ACTION(x, th, action) \ if ( th ) { \ int _ter_ = ipa_nat_validate_ipv4_table(th); \ if ( _ter_ ) { \ IPAERR("ipa_nat_validate_ipv4_table() failed " \ "in: %s at line: %d\n", \ __FUNCTION__, __LINE__); \ action; \ } \ } \ if ( x ) { \ if ( th ) { \ ipa_nat_dump_ipv4_table(th); \ } \ IPAERR("error: %d in %s at line: %d\n", \ x, __FUNCTION__, __LINE__); \ action; \ } typedef int (*NatTestFunc)( const char*, u32, int, u32, int, void*); typedef struct { const char* func_name; int num_ents_trigger; int test_hold_time_in_secs; NatTestFunc func; } NatTests; #undef NAT_TEST_ENTRY #define NAT_TEST_ENTRY(f, n, ht) \ {#f, (n), (ht), f} #define NAT_DEBUG int ipa_nat_validate_ipv4_table(u32); int ipa_nat_testREG(const char*, u32, int, u32, int, void*); int ipa_nat_test000(const char*, u32, int, u32, int, void*); int ipa_nat_test001(const char*, u32, int, u32, int, void*); int ipa_nat_test002(const char*, u32, int, u32, int, void*); int ipa_nat_test003(const char*, u32, int, u32, int, void*); int ipa_nat_test004(const char*, u32, int, u32, int, void*); int ipa_nat_test005(const char*, u32, int, u32, int, void*); int ipa_nat_test006(const char*, u32, int, u32, int, void*); int ipa_nat_test007(const char*, u32, int, u32, int, void*); int ipa_nat_test008(const char*, u32, int, u32, int, void*); int ipa_nat_test009(const char*, u32, int, u32, int, void*); int ipa_nat_test010(const char*, u32, int, u32, int, void*); int ipa_nat_test011(const char*, u32, int, u32, int, void*); int ipa_nat_test012(const char*, u32, int, u32, int, void*); int ipa_nat_test013(const char*, u32, int, u32, int, void*); int ipa_nat_test014(const char*, u32, int, u32, int, void*); int ipa_nat_test015(const char*, u32, int, u32, int, void*); int ipa_nat_test016(const char*, u32, int, u32, int, void*); int ipa_nat_test017(const char*, u32, int, u32, int, void*); int ipa_nat_test018(const char*, u32, int, u32, int, void*); int ipa_nat_test019(const char*, u32, int, u32, int, void*); int ipa_nat_test020(const char*, u32, int, u32, int, void*); int ipa_nat_test021(const char*, u32, int, u32, int, void*); int ipa_nat_test022(const char*, u32, int, u32, int, void*); int ipa_nat_test023(const char*, u32, int, u32, int, void*); int ipa_nat_test024(const char*, u32, int, u32, int, void*); int ipa_nat_test025(const char*, u32, int, u32, int, void*); int ipa_nat_test999(const char*, u32, int, u32, int, void*);