* Initialise related rte_ipsec_sa object. */
| 1550 | * Initialise related rte_ipsec_sa object. |
| 1551 | */ |
| 1552 | static int |
| 1553 | ipsec_sa_init(struct ipsec_sa *lsa, struct rte_ipsec_sa *sa, uint32_t sa_size, |
| 1554 | struct socket_ctx *skt_ctx, struct ipsec_ctx *ips_ctx[], |
| 1555 | const struct eventmode_conf *em_conf) |
| 1556 | { |
| 1557 | int rc; |
| 1558 | struct rte_ipsec_sa_prm prm; |
| 1559 | struct rte_ipsec_session *ips; |
| 1560 | struct rte_ipv4_hdr v4 = { |
| 1561 | .version_ihl = IPVERSION << 4 | |
| 1562 | sizeof(v4) / RTE_IPV4_IHL_MULTIPLIER, |
| 1563 | .time_to_live = IPDEFTTL, |
| 1564 | .next_proto_id = lsa->udp_encap ? IPPROTO_UDP : IPPROTO_ESP, |
| 1565 | .src_addr = lsa->src.ip.ip4, |
| 1566 | .dst_addr = lsa->dst.ip.ip4, |
| 1567 | }; |
| 1568 | struct rte_ipv6_hdr v6 = { |
| 1569 | .vtc_flow = htonl(IP6_VERSION << 28), |
| 1570 | .proto = lsa->udp_encap ? IPPROTO_UDP : IPPROTO_ESP, |
| 1571 | }; |
| 1572 | |
| 1573 | if (IS_IP6_TUNNEL(lsa->flags)) { |
| 1574 | memcpy(v6.src_addr, lsa->src.ip.ip6.ip6_b, sizeof(v6.src_addr)); |
| 1575 | memcpy(v6.dst_addr, lsa->dst.ip.ip6.ip6_b, sizeof(v6.dst_addr)); |
| 1576 | } |
| 1577 | |
| 1578 | rc = fill_ipsec_sa_prm(&prm, lsa, &v4, &v6); |
| 1579 | if (rc == 0) |
| 1580 | rc = rte_ipsec_sa_init(sa, &prm, sa_size); |
| 1581 | if (rc < 0) |
| 1582 | return rc; |
| 1583 | |
| 1584 | if (lsa->flags & SA_TELEMETRY_ENABLE) |
| 1585 | rte_ipsec_telemetry_sa_add(sa); |
| 1586 | |
| 1587 | /* init primary processing session */ |
| 1588 | ips = ipsec_get_primary_session(lsa); |
| 1589 | rc = fill_ipsec_session(ips, sa); |
| 1590 | if (rc != 0) |
| 1591 | return rc; |
| 1592 | |
| 1593 | /* init inline fallback processing session */ |
| 1594 | if (lsa->fallback_sessions == 1) { |
| 1595 | struct rte_ipsec_session *ipfs = ipsec_get_fallback_session(lsa); |
| 1596 | if (ipfs->security.ses == NULL) { |
| 1597 | rc = create_lookaside_session(ips_ctx, skt_ctx, em_conf, lsa, ipfs); |
| 1598 | if (rc != 0) |
| 1599 | return rc; |
| 1600 | } |
| 1601 | rc = fill_ipsec_session(ipfs, sa); |
| 1602 | } |
| 1603 | |
| 1604 | return rc; |
| 1605 | } |
| 1606 | |
| 1607 | /* |
| 1608 | * Allocate space and init rte_ipsec_sa structures, |
no test coverage detected