diff options
Diffstat (limited to 'hicn-plugin/src/pg.h')
-rw-r--r-- | hicn-plugin/src/pg.h | 168 |
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__ |