| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298 |
- // SPDX-License-Identifier: GPL-2.0
- /* Copyright (C) 2018-2020, Intel Corporation. */
- #include "ice_common.h"
- /* These are training packet headers used to program flow director filters. */
- static const u8 ice_fdir_eth_pkt[22];
- static const u8 ice_fdir_tcpv4_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00,
- 0x20, 0x00, 0x00, 0x00, 0x00, 0x00
- };
- static const u8 ice_fdir_udpv4_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00,
- };
- static const u8 ice_fdir_sctpv4_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_ipv4_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00
- };
- static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
- 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
- 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00,
- };
- static const u8 ice_fdir_tcp4_gtpu4_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
- 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
- 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_icmp4_gtpu4_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
- 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
- 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00,
- };
- static const u8 ice_fdir_ipv4_gtpu4_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
- 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
- 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00,
- };
- static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00,
- };
- static const u8 ice_fdir_ipv4_esp_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00
- };
- static const u8 ice_fdir_ipv6_esp_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_ipv4_ah_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00
- };
- static const u8 ice_fdir_ipv6_ah_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00,
- };
- static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
- 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
- };
- static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
- 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00,
- };
- static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
- 0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00,
- };
- static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
- 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
- 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
- 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
- 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_non_ip_l2_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_tcpv6_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
- 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
- 0x00, 0x00,
- };
- static const u8 ice_fdir_udpv6_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
- 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
- };
- static const u8 ice_fdir_sctpv6_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
- 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00,
- };
- static const u8 ice_fdir_ipv6_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_tcp4_tun_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
- 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
- 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_udp4_tun_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
- 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
- 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_sctp4_tun_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
- 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
- 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_ip4_tun_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
- 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_tcp6_tun_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
- 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
- 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_udp6_tun_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
- 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_sctp6_tun_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
- 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,
- };
- static const u8 ice_fdir_ip6_tun_pkt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
- 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
- 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- /* Flow Director no-op training packet table */
- static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
- {
- ICE_FLTR_PTYPE_NONF_ETH,
- sizeof(ice_fdir_eth_pkt), ice_fdir_eth_pkt,
- sizeof(ice_fdir_eth_pkt), ice_fdir_eth_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_TCP,
- sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
- sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_UDP,
- sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
- sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
- sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
- sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
- sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
- sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
- sizeof(ice_fdir_udp4_gtpu4_pkt),
- ice_fdir_udp4_gtpu4_pkt,
- sizeof(ice_fdir_udp4_gtpu4_pkt),
- ice_fdir_udp4_gtpu4_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
- sizeof(ice_fdir_tcp4_gtpu4_pkt),
- ice_fdir_tcp4_gtpu4_pkt,
- sizeof(ice_fdir_tcp4_gtpu4_pkt),
- ice_fdir_tcp4_gtpu4_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
- sizeof(ice_fdir_icmp4_gtpu4_pkt),
- ice_fdir_icmp4_gtpu4_pkt,
- sizeof(ice_fdir_icmp4_gtpu4_pkt),
- ice_fdir_icmp4_gtpu4_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
- sizeof(ice_fdir_ipv4_gtpu4_pkt),
- ice_fdir_ipv4_gtpu4_pkt,
- sizeof(ice_fdir_ipv4_gtpu4_pkt),
- ice_fdir_ipv4_gtpu4_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
- sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
- sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
- sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
- sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_ESP,
- sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
- sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV6_ESP,
- sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
- sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_AH,
- sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
- sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV6_AH,
- sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
- sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
- sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
- ice_fdir_ipv4_nat_t_esp_pkt,
- sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
- ice_fdir_ipv4_nat_t_esp_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
- sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
- ice_fdir_ipv6_nat_t_esp_pkt,
- sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
- ice_fdir_ipv6_nat_t_esp_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
- sizeof(ice_fdir_ipv4_pfcp_node_pkt),
- ice_fdir_ipv4_pfcp_node_pkt,
- sizeof(ice_fdir_ipv4_pfcp_node_pkt),
- ice_fdir_ipv4_pfcp_node_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
- sizeof(ice_fdir_ipv4_pfcp_session_pkt),
- ice_fdir_ipv4_pfcp_session_pkt,
- sizeof(ice_fdir_ipv4_pfcp_session_pkt),
- ice_fdir_ipv4_pfcp_session_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
- sizeof(ice_fdir_ipv6_pfcp_node_pkt),
- ice_fdir_ipv6_pfcp_node_pkt,
- sizeof(ice_fdir_ipv6_pfcp_node_pkt),
- ice_fdir_ipv6_pfcp_node_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
- sizeof(ice_fdir_ipv6_pfcp_session_pkt),
- ice_fdir_ipv6_pfcp_session_pkt,
- sizeof(ice_fdir_ipv6_pfcp_session_pkt),
- ice_fdir_ipv6_pfcp_session_pkt,
- },
- {
- ICE_FLTR_PTYPE_NON_IP_L2,
- sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
- sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV6_TCP,
- sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
- sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV6_UDP,
- sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
- sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
- sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
- sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
- },
- {
- ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
- sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
- sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
- },
- };
- #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
- /**
- * ice_set_dflt_val_fd_desc
- * @fd_fltr_ctx: pointer to fd filter descriptor
- */
- static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
- {
- fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
- fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
- fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
- fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
- fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
- fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
- fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
- fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
- fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
- fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
- fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
- fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
- fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
- fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
- fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
- fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
- fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
- fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
- fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
- }
- /**
- * ice_set_fd_desc_val
- * @ctx: pointer to fd filter descriptor context
- * @fdir_desc: populated with fd filter descriptor values
- */
- static void
- ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
- struct ice_fltr_desc *fdir_desc)
- {
- u64 qword;
- /* prep QW0 of FD filter programming desc */
- qword = FIELD_PREP(ICE_FXD_FLTR_QW0_QINDEX_M, ctx->qindex);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_COMP_Q_M, ctx->comp_q);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_COMP_REPORT_M, ctx->comp_report);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_FD_SPACE_M, ctx->fd_space);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_STAT_CNT_M, ctx->cnt_index);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_STAT_ENA_M, ctx->cnt_ena);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_EVICT_ENA_M, ctx->evict_ena);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_TO_Q_M, ctx->toq);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_TO_Q_PRI_M, ctx->toq_prio);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_DPU_RECIPE_M, ctx->dpu_recipe);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_DROP_M, ctx->drop);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_FLEX_PRI_M, ctx->flex_prio);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_FLEX_MDID_M, ctx->flex_mdid);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_FLEX_VAL_M, ctx->flex_val);
- fdir_desc->qidx_compq_space_stat = cpu_to_le64(qword);
- /* prep QW1 of FD filter programming desc */
- qword = FIELD_PREP(ICE_FXD_FLTR_QW1_DTYPE_M, ctx->dtype);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_PCMD_M, ctx->pcmd);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_PROF_PRI_M, ctx->desc_prof_prio);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_PROF_M, ctx->desc_prof);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_FD_VSI_M, ctx->fd_vsi);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_SWAP_M, ctx->swap);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_FDID_PRI_M, ctx->fdid_prio);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_FDID_MDID_M, ctx->fdid_mdid);
- qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_FDID_M, ctx->fdid);
- fdir_desc->dtype_cmd_vsi_fdid = cpu_to_le64(qword);
- }
- /**
- * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
- * @hw: pointer to the hardware structure
- * @input: filter
- * @fdesc: filter descriptor
- * @add: if add is true, this is an add operation, false implies delete
- */
- void
- ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
- struct ice_fltr_desc *fdesc, bool add)
- {
- struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
- /* set default context info */
- ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
- /* change sideband filtering values */
- fdir_fltr_ctx.fdid = input->fltr_id;
- if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
- fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
- fdir_fltr_ctx.qindex = 0;
- } else if (input->dest_ctl ==
- ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
- fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
- fdir_fltr_ctx.qindex = 0;
- } else {
- if (input->dest_ctl ==
- ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
- fdir_fltr_ctx.toq = input->q_region;
- fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
- fdir_fltr_ctx.qindex = input->q_index;
- }
- fdir_fltr_ctx.cnt_ena = input->cnt_ena;
- fdir_fltr_ctx.cnt_index = input->cnt_index;
- fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
- fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
- if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
- fdir_fltr_ctx.toq_prio = 0;
- else
- fdir_fltr_ctx.toq_prio = 3;
- fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
- ICE_FXD_FLTR_QW1_PCMD_REMOVE;
- fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
- fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
- fdir_fltr_ctx.comp_report = input->comp_report;
- fdir_fltr_ctx.fdid_prio = input->fdid_prio;
- fdir_fltr_ctx.desc_prof = 1;
- fdir_fltr_ctx.desc_prof_prio = 3;
- ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
- }
- /**
- * ice_alloc_fd_res_cntr - obtain counter resource for FD type
- * @hw: pointer to the hardware structure
- * @cntr_id: returns counter index
- */
- int ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
- {
- return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
- ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
- }
- /**
- * ice_free_fd_res_cntr - Free counter resource for FD type
- * @hw: pointer to the hardware structure
- * @cntr_id: counter index to be freed
- */
- int ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
- {
- return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
- ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
- }
- /**
- * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
- * @hw: pointer to the hardware structure
- * @cntr_id: returns counter index
- * @num_fltr: number of filter entries to be allocated
- */
- int ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
- {
- return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
- ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
- cntr_id);
- }
- /**
- * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
- * @hw: pointer to the hardware structure
- * @cntr_id: returns counter index
- * @num_fltr: number of filter entries to be allocated
- */
- int ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
- {
- return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
- ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
- cntr_id);
- }
- /**
- * ice_get_fdir_cnt_all - get the number of Flow Director filters
- * @hw: hardware data structure
- *
- * Returns the number of filters available on device
- */
- int ice_get_fdir_cnt_all(struct ice_hw *hw)
- {
- return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
- }
- /**
- * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer
- * @pkt: packet buffer
- * @offset: offset into buffer
- * @addr: IPv6 address to convert and insert into pkt at offset
- */
- static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
- {
- int idx;
- for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
- memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
- sizeof(*addr));
- }
- /**
- * ice_pkt_insert_u6_qfi - insert a u6 value QFI into a memory buffer for GTPU
- * @pkt: packet buffer
- * @offset: offset into buffer
- * @data: 8 bit value to convert and insert into pkt at offset
- *
- * This function is designed for inserting QFI (6 bits) for GTPU.
- */
- static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
- {
- u8 ret;
- ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
- memcpy(pkt + offset, &ret, sizeof(ret));
- }
- /**
- * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
- * @pkt: packet buffer
- * @offset: offset into buffer
- * @data: 8 bit value to convert and insert into pkt at offset
- */
- static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
- {
- memcpy(pkt + offset, &data, sizeof(data));
- }
- /**
- * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
- * @pkt: packet buffer
- * @offset: offset into buffer
- * @data: 8 bit value to convert and insert into pkt at offset
- *
- * This function is designed for inserting Traffic Class (TC) for IPv6,
- * since that TC is not aligned in number of bytes. Here we split it out
- * into two part and fill each byte with data copy from pkt, then insert
- * the two bytes data one by one.
- */
- static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
- {
- u8 high, low;
- high = (data >> 4) + (*(pkt + offset) & 0xF0);
- memcpy(pkt + offset, &high, sizeof(high));
- low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
- memcpy(pkt + offset + 1, &low, sizeof(low));
- }
- /**
- * ice_pkt_insert_u16 - insert a be16 value into a memory buffer
- * @pkt: packet buffer
- * @offset: offset into buffer
- * @data: 16 bit value to convert and insert into pkt at offset
- */
- static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
- {
- memcpy(pkt + offset, &data, sizeof(data));
- }
- /**
- * ice_pkt_insert_u32 - insert a be32 value into a memory buffer
- * @pkt: packet buffer
- * @offset: offset into buffer
- * @data: 32 bit value to convert and insert into pkt at offset
- */
- static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
- {
- memcpy(pkt + offset, &data, sizeof(data));
- }
- /**
- * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
- * @pkt: packet buffer
- * @addr: MAC address to convert and insert into pkt at offset
- */
- static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
- {
- ether_addr_copy(pkt, addr);
- }
- /**
- * ice_fdir_get_gen_prgm_pkt - generate a training packet
- * @hw: pointer to the hardware structure
- * @input: flow director filter data structure
- * @pkt: pointer to return filter packet
- * @frag: generate a fragment packet
- * @tun: true implies generate a tunnel packet
- */
- int
- ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
- u8 *pkt, bool frag, bool tun)
- {
- enum ice_fltr_ptype flow;
- u16 tnl_port;
- u8 *loc;
- u16 idx;
- if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
- switch (input->ip.v4.proto) {
- case IPPROTO_TCP:
- flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
- break;
- case IPPROTO_UDP:
- flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
- break;
- case IPPROTO_SCTP:
- flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
- break;
- default:
- flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
- break;
- }
- } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
- switch (input->ip.v6.proto) {
- case IPPROTO_TCP:
- flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
- break;
- case IPPROTO_UDP:
- flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
- break;
- case IPPROTO_SCTP:
- flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
- break;
- default:
- flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
- break;
- }
- } else {
- flow = input->flow_type;
- }
- for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
- if (ice_fdir_pkt[idx].flow == flow)
- break;
- if (idx == ICE_FDIR_NUM_PKT)
- return -EINVAL;
- if (!tun) {
- memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len);
- loc = pkt;
- } else {
- if (!ice_get_open_tunnel_port(hw, &tnl_port, TNL_ALL))
- return -ENOENT;
- if (!ice_fdir_pkt[idx].tun_pkt)
- return -EINVAL;
- memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
- ice_fdir_pkt[idx].tun_pkt_len);
- ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
- htons(tnl_port));
- loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
- }
- /* Reverse the src and dst, since the HW expects them to be from Tx
- * perspective. The input from user is from Rx filter perspective.
- */
- switch (flow) {
- case ICE_FLTR_PTYPE_NONF_ETH:
- ice_pkt_insert_mac_addr(loc, input->eth.h_dest);
- ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->eth.h_source);
- if (input->ext_data.vlan_tag || input->ext_data.vlan_type) {
- ice_pkt_insert_u16(loc, ICE_ETH_TYPE_F_OFFSET,
- input->ext_data.vlan_type);
- ice_pkt_insert_u16(loc, ICE_ETH_VLAN_TCI_OFFSET,
- input->ext_data.vlan_tag);
- ice_pkt_insert_u16(loc, ICE_ETH_TYPE_VLAN_OFFSET,
- input->eth.h_proto);
- } else {
- ice_pkt_insert_u16(loc, ICE_ETH_TYPE_F_OFFSET,
- input->eth.h_proto);
- }
- break;
- case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
- ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
- input->ip.v4.src_ip);
- ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
- input->ip.v4.src_port);
- ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
- input->ip.v4.dst_ip);
- ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
- input->ip.v4.dst_port);
- ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
- ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
- ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
- if (frag)
- loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
- break;
- case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
- ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
- input->ip.v4.src_ip);
- ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
- input->ip.v4.src_port);
- ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
- input->ip.v4.dst_ip);
- ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
- input->ip.v4.dst_port);
- ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
- ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
- ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
- ice_pkt_insert_mac_addr(loc + ETH_ALEN,
- input->ext_data.src_mac);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
- ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
- input->ip.v4.src_ip);
- ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
- input->ip.v4.src_port);
- ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
- input->ip.v4.dst_ip);
- ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
- input->ip.v4.dst_port);
- ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
- ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
- ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
- ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
- input->ip.v4.src_ip);
- ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
- input->ip.v4.dst_ip);
- ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
- ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
- ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
- input->ip.v4.proto);
- ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
- case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
- case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
- case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
- ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
- input->ip.v4.src_ip);
- ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
- input->ip.v4.dst_ip);
- ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
- input->gtpu_data.teid);
- ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
- input->gtpu_data.qfi);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
- ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
- input->l2tpv3_data.session_id);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
- ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
- input->l2tpv3_data.session_id);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
- ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
- input->ip.v4.sec_parm_idx);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
- ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
- input->ip.v6.sec_parm_idx);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV4_AH:
- ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
- input->ip.v4.sec_parm_idx);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV6_AH:
- ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
- input->ip.v6.sec_parm_idx);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
- ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
- input->ip.v4.src_ip);
- ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
- input->ip.v4.dst_ip);
- ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
- input->ip.v4.sec_parm_idx);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
- ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
- input->ip.v6.src_ip);
- ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
- input->ip.v6.dst_ip);
- ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
- input->ip.v6.sec_parm_idx);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
- case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
- ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
- input->ip.v4.dst_port);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
- case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
- ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
- input->ip.v6.dst_port);
- break;
- case ICE_FLTR_PTYPE_NON_IP_L2:
- ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
- input->ext_data.ether_type);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
- ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
- input->ip.v6.src_ip);
- ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
- input->ip.v6.dst_ip);
- ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
- input->ip.v6.src_port);
- ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
- input->ip.v6.dst_port);
- ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
- ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
- ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
- ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
- input->ip.v6.src_ip);
- ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
- input->ip.v6.dst_ip);
- ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
- input->ip.v6.src_port);
- ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
- input->ip.v6.dst_port);
- ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
- ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
- ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
- ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
- input->ip.v6.src_ip);
- ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
- input->ip.v6.dst_ip);
- ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
- input->ip.v6.src_port);
- ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
- input->ip.v6.dst_port);
- ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
- ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
- ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
- break;
- case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
- ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
- input->ip.v6.src_ip);
- ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
- input->ip.v6.dst_ip);
- ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
- ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
- ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
- input->ip.v6.proto);
- ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
- break;
- default:
- return -EINVAL;
- }
- if (input->flex_fltr)
- ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
- return 0;
- }
- /**
- * ice_fdir_has_frag - does flow type have 2 ptypes
- * @flow: flow ptype
- *
- * returns true is there is a fragment packet for this ptype
- */
- bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
- {
- if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
- return true;
- else
- return false;
- }
- /**
- * ice_fdir_find_fltr_by_idx - find filter with idx
- * @hw: pointer to hardware structure
- * @fltr_idx: index to find.
- *
- * Returns pointer to filter if found or null
- */
- struct ice_fdir_fltr *
- ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
- {
- struct ice_fdir_fltr *rule;
- list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
- /* rule ID found in the list */
- if (fltr_idx == rule->fltr_id)
- return rule;
- if (fltr_idx < rule->fltr_id)
- break;
- }
- return NULL;
- }
- /**
- * ice_fdir_list_add_fltr - add a new node to the flow director filter list
- * @hw: hardware structure
- * @fltr: filter node to add to structure
- */
- void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
- {
- struct ice_fdir_fltr *rule, *parent = NULL;
- list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
- /* rule ID found or pass its spot in the list */
- if (rule->fltr_id >= fltr->fltr_id)
- break;
- parent = rule;
- }
- if (parent)
- list_add(&fltr->fltr_node, &parent->fltr_node);
- else
- list_add(&fltr->fltr_node, &hw->fdir_list_head);
- }
- /**
- * ice_fdir_update_cntrs - increment / decrement filter counter
- * @hw: pointer to hardware structure
- * @flow: filter flow type
- * @add: true implies filters added
- */
- void
- ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add)
- {
- int incr;
- incr = add ? 1 : -1;
- hw->fdir_active_fltr += incr;
- if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX)
- ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
- else
- hw->fdir_fltr_cnt[flow] += incr;
- }
- /**
- * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
- * @a: IP v6 address
- * @b: IP v6 address
- *
- * Returns 0 on equal, returns non-0 if different
- */
- static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
- {
- return memcmp(a, b, 4 * sizeof(__be32));
- }
- /**
- * ice_fdir_comp_rules - compare 2 filters
- * @a: a Flow Director filter data structure
- * @b: a Flow Director filter data structure
- *
- * Returns true if the filters match
- */
- static bool
- ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b)
- {
- enum ice_fltr_ptype flow_type = a->flow_type;
- /* The calling function already checks that the two filters have the
- * same flow_type.
- */
- switch (flow_type) {
- case ICE_FLTR_PTYPE_NONF_ETH:
- if (!memcmp(&a->eth, &b->eth, sizeof(a->eth)))
- return true;
- break;
- case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
- case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
- case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
- if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
- a->ip.v4.src_ip == b->ip.v4.src_ip &&
- a->ip.v4.dst_port == b->ip.v4.dst_port &&
- a->ip.v4.src_port == b->ip.v4.src_port)
- return true;
- break;
- case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
- if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
- a->ip.v4.src_ip == b->ip.v4.src_ip &&
- a->ip.v4.l4_header == b->ip.v4.l4_header &&
- a->ip.v4.proto == b->ip.v4.proto &&
- a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
- a->ip.v4.tos == b->ip.v4.tos)
- return true;
- break;
- case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
- case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
- case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
- if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
- a->ip.v6.src_port == b->ip.v6.src_port &&
- !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
- b->ip.v6.dst_ip) &&
- !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
- b->ip.v6.src_ip))
- return true;
- break;
- case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
- if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
- a->ip.v6.src_port == b->ip.v6.src_port)
- return true;
- break;
- default:
- break;
- }
- return false;
- }
- /**
- * ice_fdir_is_dup_fltr - test if filter is already in list for PF
- * @hw: hardware data structure
- * @input: Flow Director filter data structure
- *
- * Returns true if the filter is found in the list
- */
- bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
- {
- struct ice_fdir_fltr *rule;
- bool ret = false;
- list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
- if (rule->flow_type != input->flow_type)
- continue;
- ret = ice_fdir_comp_rules(rule, input);
- if (ret) {
- if (rule->fltr_id == input->fltr_id &&
- rule->q_index != input->q_index)
- ret = false;
- else
- break;
- }
- }
- return ret;
- }
|