123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154 |
- /*
- * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdint.h>
- #include <cstring> // for memcpy
- #include "hton.h" // for htonl
- #include "InterfaceAbstraction.h"
- #include "Constants.h"
- #include "Logger.h"
- #include "TestsUtils.h"
- #include "Filtering.h"
- #include "RoutingDriverWrapper.h"
- #include "IPAFilteringTable.h"
- extern "C" {
- #include "ipa_nat_drv.h"
- }
- //IP offsets
- #define IPV4_PROTOCOL_OFFSET (9)
- #define IPV4_IP_CHECKSUM_OFFSET (10)
- #define IPV4_SRC_ADDR_OFFSET (12)
- #define IPV4_DST_ADDR_OFFSET (16)
- //TCP offsets
- #define IPV4_SRC_PORT_OFFSET (20)
- #define IPV4_DST_PORT_OFFSET (20+2)
- #define IPV4_TCP_FLAGS_OFFSET (33)
- #define IPV4_TCP_CHECKSUM_OFFSET (36)
- #define IPA_16BIT_ROUND_UP(val) \
- do { \
- if (val >> 16) { \
- val = (val & 0x0000FFFF);\
- val += 1;\
- } \
- } while(0)
- extern Logger g_Logger;
- class IpaNatBlockTestFixture : public TestBase
- {
- public:
- IpaNatBlockTestFixture() :
- m_sendSize(BUFF_MAX_SIZE),
- m_sendSize2(BUFF_MAX_SIZE),
- m_sendSize3(BUFF_MAX_SIZE),
- m_IpaIPType(IPA_IP_v4),
- m_extHdrType(NONE)
- {
- memset(m_sendBuffer, 0, sizeof(m_sendBuffer)); // First input file / IP packet
- memset(m_sendBuffer2, 0, sizeof(m_sendBuffer2)); // Second input file / IP packet
- memset(m_sendBuffer3, 0, sizeof(m_sendBuffer3)); // Third input file (default) / IP packet
- m_testSuiteName.push_back("Nat");
- }
- static int SetupKernelModule(bool en_status = 0, bool nat_suppress = 0)
- {
- 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[2];
- struct test_ipa_ep_cfg to_ipa_cfg[2];
- struct ipa_test_config_header header = { 0 };
- struct ipa_channel_config *to_ipa_array[2];
- 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 - 2 pipes */
- memset(&to_ipa_cfg[0], 0, sizeof(to_ipa_cfg[0]));
- to_ipa_cfg[0].nat.nat_exc_suppress = nat_suppress;
- 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];
- /* header removal for Ethernet header + 8021Q header */
- memset(&to_ipa_cfg[1], 0, sizeof(to_ipa_cfg[1]));
- to_ipa_cfg[1].nat.nat_exc_suppress = nat_suppress;
- to_ipa_cfg[1].hdr.hdr_len = ETH8021Q_HEADER_LEN;
- to_ipa_cfg[1].hdr.hdr_ofst_metadata_valid = 1;
- to_ipa_cfg[1].hdr.hdr_ofst_metadata =
- ETH8021Q_METADATA_OFFSET;
- prepare_channel_struct(&to_ipa_channels[1],
- header.to_ipa_channels_num++,
- IPA_CLIENT_TEST2_PROD,
- (void *)&to_ipa_cfg[1],
- sizeof(to_ipa_cfg[1]));
- to_ipa_array[1] = &to_ipa_channels[1];
- prepare_header_struct(&header, from_ipa_array, to_ipa_array);
- retval = GenericConfigureScenario(&header);
- return retval;
- }
- bool Setup()
- {
- bool bRetVal = true;
- if (SetupKernelModule() != true)
- return bRetVal;
- m_producer.Open(INTERFACE0_TO_IPA_DATA_PATH, INTERFACE0_FROM_IPA_DATA_PATH);
- m_producer2.Open(INTERFACE4_TO_IPA_DATA_PATH, INTERFACE4_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())
- {
- LOG_MSG_ERROR("Routing block is not ready for immediate commands!\n");
- return false;
- }
- if (!m_filtering.DeviceNodeIsOpened())
- {
- LOG_MSG_ERROR("Filtering block is not ready for immediate commands!\n");
- return false;
- }
- m_routing.Reset(IPA_IP_v4); // This will issue a Reset command to the Filtering as well
- m_routing.Reset(IPA_IP_v6); // This will issue a Reset command to the Filtering as well
- return true;
- } // Setup()
- bool Setup(bool en_status = false, bool nat_suppress = false)
- {
- bool bRetVal = true;
- if (SetupKernelModule(en_status, nat_suppress) != 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())
- {
- LOG_MSG_ERROR("Routing block is not ready for immediate commands!\n");
- return false;
- }
- if (!m_filtering.DeviceNodeIsOpened())
- {
- LOG_MSG_ERROR("Filtering block is not ready for immediate commands!\n");
- return false;
- }
- m_routing.Reset(IPA_IP_v4); // This will issue a Reset command to the Filtering as well
- m_routing.Reset(IPA_IP_v6); // This will issue a Reset command to the Filtering as well
- return true;
- } // Setup()
- bool Teardown()
- {
- ipa_nat_dump_ipv4_table(m_tbl_hdl);
- ipa_nat_del_ipv4_tbl(m_tbl_hdl);
- m_producer.Close();
- m_producer2.Close();
- m_consumer.Close();
- m_consumer2.Close();
- m_defaultConsumer.Close();
- return true;
- } // Teardown()
- virtual 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_extHdrType, m_sendBuffer, m_sendSize)) {
- LOG_MSG_ERROR("Failed default Packet\n");
- return false;
- }
- LOG_MSG_DEBUG("Loaded %zu Bytes to Buffer 1\n", m_sendSize);
- if (!LoadDefaultPacket(ip, m_extHdrType, m_sendBuffer2, m_sendSize2)) {
- LOG_MSG_ERROR("Failed default Packet\n");
- return false;
- }
- LOG_MSG_DEBUG("Loaded %zu Bytes to Buffer 2\n", m_sendSize2);
- if (!LoadDefaultPacket(ip, m_extHdrType, m_sendBuffer3, m_sendSize3)) {
- LOG_MSG_ERROR("Failed default Packet\n");
- return false;
- }
- LOG_MSG_DEBUG("Loaded %zu Bytes to Buffer 3\n", m_sendSize3);
- return true;
- }
- 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)) {
- LOG_MSG_ERROR("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) {
- LOG_MSG_DEBUG("cache hit!! \n");
- return true;
- }
- LOG_MSG_ERROR("cache miss!! \n");
- 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) {
- LOG_MSG_DEBUG("cache hit!! \n");
- return true;
- }
- LOG_MSG_ERROR("cache miss!! \n");
- 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)) {
- LOG_MSG_DEBUG("cache miss!! \n");
- return true;
- }
- LOG_MSG_ERROR("cache hit!! \n");
- 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)) {
- LOG_MSG_DEBUG("cache miss!! \n");
- return true;
- }
- LOG_MSG_ERROR("cache hit!! \n");
- return false;
- }
- bool CompareResultVsGoldenNat(Byte *goldenBuffer, unsigned int goldenSize,
- Byte *receivedBuffer, unsigned int receivedSize, int private_ip, int public_ip,
- int private_port, int public_port, bool src_nat, int IPv4_offset = 0, bool with_status = false)
- {
- bool result;
- uint32_t address;
- uint16_t port;
- uint32_t val;
- uint16_t ip_checksum_diff, tcp_checksum_diff;
- uint32_t ip_checksum, tcp_checksum;
- int recv_offset = 0;
- 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 (with_status)
- recv_offset += stts_size;
- ip_checksum_diff = calc_ip_cksum_diff(public_ip, private_ip);
- tcp_checksum_diff = calc_tcp_udp_cksum_diff(public_ip, public_port, private_ip, private_port);
- //calculate new ip checksum, old checksum + 1's compliment of checksum diff
- ip_checksum = *((uint16_t *)&goldenBuffer[IPV4_IP_CHECKSUM_OFFSET + IPv4_offset]);
- ip_checksum = ntohs(ip_checksum);
- if(src_nat)
- ip_checksum += (uint16_t)(~ip_checksum_diff);
- else
- ip_checksum += (uint16_t)ip_checksum_diff;
- IPA_16BIT_ROUND_UP(ip_checksum);
- //return to network format
- ip_checksum = htons(ip_checksum);
- //calculate new tcp checksum, old checksum + 1's compliment of checksum diff
- tcp_checksum = *((uint16_t *)&goldenBuffer[IPV4_TCP_CHECKSUM_OFFSET + IPv4_offset]);
- tcp_checksum = ntohs(tcp_checksum);
- if(src_nat)
- tcp_checksum += (uint16_t)(~tcp_checksum_diff);
- else
- tcp_checksum += (uint16_t)tcp_checksum_diff;
- IPA_16BIT_ROUND_UP(tcp_checksum);
- //return to network format
- tcp_checksum = htons(tcp_checksum);
- if ((receivedSize - recv_offset) != goldenSize) {
- g_Logger.AddMessage(LOG_VERBOSE, "%s Buffers sizes are different.\n", __FUNCTION__);
- return false;
- }
- Byte *tmp_buff = new Byte[goldenSize];
- memcpy(tmp_buff, goldenBuffer, goldenSize);
- if (src_nat) {
- address = htonl(public_ip);
- port = htons(public_port);
- memcpy(&tmp_buff[IPV4_SRC_ADDR_OFFSET + IPv4_offset], &address, sizeof(address));
- memcpy(&tmp_buff[IPV4_SRC_PORT_OFFSET + IPv4_offset], &port, sizeof(port));
- val = (*(uint32_t*)(&receivedBuffer[IPV4_SRC_ADDR_OFFSET + IPv4_offset + recv_offset]));
- if (address != val)
- LOG_MSG_ERROR("received src ip 0x%X != 0x%X\n", val, address);
- val = (*(uint16_t*)(&receivedBuffer[IPV4_SRC_PORT_OFFSET + IPv4_offset + recv_offset]));
- if (port != val)
- LOG_MSG_ERROR("received src port %d != %d\n", val, port);
- }
- else {
- address = htonl(private_ip);
- port = htons(private_port);
- memcpy(&tmp_buff[IPV4_DST_ADDR_OFFSET + IPv4_offset], &address, sizeof(address));
- memcpy(&tmp_buff[IPV4_DST_PORT_OFFSET + IPv4_offset], &port, sizeof(port));
- val = (*(uint32_t*)(&receivedBuffer[IPV4_DST_ADDR_OFFSET + IPv4_offset + +recv_offset]));
- if (address != val)
- LOG_MSG_ERROR("received dst ip 0x%X != 0x%X\n", val, address);
- val = (*(uint16_t*)(&receivedBuffer[IPV4_DST_PORT_OFFSET + IPv4_offset + recv_offset]));
- if (port != val)
- LOG_MSG_ERROR("received dst port %d != %d\n", val, port);
- }
- memcpy(&tmp_buff[IPV4_IP_CHECKSUM_OFFSET + IPv4_offset], &ip_checksum, sizeof(uint16_t));
- val = (*(uint16_t*)(&receivedBuffer[IPV4_IP_CHECKSUM_OFFSET + IPv4_offset + recv_offset]));
- if (ip_checksum != val)
- LOG_MSG_ERROR("received checksum %d != %d\n", val, ip_checksum);
- memcpy(&tmp_buff[IPV4_TCP_CHECKSUM_OFFSET + IPv4_offset], &tcp_checksum, sizeof(uint16_t));
- val = (*(uint16_t*)(&receivedBuffer[IPV4_TCP_CHECKSUM_OFFSET + IPv4_offset + recv_offset]));
- if (tcp_checksum != val)
- LOG_MSG_ERROR("received checksum %d != %d\n", val, tcp_checksum);
- size_t j;
- char tmpBuffer[512] = { 0 };
- for (j = 0; j < receivedSize; j++)
- snprintf(&tmpBuffer[3 * j], sizeof(tmpBuffer) - (3 * j + 1), " %02X", tmp_buff[j]);
- LOG_MSG_STACK("expected packet should be (%zu)\n%s\n", receivedSize, tmpBuffer);
- result = !memcmp((void*)tmp_buff, (void*)(receivedBuffer + recv_offset), goldenSize);
- if (!result)
- LOG_MSG_ERROR("buffers comparison failed!!\n");
- delete[] tmp_buff;
- return result;
- }
- bool CreateMetdataRoutingRule(const char * bypass0)
- {
- LOG_MSG_DEBUG("Entering\n");
- struct ipa_ioc_add_rt_rule *rt_rule0 = NULL;
- struct ipa_rt_rule_add *rt_rule_entry;
- rt_rule0 = (struct ipa_ioc_add_rt_rule *)
- calloc(1,
- sizeof(struct ipa_ioc_add_rt_rule) +
- 1 * sizeof(struct ipa_rt_rule_add)
- );
- if (!rt_rule0) {
- LOG_MSG_ERROR("calloc failed to allocate rt_rule0\n");
- return false;
- }
- rt_rule0->num_rules = 1;
- rt_rule0->ip = IPA_IP_v4;
- rt_rule0->commit = true;
- strlcpy(rt_rule0->rt_tbl_name, bypass0, sizeof(rt_rule0->rt_tbl_name));
- rt_rule_entry = &rt_rule0->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_META_DATA;
- rt_rule_entry->rule.attrib.meta_data = m_metadata;
- rt_rule_entry->rule.attrib.meta_data_mask = 0xFFFFFFFF;// Filter exact metadata value
- if (false == m_routing.AddRoutingRule(rt_rule0))
- {
- LOG_MSG_ERROR("Routing rule addition(rt_rule0) failed!\n");
- Free(rt_rule0);
- return false;
- }
- Free(rt_rule0);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }
- bool CreateHashableRoutingRules(const char * bypass0)
- {
- LOG_MSG_DEBUG("Entering\n");
- struct ipa_ioc_add_rt_rule *rt_rule0 = 0, *rt_rule1 = 0;
- struct ipa_rt_rule_add *rt_rule_entry;
- rt_rule0 = (struct ipa_ioc_add_rt_rule *)
- calloc(1,
- sizeof(struct ipa_ioc_add_rt_rule) +
- 2 * sizeof(struct ipa_rt_rule_add)
- );
- if (!rt_rule0) {
- LOG_MSG_ERROR("calloc failed to allocate rt_rule0\n");
- return false;
- }
- rt_rule0->num_rules = 2;
- rt_rule0->ip = IPA_IP_v4;
- rt_rule0->commit = true;
- strlcpy(rt_rule0->rt_tbl_name, bypass0, sizeof(rt_rule0->rt_tbl_name));
- rt_rule_entry = &rt_rule0->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_DST_ADDR;
- rt_rule_entry->rule.attrib.u.v4.dst_addr = m_private_ip;
- rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;// Exact match
- rt_rule_entry->rule.hashable = 1;
- rt_rule_entry = &rt_rule0->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 = m_private_ip2;
- rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;// Exact match
- rt_rule_entry->rule.hashable = 1;
- if (false == m_routing.AddRoutingRule(rt_rule0))
- {
- LOG_MSG_ERROR("Routing rule addition(rt_rule0) failed!\n");
- Free(rt_rule1);
- Free(rt_rule0);
- return false;
- }
- Free(rt_rule0);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }
- // This function creates three IPv4 bypass routing entries and commits them.
- bool CreateThreeIPv4BypassRoutingTables(const char * bypass0, const char * bypass1, const char * bypass2)
- {
- LOG_MSG_DEBUG("Entering\n");
- struct ipa_ioc_add_rt_rule *rt_rule0 = 0, *rt_rule1 = 0, *rt_rule2 = 0;
- struct ipa_rt_rule_add *rt_rule_entry;
- rt_rule0 = (struct ipa_ioc_add_rt_rule *)
- calloc(1,
- sizeof(struct ipa_ioc_add_rt_rule) +
- 1 * sizeof(struct ipa_rt_rule_add)
- );
- if (!rt_rule0) {
- LOG_MSG_ERROR("calloc failed to allocate rt_rule0\n");
- return false;
- }
- rt_rule1 = (struct ipa_ioc_add_rt_rule *)
- calloc(1,
- sizeof(struct ipa_ioc_add_rt_rule) +
- 1 * sizeof(struct ipa_rt_rule_add)
- );
- if (!rt_rule1) {
- LOG_MSG_ERROR("calloc failed to allocate rt_rule1\n");
- Free(rt_rule0);
- return false;
- }
- rt_rule2 = (struct ipa_ioc_add_rt_rule *)
- calloc(1,
- sizeof(struct ipa_ioc_add_rt_rule) +
- 1 * sizeof(struct ipa_rt_rule_add)
- );
- if (!rt_rule2) {
- LOG_MSG_ERROR("calloc failed to allocate rt_rule2\n");
- Free(rt_rule0);
- Free(rt_rule1);
- return false;
- }
- rt_rule0->num_rules = 1;
- rt_rule0->ip = IPA_IP_v4;
- rt_rule0->commit = true;
- strlcpy(rt_rule0->rt_tbl_name, bypass0, sizeof(rt_rule0->rt_tbl_name));
- rt_rule_entry = &rt_rule0->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_DST_ADDR;
- rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xaabbccdd;
- rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0x00000000;// All Packets will get a "Hit"
- if (false == m_routing.AddRoutingRule(rt_rule0))
- {
- LOG_MSG_ERROR("Routing rule addition(rt_rule0) failed!\n");
- Free(rt_rule2);
- Free(rt_rule1);
- Free(rt_rule0);
- return false;
- }
- rt_rule1->num_rules = 1;
- rt_rule1->ip = IPA_IP_v4;
- rt_rule1->commit = true;
- strlcpy(rt_rule1->rt_tbl_name, bypass1, sizeof(rt_rule1->rt_tbl_name));
- rt_rule_entry = &rt_rule1->rules[0];
- rt_rule_entry->at_rear = 0;
- 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 = 0xaabbccdd;
- rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0x00000000;// All Packets will get a "Hit"
- if (false == m_routing.AddRoutingRule(rt_rule1))
- {
- LOG_MSG_ERROR("Routing rule addition(rt_rule1) failed!\n");
- Free(rt_rule2);
- Free(rt_rule1);
- Free(rt_rule0);
- return false;
- }
- rt_rule2->num_rules = 1;
- rt_rule2->ip = IPA_IP_v4;
- rt_rule2->commit = true;
- strlcpy(rt_rule2->rt_tbl_name, bypass2, sizeof(rt_rule2->rt_tbl_name));
- rt_rule_entry = &rt_rule2->rules[0];
- rt_rule_entry->at_rear = 0;
- rt_rule_entry->rule.dst = IPA_CLIENT_TEST4_CONS;
- rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xaabbccdd;
- rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0x00000000;// All Packets will get a "Hit"
- if (false == m_routing.AddRoutingRule(rt_rule2))
- {
- LOG_MSG_ERROR("Routing rule addition(rt_rule2) failed!\n");
- Free(rt_rule2);
- Free(rt_rule1);
- Free(rt_rule0);
- return false;
- }
- Free(rt_rule2);
- Free(rt_rule1);
- Free(rt_rule0);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }
- void Load8021QPacket()
- {
- m_sendSize = sizeof(m_sendBuffer);
- LoadDefault802_1Q(IPA_IP_v4, m_sendBuffer, m_sendSize);
- }
- virtual bool ModifyPackets() = 0;
- virtual bool AddRules() = 0;
- virtual bool SendPackets() = 0;
- virtual bool ReceivePacketsAndCompare() = 0;
- bool Run()
- {
- bool res = false;
- bool isSuccess = false;
- LOG_MSG_DEBUG("Entering\n");
- // Add the relevant filtering rules
- res = AddRules();
- if (false == res) {
- LOG_MSG_ERROR("Failed adding filtering rules.\n");
- return false;
- }
- // Load input data (IP packet) from file
- res = LoadFiles(m_IpaIPType);
- if (false == res) {
- LOG_MSG_ERROR("Failed loading files.\n");
- return false;
- }
- res = ModifyPackets();
- if (false == res) {
- LOG_MSG_ERROR("Failed to modify packets.\n");
- return false;
- }
- res = SendPackets();
- if (res == false) {
- LOG_MSG_ERROR("failed to send packets\n");
- return false;
- }
- // Receive packets from the channels and compare results
- isSuccess = ReceivePacketsAndCompare();
- LOG_MSG_DEBUG("Returning %d\n", isSuccess);
- return isSuccess;
- } // Run()
- /**
- * calc_ip_cksum_diff() - Calculate the source nat
- * IP checksum diff
- * @pub_ip_addr: [in] public ip address
- * @priv_ip_addr: [in] Private ip address
- *
- * source nat ip checksum different is calculated as
- * public_ip_addr - private_ip_addr
- * Here we are using 1's complement to represent -negative number.
- * So take 1's complement of private ip addr and add it
- * to public ip addr.
- *
- * Returns: >0 ip checksum diff
- */
- uint16_t calc_ip_cksum_diff(uint32_t pub_ip_addr,
- uint32_t priv_ip_addr)
- {
- uint16_t ret;
- uint32_t cksum = 0;
- /* Add LSB(2 bytes) of public ip address to cksum */
- cksum += (pub_ip_addr & 0xFFFF);
- /* Add MSB(2 bytes) of public ip address to cksum
- and check for carry forward(CF), if any add it
- */
- cksum += (pub_ip_addr >> 16);
- IPA_16BIT_ROUND_UP(cksum);
- /* Calculate the 1's complement of private ip address */
- priv_ip_addr = (~priv_ip_addr);
- /* Add LSB(2 bytes) of private ip address to cksum
- and check for carry forward(CF), if any add it
- */
- cksum += (priv_ip_addr & 0xFFFF);
- IPA_16BIT_ROUND_UP(cksum);
- /* Add MSB(2 bytes) of private ip address to cksum
- and check for carry forward(CF), if any add it
- */
- cksum += (priv_ip_addr >> 16);
- IPA_16BIT_ROUND_UP(cksum);
- /* Return the LSB(2 bytes) of checksum */
- ret = (uint16_t)cksum;
- return ret;
- }
- /**
- * calc_tcp_udp_cksum() - Calculate the source nat
- * TCP/UDP checksum diff
- * @pub_ip_addr: [in] public ip address
- * @pub_port: [in] public tcp/udp port
- * @priv_ip_addr: [in] Private ip address
- * @priv_port: [in] Private tcp/udp prot
- *
- * source nat tcp/udp checksum is calculated as
- * (pub_ip_addr + pub_port) - (priv_ip_addr + priv_port)
- * Here we are using 1's complement to represent -ve number.
- * So take 1's complement of prviate ip addr &private port
- * and add it public ip addr & public port.
- *
- * Returns: >0 tcp/udp checksum diff
- */
- uint16_t calc_tcp_udp_cksum_diff(uint32_t pub_ip_addr,
- uint16_t pub_port,
- uint32_t priv_ip_addr,
- uint16_t priv_port)
- {
- uint16_t ret = 0;
- uint32_t cksum = 0;
- /* Add LSB(2 bytes) of public ip address to cksum */
- cksum += (pub_ip_addr & 0xFFFF);
- /* Add MSB(2 bytes) of public ip address to cksum
- and check for carry forward(CF), if any add it
- */
- cksum += (pub_ip_addr >> 16);
- IPA_16BIT_ROUND_UP(cksum);
- /* Add public port to cksum and
- check for carry forward(CF), if any add it */
- cksum += pub_port;
- IPA_16BIT_ROUND_UP(cksum);
- /* Calculate the 1's complement of private ip address */
- priv_ip_addr = (~priv_ip_addr);
- /* Add LSB(2 bytes) of private ip address to cksum
- and check for carry forward(CF), if any add it
- */
- cksum += (priv_ip_addr & 0xFFFF);
- IPA_16BIT_ROUND_UP(cksum);
- /* Add MSB(2 bytes) of private ip address to cksum
- and check for carry forward(CF), if any add
- */
- cksum += (priv_ip_addr >> 16);
- IPA_16BIT_ROUND_UP(cksum);
- /* Calculate the 1's complement of private port */
- priv_port = (~priv_port);
- /* Add public port to cksum and
- check for carry forward(CF), if any add it */
- cksum += priv_port;
- IPA_16BIT_ROUND_UP(cksum);
- /* return the LSB(2 bytes) of checksum */
- ret = (uint16_t)cksum;
- return ret;
- }
- ~IpaNatBlockTestFixture()
- {
- m_sendSize = 0;
- m_sendSize2 = 0;
- m_sendSize3 = 0;
- }
- static Filtering m_filtering;
- static RoutingDriverWrapper m_routing;
- InterfaceAbstraction m_producer;
- InterfaceAbstraction m_producer2;
- InterfaceAbstraction m_consumer;
- InterfaceAbstraction m_consumer2;
- InterfaceAbstraction m_defaultConsumer;
- static const size_t BUFF_MAX_SIZE = 1024;
- 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;
- enum ipv6_ext_hdr_type m_extHdrType;
- uint32_t m_tbl_hdl;
- uint32_t m_nat_rule_hdl1;
- uint32_t m_public_ip;
- uint32_t m_public_ip2;
- uint32_t m_private_ip;
- uint32_t m_private_ip2;
- uint32_t m_target_ip;
- uint16_t m_public_port;
- uint16_t m_public_port2;
- uint16_t m_private_port;
- uint16_t m_private_port2;
- uint16_t m_target_port;
- uint32_t m_metadata;
- private:
- };
- RoutingDriverWrapper IpaNatBlockTestFixture::m_routing;
- Filtering IpaNatBlockTestFixture::m_filtering;
- /*---------------------------------------------------------------------------*/
- /* Test001: Single PDN src NAT test */
- /* NOTE: other classes are derived from this class - change carefully */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest001 : public IpaNatBlockTestFixture
- {
- public:
- IpaNatBlockTest001()
- {
- m_name = "IpaNatBlockTest001";
- m_description =
- "NAT block test 001 - single PDN src NAT test\
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to src NAT \
- All DST_IP == (193.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- 3. generate and commit one NAT rule:\
- private ip 194.23.22.1 --> public ip 192.23.22.1";
- m_private_ip = 0xC2171601; /* 194.23.22.1 */
- m_private_port = 5678;
- m_public_ip = 0xC0171601; /* "192.23.22.1" */
- m_public_port = 9050;
- m_target_ip = 0xC1171601; /* 193.23.22.1 */
- m_target_port = 1234;
- Register(*this);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- const char bypass1[20] = "Bypass1";
- const char bypass2[20] = "Bypass2";
- struct ipa_ioc_get_rt_tbl routing_table0;
- if (!CreateThreeIPv4BypassRoutingTables(bypass0, bypass1, bypass2))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateThreeBypassRoutingTables completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST_PROD, false, 1);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing Rule 1
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00FFFFFF; // Mask
- flt_rule_entry.rule.attrib.u.v4.dst_addr = m_target_ip; // Filter DST_IP == 193.23.22.1
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 0;
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- ret = ipa_nat_add_ipv4_tbl(m_public_ip, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_DEBUG("failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- m_public_ip);
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- LOG_MSG_DEBUG("Leaving");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- address = htonl(m_target_ip);//193.23.22.1
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_private_ip);/* 194.23.22.1 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_private_port);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET],&flags , sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully one packet\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip,
- m_private_port, m_public_port,
- true))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test002: Single PDN dst NAT test */
- /* NOTE: other classes are derived from this class - change carefully */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest002 : public IpaNatBlockTestFixture
- {
- public:
- IpaNatBlockTest002()
- {
- m_name = "IpaNatBlockTest002";
- m_description =
- "NAT block test 002 - single PDN dst NAT test\
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to dst NAT \
- All DST_IP == (192.23.22.1 & 0.255.255.255)traffic goes to NAT block (public IP filtering) \
- 3. generate and commit one NAT rule:\
- public ip 192.23.22.1 --> private ip 194.23.22.1 ";
- m_private_ip = 0xC2171601; /* 194.23.22.1 */
- m_private_port = 5678;
- m_public_ip = 0xC0171601; /* "192.23.22.1" */
- m_public_port = 9050;
- m_target_ip = 0xC1171601; /* 193.23.22.1 */
- m_target_port = 1234;
- Register(*this);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- const char bypass1[20] = "Bypass1";
- const char bypass2[20] = "Bypass2";
- struct ipa_ioc_get_rt_tbl routing_table0;
- if (!CreateThreeIPv4BypassRoutingTables(bypass0, bypass1, bypass2))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateThreeBypassRoutingTables completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST_PROD, false, 3);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing Rule 1
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00FFFFFF; // Mask
- flt_rule_entry.rule.attrib.u.v4.dst_addr = m_public_ip; // Filter DST_IP == 192.23.22.1
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 0;
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- uint32_t pub_ip_add = m_public_ip;
- ret = ipa_nat_add_ipv4_tbl(pub_ip_add, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- pub_ip_add);
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- address = htonl(m_public_ip);//192.23.22.1
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_public_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_target_ip);/* 193.23.22.1 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully one packet\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip,
- m_private_port, m_public_port,
- false))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test003: Multi PDN src NAT test */
- /* NOTE: other classes are derived from this class - change carefully */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest003 : public IpaNatBlockTestFixture
- {
- public:
- IpaNatBlockTest003()
- {
- m_name = "IpaNatBlockTest003";
- m_description =
- "NAT block test 003 - Multi PDN src NAT test\
- 1. Generate and commit three routing tables (two are used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit two filtering rule: (DST & Mask Match). \
- - action go to src NAT \
- All SRC_IP == (194.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- All SRC_IP == (197.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- 3. generate and commit two NAT rules:\
- private ip 194.23.22.1 --> public ip 192.23.22.1 \
- private ip 197.23.22.1 --> public ip 195.23.22.1";
- m_private_ip = 0xC2171601; /* 194.23.22.1 */
- m_private_port = 5678;
- m_private_ip2 = 0xC5171601; /* 197.23.22.1 */
- m_private_port2 = 5679;
- m_public_ip = 0xC0171601; /* "192.23.22.1" */
- m_public_port = 9050;
- m_public_ip2 = 0xC3171601; /* "195.23.22.1" */
- m_public_port2 = 9051;
- m_target_ip = 0xC1171601; /* 193.23.22.1 */
- m_target_port = 1234;
- m_minIPAHwType = IPA_HW_v4_0;
- Register(*this);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- const char bypass1[20] = "Bypass1";
- const char bypass2[20] = "Bypass2";
- struct ipa_ioc_get_rt_tbl routing_table0, routing_table1;
- if (!CreateThreeIPv4BypassRoutingTables(bypass0, bypass1, bypass2))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateThreeBypassRoutingTables completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- routing_table1.ip = IPA_IP_v4;
- strlcpy(routing_table1.name, bypass1, sizeof(routing_table1.name));
- if (!m_routing.GetRoutingTable(&routing_table1))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table1=0x%p) Failed.\n", &routing_table1);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass1, routing_table1.hdl);
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST_PROD, false, 2);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing Rule 1
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR;
- flt_rule_entry.rule.attrib.u.v4.src_addr_mask = 0xFFFFFFFF; // Mask
- flt_rule_entry.rule.attrib.u.v4.src_addr = m_private_ip; // Filter SRC_IP == 194.23.22.1
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 0;
- if ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry))
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- // Configuring Filtering Rule No.1
- flt_rule_entry.rule.rt_tbl_hdl = routing_table1.hdl; //put here the handle corresponding to Routing Rule 2
- flt_rule_entry.rule.attrib.u.v4.src_addr = m_private_ip2; // Filter SRC_IP == 197.23.22.1
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- LOG_MSG_DEBUG("flt rule hdl1=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(1)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(1)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- uint32_t pub_ip_add = m_public_ip;
- ipa_nat_pdn_entry pdn_info;
- // first create the NAT table
- ret = ipa_nat_add_ipv4_tbl(pub_ip_add, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- pub_ip_add);
- // modify the PDN entries that will be pointed by the NAT rules
- pdn_info.public_ip = m_public_ip;
- pdn_info.src_metadata = 0;
- pdn_info.dst_metadata = 0;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 0, &pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed Modifying PDN entry 0 \n");
- return false;
- }
- pdn_info.public_ip = m_public_ip2;
- pdn_info.src_metadata = 0;
- pdn_info.dst_metadata = 0;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 1, &pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed Modifying PDN entry 1 \n");
- return false;
- }
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- ipv4_rule.private_ip = m_private_ip2;
- ipv4_rule.private_port = m_private_port2;
- ipv4_rule.public_port = m_public_port2;
- ipv4_rule.pdn_index = 1;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 1\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule 2 added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- //first packet private ip 194.23.22.1 --> public ip 192.23.22.1
- address = htonl(m_target_ip);//193.23.22.1
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_private_ip);/* 194.23.22.1 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_private_port);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- // second packet private ip 197.23.22.1 --> public ip 195.23.22.1
- address = htonl(m_target_ip);//193.23.22.1
- memcpy(&m_sendBuffer2[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer2[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_private_ip2);/* 197.23.22.1 */
- memcpy(&m_sendBuffer2[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_private_port2);
- memcpy(&m_sendBuffer2[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer2[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- LOG_MSG_DEBUG("sending first packet\n");
- isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- // Send second packet
- LOG_MSG_DEBUG("sending second packet\n");
- isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully two packets\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- size_t receivedSize2 = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- Byte *rxBuff2 = new Byte[0x400];
- if (rxBuff1 == NULL)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- if (rxBuff2)
- delete[] rxBuff2;
- return false;
- }
- if (rxBuff2 == NULL)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- delete[] rxBuff1;
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- receivedSize2 = m_consumer2.ReceiveData(rxBuff2, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize2, m_consumer2.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip,
- m_private_port, m_public_port,
- true))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- char recievedBuffer2[256] = { 0 };
- char SentBuffer2[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- isSuccess &= CompareResultVsGoldenNat(
- m_sendBuffer2, m_sendSize2,
- rxBuff2, receivedSize2,
- m_private_ip2, m_public_ip2,
- m_private_port2, m_public_port2,
- true);
- for (j = 0; j < m_sendSize2; j++)
- snprintf(&SentBuffer2[3 * j], sizeof(SentBuffer2) - (3 * j + 1), " %02X", m_sendBuffer2[j]);
- for (j = 0; j < receivedSize2; j++)
- snprintf(&recievedBuffer2[3 * j], sizeof(recievedBuffer2) - (3 * j + 1), " %02X", rxBuff2[j]);
- LOG_MSG_STACK("sent Value2 (%zu)\n%s\n, Received Value2(%zu)\n%s\n", m_sendSize2, SentBuffer2, receivedSize2, recievedBuffer2);
- delete[] rxBuff2;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test004: Multi PDN dst NAT test */
- /* NOTE: other classes are derived from this class - change carefully */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest004 : public IpaNatBlockTestFixture
- {
- public:
- IpaNatBlockTest004()
- {
- m_name = "IpaNatBlockTest004";
- m_description =
- "NAT block test 004 - Multi PDN dst NAT test\
- 1. Generate and commit three routing tables (two are used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit two filtering rule: (DST & Mask Match). \
- - action go to dst NAT \
- All DST_IP == (192.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- All DST_IP == (195.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- 3. generate and commit two NAT rules:\
- private ip 194.23.22.1 --> public ip 192.23.22.1 \
- private ip 197.23.22.1 --> public ip 195.23.22.1";
- m_private_ip = 0xC2171601; /* 194.23.22.1 */
- m_private_port = 5678;
- m_private_ip2 = 0xC5171601; /* 197.23.22.1 */
- m_private_port2 = 5679;
- m_public_ip = 0xC0171601; /* "192.23.22.1" */
- m_public_port = 9050;
- m_public_ip2 = 0xC3171601; /* "195.23.22.1" */
- m_public_port2 = 9051;
- m_target_ip = 0xC1171601; /* 193.23.22.1 */
- m_target_port = 1234;
- m_minIPAHwType = IPA_HW_v4_0;
- Register(*this);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- const char bypass1[20] = "Bypass1";
- const char bypass2[20] = "Bypass2";
- struct ipa_ioc_get_rt_tbl routing_table0, routing_table1;
- if (!CreateThreeIPv4BypassRoutingTables(bypass0, bypass1, bypass2))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateThreeBypassRoutingTables completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- routing_table1.ip = IPA_IP_v4;
- strlcpy(routing_table1.name, bypass1, sizeof(routing_table1.name));
- if (!m_routing.GetRoutingTable(&routing_table1))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table1=0x%p) Failed.\n", &routing_table1);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass1, routing_table1.hdl);
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST_PROD, false, 2);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing Rule 1
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; // Mask
- flt_rule_entry.rule.attrib.u.v4.dst_addr = m_public_ip; // Filter DST_IP == 192.23.22.1
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 0;
- if ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry))
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- // Configuring Filtering Rule No.1
- flt_rule_entry.rule.rt_tbl_hdl = routing_table1.hdl; //put here the handle corresponding to Routing Rule 2
- flt_rule_entry.rule.attrib.u.v4.dst_addr = m_public_ip2; // Filter DST_IP == 195.23.22.1
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- LOG_MSG_DEBUG("flt rule hdl1=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(1)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(1)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- uint32_t pub_ip_add = m_public_ip;
- ipa_nat_pdn_entry pdn_info;
- // first create the NAT table
- ret = ipa_nat_add_ipv4_tbl(pub_ip_add, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- pub_ip_add);
- // modify the PDN entries that will be pointed by the NAT rules
- pdn_info.public_ip = m_public_ip;
- pdn_info.src_metadata = 0;
- pdn_info.dst_metadata = 0;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 0,&pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed Modifying PDN entry 0 \n");
- return false;
- }
- pdn_info.public_ip = m_public_ip2;
- pdn_info.src_metadata = 0;
- pdn_info.dst_metadata = 0;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 1, &pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed Modifying PDN entry 1 \n");
- return false;
- }
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- ipv4_rule.private_ip = m_private_ip2;
- ipv4_rule.private_port = m_private_port2;
- ipv4_rule.public_port = m_public_port2;
- ipv4_rule.pdn_index = 1;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule 2 added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- //first packet private ip public ip 192.23.22.1 --> 194.23.22.1
- address = htonl(m_public_ip);//192.23.22.1
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_public_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_target_ip);/* 194.23.22.1 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- // second packet public ip 195.23.22.1--> private ip 197.23.22.1
- address = htonl(m_public_ip2);//193.23.22.1
- memcpy(&m_sendBuffer2[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_public_port2);
- memcpy(&m_sendBuffer2[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_target_ip);/* 197.23.22.1 */
- memcpy(&m_sendBuffer2[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer2[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer2[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- // Send second packet
- isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully two packets\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- size_t receivedSize2 = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- Byte *rxBuff2 = new Byte[0x400];
- if (rxBuff1 == NULL)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- if (rxBuff2)
- delete[] rxBuff2;
- return false;
- }
- if (rxBuff2 == NULL)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- delete[] rxBuff1;
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- receivedSize2 = m_consumer2.ReceiveData(rxBuff2, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize2, m_consumer2.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip,
- m_private_port, m_public_port,
- false))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- char recievedBuffer2[256] = { 0 };
- char SentBuffer2[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- isSuccess &= CompareResultVsGoldenNat(
- m_sendBuffer2, m_sendSize2,
- rxBuff2, receivedSize2,
- m_private_ip2, m_public_ip2,
- m_private_port2, m_public_port2,
- false);
- for (j = 0; j < m_sendSize2; j++)
- snprintf(&SentBuffer2[3 * j], sizeof(SentBuffer2) - (3 * j + 1), " %02X", m_sendBuffer2[j]);
- for (j = 0; j < receivedSize2; j++)
- snprintf(&recievedBuffer2[3 * j], sizeof(recievedBuffer2) - (3 * j + 1), " %02X", rxBuff2[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize2, SentBuffer2, receivedSize2, recievedBuffer2);
- delete[] rxBuff2;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test005: Single PDN src metadata replacement NAT test */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest005 : public IpaNatBlockTestFixture
- {
- public:
- IpaNatBlockTest005()
- {
- m_name = "IpaNatBlockTest005";
- m_description =
- "NAT block test 005 - single PDN src metadata replacement NAT test\
- source metadata will be replaced and the routing rule equation will be done upon replaced value\
- 1. Generate and commit two routing tables (only one is used). \
- the routing table will catch packets with metadata value 0x34567890 (different from original value)\
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to src NAT \
- All DST_IP == (193.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- action parameters metadata replacement = true\
- 3. generate and commit one NAT rule:\
- private ip 194.23.22.1 --> public ip 192.23.22.1\
- source metadata value shall be replaced to 0x34567890 (caught by the routing rule)";
- m_private_ip = 0xC2171601; /* 194.23.22.1 */
- m_private_port = 5678;
- m_public_ip = 0xC0171601; /* "192.23.22.1" */
- m_public_port = 9050;
- m_target_ip = 0xC1171601; /* 193.23.22.1 */
- m_target_port = 1234;
- m_metadata = 0x34567890;
- m_minIPAHwType = IPA_HW_v4_0;
- Register(*this);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- struct ipa_ioc_get_rt_tbl routing_table0;
- if (!CreateMetdataRoutingRule(bypass0))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateMetdataRoutingRule completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST2_PROD, false, 1);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing Rule 1
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; // Mask
- flt_rule_entry.rule.attrib.u.v4.dst_addr = m_target_ip; // Filter DST_IP == 193.23.22.1
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 1;
- flt_rule_entry.rule.retain_hdr = 1;
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- ipa_nat_pdn_entry pdn_info;
- ret = ipa_nat_add_ipv4_tbl(m_public_ip, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- m_public_ip);
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- // modify the PDN entries that will be pointed by the NAT rules
- pdn_info.public_ip = m_public_ip;
- pdn_info.src_metadata = m_metadata;
- pdn_info.dst_metadata = 0;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 0, &pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed modifying PDN index 0\n");
- return false;
- }
- LOG_MSG_DEBUG("PDN 0 was modified to hold ip 0x%X, src_metadata 0x%X\n", m_public_ip, m_metadata);
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- Load8021QPacket();
- address = htonl(m_target_ip);//193.23.22.1
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET + ETH8021Q_HEADER_LEN], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET + ETH8021Q_HEADER_LEN], &port, sizeof(port));
- address = htonl(m_private_ip);/* 194.23.22.1 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET + ETH8021Q_HEADER_LEN], &address, sizeof(address));
- port = htons(m_private_port);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET + ETH8021Q_HEADER_LEN], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET + ETH8021Q_HEADER_LEN], &flags, sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- isSuccess = m_producer2.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully one packet\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip,
- m_private_port, m_public_port,
- true, ETH8021Q_HEADER_LEN))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test006: Single PDN dst metadata replacement NAT test */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest006 : public IpaNatBlockTestFixture
- {
- public:
- IpaNatBlockTest006()
- {
- m_name = "IpaNatBlockTest006";
- m_description =
- "NAT block test 006 - single PDN dst metadata replacement NAT test\
- destination metadata will be replaced and the routing rule equation will be done upon replaced value\
- 1. Generate and commit two routing tables (only one is used). \
- the routing table will catch packets with metadata value 0x34567890 (different from original value)\
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to dst NAT \
- All DST_IP == (192.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- action parameters metadata replacement = true\
- 3. generate and commit one NAT rule:\
- public ip 192.23.22.1 --> private ip 194.23.22.1 \
- destination metadata value shall be replaced to 0x34567890 (caught by the routing rule)";
- m_private_ip = 0xC2171601; /* 194.23.22.1 */
- m_private_port = 5678;
- m_public_ip = 0xC0171601; /* "192.23.22.1" */
- m_public_port = 9050;
- m_target_ip = 0xC1171601; /* 193.23.22.1 */
- m_target_port = 1234;
- m_metadata = 0x34567890;
- m_minIPAHwType = IPA_HW_v4_0;
- Register(*this);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- struct ipa_ioc_get_rt_tbl routing_table0;
- if (!CreateMetdataRoutingRule(bypass0))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateMetdataRoutingRule completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST2_PROD, false, 1);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing Rule 1
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; // Mask
- flt_rule_entry.rule.attrib.u.v4.dst_addr = m_public_ip; // Filter DST_IP == 193.23.22.1
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 1;
- flt_rule_entry.rule.retain_hdr = 1;
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- ipa_nat_pdn_entry pdn_info;
- ret = ipa_nat_add_ipv4_tbl(m_public_ip, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- m_public_ip);
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- // modify the PDN entries that will be pointed by the NAT rules
- pdn_info.public_ip = m_public_ip;
- pdn_info.src_metadata = 0;
- pdn_info.dst_metadata = m_metadata;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 0, &pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed modifying PDN index 0\n");
- return false;
- }
- LOG_MSG_DEBUG("PDN 0 was modified to hold ip 0x%X, dst_metadata 0x%X\n", m_public_ip, m_metadata);
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_ERROR("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- Load8021QPacket();
- address = htonl(m_public_ip);//193.23.22.1
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET + ETH8021Q_HEADER_LEN], &address, sizeof(address));
- port = htons(m_public_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET + ETH8021Q_HEADER_LEN], &port, sizeof(port));
- address = htonl(m_target_ip);/* 194.23.22.1 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET + ETH8021Q_HEADER_LEN], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET + ETH8021Q_HEADER_LEN], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET + ETH8021Q_HEADER_LEN], &flags, sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- isSuccess = m_producer2.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully one packet\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip,
- m_private_port, m_public_port,
- false, ETH8021Q_HEADER_LEN))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test007: Hashable routing rule with dst NAT test */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest007 : public IpaNatBlockTestFixture
- {
- public:
- IpaNatBlockTest007()
- {
- m_name = "IpaNatBlockTest007";
- m_description =
- "NAT block test 007 - single PDN dst NAT with hashable routing rule test\
- test if routing block hash mechanism tests NATed values or pre NAT values\
- 1. Generate and commit routing table with two hashable rules. \
- first routing rule will send packets with ip == 192.168.9.119 to first pipe \
- second routing rule will send packets with ip == 192.168.9.120 to second pipe\
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to dst NAT \
- All DST_IP == (192.168.9.1 & 255.255.255.0)traffic goes to NAT block \
- 3. generate and commit two NAT rules with target ip 211.1.1.4:\
- 1. public ip 5.5.6.120 --> private ip 192.168.9.119 \
- public port 4501 --> private port 4500 \
- 2. public ip 5.5.6.120 --> private ip 192.168.9.119 \
- public port 4502 --> private port 4500";
- m_private_ip = 0xC0A80977; /* 192.168.9.119 */
- m_private_port = 4500;
- m_private_ip2 = 0xC0A80978; /* 192.168.9.120 */
- m_private_port2 = 4500;
- m_public_ip = 0x05050678; /* 5.5.6.120 */
- m_public_port = 4501;
- m_public_port2 = 4502;
- m_target_ip = 0xD3010104; /* 211.1.1.4 */
- m_target_port = 1234;
- m_minIPAHwType = IPA_HW_v4_0;
- Register(*this);
- }
- bool Setup()
- {
- return IpaNatBlockTestFixture::Setup(true);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- struct ipa_ioc_get_rt_tbl routing_table0;
- if (!CreateHashableRoutingRules(bypass0))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateHashableRoutingRules completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST_PROD, false, 1);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing table 1
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00000000; // Mask - catch all
- flt_rule_entry.rule.attrib.u.v4.dst_addr = m_public_ip; // Filter DST_IP == 5.5.6.120
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 0;
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- ret = ipa_nat_add_ipv4_tbl(m_public_ip, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- m_public_ip);
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule 1 added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip2;
- ipv4_rule.private_port = m_private_port2;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port2;
- ipv4_rule.pdn_index = 0;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule 2 added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- address = ntohl(m_public_ip);//5.5.6.120
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = ntohs(m_public_port); // 4501
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = ntohl(m_target_ip);/* 211.1.1.4 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = ntohs(m_target_port); // 4500
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- // second packet
- address = ntohl(m_public_ip);//5.5.6.120
- memcpy(&m_sendBuffer2[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = ntohs(m_public_port2); // 4502
- memcpy(&m_sendBuffer2[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = ntohl(m_target_ip);/* 211.1.1.4 */
- memcpy(&m_sendBuffer2[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = ntohs(m_target_port); // 4500
- memcpy(&m_sendBuffer2[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer2[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully the first packet\n");
- isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully two packet\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- size_t receivedSize2 = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- Byte *rxBuff2 = new Byte[0x400];
- if (rxBuff1 == NULL || rxBuff2 == NULL)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- receivedSize2 = m_consumer2.ReceiveData(rxBuff2, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize2, m_consumer2.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip,
- m_private_port, m_public_port,
- false, 0, true))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
- IsCacheMiss_v5_0(m_sendSize, receivedSize, rxBuff1) : IsCacheMiss(m_sendSize, receivedSize, rxBuff1);
- char recievedBuffer[0x400] = { 0 };
- char SentBuffer[0x400] = { 0 };
- char recievedBuffer2[0x400] = { 0 };
- char SentBuffer2[0x400] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- isSuccess &= CompareResultVsGoldenNat(
- m_sendBuffer2, m_sendSize2,
- rxBuff2, receivedSize2,
- m_private_ip2, m_public_ip,
- m_private_port2, m_public_port2,
- false, 0, true);
- isSuccess &= (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v5_0) ?
- IsCacheMiss_v5_0(m_sendSize2, receivedSize2, rxBuff2) : IsCacheMiss(m_sendSize2, receivedSize2, rxBuff2);
- for (j = 0; j < m_sendSize2; j++)
- snprintf(&SentBuffer2[3 * j], sizeof(SentBuffer2) - (3 * j + 1), " %02X", m_sendBuffer2[j]);
- for (j = 0; j < receivedSize2; j++)
- snprintf(&recievedBuffer2[3 * j], sizeof(recievedBuffer2) - (3 * j + 1), " %02X", rxBuff2[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize2, SentBuffer2, receivedSize2, recievedBuffer2);
- delete[] rxBuff2;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test008: Multi PDN src NAT test match PDN by input from filtering block */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest008 : public IpaNatBlockTestFixture
- {
- public:
- IpaNatBlockTest008()
- {
- m_name = "IpaNatBlockTest008";
- m_description =
- "NAT block test 008 - Multi PDN src NAT test match PDN by input from filtering block\
- 1. Generate and commit three routing tables (two are used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- - action go to src NAT + PDN index 2\
- All SRC_IP == (194.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- 3. generate and commit two NAT rules:\
- private ip 194.23.22.1 --> public ip 192.23.22.1 PDN index 1\
- private ip 194.23.22.1 --> public ip 195.23.22.1 PDN index 2";
- m_private_ip = 0xC2171601; /* 194.23.22.1 */
- m_private_port = 5678;
- m_public_ip = 0xC0171601; /* "192.23.22.1" */
- m_public_port = 9050;
- m_public_ip2 = 0xC3171601; /* "195.23.22.1" */
- m_target_ip = 0xC1171601; /* 193.23.22.1 */
- m_target_port = 1234;
- m_minIPAHwType = IPA_HW_v4_0;
- Register(*this);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- const char bypass1[20] = "Bypass1";
- const char bypass2[20] = "Bypass2";
- struct ipa_ioc_get_rt_tbl routing_table0, routing_table1;
- if (!CreateThreeIPv4BypassRoutingTables(bypass0, bypass1, bypass2))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateThreeBypassRoutingTables completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- routing_table1.ip = IPA_IP_v4;
- strlcpy(routing_table1.name, bypass1, sizeof(routing_table1.name));
- if (!m_routing.GetRoutingTable(&routing_table1))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table1=0x%p) Failed.\n", &routing_table1);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass1, routing_table1.hdl);
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST_PROD, false, 2);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing Rule 1
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR;
- flt_rule_entry.rule.attrib.u.v4.src_addr_mask = 0xFFFFFFFF; // Mask
- flt_rule_entry.rule.attrib.u.v4.src_addr = m_private_ip; // Filter SRC_IP == 194.23.22.1
- flt_rule_entry.rule.pdn_idx = 2;
- flt_rule_entry.rule.set_metadata = 0;
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_ERROR("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- uint32_t pub_ip_add = m_public_ip;
- ipa_nat_pdn_entry pdn_info;
- // first create the NAT table
- ret = ipa_nat_add_ipv4_tbl(pub_ip_add, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- pub_ip_add);
- // modify the PDN entries that will be pointed by the NAT rules
- pdn_info.public_ip = m_public_ip;
- pdn_info.src_metadata = 0;
- pdn_info.dst_metadata = 0;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 1, &pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed Modifying PDN entry 0 \n");
- return false;
- }
- pdn_info.public_ip = m_public_ip2;
- pdn_info.src_metadata = 0;
- pdn_info.dst_metadata = 0;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 2, &pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed Modifying PDN entry 1 \n");
- return false;
- }
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 1;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- // the second rule shall be identical to the first on all parameters except PDN index so the filtering
- // block action parameter will provide the PDN index.
- ipv4_rule.pdn_index = 2;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 1\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule 2 added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- //first packet private ip 194.23.22.1 --> public ip 195.23.22.1
- address = htonl(m_target_ip);//193.23.22.1
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_private_ip);/* 194.23.22.1 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_private_port);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (rxBuff1 == NULL)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- // Compare results - verify that the ip of PDN 2 was selected (m_public_ip2)
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip2,
- m_private_port, m_public_port,
- true))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test009: Single PDN src NAT delete rule test */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest009 : public IpaNatBlockTest001
- {
- public:
- IpaNatBlockTest009()
- {
- m_name = "IpaNatBlockTest009";
- m_description =
- "NAT block test 009 - single PDN src NAT rule deletion test\
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to src NAT \
- All DST_IP == (193.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- 3. generate and commit one NAT rule:\
- private ip 194.23.22.1 --> public ip 192.23.22.1\
- 4. delete the NAT rule and expect NAT miss";
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- int ret = IpaNatBlockTest001::AddRules();
- if (!ret) {
- LOG_MSG_ERROR("Leaving, failed Adding test 001 rules 0\n");
- return false;
- }
- ret = ipa_nat_del_ipv4_rule(m_tbl_hdl, m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed deleting NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule deleted\n");
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- if (receivedSize) {
- LOG_MSG_ERROR("Data received - test failed!\n");
- isSuccess = false;
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip,
- m_private_port, m_public_port,
- true))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- } else {
- LOG_MSG_ERROR("Comparison of Buffer0 succeeded - NAT rule was hit despite deletion!\n");
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- }
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test010: Single PDN dst NAT rule deletion test */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest010 : public IpaNatBlockTest002
- {
- public:
- IpaNatBlockTest010()
- {
- m_name = "IpaNatBlockTest010";
- m_description =
- "NAT block test 010 - single PDN dst NAT rule deletion test\
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to dst NAT \
- All DST_IP == (192.23.22.1 & 0.255.255.255)traffic goes to NAT block (public IP filtering) \
- 3. generate and commit one NAT rule:\
- public ip 192.23.22.1 --> private ip 194.23.22.1 \
- delete rule and verrify NAT miss";
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- int ret = IpaNatBlockTest002::AddRules();
- if (!ret) {
- LOG_MSG_ERROR("Leaving, failed Adding test 002 rules 0\n");
- return false;
- }
- ret = ipa_nat_del_ipv4_rule(m_tbl_hdl, m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed deleting NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule deleted\n");
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- if (receivedSize) {
- LOG_MSG_ERROR("Data received - test failed!\n");
- isSuccess = false;
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip,
- m_private_port, m_public_port,
- false))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- }
- else {
- LOG_MSG_ERROR("Comparison of Buffer0 succeeded - NAT rule was hit despite deletion!\n");
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- }
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test011: Multi PDN src NAT - MAX number of PDNs test */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest011 : public IpaNatBlockTestFixture
- {
- uint32_t m_public_ip3;
- uint32_t m_public_ip4;
- uint32_t m_private_ip3;
- uint32_t m_private_ip4;
- uint16_t m_public_port3;
- uint16_t m_public_port4;
- uint16_t m_private_port3;
- uint16_t m_private_port4;
- Byte m_sendBuffer4[BUFF_MAX_SIZE];
- size_t m_sendSize4;
- public:
- IpaNatBlockTest011()
- {
- m_name = "IpaNatBlockTest011";
- m_description =
- "NAT block test 011 - Multi PDN src NAT test\
- 1. Generate and commit three routing tables (one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- - action go to src NAT \
- All SRC_IP == (192.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- All SRC_IP == (194.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- All SRC_IP == (196.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- All SRC_IP == (198.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- 3. generate and commit four NAT rules:\
- private ip 192.23.22.1 --> public ip 193.23.22.1 \
- private ip 194.23.22.1 --> public ip 195.23.22.1 \
- private ip 196.23.22.1 --> public ip 197.23.22.1 \
- private ip 198.23.22.1 --> public ip 199.23.22.1";
- m_private_ip = 0xC0171601; /* 192.23.22.1 */
- m_private_port = 5678;
- m_public_ip = 0xC1171601; /* "193.23.22.1" */
- m_public_port = 9050;
- m_private_ip2 = 0xC2171601; /* 194.23.22.1 */
- m_private_port2 = 5679;
- m_public_ip2 = 0xC3171601; /* "195.23.22.1" */
- m_public_port2 = 9051;
- m_private_ip3 = 0xC4171601; /* 196.23.22.1 */
- m_private_port3 = 5680;
- m_public_ip3 = 0xC5171601; /* "197.23.22.1" */
- m_public_port3 = 9052;
- m_private_ip4 = 0xC6171601; /* 198.23.22.1 */
- m_private_port4 = 5681;
- m_public_ip4 = 0xC7171601; /* "199.23.22.1" */
- m_public_port4 = 9053;
- m_target_ip = 0xBF171601; /* 191.23.22.1 */
- m_target_port = 1234;
- m_sendSize4 = BUFF_MAX_SIZE;
- m_minIPAHwType = IPA_HW_v4_0;
- Register(*this);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- const char bypass1[20] = "Bypass1";
- const char bypass2[20] = "Bypass2";
- struct ipa_ioc_get_rt_tbl routing_table0, routing_table1;
- if (!CreateThreeIPv4BypassRoutingTables(bypass0, bypass1, bypass2))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateThreeBypassRoutingTables completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- routing_table1.ip = IPA_IP_v4;
- strlcpy(routing_table1.name, bypass1, sizeof(routing_table1.name));
- if (!m_routing.GetRoutingTable(&routing_table1))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table1=0x%p) Failed.\n", &routing_table1);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass1, routing_table1.hdl);
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST_PROD, false, 1);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl;
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR;
- flt_rule_entry.rule.attrib.u.v4.src_addr_mask = 0x00FFFFFF; // Mask - catch all private IPs
- flt_rule_entry.rule.attrib.u.v4.src_addr = m_private_ip; // Filter SRC_IP == 192.23.22.1
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 0;
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- ipa_nat_pdn_entry pdn_info;
- // first create the NAT table
- ret = ipa_nat_add_ipv4_tbl(m_public_ip, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- m_public_ip);
- // modify the PDN entries that will be pointed by the NAT rules
- pdn_info.public_ip = m_public_ip;
- pdn_info.src_metadata = 0;
- pdn_info.dst_metadata = 0;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 0, &pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed Modifying PDN entry 0 \n");
- return false;
- }
- pdn_info.public_ip = m_public_ip2;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 1, &pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed Modifying PDN entry 1 \n");
- return false;
- }
- pdn_info.public_ip = m_public_ip3;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 2, &pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed Modifying PDN entry 2 \n");
- return false;
- }
- pdn_info.public_ip = m_public_ip4;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 3, &pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed Modifying PDN entry 3 \n");
- return false;
- }
- LOG_MSG_DEBUG("Added 4 PDNs successfully: 0x%X, 0x%X, 0x%X, 0x%X\n",
- m_public_ip, m_public_ip2, m_public_ip3, m_public_ip4);
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d, $d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port, ipv4_rule.pdn_index);
- ipv4_rule.private_ip = m_private_ip2;
- ipv4_rule.private_port = m_private_port2;
- ipv4_rule.public_port = m_public_port2;
- ipv4_rule.pdn_index = 1;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 1\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule 2 added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d, $d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port, ipv4_rule.pdn_index);
- ipv4_rule.private_ip = m_private_ip3;
- ipv4_rule.private_port = m_private_port3;
- ipv4_rule.public_port = m_public_port3;
- ipv4_rule.pdn_index = 2;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 2\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule 3 added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d, $d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port, ipv4_rule.pdn_index);
- ipv4_rule.private_ip = m_private_ip4;
- ipv4_rule.private_port = m_private_port4;
- ipv4_rule.public_port = m_public_port4;
- ipv4_rule.pdn_index = 3;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 3\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule 4 added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d, $d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port, ipv4_rule.pdn_index);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- if (!LoadDefaultPacket(IPA_IP_v4, m_extHdrType, m_sendBuffer4, m_sendSize4)) {
- LOG_MSG_ERROR("Failed default Packet buffer 4\n");
- return false;
- }
- LOG_MSG_DEBUG("Loaded %zu Bytes to Buffer 4\n", m_sendSize4);
- //first packet private ip 192.23.22.1 --> public ip 193.23.22.1
- address = htonl(m_target_ip);//191.23.22.1
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_private_ip);/* 192.23.22.1 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_private_port);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- // second packet private ip 194.23.22.1 --> public ip 195.23.22.1
- address = htonl(m_target_ip);//191.23.22.1
- memcpy(&m_sendBuffer2[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer2[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_private_ip2);/* 194.23.22.1 */
- memcpy(&m_sendBuffer2[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_private_port2);
- memcpy(&m_sendBuffer2[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer2[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- // third packet private ip 196.23.22.1 --> public ip 197.23.22.1
- address = htonl(m_target_ip);//191.23.22.1
- memcpy(&m_sendBuffer3[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer3[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_private_ip3);/* 196.23.22.1 */
- memcpy(&m_sendBuffer3[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_private_port3);
- memcpy(&m_sendBuffer3[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer3[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- // third packet private ip 198.23.22.1 --> public ip 199.23.22.1
- address = htonl(m_target_ip);//191.23.22.1
- memcpy(&m_sendBuffer4[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer4[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_private_ip4);/* 198.23.22.1 */
- memcpy(&m_sendBuffer4[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_private_port4);
- memcpy(&m_sendBuffer4[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer4[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- LOG_MSG_DEBUG("sending first packet\n");
- isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- // Send second packet
- LOG_MSG_DEBUG("sending second packet\n");
- isSuccess = m_producer.SendData(m_sendBuffer2, m_sendSize2);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- // Send third packet
- LOG_MSG_DEBUG("sending third packet\n");
- isSuccess = m_producer.SendData(m_sendBuffer3, m_sendSize3);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- // Send fourth packet
- LOG_MSG_DEBUG("sending fourth packet\n");
- isSuccess = m_producer.SendData(m_sendBuffer4, m_sendSize4);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully four packets\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- size_t receivedSize2 = 0;
- size_t receivedSize3 = 0;
- size_t receivedSize4 = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- Byte *rxBuff2 = new Byte[0x400];
- Byte *rxBuff3 = new Byte[0x400];
- Byte *rxBuff4 = new Byte[0x400];
- if (rxBuff1 == NULL)
- {
- LOG_MSG_ERROR("Memory allocation error 1.\n");
- if (rxBuff2)
- delete[] rxBuff2;
- if (rxBuff3)
- delete[] rxBuff3;
- if (rxBuff4)
- delete[] rxBuff4;
- return false;
- }
- if (rxBuff2 == NULL)
- {
- LOG_MSG_ERROR("Memory allocation error 2.\n");
- delete[] rxBuff1;
- if (rxBuff3)
- delete[] rxBuff3;
- if (rxBuff4)
- delete[] rxBuff4;
- return false;
- }
- if (rxBuff3 == NULL)
- {
- LOG_MSG_ERROR("Memory allocation error 3.\n");
- delete[] rxBuff1;
- delete[] rxBuff2;
- if (rxBuff4)
- delete[] rxBuff4;
- return false;
- }
- if (rxBuff4 == NULL)
- {
- LOG_MSG_ERROR("Memory allocation error 4.\n");
- delete[] rxBuff1;
- delete[] rxBuff2;
- delete[] rxBuff3;
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- receivedSize2 = m_consumer.ReceiveData(rxBuff2, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize2, m_consumer.m_fromChannelName.c_str());
- receivedSize3 = m_consumer.ReceiveData(rxBuff3, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize3, m_consumer.m_fromChannelName.c_str());
- receivedSize4 = m_consumer.ReceiveData(rxBuff4, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize4, m_consumer.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip,
- m_private_port, m_public_port,
- true))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- char recievedBuffer2[256] = { 0 };
- char SentBuffer2[256] = { 0 };
- char recievedBuffer3[256] = { 0 };
- char SentBuffer3[256] = { 0 };
- char recievedBuffer4[256] = { 0 };
- char SentBuffer4[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- isSuccess &= CompareResultVsGoldenNat(
- m_sendBuffer2, m_sendSize2,
- rxBuff2, receivedSize2,
- m_private_ip2, m_public_ip2,
- m_private_port2, m_public_port2,
- true);
- for (j = 0; j < m_sendSize2; j++)
- snprintf(&SentBuffer2[3 * j], sizeof(SentBuffer2) - (3 * j + 1), " %02X", m_sendBuffer2[j]);
- for (j = 0; j < receivedSize2; j++)
- snprintf(&recievedBuffer2[3 * j], sizeof(recievedBuffer2) - (3 * j + 1), " %02X", rxBuff2[j]);
- LOG_MSG_STACK("sent Value2 (%zu)\n%s\n, Received Value2(%zu)\n%s\n", m_sendSize2, SentBuffer2, receivedSize2, recievedBuffer2);
- delete[] rxBuff2;
- isSuccess &= CompareResultVsGoldenNat(
- m_sendBuffer3, m_sendSize3,
- rxBuff3, receivedSize3,
- m_private_ip3, m_public_ip3,
- m_private_port3, m_public_port3,
- true);
- for (j = 0; j < m_sendSize3; j++)
- snprintf(&SentBuffer3[3 * j], sizeof(SentBuffer3) - (3 * j + 1), " %02X", m_sendBuffer3[j]);
- for (j = 0; j < receivedSize3; j++)
- snprintf(&recievedBuffer3[3 * j], sizeof(recievedBuffer3) - (3 * j + 1), " %02X", rxBuff3[j]);
- LOG_MSG_STACK("sent Value3 (%zu)\n%s\n, Received Value3(%zu)\n%s\n", m_sendSize3, SentBuffer3, receivedSize3, recievedBuffer3);
- delete[] rxBuff3;
- isSuccess &= CompareResultVsGoldenNat(
- m_sendBuffer4, m_sendSize4,
- rxBuff4, receivedSize4,
- m_private_ip4, m_public_ip4,
- m_private_port4, m_public_port4,
- true);
- for (j = 0; j < m_sendSize4; j++)
- snprintf(&SentBuffer4[3 * j], sizeof(SentBuffer4) - (3 * j + 1), " %02X", m_sendBuffer4[j]);
- for (j = 0; j < receivedSize4; j++)
- snprintf(&recievedBuffer4[3 * j], sizeof(recievedBuffer4) - (3 * j + 1), " %02X", rxBuff4[j]);
- LOG_MSG_STACK("sent Value4 (%zu)\n%s\n, Received Value4(%zu)\n%s\n", m_sendSize4, SentBuffer4, receivedSize4, recievedBuffer4);
- delete[] rxBuff4;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test012: Single PDN dst NAT test expansion table usage */
- /* NOTE: other classes are derived from this class - change carefully */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest012 : public IpaNatBlockTestFixture
- {
- uint32_t m_target_ip2;
- uint16_t m_target_port2;
- public:
- IpaNatBlockTest012()
- {
- m_name = "IpaNatBlockTest012";
- m_description =
- "NAT block test 012 - single PDN dst NAT test - expansion table usage\
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to dst NAT \
- All DST_IP == (192.23.22.1 & 0.255.255.255)traffic goes to NAT block (public IP filtering) \
- 3. generate and commit two NAT rules so second one is located in expansion table:\
- since we use a single public ip this test should work also on pre IPAv4 targets\
- public ip 192.23.22.1 --> private ip 194.23.22.1 ";
- m_private_ip = 0xC2171601; /* 194.23.22.1 */
- m_private_port = 5678;
- m_private_ip2 = 0xC5171601; /* 197.23.22.1 */
- m_private_port2 = 5679;
- m_public_ip = 0xC0171601; /* "192.23.22.1" */
- m_public_port = 9050;
- m_target_ip = 0xC1171601; /* 193.23.22.1 */
- m_target_port = 1234;
- m_target_ip2 = 0x1601C117; /* swap m_target_ip to get same hash*/
- m_target_port2 = m_target_port;
- Register(*this);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- const char bypass1[20] = "Bypass1";
- const char bypass2[20] = "Bypass2";
- struct ipa_ioc_get_rt_tbl routing_table0;
- if (!CreateThreeIPv4BypassRoutingTables(bypass0, bypass1, bypass2))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateThreeBypassRoutingTables completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST_PROD, false, 3);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl;
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00FFFFFF; // Mask
- flt_rule_entry.rule.attrib.u.v4.dst_addr = m_public_ip; // Filter DST_IP == 192.23.22.1
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 0;
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- uint32_t pub_ip_add = m_public_ip;
- ret = ipa_nat_add_ipv4_tbl(pub_ip_add, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- pub_ip_add);
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d, $d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port, ipv4_rule.pdn_index);
- ipv4_rule.target_ip = m_target_ip2;
- ipv4_rule.target_port = m_target_port2;
- // private IPs are not part of the dst NAT entry hash calculation
- ipv4_rule.private_ip = m_private_ip2;
- ipv4_rule.private_port = m_private_port2;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule 2 added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d, $d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port, ipv4_rule.pdn_index);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- address = htonl(m_public_ip);
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_public_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_target_ip2);
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port2);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully one packet\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip2, m_public_ip,
- m_private_port2, m_public_port,
- false))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test013: Single PDN dst NAT expansion rule deletion test */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest013 : public IpaNatBlockTest012
- {
- public:
- IpaNatBlockTest013()
- {
- m_name = "IpaNatBlockTest013";
- m_description =
- "NAT block test 013 - single PDN dst NAT test - expansion table rule deletion\
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to dst NAT \
- All DST_IP == (192.23.22.1 & 0.255.255.255)traffic goes to NAT block (public IP filtering) \
- 3. generate and commit two NAT rules so second one is located in expansion table:\
- since we use a single public ip this test should work also on pre IPAv4 targets\
- public ip 192.23.22.1 --> private ip 194.23.22.1\
- 4. delete NAT rule and expect NAT miss";
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- int ret = IpaNatBlockTest012::AddRules();
- if (!ret) {
- LOG_MSG_ERROR("Leaving, failed Adding test 012 rules 0\n");
- return false;
- }
- ret = ipa_nat_del_ipv4_rule(m_tbl_hdl, m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed deleting NAT rule 1\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule deleted\n");
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- if (receivedSize) {
- LOG_MSG_ERROR("Data received - test failed!\n");
- isSuccess = false;
- // Compare results for debug in the case of failure only
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip2, m_public_ip,
- m_private_port2, m_public_port,
- false))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- }
- else {
- LOG_MSG_ERROR("Comparison of Buffer0 succeeded - NAT rule was hit despite deletion!\n");
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- }
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test014: Single PDN src NAT zero PDN test */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest014 : public IpaNatBlockTest001
- {
- public:
- IpaNatBlockTest014()
- {
- m_name = "IpaNatBlockTest014";
- m_description =
- "NAT block test 014 - single PDN src NAT PDN zeroing test\
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to src NAT \
- All DST_IP == (193.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- 3. generate and commit one NAT rule:\
- private ip 194.23.22.1 --> public ip 192.23.22.1\
- 4. modify PDN entry 0 and expect NAT miss";
- m_minIPAHwType = IPA_HW_v4_0;
- }
- virtual bool AddRules()
- {
- ipa_nat_pdn_entry pdn_info;
- LOG_MSG_DEBUG("Entering\n");
- int ret = IpaNatBlockTest001::AddRules();
- if (!ret) {
- LOG_MSG_ERROR("Leaving, failed Adding test 001 rules 0\n");
- return false;
- }
- // modify PDN entry 0 so the NAT rule will get a NAT miss
- pdn_info.public_ip = 0;
- pdn_info.src_metadata = 0;
- pdn_info.dst_metadata = 0;
- ret = ipa_nat_modify_pdn(m_tbl_hdl, 0, &pdn_info);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed Modifying PDN entry 0 \n");
- return false;
- }
- LOG_MSG_DEBUG("PDN modified\n");
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- if (receivedSize) {
- LOG_MSG_ERROR("Data received - test failed!\n");
- isSuccess = false;
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip,
- m_private_port, m_public_port,
- true))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- }
- else {
- LOG_MSG_ERROR("Comparison of Buffer0 succeeded - NAT rule was hit despite deletion!\n");
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- }
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test015: Single PDN src NAT send two packets that will hit the same rule */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest015 : public IpaNatBlockTest001
- {
- public:
- IpaNatBlockTest015()
- {
- m_name = "IpaNatBlockTest015";
- m_description =
- "NAT block test 015 - single PDN src NAT hit the same rule twice\
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to src NAT \
- All DST_IP == (193.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- 3. generate and commit one NAT rule:\
- private ip 194.23.22.1 --> public ip 192.23.22.1\
- 4. send two pakcets and verify NATing";
- }
- virtual bool SendPackets()
- {
- bool ret = IpaNatBlockTest001::SendPackets();
- if (!ret)
- {
- LOG_MSG_ERROR("failed sending first pakcket.\n");
- return false;
- }
- LOG_MSG_DEBUG("first packet sent succesfully.\n");
- ret = IpaNatBlockTest001::SendPackets();
- if (!ret)
- {
- LOG_MSG_ERROR("failed sending second pakcket.\n");
- return false;
- }
- LOG_MSG_DEBUG("second packet sent succesfully.\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- bool isSuccess = true;
- isSuccess &= IpaNatBlockTest001::ReceivePacketsAndCompare();
- if (!isSuccess)
- {
- LOG_MSG_ERROR("failed to receive\\compare first packet.\n");
- }
- isSuccess &= IpaNatBlockTest001::ReceivePacketsAndCompare();
- if (!isSuccess)
- {
- LOG_MSG_ERROR("failed to receive\\compare second packet.\n");
- }
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test016: Single PDN dst NAT send two packets that will hit the same rule */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest016 : public IpaNatBlockTest002
- {
- public:
- IpaNatBlockTest016()
- {
- m_name = "IpaNatBlockTest016";
- m_description =
- "NAT block test 016 - single PDN dst NAT hit the same rule twice\
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to dst NAT \
- All DST_IP == (192.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- 3. generate and commit one NAT rule:\
- public ip 192.23.22.1 --> private ip 194.23.22.1\
- 4. send two pakcets and verify NATing";
- }
- virtual bool SendPackets()
- {
- bool ret = IpaNatBlockTest002::SendPackets();
- if (!ret)
- {
- LOG_MSG_ERROR("failed sending first pakcket.\n");
- return false;
- }
- LOG_MSG_DEBUG("first packet sent succesfully.\n");
- ret = IpaNatBlockTest002::SendPackets();
- if (!ret)
- {
- LOG_MSG_ERROR("failed sending second pakcket.\n");
- return false;
- }
- LOG_MSG_DEBUG("second packet sent succesfully.\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- bool isSuccess = true;
- isSuccess &= IpaNatBlockTest002::ReceivePacketsAndCompare();
- if (!isSuccess)
- {
- LOG_MSG_ERROR("failed to receive\\compare first packet.\n");
- }
- isSuccess &= IpaNatBlockTest002::ReceivePacketsAndCompare();
- if (!isSuccess)
- {
- LOG_MSG_ERROR("failed to receive\\compare second packet.\n");
- }
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------------*/
- /* Test017: Multi PDN src NAT test with identical private IPs and different ports */
- /*---------------------------------------------------------------------------------*/
- class IpaNatBlockTest017 : public IpaNatBlockTest003
- {
- public:
- IpaNatBlockTest017()
- {
- m_name = "IpaNatBlockTest017";
- m_description =
- "NAT block test 017 - Multi PDN src NAT test with identical private IPs\
- 1. Generate and commit three routing tables (two are used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit two filtering rule: (DST & Mask Match). \
- - action go to src NAT \
- All SRC_IP == (194.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- All SRC_IP == (197.23.22.1 & 0.255.255.255)traffic goes to NAT block - not relevant for this test \
- 3. generate and commit two NAT rules:\
- private ip 194.23.22.1 && port 5678--> public ip 192.23.22.1 \
- private ip 194.23.22.1 && port 5679--> public ip 195.23.22.1";
- m_private_ip2 = m_private_ip;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- // we cannot just use test 003 ReceivePacketsAndCompare since the filtering rules send the
- // packets to two different pipes, but since the private IPs are now equal the second filtering rule
- // won't be hit so we need to recive the second packet on the first pipe
- size_t receivedSize = 0;
- size_t receivedSize2 = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- Byte *rxBuff2 = new Byte[0x400];
- if (rxBuff1 == NULL)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- if (rxBuff2)
- delete[] rxBuff2;
- return false;
- }
- if (rxBuff2 == NULL)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- delete[] rxBuff1;
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- receivedSize2 = m_consumer.ReceiveData(rxBuff2, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize2, m_consumer.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGoldenNat(
- m_sendBuffer, m_sendSize,
- rxBuff1, receivedSize,
- m_private_ip, m_public_ip,
- m_private_port, m_public_port,
- true))
- {
- LOG_MSG_ERROR("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- char recievedBuffer2[256] = { 0 };
- char SentBuffer2[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- isSuccess &= CompareResultVsGoldenNat(
- m_sendBuffer2, m_sendSize2,
- rxBuff2, receivedSize2,
- m_private_ip2, m_public_ip2,
- m_private_port2, m_public_port2,
- true);
- for (j = 0; j < m_sendSize2; j++)
- snprintf(&SentBuffer2[3 * j], sizeof(SentBuffer2) - (3 * j + 1), " %02X", m_sendBuffer2[j]);
- for (j = 0; j < receivedSize2; j++)
- snprintf(&recievedBuffer2[3 * j], sizeof(recievedBuffer2) - (3 * j + 1), " %02X", rxBuff2[j]);
- LOG_MSG_STACK("sent Value2 (%zu)\n%s\n, Received Value2(%zu)\n%s\n", m_sendSize2, SentBuffer2, receivedSize2, recievedBuffer2);
- delete[] rxBuff2;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------------*/
- /* Test018: Multi PDN dst NAT test with identical private IPs and different ports */
- /*---------------------------------------------------------------------------------*/
- class IpaNatBlockTest018 : public IpaNatBlockTest004
- {
- public:
- IpaNatBlockTest018()
- {
- m_name = "IpaNatBlockTest018";
- m_description =
- "NAT block test 018 - Multi PDN dst NAT test with identical private IPs\
- 1. Generate and commit three routing tables (two are used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit two filtering rule: (DST & Mask Match). \
- - action go to dst NAT \
- All DST_IP == (192.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- All DST_IP == (195.23.22.1 & 0.255.255.255)traffic goes to NAT block - not releveant for this test\
- 3. generate and commit two NAT rules:\
- private ip 194.23.22.1 --> public ip 192.23.22.1 && port 9050\
- private ip 194.23.22.1 --> public ip 192.23.22.1 && port 9051";
- m_private_ip2 = m_private_ip;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test019: NAT Suppression test */
- /* NOTE: other classes are derived from this class - change carefully */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest019 : public IpaNatBlockTestFixture
- {
- public:
- IpaNatBlockTest019()
- {
- m_name = "IpaNatBlockTest019";
- m_description =
- "NAT block test 019 - single PDN src NAT test\
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to src NAT \
- All DST_IP == (193.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- 3. generate and commit one NAT rule:\
- private ip 194.23.22.1 --> public ip 192.23.22.1";
- m_private_ip = 0xC2171601; /* 194.23.22.1 */
- m_private_port = 5678;
- m_public_ip = 0xC0171601; /* "192.23.22.1" */
- m_public_port = 9050;
- m_target_ip = 0xC1171601; /* 193.23.22.1 */
- m_target_port = 1234;
- Register(*this);
- }
- virtual bool Setup()
- {
- return IpaNatBlockTestFixture::Setup(false, true);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- const char bypass1[20] = "Bypass1";
- const char bypass2[20] = "Bypass2";
- struct ipa_ioc_get_rt_tbl routing_table0;
- if (!CreateThreeIPv4BypassRoutingTables(bypass0, bypass1, bypass2))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateThreeBypassRoutingTables completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- /* Setup NAT Exception routing table. */
- if (!m_routing.SetNatConntrackExcRoutingTable(routing_table0.hdl, true))
- {
- LOG_MSG_ERROR("m_routing.SetNatConntrackExcRoutingTable(routing_table0 hdl=%d) Failed.\n",
- routing_table0.hdl);
- return false;
- }
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST_PROD, false, 1);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing Rule 1
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xFFFFFF00; // Mask
- flt_rule_entry.rule.attrib.u.v4.dst_addr = m_target_ip; // Filter DST_IP == 193.23.22.1
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 0;
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- ret = ipa_nat_add_ipv4_tbl(m_public_ip, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_DEBUG("failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- m_public_ip);
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- LOG_MSG_DEBUG("Leaving");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- address = htonl(m_target_ip);//193.23.22.1
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_private_ip);/* 194.23.22.1 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_private_port+1);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET],&flags , sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully one packet\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGolden(m_sendBuffer, m_sendSize, rxBuff1, receivedSize))
- {
- printf("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test020: NAT Suppression test with Status */
- /* NOTE: other classes are derived from this class - change carefully */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest020 : public IpaNatBlockTestFixture
- {
- public:
- IpaNatBlockTest020()
- {
- m_name = "IpaNatBlockTest020";
- m_description =
- "NAT block test 020 - single PDN src NAT test with status enabled\
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to src NAT \
- All DST_IP == (193.23.22.1 & 0.255.255.255)traffic goes to NAT block \
- 3. generate and commit one NAT rule:\
- private ip 194.23.22.1 --> public ip 192.23.22.1";
- m_private_ip = 0xC2171601; /* 194.23.22.1 */
- m_private_port = 5678;
- m_public_ip = 0xC0171601; /* "192.23.22.1" */
- m_public_port = 9050;
- m_target_ip = 0xC1171601; /* 193.23.22.1 */
- m_target_port = 1234;
- Register(*this);
- }
- virtual bool Setup()
- {
- return IpaNatBlockTestFixture::Setup(true, true);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- const char bypass1[20] = "Bypass1";
- const char bypass2[20] = "Bypass2";
- struct ipa_ioc_get_rt_tbl routing_table0;
- if (!CreateThreeIPv4BypassRoutingTables(bypass0, bypass1, bypass2))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateThreeBypassRoutingTables completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- /* Setup NAT Exception routing table. */
- if (!m_routing.SetNatConntrackExcRoutingTable(routing_table0.hdl, true))
- {
- LOG_MSG_ERROR("m_routing.SetNatConntrackExcRoutingTable(routing_table0 hdl=%d) Failed.\n",
- routing_table0.hdl);
- return false;
- }
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST_PROD, false, 1);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing Rule 1
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xFFFFFF00; // Mask
- flt_rule_entry.rule.attrib.u.v4.dst_addr = m_target_ip; // Filter DST_IP == 193.23.22.1
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 0;
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- ret = ipa_nat_add_ipv4_tbl(m_public_ip, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_DEBUG("failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- m_public_ip);
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- LOG_MSG_DEBUG("Leaving");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- address = htonl(m_target_ip);//193.23.22.1
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_private_ip);/* 194.23.22.1 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_private_port+1);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET],&flags , sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully one packet\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- struct ipa3_hw_pkt_status_hw_v5_5 *status = NULL;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGolden_w_Status(m_sendBuffer, m_sendSize, rxBuff1, receivedSize))
- {
- printf("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- status = (struct ipa3_hw_pkt_status_hw_v5_5 *)rxBuff1;
- if (!status->nat_exc_suppress)
- {
- printf("NAT Suppression not hit!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test021: Single PDN dst NAT test with NAT suppresssion */
- /* NOTE: other classes are derived from this class - change carefully */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest021 : public IpaNatBlockTestFixture
- {
- public:
- IpaNatBlockTest021()
- {
- m_name = "IpaNatBlockTest021";
- m_description =
- "NAT block test 002 - single PDN dst NAT test with NAT suppression \
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to dst NAT \
- All DST_IP == (192.23.22.1 & 0.255.255.255)traffic goes to NAT block (public IP filtering) \
- 3. generate and commit one NAT rule: \
- public ip 192.23.22.1 --> private ip 194.23.22.1. \
- 4. Send packet not matching with NAT entry.\n";
- m_private_ip = 0xC2171601; /* 194.23.22.1 */
- m_private_port = 5678;
- m_public_ip = 0xC0171601; /* "192.23.22.1" */
- m_public_port = 9050;
- m_target_ip = 0xC1171601; /* 193.23.22.1 */
- m_target_port = 1234;
- Register(*this);
- }
- virtual bool Setup()
- {
- return IpaNatBlockTestFixture::Setup(false, true);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- const char bypass1[20] = "Bypass1";
- const char bypass2[20] = "Bypass2";
- struct ipa_ioc_get_rt_tbl routing_table0;
- if (!CreateThreeIPv4BypassRoutingTables(bypass0, bypass1, bypass2))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateThreeBypassRoutingTables completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- /* Setup NAT Exception routing table. */
- if (!m_routing.SetNatConntrackExcRoutingTable(routing_table0.hdl, true))
- {
- LOG_MSG_ERROR("m_routing.SetNatConntrackExcRoutingTable(routing_table0 hdl=%d) Failed.\n",
- routing_table0.hdl);
- return false;
- }
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST_PROD, false, 3);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing Rule 1
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00FFFFFF; // Mask
- flt_rule_entry.rule.attrib.u.v4.dst_addr = m_public_ip; // Filter DST_IP == 192.23.22.1
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 0;
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- uint32_t pub_ip_add = m_public_ip;
- ret = ipa_nat_add_ipv4_tbl(pub_ip_add, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- pub_ip_add);
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- address = htonl(m_public_ip);//192.23.22.1
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_public_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_target_ip);/* 193.23.22.1 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port+1);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully one packet\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGolden(m_sendBuffer, m_sendSize, rxBuff1, receivedSize))
- {
- printf("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- /*---------------------------------------------------------------------------*/
- /* Test022: Single PDN dst NAT test with NAT suppresssion and status enabled */
- /* NOTE: other classes are derived from this class - change carefully */
- /*---------------------------------------------------------------------------*/
- class IpaNatBlockTest022 : public IpaNatBlockTestFixture
- {
- public:
- IpaNatBlockTest022()
- {
- m_name = "IpaNatBlockTest022";
- m_description =
- "NAT block test 022 - single PDN dst NAT test with NAT suppression and status enabled \
- 1. Generate and commit three routing tables (only one is used). \
- Each table contains a single \"bypass\" rule (all data goes to output pipe 0, 1 and 2 (accordingly)) \
- 2. Generate and commit one filtering rule: (DST & Mask Match). \
- action go to dst NAT \
- All DST_IP == (192.23.22.1 & 0.255.255.255)traffic goes to NAT block (public IP filtering) \
- 3. generate and commit one NAT rule:\
- public ip 192.23.22.1 --> private ip 194.23.22.1. \
- 4. Send packet not matching with NAT entry.\n";
- m_private_ip = 0xC2171601; /* 194.23.22.1 */
- m_private_port = 5678;
- m_public_ip = 0xC0171601; /* "192.23.22.1" */
- m_public_port = 9050;
- m_target_ip = 0xC1171601; /* 193.23.22.1 */
- m_target_port = 1234;
- Register(*this);
- }
- virtual bool Setup()
- {
- return IpaNatBlockTestFixture::Setup(true, true);
- }
- virtual bool AddRules()
- {
- LOG_MSG_DEBUG("Entering\n");
- const char bypass0[20] = "Bypass0";
- const char bypass1[20] = "Bypass1";
- const char bypass2[20] = "Bypass2";
- struct ipa_ioc_get_rt_tbl routing_table0;
- if (!CreateThreeIPv4BypassRoutingTables(bypass0, bypass1, bypass2))
- {
- LOG_MSG_ERROR("CreateThreeBypassRoutingTables Failed\n");
- return false;
- }
- LOG_MSG_DEBUG("CreateThreeBypassRoutingTables completed successfully\n");
- routing_table0.ip = IPA_IP_v4;
- strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
- if (!m_routing.GetRoutingTable(&routing_table0))
- {
- LOG_MSG_ERROR("m_routing.GetRoutingTable(&routing_table0=0x%p) Failed.\n", &routing_table0);
- return false;
- }
- LOG_MSG_DEBUG("%s route table handle = %u\n", bypass0, routing_table0.hdl);
- /* Setup NAT Exception routing table. */
- if (!m_routing.SetNatConntrackExcRoutingTable(routing_table0.hdl, true))
- {
- LOG_MSG_ERROR("m_routing.SetNatConntrackExcRoutingTable(routing_table0 hdl=%d) Failed.\n",
- routing_table0.hdl);
- return false;
- }
- IPAFilteringTable FilterTable0;
- struct ipa_flt_rule_add flt_rule_entry;
- FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST_PROD, false, 3);
- LOG_MSG_DEBUG("FilterTable*.Init Completed Successfully..\n");
- // Configuring Filtering Rule No.0
- FilterTable0.GeneratePresetRule(1, flt_rule_entry);
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1; // return Value
- flt_rule_entry.status = -1; // return value
- flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing Rule 1
- flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00FFFFFF; // Mask
- flt_rule_entry.rule.attrib.u.v4.dst_addr = m_public_ip; // Filter DST_IP == 192.23.22.1
- flt_rule_entry.rule.pdn_idx = 0;
- flt_rule_entry.rule.set_metadata = 0;
- if (
- ((uint8_t)-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
- !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable())
- )
- {
- LOG_MSG_ERROR("Error Adding Rule to Filter Table, aborting...\n");
- return false;
- }
- else
- {
- LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl, FilterTable0.ReadRuleFromTable(0)->status);
- }
- //NAT table and rules creation
- int total_entries = 20;
- int ret;
- ipa_nat_ipv4_rule ipv4_rule;
- uint32_t pub_ip_add = m_public_ip;
- ret = ipa_nat_add_ipv4_tbl(pub_ip_add, m_mem_type, total_entries, &m_tbl_hdl);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed creating NAT table\n");
- return false;
- }
- LOG_MSG_DEBUG("nat table added, hdl %d, public ip 0x%X\n", m_tbl_hdl,
- pub_ip_add);
- ipv4_rule.target_ip = m_target_ip;
- ipv4_rule.target_port = m_target_port;
- ipv4_rule.private_ip = m_private_ip;
- ipv4_rule.private_port = m_private_port;
- ipv4_rule.protocol = IPPROTO_TCP;
- ipv4_rule.public_port = m_public_port;
- ipv4_rule.pdn_index = 0;
- ret = ipa_nat_add_ipv4_rule(m_tbl_hdl, &ipv4_rule, &m_nat_rule_hdl1);
- if (ret) {
- LOG_MSG_ERROR("Leaving, failed adding NAT rule 0\n");
- return false;
- }
- LOG_MSG_DEBUG("NAT rule added, hdl %d, data: 0x%X, %d, 0x%X, %d, %d, %d\n",
- m_nat_rule_hdl1, ipv4_rule.target_ip, ipv4_rule.target_port,
- ipv4_rule.private_ip, ipv4_rule.private_port,
- ipv4_rule.protocol, ipv4_rule.public_port);
- LOG_MSG_DEBUG("Leaving\n");
- return true;
- }// AddRules()
- virtual bool ModifyPackets()
- {
- uint32_t address;
- uint16_t port;
- char flags = 0x18;
- address = htonl(m_public_ip);//192.23.22.1
- memcpy(&m_sendBuffer[IPV4_DST_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_public_port);
- memcpy(&m_sendBuffer[IPV4_DST_PORT_OFFSET], &port, sizeof(port));
- address = htonl(m_target_ip);/* 193.23.22.1 */
- memcpy(&m_sendBuffer[IPV4_SRC_ADDR_OFFSET], &address, sizeof(address));
- port = htons(m_target_port+1);
- memcpy(&m_sendBuffer[IPV4_SRC_PORT_OFFSET], &port, sizeof(port));
- //make sure the FIN flag is not set, otherwise we will get a NAT miss
- memcpy(&m_sendBuffer[IPV4_TCP_FLAGS_OFFSET], &flags, sizeof(flags));
- return true;
- }// ModifyPacktes ()
- virtual bool SendPackets()
- {
- bool isSuccess = false;
- // Send first packet
- isSuccess = m_producer.SendData(m_sendBuffer, m_sendSize);
- if (false == isSuccess)
- {
- LOG_MSG_ERROR("SendData failure.\n");
- return false;
- }
- LOG_MSG_DEBUG("sent successfully one packet\n");
- return true;
- }
- virtual bool ReceivePacketsAndCompare()
- {
- size_t receivedSize = 0;
- bool isSuccess = true;
- struct ipa3_hw_pkt_status_hw_v5_5 *status = NULL;
- // Receive results
- Byte *rxBuff1 = new Byte[0x400];
- if (NULL == rxBuff1)
- {
- LOG_MSG_ERROR("Memory allocation error.\n");
- return false;
- }
- receivedSize = m_consumer.ReceiveData(rxBuff1, 0x400);
- LOG_MSG_DEBUG("Received %zu bytes on %s.\n", receivedSize, m_consumer.m_fromChannelName.c_str());
- // Compare results
- if (!CompareResultVsGolden_w_Status(m_sendBuffer, m_sendSize, rxBuff1, receivedSize))
- {
- printf("Comparison of Buffer0 Failed!\n");
- isSuccess = false;
- }
- status = (struct ipa3_hw_pkt_status_hw_v5_5 *)rxBuff1;
- if (!status->nat_exc_suppress)
- {
- printf("NAT Suppression not hit!\n");
- isSuccess = false;
- }
- char recievedBuffer[256] = { 0 };
- char SentBuffer[256] = { 0 };
- size_t j;
- for (j = 0; j < m_sendSize; j++)
- snprintf(&SentBuffer[3 * j], sizeof(SentBuffer) - (3 * j + 1), " %02X", m_sendBuffer[j]);
- for (j = 0; j < receivedSize; j++)
- snprintf(&recievedBuffer[3 * j], sizeof(recievedBuffer) - (3 * j + 1), " %02X", rxBuff1[j]);
- LOG_MSG_STACK("sent Value1 (%zu)\n%s\n, Received Value1(%zu)\n%s\n", m_sendSize, SentBuffer, receivedSize, recievedBuffer);
- delete[] rxBuff1;
- return isSuccess;
- }
- };
- static class IpaNatBlockTest001 IpaNatBlockTest001;//single PDN src NAT test
- static class IpaNatBlockTest002 IpaNatBlockTest002;//single PDN dst NAT test
- static class IpaNatBlockTest003 IpaNatBlockTest003;//multi PDN (tuple) src NAT test
- static class IpaNatBlockTest004 IpaNatBlockTest004;//multi PDN (tuple) dst NAT test
- static class IpaNatBlockTest005 IpaNatBlockTest005;//single PDN src NAT test - src metadata replacement
- static class IpaNatBlockTest006 IpaNatBlockTest006;//single PDN dst NAT test - dst metadata replacement
- static class IpaNatBlockTest007 IpaNatBlockTest007;//hashable routing rule with dst NAT test
- static class IpaNatBlockTest008 IpaNatBlockTest008;//Multi PDN src NAT test match PDN by input from filtering block
- static class IpaNatBlockTest009 IpaNatBlockTest009;//single PDN src NAT rule deletion test
- static class IpaNatBlockTest010 IpaNatBlockTest010;//single PDN dst NAT rule deletion test
- static class IpaNatBlockTest011 IpaNatBlockTest011;//Multi PDN src NAT - MAX number of PDNs test
- static class IpaNatBlockTest012 IpaNatBlockTest012;//Single PDN dst NAT test expansion table usage
- static class IpaNatBlockTest013 IpaNatBlockTest013;//Single PDN dst NAT test expansion table delete test
- static class IpaNatBlockTest014 IpaNatBlockTest014;//single PDN src NAT zero PDN test
- static class IpaNatBlockTest015 IpaNatBlockTest015;//single PDN src NAT test - send two packets that will hit the same rule
- static class IpaNatBlockTest016 IpaNatBlockTest016;//single PDN dst NAT test - send two packets that will hit the same rule
- static class IpaNatBlockTest017 IpaNatBlockTest017;//multi PDN (tuple) src NAT test - identical private IPs different ports
- static class IpaNatBlockTest018 IpaNatBlockTest018;//multi PDN (tuple) dst NAT test - identical private IPs different ports
- static class IpaNatBlockTest019 IpaNatBlockTest019;//Single PDN SRC NAT suppression test
- static class IpaNatBlockTest020 IpaNatBlockTest020;//Single PDN SRC NAT suppression test with status
- static class IpaNatBlockTest021 IpaNatBlockTest021;//Single PDN DST NAT suppression test
- static class IpaNatBlockTest022 IpaNatBlockTest022;//Single PDN DST NAT suppression test with status
|