aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-plugin/src/cache_policies/cs_policy.h
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-plugin/src/cache_policies/cs_policy.h')
-rw-r--r--hicn-plugin/src/cache_policies/cs_policy.h183
1 files changed, 135 insertions, 48 deletions
diff --git a/hicn-plugin/src/cache_policies/cs_policy.h b/hicn-plugin/src/cache_policies/cs_policy.h
index 0bf745915..5280a59c2 100644
--- a/hicn-plugin/src/cache_policies/cs_policy.h
+++ b/hicn-plugin/src/cache_policies/cs_policy.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2020 Cisco and/or its affiliates.
+ * Copyright (c) 2021 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
@@ -16,7 +16,9 @@
#ifndef __HICN_CS_POLICY_H__
#define __HICN_CS_POLICY_H__
-#include "../hashtb.h"
+#include <vppinfra/types.h>
+#include <vppinfra/clib.h>
+#include <stddef.h>
/**
* @file cs_policy.h
@@ -24,70 +26,155 @@
* This file provides the needed structures to implement a CS policy
*/
+/* Forward declaration */
+typedef struct hicn_pit_cs_s hicn_pit_cs_t;
+typedef struct hicn_pcs_entry_s hicn_pcs_entry_t;
+typedef struct hicn_cs_policy_s hicn_cs_policy_t;
+
+/**
+ * @brief Definition of the virtual functin table for a cache policy.
+ *
+ * A cache policy must implement all the following functions:
+ * - insert: add a new element
+ * - update: update the position of an existing element
+ * - dequeue: remove an element from the list
+ * - delete_get: return the next element that should be removed
+ * - trim: trim last sz elements from the list
+ * - flush: clean the cs
+ */
+typedef struct hicn_cs_policy_vft_s
+{
+ void (*hicn_cs_insert) (hicn_cs_policy_t *policy, hicn_pit_cs_t *pcs,
+ hicn_pcs_entry_t *pcs_entry);
+
+ void (*hicn_cs_update) (hicn_cs_policy_t *policy, hicn_pit_cs_t *pcs,
+ hicn_pcs_entry_t *pcs_entry);
+
+ void (*hicn_cs_dequeue) (hicn_cs_policy_t *policy, hicn_pit_cs_t *pcs,
+ hicn_pcs_entry_t *pcs_entry);
+
+ void (*hicn_cs_delete_get) (hicn_cs_policy_t *policy,
+ const hicn_pit_cs_t *pcs,
+ hicn_pcs_entry_t **pcs_entry);
+
+ int (*hicn_cs_trim) (hicn_cs_policy_t *policy, hicn_pit_cs_t *pcs,
+ u32 *node_list, size_t sz);
+
+ int (*hicn_cs_flush) (hicn_cs_policy_t *policy, hicn_pit_cs_t *pcs);
+} hicn_cs_policy_vft_t;
/*
- * Structure
+ * CS policy
*/
typedef struct hicn_cs_policy_s
{
+#define HICN_CS_POLICY_END_OF_CHAIN (u32) (~0)
+
+ /*
+ * VFT implementing the CS eviction/insertion policy. This must be the first
+ * element of the structure.
+ */
+ hicn_cs_policy_vft_t vft;
+
+ /*
+ * Max number of element in CS
+ */
u32 max;
+
+ /*
+ * Number of element in CS
+ */
u32 count;
- /* Indexes to hashtable nodes forming CS LRU */
+ /*
+ * Head element of the CS (i.e. the most recent element used for LRU)
+ */
u32 head;
- u32 tail;
+ /*
+ * Tail element of the LRU (i.e. the next element to evict for LRU)
+ */
+ u32 tail;
} hicn_cs_policy_t;
-/* Forward declaration */
-struct hicn_pit_cs_s;
-struct hicn_hash_node_s;
-struct hicn_pcs_entry_s;
-struct hicn_cs_policy_s;
+/*
+ * Get the max number of element in the CS
+ */
+always_inline u32
+hicn_cs_policy_get_max (const hicn_cs_policy_t *policy)
+{
+ return policy->max;
+}
-/**
- * @brief Definition of the virtual functin table for a cache policy.
- *
- * A cache policy must implement all the following functions:
- * - insert: add a new element
- * - update: update the position of an existing element
- * - dequeue: remove an element from the list
- * - delete_get: return the next element that should be removed trim
- * - flush: clean the cs
+/*
+ * Get the number of element in the CS
*/
-typedef struct hicn_cs_policy_vft_s
+always_inline u32
+hicn_cs_policy_get_count (const hicn_cs_policy_t *policy)
{
- void (*hicn_cs_insert) (struct hicn_pit_cs_s * p,
- struct hicn_hash_node_s * node,
- struct hicn_pcs_entry_s * pcs,
- hicn_cs_policy_t * policy);
-
- void (*hicn_cs_update) (struct hicn_pit_cs_s * p,
- struct hicn_hash_node_s * node,
- struct hicn_pcs_entry_s * pcs,
- hicn_cs_policy_t * policy);
-
- void (*hicn_cs_dequeue) (struct hicn_pit_cs_s * p,
- struct hicn_hash_node_s * node,
- struct hicn_pcs_entry_s * pcs,
- hicn_cs_policy_t * policy);
-
- void (*hicn_cs_delete_get) (struct hicn_pit_cs_s * p,
- hicn_cs_policy_t * policy,
- struct hicn_hash_node_s ** node,
- struct hicn_pcs_entry_s ** pcs,
- struct hicn_hash_entry_s ** hash_entry);
-
- int (*hicn_cs_trim) (struct hicn_pit_cs_s * p, u32 * node_list, int sz,
- hicn_cs_policy_t * policy);
-
- int (*hicn_cs_flush) (vlib_main_t * vm, struct hicn_pit_cs_s * p,
- hicn_cs_policy_t * policy_state);
-} hicn_cs_policy_vft_t;
+ return policy->count;
+}
+
+/*
+ * Get the head element of the CS
+ */
+always_inline u32
+hicn_cs_policy_get_head (const hicn_cs_policy_t *policy)
+{
+ return policy->head;
+}
+/*
+ * Get the tail element of the CS
+ */
+always_inline u32
+hicn_cs_policy_get_tail (const hicn_cs_policy_t *policy)
+{
+ return policy->tail;
+}
+
+always_inline void
+hicn_cs_policy_insert (hicn_cs_policy_t *policy, hicn_pit_cs_t *pcs,
+ hicn_pcs_entry_t *pcs_entry)
+{
+ return policy->vft.hicn_cs_insert (policy, pcs, pcs_entry);
+}
+
+always_inline void
+hicn_cs_policy_update (hicn_cs_policy_t *policy, hicn_pit_cs_t *pcs,
+ hicn_pcs_entry_t *pcs_entry)
+{
+ return policy->vft.hicn_cs_update (policy, pcs, pcs_entry);
+}
+always_inline void
+hicn_cs_policy_dequeue (hicn_cs_policy_t *policy, hicn_pit_cs_t *pcs,
+ hicn_pcs_entry_t *pcs_entry)
+{
+ return policy->vft.hicn_cs_dequeue (policy, pcs, pcs_entry);
+}
+
+always_inline void
+hicn_cs_policy_delete_get (hicn_cs_policy_t *policy, const hicn_pit_cs_t *pcs,
+ hicn_pcs_entry_t **pcs_entry)
+{
+ return policy->vft.hicn_cs_delete_get (policy, pcs, pcs_entry);
+}
+
+always_inline int
+hicn_cs_policy_trim (hicn_cs_policy_t *policy, hicn_pit_cs_t *pcs,
+ u32 *node_list, int sz)
+{
+ return policy->vft.hicn_cs_trim (policy, pcs, node_list, sz);
+}
+
+always_inline int
+hicn_cs_policy_flush (hicn_cs_policy_t *policy, hicn_pit_cs_t *pcs)
+{
+ return policy->vft.hicn_cs_flush (policy, pcs);
+}
-#endif /* // __HICN_POLICY_H__ */
+#endif /* __HICN_POLICY_H__ */
/*
* fd.io coding-style-patch-verification: ON