examples/ipsec-secgw: add default flow for inline Rx
The default flow created would enable security processing on all ESP packets. If the default flow is created, SA based rte_flow creation would be skipped. Signed-off-by: Ankur Dwivedi <adwivedi@marvell.com> Signed-off-by: Anoob Joseph <anoobj@marvell.com> Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com> Acked-by: Akhil Goyal <akhil.goyal@nxp.com>
This commit is contained in:
parent
dc38ae8d08
commit
513f192b5f
@ -129,6 +129,8 @@ struct ethaddr_info ethaddr_tbl[RTE_MAX_ETHPORTS] = {
|
||||
{ 0, ETHADDR(0x00, 0x16, 0x3e, 0x49, 0x9e, 0xdd) }
|
||||
};
|
||||
|
||||
struct flow_info flow_info_tbl[RTE_MAX_ETHPORTS];
|
||||
|
||||
#define CMD_LINE_OPT_CONFIG "config"
|
||||
#define CMD_LINE_OPT_SINGLE_SA "single-sa"
|
||||
#define CMD_LINE_OPT_CRYPTODEV_MASK "cryptodev_mask"
|
||||
@ -2432,6 +2434,48 @@ reassemble_init(void)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void
|
||||
create_default_ipsec_flow(uint16_t port_id, uint64_t rx_offloads)
|
||||
{
|
||||
struct rte_flow_action action[2];
|
||||
struct rte_flow_item pattern[2];
|
||||
struct rte_flow_attr attr = {0};
|
||||
struct rte_flow_error err;
|
||||
struct rte_flow *flow;
|
||||
int ret;
|
||||
|
||||
if (!(rx_offloads & DEV_RX_OFFLOAD_SECURITY))
|
||||
return;
|
||||
|
||||
/* Add the default rte_flow to enable SECURITY for all ESP packets */
|
||||
|
||||
pattern[0].type = RTE_FLOW_ITEM_TYPE_ESP;
|
||||
pattern[0].spec = NULL;
|
||||
pattern[0].mask = NULL;
|
||||
pattern[0].last = NULL;
|
||||
pattern[1].type = RTE_FLOW_ITEM_TYPE_END;
|
||||
|
||||
action[0].type = RTE_FLOW_ACTION_TYPE_SECURITY;
|
||||
action[0].conf = NULL;
|
||||
action[1].type = RTE_FLOW_ACTION_TYPE_END;
|
||||
action[1].conf = NULL;
|
||||
|
||||
attr.ingress = 1;
|
||||
|
||||
ret = rte_flow_validate(port_id, &attr, pattern, action, &err);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
flow = rte_flow_create(port_id, &attr, pattern, action, &err);
|
||||
if (flow == NULL)
|
||||
return;
|
||||
|
||||
flow_info_tbl[port_id].rx_def_flow = flow;
|
||||
RTE_LOG(INFO, IPSEC,
|
||||
"Created default flow enabling SECURITY for all ESP traffic on port %d\n",
|
||||
port_id);
|
||||
}
|
||||
|
||||
int32_t
|
||||
main(int32_t argc, char **argv)
|
||||
{
|
||||
@ -2440,7 +2484,8 @@ main(int32_t argc, char **argv)
|
||||
uint32_t i;
|
||||
uint8_t socket_id;
|
||||
uint16_t portid;
|
||||
uint64_t req_rx_offloads, req_tx_offloads;
|
||||
uint64_t req_rx_offloads[RTE_MAX_ETHPORTS];
|
||||
uint64_t req_tx_offloads[RTE_MAX_ETHPORTS];
|
||||
size_t sess_sz;
|
||||
|
||||
/* init EAL */
|
||||
@ -2502,8 +2547,10 @@ main(int32_t argc, char **argv)
|
||||
if ((enabled_port_mask & (1 << portid)) == 0)
|
||||
continue;
|
||||
|
||||
sa_check_offloads(portid, &req_rx_offloads, &req_tx_offloads);
|
||||
port_init(portid, req_rx_offloads, req_tx_offloads);
|
||||
sa_check_offloads(portid, &req_rx_offloads[portid],
|
||||
&req_tx_offloads[portid]);
|
||||
port_init(portid, req_rx_offloads[portid],
|
||||
req_tx_offloads[portid]);
|
||||
}
|
||||
|
||||
cryptodevs_init();
|
||||
@ -2513,11 +2560,9 @@ main(int32_t argc, char **argv)
|
||||
if ((enabled_port_mask & (1 << portid)) == 0)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Start device
|
||||
* note: device must be started before a flow rule
|
||||
* can be installed.
|
||||
*/
|
||||
/* Create flow before starting the device */
|
||||
create_default_ipsec_flow(portid, req_rx_offloads[portid]);
|
||||
|
||||
ret = rte_eth_dev_start(portid);
|
||||
if (ret < 0)
|
||||
rte_exit(EXIT_FAILURE, "rte_eth_dev_start: "
|
||||
|
@ -275,6 +275,10 @@ create_inline_session(struct socket_ctx *skt_ctx, struct ipsec_sa *sa,
|
||||
unsigned int i;
|
||||
unsigned int j;
|
||||
|
||||
/* Don't create flow if default flow is created */
|
||||
if (flow_info_tbl[sa->portid].rx_def_flow)
|
||||
return 0;
|
||||
|
||||
ret = rte_eth_dev_info_get(sa->portid, &dev_info);
|
||||
if (ret != 0) {
|
||||
RTE_LOG(ERR, IPSEC,
|
||||
@ -410,7 +414,6 @@ create_inline_session(struct socket_ctx *skt_ctx, struct ipsec_sa *sa,
|
||||
ips->security.ol_flags = sec_cap->ol_flags;
|
||||
ips->security.ctx = sec_ctx;
|
||||
}
|
||||
sa->cdev_id_qp = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -87,6 +87,12 @@ struct app_sa_prm {
|
||||
|
||||
extern struct app_sa_prm app_sa_prm;
|
||||
|
||||
struct flow_info {
|
||||
struct rte_flow *rx_def_flow;
|
||||
};
|
||||
|
||||
extern struct flow_info flow_info_tbl[RTE_MAX_ETHPORTS];
|
||||
|
||||
enum {
|
||||
IPSEC_SESSION_PRIMARY = 0,
|
||||
IPSEC_SESSION_FALLBACK = 1,
|
||||
|
Loading…
Reference in New Issue
Block a user