| 1652 | } |
| 1653 | |
| 1654 | static int |
| 1655 | ipsec_session_create(struct rte_swx_ipsec *ipsec, |
| 1656 | struct rte_swx_ipsec_sa_params *p, |
| 1657 | struct rte_ipsec_session *s) |
| 1658 | { |
| 1659 | struct rte_ipv4_hdr ipv4_hdr; |
| 1660 | struct rte_ipv6_hdr ipv6_hdr; |
| 1661 | struct rte_crypto_sym_xform crypto_xform[2]; |
| 1662 | struct rte_ipsec_sa_prm sa_prm; |
| 1663 | struct rte_ipsec_sa *sa = NULL; |
| 1664 | struct rte_cryptodev_sym_session *crypto_session = NULL; |
| 1665 | int sa_size; |
| 1666 | int sa_valid = 0, status = 0; |
| 1667 | |
| 1668 | tunnel_ipv4_header_set(&ipv4_hdr, p); |
| 1669 | tunnel_ipv6_header_set(&ipv6_hdr, p); |
| 1670 | |
| 1671 | /* IPsec library SA setup. */ |
| 1672 | status = ipsec_sa_prm_get(p, &sa_prm, &ipv4_hdr, &ipv6_hdr, crypto_xform); |
| 1673 | if (status) |
| 1674 | goto error; |
| 1675 | |
| 1676 | sa_size = rte_ipsec_sa_size(&sa_prm); |
| 1677 | if (sa_size < 0) { |
| 1678 | status = sa_size; |
| 1679 | goto error; |
| 1680 | } |
| 1681 | if (!sa_size) { |
| 1682 | status = -EINVAL; |
| 1683 | goto error; |
| 1684 | } |
| 1685 | |
| 1686 | sa = calloc(1, sa_size); |
| 1687 | if (!sa) { |
| 1688 | status = -ENOMEM; |
| 1689 | goto error; |
| 1690 | } |
| 1691 | |
| 1692 | sa_size = rte_ipsec_sa_init(sa, &sa_prm, sa_size); |
| 1693 | if (sa_size < 0) { |
| 1694 | status = sa_size; |
| 1695 | goto error; |
| 1696 | } |
| 1697 | if (!sa_size) { |
| 1698 | status = -EINVAL; |
| 1699 | goto error; |
| 1700 | } |
| 1701 | |
| 1702 | sa_valid = 1; |
| 1703 | |
| 1704 | /* Cryptodev library session setup. */ |
| 1705 | crypto_session = rte_cryptodev_sym_session_create(ipsec->dev_id, |
| 1706 | sa_prm.crypto_xform, |
| 1707 | ipsec->mp_session); |
| 1708 | if (!crypto_session) { |
| 1709 | status = -ENOMEM; |
| 1710 | goto error; |
| 1711 | } |
no test coverage detected