ASR_BASE
Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/package/kernel/mfp/files/fp_database.h b/package/kernel/mfp/files/fp_database.h
new file mode 100644
index 0000000..1766c79
--- /dev/null
+++ b/package/kernel/mfp/files/fp_database.h
@@ -0,0 +1,147 @@
+#ifndef FP_DATABASE_H
+#define FP_DATABASE_H
+
+/*
+ * Fast path data base
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+/**--------------------------------------
+ * Enum
+ *--------------------------------------*/
+
+
+static const char *const entry_state_names[] = {
+ "initialized",
+ "alive",
+ "dying",
+};
+
+enum entry_state {
+ ENTRY_INITIALIZED,
+ ENTRY_ALIVE,
+ ENTRY_DYING,
+};
+
+/**--------------------------------------
+ * STRUCTURES
+ *--------------------------------------*/
+
+/* Trace buffer per entry (enabled via DBG_LVL) */
+struct fpdb_trace {
+ struct list_head list;
+ int sz;
+ unsigned int hit_counter;
+ unsigned int timeout;
+ struct tcphdr tcph;
+ unsigned int tcp_state;
+ unsigned long ct_status; /* have we seen direction in both ways? */
+};
+
+struct fpdb_debug {
+ unsigned int in_route_type;
+ unsigned int out_route_type;
+ struct fpdb_trace trace;
+};
+
+struct fpdb_entry {
+ /* Managment fields - DO NOT USE!*/
+ struct hlist_node hlist;
+ struct rcu_head rcu;
+ atomic_t rc;
+ spinlock_t lock;
+ struct timer_list *guard_timer;
+ struct work_struct work;
+
+ /* Entry data*/
+ unsigned long tstamp; /* data base aging out use this field */
+ struct nf_conn *ct;
+ enum ip_conntrack_dir dir;
+ unsigned long flags;
+ struct hh_cache hh;
+ struct nf_conntrack_tuple in_tuple;
+ struct nf_conntrack_tuple out_tuple;
+ struct fp_net_device *out_dev; /* destination interface handle */
+ struct fp_net_device *in_dev; /* source interface handle */
+ enum entry_state state;
+ bool block;
+
+ /* statistics & debug */
+ unsigned int bucket;
+ unsigned int hit_counter;
+ struct fpdb_debug debug;
+#ifdef CONFIG_ASR_TOE
+ unsigned int nl_flag;
+ unsigned long detect_speed_jiffies;
+ unsigned int detect_speed_bytes;
+ unsigned int speed; /* Kbps */
+#endif
+};
+
+struct nf_conn_fastpath {
+ struct fpdb_entry *fpd_el[IP_CT_DIR_MAX];
+};
+
+static inline struct nf_conn_fastpath *nfct_fastpath(const struct nf_conn *ct)
+{
+ return nf_ct_ext_find(ct, NF_CT_EXT_FASTPATH);
+}
+
+struct hist_entry {
+ unsigned int buckets;
+ unsigned int entries;
+};
+
+#define HISTOGRAM_SIZE (16)
+
+struct fpdb_stats {
+ /* HASH statistics */
+ u32 size; /* number of buckets */
+ u32 lookups; /* total lookups */
+ u32 iterations; /* iterations per lookups */
+ u32 hits; /* successfull lookups */
+ u32 largest_bucket; /* Number of entries in largest bucket */
+ u32 num_occupied; /* Number of occupied buckets */
+ u32 load_factor; /* num of hashed entries / num of buckets */
+
+ /* HISTOGRAM */
+ struct hist_entry hist[HISTOGRAM_SIZE + 1];
+
+ /* Database statistics */
+ u32 avg_lookup_latency;
+ u32 max_lookup_latency;
+ u32 max_entries; /* max num of hashed entries */
+};
+
+/**--------------------------------------
+ * API FUNCTIONS
+ *--------------------------------------*/
+
+void fpdb_lock_bh(void);
+void fpdb_unlock_bh(void);
+struct fpdb_entry *fpdb_alloc(gfp_t flags);
+void fpdb_dump_entry(char *msg, struct fpdb_entry *el);
+void fpdb_add(struct fpdb_entry *el);
+void fpdb_replace(struct fpdb_entry *el, struct fpdb_entry *nel);
+void fpdb_del(struct fpdb_entry *entry);
+struct fpdb_entry *fpdb_get(struct nf_conntrack_tuple *tuple);
+void fpdb_put(struct fpdb_entry *entry);
+void fpdb_del_by_dev(struct net_device *dev);
+void fpdb_del_by_port(unsigned int);
+void fpdb_flush(void);
+void fpdb_del_least_used_entry(int max_num);
+void fpdb_trace(struct fpdb_entry *entry, struct tcphdr *tcph);
+void fpdb_iterate(int (*iter)(struct fpdb_entry *e, void *data), void *data);
+void fpdb_free(struct fpdb_entry * el);
+int fpdb_del_block_entry_by_dev(struct fpdb_entry *el, void *data);
+
+#ifdef FP_USE_SRAM_POOL_OPT
+extern unsigned long sram_pool_alloc(size_t size);
+extern void sram_pool_free(unsigned long addr, size_t size);
+#endif
+
+#endif /* FP_DATABASE_H */