aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-plugin/src/pg.h
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-plugin/src/pg.h')
-rw-r--r--hicn-plugin/src/pg.h168
1 files changed, 134 insertions, 34 deletions
diff --git a/hicn-plugin/src/pg.h b/hicn-plugin/src/pg.h
index 84a391d43..deb585714 100644
--- a/hicn-plugin/src/pg.h
+++ b/hicn-plugin/src/pg.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,6 +16,7 @@
#ifndef __HICN_PG_H__
#define __HICN_PG_H__
+#include <vppinfra/pool.h>
/**
* @file pg.h
@@ -25,25 +26,28 @@
* interest it receives with the corresponding data.
* The packet generator is made of three nodes:
* - hicnpg-interest that receives packets from a packet generator interface
- * and manipulate them to generate interests based on the given configuration.
- * This node runs at the client side.
+ * and manipulate them to generate interests based on the given
+ * configuration. This node runs at the client side.
* - hicnpg-data that receives data packets at the client side and counts them.
* This is useful for statistics. The "show err" command will give the number
* of interest issued and data received at the client side
- * - hicnpg-server that recevies and interest and replies with the corresponding
- * data. The data is generated from the interest switching the src and destination
- * address in the packet and appending a payload to the packet.
+ * - hicnpg-server that recevies and interest and replies with the
+ * corresponding data. The data is generated from the interest switching the
+ * src and destination address in the packet and appending a payload to the
+ * packet.
*
*
* These three nodes are inserted in the vlib graph in the following manner:
- * - hicnpg-interest is added as a possible next node of the pg-input node. The packet
- * generator stream then specifies it as next node.
- * - hicnpg-data is added as next hop of the ip4/6-unicast node exploiting the corresponding
- * feature and it runs before the ip4/6-inacl node. In this way, every packet that is
- * received through an interface on which this feature is enabled is sent to this node.
- * - hicnpg-server is added as next hop of the ip4/6-unicast using the corresponding
- * feature and it runs before the ip4/6-inacl node. In this way, every packet that is
- * received through an interface on which this feature is enabled is sent to this node.
+ * - hicnpg-interest is added as a possible next node of the pg-input node. The
+ * packet generator stream then specifies it as next node.
+ * - hicnpg-data is added as next hop of the ip4/6-unicast node exploiting the
+ * corresponding feature and it runs before the ip4/6-inacl node. In this way,
+ * every packet that is received through an interface on which this feature is
+ * enabled is sent to this node.
+ * - hicnpg-server is added as next hop of the ip4/6-unicast using the
+ * corresponding feature and it runs before the ip4/6-inacl node. In this way,
+ * every packet that is received through an interface on which this feature is
+ * enabled is sent to this node.
*
* An example of how to use the pg for hicn is available in the documentation.
*/
@@ -55,19 +59,58 @@
*/
typedef struct hicnpg_main_s
{
- u32 index; //used to compute the sequence number
- fib_prefix_t *pgen_clt_hicn_name; //hICN name to put in the destiantion addess of an interest
- u32 index_ifaces; /* used to mimic interests coming from different consumer */
- u32 n_ifaces; /* The source address will change from interest to interest */
- /* index_ifaces is used to keep a global reference to the iface used */
- /* and it is incremented when we want to change "consumer" */
- /* n_ifaces identifies how many consumers to simulate */
- u32 max_seq_number; //Use to limit the max sequence number
- u32 n_flows; //Use to simulate multiple flows (a flow always have the same hICN name)
- ip46_address_t pgen_clt_src_addr; //Source addess base to use in the interest
-
- u16 interest_lifetime; // Interest lifetime
- u32 sw_if; //Interface where to send interest and receives data
+ /*
+ * used to compute the sequence number
+ */
+ u32 index;
+
+ /*
+ * hICN name to put in the destination addess of an interest
+ */
+ fib_prefix_t *pgen_clt_hicn_name;
+
+ /*
+ * Used to mimic interests coming from different consumer. The source address
+ * will change from interest to interest index_ifaces is used to keep a
+ * global reference to the iface used and it is incremented when we want to
+ * change "consumer"
+ */
+ u32 index_ifaces;
+
+ /*
+ * n_ifaces identifies how many consumers to simulate
+ */
+ u32 n_ifaces;
+
+ /*
+ * Use to limit the max sequence number
+ */
+ u32 max_seq_number;
+
+ /*
+ * Use to simulate multiple flows (a flow always have the same hICN name)
+ */
+ u32 n_flows;
+
+ /*
+ * Source addess base to use in the interest
+ */
+ ip46_address_t pgen_clt_src_addr;
+
+ /*
+ * Interest lifetime
+ */
+ u16 interest_lifetime;
+
+ /*
+ * Interface where to send interest and receives data.
+ */
+ u32 sw_if;
+
+ /*
+ * Fib node type
+ */
+ fib_node_type_t hicn_fib_node_type;
} hicnpg_main_t;
extern hicnpg_main_t hicnpg_main;
@@ -77,18 +120,75 @@ extern hicnpg_main_t hicnpg_main;
*
* It stores the configuration and make it availables to the pg server node.
*/
-typedef struct hicnpg_server_main_s
+typedef struct hicnpg_server_s
{
- u32 node_index;
- /* Arbitrary content */
- u32 pgen_svr_buffer_idx;
- fib_prefix_t *pgen_srv_hicn_name;
-} hicnpg_server_main_t;
+ /*
+ * Prefix served by this packet generator server
+ */
+ fib_prefix_t prefix;
+
+ /*
+ * IP address to put in the destination addess of the data
+ */
+ ip46_address_t hicn_locator;
+
+ /*
+ * Buffer index
+ */
+ u32 buffer_index;
+
+ /**
+ * The DPO used to forward to the next node in the VLIB graph
+ */
+ dpo_id_t dpo;
-extern hicnpg_server_main_t hicnpg_server_main;
+ /*
+ * linkage into the FIB graph
+ */
+ fib_node_t fib_node;
+ /*
+ * Tracking information for the IP destination
+ */
+ fib_node_index_t fib_entry_index;
+
+ /*
+ * The FIB index
+ */
+ index_t fib_index;
+} hicnpg_server_t;
+
+STATIC_ASSERT (sizeof (hicnpg_server_t) <= 2 * CLIB_CACHE_LINE_BYTES,
+ "hicnpg_server_t is too large");
+
+extern hicnpg_server_t hicnpg_server_main;
extern vlib_node_registration_t hicn_pg_interest_node;
extern vlib_node_registration_t hicn_pg_data_node;
+extern dpo_type_t hicnpg_server_dpo_type;
+
+/**
+ * Pool of hicnpg_servers
+ */
+extern hicnpg_server_t *hicnpg_server_pool;
+
+always_inline hicnpg_server_t *
+hicnpg_server_get (index_t hpgi)
+{
+ return pool_elt_at_index (hicnpg_server_pool, hpgi);
+}
+
+always_inline u8
+dpo_is_pgserver (const dpo_id_t *dpo)
+{
+ return (dpo->dpoi_type == hicnpg_server_dpo_type);
+}
+
+clib_error_t *hicnpg_server_add_and_lock (fib_prefix_t *prefix,
+ u32 *hicnpg_server_index,
+ ip46_address_t *locator,
+ size_t payload_size);
+
+clib_error_t *hicn_pg_init (vlib_main_t *vm);
#endif // __HICN_PG_H__