Bill Fischofer(Bill-Fischofer-Linaro) replied on github web page: example/ipsec_offload/odp_ipsec_offload_fwd_db.h line 117 @@ -0,0 +1,201 @@ +/* Copyright (c) 2017, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_IPSEC_FWD_DB_H_ +#define ODP_IPSEC_FWD_DB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <odp.h> +#include <odp/helper/eth.h> +#include <odp_ipsec_offload_misc.h> + +#define OIF_LEN 32 + +/** + * Forwarding data base entry + */ + +typedef struct fwd_db_entry_s { + struct fwd_db_entry_s *next; /**< Next entry on list */ + char oif[OIF_LEN]; /**< Output interface name */ + odp_pktout_queue_t pktout; /**< Output transmit queue */ + uint8_t src_mac[ODPH_ETHADDR_LEN]; /**< Output source MAC */ + uint8_t dst_mac[ODPH_ETHADDR_LEN]; /**< Output destination MAC */ + ip_addr_range_t subnet; /**< Subnet for this router */ +} fwd_db_entry_t; + +/** + * Forwarding data base global structure + */ +typedef struct fwd_db_s { + uint32_t index; /**< Next available entry */ + fwd_db_entry_t *list; /**< List of active routes */ + fwd_db_entry_t array[MAX_DB]; /**< Entry storage */ +} fwd_db_t; + +/** Global pointer to fwd db */ +extern fwd_db_t *fwd_db; + +/** + * Flow cache table entry + */ +typedef struct { + void *next; /**< Pointer to next flow in list*/ + uint32_t l3_src; /**< Source IP Address*/ + uint32_t l3_dst; /**< Destination IP Address*/ + odp_out_entry_t out_port; /**< Out interface of matching flow*/ +} odp_flow_entry_t; + +/** + * Flow cache table bucket + */ +typedef struct { + odp_spinlock_t lock; /**< Bucket lock*/ + odp_flow_entry_t *next; /**< Pointer to first flow entry in bucket*/ +} flow_bucket_t; + +/** +* Pointers to Flow cache tables +*/ +extern flow_bucket_t *flow_table; + +extern flow_bucket_t *ipsec_out_flow_table; + +extern flow_bucket_t *ipsec_in_flow_table; + +/** + * Number of buckets in hash table + */ +extern uint32_t bucket_count; + +/* + * Allocate and Initialize routing table with default Route entries. + * + */ +void odp_init_routing_table(void); + +/* + * Searches flow entry in given hash bucket according to given 5-tuple + * information + * + * @param sip Source IP Address + * @param dip Destination IP Address + * @param sport Source Port Number + * @param dport Destination Port Number + * @param proto IP protocol + * @param bucket Hash Bucket + * + * @return Matching flow entry + */ +static inline odp_flow_entry_t *odp_route_flow_lookup_in_bucket(uint32_t sip, + uint32_t dip, + void *bucket) +{ + odp_flow_entry_t *flow, *head; + + head = ((flow_bucket_t *)bucket)->next; + for (flow = head; flow != NULL; flow = flow->next) { + if ((flow->l3_src == sip) && (flow->l3_dst == dip)) + return flow; + } + return NULL; +} + +/** + * Insert the flow into given hash bucket + * + * @param flow Which is to be inserted + * @param bucket Target Hash Bucket + * + */ +static inline void odp_route_flow_insert_in_bucket(odp_flow_entry_t *flow,
Comment: Drop `odp_` prefix. > Bill Fischofer(Bill-Fischofer-Linaro) wrote: > Drop `odp_` prefix >> Bill Fischofer(Bill-Fischofer-Linaro) wrote: >> Avoid `odp_` prefix use for non-APIs. >>> Bill Fischofer(Bill-Fischofer-Linaro) wrote: >>> Checkpatch doesn't like this and the `goto` is a bit ugly. Might a >>> restructure along the following lines be simpler and cleaner? >>> ``` >>> if (!flow) { >>> /*Check into Routing table*/ >>> fwd_entry = find_fwd_db_entry(dip); >>> >>> if (!fwd_entry) { >>> EXAMPLE_DBG("No flow match found. Packet is >>> dropped.\n"); >>> odp_packet_free(pkt); >>> return PKT_DROP; >>> } >>> ... flow setup processing, fall though without needing a goto. >>> } >>> >>> ...flow processing goes here >>> ``` >>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote: >>>> Drop the `odp_` prefix here. It's reserved for ODP APIs. >>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote: >>>>> Don't use the `odp_` prefix for application routines. It's not a good >>>>> practice, especially in an example. https://github.com/Linaro/odp/pull/339#discussion_r157375397 updated_at 2017-12-17 18:09:28