ice_fdir.c 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright (C) 2018-2020, Intel Corporation. */
  3. #include "ice_common.h"
  4. /* These are training packet headers used to program flow director filters. */
  5. static const u8 ice_fdir_eth_pkt[22];
  6. static const u8 ice_fdir_tcpv4_pkt[] = {
  7. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  8. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  9. 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
  10. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  11. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  12. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00,
  13. 0x20, 0x00, 0x00, 0x00, 0x00, 0x00
  14. };
  15. static const u8 ice_fdir_udpv4_pkt[] = {
  16. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  17. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  18. 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  19. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  20. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  21. 0x00, 0x00,
  22. };
  23. static const u8 ice_fdir_sctpv4_pkt[] = {
  24. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  25. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  26. 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84,
  27. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  28. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  29. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  30. };
  31. static const u8 ice_fdir_ipv4_pkt[] = {
  32. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  33. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  34. 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10,
  35. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  36. 0x00, 0x00
  37. };
  38. static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
  39. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  40. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  41. 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  42. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  43. 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
  44. 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
  45. 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
  46. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
  47. 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  48. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  49. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  50. 0x00, 0x00,
  51. };
  52. static const u8 ice_fdir_tcp4_gtpu4_pkt[] = {
  53. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  54. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  55. 0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  56. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  57. 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
  58. 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
  59. 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
  60. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
  61. 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06,
  62. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  63. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  64. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  65. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  66. };
  67. static const u8 ice_fdir_icmp4_gtpu4_pkt[] = {
  68. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  69. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  70. 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  71. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  72. 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
  73. 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
  74. 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
  75. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
  76. 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01,
  77. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  78. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  79. 0x00, 0x00,
  80. };
  81. static const u8 ice_fdir_ipv4_gtpu4_pkt[] = {
  82. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  83. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  84. 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  85. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86. 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
  87. 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
  88. 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
  89. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
  90. 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
  91. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  92. 0x00, 0x00,
  93. };
  94. static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
  95. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  96. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  97. 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
  98. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  99. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  100. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  101. };
  102. static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
  103. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  104. 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
  105. 0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00,
  106. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  107. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  108. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  109. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  110. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  111. 0x00, 0x00,
  112. };
  113. static const u8 ice_fdir_ipv4_esp_pkt[] = {
  114. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  115. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  116. 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
  117. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  118. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  119. 0x00, 0x00
  120. };
  121. static const u8 ice_fdir_ipv6_esp_pkt[] = {
  122. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  123. 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
  124. 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00,
  125. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  126. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  127. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  128. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  129. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  130. };
  131. static const u8 ice_fdir_ipv4_ah_pkt[] = {
  132. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  133. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  134. 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
  135. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  136. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  137. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  138. 0x00, 0x00
  139. };
  140. static const u8 ice_fdir_ipv6_ah_pkt[] = {
  141. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  142. 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
  143. 0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00,
  144. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  145. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  147. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  148. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  149. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  150. };
  151. static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
  152. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  153. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  154. 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  155. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  156. 0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
  157. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  158. 0x00, 0x00,
  159. };
  160. static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
  161. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  162. 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
  163. 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
  164. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  165. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  166. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  167. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  168. 0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
  169. };
  170. static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
  171. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  172. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  173. 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  174. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  175. 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
  176. 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
  177. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  178. 0x00, 0x00,
  179. };
  180. static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
  181. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  182. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  183. 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  184. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  185. 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
  186. 0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
  187. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  188. 0x00, 0x00,
  189. };
  190. static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
  191. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  192. 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
  193. 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
  194. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  195. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  196. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  197. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
  198. 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
  199. 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  200. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  201. };
  202. static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
  203. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  204. 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
  205. 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
  206. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  207. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  208. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
  210. 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
  211. 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  212. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  213. };
  214. static const u8 ice_fdir_non_ip_l2_pkt[] = {
  215. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  216. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  217. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  218. };
  219. static const u8 ice_fdir_tcpv6_pkt[] = {
  220. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  221. 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
  222. 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
  223. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  224. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  225. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  226. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  227. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  228. 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
  229. 0x00, 0x00,
  230. };
  231. static const u8 ice_fdir_udpv6_pkt[] = {
  232. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  233. 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
  234. 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
  235. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  236. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  237. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  238. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  239. 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
  240. };
  241. static const u8 ice_fdir_sctpv6_pkt[] = {
  242. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  243. 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
  244. 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
  245. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  246. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  247. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  248. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  249. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  250. 0x00, 0x00,
  251. };
  252. static const u8 ice_fdir_ipv6_pkt[] = {
  253. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  254. 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
  255. 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
  256. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  257. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  258. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  259. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  260. };
  261. static const u8 ice_fdir_tcp4_tun_pkt[] = {
  262. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  263. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  264. 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  265. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  266. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  267. 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
  268. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  269. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
  270. 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
  271. 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  272. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  273. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  274. 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
  275. };
  276. static const u8 ice_fdir_udp4_tun_pkt[] = {
  277. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  278. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  279. 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  280. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  281. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  282. 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
  283. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  284. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
  285. 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
  286. 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  287. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  288. 0x00, 0x00, 0x00, 0x00,
  289. };
  290. static const u8 ice_fdir_sctp4_tun_pkt[] = {
  291. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  292. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  293. 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  294. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  295. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  296. 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
  297. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  298. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
  299. 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
  300. 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  301. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  302. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  303. };
  304. static const u8 ice_fdir_ip4_tun_pkt[] = {
  305. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  306. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  307. 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  308. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  309. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  310. 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
  311. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  312. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
  313. 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
  314. 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  315. 0x00, 0x00, 0x00, 0x00,
  316. };
  317. static const u8 ice_fdir_tcp6_tun_pkt[] = {
  318. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  319. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  320. 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  321. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  322. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  323. 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
  324. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  325. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
  326. 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
  327. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  328. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  329. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  330. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  331. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  332. 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
  333. 0x00, 0x00, 0x00, 0x00,
  334. };
  335. static const u8 ice_fdir_udp6_tun_pkt[] = {
  336. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  337. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  338. 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  339. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  340. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  341. 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
  342. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  343. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
  344. 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
  345. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  346. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  347. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  348. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  349. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  350. };
  351. static const u8 ice_fdir_sctp6_tun_pkt[] = {
  352. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  353. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  354. 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  355. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  356. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  357. 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
  358. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  359. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
  360. 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
  361. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  362. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  363. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  364. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  365. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  366. 0x00, 0x00, 0x00, 0x00,
  367. };
  368. static const u8 ice_fdir_ip6_tun_pkt[] = {
  369. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  370. 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  371. 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  372. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  373. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  374. 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
  375. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  376. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
  377. 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
  378. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  379. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  380. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  381. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  382. };
  383. /* Flow Director no-op training packet table */
  384. static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
  385. {
  386. ICE_FLTR_PTYPE_NONF_ETH,
  387. sizeof(ice_fdir_eth_pkt), ice_fdir_eth_pkt,
  388. sizeof(ice_fdir_eth_pkt), ice_fdir_eth_pkt,
  389. },
  390. {
  391. ICE_FLTR_PTYPE_NONF_IPV4_TCP,
  392. sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
  393. sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
  394. },
  395. {
  396. ICE_FLTR_PTYPE_NONF_IPV4_UDP,
  397. sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
  398. sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
  399. },
  400. {
  401. ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
  402. sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
  403. sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
  404. },
  405. {
  406. ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
  407. sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
  408. sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
  409. },
  410. {
  411. ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
  412. sizeof(ice_fdir_udp4_gtpu4_pkt),
  413. ice_fdir_udp4_gtpu4_pkt,
  414. sizeof(ice_fdir_udp4_gtpu4_pkt),
  415. ice_fdir_udp4_gtpu4_pkt,
  416. },
  417. {
  418. ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
  419. sizeof(ice_fdir_tcp4_gtpu4_pkt),
  420. ice_fdir_tcp4_gtpu4_pkt,
  421. sizeof(ice_fdir_tcp4_gtpu4_pkt),
  422. ice_fdir_tcp4_gtpu4_pkt,
  423. },
  424. {
  425. ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
  426. sizeof(ice_fdir_icmp4_gtpu4_pkt),
  427. ice_fdir_icmp4_gtpu4_pkt,
  428. sizeof(ice_fdir_icmp4_gtpu4_pkt),
  429. ice_fdir_icmp4_gtpu4_pkt,
  430. },
  431. {
  432. ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
  433. sizeof(ice_fdir_ipv4_gtpu4_pkt),
  434. ice_fdir_ipv4_gtpu4_pkt,
  435. sizeof(ice_fdir_ipv4_gtpu4_pkt),
  436. ice_fdir_ipv4_gtpu4_pkt,
  437. },
  438. {
  439. ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
  440. sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
  441. sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
  442. },
  443. {
  444. ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
  445. sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
  446. sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
  447. },
  448. {
  449. ICE_FLTR_PTYPE_NONF_IPV4_ESP,
  450. sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
  451. sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
  452. },
  453. {
  454. ICE_FLTR_PTYPE_NONF_IPV6_ESP,
  455. sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
  456. sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
  457. },
  458. {
  459. ICE_FLTR_PTYPE_NONF_IPV4_AH,
  460. sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
  461. sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
  462. },
  463. {
  464. ICE_FLTR_PTYPE_NONF_IPV6_AH,
  465. sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
  466. sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
  467. },
  468. {
  469. ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
  470. sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
  471. ice_fdir_ipv4_nat_t_esp_pkt,
  472. sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
  473. ice_fdir_ipv4_nat_t_esp_pkt,
  474. },
  475. {
  476. ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
  477. sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
  478. ice_fdir_ipv6_nat_t_esp_pkt,
  479. sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
  480. ice_fdir_ipv6_nat_t_esp_pkt,
  481. },
  482. {
  483. ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
  484. sizeof(ice_fdir_ipv4_pfcp_node_pkt),
  485. ice_fdir_ipv4_pfcp_node_pkt,
  486. sizeof(ice_fdir_ipv4_pfcp_node_pkt),
  487. ice_fdir_ipv4_pfcp_node_pkt,
  488. },
  489. {
  490. ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
  491. sizeof(ice_fdir_ipv4_pfcp_session_pkt),
  492. ice_fdir_ipv4_pfcp_session_pkt,
  493. sizeof(ice_fdir_ipv4_pfcp_session_pkt),
  494. ice_fdir_ipv4_pfcp_session_pkt,
  495. },
  496. {
  497. ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
  498. sizeof(ice_fdir_ipv6_pfcp_node_pkt),
  499. ice_fdir_ipv6_pfcp_node_pkt,
  500. sizeof(ice_fdir_ipv6_pfcp_node_pkt),
  501. ice_fdir_ipv6_pfcp_node_pkt,
  502. },
  503. {
  504. ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
  505. sizeof(ice_fdir_ipv6_pfcp_session_pkt),
  506. ice_fdir_ipv6_pfcp_session_pkt,
  507. sizeof(ice_fdir_ipv6_pfcp_session_pkt),
  508. ice_fdir_ipv6_pfcp_session_pkt,
  509. },
  510. {
  511. ICE_FLTR_PTYPE_NON_IP_L2,
  512. sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
  513. sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
  514. },
  515. {
  516. ICE_FLTR_PTYPE_NONF_IPV6_TCP,
  517. sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
  518. sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
  519. },
  520. {
  521. ICE_FLTR_PTYPE_NONF_IPV6_UDP,
  522. sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
  523. sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
  524. },
  525. {
  526. ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
  527. sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
  528. sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
  529. },
  530. {
  531. ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
  532. sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
  533. sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
  534. },
  535. };
  536. #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
  537. /**
  538. * ice_set_dflt_val_fd_desc
  539. * @fd_fltr_ctx: pointer to fd filter descriptor
  540. */
  541. static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
  542. {
  543. fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
  544. fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
  545. fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
  546. fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
  547. fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
  548. fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
  549. fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
  550. fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
  551. fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
  552. fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
  553. fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
  554. fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
  555. fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
  556. fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
  557. fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
  558. fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
  559. fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
  560. fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
  561. fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
  562. }
  563. /**
  564. * ice_set_fd_desc_val
  565. * @ctx: pointer to fd filter descriptor context
  566. * @fdir_desc: populated with fd filter descriptor values
  567. */
  568. static void
  569. ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
  570. struct ice_fltr_desc *fdir_desc)
  571. {
  572. u64 qword;
  573. /* prep QW0 of FD filter programming desc */
  574. qword = FIELD_PREP(ICE_FXD_FLTR_QW0_QINDEX_M, ctx->qindex);
  575. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_COMP_Q_M, ctx->comp_q);
  576. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_COMP_REPORT_M, ctx->comp_report);
  577. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_FD_SPACE_M, ctx->fd_space);
  578. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_STAT_CNT_M, ctx->cnt_index);
  579. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_STAT_ENA_M, ctx->cnt_ena);
  580. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_EVICT_ENA_M, ctx->evict_ena);
  581. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_TO_Q_M, ctx->toq);
  582. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_TO_Q_PRI_M, ctx->toq_prio);
  583. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_DPU_RECIPE_M, ctx->dpu_recipe);
  584. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_DROP_M, ctx->drop);
  585. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_FLEX_PRI_M, ctx->flex_prio);
  586. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_FLEX_MDID_M, ctx->flex_mdid);
  587. qword |= FIELD_PREP(ICE_FXD_FLTR_QW0_FLEX_VAL_M, ctx->flex_val);
  588. fdir_desc->qidx_compq_space_stat = cpu_to_le64(qword);
  589. /* prep QW1 of FD filter programming desc */
  590. qword = FIELD_PREP(ICE_FXD_FLTR_QW1_DTYPE_M, ctx->dtype);
  591. qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_PCMD_M, ctx->pcmd);
  592. qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_PROF_PRI_M, ctx->desc_prof_prio);
  593. qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_PROF_M, ctx->desc_prof);
  594. qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_FD_VSI_M, ctx->fd_vsi);
  595. qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_SWAP_M, ctx->swap);
  596. qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_FDID_PRI_M, ctx->fdid_prio);
  597. qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_FDID_MDID_M, ctx->fdid_mdid);
  598. qword |= FIELD_PREP(ICE_FXD_FLTR_QW1_FDID_M, ctx->fdid);
  599. fdir_desc->dtype_cmd_vsi_fdid = cpu_to_le64(qword);
  600. }
  601. /**
  602. * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
  603. * @hw: pointer to the hardware structure
  604. * @input: filter
  605. * @fdesc: filter descriptor
  606. * @add: if add is true, this is an add operation, false implies delete
  607. */
  608. void
  609. ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
  610. struct ice_fltr_desc *fdesc, bool add)
  611. {
  612. struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
  613. /* set default context info */
  614. ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
  615. /* change sideband filtering values */
  616. fdir_fltr_ctx.fdid = input->fltr_id;
  617. if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
  618. fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
  619. fdir_fltr_ctx.qindex = 0;
  620. } else if (input->dest_ctl ==
  621. ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
  622. fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
  623. fdir_fltr_ctx.qindex = 0;
  624. } else {
  625. if (input->dest_ctl ==
  626. ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
  627. fdir_fltr_ctx.toq = input->q_region;
  628. fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
  629. fdir_fltr_ctx.qindex = input->q_index;
  630. }
  631. fdir_fltr_ctx.cnt_ena = input->cnt_ena;
  632. fdir_fltr_ctx.cnt_index = input->cnt_index;
  633. fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
  634. fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
  635. if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
  636. fdir_fltr_ctx.toq_prio = 0;
  637. else
  638. fdir_fltr_ctx.toq_prio = 3;
  639. fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
  640. ICE_FXD_FLTR_QW1_PCMD_REMOVE;
  641. fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
  642. fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
  643. fdir_fltr_ctx.comp_report = input->comp_report;
  644. fdir_fltr_ctx.fdid_prio = input->fdid_prio;
  645. fdir_fltr_ctx.desc_prof = 1;
  646. fdir_fltr_ctx.desc_prof_prio = 3;
  647. ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
  648. }
  649. /**
  650. * ice_alloc_fd_res_cntr - obtain counter resource for FD type
  651. * @hw: pointer to the hardware structure
  652. * @cntr_id: returns counter index
  653. */
  654. int ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
  655. {
  656. return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
  657. ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
  658. }
  659. /**
  660. * ice_free_fd_res_cntr - Free counter resource for FD type
  661. * @hw: pointer to the hardware structure
  662. * @cntr_id: counter index to be freed
  663. */
  664. int ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
  665. {
  666. return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
  667. ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
  668. }
  669. /**
  670. * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
  671. * @hw: pointer to the hardware structure
  672. * @cntr_id: returns counter index
  673. * @num_fltr: number of filter entries to be allocated
  674. */
  675. int ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
  676. {
  677. return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
  678. ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
  679. cntr_id);
  680. }
  681. /**
  682. * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
  683. * @hw: pointer to the hardware structure
  684. * @cntr_id: returns counter index
  685. * @num_fltr: number of filter entries to be allocated
  686. */
  687. int ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
  688. {
  689. return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
  690. ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
  691. cntr_id);
  692. }
  693. /**
  694. * ice_get_fdir_cnt_all - get the number of Flow Director filters
  695. * @hw: hardware data structure
  696. *
  697. * Returns the number of filters available on device
  698. */
  699. int ice_get_fdir_cnt_all(struct ice_hw *hw)
  700. {
  701. return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
  702. }
  703. /**
  704. * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer
  705. * @pkt: packet buffer
  706. * @offset: offset into buffer
  707. * @addr: IPv6 address to convert and insert into pkt at offset
  708. */
  709. static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
  710. {
  711. int idx;
  712. for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
  713. memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
  714. sizeof(*addr));
  715. }
  716. /**
  717. * ice_pkt_insert_u6_qfi - insert a u6 value QFI into a memory buffer for GTPU
  718. * @pkt: packet buffer
  719. * @offset: offset into buffer
  720. * @data: 8 bit value to convert and insert into pkt at offset
  721. *
  722. * This function is designed for inserting QFI (6 bits) for GTPU.
  723. */
  724. static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
  725. {
  726. u8 ret;
  727. ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
  728. memcpy(pkt + offset, &ret, sizeof(ret));
  729. }
  730. /**
  731. * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
  732. * @pkt: packet buffer
  733. * @offset: offset into buffer
  734. * @data: 8 bit value to convert and insert into pkt at offset
  735. */
  736. static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
  737. {
  738. memcpy(pkt + offset, &data, sizeof(data));
  739. }
  740. /**
  741. * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
  742. * @pkt: packet buffer
  743. * @offset: offset into buffer
  744. * @data: 8 bit value to convert and insert into pkt at offset
  745. *
  746. * This function is designed for inserting Traffic Class (TC) for IPv6,
  747. * since that TC is not aligned in number of bytes. Here we split it out
  748. * into two part and fill each byte with data copy from pkt, then insert
  749. * the two bytes data one by one.
  750. */
  751. static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
  752. {
  753. u8 high, low;
  754. high = (data >> 4) + (*(pkt + offset) & 0xF0);
  755. memcpy(pkt + offset, &high, sizeof(high));
  756. low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
  757. memcpy(pkt + offset + 1, &low, sizeof(low));
  758. }
  759. /**
  760. * ice_pkt_insert_u16 - insert a be16 value into a memory buffer
  761. * @pkt: packet buffer
  762. * @offset: offset into buffer
  763. * @data: 16 bit value to convert and insert into pkt at offset
  764. */
  765. static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
  766. {
  767. memcpy(pkt + offset, &data, sizeof(data));
  768. }
  769. /**
  770. * ice_pkt_insert_u32 - insert a be32 value into a memory buffer
  771. * @pkt: packet buffer
  772. * @offset: offset into buffer
  773. * @data: 32 bit value to convert and insert into pkt at offset
  774. */
  775. static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
  776. {
  777. memcpy(pkt + offset, &data, sizeof(data));
  778. }
  779. /**
  780. * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
  781. * @pkt: packet buffer
  782. * @addr: MAC address to convert and insert into pkt at offset
  783. */
  784. static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
  785. {
  786. ether_addr_copy(pkt, addr);
  787. }
  788. /**
  789. * ice_fdir_get_gen_prgm_pkt - generate a training packet
  790. * @hw: pointer to the hardware structure
  791. * @input: flow director filter data structure
  792. * @pkt: pointer to return filter packet
  793. * @frag: generate a fragment packet
  794. * @tun: true implies generate a tunnel packet
  795. */
  796. int
  797. ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
  798. u8 *pkt, bool frag, bool tun)
  799. {
  800. enum ice_fltr_ptype flow;
  801. u16 tnl_port;
  802. u8 *loc;
  803. u16 idx;
  804. if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
  805. switch (input->ip.v4.proto) {
  806. case IPPROTO_TCP:
  807. flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
  808. break;
  809. case IPPROTO_UDP:
  810. flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
  811. break;
  812. case IPPROTO_SCTP:
  813. flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
  814. break;
  815. default:
  816. flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
  817. break;
  818. }
  819. } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
  820. switch (input->ip.v6.proto) {
  821. case IPPROTO_TCP:
  822. flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
  823. break;
  824. case IPPROTO_UDP:
  825. flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
  826. break;
  827. case IPPROTO_SCTP:
  828. flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
  829. break;
  830. default:
  831. flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
  832. break;
  833. }
  834. } else {
  835. flow = input->flow_type;
  836. }
  837. for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
  838. if (ice_fdir_pkt[idx].flow == flow)
  839. break;
  840. if (idx == ICE_FDIR_NUM_PKT)
  841. return -EINVAL;
  842. if (!tun) {
  843. memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len);
  844. loc = pkt;
  845. } else {
  846. if (!ice_get_open_tunnel_port(hw, &tnl_port, TNL_ALL))
  847. return -ENOENT;
  848. if (!ice_fdir_pkt[idx].tun_pkt)
  849. return -EINVAL;
  850. memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
  851. ice_fdir_pkt[idx].tun_pkt_len);
  852. ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
  853. htons(tnl_port));
  854. loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
  855. }
  856. /* Reverse the src and dst, since the HW expects them to be from Tx
  857. * perspective. The input from user is from Rx filter perspective.
  858. */
  859. switch (flow) {
  860. case ICE_FLTR_PTYPE_NONF_ETH:
  861. ice_pkt_insert_mac_addr(loc, input->eth.h_dest);
  862. ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->eth.h_source);
  863. if (input->ext_data.vlan_tag || input->ext_data.vlan_type) {
  864. ice_pkt_insert_u16(loc, ICE_ETH_TYPE_F_OFFSET,
  865. input->ext_data.vlan_type);
  866. ice_pkt_insert_u16(loc, ICE_ETH_VLAN_TCI_OFFSET,
  867. input->ext_data.vlan_tag);
  868. ice_pkt_insert_u16(loc, ICE_ETH_TYPE_VLAN_OFFSET,
  869. input->eth.h_proto);
  870. } else {
  871. ice_pkt_insert_u16(loc, ICE_ETH_TYPE_F_OFFSET,
  872. input->eth.h_proto);
  873. }
  874. break;
  875. case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
  876. ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
  877. input->ip.v4.src_ip);
  878. ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
  879. input->ip.v4.src_port);
  880. ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
  881. input->ip.v4.dst_ip);
  882. ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
  883. input->ip.v4.dst_port);
  884. ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
  885. ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
  886. ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
  887. if (frag)
  888. loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
  889. break;
  890. case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
  891. ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
  892. input->ip.v4.src_ip);
  893. ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
  894. input->ip.v4.src_port);
  895. ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
  896. input->ip.v4.dst_ip);
  897. ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
  898. input->ip.v4.dst_port);
  899. ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
  900. ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
  901. ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
  902. ice_pkt_insert_mac_addr(loc + ETH_ALEN,
  903. input->ext_data.src_mac);
  904. break;
  905. case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
  906. ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
  907. input->ip.v4.src_ip);
  908. ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
  909. input->ip.v4.src_port);
  910. ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
  911. input->ip.v4.dst_ip);
  912. ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
  913. input->ip.v4.dst_port);
  914. ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
  915. ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
  916. ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
  917. break;
  918. case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
  919. ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
  920. input->ip.v4.src_ip);
  921. ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
  922. input->ip.v4.dst_ip);
  923. ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
  924. ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
  925. ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
  926. input->ip.v4.proto);
  927. ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
  928. break;
  929. case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
  930. case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
  931. case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
  932. case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
  933. ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
  934. input->ip.v4.src_ip);
  935. ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
  936. input->ip.v4.dst_ip);
  937. ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
  938. input->gtpu_data.teid);
  939. ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
  940. input->gtpu_data.qfi);
  941. break;
  942. case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
  943. ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
  944. input->l2tpv3_data.session_id);
  945. break;
  946. case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
  947. ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
  948. input->l2tpv3_data.session_id);
  949. break;
  950. case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
  951. ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
  952. input->ip.v4.sec_parm_idx);
  953. break;
  954. case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
  955. ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
  956. input->ip.v6.sec_parm_idx);
  957. break;
  958. case ICE_FLTR_PTYPE_NONF_IPV4_AH:
  959. ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
  960. input->ip.v4.sec_parm_idx);
  961. break;
  962. case ICE_FLTR_PTYPE_NONF_IPV6_AH:
  963. ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
  964. input->ip.v6.sec_parm_idx);
  965. break;
  966. case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
  967. ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
  968. input->ip.v4.src_ip);
  969. ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
  970. input->ip.v4.dst_ip);
  971. ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
  972. input->ip.v4.sec_parm_idx);
  973. break;
  974. case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
  975. ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
  976. input->ip.v6.src_ip);
  977. ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
  978. input->ip.v6.dst_ip);
  979. ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
  980. input->ip.v6.sec_parm_idx);
  981. break;
  982. case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
  983. case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
  984. ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
  985. input->ip.v4.dst_port);
  986. break;
  987. case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
  988. case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
  989. ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
  990. input->ip.v6.dst_port);
  991. break;
  992. case ICE_FLTR_PTYPE_NON_IP_L2:
  993. ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
  994. input->ext_data.ether_type);
  995. break;
  996. case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
  997. ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
  998. input->ip.v6.src_ip);
  999. ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
  1000. input->ip.v6.dst_ip);
  1001. ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
  1002. input->ip.v6.src_port);
  1003. ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
  1004. input->ip.v6.dst_port);
  1005. ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
  1006. ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
  1007. ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
  1008. break;
  1009. case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
  1010. ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
  1011. input->ip.v6.src_ip);
  1012. ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
  1013. input->ip.v6.dst_ip);
  1014. ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
  1015. input->ip.v6.src_port);
  1016. ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
  1017. input->ip.v6.dst_port);
  1018. ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
  1019. ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
  1020. ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
  1021. break;
  1022. case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
  1023. ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
  1024. input->ip.v6.src_ip);
  1025. ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
  1026. input->ip.v6.dst_ip);
  1027. ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
  1028. input->ip.v6.src_port);
  1029. ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
  1030. input->ip.v6.dst_port);
  1031. ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
  1032. ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
  1033. ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
  1034. break;
  1035. case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
  1036. ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
  1037. input->ip.v6.src_ip);
  1038. ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
  1039. input->ip.v6.dst_ip);
  1040. ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
  1041. ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
  1042. ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
  1043. input->ip.v6.proto);
  1044. ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
  1045. break;
  1046. default:
  1047. return -EINVAL;
  1048. }
  1049. if (input->flex_fltr)
  1050. ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
  1051. return 0;
  1052. }
  1053. /**
  1054. * ice_fdir_has_frag - does flow type have 2 ptypes
  1055. * @flow: flow ptype
  1056. *
  1057. * returns true is there is a fragment packet for this ptype
  1058. */
  1059. bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
  1060. {
  1061. if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
  1062. return true;
  1063. else
  1064. return false;
  1065. }
  1066. /**
  1067. * ice_fdir_find_fltr_by_idx - find filter with idx
  1068. * @hw: pointer to hardware structure
  1069. * @fltr_idx: index to find.
  1070. *
  1071. * Returns pointer to filter if found or null
  1072. */
  1073. struct ice_fdir_fltr *
  1074. ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
  1075. {
  1076. struct ice_fdir_fltr *rule;
  1077. list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
  1078. /* rule ID found in the list */
  1079. if (fltr_idx == rule->fltr_id)
  1080. return rule;
  1081. if (fltr_idx < rule->fltr_id)
  1082. break;
  1083. }
  1084. return NULL;
  1085. }
  1086. /**
  1087. * ice_fdir_list_add_fltr - add a new node to the flow director filter list
  1088. * @hw: hardware structure
  1089. * @fltr: filter node to add to structure
  1090. */
  1091. void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
  1092. {
  1093. struct ice_fdir_fltr *rule, *parent = NULL;
  1094. list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
  1095. /* rule ID found or pass its spot in the list */
  1096. if (rule->fltr_id >= fltr->fltr_id)
  1097. break;
  1098. parent = rule;
  1099. }
  1100. if (parent)
  1101. list_add(&fltr->fltr_node, &parent->fltr_node);
  1102. else
  1103. list_add(&fltr->fltr_node, &hw->fdir_list_head);
  1104. }
  1105. /**
  1106. * ice_fdir_update_cntrs - increment / decrement filter counter
  1107. * @hw: pointer to hardware structure
  1108. * @flow: filter flow type
  1109. * @add: true implies filters added
  1110. */
  1111. void
  1112. ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add)
  1113. {
  1114. int incr;
  1115. incr = add ? 1 : -1;
  1116. hw->fdir_active_fltr += incr;
  1117. if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX)
  1118. ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
  1119. else
  1120. hw->fdir_fltr_cnt[flow] += incr;
  1121. }
  1122. /**
  1123. * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
  1124. * @a: IP v6 address
  1125. * @b: IP v6 address
  1126. *
  1127. * Returns 0 on equal, returns non-0 if different
  1128. */
  1129. static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
  1130. {
  1131. return memcmp(a, b, 4 * sizeof(__be32));
  1132. }
  1133. /**
  1134. * ice_fdir_comp_rules - compare 2 filters
  1135. * @a: a Flow Director filter data structure
  1136. * @b: a Flow Director filter data structure
  1137. *
  1138. * Returns true if the filters match
  1139. */
  1140. static bool
  1141. ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b)
  1142. {
  1143. enum ice_fltr_ptype flow_type = a->flow_type;
  1144. /* The calling function already checks that the two filters have the
  1145. * same flow_type.
  1146. */
  1147. switch (flow_type) {
  1148. case ICE_FLTR_PTYPE_NONF_ETH:
  1149. if (!memcmp(&a->eth, &b->eth, sizeof(a->eth)))
  1150. return true;
  1151. break;
  1152. case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
  1153. case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
  1154. case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
  1155. if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
  1156. a->ip.v4.src_ip == b->ip.v4.src_ip &&
  1157. a->ip.v4.dst_port == b->ip.v4.dst_port &&
  1158. a->ip.v4.src_port == b->ip.v4.src_port)
  1159. return true;
  1160. break;
  1161. case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
  1162. if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
  1163. a->ip.v4.src_ip == b->ip.v4.src_ip &&
  1164. a->ip.v4.l4_header == b->ip.v4.l4_header &&
  1165. a->ip.v4.proto == b->ip.v4.proto &&
  1166. a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
  1167. a->ip.v4.tos == b->ip.v4.tos)
  1168. return true;
  1169. break;
  1170. case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
  1171. case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
  1172. case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
  1173. if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
  1174. a->ip.v6.src_port == b->ip.v6.src_port &&
  1175. !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
  1176. b->ip.v6.dst_ip) &&
  1177. !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
  1178. b->ip.v6.src_ip))
  1179. return true;
  1180. break;
  1181. case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
  1182. if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
  1183. a->ip.v6.src_port == b->ip.v6.src_port)
  1184. return true;
  1185. break;
  1186. default:
  1187. break;
  1188. }
  1189. return false;
  1190. }
  1191. /**
  1192. * ice_fdir_is_dup_fltr - test if filter is already in list for PF
  1193. * @hw: hardware data structure
  1194. * @input: Flow Director filter data structure
  1195. *
  1196. * Returns true if the filter is found in the list
  1197. */
  1198. bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
  1199. {
  1200. struct ice_fdir_fltr *rule;
  1201. bool ret = false;
  1202. list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
  1203. if (rule->flow_type != input->flow_type)
  1204. continue;
  1205. ret = ice_fdir_comp_rules(rule, input);
  1206. if (ret) {
  1207. if (rule->fltr_id == input->fltr_id &&
  1208. rule->q_index != input->q_index)
  1209. ret = false;
  1210. else
  1211. break;
  1212. }
  1213. }
  1214. return ret;
  1215. }