@@ -138,18 +138,13 @@ i40e_rxq_rearm(struct i40e_rx_queue *rxq)
138
138
static inline void
139
139
desc_to_olflags_v (__m128i descs [4 ], struct rte_mbuf * * rx_pkts )
140
140
{
141
- __m128i vlan0 , vlan1 , rss ;
142
- union {
143
- uint16_t e [4 ];
144
- uint64_t dword ;
145
- } vol ;
141
+ __m128i vlan0 , vlan1 , rss , l3_l4e ;
146
142
147
143
/* mask everything except rss and vlan flags
148
144
*bit2 is for vlan tag, bits 13:12 for rss
149
145
*/
150
- const __m128i rss_vlan_msk = _mm_set_epi16 (
151
- 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
152
- 0x3004 , 0x3004 , 0x3004 , 0x3004 );
146
+ const __m128i rss_vlan_msk = _mm_set_epi32 (
147
+ 0x1c03004 , 0x1c03004 , 0x1c03004 , 0x1c03004 );
153
148
154
149
/* map rss and vlan type to rss hash and vlan flag */
155
150
const __m128i vlan_flags = _mm_set_epi8 (0 , 0 , 0 , 0 ,
@@ -162,23 +157,36 @@ desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts)
162
157
0 , 0 , 0 , 0 ,
163
158
PKT_RX_FDIR , 0 , PKT_RX_RSS_HASH , 0 );
164
159
165
- vlan0 = _mm_unpackhi_epi16 (descs [0 ], descs [1 ]);
166
- vlan1 = _mm_unpackhi_epi16 (descs [2 ], descs [3 ]);
167
- vlan0 = _mm_unpacklo_epi32 (vlan0 , vlan1 );
160
+ const __m128i l3_l4e_flags = _mm_set_epi8 (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
161
+ PKT_RX_EIP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD | PKT_RX_IP_CKSUM_BAD ,
162
+ PKT_RX_EIP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD ,
163
+ PKT_RX_EIP_CKSUM_BAD | PKT_RX_IP_CKSUM_BAD ,
164
+ PKT_RX_EIP_CKSUM_BAD ,
165
+ PKT_RX_L4_CKSUM_BAD | PKT_RX_IP_CKSUM_BAD ,
166
+ PKT_RX_L4_CKSUM_BAD ,
167
+ PKT_RX_IP_CKSUM_BAD ,
168
+ 0 );
169
+
170
+ vlan0 = _mm_unpackhi_epi32 (descs [0 ], descs [1 ]);
171
+ vlan1 = _mm_unpackhi_epi32 (descs [2 ], descs [3 ]);
172
+ vlan0 = _mm_unpacklo_epi64 (vlan0 , vlan1 );
168
173
169
174
vlan1 = _mm_and_si128 (vlan0 , rss_vlan_msk );
170
175
vlan0 = _mm_shuffle_epi8 (vlan_flags , vlan1 );
171
176
172
- rss = _mm_srli_epi16 (vlan1 , 12 );
177
+ rss = _mm_srli_epi32 (vlan1 , 12 );
173
178
rss = _mm_shuffle_epi8 (rss_flags , rss );
174
179
180
+ l3_l4e = _mm_srli_epi32 (vlan1 , 22 );
181
+ l3_l4e = _mm_shuffle_epi8 (l3_l4e_flags , l3_l4e );
182
+
175
183
vlan0 = _mm_or_si128 (vlan0 , rss );
176
- vol . dword = _mm_cvtsi128_si64 (vlan0 );
184
+ vlan0 = _mm_or_si128 (vlan0 , l3_l4e );
177
185
178
- rx_pkts [0 ]-> ol_flags = vol . e [ 0 ] ;
179
- rx_pkts [1 ]-> ol_flags = vol . e [ 1 ] ;
180
- rx_pkts [2 ]-> ol_flags = vol . e [ 2 ] ;
181
- rx_pkts [3 ]-> ol_flags = vol . e [ 3 ] ;
186
+ rx_pkts [0 ]-> ol_flags = _mm_extract_epi16 ( vlan0 , 0 ) ;
187
+ rx_pkts [1 ]-> ol_flags = _mm_extract_epi16 ( vlan0 , 2 ) ;
188
+ rx_pkts [2 ]-> ol_flags = _mm_extract_epi16 ( vlan0 , 4 ) ;
189
+ rx_pkts [3 ]-> ol_flags = _mm_extract_epi16 ( vlan0 , 6 ) ;
182
190
}
183
191
#else
184
192
#define desc_to_olflags_v (desc , rx_pkts ) do {} while (0)
0 commit comments