1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258 |
- #!/bin/bash
- # SPDX-License-Identifier: GPL-2.0
- #
- # Copyright (c) 2019 David Ahern <[email protected]>. All rights reserved.
- #
- # IPv4 and IPv6 functional tests focusing on VRF and routing lookups
- # for various permutations:
- # 1. icmp, tcp, udp and netfilter
- # 2. client, server, no-server
- # 3. global address on interface
- # 4. global address on 'lo'
- # 5. remote and local traffic
- # 6. VRF and non-VRF permutations
- #
- # Setup:
- # ns-A | ns-B
- # No VRF case:
- # [ lo ] [ eth1 ]---|---[ eth1 ] [ lo ]
- # remote address
- # VRF case:
- # [ red ]---[ eth1 ]---|---[ eth1 ] [ lo ]
- #
- # ns-A:
- # eth1: 172.16.1.1/24, 2001:db8:1::1/64
- # lo: 127.0.0.1/8, ::1/128
- # 172.16.2.1/32, 2001:db8:2::1/128
- # red: 127.0.0.1/8, ::1/128
- # 172.16.3.1/32, 2001:db8:3::1/128
- #
- # ns-B:
- # eth1: 172.16.1.2/24, 2001:db8:1::2/64
- # lo2: 127.0.0.1/8, ::1/128
- # 172.16.2.2/32, 2001:db8:2::2/128
- #
- # ns-A to ns-C connection - only for VRF and same config
- # as ns-A to ns-B
- #
- # server / client nomenclature relative to ns-A
- # Kselftest framework requirement - SKIP code is 4.
- ksft_skip=4
- VERBOSE=0
- NSA_DEV=eth1
- NSA_DEV2=eth2
- NSB_DEV=eth1
- NSC_DEV=eth2
- VRF=red
- VRF_TABLE=1101
- # IPv4 config
- NSA_IP=172.16.1.1
- NSB_IP=172.16.1.2
- VRF_IP=172.16.3.1
- NS_NET=172.16.1.0/24
- # IPv6 config
- NSA_IP6=2001:db8:1::1
- NSB_IP6=2001:db8:1::2
- VRF_IP6=2001:db8:3::1
- NS_NET6=2001:db8:1::/120
- NSA_LO_IP=172.16.2.1
- NSB_LO_IP=172.16.2.2
- NSA_LO_IP6=2001:db8:2::1
- NSB_LO_IP6=2001:db8:2::2
- # non-local addresses for freebind tests
- NL_IP=172.17.1.1
- NL_IP6=2001:db8:4::1
- # multicast and broadcast addresses
- MCAST_IP=224.0.0.1
- BCAST_IP=255.255.255.255
- MD5_PW=abc123
- MD5_WRONG_PW=abc1234
- MCAST=ff02::1
- # set after namespace create
- NSA_LINKIP6=
- NSB_LINKIP6=
- NSA=ns-A
- NSB=ns-B
- NSC=ns-C
- NSA_CMD="ip netns exec ${NSA}"
- NSB_CMD="ip netns exec ${NSB}"
- NSC_CMD="ip netns exec ${NSC}"
- which ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping)
- # Check if FIPS mode is enabled
- if [ -f /proc/sys/crypto/fips_enabled ]; then
- fips_enabled=`cat /proc/sys/crypto/fips_enabled`
- else
- fips_enabled=0
- fi
- ################################################################################
- # utilities
- log_test()
- {
- local rc=$1
- local expected=$2
- local msg="$3"
- [ "${VERBOSE}" = "1" ] && echo
- if [ ${rc} -eq ${expected} ]; then
- nsuccess=$((nsuccess+1))
- printf "TEST: %-70s [ OK ]\n" "${msg}"
- else
- nfail=$((nfail+1))
- printf "TEST: %-70s [FAIL]\n" "${msg}"
- if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
- echo
- echo "hit enter to continue, 'q' to quit"
- read a
- [ "$a" = "q" ] && exit 1
- fi
- fi
- if [ "${PAUSE}" = "yes" ]; then
- echo
- echo "hit enter to continue, 'q' to quit"
- read a
- [ "$a" = "q" ] && exit 1
- fi
- kill_procs
- }
- log_test_addr()
- {
- local addr=$1
- local rc=$2
- local expected=$3
- local msg="$4"
- local astr
- astr=$(addr2str ${addr})
- log_test $rc $expected "$msg - ${astr}"
- }
- log_section()
- {
- echo
- echo "###########################################################################"
- echo "$*"
- echo "###########################################################################"
- echo
- }
- log_subsection()
- {
- echo
- echo "#################################################################"
- echo "$*"
- echo
- }
- log_start()
- {
- # make sure we have no test instances running
- kill_procs
- if [ "${VERBOSE}" = "1" ]; then
- echo
- echo "#######################################################"
- fi
- }
- log_debug()
- {
- if [ "${VERBOSE}" = "1" ]; then
- echo
- echo "$*"
- echo
- fi
- }
- show_hint()
- {
- if [ "${VERBOSE}" = "1" ]; then
- echo "HINT: $*"
- echo
- fi
- }
- kill_procs()
- {
- killall nettest ping ping6 >/dev/null 2>&1
- sleep 1
- }
- do_run_cmd()
- {
- local cmd="$*"
- local out
- if [ "$VERBOSE" = "1" ]; then
- echo "COMMAND: ${cmd}"
- fi
- out=$($cmd 2>&1)
- rc=$?
- if [ "$VERBOSE" = "1" -a -n "$out" ]; then
- echo "$out"
- fi
- return $rc
- }
- run_cmd()
- {
- do_run_cmd ${NSA_CMD} $*
- }
- run_cmd_nsb()
- {
- do_run_cmd ${NSB_CMD} $*
- }
- run_cmd_nsc()
- {
- do_run_cmd ${NSC_CMD} $*
- }
- setup_cmd()
- {
- local cmd="$*"
- local rc
- run_cmd ${cmd}
- rc=$?
- if [ $rc -ne 0 ]; then
- # show user the command if not done so already
- if [ "$VERBOSE" = "0" ]; then
- echo "setup command: $cmd"
- fi
- echo "failed. stopping tests"
- if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
- echo
- echo "hit enter to continue"
- read a
- fi
- exit $rc
- fi
- }
- setup_cmd_nsb()
- {
- local cmd="$*"
- local rc
- run_cmd_nsb ${cmd}
- rc=$?
- if [ $rc -ne 0 ]; then
- # show user the command if not done so already
- if [ "$VERBOSE" = "0" ]; then
- echo "setup command: $cmd"
- fi
- echo "failed. stopping tests"
- if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
- echo
- echo "hit enter to continue"
- read a
- fi
- exit $rc
- fi
- }
- setup_cmd_nsc()
- {
- local cmd="$*"
- local rc
- run_cmd_nsc ${cmd}
- rc=$?
- if [ $rc -ne 0 ]; then
- # show user the command if not done so already
- if [ "$VERBOSE" = "0" ]; then
- echo "setup command: $cmd"
- fi
- echo "failed. stopping tests"
- if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
- echo
- echo "hit enter to continue"
- read a
- fi
- exit $rc
- fi
- }
- # set sysctl values in NS-A
- set_sysctl()
- {
- echo "SYSCTL: $*"
- echo
- run_cmd sysctl -q -w $*
- }
- # get sysctl values in NS-A
- get_sysctl()
- {
- ${NSA_CMD} sysctl -n $*
- }
- ################################################################################
- # Setup for tests
- addr2str()
- {
- case "$1" in
- 127.0.0.1) echo "loopback";;
- ::1) echo "IPv6 loopback";;
- ${BCAST_IP}) echo "broadcast";;
- ${MCAST_IP}) echo "multicast";;
- ${NSA_IP}) echo "ns-A IP";;
- ${NSA_IP6}) echo "ns-A IPv6";;
- ${NSA_LO_IP}) echo "ns-A loopback IP";;
- ${NSA_LO_IP6}) echo "ns-A loopback IPv6";;
- ${NSA_LINKIP6}|${NSA_LINKIP6}%*) echo "ns-A IPv6 LLA";;
- ${NSB_IP}) echo "ns-B IP";;
- ${NSB_IP6}) echo "ns-B IPv6";;
- ${NSB_LO_IP}) echo "ns-B loopback IP";;
- ${NSB_LO_IP6}) echo "ns-B loopback IPv6";;
- ${NSB_LINKIP6}|${NSB_LINKIP6}%*) echo "ns-B IPv6 LLA";;
- ${NL_IP}) echo "nonlocal IP";;
- ${NL_IP6}) echo "nonlocal IPv6";;
- ${VRF_IP}) echo "VRF IP";;
- ${VRF_IP6}) echo "VRF IPv6";;
- ${MCAST}%*) echo "multicast IP";;
- *) echo "unknown";;
- esac
- }
- get_linklocal()
- {
- local ns=$1
- local dev=$2
- local addr
- addr=$(ip -netns ${ns} -6 -br addr show dev ${dev} | \
- awk '{
- for (i = 3; i <= NF; ++i) {
- if ($i ~ /^fe80/)
- print $i
- }
- }'
- )
- addr=${addr/\/*}
- [ -z "$addr" ] && return 1
- echo $addr
- return 0
- }
- ################################################################################
- # create namespaces and vrf
- create_vrf()
- {
- local ns=$1
- local vrf=$2
- local table=$3
- local addr=$4
- local addr6=$5
- ip -netns ${ns} link add ${vrf} type vrf table ${table}
- ip -netns ${ns} link set ${vrf} up
- ip -netns ${ns} route add vrf ${vrf} unreachable default metric 8192
- ip -netns ${ns} -6 route add vrf ${vrf} unreachable default metric 8192
- ip -netns ${ns} addr add 127.0.0.1/8 dev ${vrf}
- ip -netns ${ns} -6 addr add ::1 dev ${vrf} nodad
- if [ "${addr}" != "-" ]; then
- ip -netns ${ns} addr add dev ${vrf} ${addr}
- fi
- if [ "${addr6}" != "-" ]; then
- ip -netns ${ns} -6 addr add dev ${vrf} ${addr6}
- fi
- ip -netns ${ns} ru del pref 0
- ip -netns ${ns} ru add pref 32765 from all lookup local
- ip -netns ${ns} -6 ru del pref 0
- ip -netns ${ns} -6 ru add pref 32765 from all lookup local
- }
- create_ns()
- {
- local ns=$1
- local addr=$2
- local addr6=$3
- ip netns add ${ns}
- ip -netns ${ns} link set lo up
- if [ "${addr}" != "-" ]; then
- ip -netns ${ns} addr add dev lo ${addr}
- fi
- if [ "${addr6}" != "-" ]; then
- ip -netns ${ns} -6 addr add dev lo ${addr6}
- fi
- ip -netns ${ns} ro add unreachable default metric 8192
- ip -netns ${ns} -6 ro add unreachable default metric 8192
- ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1
- ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
- ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1
- ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1
- }
- # create veth pair to connect namespaces and apply addresses.
- connect_ns()
- {
- local ns1=$1
- local ns1_dev=$2
- local ns1_addr=$3
- local ns1_addr6=$4
- local ns2=$5
- local ns2_dev=$6
- local ns2_addr=$7
- local ns2_addr6=$8
- ip -netns ${ns1} li add ${ns1_dev} type veth peer name tmp
- ip -netns ${ns1} li set ${ns1_dev} up
- ip -netns ${ns1} li set tmp netns ${ns2} name ${ns2_dev}
- ip -netns ${ns2} li set ${ns2_dev} up
- if [ "${ns1_addr}" != "-" ]; then
- ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr}
- ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr}
- fi
- if [ "${ns1_addr6}" != "-" ]; then
- ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr6}
- ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr6}
- fi
- }
- cleanup()
- {
- # explicit cleanups to check those code paths
- ip netns | grep -q ${NSA}
- if [ $? -eq 0 ]; then
- ip -netns ${NSA} link delete ${VRF}
- ip -netns ${NSA} ro flush table ${VRF_TABLE}
- ip -netns ${NSA} addr flush dev ${NSA_DEV}
- ip -netns ${NSA} -6 addr flush dev ${NSA_DEV}
- ip -netns ${NSA} link set dev ${NSA_DEV} down
- ip -netns ${NSA} link del dev ${NSA_DEV}
- ip netns pids ${NSA} | xargs kill 2>/dev/null
- ip netns del ${NSA}
- fi
- ip netns pids ${NSB} | xargs kill 2>/dev/null
- ip netns del ${NSB}
- ip netns pids ${NSC} | xargs kill 2>/dev/null
- ip netns del ${NSC} >/dev/null 2>&1
- }
- cleanup_vrf_dup()
- {
- ip link del ${NSA_DEV2} >/dev/null 2>&1
- ip netns pids ${NSC} | xargs kill 2>/dev/null
- ip netns del ${NSC} >/dev/null 2>&1
- }
- setup_vrf_dup()
- {
- # some VRF tests use ns-C which has the same config as
- # ns-B but for a device NOT in the VRF
- create_ns ${NSC} "-" "-"
- connect_ns ${NSA} ${NSA_DEV2} ${NSA_IP}/24 ${NSA_IP6}/64 \
- ${NSC} ${NSC_DEV} ${NSB_IP}/24 ${NSB_IP6}/64
- }
- setup()
- {
- local with_vrf=${1}
- # make sure we are starting with a clean slate
- kill_procs
- cleanup 2>/dev/null
- log_debug "Configuring network namespaces"
- set -e
- create_ns ${NSA} ${NSA_LO_IP}/32 ${NSA_LO_IP6}/128
- create_ns ${NSB} ${NSB_LO_IP}/32 ${NSB_LO_IP6}/128
- connect_ns ${NSA} ${NSA_DEV} ${NSA_IP}/24 ${NSA_IP6}/64 \
- ${NSB} ${NSB_DEV} ${NSB_IP}/24 ${NSB_IP6}/64
- NSA_LINKIP6=$(get_linklocal ${NSA} ${NSA_DEV})
- NSB_LINKIP6=$(get_linklocal ${NSB} ${NSB_DEV})
- # tell ns-A how to get to remote addresses of ns-B
- if [ "${with_vrf}" = "yes" ]; then
- create_vrf ${NSA} ${VRF} ${VRF_TABLE} ${VRF_IP} ${VRF_IP6}
- ip -netns ${NSA} link set dev ${NSA_DEV} vrf ${VRF}
- ip -netns ${NSA} ro add vrf ${VRF} ${NSB_LO_IP}/32 via ${NSB_IP} dev ${NSA_DEV}
- ip -netns ${NSA} -6 ro add vrf ${VRF} ${NSB_LO_IP6}/128 via ${NSB_IP6} dev ${NSA_DEV}
- ip -netns ${NSB} ro add ${VRF_IP}/32 via ${NSA_IP} dev ${NSB_DEV}
- ip -netns ${NSB} -6 ro add ${VRF_IP6}/128 via ${NSA_IP6} dev ${NSB_DEV}
- else
- ip -netns ${NSA} ro add ${NSB_LO_IP}/32 via ${NSB_IP} dev ${NSA_DEV}
- ip -netns ${NSA} ro add ${NSB_LO_IP6}/128 via ${NSB_IP6} dev ${NSA_DEV}
- fi
- # tell ns-B how to get to remote addresses of ns-A
- ip -netns ${NSB} ro add ${NSA_LO_IP}/32 via ${NSA_IP} dev ${NSB_DEV}
- ip -netns ${NSB} ro add ${NSA_LO_IP6}/128 via ${NSA_IP6} dev ${NSB_DEV}
- set +e
- sleep 1
- }
- setup_lla_only()
- {
- # make sure we are starting with a clean slate
- kill_procs
- cleanup 2>/dev/null
- log_debug "Configuring network namespaces"
- set -e
- create_ns ${NSA} "-" "-"
- create_ns ${NSB} "-" "-"
- create_ns ${NSC} "-" "-"
- connect_ns ${NSA} ${NSA_DEV} "-" "-" \
- ${NSB} ${NSB_DEV} "-" "-"
- connect_ns ${NSA} ${NSA_DEV2} "-" "-" \
- ${NSC} ${NSC_DEV} "-" "-"
- NSA_LINKIP6=$(get_linklocal ${NSA} ${NSA_DEV})
- NSB_LINKIP6=$(get_linklocal ${NSB} ${NSB_DEV})
- NSC_LINKIP6=$(get_linklocal ${NSC} ${NSC_DEV})
- create_vrf ${NSA} ${VRF} ${VRF_TABLE} "-" "-"
- ip -netns ${NSA} link set dev ${NSA_DEV} vrf ${VRF}
- ip -netns ${NSA} link set dev ${NSA_DEV2} vrf ${VRF}
- set +e
- sleep 1
- }
- ################################################################################
- # IPv4
- ipv4_ping_novrf()
- {
- local a
- #
- # out
- #
- for a in ${NSB_IP} ${NSB_LO_IP}
- do
- log_start
- run_cmd ping -c1 -w1 ${a}
- log_test_addr ${a} $? 0 "ping out"
- log_start
- run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 0 "ping out, device bind"
- log_start
- run_cmd ping -c1 -w1 -I ${NSA_LO_IP} ${a}
- log_test_addr ${a} $? 0 "ping out, address bind"
- done
- #
- # in
- #
- for a in ${NSA_IP} ${NSA_LO_IP}
- do
- log_start
- run_cmd_nsb ping -c1 -w1 ${a}
- log_test_addr ${a} $? 0 "ping in"
- done
- #
- # local traffic
- #
- for a in ${NSA_IP} ${NSA_LO_IP} 127.0.0.1
- do
- log_start
- run_cmd ping -c1 -w1 ${a}
- log_test_addr ${a} $? 0 "ping local"
- done
- #
- # local traffic, socket bound to device
- #
- # address on device
- a=${NSA_IP}
- log_start
- run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 0 "ping local, device bind"
- # loopback addresses not reachable from device bind
- # fails in a really weird way though because ipv4 special cases
- # route lookups with oif set.
- for a in ${NSA_LO_IP} 127.0.0.1
- do
- log_start
- show_hint "Fails since address on loopback device is out of device scope"
- run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 1 "ping local, device bind"
- done
- #
- # ip rule blocks reachability to remote address
- #
- log_start
- setup_cmd ip rule add pref 32765 from all lookup local
- setup_cmd ip rule del pref 0 from all lookup local
- setup_cmd ip rule add pref 50 to ${NSB_LO_IP} prohibit
- setup_cmd ip rule add pref 51 from ${NSB_IP} prohibit
- a=${NSB_LO_IP}
- run_cmd ping -c1 -w1 ${a}
- log_test_addr ${a} $? 2 "ping out, blocked by rule"
- # NOTE: ipv4 actually allows the lookup to fail and yet still create
- # a viable rtable if the oif (e.g., bind to device) is set, so this
- # case succeeds despite the rule
- # run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
- a=${NSA_LO_IP}
- log_start
- show_hint "Response generates ICMP (or arp request is ignored) due to ip rule"
- run_cmd_nsb ping -c1 -w1 ${a}
- log_test_addr ${a} $? 1 "ping in, blocked by rule"
- [ "$VERBOSE" = "1" ] && echo
- setup_cmd ip rule del pref 32765 from all lookup local
- setup_cmd ip rule add pref 0 from all lookup local
- setup_cmd ip rule del pref 50 to ${NSB_LO_IP} prohibit
- setup_cmd ip rule del pref 51 from ${NSB_IP} prohibit
- #
- # route blocks reachability to remote address
- #
- log_start
- setup_cmd ip route replace unreachable ${NSB_LO_IP}
- setup_cmd ip route replace unreachable ${NSB_IP}
- a=${NSB_LO_IP}
- run_cmd ping -c1 -w1 ${a}
- log_test_addr ${a} $? 2 "ping out, blocked by route"
- # NOTE: ipv4 actually allows the lookup to fail and yet still create
- # a viable rtable if the oif (e.g., bind to device) is set, so this
- # case succeeds despite not having a route for the address
- # run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
- a=${NSA_LO_IP}
- log_start
- show_hint "Response is dropped (or arp request is ignored) due to ip route"
- run_cmd_nsb ping -c1 -w1 ${a}
- log_test_addr ${a} $? 1 "ping in, blocked by route"
- #
- # remove 'remote' routes; fallback to default
- #
- log_start
- setup_cmd ip ro del ${NSB_LO_IP}
- a=${NSB_LO_IP}
- run_cmd ping -c1 -w1 ${a}
- log_test_addr ${a} $? 2 "ping out, unreachable default route"
- # NOTE: ipv4 actually allows the lookup to fail and yet still create
- # a viable rtable if the oif (e.g., bind to device) is set, so this
- # case succeeds despite not having a route for the address
- # run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
- }
- ipv4_ping_vrf()
- {
- local a
- # should default on; does not exist on older kernels
- set_sysctl net.ipv4.raw_l3mdev_accept=1 2>/dev/null
- #
- # out
- #
- for a in ${NSB_IP} ${NSB_LO_IP}
- do
- log_start
- run_cmd ping -c1 -w1 -I ${VRF} ${a}
- log_test_addr ${a} $? 0 "ping out, VRF bind"
- log_start
- run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 0 "ping out, device bind"
- log_start
- run_cmd ip vrf exec ${VRF} ping -c1 -w1 -I ${NSA_IP} ${a}
- log_test_addr ${a} $? 0 "ping out, vrf device + dev address bind"
- log_start
- run_cmd ip vrf exec ${VRF} ping -c1 -w1 -I ${VRF_IP} ${a}
- log_test_addr ${a} $? 0 "ping out, vrf device + vrf address bind"
- done
- #
- # in
- #
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- run_cmd_nsb ping -c1 -w1 ${a}
- log_test_addr ${a} $? 0 "ping in"
- done
- #
- # local traffic, local address
- #
- for a in ${NSA_IP} ${VRF_IP} 127.0.0.1
- do
- log_start
- show_hint "Source address should be ${a}"
- run_cmd ping -c1 -w1 -I ${VRF} ${a}
- log_test_addr ${a} $? 0 "ping local, VRF bind"
- done
- #
- # local traffic, socket bound to device
- #
- # address on device
- a=${NSA_IP}
- log_start
- run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 0 "ping local, device bind"
- # vrf device is out of scope
- for a in ${VRF_IP} 127.0.0.1
- do
- log_start
- show_hint "Fails since address on vrf device is out of device scope"
- run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 2 "ping local, device bind"
- done
- #
- # ip rule blocks address
- #
- log_start
- setup_cmd ip rule add pref 50 to ${NSB_LO_IP} prohibit
- setup_cmd ip rule add pref 51 from ${NSB_IP} prohibit
- a=${NSB_LO_IP}
- run_cmd ping -c1 -w1 -I ${VRF} ${a}
- log_test_addr ${a} $? 2 "ping out, vrf bind, blocked by rule"
- log_start
- run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 2 "ping out, device bind, blocked by rule"
- a=${NSA_LO_IP}
- log_start
- show_hint "Response lost due to ip rule"
- run_cmd_nsb ping -c1 -w1 ${a}
- log_test_addr ${a} $? 1 "ping in, blocked by rule"
- [ "$VERBOSE" = "1" ] && echo
- setup_cmd ip rule del pref 50 to ${NSB_LO_IP} prohibit
- setup_cmd ip rule del pref 51 from ${NSB_IP} prohibit
- #
- # remove 'remote' routes; fallback to default
- #
- log_start
- setup_cmd ip ro del vrf ${VRF} ${NSB_LO_IP}
- a=${NSB_LO_IP}
- run_cmd ping -c1 -w1 -I ${VRF} ${a}
- log_test_addr ${a} $? 2 "ping out, vrf bind, unreachable route"
- log_start
- run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 2 "ping out, device bind, unreachable route"
- a=${NSA_LO_IP}
- log_start
- show_hint "Response lost by unreachable route"
- run_cmd_nsb ping -c1 -w1 ${a}
- log_test_addr ${a} $? 1 "ping in, unreachable route"
- }
- ipv4_ping()
- {
- log_section "IPv4 ping"
- log_subsection "No VRF"
- setup
- set_sysctl net.ipv4.raw_l3mdev_accept=0 2>/dev/null
- ipv4_ping_novrf
- setup
- set_sysctl net.ipv4.raw_l3mdev_accept=1 2>/dev/null
- ipv4_ping_novrf
- setup
- set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null
- ipv4_ping_novrf
- log_subsection "With VRF"
- setup "yes"
- ipv4_ping_vrf
- setup "yes"
- set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null
- ipv4_ping_vrf
- }
- ################################################################################
- # IPv4 TCP
- #
- # MD5 tests without VRF
- #
- ipv4_tcp_md5_novrf()
- {
- #
- # single address
- #
- # basic use case
- log_start
- run_cmd nettest -s -M ${MD5_PW} -m ${NSB_IP} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 0 "MD5: Single address config"
- # client sends MD5, server not configured
- log_start
- show_hint "Should timeout due to MD5 mismatch"
- run_cmd nettest -s &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 2 "MD5: Server no config, client uses password"
- # wrong password
- log_start
- show_hint "Should timeout since client uses wrong password"
- run_cmd nettest -s -M ${MD5_PW} -m ${NSB_IP} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_WRONG_PW}
- log_test $? 2 "MD5: Client uses wrong password"
- # client from different address
- log_start
- show_hint "Should timeout due to MD5 mismatch"
- run_cmd nettest -s -M ${MD5_PW} -m ${NSB_LO_IP} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 2 "MD5: Client address does not match address configured with password"
- #
- # MD5 extension - prefix length
- #
- # client in prefix
- log_start
- run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 0 "MD5: Prefix config"
- # client in prefix, wrong password
- log_start
- show_hint "Should timeout since client uses wrong password"
- run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_WRONG_PW}
- log_test $? 2 "MD5: Prefix config, client uses wrong password"
- # client outside of prefix
- log_start
- show_hint "Should timeout due to MD5 mismatch"
- run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} &
- sleep 1
- run_cmd_nsb nettest -c ${NSB_LO_IP} -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 2 "MD5: Prefix config, client address not in configured prefix"
- }
- #
- # MD5 tests with VRF
- #
- ipv4_tcp_md5()
- {
- #
- # single address
- #
- # basic use case
- log_start
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: Single address config"
- # client sends MD5, server not configured
- log_start
- show_hint "Should timeout since server does not have MD5 auth"
- run_cmd nettest -s -I ${VRF} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 2 "MD5: VRF: Server no config, client uses password"
- # wrong password
- log_start
- show_hint "Should timeout since client uses wrong password"
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_WRONG_PW}
- log_test $? 2 "MD5: VRF: Client uses wrong password"
- # client from different address
- log_start
- show_hint "Should timeout since server config differs from client"
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_LO_IP} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 2 "MD5: VRF: Client address does not match address configured with password"
- #
- # MD5 extension - prefix length
- #
- # client in prefix
- log_start
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: Prefix config"
- # client in prefix, wrong password
- log_start
- show_hint "Should timeout since client uses wrong password"
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_WRONG_PW}
- log_test $? 2 "MD5: VRF: Prefix config, client uses wrong password"
- # client outside of prefix
- log_start
- show_hint "Should timeout since client address is outside of prefix"
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} &
- sleep 1
- run_cmd_nsb nettest -c ${NSB_LO_IP} -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 2 "MD5: VRF: Prefix config, client address not in configured prefix"
- #
- # duplicate config between default VRF and a VRF
- #
- log_start
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP} &
- run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NSB_IP} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: Single address config in default VRF and VRF, conn in VRF"
- log_start
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP} &
- run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NSB_IP} &
- sleep 1
- run_cmd_nsc nettest -r ${NSA_IP} -X ${MD5_WRONG_PW}
- log_test $? 0 "MD5: VRF: Single address config in default VRF and VRF, conn in default VRF"
- log_start
- show_hint "Should timeout since client in default VRF uses VRF password"
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP} &
- run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NSB_IP} &
- sleep 1
- run_cmd_nsc nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 2 "MD5: VRF: Single address config in default VRF and VRF, conn in default VRF with VRF pw"
- log_start
- show_hint "Should timeout since client in VRF uses default VRF password"
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP} &
- run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NSB_IP} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_WRONG_PW}
- log_test $? 2 "MD5: VRF: Single address config in default VRF and VRF, conn in VRF with default VRF pw"
- log_start
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} &
- run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NS_NET} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: Prefix config in default VRF and VRF, conn in VRF"
- log_start
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} &
- run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NS_NET} &
- sleep 1
- run_cmd_nsc nettest -r ${NSA_IP} -X ${MD5_WRONG_PW}
- log_test $? 0 "MD5: VRF: Prefix config in default VRF and VRF, conn in default VRF"
- log_start
- show_hint "Should timeout since client in default VRF uses VRF password"
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} &
- run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NS_NET} &
- sleep 1
- run_cmd_nsc nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 2 "MD5: VRF: Prefix config in default VRF and VRF, conn in default VRF with VRF pw"
- log_start
- show_hint "Should timeout since client in VRF uses default VRF password"
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} &
- run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NS_NET} &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_WRONG_PW}
- log_test $? 2 "MD5: VRF: Prefix config in default VRF and VRF, conn in VRF with default VRF pw"
- #
- # negative tests
- #
- log_start
- run_cmd nettest -s -I ${NSA_DEV} -M ${MD5_PW} -m ${NSB_IP}
- log_test $? 1 "MD5: VRF: Device must be a VRF - single address"
- log_start
- run_cmd nettest -s -I ${NSA_DEV} -M ${MD5_PW} -m ${NS_NET}
- log_test $? 1 "MD5: VRF: Device must be a VRF - prefix"
- test_ipv4_md5_vrf__vrf_server__no_bind_ifindex
- test_ipv4_md5_vrf__global_server__bind_ifindex0
- }
- test_ipv4_md5_vrf__vrf_server__no_bind_ifindex()
- {
- log_start
- show_hint "Simulates applications using VRF without TCP_MD5SIG_FLAG_IFINDEX"
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} --no-bind-key-ifindex &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: VRF-bound server, unbound key accepts connection"
- log_start
- show_hint "Binding both the socket and the key is not required but it works"
- run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} --force-bind-key-ifindex &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: VRF-bound server, bound key accepts connection"
- }
- test_ipv4_md5_vrf__global_server__bind_ifindex0()
- {
- # This particular test needs tcp_l3mdev_accept=1 for Global server to accept VRF connections
- local old_tcp_l3mdev_accept
- old_tcp_l3mdev_accept=$(get_sysctl net.ipv4.tcp_l3mdev_accept)
- set_sysctl net.ipv4.tcp_l3mdev_accept=1
- log_start
- run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} --force-bind-key-ifindex &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 2 "MD5: VRF: Global server, Key bound to ifindex=0 rejects VRF connection"
- log_start
- run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} --force-bind-key-ifindex &
- sleep 1
- run_cmd_nsc nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: Global server, key bound to ifindex=0 accepts non-VRF connection"
- log_start
- run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} --no-bind-key-ifindex &
- sleep 1
- run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: Global server, key not bound to ifindex accepts VRF connection"
- log_start
- run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} --no-bind-key-ifindex &
- sleep 1
- run_cmd_nsc nettest -r ${NSA_IP} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: Global server, key not bound to ifindex accepts non-VRF connection"
- # restore value
- set_sysctl net.ipv4.tcp_l3mdev_accept="$old_tcp_l3mdev_accept"
- }
- ipv4_tcp_novrf()
- {
- local a
- #
- # server tests
- #
- for a in ${NSA_IP} ${NSA_LO_IP}
- do
- log_start
- run_cmd nettest -s &
- sleep 1
- run_cmd_nsb nettest -r ${a}
- log_test_addr ${a} $? 0 "Global server"
- done
- a=${NSA_IP}
- log_start
- run_cmd nettest -s -I ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -r ${a}
- log_test_addr ${a} $? 0 "Device server"
- # verify TCP reset sent and received
- for a in ${NSA_IP} ${NSA_LO_IP}
- do
- log_start
- show_hint "Should fail 'Connection refused' since there is no server"
- run_cmd_nsb nettest -r ${a}
- log_test_addr ${a} $? 1 "No server"
- done
- #
- # client
- #
- for a in ${NSB_IP} ${NSB_LO_IP}
- do
- log_start
- run_cmd_nsb nettest -s &
- sleep 1
- run_cmd nettest -r ${a} -0 ${NSA_IP}
- log_test_addr ${a} $? 0 "Client"
- log_start
- run_cmd_nsb nettest -s &
- sleep 1
- run_cmd nettest -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 0 "Client, device bind"
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -r ${a}
- log_test_addr ${a} $? 1 "No server, unbound client"
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 1 "No server, device client"
- done
- #
- # local address tests
- #
- for a in ${NSA_IP} ${NSA_LO_IP} 127.0.0.1
- do
- log_start
- run_cmd nettest -s &
- sleep 1
- run_cmd nettest -r ${a} -0 ${a} -1 ${a}
- log_test_addr ${a} $? 0 "Global server, local connection"
- done
- a=${NSA_IP}
- log_start
- run_cmd nettest -s -I ${NSA_DEV} &
- sleep 1
- run_cmd nettest -r ${a} -0 ${a}
- log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
- for a in ${NSA_LO_IP} 127.0.0.1
- do
- log_start
- show_hint "Should fail 'Connection refused' since addresses on loopback are out of device scope"
- run_cmd nettest -s -I ${NSA_DEV} &
- sleep 1
- run_cmd nettest -r ${a}
- log_test_addr ${a} $? 1 "Device server, unbound client, local connection"
- done
- a=${NSA_IP}
- log_start
- run_cmd nettest -s &
- sleep 1
- run_cmd nettest -r ${a} -0 ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 0 "Global server, device client, local connection"
- for a in ${NSA_LO_IP} 127.0.0.1
- do
- log_start
- show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope"
- run_cmd nettest -s &
- sleep 1
- run_cmd nettest -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 1 "Global server, device client, local connection"
- done
- a=${NSA_IP}
- log_start
- run_cmd nettest -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -d ${NSA_DEV} -r ${a} -0 ${a}
- log_test_addr ${a} $? 0 "Device server, device client, local connection"
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 1 "No server, device client, local conn"
- [ "$fips_enabled" = "1" ] || ipv4_tcp_md5_novrf
- }
- ipv4_tcp_vrf()
- {
- local a
- # disable global server
- log_subsection "Global server disabled"
- set_sysctl net.ipv4.tcp_l3mdev_accept=0
- #
- # server tests
- #
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- show_hint "Should fail 'Connection refused' since global server with VRF is disabled"
- run_cmd nettest -s &
- sleep 1
- run_cmd_nsb nettest -r ${a}
- log_test_addr ${a} $? 1 "Global server"
- log_start
- run_cmd nettest -s -I ${VRF} -3 ${VRF} &
- sleep 1
- run_cmd_nsb nettest -r ${a}
- log_test_addr ${a} $? 0 "VRF server"
- log_start
- run_cmd nettest -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -r ${a}
- log_test_addr ${a} $? 0 "Device server"
- # verify TCP reset received
- log_start
- show_hint "Should fail 'Connection refused' since there is no server"
- run_cmd_nsb nettest -r ${a}
- log_test_addr ${a} $? 1 "No server"
- done
- # local address tests
- # (${VRF_IP} and 127.0.0.1 both timeout)
- a=${NSA_IP}
- log_start
- show_hint "Should fail 'Connection refused' since global server with VRF is disabled"
- run_cmd nettest -s &
- sleep 1
- run_cmd nettest -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 1 "Global server, local connection"
- # run MD5 tests
- if [ "$fips_enabled" = "0" ]; then
- setup_vrf_dup
- ipv4_tcp_md5
- cleanup_vrf_dup
- fi
- #
- # enable VRF global server
- #
- log_subsection "VRF Global server enabled"
- set_sysctl net.ipv4.tcp_l3mdev_accept=1
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- show_hint "client socket should be bound to VRF"
- run_cmd nettest -s -3 ${VRF} &
- sleep 1
- run_cmd_nsb nettest -r ${a}
- log_test_addr ${a} $? 0 "Global server"
- log_start
- show_hint "client socket should be bound to VRF"
- run_cmd nettest -s -I ${VRF} -3 ${VRF} &
- sleep 1
- run_cmd_nsb nettest -r ${a}
- log_test_addr ${a} $? 0 "VRF server"
- # verify TCP reset received
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd_nsb nettest -r ${a}
- log_test_addr ${a} $? 1 "No server"
- done
- a=${NSA_IP}
- log_start
- show_hint "client socket should be bound to device"
- run_cmd nettest -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -r ${a}
- log_test_addr ${a} $? 0 "Device server"
- # local address tests
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- show_hint "Should fail 'Connection refused' since client is not bound to VRF"
- run_cmd nettest -s -I ${VRF} &
- sleep 1
- run_cmd nettest -r ${a}
- log_test_addr ${a} $? 1 "Global server, local connection"
- done
- #
- # client
- #
- for a in ${NSB_IP} ${NSB_LO_IP}
- do
- log_start
- run_cmd_nsb nettest -s &
- sleep 1
- run_cmd nettest -r ${a} -d ${VRF}
- log_test_addr ${a} $? 0 "Client, VRF bind"
- log_start
- run_cmd_nsb nettest -s &
- sleep 1
- run_cmd nettest -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 0 "Client, device bind"
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -r ${a} -d ${VRF}
- log_test_addr ${a} $? 1 "No server, VRF client"
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 1 "No server, device client"
- done
- for a in ${NSA_IP} ${VRF_IP} 127.0.0.1
- do
- log_start
- run_cmd nettest -s -I ${VRF} -3 ${VRF} &
- sleep 1
- run_cmd nettest -r ${a} -d ${VRF} -0 ${a}
- log_test_addr ${a} $? 0 "VRF server, VRF client, local connection"
- done
- a=${NSA_IP}
- log_start
- run_cmd nettest -s -I ${VRF} -3 ${VRF} &
- sleep 1
- run_cmd nettest -r ${a} -d ${NSA_DEV} -0 ${a}
- log_test_addr ${a} $? 0 "VRF server, device client, local connection"
- log_start
- show_hint "Should fail 'No route to host' since client is out of VRF scope"
- run_cmd nettest -s -I ${VRF} &
- sleep 1
- run_cmd nettest -r ${a}
- log_test_addr ${a} $? 1 "VRF server, unbound client, local connection"
- log_start
- run_cmd nettest -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -r ${a} -d ${VRF} -0 ${a}
- log_test_addr ${a} $? 0 "Device server, VRF client, local connection"
- log_start
- run_cmd nettest -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -r ${a} -d ${NSA_DEV} -0 ${a}
- log_test_addr ${a} $? 0 "Device server, device client, local connection"
- }
- ipv4_tcp()
- {
- log_section "IPv4/TCP"
- log_subsection "No VRF"
- setup
- # tcp_l3mdev_accept should have no affect without VRF;
- # run tests with it enabled and disabled to verify
- log_subsection "tcp_l3mdev_accept disabled"
- set_sysctl net.ipv4.tcp_l3mdev_accept=0
- ipv4_tcp_novrf
- log_subsection "tcp_l3mdev_accept enabled"
- set_sysctl net.ipv4.tcp_l3mdev_accept=1
- ipv4_tcp_novrf
- log_subsection "With VRF"
- setup "yes"
- ipv4_tcp_vrf
- }
- ################################################################################
- # IPv4 UDP
- ipv4_udp_novrf()
- {
- local a
- #
- # server tests
- #
- for a in ${NSA_IP} ${NSA_LO_IP}
- do
- log_start
- run_cmd nettest -D -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -D -r ${a}
- log_test_addr ${a} $? 0 "Global server"
- log_start
- show_hint "Should fail 'Connection refused' since there is no server"
- run_cmd_nsb nettest -D -r ${a}
- log_test_addr ${a} $? 1 "No server"
- done
- a=${NSA_IP}
- log_start
- run_cmd nettest -D -I ${NSA_DEV} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -D -r ${a}
- log_test_addr ${a} $? 0 "Device server"
- #
- # client
- #
- for a in ${NSB_IP} ${NSB_LO_IP}
- do
- log_start
- run_cmd_nsb nettest -D -s &
- sleep 1
- run_cmd nettest -D -r ${a} -0 ${NSA_IP}
- log_test_addr ${a} $? 0 "Client"
- log_start
- run_cmd_nsb nettest -D -s &
- sleep 1
- run_cmd nettest -D -r ${a} -d ${NSA_DEV} -0 ${NSA_IP}
- log_test_addr ${a} $? 0 "Client, device bind"
- log_start
- run_cmd_nsb nettest -D -s &
- sleep 1
- run_cmd nettest -D -r ${a} -d ${NSA_DEV} -C -0 ${NSA_IP}
- log_test_addr ${a} $? 0 "Client, device send via cmsg"
- log_start
- run_cmd_nsb nettest -D -s &
- sleep 1
- run_cmd nettest -D -r ${a} -d ${NSA_DEV} -S -0 ${NSA_IP}
- log_test_addr ${a} $? 0 "Client, device bind via IP_UNICAST_IF"
- log_start
- run_cmd_nsb nettest -D -s &
- sleep 1
- run_cmd nettest -D -r ${a} -d ${NSA_DEV} -S -0 ${NSA_IP} -U
- log_test_addr ${a} $? 0 "Client, device bind via IP_UNICAST_IF, with connect()"
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -D -r ${a}
- log_test_addr ${a} $? 1 "No server, unbound client"
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -D -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 1 "No server, device client"
- done
- #
- # local address tests
- #
- for a in ${NSA_IP} ${NSA_LO_IP} 127.0.0.1
- do
- log_start
- run_cmd nettest -D -s &
- sleep 1
- run_cmd nettest -D -r ${a} -0 ${a} -1 ${a}
- log_test_addr ${a} $? 0 "Global server, local connection"
- done
- a=${NSA_IP}
- log_start
- run_cmd nettest -s -D -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -D -r ${a}
- log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
- for a in ${NSA_LO_IP} 127.0.0.1
- do
- log_start
- show_hint "Should fail 'Connection refused' since address is out of device scope"
- run_cmd nettest -s -D -I ${NSA_DEV} &
- sleep 1
- run_cmd nettest -D -r ${a}
- log_test_addr ${a} $? 1 "Device server, unbound client, local connection"
- done
- a=${NSA_IP}
- log_start
- run_cmd nettest -s -D &
- sleep 1
- run_cmd nettest -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 0 "Global server, device client, local connection"
- log_start
- run_cmd nettest -s -D &
- sleep 1
- run_cmd nettest -D -d ${NSA_DEV} -C -r ${a}
- log_test_addr ${a} $? 0 "Global server, device send via cmsg, local connection"
- log_start
- run_cmd nettest -s -D &
- sleep 1
- run_cmd nettest -D -d ${NSA_DEV} -S -r ${a}
- log_test_addr ${a} $? 0 "Global server, device client via IP_UNICAST_IF, local connection"
- log_start
- run_cmd nettest -s -D &
- sleep 1
- run_cmd nettest -D -d ${NSA_DEV} -S -r ${a} -U
- log_test_addr ${a} $? 0 "Global server, device client via IP_UNICAST_IF, local connection, with connect()"
- # IPv4 with device bind has really weird behavior - it overrides the
- # fib lookup, generates an rtable and tries to send the packet. This
- # causes failures for local traffic at different places
- for a in ${NSA_LO_IP} 127.0.0.1
- do
- log_start
- show_hint "Should fail since addresses on loopback are out of device scope"
- run_cmd nettest -D -s &
- sleep 1
- run_cmd nettest -D -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 2 "Global server, device client, local connection"
- log_start
- show_hint "Should fail since addresses on loopback are out of device scope"
- run_cmd nettest -D -s &
- sleep 1
- run_cmd nettest -D -r ${a} -d ${NSA_DEV} -C
- log_test_addr ${a} $? 1 "Global server, device send via cmsg, local connection"
- log_start
- show_hint "Should fail since addresses on loopback are out of device scope"
- run_cmd nettest -D -s &
- sleep 1
- run_cmd nettest -D -r ${a} -d ${NSA_DEV} -S
- log_test_addr ${a} $? 1 "Global server, device client via IP_UNICAST_IF, local connection"
- log_start
- show_hint "Should fail since addresses on loopback are out of device scope"
- run_cmd nettest -D -s &
- sleep 1
- run_cmd nettest -D -r ${a} -d ${NSA_DEV} -S -U
- log_test_addr ${a} $? 1 "Global server, device client via IP_UNICAST_IF, local connection, with connect()"
- done
- a=${NSA_IP}
- log_start
- run_cmd nettest -D -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -D -d ${NSA_DEV} -r ${a} -0 ${a}
- log_test_addr ${a} $? 0 "Device server, device client, local conn"
- log_start
- run_cmd nettest -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 2 "No server, device client, local conn"
- }
- ipv4_udp_vrf()
- {
- local a
- # disable global server
- log_subsection "Global server disabled"
- set_sysctl net.ipv4.udp_l3mdev_accept=0
- #
- # server tests
- #
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- show_hint "Fails because ingress is in a VRF and global server is disabled"
- run_cmd nettest -D -s &
- sleep 1
- run_cmd_nsb nettest -D -r ${a}
- log_test_addr ${a} $? 1 "Global server"
- log_start
- run_cmd nettest -D -I ${VRF} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -D -r ${a}
- log_test_addr ${a} $? 0 "VRF server"
- log_start
- run_cmd nettest -D -I ${NSA_DEV} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -D -r ${a}
- log_test_addr ${a} $? 0 "Enslaved device server"
- log_start
- show_hint "Should fail 'Connection refused' since there is no server"
- run_cmd_nsb nettest -D -r ${a}
- log_test_addr ${a} $? 1 "No server"
- log_start
- show_hint "Should fail 'Connection refused' since global server is out of scope"
- run_cmd nettest -D -s &
- sleep 1
- run_cmd nettest -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 1 "Global server, VRF client, local connection"
- done
- a=${NSA_IP}
- log_start
- run_cmd nettest -s -D -I ${VRF} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
- log_start
- run_cmd nettest -s -D -I ${VRF} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 0 "VRF server, enslaved device client, local connection"
- a=${NSA_IP}
- log_start
- run_cmd nettest -s -D -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "Enslaved device server, VRF client, local conn"
- log_start
- run_cmd nettest -s -D -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 0 "Enslaved device server, device client, local conn"
- # enable global server
- log_subsection "Global server enabled"
- set_sysctl net.ipv4.udp_l3mdev_accept=1
- #
- # server tests
- #
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- run_cmd nettest -D -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -D -r ${a}
- log_test_addr ${a} $? 0 "Global server"
- log_start
- run_cmd nettest -D -I ${VRF} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -D -r ${a}
- log_test_addr ${a} $? 0 "VRF server"
- log_start
- run_cmd nettest -D -I ${NSA_DEV} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -D -r ${a}
- log_test_addr ${a} $? 0 "Enslaved device server"
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd_nsb nettest -D -r ${a}
- log_test_addr ${a} $? 1 "No server"
- done
- #
- # client tests
- #
- log_start
- run_cmd_nsb nettest -D -s &
- sleep 1
- run_cmd nettest -d ${VRF} -D -r ${NSB_IP} -1 ${NSA_IP}
- log_test $? 0 "VRF client"
- log_start
- run_cmd_nsb nettest -D -s &
- sleep 1
- run_cmd nettest -d ${NSA_DEV} -D -r ${NSB_IP} -1 ${NSA_IP}
- log_test $? 0 "Enslaved device client"
- # negative test - should fail
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -D -d ${VRF} -r ${NSB_IP}
- log_test $? 1 "No server, VRF client"
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -D -d ${NSA_DEV} -r ${NSB_IP}
- log_test $? 1 "No server, enslaved device client"
- #
- # local address tests
- #
- a=${NSA_IP}
- log_start
- run_cmd nettest -D -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "Global server, VRF client, local conn"
- log_start
- run_cmd nettest -s -D -I ${VRF} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
- log_start
- run_cmd nettest -s -D -I ${VRF} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 0 "VRF server, device client, local conn"
- log_start
- run_cmd nettest -s -D -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "Enslaved device server, VRF client, local conn"
- log_start
- run_cmd nettest -s -D -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 0 "Enslaved device server, device client, local conn"
- for a in ${VRF_IP} 127.0.0.1
- do
- log_start
- run_cmd nettest -D -s -3 ${VRF} &
- sleep 1
- run_cmd nettest -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "Global server, VRF client, local conn"
- done
- for a in ${VRF_IP} 127.0.0.1
- do
- log_start
- run_cmd nettest -s -D -I ${VRF} -3 ${VRF} &
- sleep 1
- run_cmd nettest -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
- done
- # negative test - should fail
- # verifies ECONNREFUSED
- for a in ${NSA_IP} ${VRF_IP} 127.0.0.1
- do
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 1 "No server, VRF client, local conn"
- done
- }
- ipv4_udp()
- {
- log_section "IPv4/UDP"
- log_subsection "No VRF"
- setup
- # udp_l3mdev_accept should have no affect without VRF;
- # run tests with it enabled and disabled to verify
- log_subsection "udp_l3mdev_accept disabled"
- set_sysctl net.ipv4.udp_l3mdev_accept=0
- ipv4_udp_novrf
- log_subsection "udp_l3mdev_accept enabled"
- set_sysctl net.ipv4.udp_l3mdev_accept=1
- ipv4_udp_novrf
- log_subsection "With VRF"
- setup "yes"
- ipv4_udp_vrf
- }
- ################################################################################
- # IPv4 address bind
- #
- # verifies ability or inability to bind to an address / device
- ipv4_addr_bind_novrf()
- {
- #
- # raw socket
- #
- for a in ${NSA_IP} ${NSA_LO_IP}
- do
- log_start
- run_cmd nettest -s -R -P icmp -l ${a} -b
- log_test_addr ${a} $? 0 "Raw socket bind to local address"
- log_start
- run_cmd nettest -s -R -P icmp -l ${a} -I ${NSA_DEV} -b
- log_test_addr ${a} $? 0 "Raw socket bind to local address after device bind"
- done
- #
- # tests for nonlocal bind
- #
- a=${NL_IP}
- log_start
- run_cmd nettest -s -R -f -l ${a} -b
- log_test_addr ${a} $? 0 "Raw socket bind to nonlocal address"
- log_start
- run_cmd nettest -s -f -l ${a} -b
- log_test_addr ${a} $? 0 "TCP socket bind to nonlocal address"
- log_start
- run_cmd nettest -s -D -P icmp -f -l ${a} -b
- log_test_addr ${a} $? 0 "ICMP socket bind to nonlocal address"
- #
- # check that ICMP sockets cannot bind to broadcast and multicast addresses
- #
- a=${BCAST_IP}
- log_start
- run_cmd nettest -s -D -P icmp -l ${a} -b
- log_test_addr ${a} $? 1 "ICMP socket bind to broadcast address"
- a=${MCAST_IP}
- log_start
- run_cmd nettest -s -D -P icmp -l ${a} -b
- log_test_addr ${a} $? 1 "ICMP socket bind to multicast address"
- #
- # tcp sockets
- #
- a=${NSA_IP}
- log_start
- run_cmd nettest -c ${a} -r ${NSB_IP} -t1 -b
- log_test_addr ${a} $? 0 "TCP socket bind to local address"
- log_start
- run_cmd nettest -c ${a} -r ${NSB_IP} -d ${NSA_DEV} -t1 -b
- log_test_addr ${a} $? 0 "TCP socket bind to local address after device bind"
- # Sadly, the kernel allows binding a socket to a device and then
- # binding to an address not on the device. The only restriction
- # is that the address is valid in the L3 domain. So this test
- # passes when it really should not
- #a=${NSA_LO_IP}
- #log_start
- #show_hint "Should fail with 'Cannot assign requested address'"
- #run_cmd nettest -s -l ${a} -I ${NSA_DEV} -t1 -b
- #log_test_addr ${a} $? 1 "TCP socket bind to out of scope local address"
- }
- ipv4_addr_bind_vrf()
- {
- #
- # raw socket
- #
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- show_hint "Socket not bound to VRF, but address is in VRF"
- run_cmd nettest -s -R -P icmp -l ${a} -b
- log_test_addr ${a} $? 1 "Raw socket bind to local address"
- log_start
- run_cmd nettest -s -R -P icmp -l ${a} -I ${NSA_DEV} -b
- log_test_addr ${a} $? 0 "Raw socket bind to local address after device bind"
- log_start
- run_cmd nettest -s -R -P icmp -l ${a} -I ${VRF} -b
- log_test_addr ${a} $? 0 "Raw socket bind to local address after VRF bind"
- done
- a=${NSA_LO_IP}
- log_start
- show_hint "Address on loopback is out of VRF scope"
- run_cmd nettest -s -R -P icmp -l ${a} -I ${VRF} -b
- log_test_addr ${a} $? 1 "Raw socket bind to out of scope address after VRF bind"
- #
- # tests for nonlocal bind
- #
- a=${NL_IP}
- log_start
- run_cmd nettest -s -R -f -l ${a} -I ${VRF} -b
- log_test_addr ${a} $? 0 "Raw socket bind to nonlocal address after VRF bind"
- log_start
- run_cmd nettest -s -f -l ${a} -I ${VRF} -b
- log_test_addr ${a} $? 0 "TCP socket bind to nonlocal address after VRF bind"
- log_start
- run_cmd nettest -s -D -P icmp -f -l ${a} -I ${VRF} -b
- log_test_addr ${a} $? 0 "ICMP socket bind to nonlocal address after VRF bind"
- #
- # check that ICMP sockets cannot bind to broadcast and multicast addresses
- #
- a=${BCAST_IP}
- log_start
- run_cmd nettest -s -D -P icmp -l ${a} -I ${VRF} -b
- log_test_addr ${a} $? 1 "ICMP socket bind to broadcast address after VRF bind"
- a=${MCAST_IP}
- log_start
- run_cmd nettest -s -D -P icmp -l ${a} -I ${VRF} -b
- log_test_addr ${a} $? 1 "ICMP socket bind to multicast address after VRF bind"
- #
- # tcp sockets
- #
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- run_cmd nettest -s -l ${a} -I ${VRF} -t1 -b
- log_test_addr ${a} $? 0 "TCP socket bind to local address"
- log_start
- run_cmd nettest -s -l ${a} -I ${NSA_DEV} -t1 -b
- log_test_addr ${a} $? 0 "TCP socket bind to local address after device bind"
- done
- a=${NSA_LO_IP}
- log_start
- show_hint "Address on loopback out of scope for VRF"
- run_cmd nettest -s -l ${a} -I ${VRF} -t1 -b
- log_test_addr ${a} $? 1 "TCP socket bind to invalid local address for VRF"
- log_start
- show_hint "Address on loopback out of scope for device in VRF"
- run_cmd nettest -s -l ${a} -I ${NSA_DEV} -t1 -b
- log_test_addr ${a} $? 1 "TCP socket bind to invalid local address for device bind"
- }
- ipv4_addr_bind()
- {
- log_section "IPv4 address binds"
- log_subsection "No VRF"
- setup
- set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null
- ipv4_addr_bind_novrf
- log_subsection "With VRF"
- setup "yes"
- set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null
- ipv4_addr_bind_vrf
- }
- ################################################################################
- # IPv4 runtime tests
- ipv4_rt()
- {
- local desc="$1"
- local varg="$2"
- local with_vrf="yes"
- local a
- #
- # server tests
- #
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- run_cmd nettest ${varg} -s &
- sleep 1
- run_cmd_nsb nettest ${varg} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, global server"
- setup ${with_vrf}
- done
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- run_cmd nettest ${varg} -s -I ${VRF} &
- sleep 1
- run_cmd_nsb nettest ${varg} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, VRF server"
- setup ${with_vrf}
- done
- a=${NSA_IP}
- log_start
- run_cmd nettest ${varg} -s -I ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest ${varg} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, enslaved device server"
- setup ${with_vrf}
- #
- # client test
- #
- log_start
- run_cmd_nsb nettest ${varg} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${VRF} -r ${NSB_IP} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, VRF client"
- setup ${with_vrf}
- log_start
- run_cmd_nsb nettest ${varg} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${NSA_DEV} -r ${NSB_IP} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, enslaved device client"
- setup ${with_vrf}
- #
- # local address tests
- #
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- run_cmd nettest ${varg} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${VRF} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, global server, VRF client, local"
- setup ${with_vrf}
- done
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- run_cmd nettest ${varg} -I ${VRF} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${VRF} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, VRF server and client, local"
- setup ${with_vrf}
- done
- a=${NSA_IP}
- log_start
- run_cmd nettest ${varg} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, global server, enslaved device client, local"
- setup ${with_vrf}
- log_start
- run_cmd nettest ${varg} -I ${VRF} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, VRF server, enslaved device client, local"
- setup ${with_vrf}
- log_start
- run_cmd nettest ${varg} -I ${NSA_DEV} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, enslaved device server and client, local"
- }
- ipv4_ping_rt()
- {
- local with_vrf="yes"
- local a
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- run_cmd_nsb ping -f ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "Device delete with active traffic - ping in"
- setup ${with_vrf}
- done
- a=${NSB_IP}
- log_start
- run_cmd ping -f -I ${VRF} ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "Device delete with active traffic - ping out"
- }
- ipv4_runtime()
- {
- log_section "Run time tests - ipv4"
- setup "yes"
- ipv4_ping_rt
- setup "yes"
- ipv4_rt "TCP active socket" "-n -1"
- setup "yes"
- ipv4_rt "TCP passive socket" "-i"
- }
- ################################################################################
- # IPv6
- ipv6_ping_novrf()
- {
- local a
- # should not have an impact, but make a known state
- set_sysctl net.ipv4.raw_l3mdev_accept=0 2>/dev/null
- #
- # out
- #
- for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
- do
- log_start
- run_cmd ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 0 "ping out"
- done
- for a in ${NSB_IP6} ${NSB_LO_IP6}
- do
- log_start
- run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 0 "ping out, device bind"
- log_start
- run_cmd ${ping6} -c1 -w1 -I ${NSA_LO_IP6} ${a}
- log_test_addr ${a} $? 0 "ping out, loopback address bind"
- done
- #
- # in
- #
- for a in ${NSA_IP6} ${NSA_LO_IP6} ${NSA_LINKIP6}%${NSB_DEV} ${MCAST}%${NSB_DEV}
- do
- log_start
- run_cmd_nsb ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 0 "ping in"
- done
- #
- # local traffic, local address
- #
- for a in ${NSA_IP6} ${NSA_LO_IP6} ::1 ${NSA_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
- do
- log_start
- run_cmd ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 0 "ping local, no bind"
- done
- for a in ${NSA_IP6} ${NSA_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
- do
- log_start
- run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 0 "ping local, device bind"
- done
- for a in ${NSA_LO_IP6} ::1
- do
- log_start
- show_hint "Fails since address on loopback is out of device scope"
- run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 2 "ping local, device bind"
- done
- #
- # ip rule blocks address
- #
- log_start
- setup_cmd ip -6 rule add pref 32765 from all lookup local
- setup_cmd ip -6 rule del pref 0 from all lookup local
- setup_cmd ip -6 rule add pref 50 to ${NSB_LO_IP6} prohibit
- setup_cmd ip -6 rule add pref 51 from ${NSB_IP6} prohibit
- a=${NSB_LO_IP6}
- run_cmd ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 2 "ping out, blocked by rule"
- log_start
- run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 2 "ping out, device bind, blocked by rule"
- a=${NSA_LO_IP6}
- log_start
- show_hint "Response lost due to ip rule"
- run_cmd_nsb ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 1 "ping in, blocked by rule"
- setup_cmd ip -6 rule add pref 0 from all lookup local
- setup_cmd ip -6 rule del pref 32765 from all lookup local
- setup_cmd ip -6 rule del pref 50 to ${NSB_LO_IP6} prohibit
- setup_cmd ip -6 rule del pref 51 from ${NSB_IP6} prohibit
- #
- # route blocks reachability to remote address
- #
- log_start
- setup_cmd ip -6 route del ${NSB_LO_IP6}
- setup_cmd ip -6 route add unreachable ${NSB_LO_IP6} metric 10
- setup_cmd ip -6 route add unreachable ${NSB_IP6} metric 10
- a=${NSB_LO_IP6}
- run_cmd ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 2 "ping out, blocked by route"
- log_start
- run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 2 "ping out, device bind, blocked by route"
- a=${NSA_LO_IP6}
- log_start
- show_hint "Response lost due to ip route"
- run_cmd_nsb ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 1 "ping in, blocked by route"
- #
- # remove 'remote' routes; fallback to default
- #
- log_start
- setup_cmd ip -6 ro del unreachable ${NSB_LO_IP6}
- setup_cmd ip -6 ro del unreachable ${NSB_IP6}
- a=${NSB_LO_IP6}
- run_cmd ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 2 "ping out, unreachable route"
- log_start
- run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 2 "ping out, device bind, unreachable route"
- }
- ipv6_ping_vrf()
- {
- local a
- # should default on; does not exist on older kernels
- set_sysctl net.ipv4.raw_l3mdev_accept=1 2>/dev/null
- #
- # out
- #
- for a in ${NSB_IP6} ${NSB_LO_IP6}
- do
- log_start
- run_cmd ${ping6} -c1 -w1 -I ${VRF} ${a}
- log_test_addr ${a} $? 0 "ping out, VRF bind"
- done
- for a in ${NSB_LINKIP6}%${VRF} ${MCAST}%${VRF}
- do
- log_start
- show_hint "Fails since VRF device does not support linklocal or multicast"
- run_cmd ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 1 "ping out, VRF bind"
- done
- for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
- do
- log_start
- run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 0 "ping out, device bind"
- done
- for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
- do
- log_start
- run_cmd ip vrf exec ${VRF} ${ping6} -c1 -w1 -I ${VRF_IP6} ${a}
- log_test_addr ${a} $? 0 "ping out, vrf device+address bind"
- done
- #
- # in
- #
- for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV} ${MCAST}%${NSB_DEV}
- do
- log_start
- run_cmd_nsb ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 0 "ping in"
- done
- a=${NSA_LO_IP6}
- log_start
- show_hint "Fails since loopback address is out of VRF scope"
- run_cmd_nsb ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 1 "ping in"
- #
- # local traffic, local address
- #
- for a in ${NSA_IP6} ${VRF_IP6} ::1
- do
- log_start
- show_hint "Source address should be ${a}"
- run_cmd ${ping6} -c1 -w1 -I ${VRF} ${a}
- log_test_addr ${a} $? 0 "ping local, VRF bind"
- done
- for a in ${NSA_IP6} ${NSA_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
- do
- log_start
- run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 0 "ping local, device bind"
- done
- # LLA to GUA - remove ipv6 global addresses from ns-B
- setup_cmd_nsb ip -6 addr del ${NSB_IP6}/64 dev ${NSB_DEV}
- setup_cmd_nsb ip -6 addr del ${NSB_LO_IP6}/128 dev lo
- setup_cmd_nsb ip -6 ro add ${NSA_IP6}/128 via ${NSA_LINKIP6} dev ${NSB_DEV}
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd_nsb ${ping6} -c1 -w1 ${NSA_IP6}
- log_test_addr ${a} $? 0 "ping in, LLA to GUA"
- done
- setup_cmd_nsb ip -6 ro del ${NSA_IP6}/128 via ${NSA_LINKIP6} dev ${NSB_DEV}
- setup_cmd_nsb ip -6 addr add ${NSB_IP6}/64 dev ${NSB_DEV}
- setup_cmd_nsb ip -6 addr add ${NSB_LO_IP6}/128 dev lo
- #
- # ip rule blocks address
- #
- log_start
- setup_cmd ip -6 rule add pref 50 to ${NSB_LO_IP6} prohibit
- setup_cmd ip -6 rule add pref 51 from ${NSB_IP6} prohibit
- a=${NSB_LO_IP6}
- run_cmd ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 2 "ping out, blocked by rule"
- log_start
- run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 2 "ping out, device bind, blocked by rule"
- a=${NSA_LO_IP6}
- log_start
- show_hint "Response lost due to ip rule"
- run_cmd_nsb ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 1 "ping in, blocked by rule"
- log_start
- setup_cmd ip -6 rule del pref 50 to ${NSB_LO_IP6} prohibit
- setup_cmd ip -6 rule del pref 51 from ${NSB_IP6} prohibit
- #
- # remove 'remote' routes; fallback to default
- #
- log_start
- setup_cmd ip -6 ro del ${NSB_LO_IP6} vrf ${VRF}
- a=${NSB_LO_IP6}
- run_cmd ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 2 "ping out, unreachable route"
- log_start
- run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
- log_test_addr ${a} $? 2 "ping out, device bind, unreachable route"
- ip -netns ${NSB} -6 ro del ${NSA_LO_IP6}
- a=${NSA_LO_IP6}
- log_start
- run_cmd_nsb ${ping6} -c1 -w1 ${a}
- log_test_addr ${a} $? 2 "ping in, unreachable route"
- }
- ipv6_ping()
- {
- log_section "IPv6 ping"
- log_subsection "No VRF"
- setup
- ipv6_ping_novrf
- setup
- set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null
- ipv6_ping_novrf
- log_subsection "With VRF"
- setup "yes"
- ipv6_ping_vrf
- setup "yes"
- set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null
- ipv6_ping_vrf
- }
- ################################################################################
- # IPv6 TCP
- #
- # MD5 tests without VRF
- #
- ipv6_tcp_md5_novrf()
- {
- #
- # single address
- #
- # basic use case
- log_start
- run_cmd nettest -6 -s -M ${MD5_PW} -m ${NSB_IP6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 0 "MD5: Single address config"
- # client sends MD5, server not configured
- log_start
- show_hint "Should timeout due to MD5 mismatch"
- run_cmd nettest -6 -s &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 2 "MD5: Server no config, client uses password"
- # wrong password
- log_start
- show_hint "Should timeout since client uses wrong password"
- run_cmd nettest -6 -s -M ${MD5_PW} -m ${NSB_IP6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW}
- log_test $? 2 "MD5: Client uses wrong password"
- # client from different address
- log_start
- show_hint "Should timeout due to MD5 mismatch"
- run_cmd nettest -6 -s -M ${MD5_PW} -m ${NSB_LO_IP6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 2 "MD5: Client address does not match address configured with password"
- #
- # MD5 extension - prefix length
- #
- # client in prefix
- log_start
- run_cmd nettest -6 -s -M ${MD5_PW} -m ${NS_NET6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 0 "MD5: Prefix config"
- # client in prefix, wrong password
- log_start
- show_hint "Should timeout since client uses wrong password"
- run_cmd nettest -6 -s -M ${MD5_PW} -m ${NS_NET6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW}
- log_test $? 2 "MD5: Prefix config, client uses wrong password"
- # client outside of prefix
- log_start
- show_hint "Should timeout due to MD5 mismatch"
- run_cmd nettest -6 -s -M ${MD5_PW} -m ${NS_NET6} &
- sleep 1
- run_cmd_nsb nettest -6 -c ${NSB_LO_IP6} -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 2 "MD5: Prefix config, client address not in configured prefix"
- }
- #
- # MD5 tests with VRF
- #
- ipv6_tcp_md5()
- {
- #
- # single address
- #
- # basic use case
- log_start
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: Single address config"
- # client sends MD5, server not configured
- log_start
- show_hint "Should timeout since server does not have MD5 auth"
- run_cmd nettest -6 -s -I ${VRF} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 2 "MD5: VRF: Server no config, client uses password"
- # wrong password
- log_start
- show_hint "Should timeout since client uses wrong password"
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW}
- log_test $? 2 "MD5: VRF: Client uses wrong password"
- # client from different address
- log_start
- show_hint "Should timeout since server config differs from client"
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_LO_IP6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 2 "MD5: VRF: Client address does not match address configured with password"
- #
- # MD5 extension - prefix length
- #
- # client in prefix
- log_start
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: Prefix config"
- # client in prefix, wrong password
- log_start
- show_hint "Should timeout since client uses wrong password"
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW}
- log_test $? 2 "MD5: VRF: Prefix config, client uses wrong password"
- # client outside of prefix
- log_start
- show_hint "Should timeout since client address is outside of prefix"
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} &
- sleep 1
- run_cmd_nsb nettest -6 -c ${NSB_LO_IP6} -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 2 "MD5: VRF: Prefix config, client address not in configured prefix"
- #
- # duplicate config between default VRF and a VRF
- #
- log_start
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP6} &
- run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NSB_IP6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: Single address config in default VRF and VRF, conn in VRF"
- log_start
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP6} &
- run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NSB_IP6} &
- sleep 1
- run_cmd_nsc nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW}
- log_test $? 0 "MD5: VRF: Single address config in default VRF and VRF, conn in default VRF"
- log_start
- show_hint "Should timeout since client in default VRF uses VRF password"
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP6} &
- run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NSB_IP6} &
- sleep 1
- run_cmd_nsc nettest -6 -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 2 "MD5: VRF: Single address config in default VRF and VRF, conn in default VRF with VRF pw"
- log_start
- show_hint "Should timeout since client in VRF uses default VRF password"
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP6} &
- run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NSB_IP6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW}
- log_test $? 2 "MD5: VRF: Single address config in default VRF and VRF, conn in VRF with default VRF pw"
- log_start
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} &
- run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NS_NET6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 0 "MD5: VRF: Prefix config in default VRF and VRF, conn in VRF"
- log_start
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} &
- run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NS_NET6} &
- sleep 1
- run_cmd_nsc nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW}
- log_test $? 0 "MD5: VRF: Prefix config in default VRF and VRF, conn in default VRF"
- log_start
- show_hint "Should timeout since client in default VRF uses VRF password"
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} &
- run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NS_NET6} &
- sleep 1
- run_cmd_nsc nettest -6 -r ${NSA_IP6} -X ${MD5_PW}
- log_test $? 2 "MD5: VRF: Prefix config in default VRF and VRF, conn in default VRF with VRF pw"
- log_start
- show_hint "Should timeout since client in VRF uses default VRF password"
- run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} &
- run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NS_NET6} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW}
- log_test $? 2 "MD5: VRF: Prefix config in default VRF and VRF, conn in VRF with default VRF pw"
- #
- # negative tests
- #
- log_start
- run_cmd nettest -6 -s -I ${NSA_DEV} -M ${MD5_PW} -m ${NSB_IP6}
- log_test $? 1 "MD5: VRF: Device must be a VRF - single address"
- log_start
- run_cmd nettest -6 -s -I ${NSA_DEV} -M ${MD5_PW} -m ${NS_NET6}
- log_test $? 1 "MD5: VRF: Device must be a VRF - prefix"
- }
- ipv6_tcp_novrf()
- {
- local a
- #
- # server tests
- #
- for a in ${NSA_IP6} ${NSA_LO_IP6} ${NSA_LINKIP6}%${NSB_DEV}
- do
- log_start
- run_cmd nettest -6 -s &
- sleep 1
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 0 "Global server"
- done
- # verify TCP reset received
- for a in ${NSA_IP6} ${NSA_LO_IP6} ${NSA_LINKIP6}%${NSB_DEV}
- do
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 1 "No server"
- done
- #
- # client
- #
- for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
- do
- log_start
- run_cmd_nsb nettest -6 -s &
- sleep 1
- run_cmd nettest -6 -r ${a}
- log_test_addr ${a} $? 0 "Client"
- done
- for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
- do
- log_start
- run_cmd_nsb nettest -6 -s &
- sleep 1
- run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 0 "Client, device bind"
- done
- for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
- do
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 1 "No server, device client"
- done
- #
- # local address tests
- #
- for a in ${NSA_IP6} ${NSA_LO_IP6} ::1
- do
- log_start
- run_cmd nettest -6 -s &
- sleep 1
- run_cmd nettest -6 -r ${a}
- log_test_addr ${a} $? 0 "Global server, local connection"
- done
- a=${NSA_IP6}
- log_start
- run_cmd nettest -6 -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -r ${a} -0 ${a}
- log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
- for a in ${NSA_LO_IP6} ::1
- do
- log_start
- show_hint "Should fail 'Connection refused' since addresses on loopback are out of device scope"
- run_cmd nettest -6 -s -I ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -r ${a}
- log_test_addr ${a} $? 1 "Device server, unbound client, local connection"
- done
- a=${NSA_IP6}
- log_start
- run_cmd nettest -6 -s &
- sleep 1
- run_cmd nettest -6 -r ${a} -d ${NSA_DEV} -0 ${a}
- log_test_addr ${a} $? 0 "Global server, device client, local connection"
- for a in ${NSA_LO_IP6} ::1
- do
- log_start
- show_hint "Should fail 'Connection refused' since addresses on loopback are out of device scope"
- run_cmd nettest -6 -s &
- sleep 1
- run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 1 "Global server, device client, local connection"
- done
- for a in ${NSA_IP6} ${NSA_LINKIP6}
- do
- log_start
- run_cmd nettest -6 -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 0 "Device server, device client, local conn"
- done
- for a in ${NSA_IP6} ${NSA_LINKIP6}
- do
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -6 -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 1 "No server, device client, local conn"
- done
- [ "$fips_enabled" = "1" ] || ipv6_tcp_md5_novrf
- }
- ipv6_tcp_vrf()
- {
- local a
- # disable global server
- log_subsection "Global server disabled"
- set_sysctl net.ipv4.tcp_l3mdev_accept=0
- #
- # server tests
- #
- for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV}
- do
- log_start
- show_hint "Should fail 'Connection refused' since global server with VRF is disabled"
- run_cmd nettest -6 -s &
- sleep 1
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 1 "Global server"
- done
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -s -I ${VRF} -3 ${VRF} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 0 "VRF server"
- done
- # link local is always bound to ingress device
- a=${NSA_LINKIP6}%${NSB_DEV}
- log_start
- run_cmd nettest -6 -s -I ${VRF} -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 0 "VRF server"
- for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV}
- do
- log_start
- run_cmd nettest -6 -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 0 "Device server"
- done
- # verify TCP reset received
- for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV}
- do
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 1 "No server"
- done
- # local address tests
- a=${NSA_IP6}
- log_start
- show_hint "Should fail 'Connection refused' since global server with VRF is disabled"
- run_cmd nettest -6 -s &
- sleep 1
- run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 1 "Global server, local connection"
- # run MD5 tests
- if [ "$fips_enabled" = "0" ]; then
- setup_vrf_dup
- ipv6_tcp_md5
- cleanup_vrf_dup
- fi
- #
- # enable VRF global server
- #
- log_subsection "VRF Global server enabled"
- set_sysctl net.ipv4.tcp_l3mdev_accept=1
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -s -3 ${VRF} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 0 "Global server"
- done
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -s -I ${VRF} -3 ${VRF} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 0 "VRF server"
- done
- # For LLA, child socket is bound to device
- a=${NSA_LINKIP6}%${NSB_DEV}
- log_start
- run_cmd nettest -6 -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 0 "Global server"
- log_start
- run_cmd nettest -6 -s -I ${VRF} -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 0 "VRF server"
- for a in ${NSA_IP6} ${NSA_LINKIP6}%${NSB_DEV}
- do
- log_start
- run_cmd nettest -6 -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 0 "Device server"
- done
- # verify TCP reset received
- for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV}
- do
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 1 "No server"
- done
- # local address tests
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- show_hint "Fails 'Connection refused' since client is not in VRF"
- run_cmd nettest -6 -s -I ${VRF} &
- sleep 1
- run_cmd nettest -6 -r ${a}
- log_test_addr ${a} $? 1 "Global server, local connection"
- done
- #
- # client
- #
- for a in ${NSB_IP6} ${NSB_LO_IP6}
- do
- log_start
- run_cmd_nsb nettest -6 -s &
- sleep 1
- run_cmd nettest -6 -r ${a} -d ${VRF}
- log_test_addr ${a} $? 0 "Client, VRF bind"
- done
- a=${NSB_LINKIP6}
- log_start
- show_hint "Fails since VRF device does not allow linklocal addresses"
- run_cmd_nsb nettest -6 -s &
- sleep 1
- run_cmd nettest -6 -r ${a} -d ${VRF}
- log_test_addr ${a} $? 1 "Client, VRF bind"
- for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}
- do
- log_start
- run_cmd_nsb nettest -6 -s &
- sleep 1
- run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 0 "Client, device bind"
- done
- for a in ${NSB_IP6} ${NSB_LO_IP6}
- do
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -6 -r ${a} -d ${VRF}
- log_test_addr ${a} $? 1 "No server, VRF client"
- done
- for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}
- do
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 1 "No server, device client"
- done
- for a in ${NSA_IP6} ${VRF_IP6} ::1
- do
- log_start
- run_cmd nettest -6 -s -I ${VRF} -3 ${VRF} &
- sleep 1
- run_cmd nettest -6 -r ${a} -d ${VRF} -0 ${a}
- log_test_addr ${a} $? 0 "VRF server, VRF client, local connection"
- done
- a=${NSA_IP6}
- log_start
- run_cmd nettest -6 -s -I ${VRF} -3 ${VRF} &
- sleep 1
- run_cmd nettest -6 -r ${a} -d ${NSA_DEV} -0 ${a}
- log_test_addr ${a} $? 0 "VRF server, device client, local connection"
- a=${NSA_IP6}
- log_start
- show_hint "Should fail since unbound client is out of VRF scope"
- run_cmd nettest -6 -s -I ${VRF} &
- sleep 1
- run_cmd nettest -6 -r ${a}
- log_test_addr ${a} $? 1 "VRF server, unbound client, local connection"
- log_start
- run_cmd nettest -6 -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -r ${a} -d ${VRF} -0 ${a}
- log_test_addr ${a} $? 0 "Device server, VRF client, local connection"
- for a in ${NSA_IP6} ${NSA_LINKIP6}
- do
- log_start
- run_cmd nettest -6 -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -r ${a} -d ${NSA_DEV} -0 ${a}
- log_test_addr ${a} $? 0 "Device server, device client, local connection"
- done
- }
- ipv6_tcp()
- {
- log_section "IPv6/TCP"
- log_subsection "No VRF"
- setup
- # tcp_l3mdev_accept should have no affect without VRF;
- # run tests with it enabled and disabled to verify
- log_subsection "tcp_l3mdev_accept disabled"
- set_sysctl net.ipv4.tcp_l3mdev_accept=0
- ipv6_tcp_novrf
- log_subsection "tcp_l3mdev_accept enabled"
- set_sysctl net.ipv4.tcp_l3mdev_accept=1
- ipv6_tcp_novrf
- log_subsection "With VRF"
- setup "yes"
- ipv6_tcp_vrf
- }
- ################################################################################
- # IPv6 UDP
- ipv6_udp_novrf()
- {
- local a
- #
- # server tests
- #
- for a in ${NSA_IP6} ${NSA_LINKIP6}%${NSB_DEV}
- do
- log_start
- run_cmd nettest -6 -D -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -D -r ${a}
- log_test_addr ${a} $? 0 "Global server"
- log_start
- run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -D -r ${a}
- log_test_addr ${a} $? 0 "Device server"
- done
- a=${NSA_LO_IP6}
- log_start
- run_cmd nettest -6 -D -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -D -r ${a}
- log_test_addr ${a} $? 0 "Global server"
- # should fail since loopback address is out of scope for a device
- # bound server, but it does not - hence this is more documenting
- # behavior.
- #log_start
- #show_hint "Should fail since loopback address is out of scope"
- #run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} &
- #sleep 1
- #run_cmd_nsb nettest -6 -D -r ${a}
- #log_test_addr ${a} $? 1 "Device server"
- # negative test - should fail
- for a in ${NSA_IP6} ${NSA_LO_IP6} ${NSA_LINKIP6}%${NSB_DEV}
- do
- log_start
- show_hint "Should fail 'Connection refused' since there is no server"
- run_cmd_nsb nettest -6 -D -r ${a}
- log_test_addr ${a} $? 1 "No server"
- done
- #
- # client
- #
- for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
- do
- log_start
- run_cmd_nsb nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -r ${a} -0 ${NSA_IP6}
- log_test_addr ${a} $? 0 "Client"
- log_start
- run_cmd_nsb nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -0 ${NSA_IP6}
- log_test_addr ${a} $? 0 "Client, device bind"
- log_start
- run_cmd_nsb nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -C -0 ${NSA_IP6}
- log_test_addr ${a} $? 0 "Client, device send via cmsg"
- log_start
- run_cmd_nsb nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -S -0 ${NSA_IP6}
- log_test_addr ${a} $? 0 "Client, device bind via IPV6_UNICAST_IF"
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -6 -D -r ${a}
- log_test_addr ${a} $? 1 "No server, unbound client"
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 1 "No server, device client"
- done
- #
- # local address tests
- #
- for a in ${NSA_IP6} ${NSA_LO_IP6} ::1
- do
- log_start
- run_cmd nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -r ${a} -0 ${a} -1 ${a}
- log_test_addr ${a} $? 0 "Global server, local connection"
- done
- a=${NSA_IP6}
- log_start
- run_cmd nettest -6 -s -D -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -D -r ${a}
- log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
- for a in ${NSA_LO_IP6} ::1
- do
- log_start
- show_hint "Should fail 'Connection refused' since address is out of device scope"
- run_cmd nettest -6 -s -D -I ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -D -r ${a}
- log_test_addr ${a} $? 1 "Device server, local connection"
- done
- a=${NSA_IP6}
- log_start
- run_cmd nettest -6 -s -D &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 0 "Global server, device client, local connection"
- log_start
- run_cmd nettest -6 -s -D &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -C -r ${a}
- log_test_addr ${a} $? 0 "Global server, device send via cmsg, local connection"
- log_start
- run_cmd nettest -6 -s -D &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -S -r ${a}
- log_test_addr ${a} $? 0 "Global server, device client via IPV6_UNICAST_IF, local connection"
- for a in ${NSA_LO_IP6} ::1
- do
- log_start
- show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope"
- run_cmd nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV}
- log_test_addr ${a} $? 1 "Global server, device client, local connection"
- log_start
- show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope"
- run_cmd nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -C
- log_test_addr ${a} $? 1 "Global server, device send via cmsg, local connection"
- log_start
- show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope"
- run_cmd nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -S
- log_test_addr ${a} $? 1 "Global server, device client via IP_UNICAST_IF, local connection"
- log_start
- show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope"
- run_cmd nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -S -U
- log_test_addr ${a} $? 1 "Global server, device client via IP_UNICAST_IF, local connection, with connect()"
- done
- a=${NSA_IP6}
- log_start
- run_cmd nettest -6 -D -s -I ${NSA_DEV} -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a} -0 ${a}
- log_test_addr ${a} $? 0 "Device server, device client, local conn"
- log_start
- show_hint "Should fail 'Connection refused'"
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 1 "No server, device client, local conn"
- # LLA to GUA
- run_cmd_nsb ip -6 addr del ${NSB_IP6}/64 dev ${NSB_DEV}
- run_cmd_nsb ip -6 ro add ${NSA_IP6}/128 dev ${NSB_DEV}
- log_start
- run_cmd nettest -6 -s -D &
- sleep 1
- run_cmd_nsb nettest -6 -D -r ${NSA_IP6}
- log_test $? 0 "UDP in - LLA to GUA"
- run_cmd_nsb ip -6 ro del ${NSA_IP6}/128 dev ${NSB_DEV}
- run_cmd_nsb ip -6 addr add ${NSB_IP6}/64 dev ${NSB_DEV} nodad
- }
- ipv6_udp_vrf()
- {
- local a
- # disable global server
- log_subsection "Global server disabled"
- set_sysctl net.ipv4.udp_l3mdev_accept=0
- #
- # server tests
- #
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- show_hint "Should fail 'Connection refused' since global server is disabled"
- run_cmd nettest -6 -D -s &
- sleep 1
- run_cmd_nsb nettest -6 -D -r ${a}
- log_test_addr ${a} $? 1 "Global server"
- done
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -D -I ${VRF} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -D -r ${a}
- log_test_addr ${a} $? 0 "VRF server"
- done
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -D -r ${a}
- log_test_addr ${a} $? 0 "Enslaved device server"
- done
- # negative test - should fail
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- show_hint "Should fail 'Connection refused' since there is no server"
- run_cmd_nsb nettest -6 -D -r ${a}
- log_test_addr ${a} $? 1 "No server"
- done
- #
- # local address tests
- #
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- show_hint "Should fail 'Connection refused' since global server is disabled"
- run_cmd nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 1 "Global server, VRF client, local conn"
- done
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -D -I ${VRF} -s &
- sleep 1
- run_cmd nettest -6 -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
- done
- a=${NSA_IP6}
- log_start
- show_hint "Should fail 'Connection refused' since global server is disabled"
- run_cmd nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 1 "Global server, device client, local conn"
- log_start
- run_cmd nettest -6 -D -I ${VRF} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 0 "VRF server, device client, local conn"
- log_start
- run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "Enslaved device server, VRF client, local conn"
- log_start
- run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 0 "Enslaved device server, device client, local conn"
- # disable global server
- log_subsection "Global server enabled"
- set_sysctl net.ipv4.udp_l3mdev_accept=1
- #
- # server tests
- #
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -D -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -D -r ${a}
- log_test_addr ${a} $? 0 "Global server"
- done
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -D -I ${VRF} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -D -r ${a}
- log_test_addr ${a} $? 0 "VRF server"
- done
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd_nsb nettest -6 -D -r ${a}
- log_test_addr ${a} $? 0 "Enslaved device server"
- done
- # negative test - should fail
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd_nsb nettest -6 -D -r ${a}
- log_test_addr ${a} $? 1 "No server"
- done
- #
- # client tests
- #
- log_start
- run_cmd_nsb nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -d ${VRF} -r ${NSB_IP6}
- log_test $? 0 "VRF client"
- # negative test - should fail
- log_start
- run_cmd nettest -6 -D -d ${VRF} -r ${NSB_IP6}
- log_test $? 1 "No server, VRF client"
- log_start
- run_cmd_nsb nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSB_IP6}
- log_test $? 0 "Enslaved device client"
- # negative test - should fail
- log_start
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSB_IP6}
- log_test $? 1 "No server, enslaved device client"
- #
- # local address tests
- #
- a=${NSA_IP6}
- log_start
- run_cmd nettest -6 -D -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "Global server, VRF client, local conn"
- #log_start
- run_cmd nettest -6 -D -I ${VRF} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
- a=${VRF_IP6}
- log_start
- run_cmd nettest -6 -D -s -3 ${VRF} &
- sleep 1
- run_cmd nettest -6 -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "Global server, VRF client, local conn"
- log_start
- run_cmd nettest -6 -D -I ${VRF} -s -3 ${VRF} &
- sleep 1
- run_cmd nettest -6 -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
- # negative test - should fail
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 1 "No server, VRF client, local conn"
- done
- # device to global IP
- a=${NSA_IP6}
- log_start
- run_cmd nettest -6 -D -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 0 "Global server, device client, local conn"
- log_start
- run_cmd nettest -6 -D -I ${VRF} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 0 "VRF server, device client, local conn"
- log_start
- run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -D -d ${VRF} -r ${a}
- log_test_addr ${a} $? 0 "Device server, VRF client, local conn"
- log_start
- run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 0 "Device server, device client, local conn"
- log_start
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
- log_test_addr ${a} $? 1 "No server, device client, local conn"
- # link local addresses
- log_start
- run_cmd nettest -6 -D -s &
- sleep 1
- run_cmd_nsb nettest -6 -D -d ${NSB_DEV} -r ${NSA_LINKIP6}
- log_test $? 0 "Global server, linklocal IP"
- log_start
- run_cmd_nsb nettest -6 -D -d ${NSB_DEV} -r ${NSA_LINKIP6}
- log_test $? 1 "No server, linklocal IP"
- log_start
- run_cmd_nsb nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSB_LINKIP6}
- log_test $? 0 "Enslaved device client, linklocal IP"
- log_start
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSB_LINKIP6}
- log_test $? 1 "No server, device client, peer linklocal IP"
- log_start
- run_cmd nettest -6 -D -s &
- sleep 1
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSA_LINKIP6}
- log_test $? 0 "Enslaved device client, local conn - linklocal IP"
- log_start
- run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSA_LINKIP6}
- log_test $? 1 "No server, device client, local conn - linklocal IP"
- # LLA to GUA
- run_cmd_nsb ip -6 addr del ${NSB_IP6}/64 dev ${NSB_DEV}
- run_cmd_nsb ip -6 ro add ${NSA_IP6}/128 dev ${NSB_DEV}
- log_start
- run_cmd nettest -6 -s -D &
- sleep 1
- run_cmd_nsb nettest -6 -D -r ${NSA_IP6}
- log_test $? 0 "UDP in - LLA to GUA"
- run_cmd_nsb ip -6 ro del ${NSA_IP6}/128 dev ${NSB_DEV}
- run_cmd_nsb ip -6 addr add ${NSB_IP6}/64 dev ${NSB_DEV} nodad
- }
- ipv6_udp()
- {
- # should not matter, but set to known state
- set_sysctl net.ipv4.udp_early_demux=1
- log_section "IPv6/UDP"
- log_subsection "No VRF"
- setup
- # udp_l3mdev_accept should have no affect without VRF;
- # run tests with it enabled and disabled to verify
- log_subsection "udp_l3mdev_accept disabled"
- set_sysctl net.ipv4.udp_l3mdev_accept=0
- ipv6_udp_novrf
- log_subsection "udp_l3mdev_accept enabled"
- set_sysctl net.ipv4.udp_l3mdev_accept=1
- ipv6_udp_novrf
- log_subsection "With VRF"
- setup "yes"
- ipv6_udp_vrf
- }
- ################################################################################
- # IPv6 address bind
- ipv6_addr_bind_novrf()
- {
- #
- # raw socket
- #
- for a in ${NSA_IP6} ${NSA_LO_IP6}
- do
- log_start
- run_cmd nettest -6 -s -R -P ipv6-icmp -l ${a} -b
- log_test_addr ${a} $? 0 "Raw socket bind to local address"
- log_start
- run_cmd nettest -6 -s -R -P ipv6-icmp -l ${a} -I ${NSA_DEV} -b
- log_test_addr ${a} $? 0 "Raw socket bind to local address after device bind"
- done
- #
- # raw socket with nonlocal bind
- #
- a=${NL_IP6}
- log_start
- run_cmd nettest -6 -s -R -P icmp -f -l ${a} -I ${NSA_DEV} -b
- log_test_addr ${a} $? 0 "Raw socket bind to nonlocal address"
- #
- # tcp sockets
- #
- a=${NSA_IP6}
- log_start
- run_cmd nettest -6 -s -l ${a} -t1 -b
- log_test_addr ${a} $? 0 "TCP socket bind to local address"
- log_start
- run_cmd nettest -6 -s -l ${a} -I ${NSA_DEV} -t1 -b
- log_test_addr ${a} $? 0 "TCP socket bind to local address after device bind"
- # Sadly, the kernel allows binding a socket to a device and then
- # binding to an address not on the device. So this test passes
- # when it really should not
- a=${NSA_LO_IP6}
- log_start
- show_hint "Tecnically should fail since address is not on device but kernel allows"
- run_cmd nettest -6 -s -l ${a} -I ${NSA_DEV} -t1 -b
- log_test_addr ${a} $? 0 "TCP socket bind to out of scope local address"
- }
- ipv6_addr_bind_vrf()
- {
- #
- # raw socket
- #
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -s -R -P ipv6-icmp -l ${a} -I ${VRF} -b
- log_test_addr ${a} $? 0 "Raw socket bind to local address after vrf bind"
- log_start
- run_cmd nettest -6 -s -R -P ipv6-icmp -l ${a} -I ${NSA_DEV} -b
- log_test_addr ${a} $? 0 "Raw socket bind to local address after device bind"
- done
- a=${NSA_LO_IP6}
- log_start
- show_hint "Address on loopback is out of VRF scope"
- run_cmd nettest -6 -s -R -P ipv6-icmp -l ${a} -I ${VRF} -b
- log_test_addr ${a} $? 1 "Raw socket bind to invalid local address after vrf bind"
- #
- # raw socket with nonlocal bind
- #
- a=${NL_IP6}
- log_start
- run_cmd nettest -6 -s -R -P icmp -f -l ${a} -I ${VRF} -b
- log_test_addr ${a} $? 0 "Raw socket bind to nonlocal address after VRF bind"
- #
- # tcp sockets
- #
- # address on enslaved device is valid for the VRF or device in a VRF
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -s -l ${a} -I ${VRF} -t1 -b
- log_test_addr ${a} $? 0 "TCP socket bind to local address with VRF bind"
- done
- a=${NSA_IP6}
- log_start
- run_cmd nettest -6 -s -l ${a} -I ${NSA_DEV} -t1 -b
- log_test_addr ${a} $? 0 "TCP socket bind to local address with device bind"
- # Sadly, the kernel allows binding a socket to a device and then
- # binding to an address not on the device. The only restriction
- # is that the address is valid in the L3 domain. So this test
- # passes when it really should not
- a=${VRF_IP6}
- log_start
- show_hint "Tecnically should fail since address is not on device but kernel allows"
- run_cmd nettest -6 -s -l ${a} -I ${NSA_DEV} -t1 -b
- log_test_addr ${a} $? 0 "TCP socket bind to VRF address with device bind"
- a=${NSA_LO_IP6}
- log_start
- show_hint "Address on loopback out of scope for VRF"
- run_cmd nettest -6 -s -l ${a} -I ${VRF} -t1 -b
- log_test_addr ${a} $? 1 "TCP socket bind to invalid local address for VRF"
- log_start
- show_hint "Address on loopback out of scope for device in VRF"
- run_cmd nettest -6 -s -l ${a} -I ${NSA_DEV} -t1 -b
- log_test_addr ${a} $? 1 "TCP socket bind to invalid local address for device bind"
- }
- ipv6_addr_bind()
- {
- log_section "IPv6 address binds"
- log_subsection "No VRF"
- setup
- ipv6_addr_bind_novrf
- log_subsection "With VRF"
- setup "yes"
- ipv6_addr_bind_vrf
- }
- ################################################################################
- # IPv6 runtime tests
- ipv6_rt()
- {
- local desc="$1"
- local varg="-6 $2"
- local with_vrf="yes"
- local a
- #
- # server tests
- #
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest ${varg} -s &
- sleep 1
- run_cmd_nsb nettest ${varg} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, global server"
- setup ${with_vrf}
- done
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest ${varg} -I ${VRF} -s &
- sleep 1
- run_cmd_nsb nettest ${varg} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, VRF server"
- setup ${with_vrf}
- done
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest ${varg} -I ${NSA_DEV} -s &
- sleep 1
- run_cmd_nsb nettest ${varg} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, enslaved device server"
- setup ${with_vrf}
- done
- #
- # client test
- #
- log_start
- run_cmd_nsb nettest ${varg} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${VRF} -r ${NSB_IP6} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test 0 0 "${desc}, VRF client"
- setup ${with_vrf}
- log_start
- run_cmd_nsb nettest ${varg} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${NSA_DEV} -r ${NSB_IP6} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test 0 0 "${desc}, enslaved device client"
- setup ${with_vrf}
- #
- # local address tests
- #
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest ${varg} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${VRF} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, global server, VRF client"
- setup ${with_vrf}
- done
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest ${varg} -I ${VRF} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${VRF} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, VRF server and client"
- setup ${with_vrf}
- done
- a=${NSA_IP6}
- log_start
- run_cmd nettest ${varg} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, global server, device client"
- setup ${with_vrf}
- log_start
- run_cmd nettest ${varg} -I ${VRF} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, VRF server, device client"
- setup ${with_vrf}
- log_start
- run_cmd nettest ${varg} -I ${NSA_DEV} -s &
- sleep 1
- run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "${desc}, device server, device client"
- }
- ipv6_ping_rt()
- {
- local with_vrf="yes"
- local a
- a=${NSA_IP6}
- log_start
- run_cmd_nsb ${ping6} -f ${a} &
- sleep 3
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "Device delete with active traffic - ping in"
- setup ${with_vrf}
- log_start
- run_cmd ${ping6} -f ${NSB_IP6} -I ${VRF} &
- sleep 1
- run_cmd ip link del ${VRF}
- sleep 1
- log_test_addr ${a} 0 0 "Device delete with active traffic - ping out"
- }
- ipv6_runtime()
- {
- log_section "Run time tests - ipv6"
- setup "yes"
- ipv6_ping_rt
- setup "yes"
- ipv6_rt "TCP active socket" "-n -1"
- setup "yes"
- ipv6_rt "TCP passive socket" "-i"
- setup "yes"
- ipv6_rt "UDP active socket" "-D -n -1"
- }
- ################################################################################
- # netfilter blocking connections
- netfilter_tcp_reset()
- {
- local a
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- run_cmd nettest -s &
- sleep 1
- run_cmd_nsb nettest -r ${a}
- log_test_addr ${a} $? 1 "Global server, reject with TCP-reset on Rx"
- done
- }
- netfilter_icmp()
- {
- local stype="$1"
- local arg
- local a
- [ "${stype}" = "UDP" ] && arg="-D"
- for a in ${NSA_IP} ${VRF_IP}
- do
- log_start
- run_cmd nettest ${arg} -s &
- sleep 1
- run_cmd_nsb nettest ${arg} -r ${a}
- log_test_addr ${a} $? 1 "Global ${stype} server, Rx reject icmp-port-unreach"
- done
- }
- ipv4_netfilter()
- {
- log_section "IPv4 Netfilter"
- log_subsection "TCP reset"
- setup "yes"
- run_cmd iptables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with tcp-reset
- netfilter_tcp_reset
- log_start
- log_subsection "ICMP unreachable"
- log_start
- run_cmd iptables -F
- run_cmd iptables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with icmp-port-unreachable
- run_cmd iptables -A INPUT -p udp --dport 12345 -j REJECT --reject-with icmp-port-unreachable
- netfilter_icmp "TCP"
- netfilter_icmp "UDP"
- log_start
- iptables -F
- }
- netfilter_tcp6_reset()
- {
- local a
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -s &
- sleep 1
- run_cmd_nsb nettest -6 -r ${a}
- log_test_addr ${a} $? 1 "Global server, reject with TCP-reset on Rx"
- done
- }
- netfilter_icmp6()
- {
- local stype="$1"
- local arg
- local a
- [ "${stype}" = "UDP" ] && arg="$arg -D"
- for a in ${NSA_IP6} ${VRF_IP6}
- do
- log_start
- run_cmd nettest -6 -s ${arg} &
- sleep 1
- run_cmd_nsb nettest -6 ${arg} -r ${a}
- log_test_addr ${a} $? 1 "Global ${stype} server, Rx reject icmp-port-unreach"
- done
- }
- ipv6_netfilter()
- {
- log_section "IPv6 Netfilter"
- log_subsection "TCP reset"
- setup "yes"
- run_cmd ip6tables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with tcp-reset
- netfilter_tcp6_reset
- log_subsection "ICMP unreachable"
- log_start
- run_cmd ip6tables -F
- run_cmd ip6tables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with icmp6-port-unreachable
- run_cmd ip6tables -A INPUT -p udp --dport 12345 -j REJECT --reject-with icmp6-port-unreachable
- netfilter_icmp6 "TCP"
- netfilter_icmp6 "UDP"
- log_start
- ip6tables -F
- }
- ################################################################################
- # specific use cases
- # VRF only.
- # ns-A device enslaved to bridge. Verify traffic with and without
- # br_netfilter module loaded. Repeat with SVI on bridge.
- use_case_br()
- {
- setup "yes"
- setup_cmd ip link set ${NSA_DEV} down
- setup_cmd ip addr del dev ${NSA_DEV} ${NSA_IP}/24
- setup_cmd ip -6 addr del dev ${NSA_DEV} ${NSA_IP6}/64
- setup_cmd ip link add br0 type bridge
- setup_cmd ip addr add dev br0 ${NSA_IP}/24
- setup_cmd ip -6 addr add dev br0 ${NSA_IP6}/64 nodad
- setup_cmd ip li set ${NSA_DEV} master br0
- setup_cmd ip li set ${NSA_DEV} up
- setup_cmd ip li set br0 up
- setup_cmd ip li set br0 vrf ${VRF}
- rmmod br_netfilter 2>/dev/null
- sleep 5 # DAD
- run_cmd ip neigh flush all
- run_cmd ping -c1 -w1 -I br0 ${NSB_IP}
- log_test $? 0 "Bridge into VRF - IPv4 ping out"
- run_cmd ip neigh flush all
- run_cmd ${ping6} -c1 -w1 -I br0 ${NSB_IP6}
- log_test $? 0 "Bridge into VRF - IPv6 ping out"
- run_cmd ip neigh flush all
- run_cmd_nsb ping -c1 -w1 ${NSA_IP}
- log_test $? 0 "Bridge into VRF - IPv4 ping in"
- run_cmd ip neigh flush all
- run_cmd_nsb ${ping6} -c1 -w1 ${NSA_IP6}
- log_test $? 0 "Bridge into VRF - IPv6 ping in"
- modprobe br_netfilter
- if [ $? -eq 0 ]; then
- run_cmd ip neigh flush all
- run_cmd ping -c1 -w1 -I br0 ${NSB_IP}
- log_test $? 0 "Bridge into VRF with br_netfilter - IPv4 ping out"
- run_cmd ip neigh flush all
- run_cmd ${ping6} -c1 -w1 -I br0 ${NSB_IP6}
- log_test $? 0 "Bridge into VRF with br_netfilter - IPv6 ping out"
- run_cmd ip neigh flush all
- run_cmd_nsb ping -c1 -w1 ${NSA_IP}
- log_test $? 0 "Bridge into VRF with br_netfilter - IPv4 ping in"
- run_cmd ip neigh flush all
- run_cmd_nsb ${ping6} -c1 -w1 ${NSA_IP6}
- log_test $? 0 "Bridge into VRF with br_netfilter - IPv6 ping in"
- fi
- setup_cmd ip li set br0 nomaster
- setup_cmd ip li add br0.100 link br0 type vlan id 100
- setup_cmd ip li set br0.100 vrf ${VRF} up
- setup_cmd ip addr add dev br0.100 172.16.101.1/24
- setup_cmd ip -6 addr add dev br0.100 2001:db8:101::1/64 nodad
- setup_cmd_nsb ip li add vlan100 link ${NSB_DEV} type vlan id 100
- setup_cmd_nsb ip addr add dev vlan100 172.16.101.2/24
- setup_cmd_nsb ip -6 addr add dev vlan100 2001:db8:101::2/64 nodad
- setup_cmd_nsb ip li set vlan100 up
- sleep 1
- rmmod br_netfilter 2>/dev/null
- run_cmd ip neigh flush all
- run_cmd ping -c1 -w1 -I br0.100 172.16.101.2
- log_test $? 0 "Bridge vlan into VRF - IPv4 ping out"
- run_cmd ip neigh flush all
- run_cmd ${ping6} -c1 -w1 -I br0.100 2001:db8:101::2
- log_test $? 0 "Bridge vlan into VRF - IPv6 ping out"
- run_cmd ip neigh flush all
- run_cmd_nsb ping -c1 -w1 172.16.101.1
- log_test $? 0 "Bridge vlan into VRF - IPv4 ping in"
- run_cmd ip neigh flush all
- run_cmd_nsb ${ping6} -c1 -w1 2001:db8:101::1
- log_test $? 0 "Bridge vlan into VRF - IPv6 ping in"
- modprobe br_netfilter
- if [ $? -eq 0 ]; then
- run_cmd ip neigh flush all
- run_cmd ping -c1 -w1 -I br0.100 172.16.101.2
- log_test $? 0 "Bridge vlan into VRF with br_netfilter - IPv4 ping out"
- run_cmd ip neigh flush all
- run_cmd ${ping6} -c1 -w1 -I br0.100 2001:db8:101::2
- log_test $? 0 "Bridge vlan into VRF with br_netfilter - IPv6 ping out"
- run_cmd ip neigh flush all
- run_cmd_nsb ping -c1 -w1 172.16.101.1
- log_test $? 0 "Bridge vlan into VRF - IPv4 ping in"
- run_cmd ip neigh flush all
- run_cmd_nsb ${ping6} -c1 -w1 2001:db8:101::1
- log_test $? 0 "Bridge vlan into VRF - IPv6 ping in"
- fi
- setup_cmd ip li del br0 2>/dev/null
- setup_cmd_nsb ip li del vlan100 2>/dev/null
- }
- # VRF only.
- # ns-A device is connected to both ns-B and ns-C on a single VRF but only has
- # LLA on the interfaces
- use_case_ping_lla_multi()
- {
- setup_lla_only
- # only want reply from ns-A
- setup_cmd_nsb sysctl -qw net.ipv6.icmp.echo_ignore_multicast=1
- setup_cmd_nsc sysctl -qw net.ipv6.icmp.echo_ignore_multicast=1
- log_start
- run_cmd_nsb ping -c1 -w1 ${MCAST}%${NSB_DEV}
- log_test_addr ${MCAST}%${NSB_DEV} $? 0 "Pre cycle, ping out ns-B"
- run_cmd_nsc ping -c1 -w1 ${MCAST}%${NSC_DEV}
- log_test_addr ${MCAST}%${NSC_DEV} $? 0 "Pre cycle, ping out ns-C"
- # cycle/flap the first ns-A interface
- setup_cmd ip link set ${NSA_DEV} down
- setup_cmd ip link set ${NSA_DEV} up
- sleep 1
- log_start
- run_cmd_nsb ping -c1 -w1 ${MCAST}%${NSB_DEV}
- log_test_addr ${MCAST}%${NSB_DEV} $? 0 "Post cycle ${NSA} ${NSA_DEV}, ping out ns-B"
- run_cmd_nsc ping -c1 -w1 ${MCAST}%${NSC_DEV}
- log_test_addr ${MCAST}%${NSC_DEV} $? 0 "Post cycle ${NSA} ${NSA_DEV}, ping out ns-C"
- # cycle/flap the second ns-A interface
- setup_cmd ip link set ${NSA_DEV2} down
- setup_cmd ip link set ${NSA_DEV2} up
- sleep 1
- log_start
- run_cmd_nsb ping -c1 -w1 ${MCAST}%${NSB_DEV}
- log_test_addr ${MCAST}%${NSB_DEV} $? 0 "Post cycle ${NSA} ${NSA_DEV2}, ping out ns-B"
- run_cmd_nsc ping -c1 -w1 ${MCAST}%${NSC_DEV}
- log_test_addr ${MCAST}%${NSC_DEV} $? 0 "Post cycle ${NSA} ${NSA_DEV2}, ping out ns-C"
- }
- # Perform IPv{4,6} SNAT on ns-A, and verify TCP connection is successfully
- # established with ns-B.
- use_case_snat_on_vrf()
- {
- setup "yes"
- local port="12345"
- run_cmd iptables -t nat -A POSTROUTING -p tcp -m tcp --dport ${port} -j SNAT --to-source ${NSA_LO_IP} -o ${VRF}
- run_cmd ip6tables -t nat -A POSTROUTING -p tcp -m tcp --dport ${port} -j SNAT --to-source ${NSA_LO_IP6} -o ${VRF}
- run_cmd_nsb nettest -s -l ${NSB_IP} -p ${port} &
- sleep 1
- run_cmd nettest -d ${VRF} -r ${NSB_IP} -p ${port}
- log_test $? 0 "IPv4 TCP connection over VRF with SNAT"
- run_cmd_nsb nettest -6 -s -l ${NSB_IP6} -p ${port} &
- sleep 1
- run_cmd nettest -6 -d ${VRF} -r ${NSB_IP6} -p ${port}
- log_test $? 0 "IPv6 TCP connection over VRF with SNAT"
- # Cleanup
- run_cmd iptables -t nat -D POSTROUTING -p tcp -m tcp --dport ${port} -j SNAT --to-source ${NSA_LO_IP} -o ${VRF}
- run_cmd ip6tables -t nat -D POSTROUTING -p tcp -m tcp --dport ${port} -j SNAT --to-source ${NSA_LO_IP6} -o ${VRF}
- }
- use_cases()
- {
- log_section "Use cases"
- log_subsection "Device enslaved to bridge"
- use_case_br
- log_subsection "Ping LLA with multiple interfaces"
- use_case_ping_lla_multi
- log_subsection "SNAT on VRF"
- use_case_snat_on_vrf
- }
- ################################################################################
- # usage
- usage()
- {
- cat <<EOF
- usage: ${0##*/} OPTS
- -4 IPv4 tests only
- -6 IPv6 tests only
- -t <test> Test name/set to run
- -p Pause on fail
- -P Pause after each test
- -v Be verbose
- Tests:
- $TESTS_IPV4 $TESTS_IPV6 $TESTS_OTHER
- EOF
- }
- ################################################################################
- # main
- TESTS_IPV4="ipv4_ping ipv4_tcp ipv4_udp ipv4_bind ipv4_runtime ipv4_netfilter"
- TESTS_IPV6="ipv6_ping ipv6_tcp ipv6_udp ipv6_bind ipv6_runtime ipv6_netfilter"
- TESTS_OTHER="use_cases"
- PAUSE_ON_FAIL=no
- PAUSE=no
- while getopts :46t:pPvh o
- do
- case $o in
- 4) TESTS=ipv4;;
- 6) TESTS=ipv6;;
- t) TESTS=$OPTARG;;
- p) PAUSE_ON_FAIL=yes;;
- P) PAUSE=yes;;
- v) VERBOSE=1;;
- h) usage; exit 0;;
- *) usage; exit 1;;
- esac
- done
- # make sure we don't pause twice
- [ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
- #
- # show user test config
- #
- if [ -z "$TESTS" ]; then
- TESTS="$TESTS_IPV4 $TESTS_IPV6 $TESTS_OTHER"
- elif [ "$TESTS" = "ipv4" ]; then
- TESTS="$TESTS_IPV4"
- elif [ "$TESTS" = "ipv6" ]; then
- TESTS="$TESTS_IPV6"
- fi
- # nettest can be run from PATH or from same directory as this selftest
- if ! which nettest >/dev/null; then
- PATH=$PWD:$PATH
- if ! which nettest >/dev/null; then
- echo "'nettest' command not found; skipping tests"
- exit $ksft_skip
- fi
- fi
- declare -i nfail=0
- declare -i nsuccess=0
- for t in $TESTS
- do
- case $t in
- ipv4_ping|ping) ipv4_ping;;
- ipv4_tcp|tcp) ipv4_tcp;;
- ipv4_udp|udp) ipv4_udp;;
- ipv4_bind|bind) ipv4_addr_bind;;
- ipv4_runtime) ipv4_runtime;;
- ipv4_netfilter) ipv4_netfilter;;
- ipv6_ping|ping6) ipv6_ping;;
- ipv6_tcp|tcp6) ipv6_tcp;;
- ipv6_udp|udp6) ipv6_udp;;
- ipv6_bind|bind6) ipv6_addr_bind;;
- ipv6_runtime) ipv6_runtime;;
- ipv6_netfilter) ipv6_netfilter;;
- use_cases) use_cases;;
- # setup namespaces and config, but do not run any tests
- setup) setup; exit 0;;
- vrf_setup) setup "yes"; exit 0;;
- esac
- done
- cleanup 2>/dev/null
- printf "\nTests passed: %3d\n" ${nsuccess}
- printf "Tests failed: %3d\n" ${nfail}
- if [ $nfail -ne 0 ]; then
- exit 1 # KSFT_FAIL
- elif [ $nsuccess -eq 0 ]; then
- exit $ksft_skip
- fi
- exit 0 # KSFT_PASS
|