MCPcopy Create free account
hub / github.com/F-Stack/f-stack / esp_outb_tun_prepare

Function esp_outb_tun_prepare

dpdk/lib/ipsec/esp_outb.c:291–340  ·  view source on GitHub ↗

* setup/update packets and crypto ops for ESP outbound tunnel case. */

Source from the content-addressed store, hash-verified

289 * setup/update packets and crypto ops for ESP outbound tunnel case.
290 */
291uint16_t
292esp_outb_tun_prepare(const struct rte_ipsec_session *ss, struct rte_mbuf *mb[],
293 struct rte_crypto_op *cop[], uint16_t num)
294{
295 int32_t rc;
296 uint32_t i, k, n;
297 uint64_t sqn;
298 rte_be64_t sqc;
299 struct rte_ipsec_sa *sa;
300 struct rte_cryptodev_sym_session *cs;
301 union sym_op_data icv;
302 uint64_t iv[IPSEC_MAX_IV_QWORD];
303 uint32_t dr[num];
304
305 sa = ss->sa;
306 cs = ss->crypto.ses;
307
308 n = num;
309 sqn = esn_outb_update_sqn(sa, &n);
310 if (n != num)
311 rte_errno = EOVERFLOW;
312
313 k = 0;
314 for (i = 0; i != n; i++) {
315
316 sqc = rte_cpu_to_be_64(sqn + i);
317 gen_iv(iv, sqc);
318
319 /* try to update the packet itself */
320 rc = outb_tun_pkt_prepare(sa, sqc, iv, mb[i], &icv,
321 sa->sqh_len, 0);
322 /* success, setup crypto op */
323 if (rc >= 0) {
324 outb_pkt_xprepare(sa, sqc, &icv);
325 lksd_none_cop_prepare(cop[k], cs, mb[i]);
326 outb_cop_prepare(cop[k], sa, iv, &icv, 0, rc);
327 k++;
328 /* failure, put packet into the death-row */
329 } else {
330 dr[i - k] = i;
331 rte_errno = -rc;
332 }
333 }
334
335 /* copy not prepared mbufs beyond good ones */
336 if (k != n && k != 0)
337 move_bad_mbufs(mb, dr, n, n - k);
338
339 return k;
340}
341
342/*
343 * setup/update packet data and metadata for ESP outbound transport case.

Callers

nothing calls this directly

Calls 7

esn_outb_update_sqnFunction · 0.85
gen_ivFunction · 0.85
outb_tun_pkt_prepareFunction · 0.85
outb_pkt_xprepareFunction · 0.85
lksd_none_cop_prepareFunction · 0.85
outb_cop_prepareFunction · 0.85
move_bad_mbufsFunction · 0.85

Tested by

no test coverage detected