2017-12-19 15:49:02 +00:00
|
|
|
/* SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
* Copyright(c) 2016-2017 Intel Corporation
|
2016-03-11 02:12:40 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __IPSEC_H__
|
|
|
|
#define __IPSEC_H__
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
#include <rte_byteorder.h>
|
|
|
|
#include <rte_crypto.h>
|
2017-10-25 15:07:27 +00:00
|
|
|
#include <rte_security.h>
|
|
|
|
#include <rte_flow.h>
|
2019-01-10 21:09:10 +00:00
|
|
|
#include <rte_ipsec.h>
|
2016-03-11 02:12:40 +00:00
|
|
|
|
2020-02-27 16:18:33 +00:00
|
|
|
#include "ipsec-secgw.h"
|
|
|
|
|
2016-03-11 02:12:40 +00:00
|
|
|
#define RTE_LOGTYPE_IPSEC_ESP RTE_LOGTYPE_USER2
|
|
|
|
#define RTE_LOGTYPE_IPSEC_IPIP RTE_LOGTYPE_USER3
|
|
|
|
|
2018-05-09 08:58:41 +00:00
|
|
|
#define MAX_INFLIGHT 128
|
2016-03-11 02:12:40 +00:00
|
|
|
#define MAX_QP_PER_LCORE 256
|
|
|
|
|
|
|
|
#define MAX_DIGEST_SIZE 32 /* Bytes -- 256 bits */
|
|
|
|
|
2018-04-11 06:40:45 +00:00
|
|
|
#define IPSEC_OFFLOAD_ESN_SOFTLIMIT 0xffffff00
|
|
|
|
|
2017-07-02 05:41:14 +00:00
|
|
|
#define IV_OFFSET (sizeof(struct rte_crypto_op) + \
|
|
|
|
sizeof(struct rte_crypto_sym_op))
|
|
|
|
|
2016-03-11 02:12:40 +00:00
|
|
|
#define DEFAULT_MAX_CATEGORIES 1
|
|
|
|
|
|
|
|
#define INVALID_SPI (0)
|
|
|
|
|
2019-04-04 12:13:26 +00:00
|
|
|
#define DISCARD INVALID_SPI
|
|
|
|
#define BYPASS UINT32_MAX
|
2016-03-11 02:12:40 +00:00
|
|
|
|
|
|
|
#define IPSEC_XFORM_MAX 2
|
|
|
|
|
2016-06-09 08:42:48 +00:00
|
|
|
#define IP6_VERSION (6)
|
|
|
|
|
2016-03-11 02:12:40 +00:00
|
|
|
struct rte_crypto_xform;
|
|
|
|
struct ipsec_xform;
|
|
|
|
struct rte_mbuf;
|
|
|
|
|
|
|
|
struct ipsec_sa;
|
2020-01-31 17:39:39 +00:00
|
|
|
/*
|
|
|
|
* Keeps number of configured SA's for each address family:
|
|
|
|
*/
|
|
|
|
struct ipsec_sa_cnt {
|
|
|
|
uint32_t nb_v4;
|
|
|
|
uint32_t nb_v6;
|
|
|
|
};
|
2016-03-11 02:12:40 +00:00
|
|
|
|
2016-06-09 08:42:48 +00:00
|
|
|
typedef int32_t (*ipsec_xform_fn)(struct rte_mbuf *m, struct ipsec_sa *sa,
|
2016-03-11 02:12:40 +00:00
|
|
|
struct rte_crypto_op *cop);
|
|
|
|
|
2016-06-09 08:42:48 +00:00
|
|
|
struct ip_addr {
|
|
|
|
union {
|
|
|
|
uint32_t ip4;
|
|
|
|
union {
|
|
|
|
uint64_t ip6[2];
|
|
|
|
uint8_t ip6_b[16];
|
2016-07-19 11:06:00 +00:00
|
|
|
} ip6;
|
|
|
|
} ip;
|
2016-06-09 08:42:48 +00:00
|
|
|
};
|
|
|
|
|
2020-04-07 06:30:42 +00:00
|
|
|
#define MAX_KEY_SIZE 36
|
2016-09-21 12:05:18 +00:00
|
|
|
|
2019-01-10 21:09:10 +00:00
|
|
|
/*
|
|
|
|
* application wide SA parameters
|
|
|
|
*/
|
|
|
|
struct app_sa_prm {
|
|
|
|
uint32_t enable; /* use librte_ipsec API for ipsec pkt processing */
|
|
|
|
uint32_t window_size; /* replay window size */
|
|
|
|
uint32_t enable_esn; /* enable/disable ESN support */
|
2020-01-31 17:39:43 +00:00
|
|
|
uint32_t cache_sz; /* per lcore SA cache size */
|
2019-01-10 21:09:10 +00:00
|
|
|
uint64_t flags; /* rte_ipsec_sa_prm.flags */
|
|
|
|
};
|
|
|
|
|
|
|
|
extern struct app_sa_prm app_sa_prm;
|
|
|
|
|
2020-02-27 16:18:23 +00:00
|
|
|
struct flow_info {
|
|
|
|
struct rte_flow *rx_def_flow;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern struct flow_info flow_info_tbl[RTE_MAX_ETHPORTS];
|
|
|
|
|
2019-10-14 13:48:40 +00:00
|
|
|
enum {
|
|
|
|
IPSEC_SESSION_PRIMARY = 0,
|
|
|
|
IPSEC_SESSION_FALLBACK = 1,
|
|
|
|
IPSEC_SESSION_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
#define IPSEC_SA_OFFLOAD_FALLBACK_FLAG (1)
|
|
|
|
|
|
|
|
static inline struct ipsec_sa *
|
|
|
|
ipsec_mask_saptr(void *ptr)
|
|
|
|
{
|
|
|
|
uintptr_t i = (uintptr_t)ptr;
|
|
|
|
static const uintptr_t mask = IPSEC_SA_OFFLOAD_FALLBACK_FLAG;
|
|
|
|
|
|
|
|
i &= ~mask;
|
|
|
|
|
|
|
|
return (struct ipsec_sa *)i;
|
|
|
|
}
|
|
|
|
|
2016-03-11 02:12:40 +00:00
|
|
|
struct ipsec_sa {
|
2019-10-14 13:48:40 +00:00
|
|
|
struct rte_ipsec_session sessions[IPSEC_SESSION_MAX];
|
2016-03-11 02:12:40 +00:00
|
|
|
uint32_t spi;
|
|
|
|
uint32_t cdev_id_qp;
|
2016-09-29 15:44:07 +00:00
|
|
|
uint64_t seq;
|
|
|
|
uint32_t salt;
|
2019-10-14 13:48:40 +00:00
|
|
|
uint32_t fallback_sessions;
|
2016-03-11 02:12:40 +00:00
|
|
|
enum rte_crypto_cipher_algorithm cipher_algo;
|
|
|
|
enum rte_crypto_auth_algorithm auth_algo;
|
2017-07-02 05:41:24 +00:00
|
|
|
enum rte_crypto_aead_algorithm aead_algo;
|
2016-03-11 02:12:40 +00:00
|
|
|
uint16_t digest_len;
|
|
|
|
uint16_t iv_len;
|
|
|
|
uint16_t block_size;
|
|
|
|
uint16_t flags;
|
2016-06-09 08:42:48 +00:00
|
|
|
#define IP4_TUNNEL (1 << 0)
|
|
|
|
#define IP6_TUNNEL (1 << 1)
|
2016-06-09 08:42:49 +00:00
|
|
|
#define TRANSPORT (1 << 2)
|
examples/ipsec-secgw: fix inline modes
Application ipsec-secgw is not working for IPv4 transport mode and for
IPv6 both transport and tunnel mode.
IPv6 tunnel mode is not working due to wrongly assigned fields of
security association patterns, as it was IPv4, during creation of
inline crypto session.
IPv6 and IPv4 transport mode is iterating through security capabilities
until it reaches tunnel, which causes session to be created as tunnel,
instead of transport. Another issue, is that config file does not
provide source and destination ip addresses for transport mode, which
are required by NIC to perform inline crypto. It uses default addresses
stored in security association (all zeroes), which causes dropped
packages.
To fix that, reorganization of code in create_session() is needed,
to behave appropriately to given protocol (IPv6/IPv4). Change in
iteration through security capabilities is also required, to check
for expected mode (not only tunnel).
For lack of addresses issue, some resolving mechanism is needed.
Approach is to store addresses in security association, as it is
for tunnel mode. Difference is that they are obtained from sp rules,
instead of config file. To do that, sp[4/6]_spi_present() function
is used to find addresses based on spi value, and then stored in
corresponding sa rule. This approach assumes, that every sp rule
for inline crypto have valid addresses, as well as range of addresses
is not supported.
New flags for ipsec_sa structure are required to distinguish between
IPv4 and IPv6 transport modes. Because of that, there is need to
change all checks done on these flags, so they work as expected.
Fixes: ec17993a145a ("examples/ipsec-secgw: support security offload")
Fixes: 9a0752f498d2 ("net/ixgbe: enable inline IPsec")
Cc: stable@dpdk.org
Signed-off-by: Mariusz Drost <mariuszx.drost@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Acked-by: Akhil Goyal <akhil.goyal@nxp.com>
Tested-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
2019-06-26 13:26:17 +00:00
|
|
|
#define IP4_TRANSPORT (1 << 3)
|
|
|
|
#define IP6_TRANSPORT (1 << 4)
|
2016-06-09 08:42:48 +00:00
|
|
|
struct ip_addr src;
|
|
|
|
struct ip_addr dst;
|
2016-09-21 12:05:18 +00:00
|
|
|
uint8_t cipher_key[MAX_KEY_SIZE];
|
|
|
|
uint16_t cipher_key_len;
|
|
|
|
uint8_t auth_key[MAX_KEY_SIZE];
|
|
|
|
uint16_t auth_key_len;
|
2016-09-29 15:44:09 +00:00
|
|
|
uint16_t aad_len;
|
2017-10-25 15:07:27 +00:00
|
|
|
union {
|
|
|
|
struct rte_crypto_sym_xform *xforms;
|
|
|
|
struct rte_security_ipsec_xform *sec_xform;
|
|
|
|
};
|
|
|
|
enum rte_security_ipsec_sa_direction direction;
|
|
|
|
uint16_t portid;
|
2020-04-16 16:47:29 +00:00
|
|
|
uint8_t fdir_qid;
|
|
|
|
uint8_t fdir_flag;
|
2017-10-25 15:07:27 +00:00
|
|
|
|
|
|
|
#define MAX_RTE_FLOW_PATTERN (4)
|
2017-12-18 10:24:36 +00:00
|
|
|
#define MAX_RTE_FLOW_ACTIONS (3)
|
2017-10-25 15:07:27 +00:00
|
|
|
struct rte_flow_item pattern[MAX_RTE_FLOW_PATTERN];
|
|
|
|
struct rte_flow_action action[MAX_RTE_FLOW_ACTIONS];
|
|
|
|
struct rte_flow_attr attr;
|
|
|
|
union {
|
|
|
|
struct rte_flow_item_ipv4 ipv4_spec;
|
|
|
|
struct rte_flow_item_ipv6 ipv6_spec;
|
|
|
|
};
|
|
|
|
struct rte_flow_item_esp esp_spec;
|
|
|
|
struct rte_flow *flow;
|
|
|
|
struct rte_security_session_conf sess_conf;
|
2016-03-11 02:12:40 +00:00
|
|
|
} __rte_cache_aligned;
|
|
|
|
|
2020-02-27 16:18:32 +00:00
|
|
|
struct ipsec_xf {
|
|
|
|
struct rte_crypto_sym_xform a;
|
|
|
|
struct rte_crypto_sym_xform b;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ipsec_sad {
|
|
|
|
struct rte_ipsec_sad *sad_v4;
|
|
|
|
struct rte_ipsec_sad *sad_v6;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct sa_ctx {
|
|
|
|
void *satbl; /* pointer to array of rte_ipsec_sa objects*/
|
|
|
|
struct ipsec_sad sad;
|
|
|
|
struct ipsec_xf *xf;
|
|
|
|
uint32_t nb_sa;
|
|
|
|
struct ipsec_sa sa[];
|
|
|
|
};
|
|
|
|
|
2016-03-11 02:12:40 +00:00
|
|
|
struct ipsec_mbuf_metadata {
|
|
|
|
struct ipsec_sa *sa;
|
|
|
|
struct rte_crypto_op cop;
|
|
|
|
struct rte_crypto_sym_op sym_cop;
|
2017-07-02 05:41:12 +00:00
|
|
|
uint8_t buf[32];
|
2016-09-29 15:44:07 +00:00
|
|
|
} __rte_cache_aligned;
|
2016-03-11 02:12:40 +00:00
|
|
|
|
examples/ipsec-secgw: fix inline modes
Application ipsec-secgw is not working for IPv4 transport mode and for
IPv6 both transport and tunnel mode.
IPv6 tunnel mode is not working due to wrongly assigned fields of
security association patterns, as it was IPv4, during creation of
inline crypto session.
IPv6 and IPv4 transport mode is iterating through security capabilities
until it reaches tunnel, which causes session to be created as tunnel,
instead of transport. Another issue, is that config file does not
provide source and destination ip addresses for transport mode, which
are required by NIC to perform inline crypto. It uses default addresses
stored in security association (all zeroes), which causes dropped
packages.
To fix that, reorganization of code in create_session() is needed,
to behave appropriately to given protocol (IPv6/IPv4). Change in
iteration through security capabilities is also required, to check
for expected mode (not only tunnel).
For lack of addresses issue, some resolving mechanism is needed.
Approach is to store addresses in security association, as it is
for tunnel mode. Difference is that they are obtained from sp rules,
instead of config file. To do that, sp[4/6]_spi_present() function
is used to find addresses based on spi value, and then stored in
corresponding sa rule. This approach assumes, that every sp rule
for inline crypto have valid addresses, as well as range of addresses
is not supported.
New flags for ipsec_sa structure are required to distinguish between
IPv4 and IPv6 transport modes. Because of that, there is need to
change all checks done on these flags, so they work as expected.
Fixes: ec17993a145a ("examples/ipsec-secgw: support security offload")
Fixes: 9a0752f498d2 ("net/ixgbe: enable inline IPsec")
Cc: stable@dpdk.org
Signed-off-by: Mariusz Drost <mariuszx.drost@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Acked-by: Akhil Goyal <akhil.goyal@nxp.com>
Tested-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
2019-06-26 13:26:17 +00:00
|
|
|
#define IS_TRANSPORT(flags) ((flags) & TRANSPORT)
|
|
|
|
|
|
|
|
#define IS_TUNNEL(flags) ((flags) & (IP4_TUNNEL | IP6_TUNNEL))
|
|
|
|
|
|
|
|
#define IS_IP4(flags) ((flags) & (IP4_TUNNEL | IP4_TRANSPORT))
|
|
|
|
|
|
|
|
#define IS_IP6(flags) ((flags) & (IP6_TUNNEL | IP6_TRANSPORT))
|
|
|
|
|
|
|
|
#define IS_IP4_TUNNEL(flags) ((flags) & IP4_TUNNEL)
|
|
|
|
|
|
|
|
#define IS_IP6_TUNNEL(flags) ((flags) & IP6_TUNNEL)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Macro for getting ipsec_sa flags statuses without version of protocol
|
|
|
|
* used for transport (IP4_TRANSPORT and IP6_TRANSPORT flags).
|
|
|
|
*/
|
|
|
|
#define WITHOUT_TRANSPORT_VERSION(flags) \
|
|
|
|
((flags) & (IP4_TUNNEL | \
|
|
|
|
IP6_TUNNEL | \
|
|
|
|
TRANSPORT))
|
|
|
|
|
2016-03-11 02:12:40 +00:00
|
|
|
struct cdev_qp {
|
|
|
|
uint16_t id;
|
|
|
|
uint16_t qp;
|
|
|
|
uint16_t in_flight;
|
|
|
|
uint16_t len;
|
|
|
|
struct rte_crypto_op *buf[MAX_PKT_BURST] __rte_aligned(sizeof(void *));
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ipsec_ctx {
|
|
|
|
struct rte_hash *cdev_map;
|
2016-06-09 08:42:48 +00:00
|
|
|
struct sp_ctx *sp4_ctx;
|
|
|
|
struct sp_ctx *sp6_ctx;
|
2016-03-11 02:12:40 +00:00
|
|
|
struct sa_ctx *sa_ctx;
|
|
|
|
uint16_t nb_qps;
|
|
|
|
uint16_t last_qp;
|
|
|
|
struct cdev_qp tbl[MAX_QP_PER_LCORE];
|
2017-07-05 05:26:12 +00:00
|
|
|
struct rte_mempool *session_pool;
|
2019-01-10 14:50:15 +00:00
|
|
|
struct rte_mempool *session_priv_pool;
|
2018-01-18 15:41:43 +00:00
|
|
|
struct rte_mbuf *ol_pkts[MAX_PKT_BURST] __rte_aligned(sizeof(void *));
|
|
|
|
uint16_t ol_pkts_cnt;
|
2019-01-10 21:09:04 +00:00
|
|
|
uint64_t ipv4_offloads;
|
|
|
|
uint64_t ipv6_offloads;
|
2016-03-11 02:12:40 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct cdev_key {
|
|
|
|
uint16_t lcore_id;
|
|
|
|
uint8_t cipher_algo;
|
|
|
|
uint8_t auth_algo;
|
2017-10-24 12:48:57 +00:00
|
|
|
uint8_t aead_algo;
|
2016-03-11 02:12:40 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct socket_ctx {
|
2016-06-09 08:42:48 +00:00
|
|
|
struct sa_ctx *sa_in;
|
|
|
|
struct sa_ctx *sa_out;
|
|
|
|
struct sp_ctx *sp_ip4_in;
|
|
|
|
struct sp_ctx *sp_ip4_out;
|
|
|
|
struct sp_ctx *sp_ip6_in;
|
|
|
|
struct sp_ctx *sp_ip6_out;
|
|
|
|
struct rt_ctx *rt_ip4;
|
|
|
|
struct rt_ctx *rt_ip6;
|
2016-03-11 02:12:40 +00:00
|
|
|
struct rte_mempool *mbuf_pool;
|
2019-06-25 23:16:47 +00:00
|
|
|
struct rte_mempool *mbuf_pool_indir;
|
2017-07-05 05:26:12 +00:00
|
|
|
struct rte_mempool *session_pool;
|
2019-01-10 14:50:15 +00:00
|
|
|
struct rte_mempool *session_priv_pool;
|
2016-03-11 02:12:40 +00:00
|
|
|
};
|
|
|
|
|
2016-09-29 15:44:07 +00:00
|
|
|
struct cnt_blk {
|
|
|
|
uint32_t salt;
|
|
|
|
uint64_t iv;
|
|
|
|
uint32_t cnt;
|
2020-02-09 17:29:23 +00:00
|
|
|
} __rte_packed;
|
2016-09-29 15:44:07 +00:00
|
|
|
|
2020-02-27 16:18:33 +00:00
|
|
|
/* Socket ctx */
|
|
|
|
extern struct socket_ctx socket_ctx[NB_SOCKETS];
|
|
|
|
|
|
|
|
void
|
|
|
|
ipsec_poll_mode_worker(void);
|
|
|
|
|
|
|
|
int
|
|
|
|
ipsec_launch_one_lcore(void *args);
|
|
|
|
|
2020-02-27 16:18:32 +00:00
|
|
|
extern struct ipsec_sa *sa_out;
|
|
|
|
extern uint32_t nb_sa_out;
|
|
|
|
|
|
|
|
extern struct ipsec_sa *sa_in;
|
|
|
|
extern uint32_t nb_sa_in;
|
|
|
|
|
2016-03-11 02:12:40 +00:00
|
|
|
uint16_t
|
|
|
|
ipsec_inbound(struct ipsec_ctx *ctx, struct rte_mbuf *pkts[],
|
|
|
|
uint16_t nb_pkts, uint16_t len);
|
|
|
|
|
|
|
|
uint16_t
|
|
|
|
ipsec_outbound(struct ipsec_ctx *ctx, struct rte_mbuf *pkts[],
|
|
|
|
uint32_t sa_idx[], uint16_t nb_pkts, uint16_t len);
|
|
|
|
|
2019-01-10 21:09:06 +00:00
|
|
|
uint16_t
|
|
|
|
ipsec_inbound_cqp_dequeue(struct ipsec_ctx *ctx, struct rte_mbuf *pkts[],
|
|
|
|
uint16_t len);
|
|
|
|
|
|
|
|
uint16_t
|
|
|
|
ipsec_outbound_cqp_dequeue(struct ipsec_ctx *ctx, struct rte_mbuf *pkts[],
|
|
|
|
uint16_t len);
|
|
|
|
|
2019-01-10 21:09:11 +00:00
|
|
|
void
|
|
|
|
ipsec_process(struct ipsec_ctx *ctx, struct ipsec_traffic *trf);
|
|
|
|
|
|
|
|
void
|
|
|
|
ipsec_cqp_process(struct ipsec_ctx *ctx, struct ipsec_traffic *trf);
|
|
|
|
|
2016-03-11 02:12:40 +00:00
|
|
|
static inline uint16_t
|
|
|
|
ipsec_metadata_size(void)
|
|
|
|
{
|
|
|
|
return sizeof(struct ipsec_mbuf_metadata);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline struct ipsec_mbuf_metadata *
|
|
|
|
get_priv(struct rte_mbuf *m)
|
|
|
|
{
|
2018-06-18 23:36:18 +00:00
|
|
|
return rte_mbuf_to_priv(m);
|
2016-03-11 02:12:40 +00:00
|
|
|
}
|
|
|
|
|
2016-09-29 15:44:07 +00:00
|
|
|
static inline void *
|
|
|
|
get_cnt_blk(struct rte_mbuf *m)
|
|
|
|
{
|
|
|
|
struct ipsec_mbuf_metadata *priv = get_priv(m);
|
|
|
|
|
|
|
|
return &priv->buf[0];
|
|
|
|
}
|
|
|
|
|
2016-09-29 15:44:09 +00:00
|
|
|
static inline void *
|
|
|
|
get_aad(struct rte_mbuf *m)
|
|
|
|
{
|
|
|
|
struct ipsec_mbuf_metadata *priv = get_priv(m);
|
|
|
|
|
|
|
|
return &priv->buf[16];
|
|
|
|
}
|
|
|
|
|
2016-09-29 15:44:07 +00:00
|
|
|
static inline void *
|
|
|
|
get_sym_cop(struct rte_crypto_op *cop)
|
|
|
|
{
|
|
|
|
return (cop + 1);
|
|
|
|
}
|
|
|
|
|
2019-10-14 13:48:39 +00:00
|
|
|
static inline struct rte_ipsec_session *
|
2019-10-14 13:48:40 +00:00
|
|
|
ipsec_get_primary_session(struct ipsec_sa *sa)
|
|
|
|
{
|
|
|
|
return &sa->sessions[IPSEC_SESSION_PRIMARY];
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline struct rte_ipsec_session *
|
|
|
|
ipsec_get_fallback_session(struct ipsec_sa *sa)
|
2019-10-14 13:48:39 +00:00
|
|
|
{
|
2019-10-14 13:48:40 +00:00
|
|
|
return &sa->sessions[IPSEC_SESSION_FALLBACK];
|
2019-10-14 13:48:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline enum rte_security_session_action_type
|
|
|
|
ipsec_get_action_type(struct ipsec_sa *sa)
|
|
|
|
{
|
|
|
|
struct rte_ipsec_session *ips;
|
2019-10-14 13:48:40 +00:00
|
|
|
ips = ipsec_get_primary_session(sa);
|
2019-10-14 13:48:39 +00:00
|
|
|
return ips->type;
|
|
|
|
}
|
|
|
|
|
2016-03-11 02:12:40 +00:00
|
|
|
int
|
|
|
|
inbound_sa_check(struct sa_ctx *sa_ctx, struct rte_mbuf *m, uint32_t sa_idx);
|
|
|
|
|
|
|
|
void
|
|
|
|
inbound_sa_lookup(struct sa_ctx *sa_ctx, struct rte_mbuf *pkts[],
|
2019-10-14 13:48:40 +00:00
|
|
|
void *sa[], uint16_t nb_pkts);
|
2016-03-11 02:12:40 +00:00
|
|
|
|
|
|
|
void
|
|
|
|
outbound_sa_lookup(struct sa_ctx *sa_ctx, uint32_t sa_idx[],
|
2019-10-14 13:48:40 +00:00
|
|
|
void *sa[], uint16_t nb_pkts);
|
2016-03-11 02:12:40 +00:00
|
|
|
|
|
|
|
void
|
2016-09-21 12:05:18 +00:00
|
|
|
sp4_init(struct socket_ctx *ctx, int32_t socket_id);
|
2016-06-09 08:42:48 +00:00
|
|
|
|
|
|
|
void
|
2016-09-21 12:05:18 +00:00
|
|
|
sp6_init(struct socket_ctx *ctx, int32_t socket_id);
|
2016-03-11 02:12:40 +00:00
|
|
|
|
2019-01-10 21:09:10 +00:00
|
|
|
/*
|
|
|
|
* Search through SP rules for given SPI.
|
|
|
|
* Returns first rule index if found(greater or equal then zero),
|
|
|
|
* or -ENOENT otherwise.
|
|
|
|
*/
|
|
|
|
int
|
examples/ipsec-secgw: fix inline modes
Application ipsec-secgw is not working for IPv4 transport mode and for
IPv6 both transport and tunnel mode.
IPv6 tunnel mode is not working due to wrongly assigned fields of
security association patterns, as it was IPv4, during creation of
inline crypto session.
IPv6 and IPv4 transport mode is iterating through security capabilities
until it reaches tunnel, which causes session to be created as tunnel,
instead of transport. Another issue, is that config file does not
provide source and destination ip addresses for transport mode, which
are required by NIC to perform inline crypto. It uses default addresses
stored in security association (all zeroes), which causes dropped
packages.
To fix that, reorganization of code in create_session() is needed,
to behave appropriately to given protocol (IPv6/IPv4). Change in
iteration through security capabilities is also required, to check
for expected mode (not only tunnel).
For lack of addresses issue, some resolving mechanism is needed.
Approach is to store addresses in security association, as it is
for tunnel mode. Difference is that they are obtained from sp rules,
instead of config file. To do that, sp[4/6]_spi_present() function
is used to find addresses based on spi value, and then stored in
corresponding sa rule. This approach assumes, that every sp rule
for inline crypto have valid addresses, as well as range of addresses
is not supported.
New flags for ipsec_sa structure are required to distinguish between
IPv4 and IPv6 transport modes. Because of that, there is need to
change all checks done on these flags, so they work as expected.
Fixes: ec17993a145a ("examples/ipsec-secgw: support security offload")
Fixes: 9a0752f498d2 ("net/ixgbe: enable inline IPsec")
Cc: stable@dpdk.org
Signed-off-by: Mariusz Drost <mariuszx.drost@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Acked-by: Akhil Goyal <akhil.goyal@nxp.com>
Tested-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
2019-06-26 13:26:17 +00:00
|
|
|
sp4_spi_present(uint32_t spi, int inbound, struct ip_addr ip_addr[2],
|
|
|
|
uint32_t mask[2]);
|
2019-01-10 21:09:10 +00:00
|
|
|
int
|
examples/ipsec-secgw: fix inline modes
Application ipsec-secgw is not working for IPv4 transport mode and for
IPv6 both transport and tunnel mode.
IPv6 tunnel mode is not working due to wrongly assigned fields of
security association patterns, as it was IPv4, during creation of
inline crypto session.
IPv6 and IPv4 transport mode is iterating through security capabilities
until it reaches tunnel, which causes session to be created as tunnel,
instead of transport. Another issue, is that config file does not
provide source and destination ip addresses for transport mode, which
are required by NIC to perform inline crypto. It uses default addresses
stored in security association (all zeroes), which causes dropped
packages.
To fix that, reorganization of code in create_session() is needed,
to behave appropriately to given protocol (IPv6/IPv4). Change in
iteration through security capabilities is also required, to check
for expected mode (not only tunnel).
For lack of addresses issue, some resolving mechanism is needed.
Approach is to store addresses in security association, as it is
for tunnel mode. Difference is that they are obtained from sp rules,
instead of config file. To do that, sp[4/6]_spi_present() function
is used to find addresses based on spi value, and then stored in
corresponding sa rule. This approach assumes, that every sp rule
for inline crypto have valid addresses, as well as range of addresses
is not supported.
New flags for ipsec_sa structure are required to distinguish between
IPv4 and IPv6 transport modes. Because of that, there is need to
change all checks done on these flags, so they work as expected.
Fixes: ec17993a145a ("examples/ipsec-secgw: support security offload")
Fixes: 9a0752f498d2 ("net/ixgbe: enable inline IPsec")
Cc: stable@dpdk.org
Signed-off-by: Mariusz Drost <mariuszx.drost@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Acked-by: Akhil Goyal <akhil.goyal@nxp.com>
Tested-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
2019-06-26 13:26:17 +00:00
|
|
|
sp6_spi_present(uint32_t spi, int inbound, struct ip_addr ip_addr[2],
|
|
|
|
uint32_t mask[2]);
|
2019-01-10 21:09:10 +00:00
|
|
|
|
2019-04-04 12:13:26 +00:00
|
|
|
/*
|
|
|
|
* Search through SA entries for given SPI.
|
|
|
|
* Returns first entry index if found(greater or equal then zero),
|
|
|
|
* or -ENOENT otherwise.
|
|
|
|
*/
|
|
|
|
int
|
2020-01-31 17:39:40 +00:00
|
|
|
sa_spi_present(struct sa_ctx *sa_ctx, uint32_t spi, int inbound);
|
2019-04-04 12:13:26 +00:00
|
|
|
|
2016-03-11 02:12:40 +00:00
|
|
|
void
|
2016-09-21 12:05:18 +00:00
|
|
|
sa_init(struct socket_ctx *ctx, int32_t socket_id);
|
2016-03-11 02:12:40 +00:00
|
|
|
|
|
|
|
void
|
2016-09-21 12:05:18 +00:00
|
|
|
rt_init(struct socket_ctx *ctx, int32_t socket_id);
|
2016-03-11 02:12:40 +00:00
|
|
|
|
2019-01-10 21:09:04 +00:00
|
|
|
int
|
|
|
|
sa_check_offloads(uint16_t port_id, uint64_t *rx_offloads,
|
|
|
|
uint64_t *tx_offloads);
|
|
|
|
|
2019-01-10 21:09:05 +00:00
|
|
|
int
|
2019-05-21 16:13:03 +00:00
|
|
|
add_dst_ethaddr(uint16_t port, const struct rte_ether_addr *addr);
|
2019-01-10 21:09:05 +00:00
|
|
|
|
2019-01-10 21:09:06 +00:00
|
|
|
void
|
|
|
|
enqueue_cop_burst(struct cdev_qp *cqp);
|
|
|
|
|
2019-01-10 21:09:11 +00:00
|
|
|
int
|
2019-10-14 13:48:39 +00:00
|
|
|
create_lookaside_session(struct ipsec_ctx *ipsec_ctx, struct ipsec_sa *sa,
|
|
|
|
struct rte_ipsec_session *ips);
|
2019-07-19 12:22:32 +00:00
|
|
|
|
|
|
|
int
|
2019-10-14 13:48:39 +00:00
|
|
|
create_inline_session(struct socket_ctx *skt_ctx, struct ipsec_sa *sa,
|
|
|
|
struct rte_ipsec_session *ips);
|
2020-04-16 16:47:29 +00:00
|
|
|
int
|
|
|
|
check_flow_params(uint16_t fdir_portid, uint8_t fdir_qid);
|
|
|
|
|
|
|
|
int
|
|
|
|
create_ipsec_esp_flow(struct ipsec_sa *sa);
|
2019-01-10 21:09:11 +00:00
|
|
|
|
2020-04-20 19:16:35 +00:00
|
|
|
uint32_t
|
|
|
|
get_nb_crypto_sessions(void);
|
|
|
|
|
2016-03-11 02:12:40 +00:00
|
|
|
#endif /* __IPSEC_H__ */
|