Dmitry Eremin-Solenikov(lumag) replied on github web page:

example/ipsec_api/odp_ipsec.c
line 611
@@ -0,0 +1,1248 @@
+/* Copyright (c) 2013, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * @example odp_example_ipsec.c  ODP basic packet IO cross connect with IPsec 
test application
+ */
+
+/* enable strtok */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdlib.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <inttypes.h>
+
+#include <example_debug.h>
+
+#include <odp_api.h>
+
+#include <odp/helper/odph_api.h>
+
+#include <stdbool.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <sys/ioctl.h>
+
+#include <sys/socket.h>
+#include <netpacket/packet.h>
+#include <net/ethernet.h>
+#include <arpa/inet.h>
+
+#include <odp_ipsec_misc.h>
+#include <odp_ipsec_sa_db.h>
+#include <odp_ipsec_sp_db.h>
+#include <odp_ipsec_fwd_db.h>
+#include <odp_ipsec_cache.h>
+#include <odp_ipsec_stream.h>
+
+#define MAX_WORKERS     32   /**< maximum number of worker threads */
+
+/**
+ * Parsed command line application arguments
+ */
+typedef struct {
+       int cpu_count;
+       int if_count;           /**< Number of interfaces to be used */
+       char **if_names;        /**< Array of pointers to interface names */
+       odp_ipsec_op_mode_t mode; /**< IPsec operation mode */
+       odp_pool_t pool;        /**< Buffer pool for packet IO */
+       char *if_str;           /**< Storage for interface names */
+       odp_bool_t lookup;
+} appl_args_t;
+
+/**
+ * Grouping of both parsed CL args and thread specific args - alloc together
+ */
+typedef struct {
+       /** Application (parsed) arguments */
+       appl_args_t appl;
+} args_t;
+
+/* helper funcs */
+static void parse_args(int argc, char *argv[], appl_args_t *appl_args);
+static void print_info(char *progname, appl_args_t *appl_args);
+static void usage(char *progname);
+
+/** Global pointer to args */
+static args_t *args;
+
+/**
+ * Buffer pool for packet IO
+ */
+#define SHM_PKT_POOL_BUF_COUNT 1024
+#define SHM_PKT_POOL_BUF_SIZE  4096
+#define SHM_PKT_POOL_SIZE      (SHM_PKT_POOL_BUF_COUNT * SHM_PKT_POOL_BUF_SIZE)
+
+static odp_pool_t pkt_pool = ODP_POOL_INVALID;
+
+/** ORDERED queue (eventually) for per packet crypto API completion events */
+static odp_queue_t completionq = ODP_QUEUE_INVALID;
+
+/** Synchronize threads before packet processing begins */
+static odp_barrier_t sync_barrier;
+
+/**
+ * Packet processing states/steps
+ */
+typedef enum {
+       PKT_STATE_INPUT_VERIFY,        /**< Verify IPv4 and ETH */
+       PKT_STATE_IPSEC_IN_CLASSIFY,   /**< Initiate input IPsec */
+       PKT_STATE_ROUTE_LOOKUP,        /**< Use DST IP to find output IF */
+       PKT_STATE_IPSEC_OUT_CLASSIFY,  /**< Intiate output IPsec */
+       PKT_STATE_TRANSMIT,            /**< Send packet to output IF queue */
+} pkt_state_e;
+
+/**
+ * Packet processing result codes
+ */
+typedef enum {
+       PKT_CONTINUE,    /**< No events posted, keep processing */
+       PKT_POSTED,      /**< Event posted, stop processing */
+       PKT_DROP,        /**< Reason to drop detected, stop processing */
+       PKT_DONE         /**< Finished with packet, stop processing */
+} pkt_disposition_e;
+
+/**
+ * Per packet processing context
+ */
+typedef struct {
+       odp_buffer_t buffer;  /**< Buffer for context */
+       pkt_state_e  state;   /**< Next processing step */
+       odp_pktout_queue_t pktout; /**< Packet output queue */
+       odp_pktio_t pktio; /**< Packet I/O */
+       odph_ethhdr_t eth; /**< L2 header */
+} pkt_ctx_t;
+
+#define SHM_CTX_POOL_BUF_SIZE  (sizeof(pkt_ctx_t))
+#define SHM_CTX_POOL_BUF_COUNT (SHM_PKT_POOL_BUF_COUNT)
+#define SHM_CTX_POOL_SIZE      (SHM_CTX_POOL_BUF_COUNT * SHM_CTX_POOL_BUF_SIZE)
+
+static odp_pool_t ctx_pool = ODP_POOL_INVALID;
+
+/**
+ * Allocate per packet processing context and associate it with
+ * packet buffer
+ *
+ * @param pkt  Packet
+ *
+ * @return pointer to context area
+ */
+static
+pkt_ctx_t *alloc_pkt_ctx(odp_packet_t pkt)
+{
+       odp_buffer_t ctx_buf = odp_buffer_alloc(ctx_pool);
+       pkt_ctx_t *ctx;
+
+       if (odp_unlikely(ODP_BUFFER_INVALID == ctx_buf))
+               return NULL;
+
+       ctx = odp_buffer_addr(ctx_buf);
+       memset(ctx, 0, sizeof(*ctx));
+       ctx->buffer = ctx_buf;
+       odp_packet_user_ptr_set(pkt, ctx);
+
+       return ctx;
+}
+
+/**
+ * Release per packet resources
+ *
+ * @param ctx  Packet context
+ */
+static
+void free_pkt_ctx(pkt_ctx_t *ctx)
+{
+       odp_buffer_free(ctx->buffer);
+}
+
+/**
+ * Example supports either polling queues or using odp_schedule
+ */
+typedef odp_queue_t (*queue_create_func_t)
+                   (const char *, const odp_queue_param_t *);
+typedef odp_event_t (*schedule_func_t) (odp_queue_t *);
+
+static queue_create_func_t queue_create;
+static schedule_func_t schedule;
+
+#define MAX_POLL_QUEUES 256
+
+static odp_queue_t poll_queues[MAX_POLL_QUEUES];
+static int num_polled_queues;
+
+/**
+ * odp_queue_create wrapper to enable polling versus scheduling
+ */
+static
+odp_queue_t polled_odp_queue_create(const char *name,
+                                   const odp_queue_param_t *param)
+{
+       odp_queue_t my_queue;
+       odp_queue_param_t qp;
+       odp_queue_type_t type;
+
+       odp_queue_param_init(&qp);
+       if (param)
+               memcpy(&qp, param, sizeof(odp_queue_param_t));
+
+       type = qp.type;
+
+       if (ODP_QUEUE_TYPE_SCHED == type) {
+               printf("%s: change %s to PLAIN\n", __func__, name);
+               qp.type = ODP_QUEUE_TYPE_PLAIN;
+       }
+
+       my_queue = odp_queue_create(name, &qp);
+
+       if (ODP_QUEUE_TYPE_SCHED == type) {
+               poll_queues[num_polled_queues++] = my_queue;
+               printf("%s: adding %" PRIu64 "\n", __func__,
+                      odp_queue_to_u64(my_queue));
+       }
+
+       return my_queue;
+}
+
+static inline
+odp_event_t odp_schedule_cb(odp_queue_t *from)
+{
+       return odp_schedule(from, ODP_SCHED_WAIT);
+}
+
+/**
+ * odp_schedule replacement to poll queues versus using ODP scheduler
+ */
+static
+odp_event_t polled_odp_schedule_cb(odp_queue_t *from)
+{
+       int idx = 0;
+
+       while (1) {
+               if (idx >= num_polled_queues)
+                       idx = 0;
+
+               odp_queue_t queue = poll_queues[idx++];
+               odp_event_t buf;
+
+               buf = odp_queue_deq(queue);
+
+               if (ODP_EVENT_INVALID != buf) {
+                       *from = queue;
+                       return buf;
+               }
+       }
+
+       *from = ODP_QUEUE_INVALID;
+       return ODP_EVENT_INVALID;
+}
+
+/**
+ * IPsec pre argument processing initialization
+ */
+static
+void ipsec_init_pre(void)
+{
+       odp_queue_param_t qparam;
+
+       /*
+        * Create queues
+        *
+        *  - completion queue (should eventually be ORDERED)
+        *  - sequence number queue (must be ATOMIC)
+        */
+       odp_queue_param_init(&qparam);
+       qparam.type        = ODP_QUEUE_TYPE_SCHED;
+       qparam.sched.prio  = ODP_SCHED_PRIO_HIGHEST;
+       qparam.sched.sync  = ODP_SCHED_SYNC_ATOMIC;
+       qparam.sched.group = ODP_SCHED_GROUP_ALL;
+
+       completionq = queue_create("completion", &qparam);
+       if (ODP_QUEUE_INVALID == completionq) {
+               EXAMPLE_ERR("Error: completion queue creation failed\n");
+               exit(EXIT_FAILURE);
+       }
+
+       qparam.type        = ODP_QUEUE_TYPE_SCHED;
+       qparam.sched.prio  = ODP_SCHED_PRIO_HIGHEST;
+       qparam.sched.sync  = ODP_SCHED_SYNC_ATOMIC;
+       qparam.sched.group = ODP_SCHED_GROUP_ALL;
+
+       /* Initialize our data bases */
+       init_sp_db();
+       init_sa_db();
+       init_tun_db();
+       init_ipsec_cache();
+}
+
+/**
+ * IPsec post argument processing initialization
+ *
+ * Resolve SP DB with SA DB and create corresponding IPsec cache entries
+ *
+ * @param api_mode  Mode to use for IPsec operation
+ */
+static
+void ipsec_init_post(odp_ipsec_op_mode_t api_mode)
+{
+       sp_db_entry_t *entry;
+       odp_ipsec_config_t ipsec_config;
+       odp_ipsec_capability_t ipsec_cap;
+
+       if (odp_ipsec_capability(&ipsec_cap) != ODP_IPSEC_OK) {
+               EXAMPLE_ERR("Error: failure getting IPSec caps\n");
+               exit(EXIT_FAILURE);
+       }
+
+       odp_ipsec_config_init(&ipsec_config);
+       ipsec_config.inbound.parse = ODP_IPSEC_LAYER_ALL;
+       ipsec_config.inbound_mode = api_mode;
+       ipsec_config.outbound_mode = api_mode;
+       ipsec_config.inbound.default_queue = completionq;
+       if (odp_ipsec_config(&ipsec_config) != ODP_IPSEC_OK) {
+               EXAMPLE_ERR("Error: failure setting IPSec config\n");
+               exit(EXIT_FAILURE);
+       }
+
+       /* 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;
+               tun_db_entry_t *tun = NULL;
+
+               if (entry->esp) {
+                       cipher_sa = find_sa_db_entry(&entry->src_subnet,
+                                                    &entry->dst_subnet,
+                                                    1);
+                       tun = find_tun_db_entry(cipher_sa->src_ip,
+                                               cipher_sa->dst_ip);
+               }
+               if (entry->ah) {
+                       auth_sa = find_sa_db_entry(&entry->src_subnet,
+                                                  &entry->dst_subnet,
+                                                  0);
+                       tun = find_tun_db_entry(auth_sa->src_ip,
+                                               auth_sa->dst_ip);
+               }
+
+               if (cipher_sa || auth_sa) {
+                       if (create_ipsec_cache_entry(cipher_sa,
+                                                    auth_sa,
+                                                    tun,
+                                                    entry->input,
+                                                    completionq)) {
+                               EXAMPLE_ERR("Error: IPSec cache entry failed.\n"
+                                               );
+                               exit(EXIT_FAILURE);
+                       }
+               } else {
+                       printf(" WARNING: SA not found for SP\n");
+                       dump_sp_db_entry(entry);
+               }
+       }
+}
+
+static
+int check_stream_db_in(const char *intf)
+{
+       stream_db_entry_t *stream = NULL;
+
+       /* For each stream look for input and output IPsec entries */
+       for (stream = stream_db->list; NULL != stream; stream = stream->next) {
+               if (!strcmp(stream->input.intf, intf))
+                       return 1;
+       }
+
+       return 0;
+}
+
+static
+int check_stream_db_out(const char *intf)
+{
+       stream_db_entry_t *stream = NULL;
+
+       /* For each stream look for input and output IPsec entries */
+       for (stream = stream_db->list; NULL != stream; stream = stream->next) {
+               if (!strcmp(stream->output.intf, intf))
+                       return 1;
+       }
+
+       return 0;
+}
+
+/**
+ * Initialize interface
+ *
+ * Initialize ODP pktio and queues, query MAC address and update
+ * forwarding database.
+ *
+ * @param intf     Interface name string
+ */
+static
+void initialize_intf(char *intf)
+{
+       odp_pktio_t pktio;
+       odp_pktout_queue_t pktout;
+       odp_queue_t inq;
+       int ret;
+       uint8_t src_mac[ODPH_ETHADDR_LEN];
+       char src_mac_str[MAX_STRING];
+       odp_pktio_param_t pktio_param;
+       odp_pktin_queue_param_t pktin_param;
+       odp_pktio_capability_t capa;
+       odp_pktio_config_t config;
+
+       odp_pktio_param_init(&pktio_param);
+
+       if (getenv("ODP_IPSEC_USE_POLL_QUEUES") ||
+           check_stream_db_out(intf))
+               pktio_param.in_mode = ODP_PKTIN_MODE_QUEUE;
+       else
+               pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
+
+       /*
+        * Open a packet IO instance for thread and get default output queue
+        */
+       pktio = odp_pktio_open(intf, pkt_pool, &pktio_param);
+       if (ODP_PKTIO_INVALID == pktio) {
+               EXAMPLE_ERR("Error: pktio create failed for %s\n", intf);
+               exit(EXIT_FAILURE);
+       }
+
+       odp_pktin_queue_param_init(&pktin_param);
+       pktin_param.queue_param.sched.sync = ODP_SCHED_SYNC_ATOMIC;
+
+       if (odp_pktin_queue_config(pktio, &pktin_param)) {
+               EXAMPLE_ERR("Error: pktin config failed for %s\n", intf);
+               exit(EXIT_FAILURE);
+       }
+
+       if (odp_pktout_queue_config(pktio, NULL)) {
+               EXAMPLE_ERR("Error: pktout config failed for %s\n", intf);
+               exit(EXIT_FAILURE);
+       }
+
+       if (odp_pktin_event_queue(pktio, &inq, 1) != 1) {
+               EXAMPLE_ERR("Error: failed to get input queue for %s\n", intf);
+               exit(EXIT_FAILURE);
+       }
+
+       if (odp_pktout_queue(pktio, &pktout, 1) != 1) {
+               EXAMPLE_ERR("Error: failed to get pktout queue for %s\n", intf);
+               exit(EXIT_FAILURE);
+       }
+
+       if (odp_pktio_capability(pktio, &capa) != 0) {
+               EXAMPLE_ERR("Error: failed to get capabilities for %s\n", intf);
+               exit(EXIT_FAILURE);
+       }
+
+       odp_pktio_config_init(&config);
+       if (check_stream_db_in(intf) &&
+           args->appl.mode == ODP_IPSEC_OP_MODE_INLINE)
+               config.inbound_ipsec = capa.config.inbound_ipsec;
+       if (check_stream_db_out(intf) &&
+           args->appl.mode == ODP_IPSEC_OP_MODE_INLINE)
+               config.outbound_ipsec = capa.config.outbound_ipsec;
+
+       if (odp_pktio_config(pktio, &config) != 0) {
+               EXAMPLE_ERR("Error: failed to set config for %s\n", intf);
+               exit(EXIT_FAILURE);
+       }
+
+       ret = odp_pktio_start(pktio);
+       if (ret) {
+               EXAMPLE_ERR("Error: unable to start %s\n", intf);
+               exit(EXIT_FAILURE);
+       }
+
+       /* Read the source MAC address for this interface */
+       ret = odp_pktio_mac_addr(pktio, src_mac, sizeof(src_mac));
+       if (ret <= 0) {
+               EXAMPLE_ERR("Error: failed during MAC address get for %s\n",
+                           intf);
+               exit(EXIT_FAILURE);
+       }
+
+       printf("Created pktio:%02" PRIu64 ", queue mode (ATOMIC queues)\n"
+              "          default pktio%02" PRIu64 "-INPUT queue:%" PRIu64 "\n"
+              "          source mac address %s\n",
+              odp_pktio_to_u64(pktio), odp_pktio_to_u64(pktio),
+              odp_queue_to_u64(inq),
+              mac_addr_str(src_mac_str, src_mac));
+
+       /* Resolve any routes using this interface for output */
+       resolve_fwd_db(intf, pktio, pktout, src_mac);
+}
+
+/**
+ * Packet Processing - Input verification
+ *
+ * @param pkt  Packet to inspect
+ * @param ctx  Packet process context (not used)
+ *
+ * @return PKT_CONTINUE if good, supported packet else PKT_DROP
+ */
+static
+pkt_disposition_e do_input_verify(odp_packet_t pkt,
+                                 pkt_ctx_t *ctx EXAMPLE_UNUSED)
+{
+       if (odp_unlikely(odp_packet_has_error(pkt)))
+               return PKT_DROP;
+
+       if (!odp_packet_has_eth(pkt))
+               return PKT_DROP;
+
+       if (!odp_packet_has_ipv4(pkt))
+               return PKT_DROP;
+
+       return PKT_CONTINUE;
+}
+
+/**
+ * Packet Processing - Route lookup in forwarding database
+ *
+ * @param pkt  Packet to route
+ * @param ctx  Packet process context
+ *
+ * @return PKT_CONTINUE if route found else PKT_DROP
+ */
+static
+pkt_disposition_e do_route_fwd_db(odp_packet_t pkt, pkt_ctx_t *ctx)
+{
+       odph_ipv4hdr_t *ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(pkt, NULL);
+       fwd_db_entry_t *entry;
+
+       entry = find_fwd_db_entry(odp_be_to_cpu_32(ip->dst_addr));
+
+       if (entry) {
+               uint32_t l3_offset = odp_packet_l3_offset(pkt);
+
+               if (l3_offset > sizeof(odph_ethhdr_t))
+                       odp_packet_pull_head(pkt,
+                                            l3_offset - sizeof(odph_ethhdr_t));
+               else
+                       odp_packet_push_head(pkt,
+                                            sizeof(odph_ethhdr_t) - l3_offset);
+
+               memcpy(&ctx->eth.dst, entry->dst_mac, ODPH_ETHADDR_LEN);
+               memcpy(&ctx->eth.src, entry->src_mac, ODPH_ETHADDR_LEN);
+               ctx->eth.type = odp_cpu_to_be_16(ODPH_ETHTYPE_IPV4);
+
+               if (args->appl.mode != ODP_IPSEC_OP_MODE_INLINE) {
+                       odp_packet_l2_offset_set(pkt, 0);
+                       odp_packet_copy_from_mem(pkt, 0, ODPH_ETHHDR_LEN,
+                                                &ctx->eth);
+               }
+
+               ctx->pktio = entry->pktio;
+               ctx->pktout = entry->pktout;
+
+               return PKT_CONTINUE;
+       }
+
+       return PKT_DROP;
+}
+
+/**
+ * Packet Processing - Input IPsec packet classification
+ *
+ * Verify the received packet has IPsec headers and a match
+ * in the IPsec cache, if so issue crypto request else skip
+ * input crypto.
+ *
+ * @param pkt   Packet to classify
+ * @param ctx   Packet process context
+ *
+ * @return PKT_CONTINUE if done else PKT_POSTED
+ */
+static
+pkt_disposition_e do_ipsec_in_classify(odp_packet_t *ppkt)
+{
+       odph_ipv4hdr_t *ip = (odph_ipv4hdr_t *)odp_packet_l3_ptr(*ppkt, NULL);
+       odph_ahhdr_t *ah = NULL;
+       odph_esphdr_t *esp = NULL;
+       ipsec_cache_entry_t *entry;
+       odp_ipsec_in_param_t in_param;
+       int rc;
+
+       /* Check IP header for IPSec protocols and look it up */
+       locate_ipsec_headers(ip, &ah, &esp);
+       if (!ah && !esp)
+               return PKT_CONTINUE;
+       entry = find_ipsec_cache_entry_in(odp_be_to_cpu_32(ip->src_addr),
+                                         odp_be_to_cpu_32(ip->dst_addr),
+                                         ah,
+                                         esp);
+       if (!entry)
+               return PKT_CONTINUE;
+
+       memset(&in_param, 0, sizeof(in_param));
+       if (args->appl.lookup) {
+               in_param.num_sa = 0;
+               in_param.sa = NULL;
+       } else {
+               in_param.num_sa = 1;
+               in_param.sa = &entry->ipsec_sa;
+       }
+
+       /* Issue crypto request */
+       if (args->appl.mode != ODP_IPSEC_OP_MODE_SYNC) {
+               rc = odp_ipsec_in_enq(ppkt, 1, &in_param);
+               if (rc <= 0)
+                       return PKT_DROP;
+
+               return PKT_POSTED;
+       } else {
+               int out = 1;
+
+               rc = odp_ipsec_in(ppkt, 1, ppkt, &out, &in_param);
+               if (rc <= 0)
+                       return PKT_DROP;
+
+               return PKT_CONTINUE;
+       }


Comment:
And I prefer current code. It is cleaner from my point of view.
```c
if (!SYNC) {
  odp_ipsec_in_enq();
  return PKT_POSTED:
} else {
  odp_ipsec_in();
  return PKT_CONTINUE;
}
```

> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
> ```
> WARNING: adding a line without newline at end of file
> #1988: FILE: example/ipsec_api/odp_ipsec_sa_db.h:1:
> +../ipsec/odp_ipsec_sa_db.h
> ```


>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>> ```
>> WARNING: adding a line without newline at end of file
>> #1996: FILE: example/ipsec_api/odp_ipsec_sp_db.c:1:
>> +../ipsec/odp_ipsec_sp_db.c
>> ```


>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>> ```
>>> WARNING: adding a line without newline at end of file
>>> #2004: FILE: example/ipsec_api/odp_ipsec_sp_db.h:1:
>>> +../ipsec/odp_ipsec_sp_db.h
>>> ```


>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>> ```
>>>> WARNING: adding a line without newline at end of file
>>>> #2012: FILE: example/ipsec_api/odp_ipsec_stream.c:1:
>>>> +../ipsec/odp_ipsec_stream.c
>>>> ```


>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>> Missing newline here too.
>>>>> ```
>>>>> WARNING: adding a line without newline at end of file
>>>>> #2020: FILE: example/ipsec_api/odp_ipsec_stream.h:1:
>>>>> +../ipsec/odp_ipsec_stream.h
>>>>> ```


>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>> Checkpatch seems confused here. Is it expecting a .sh suffix? Any 
>>>>>> thoughts on this @muvarov?
>>>>>> ```
>>>>>> ERROR: do not set execute permissions for source files
>>>>>> #1770: FILE: example/ipsec_api/odp_ipsec_run_ah_in
>>>>>> ```
>>>>>> The rest of the shell files are similarly flagged.


>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>> Also here:
>>>>>>> ```
>>>>>>> WARNING: adding a line without newline at end of file
>>>>>>> #1767: FILE: example/ipsec_api/odp_ipsec_misc.h:1:
>>>>>>> +../ipsec/odp_ipsec_misc.h
>>>>>>> ```


>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>> Similar issues here. Missing newline?
>>>>>>>> ```
>>>>>>>> WARNING: adding a line without newline at end of file
>>>>>>>> #1759: FILE: example/ipsec_api/odp_ipsec_fwd_db.h:1:
>>>>>>>> +../ipsec/odp_ipsec_fwd_db.h
>>>>>>>> ```


>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>> Checkpatch doesn't like this construct:
>>>>>>>>> ```
>>>>>>>>> WARNING: adding a line without newline at end of file
>>>>>>>>> #1751: FILE: example/ipsec_api/odp_ipsec_fwd_db.c:1:
>>>>>>>>> +../ipsec/odp_ipsec_fwd_db.c
>>>>>>>>> ```
>>>>>>>>> Missing newline?


>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>> Similar checkpatch issue here:
>>>>>>>>>> ```
>>>>>>>>>> WARNING: else is not generally useful after a break or return
>>>>>>>>>> #859: FILE: example/ipsec_api/odp_ipsec.c:667:
>>>>>>>>>> +            return PKT_POSTED;
>>>>>>>>>> +    } else {
>>>>>>>>>> ```


>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>> Checkpatch complains about this construct. Prefers no else after 
>>>>>>>>>>> return:
>>>>>>>>>>> ```
>>>>>>>>>>> WARNING: else is not generally useful after a break or return
>>>>>>>>>>> #795: FILE: example/ipsec_api/odp_ipsec.c:603:
>>>>>>>>>>> +           return PKT_POSTED;
>>>>>>>>>>> +   } else {
>>>>>>>>>>> ```


https://github.com/Linaro/odp/pull/340#discussion_r157384788
updated_at 2017-12-18 00:03:25

Reply via email to