@@ -146,26 +146,15 @@ nfp_flower_compile_tport(struct nfp_flower_tp_ports *frame,
146146}
147147
148148static void
149- nfp_flower_compile_ipv4 (struct nfp_flower_ipv4 * frame ,
150- struct tc_cls_flower_offload * flow ,
151- bool mask_version )
149+ nfp_flower_compile_ip_ext (struct nfp_flower_ip_ext * frame ,
150+ struct tc_cls_flower_offload * flow ,
151+ bool mask_version )
152152{
153153 struct fl_flow_key * target = mask_version ? flow -> mask : flow -> key ;
154- struct flow_dissector_key_ipv4_addrs * addr ;
155- struct flow_dissector_key_basic * basic ;
156-
157- memset (frame , 0 , sizeof (struct nfp_flower_ipv4 ));
158-
159- if (dissector_uses_key (flow -> dissector ,
160- FLOW_DISSECTOR_KEY_IPV4_ADDRS )) {
161- addr = skb_flow_dissector_target (flow -> dissector ,
162- FLOW_DISSECTOR_KEY_IPV4_ADDRS ,
163- target );
164- frame -> ipv4_src = addr -> src ;
165- frame -> ipv4_dst = addr -> dst ;
166- }
167154
168155 if (dissector_uses_key (flow -> dissector , FLOW_DISSECTOR_KEY_BASIC )) {
156+ struct flow_dissector_key_basic * basic ;
157+
169158 basic = skb_flow_dissector_target (flow -> dissector ,
170159 FLOW_DISSECTOR_KEY_BASIC ,
171160 target );
@@ -201,6 +190,40 @@ nfp_flower_compile_ipv4(struct nfp_flower_ipv4 *frame,
201190 if (tcp_flags & TCPHDR_URG )
202191 frame -> flags |= NFP_FL_TCP_FLAG_URG ;
203192 }
193+
194+ if (dissector_uses_key (flow -> dissector , FLOW_DISSECTOR_KEY_CONTROL )) {
195+ struct flow_dissector_key_control * key ;
196+
197+ key = skb_flow_dissector_target (flow -> dissector ,
198+ FLOW_DISSECTOR_KEY_CONTROL ,
199+ target );
200+ if (key -> flags & FLOW_DIS_IS_FRAGMENT )
201+ frame -> flags |= NFP_FL_IP_FRAGMENTED ;
202+ if (key -> flags & FLOW_DIS_FIRST_FRAG )
203+ frame -> flags |= NFP_FL_IP_FRAG_FIRST ;
204+ }
205+ }
206+
207+ static void
208+ nfp_flower_compile_ipv4 (struct nfp_flower_ipv4 * frame ,
209+ struct tc_cls_flower_offload * flow ,
210+ bool mask_version )
211+ {
212+ struct fl_flow_key * target = mask_version ? flow -> mask : flow -> key ;
213+ struct flow_dissector_key_ipv4_addrs * addr ;
214+
215+ memset (frame , 0 , sizeof (struct nfp_flower_ipv4 ));
216+
217+ if (dissector_uses_key (flow -> dissector ,
218+ FLOW_DISSECTOR_KEY_IPV4_ADDRS )) {
219+ addr = skb_flow_dissector_target (flow -> dissector ,
220+ FLOW_DISSECTOR_KEY_IPV4_ADDRS ,
221+ target );
222+ frame -> ipv4_src = addr -> src ;
223+ frame -> ipv4_dst = addr -> dst ;
224+ }
225+
226+ nfp_flower_compile_ip_ext (& frame -> ip_ext , flow , mask_version );
204227}
205228
206229static void
@@ -210,7 +233,6 @@ nfp_flower_compile_ipv6(struct nfp_flower_ipv6 *frame,
210233{
211234 struct fl_flow_key * target = mask_version ? flow -> mask : flow -> key ;
212235 struct flow_dissector_key_ipv6_addrs * addr ;
213- struct flow_dissector_key_basic * basic ;
214236
215237 memset (frame , 0 , sizeof (struct nfp_flower_ipv6 ));
216238
@@ -223,22 +245,7 @@ nfp_flower_compile_ipv6(struct nfp_flower_ipv6 *frame,
223245 frame -> ipv6_dst = addr -> dst ;
224246 }
225247
226- if (dissector_uses_key (flow -> dissector , FLOW_DISSECTOR_KEY_BASIC )) {
227- basic = skb_flow_dissector_target (flow -> dissector ,
228- FLOW_DISSECTOR_KEY_BASIC ,
229- target );
230- frame -> proto = basic -> ip_proto ;
231- }
232-
233- if (dissector_uses_key (flow -> dissector , FLOW_DISSECTOR_KEY_IP )) {
234- struct flow_dissector_key_ip * flow_ip ;
235-
236- flow_ip = skb_flow_dissector_target (flow -> dissector ,
237- FLOW_DISSECTOR_KEY_IP ,
238- target );
239- frame -> tos = flow_ip -> tos ;
240- frame -> ttl = flow_ip -> ttl ;
241- }
248+ nfp_flower_compile_ip_ext (& frame -> ip_ext , flow , mask_version );
242249}
243250
244251static void
0 commit comments