* setup/update packets and crypto ops for ESP outbound tunnel case. */
| 289 | * setup/update packets and crypto ops for ESP outbound tunnel case. |
| 290 | */ |
| 291 | uint16_t |
| 292 | esp_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. |
nothing calls this directly
no test coverage detected