On 08/21/2014 10:10 PM, Robbie King wrote:
diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c
new file mode 100644
index 0000000..6cad92a
--- /dev/null
+++ b/example/ipsec/odp_ipsec.c
[...]
+/**
+ * odp_schedule replacement to poll queues versus using ODP scheduler
+ */
+static
+odp_buffer_t polled_odp_schedule(odp_queue_t *from, uint64_t wait)
+{
+ uint64_t start_cycle, cycle, diff;
+
+ start_cycle = 0;
+
+ while (1) {
+ int idx;
+
+ for (idx = 0; idx < num_polled_queues; idx++) {
+ odp_buffer_t queue = poll_queues[idx];
s/odp_buffer_t/odp_queue_t/
+ odp_buffer_t buf;
+
+ buf = odp_queue_deq(queue);
+
+ if (ODP_BUFFER_INVALID != buf) {
+ *from = queue;
+ return buf;
+ }
+ }
[...]
+/**
+ * IPsec post argument processing intialization
+ *
+ * Resolve SP DB with SA DB and create corresponding IPsec cache entries
+ *
+ * @param api_mode Mode to use when invoking per packet crypto API
+ */
+static
+void ipsec_init_post(crypto_api_mode_e api_mode)
+{
+ sp_db_entry_t *entry;
+
+ /* Attempt to find appropriate SA for each SP */
+ for (entry = sp_db->list; NULL != entry; entry = entry->next) {
+ sa_db_entry_t *cipher_sa = NULL;
+ sa_db_entry_t *auth_sa = NULL;
+
+ if (entry->esp)
+ cipher_sa = find_sa_db_entry(&entry->src_subnet,
+ &entry->dst_subnet,
+ 1);
+ if (entry->ah)
+ auth_sa = find_sa_db_entry(&entry->src_subnet,
+ &entry->dst_subnet,
+ 0);
+
+ if (cipher_sa || auth_sa)
+ create_ipsec_cache_entry(cipher_sa,
+ auth_sa,
+ api_mode,
+ entry->input,
+ completionq,
+ out_pool);
create_ipsec_cache_entry() may fail if session creation failed,
so entry won't be found during lookup. It worth to print some warning
here or exit application.
+ else {
+ printf(" WARNING: SA not found for SP\n");
+ dump_sp_db_entry(entry);
+ }
+ }
+}
[...]
+/**
+ * Packet Processing - Input IPsec packet processing cleanup
+ *
+ * @param pkt Packet to handle
+ * @param ctx Packet process context
+ *
+ * @return PKT_CONTINUE if successful else PKT_DROP
+ */
+static
+pkt_disposition_e do_ipsec_in_finish(odp_packet_t pkt,
+ pkt_ctx_t *ctx)
+{
+ odp_buffer_t event;
+ odp_crypto_compl_status_t cipher_rc, auth_rc;
+ odp_ipv4hdr_t *ip = (odp_ipv4hdr_t *)odp_packet_l3(pkt);
pkt is a 'completion event' but not yet a packet here. I'll try to
address it in my RFC, but for now I'm postprocessing 'completion event'
to convert it into packet in
odp_crypto_get_operation_compl_status(...). Could you please invoke
ip = (odp_ipv4hdr_t *)odp_packet_l3(pkt);
after odp_crypto_get_operation_compl_status(...). Just a few lines
below.
+ int hdr_len = ctx->ipsec.hdr_len;
+ int trl_len = 0;
+
+ /* Check crypto result */
+ event = odp_buffer_from_packet(pkt);
+ odp_crypto_get_operation_compl_status(event, &cipher_rc, &auth_rc);
+ if (!is_crypto_compl_status_ok(&cipher_rc))
+ return PKT_DROP;
+ if (!is_crypto_compl_status_ok(&auth_rc))
+ return PKT_DROP;
[...]
+/**
+ * Packet Processing - Output IPsec packet processing cleanup
+ *
+ * @param pkt Packet to handle
+ * @param ctx Packet process context
+ *
+ * @return PKT_CONTINUE if successful else PKT_DROP
+ */
+static
+pkt_disposition_e do_ipsec_out_finish(odp_packet_t pkt,
+ pkt_ctx_t *ctx)
+{
+ odp_buffer_t event;
+ odp_crypto_compl_status_t cipher_rc, auth_rc;
+ odp_ipv4hdr_t *ip = (odp_ipv4hdr_t *)odp_packet_l3(pkt);
The same request here. Move odp_packet_l3(pkt) after
odp_crypto_get_operation_compl_status().
+
+ /* Check crypto result */
+ event = odp_buffer_from_packet(pkt);
+ odp_crypto_get_operation_compl_status(event, &cipher_rc, &auth_rc);
+ if (!is_crypto_compl_status_ok(&cipher_rc))
+ return PKT_DROP;
+ if (!is_crypto_compl_status_ok(&auth_rc))
+ return PKT_DROP;
[...]
diff --git a/example/ipsec/odp_ipsec_misc.h b/example/ipsec/odp_ipsec_misc.h
new file mode 100644
index 0000000..e5db950
--- /dev/null
+++ b/example/ipsec/odp_ipsec_misc.h
@@ -0,0 +1,321 @@
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_IPSEC_MISC_H_
+#define ODP_IPSEC_MISC_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <odp.h>
+#include <helper/odp_ip.h>
+#include <helper/odp_ipsec.h>
+
+#define TRUE 1
+#define FALSE 0
My SDK also defines TRUE/FALSE and it confilicts here.
Could you wrap it with
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
Or should we define a ODP_TRUE/ODP_FALSE in some header?
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp