diff options
Diffstat (limited to 'src/spdk/dpdk/doc/guides/prog_guide')
166 files changed, 71923 insertions, 0 deletions
diff --git a/src/spdk/dpdk/doc/guides/prog_guide/bbdev.rst b/src/spdk/dpdk/doc/guides/prog_guide/bbdev.rst new file mode 100644 index 000000000..d39167af1 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/bbdev.rst @@ -0,0 +1,1203 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation + +Wireless Baseband Device Library +================================ + +The Wireless Baseband library provides a common programming framework that +abstracts HW accelerators based on FPGA and/or Fixed Function Accelerators that +assist with 3GPP Physical Layer processing. Furthermore, it decouples the +application from the compute-intensive wireless functions by abstracting their +optimized libraries to appear as virtual bbdev devices. + +The functional scope of the BBDEV library are those functions in relation to +the 3GPP Layer 1 signal processing (channel coding, modulation, ...). + +The framework currently only supports Turbo Code FEC function. + + +Design Principles +----------------- + +The Wireless Baseband library follows the same ideology of DPDK's Ethernet +Device and Crypto Device frameworks. Wireless Baseband provides a generic +acceleration abstraction framework which supports both physical (hardware) and +virtual (software) wireless acceleration functions. + +Device Management +----------------- + +Device Creation +~~~~~~~~~~~~~~~ + +Physical bbdev devices are discovered during the PCI probe/enumeration of the +EAL function which is executed at DPDK initialization, based on +their PCI device identifier, each unique PCI BDF (bus/bridge, device, +function). + +Virtual devices can be created by two mechanisms, either using the EAL command +line options or from within the application using an EAL API directly. + +From the command line using the --vdev EAL option + +.. code-block:: console + + --vdev 'baseband_turbo_sw,max_nb_queues=8,socket_id=0' + +Or using the rte_vdev_init API within the application code. + +.. code-block:: c + + rte_vdev_init("baseband_turbo_sw", "max_nb_queues=2,socket_id=0") + +All virtual bbdev devices support the following initialization parameters: + +- ``max_nb_queues`` - maximum number of queues supported by the device. + +- ``socket_id`` - socket on which to allocate the device resources on. + + +Device Identification +~~~~~~~~~~~~~~~~~~~~~ + +Each device, whether virtual or physical is uniquely designated by two +identifiers: + +- A unique device index used to designate the bbdev device in all functions + exported by the bbdev API. + +- A device name used to designate the bbdev device in console messages, for + administration or debugging purposes. For ease of use, the port name includes + the port index. + + +Device Configuration +~~~~~~~~~~~~~~~~~~~~ + +From the application point of view, each instance of a bbdev device consists of +one or more queues identified by queue IDs. While different devices may have +different capabilities (e.g. support different operation types), all queues on +a device support identical configuration possibilities. A queue is configured +for only one type of operation and is configured at initialization time. +When an operation is enqueued to a specific queue ID, the result is dequeued +from the same queue ID. + +Configuration of a device has two different levels: configuration that applies +to the whole device, and configuration that applies to a single queue. + +Device configuration is applied with +``rte_bbdev_setup_queues(dev_id,num_queues,socket_id)`` +and queue configuration is applied with +``rte_bbdev_queue_configure(dev_id,queue_id,conf)``. Note that, although all +queues on a device support same capabilities, they can be configured differently +and will then behave differently. +Devices supporting interrupts can enable them by using +``rte_bbdev_intr_enable(dev_id)``. + +The configuration of each bbdev device includes the following operations: + +- Allocation of resources, including hardware resources if a physical device. +- Resetting the device into a well-known default state. +- Initialization of statistics counters. + +The ``rte_bbdev_setup_queues`` API is used to setup queues for a bbdev device. + +.. code-block:: c + + int rte_bbdev_setup_queues(uint16_t dev_id, uint16_t num_queues, + int socket_id); + +- ``num_queues`` argument identifies the total number of queues to setup for + this device. + +- ``socket_id`` specifies which socket will be used to allocate the memory. + + +The ``rte_bbdev_intr_enable`` API is used to enable interrupts for a bbdev +device, if supported by the driver. Should be called before starting the device. + +.. code-block:: c + + int rte_bbdev_intr_enable(uint16_t dev_id); + + +Queues Configuration +~~~~~~~~~~~~~~~~~~~~ + +Each bbdev devices queue is individually configured through the +``rte_bbdev_queue_configure()`` API. +Each queue resources may be allocated on a specified socket. + +.. code-block:: c + + struct rte_bbdev_queue_conf { + int socket; + uint32_t queue_size; + uint8_t priority; + bool deferred_start; + enum rte_bbdev_op_type op_type; + }; + +Device & Queues Management +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +After initialization, devices are in a stopped state, so must be started by the +application. If an application is finished using a device it can close the +device. Once closed, it cannot be restarted. + +.. code-block:: c + + int rte_bbdev_start(uint16_t dev_id) + int rte_bbdev_stop(uint16_t dev_id) + int rte_bbdev_close(uint16_t dev_id) + int rte_bbdev_queue_start(uint16_t dev_id, uint16_t queue_id) + int rte_bbdev_queue_stop(uint16_t dev_id, uint16_t queue_id) + + +By default, all queues are started when the device is started, but they can be +stopped individually. + +.. code-block:: c + + int rte_bbdev_queue_start(uint16_t dev_id, uint16_t queue_id) + int rte_bbdev_queue_stop(uint16_t dev_id, uint16_t queue_id) + + +Logical Cores, Memory and Queues Relationships +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The bbdev poll mode device driver library supports NUMA architecture, in which +a processor's logical cores and interfaces utilize it's local memory. Therefore +with baseband operations, the mbuf being operated on should be allocated from memory +pools created in the local memory. The buffers should, if possible, remain on +the local processor to obtain the best performance results and buffer +descriptors should be populated with mbufs allocated from a mempool allocated +from local memory. + +The run-to-completion model also performs better, especially in the case of +virtual bbdev devices, if the baseband operation and data buffers are in local +memory instead of a remote processor's memory. This is also true for the +pipe-line model provided all logical cores used are located on the same processor. + +Multiple logical cores should never share the same queue for enqueuing +operations or dequeuing operations on the same bbdev device since this would +require global locks and hinder performance. It is however possible to use a +different logical core to dequeue an operation on a queue pair from the logical +core which it was enqueued on. This means that a baseband burst enqueue/dequeue +APIs are a logical place to transition from one logical core to another in a +packet processing pipeline. + + +Device Operation Capabilities +----------------------------- + +Capabilities (in terms of operations supported, max number of queues, etc.) +identify what a bbdev is capable of performing that differs from one device to +another. For the full scope of the bbdev capability see the definition of the +structure in the *DPDK API Reference*. + +.. code-block:: c + + struct rte_bbdev_op_cap; + +A device reports its capabilities when registering itself in the bbdev framework. +With the aid of this capabilities mechanism, an application can query devices to +discover which operations within the 3GPP physical layer they are capable of +performing. Below is an example of the capabilities for a PMD it supports in +relation to Turbo Encoding and Decoding operations. + +.. code-block:: c + + static const struct rte_bbdev_op_cap bbdev_capabilities[] = { + { + .type = RTE_BBDEV_OP_TURBO_DEC, + .cap.turbo_dec = { + .capability_flags = + RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE | + RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN | + RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN | + RTE_BBDEV_TURBO_CRC_TYPE_24B | + RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP | + RTE_BBDEV_TURBO_EARLY_TERMINATION, + .max_llr_modulus = 16, + .num_buffers_src = RTE_BBDEV_TURBO_MAX_CODE_BLOCKS, + .num_buffers_hard_out = + RTE_BBDEV_TURBO_MAX_CODE_BLOCKS, + .num_buffers_soft_out = 0, + } + }, + { + .type = RTE_BBDEV_OP_TURBO_ENC, + .cap.turbo_enc = { + .capability_flags = + RTE_BBDEV_TURBO_CRC_24B_ATTACH | + RTE_BBDEV_TURBO_CRC_24A_ATTACH | + RTE_BBDEV_TURBO_RATE_MATCH | + RTE_BBDEV_TURBO_RV_INDEX_BYPASS, + .num_buffers_src = RTE_BBDEV_TURBO_MAX_CODE_BLOCKS, + .num_buffers_dst = RTE_BBDEV_TURBO_MAX_CODE_BLOCKS, + } + }, + RTE_BBDEV_END_OF_CAPABILITIES_LIST() + }; + +Capabilities Discovery +~~~~~~~~~~~~~~~~~~~~~~ + +Discovering the features and capabilities of a bbdev device poll mode driver +is achieved through the ``rte_bbdev_info_get()`` function. + +.. code-block:: c + + int rte_bbdev_info_get(uint16_t dev_id, struct rte_bbdev_info *dev_info) + +This allows the user to query a specific bbdev PMD and get all the device +capabilities. The ``rte_bbdev_info`` structure provides two levels of +information: + +- Device relevant information, like: name and related rte_bus. + +- Driver specific information, as defined by the ``struct rte_bbdev_driver_info`` + structure, this is where capabilities reside along with other specifics like: + maximum queue sizes and priority level. + +.. code-block:: c + + struct rte_bbdev_info { + int socket_id; + const char *dev_name; + const struct rte_device *device; + uint16_t num_queues; + bool started; + struct rte_bbdev_driver_info drv; + }; + + +Operation Processing +-------------------- + +Scheduling of baseband operations on DPDK's application data path is +performed using a burst oriented asynchronous API set. A queue on a bbdev +device accepts a burst of baseband operations using enqueue burst API. On physical +bbdev devices the enqueue burst API will place the operations to be processed +on the device's hardware input queue, for virtual devices the processing of the +baseband operations is usually completed during the enqueue call to the bbdev +device. The dequeue burst API will retrieve any processed operations available +from the queue on the bbdev device, from physical devices this is usually +directly from the device's processed queue, and for virtual device's from a +``rte_ring`` where processed operations are placed after being processed on the +enqueue call. + + +Enqueue / Dequeue Burst APIs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The burst enqueue API uses a bbdev device identifier and a queue +identifier to specify the bbdev device queue to schedule the processing on. +The ``num_ops`` parameter is the number of operations to process which are +supplied in the ``ops`` array of ``rte_bbdev_*_op`` structures. +The enqueue function returns the number of operations it actually enqueued for +processing, a return value equal to ``num_ops`` means that all packets have been +enqueued. + +.. code-block:: c + + uint16_t rte_bbdev_enqueue_enc_ops(uint16_t dev_id, uint16_t queue_id, + struct rte_bbdev_enc_op **ops, uint16_t num_ops) + + uint16_t rte_bbdev_enqueue_dec_ops(uint16_t dev_id, uint16_t queue_id, + struct rte_bbdev_dec_op **ops, uint16_t num_ops) + +The dequeue API uses the same format as the enqueue API of processed but +the ``num_ops`` and ``ops`` parameters are now used to specify the max processed +operations the user wishes to retrieve and the location in which to store them. +The API call returns the actual number of processed operations returned, this +can never be larger than ``num_ops``. + +.. code-block:: c + + uint16_t rte_bbdev_dequeue_enc_ops(uint16_t dev_id, uint16_t queue_id, + struct rte_bbdev_enc_op **ops, uint16_t num_ops) + + uint16_t rte_bbdev_dequeue_dec_ops(uint16_t dev_id, uint16_t queue_id, + struct rte_bbdev_dec_op **ops, uint16_t num_ops) + +Operation Representation +~~~~~~~~~~~~~~~~~~~~~~~~ + +An encode bbdev operation is represented by ``rte_bbdev_enc_op`` structure, +and by ``rte_bbdev_dec_op`` for decode. These structures act as metadata +containers for all necessary information required for the bbdev operation to be +processed on a particular bbdev device poll mode driver. + +.. code-block:: c + + struct rte_bbdev_enc_op { + int status; + struct rte_mempool *mempool; + void *opaque_data; + union { + struct rte_bbdev_op_turbo_enc turbo_enc; + struct rte_bbdev_op_ldpc_enc ldpc_enc; + } + }; + + struct rte_bbdev_dec_op { + int status; + struct rte_mempool *mempool; + void *opaque_data; + union { + struct rte_bbdev_op_turbo_dec turbo_enc; + struct rte_bbdev_op_ldpc_dec ldpc_enc; + } + }; + +The operation structure by itself defines the operation type. It includes an +operation status, a reference to the operation specific data, which can vary in +size and content depending on the operation being provisioned. It also contains +the source mempool for the operation, if it is allocated from a mempool. + +If bbdev operations are allocated from a bbdev operation mempool, see next +section, there is also the ability to allocate private memory with the +operation for applications purposes. + +Application software is responsible for specifying all the operation specific +fields in the ``rte_bbdev_*_op`` structure which are then used by the bbdev PMD +to process the requested operation. + + +Operation Management and Allocation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The bbdev library provides an API set for managing bbdev operations which +utilize the Mempool Library to allocate operation buffers. Therefore, it ensures +that the bbdev operation is interleaved optimally across the channels and +ranks for optimal processing. + +.. code-block:: c + + struct rte_mempool * + rte_bbdev_op_pool_create(const char *name, enum rte_bbdev_op_type type, + unsigned int num_elements, unsigned int cache_size, + int socket_id) + +``rte_bbdev_*_op_alloc_bulk()`` and ``rte_bbdev_*_op_free_bulk()`` are used to +allocate bbdev operations of a specific type from a given bbdev operation mempool. + +.. code-block:: c + + int rte_bbdev_enc_op_alloc_bulk(struct rte_mempool *mempool, + struct rte_bbdev_enc_op **ops, uint16_t num_ops) + + int rte_bbdev_dec_op_alloc_bulk(struct rte_mempool *mempool, + struct rte_bbdev_dec_op **ops, uint16_t num_ops) + +``rte_bbdev_*_op_free_bulk()`` is called by the application to return an +operation to its allocating pool. + +.. code-block:: c + + void rte_bbdev_dec_op_free_bulk(struct rte_bbdev_dec_op **ops, + unsigned int num_ops) + void rte_bbdev_enc_op_free_bulk(struct rte_bbdev_enc_op **ops, + unsigned int num_ops) + +BBDEV Inbound/Outbound Memory +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The bbdev operation structure contains all the mutable data relating to +performing Turbo and LDPC coding on a referenced mbuf data buffer. It is used for either +encode or decode operations. + + +.. csv-table:: Operation I/O + :header: "FEC", "In", "Out" + :widths: 20, 30, 30 + + "Turbo Encode", "input", "output" + "Turbo Decode", "input", "hard output" + " ", " ", "soft output (optional)" + "LDPC Encode", "input", "output" + "LDPC Decode", "input", "hard output" + "", "HQ combine (optional)", "HQ combine (optional)" + " ", "", "soft output (optional)" + + +It is expected that the application provides input and output mbuf pointers +allocated and ready to use. + +The baseband framework supports FEC coding on Code Blocks (CB) and +Transport Blocks (TB). + +For the output buffer(s), the application is required to provide an allocated +and free mbuf, to which the resulting output will be written. + +The support of split "scattered" buffers is a driver-specific feature, so it is +reported individually by the supporting driver as a capability. + +Input and output data buffers are identified by ``rte_bbdev_op_data`` structure, +as follows: + +.. code-block:: c + + struct rte_bbdev_op_data { + struct rte_mbuf *data; + uint32_t offset; + uint32_t length; + }; + + +This structure has three elements: + +- ``data``: This is the mbuf data structure representing the data for BBDEV + operation. + + This mbuf pointer can point to one Code Block (CB) data buffer or multiple CBs + contiguously located next to each other. A Transport Block (TB) represents a + whole piece of data that is divided into one or more CBs. Maximum number of + CBs can be contained in one TB is defined by + ``RTE_BBDEV_(TURBO/LDPC)MAX_CODE_BLOCKS``. + + An mbuf data structure cannot represent more than one TB. The smallest piece + of data that can be contained in one mbuf is one CB. + An mbuf can include one contiguous CB, subset of contiguous CBs that are + belonging to one TB, or all contiguous CBs that belong to one TB. + + If a BBDEV PMD supports the extended capability "Scatter-Gather", then it is + capable of collecting (gathering) non-contiguous (scattered) data from + multiple locations in the memory. + This capability is reported by the capability flags: + + - ``RTE_BBDEV_TURBO_ENC_SCATTER_GATHER``, ``RTE_BBDEV_TURBO_DEC_SCATTER_GATHER``, + + - ``RTE_BBDEV_LDPC_ENC_SCATTER_GATHER``, ``RTE_BBDEV_LDPC_DEC_SCATTER_GATHER``. + + Chained mbuf data structures are only accepted if a BBDEV PMD supports this + feature. A chained mbuf can represent one non-contiguous CB or multiple non-contiguous + CBs. The first mbuf segment in the given chained mbuf represents the first piece + of the CB. Offset is only applicable to the first segment. ``length`` is the + total length of the CB. + + BBDEV driver is responsible for identifying where the split is and enqueue + the split data to its internal queues. + + If BBDEV PMD does not support this feature, it will assume inbound mbuf data + contains one segment. + + The output mbuf data though is always one segment, even if the input was a + chained mbuf. + + +- ``offset``: This is the starting point of the BBDEV (encode/decode) operation, + in bytes. + + BBDEV starts to read data past this offset. + In case of chained mbuf, this offset applies only to the first mbuf segment. + + +- ``length``: This is the total data length to be processed in one operation, + in bytes. + + In case the mbuf data is representing one CB, this is the length of the CB + undergoing the operation. + If it is for multiple CBs, this is the total length of those CBs undergoing + the operation. + If it is for one TB, this is the total length of the TB under operation. + In case of chained mbuf, this data length includes the lengths of the + "scattered" data segments undergoing the operation. + + +BBDEV Turbo Encode Operation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: c + + struct rte_bbdev_op_turbo_enc { + struct rte_bbdev_op_data input; + struct rte_bbdev_op_data output; + + uint32_t op_flags; + uint8_t rv_index; + uint8_t code_block_mode; + union { + struct rte_bbdev_op_enc_cb_params cb_params; + struct rte_bbdev_op_enc_tb_params tb_params; + }; + }; + +The Turbo encode structure includes the ``input`` and ``output`` mbuf +data pointers. The provided mbuf pointer of ``input`` needs to be big +enough to stretch for extra CRC trailers. + +.. csv-table:: **struct rte_bbdev_op_turbo_enc** parameters + :header: "Parameter", "Description" + :widths: 10, 30 + + "input","input CB or TB data" + "output","rate matched CB or TB output buffer" + "op_flags","bitmask of all active operation capabilities" + "rv_index","redundancy version index [0..3]" + "code_block_mode","code block or transport block mode" + "cb_params", "code block specific parameters (code block mode only)" + "tb_params", "transport block specific parameters (transport block mode only)" + + +The encode interface works on both the code block (CB) and the transport block +(TB). An operation executes in "CB-mode" when the CB is standalone. While +"TB-mode" executes when an operation performs on one or multiple CBs that +belong to a TB. Therefore, a given data can be standalone CB, full-size TB or +partial TB. Partial TB means that only a subset of CBs belonging to a bigger TB +are being enqueued. + + **NOTE:** It is assumed that all enqueued ops in one ``rte_bbdev_enqueue_enc_ops()`` + call belong to one mode, either CB-mode or TB-mode. + +In case that the TB is smaller than Z (6144 bits), then effectively the TB = CB. +CRC24A is appended to the tail of the CB. The application is responsible for +calculating and appending CRC24A before calling BBDEV in case that the +underlying driver does not support CRC24A generation. + +In CB-mode, CRC24A/B is an optional operation. +The CB parameter ``k`` is the size of the CB (this maps to K as described +in 3GPP TS 36.212 section 5.1.2), this size is inclusive of CRC24A/B. +The ``length`` is inclusive of CRC24A/B and equals to ``k`` in this case. + +Not all BBDEV PMDs are capable of CRC24A/B calculation. Flags +``RTE_BBDEV_TURBO_CRC_24A_ATTACH`` and ``RTE_BBDEV_TURBO_CRC_24B_ATTACH`` +informs the application with relevant capability. These flags can be set in the +``op_flags`` parameter to indicate to BBDEV to calculate and append CRC24A/B +to CB before going forward with Turbo encoding. + +Output format of the CB encode will have the encoded CB in ``e`` size output +(this maps to E described in 3GPP TS 36.212 section 5.1.4.1.2). The output mbuf +buffer size needs to be big enough to hold the encoded buffer of size ``e``. + +In TB-mode, CRC24A is assumed to be pre-calculated and appended to the inbound +TB mbuf data buffer. +The output mbuf data structure is expected to be allocated by the application +with enough room for the output data. + +The difference between the partial and full-size TB is that we need to know the +index of the first CB in this group and the number of CBs contained within. +The first CB index is given by ``r`` but the number of the remaining CBs is +calculated automatically by BBDEV before passing down to the driver. + +The number of remaining CBs should not be confused with ``c``. ``c`` is the +total number of CBs that composes the whole TB (this maps to C as +described in 3GPP TS 36.212 section 5.1.2). + +The ``length`` is total size of the CBs inclusive of any CRC24A and CRC24B in +case they were appended by the application. + +The case when one CB belongs to TB and is being enqueued individually to BBDEV, +this case is considered as a special case of partial TB where its number of CBs +is 1. Therefore, it requires to get processed in TB-mode. + +The figure below visualizes the encoding of CBs using BBDEV interface in +TB-mode. CB-mode is a reduced version, where only one CB exists: + +.. _figure_turbo_tb_encode: + +.. figure:: img/turbo_tb_encode.* + + Turbo encoding of Code Blocks in mbuf structure + + +BBDEV Turbo Decode Operation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: c + + struct rte_bbdev_op_turbo_dec { + struct rte_bbdev_op_data input; + struct rte_bbdev_op_data hard_output; + struct rte_bbdev_op_data soft_output; + + uint32_t op_flags; + uint8_t rv_index; + uint8_t iter_min:4; + uint8_t iter_max:4; + uint8_t iter_count; + uint8_t ext_scale; + uint8_t num_maps; + uint8_t code_block_mode; + union { + struct rte_bbdev_op_dec_cb_params cb_params; + struct rte_bbdev_op_dec_tb_params tb_params; + }; + }; + +The Turbo decode structure includes the ``input``, ``hard_output`` and +optionally the ``soft_output`` mbuf data pointers. + +.. csv-table:: **struct rte_bbdev_op_turbo_dec** parameters + :header: "Parameter", "Description" + :widths: 10, 30 + + "input","virtual circular buffer, wk, size 3*Kpi for each CB" + "hard output","hard decisions buffer, decoded output, size K for each CB" + "soft output","soft LLR output buffer (optional)" + "op_flags","bitmask of all active operation capabilities" + "rv_index","redundancy version index [0..3]" + "iter_max","maximum number of iterations to perofrm in decode all CBs" + "iter_min","minimum number of iterations to perform in decoding all CBs" + "iter_count","number of iterations to performed in decoding all CBs" + "ext_scale","scale factor on extrinsic info (5 bits)" + "num_maps","number of MAP engines to use in decode" + "code_block_mode","code block or transport block mode" + "cb_params", "code block specific parameters (code block mode only)" + "tb_params", "transport block specific parameters (transport block mode only)" + +Similarly, the decode interface works on both the code block (CB) and the +transport block (TB). An operation executes in "CB-mode" when the CB is +standalone. While "TB-mode" executes when an operation performs on one or +multiple CBs that belong to a TB. Therefore, a given data can be standalone CB, +full-size TB or partial TB. Partial TB means that only a subset of CBs belonging +to a bigger TB are being enqueued. + + **NOTE:** It is assumed that all enqueued ops in one ``rte_bbdev_enqueue_dec_ops()`` + call belong to one mode, either CB-mode or TB-mode. + + +The CB parameter ``k`` is the size of the decoded CB (this maps to K as described in +3GPP TS 36.212 section 5.1.2), this size is inclusive of CRC24A/B. +The ``length`` is inclusive of CRC24A/B and equals to ``k`` in this case. + +The input encoded CB data is the Virtual Circular Buffer data stream, wk, with +the null padding included as described in 3GPP TS 36.212 section 5.1.4.1.2 and +shown in 3GPP TS 36.212 section 5.1.4.1 Figure 5.1.4-1. +The size of the virtual circular buffer is 3*Kpi, where Kpi is the 32 byte +aligned value of K, as specified in 3GPP TS 36.212 section 5.1.4.1.1. + +Each byte in the input circular buffer is the LLR value of each bit of the +original CB. + +``hard_output`` is a mandatory capability that all BBDEV PMDs support. This is +the decoded CBs of K sizes (CRC24A/B is the last 24-bit in each decoded CB). +Soft output is an optional capability for BBDEV PMDs. Setting flag +``RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP`` in ``op_flags`` directs BBDEV to retain +CRC24B at the end of each CB. This might be useful for the application in debug +mode. +An LLR rate matched output is computed in the ``soft_output`` buffer structure +for the given CB parameter ``e`` size (this maps to E described in +3GPP TS 36.212 section 5.1.4.1.2). The output mbuf buffer size needs to be big +enough to hold the encoded buffer of size ``e``. + +The first CB Virtual Circular Buffer (VCB) index is given by ``r`` but the +number of the remaining CB VCBs is calculated automatically by BBDEV before +passing down to the driver. + +The number of remaining CB VCBs should not be confused with ``c``. ``c`` is the +total number of CBs that composes the whole TB (this maps to C as +described in 3GPP TS 36.212 section 5.1.2). + +The ``length`` is total size of the CBs inclusive of any CRC24A and CRC24B in +case they were appended by the application. + +The case when one CB belongs to TB and is being enqueued individually to BBDEV, +this case is considered as a special case of partial TB where its number of CBs +is 1. Therefore, it requires to get processed in TB-mode. + +The output mbuf data structure is expected to be allocated by the application +with enough room for the output data. + +The figure below visualizes the decoding of CBs using BBDEV interface in +TB-mode. CB-mode is a reduced version, where only one CB exists: + +.. _figure_turbo_tb_decode: + +.. figure:: img/turbo_tb_decode.* + + Turbo decoding of Code Blocks in mbuf structure + +BBDEV LDPC Encode Operation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The operation flags that can be set for each LDPC encode operation are +given below. + + **NOTE:** The actual operation flags that may be used with a specific + BBDEV PMD are dependent on the driver capabilities as reported via + ``rte_bbdev_info_get()``, and may be a subset of those below. + ++--------------------------------------------------------------------+ +|Description of LDPC encode capability flags | ++====================================================================+ +|RTE_BBDEV_LDPC_INTERLEAVER_BYPASS | +| Set to bypass bit-level interleaver on output stream | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_RATE_MATCH | +| Set to enabling the RATE_MATCHING processing | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_CRC_24A_ATTACH | +| Set to attach transport block CRC-24A | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_CRC_24B_ATTACH | +| Set to attach code block CRC-24B | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_CRC_16_ATTACH | +| Set to attach code block CRC-16 | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_ENC_INTERRUPTS | +| Set if a device supports encoder dequeue interrupts | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_ENC_SCATTER_GATHER | +| Set if a device supports scatter-gather functionality | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_ENC_CONCATENATION | +| Set if a device supports concatenation of non byte aligned output | ++--------------------------------------------------------------------+ + +The structure passed for each LDPC encode operation is given below, +with the operation flags forming a bitmask in the ``op_flags`` field. + +.. code-block:: c + + struct rte_bbdev_op_ldpc_enc { + + struct rte_bbdev_op_data input; + struct rte_bbdev_op_data output; + + uint32_t op_flags; + uint8_t rv_index; + uint8_t basegraph; + uint16_t z_c; + uint16_t n_cb; + uint8_t q_m; + uint16_t n_filler; + uint8_t code_block_mode; + union { + struct rte_bbdev_op_enc_ldpc_cb_params cb_params; + struct rte_bbdev_op_enc_ldpc_tb_params tb_params; + }; + }; + +The LDPC encode parameters are set out in the table below. + ++----------------+--------------------------------------------------------------------+ +|Parameter |Description | ++================+====================================================================+ +|input |input CB or TB data | ++----------------+--------------------------------------------------------------------+ +|output |rate matched CB or TB output buffer | ++----------------+--------------------------------------------------------------------+ +|op_flags |bitmask of all active operation capabilities | ++----------------+--------------------------------------------------------------------+ +|rv_index |redundancy version index [0..3] | ++----------------+--------------------------------------------------------------------+ +|basegraph |Basegraph 1 or 2 | ++----------------+--------------------------------------------------------------------+ +|z_c |Zc, LDPC lifting size | ++----------------+--------------------------------------------------------------------+ +|n_cb |Ncb, length of the circular buffer in bits. | ++----------------+--------------------------------------------------------------------+ +|q_m |Qm, modulation order {2,4,6,8,10} | ++----------------+--------------------------------------------------------------------+ +|n_filler |number of filler bits | ++----------------+--------------------------------------------------------------------+ +|code_block_mode |code block or transport block mode | ++----------------+--------------------------------------------------------------------+ +|op_flags |bitmask of all active operation capabilities | ++----------------+--------------------------------------------------------------------+ +|**cb_params** |code block specific parameters (code block mode only) | ++----------------+------------+-------------------------------------------------------+ +| |e |E, length of the rate matched output sequence in bits | ++----------------+------------+-------------------------------------------------------+ +|**tb_params** | transport block specific parameters (transport block mode only) | ++----------------+------------+-------------------------------------------------------+ +| |c |number of CBs in the TB or partial TB | ++----------------+------------+-------------------------------------------------------+ +| |r |index of the first CB in the inbound mbuf data | ++----------------+------------+-------------------------------------------------------+ +| |c_ab |number of CBs that use Ea before switching to Eb | ++----------------+------------+-------------------------------------------------------+ +| |ea |Ea, length of the RM output sequence in bits, r < cab | ++----------------+------------+-------------------------------------------------------+ +| |eb |Eb, length of the RM output sequence in bits, r >= cab | ++----------------+------------+-------------------------------------------------------+ + +The mbuf input ``input`` is mandatory for all BBDEV PMDs and is the +incoming code block or transport block data. + +The mbuf output ``output`` is mandatory and is the encoded CB(s). In +CB-mode ut contains the encoded CB of size ``e`` (E in 3GPP TS 38.212 +section 6.2.5). In TB-mode it contains multiple contiguous encoded CBs +of size ``ea`` or ``eb``. +The ``output`` buffer is allocated by the application with enough room +for the output data. + +The encode interface works on both a code block (CB) and a transport +block (TB) basis. + + **NOTE:** All enqueued ops in one ``rte_bbdev_enqueue_enc_ops()`` + call belong to one mode, either CB-mode or TB-mode. + +The valid modes of operation are: + +* CB-mode: one CB (attach CRC24B if required) +* CB-mode: one CB making up one TB (attach CRC24A if required) +* TB-mode: one or more CB of a partial TB (attach CRC24B(s) if required) +* TB-mode: one or more CB of a complete TB (attach CRC24AB(s) if required) + +In CB-mode if ``RTE_BBDEV_LDPC_CRC_24A_ATTACH`` is set then CRC24A +is appended to the CB. If ``RTE_BBDEV_LDPC_CRC_24A_ATTACH`` is not +set the application is responsible for calculating and appending CRC24A +before calling BBDEV. The input data mbuf ``length`` is inclusive of +CRC24A/B where present and is equal to the code block size ``K``. + +In TB-mode, CRC24A is assumed to be pre-calculated and appended to the +inbound TB data buffer, unless the ``RTE_BBDEV_LDPC_CRC_24A_ATTACH`` +flag is set when it is the responsibility of BBDEV. The input data +mbuf ``length`` is total size of the CBs inclusive of any CRC24A and +CRC24B in the case they were appended by the application. + +Not all BBDEV PMDs may be capable of CRC24A/B calculation. Flags +``RTE_BBDEV_LDPC_CRC_24A_ATTACH`` and ``RTE_BBDEV_LDPC_CRC_24B_ATTACH`` +inform the application of the relevant capability. These flags can be set +in the ``op_flags`` parameter to indicate BBDEV to calculate and append +CRC24A to CB before going forward with LDPC encoding. + +The difference between the partial and full-size TB is that BBDEV needs +the index of the first CB in this group and the number of CBs in the group. +The first CB index is given by ``r`` but the number of the CBs is +calculated by BBDEV before signalling to the driver. + +The number of CBs in the group should not be confused with ``c``, the +total number of CBs in the full TB (``C`` as per 3GPP TS 38.212 section 5.2.2) + +Figure :numref:`figure_turbo_tb_encode` above +showing the Turbo encoding of CBs using BBDEV interface in TB-mode +is also valid for LDPC encode. + +BBDEV LDPC Decode Operation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The operation flags that can be set for each LDPC decode operation are +given below. + + **NOTE:** The actual operation flags that may be used with a specific + BBDEV PMD are dependent on the driver capabilities as reported via + ``rte_bbdev_info_get()``, and may be a subset of those below. + ++--------------------------------------------------------------------+ +|Description of LDPC decode capability flags | ++====================================================================+ +|RTE_BBDEV_LDPC_CRC_TYPE_24A_CHECK | +| Set for transport block CRC-24A checking | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK | +| Set for code block CRC-24B checking | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP | +| Set to drop the last CRC bits decoding output | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_DEINTERLEAVER_BYPASS | +| Set for bit-level de-interleaver bypass on input stream | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE | +| Set for HARQ combined input stream enable | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE | +| Set for HARQ combined output stream enable | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_DECODE_BYPASS | +| Set for LDPC decoder bypass | +| | +| RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE must be set | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_DECODE_SOFT_OUT | +| Set for soft-output stream enable | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_SOFT_OUT_RM_BYPASS | +| Set for Rate-Matching bypass on soft-out stream | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_SOFT_OUT_DEINTERLEAVER_BYPASS | +| Set for bit-level de-interleaver bypass on soft-output stream | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE | +| Set for iteration stopping on successful decode condition enable | +| | +| Where a successful decode is a successful syndrome check | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_DEC_INTERRUPTS | +| Set if a device supports decoder dequeue interrupts | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_DEC_SCATTER_GATHER | +| Set if a device supports scatter-gather functionality | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION | +| Set if a device supports input/output HARQ compression | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_LLR_COMPRESSION | +| Set if a device supports input LLR compression | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE | +| Set if a device supports HARQ input to device's internal memory | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE | +| Set if a device supports HARQ output to device's internal memory | ++--------------------------------------------------------------------+ +|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK | +| Set if a device supports loopback access to HARQ internal memory | ++--------------------------------------------------------------------+ + +The structure passed for each LDPC decode operation is given below, +with the operation flags forming a bitmask in the ``op_flags`` field. + +.. code-block:: c + + + struct rte_bbdev_op_ldpc_dec { + + struct rte_bbdev_op_data input; + struct rte_bbdev_op_data hard_output; + struct rte_bbdev_op_data soft_output; + struct rte_bbdev_op_data harq_combined_input; + struct rte_bbdev_op_data harq_combined_output; + + uint32_t op_flags; + uint8_t rv_index; + uint8_t basegraph; + uint16_t z_c; + uint16_t n_cb; + uint8_t q_m; + uint16_t n_filler; + uint8_t iter_max; + uint8_t iter_count; + uint8_t code_block_mode; + union { + struct rte_bbdev_op_dec_ldpc_cb_params cb_params; + struct rte_bbdev_op_dec_ldpc_tb_params tb_params; + }; + }; + + +The LDPC decode parameters are set out in the table below. + ++----------------+--------------------------------------------------------------------+ +|Parameter |Description | ++================+====================================================================+ +|input |input CB or TB data | ++----------------+--------------------------------------------------------------------+ +|hard_output |hard decisions buffer, decoded output | ++----------------+--------------------------------------------------------------------+ +|soft_output |soft LLR output buffer (optional) | ++----------------+--------------------------------------------------------------------+ +|harq_comb_input |HARQ combined input buffer (optional) | ++----------------+--------------------------------------------------------------------+ +|harq_comb_output|HARQ combined output buffer (optional) | ++----------------+--------------------------------------------------------------------+ +|op_flags |bitmask of all active operation capabilities | ++----------------+--------------------------------------------------------------------+ +|rv_index |redundancy version index [0..3] | ++----------------+--------------------------------------------------------------------+ +|basegraph |Basegraph 1 or 2 | ++----------------+--------------------------------------------------------------------+ +|z_c |Zc, LDPC lifting size | ++----------------+--------------------------------------------------------------------+ +|n_cb |Ncb, length of the circular buffer in bits. | ++----------------+--------------------------------------------------------------------+ +|q_m |Qm, modulation order {1,2,4,6,8} from pi/2-BPSK to 256QAM | ++----------------+--------------------------------------------------------------------+ +|n_filler |number of filler bits | ++----------------+--------------------------------------------------------------------+ +|iter_max |maximum number of iterations to perform in decode all CBs | ++----------------+--------------------------------------------------------------------+ +|iter_count |number of iterations performed in decoding all CBs | ++----------------+--------------------------------------------------------------------+ +|code_block_mode |code block or transport block mode | ++----------------+--------------------------------------------------------------------+ +|op_flags |bitmask of all active operation capabilities | ++----------------+--------------------------------------------------------------------+ +|**cb_params** |code block specific parameters (code block mode only) | ++----------------+------------+-------------------------------------------------------+ +| |e |E, length of the rate matched output sequence in bits | ++----------------+------------+-------------------------------------------------------+ +|**tb_params** | transport block specific parameters (transport block mode only) | ++----------------+------------+-------------------------------------------------------+ +| |c |number of CBs in the TB or partial TB | ++----------------+------------+-------------------------------------------------------+ +| |r |index of the first CB in the inbound mbuf data | ++----------------+------------+-------------------------------------------------------+ +| |c_ab |number of CBs that use Ea before switching to Eb | ++----------------+------------+-------------------------------------------------------+ +| |ea |Ea, length of the RM output sequence in bits, r < cab | ++----------------+------------+-------------------------------------------------------+ +| |eb |Eb, length of the RM output sequence in bits r >= cab | ++----------------+------------+-------------------------------------------------------+ + +The mbuf input ``input`` encoded CB data is mandatory for all BBDEV PMDs +and is the Virtual Circular Buffer data stream with null padding. +Each byte in the input circular buffer is the LLR value of each bit of +the original CB. + +The mbuf output ``hard_output`` is mandatory and is the decoded CBs size +K (CRC24A/B is the last 24-bit in each decoded CB). + +The mbuf output ``soft_output`` is optional and is an LLR rate matched +output of size ``e`` (this is ``E`` as per 3GPP TS 38.212 section 6.2.5). + +The mbuf input ``harq_combine_input`` is optional and is a buffer with +the input to the HARQ combination function of the device. If the +capability RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE is set +then the HARQ is stored in memory internal to the device and not visible +to BBDEV. + +The mbuf output ``harq_combine_output`` is optional and is a buffer for +the output of the HARQ combination function of the device. If the +capability RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE is set +then the HARQ is stored in memory internal to the device and not visible +to BBDEV. + +The output mbuf data structures are expected to be allocated by the +application with enough room for the output data. + +As with the LDPC encode, the decode interface works on both a code block +(CB) and a transport block (TB) basis. + + **NOTE:** All enqueued ops in one ``rte_bbdev_enqueue_dec_ops()`` + call belong to one mode, either CB-mode or TB-mode. + +The valid modes of operation are: + +* CB-mode: one CB (check CRC24B if required) +* CB-mode: one CB making up one TB (check CRC24A if required) +* TB-mode: one or more CB making up a partial TB (check CRC24B(s) if required) +* TB-mode: one or more CB making up a complete TB (check CRC24B(s) if required) + +The mbuf ``length`` is inclusive of CRC24A/B where present and is equal +the code block size ``K``. + +The first CB Virtual Circular Buffer (VCB) index is given by ``r`` but the +number of the remaining CB VCBs is calculated automatically by BBDEV +and passed down to the driver. + +The number of remaining CB VCBs should not be confused with ``c``, the +total number of CBs in the full TB (``C`` as per 3GPP TS 38.212 section 5.2.2) + +The ``length`` is total size of the CBs inclusive of any CRC24A and CRC24B in +case they were appended by the application. + +Figure :numref:`figure_turbo_tb_decode` above +showing the Turbo decoding of CBs using BBDEV interface in TB-mode +is also valid for LDPC decode. + + +Sample code +----------- + +The baseband device sample application gives an introduction on how to use the +bbdev framework, by giving a sample code performing a loop-back operation with a +baseband processor capable of transceiving data packets. + +The following sample C-like pseudo-code shows the basic steps to encode several +buffers using (**sw_turbo**) bbdev PMD. + +.. code-block:: c + + /* EAL Init */ + ret = rte_eal_init(argc, argv); + if (ret < 0) + rte_exit(EXIT_FAILURE, "Invalid EAL arguments\n"); + + /* Get number of available bbdev devices */ + nb_bbdevs = rte_bbdev_count(); + if (nb_bbdevs == 0) + rte_exit(EXIT_FAILURE, "No bbdevs detected!\n"); + + /* Create bbdev op pools */ + bbdev_op_pool[RTE_BBDEV_OP_TURBO_ENC] = + rte_bbdev_op_pool_create("bbdev_op_pool_enc", + RTE_BBDEV_OP_TURBO_ENC, NB_MBUF, 128, rte_socket_id()); + + /* Get information for this device */ + rte_bbdev_info_get(dev_id, &info); + + /* Setup BBDEV device queues */ + ret = rte_bbdev_setup_queues(dev_id, qs_nb, info.socket_id); + if (ret < 0) + rte_exit(EXIT_FAILURE, + "ERROR(%d): BBDEV %u not configured properly\n", + ret, dev_id); + + /* setup device queues */ + qconf.socket = info.socket_id; + qconf.queue_size = info.drv.queue_size_lim; + qconf.op_type = RTE_BBDEV_OP_TURBO_ENC; + + for (q_id = 0; q_id < qs_nb; q_id++) { + /* Configure all queues belonging to this bbdev device */ + ret = rte_bbdev_queue_configure(dev_id, q_id, &qconf); + if (ret < 0) + rte_exit(EXIT_FAILURE, + "ERROR(%d): BBDEV %u queue %u not configured properly\n", + ret, dev_id, q_id); + } + + /* Start bbdev device */ + ret = rte_bbdev_start(dev_id); + + /* Create the mbuf mempool for pkts */ + mbuf_pool = rte_pktmbuf_pool_create("bbdev_mbuf_pool", + NB_MBUF, MEMPOOL_CACHE_SIZE, 0, + RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id()); + if (mbuf_pool == NULL) + rte_exit(EXIT_FAILURE, + "Unable to create '%s' pool\n", pool_name); + + while (!global_exit_flag) { + + /* Allocate burst of op structures in preparation for enqueue */ + if (rte_bbdev_enc_op_alloc_bulk(bbdev_op_pool[RTE_BBDEV_OP_TURBO_ENC], + ops_burst, op_num) != 0) + continue; + + /* Allocate input mbuf pkts */ + ret = rte_pktmbuf_alloc_bulk(mbuf_pool, input_pkts_burst, MAX_PKT_BURST); + if (ret < 0) + continue; + + /* Allocate output mbuf pkts */ + ret = rte_pktmbuf_alloc_bulk(mbuf_pool, output_pkts_burst, MAX_PKT_BURST); + if (ret < 0) + continue; + + for (j = 0; j < op_num; j++) { + /* Append the size of the ethernet header */ + rte_pktmbuf_append(input_pkts_burst[j], + sizeof(struct rte_ether_hdr)); + + /* set op */ + + ops_burst[j]->turbo_enc.input.offset = + sizeof(struct rte_ether_hdr); + + ops_burst[j]->turbo_enc->input.length = + rte_pktmbuf_pkt_len(bbdev_pkts[j]); + + ops_burst[j]->turbo_enc->input.data = + input_pkts_burst[j]; + + ops_burst[j]->turbo_enc->output.offset = + sizeof(struct rte_ether_hdr); + + ops_burst[j]->turbo_enc->output.data = + output_pkts_burst[j]; + } + + /* Enqueue packets on BBDEV device */ + op_num = rte_bbdev_enqueue_enc_ops(qconf->bbdev_id, + qconf->bbdev_qs[q], ops_burst, + MAX_PKT_BURST); + + /* Dequeue packets from BBDEV device*/ + op_num = rte_bbdev_dequeue_enc_ops(qconf->bbdev_id, + qconf->bbdev_qs[q], ops_burst, + MAX_PKT_BURST); + } + + +BBDEV Device API +~~~~~~~~~~~~~~~~ + +The bbdev Library API is described in the *DPDK API Reference* document. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/bpf_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/bpf_lib.rst new file mode 100644 index 000000000..9c728da7b --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/bpf_lib.rst @@ -0,0 +1,38 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2018 Intel Corporation. + +Berkeley Packet Filter Library +============================== + +The DPDK provides an BPF library that gives the ability +to load and execute Enhanced Berkeley Packet Filter (eBPF) bytecode within +user-space dpdk application. + +It supports basic set of features from eBPF spec. +Please refer to the +`eBPF spec <https://www.kernel.org/doc/Documentation/networking/filter.txt>` +for more information. +Also it introduces basic framework to load/unload BPF-based filters +on eth devices (right now only via SW RX/TX callbacks). + +The library API provides the following basic operations: + +* Create a new BPF execution context and load user provided eBPF code into it. + +* Destroy an BPF execution context and its runtime structures and free the associated memory. + +* Execute eBPF bytecode associated with provided input parameter. + +* Provide information about natively compiled code for given BPF context. + +* Load BPF program from the ELF file and install callback to execute it on given ethdev port/queue. + +Not currently supported eBPF features +------------------------------------- + + - JIT support only available for X86_64 and arm64 platforms + - cBPF + - tail-pointer call + - eBPF MAP + - skb + - external function calls for 32-bit platforms diff --git a/src/spdk/dpdk/doc/guides/prog_guide/build-sdk-meson.rst b/src/spdk/dpdk/doc/guides/prog_guide/build-sdk-meson.rst new file mode 100644 index 000000000..7679c049a --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/build-sdk-meson.rst @@ -0,0 +1,203 @@ +Installing DPDK Using the meson build system +============================================ + +Summary +-------- +For many platforms, compiling and installing DPDK should work using the +following set of commands:: + + meson build + cd build + ninja + ninja install + +This will compile DPDK in the ``build`` subdirectory, and then install the +resulting libraries, drivers and header files onto the system - generally +in /usr/local. A package-config file, ``libdpdk.pc``, for DPDK will also +be installed to allow ease of compiling and linking with applications. + +After installation, to use DPDK, the necessary CFLAG and LDFLAG variables +can be got from pkg-config:: + + pkg-config --cflags libdpdk + pkg-config --libs libdpdk + +More detail on each of these steps can be got from the following sections. + + +Getting the Tools +------------------ + +The ``meson`` tool is used to configure a DPDK build. On most Linux +distributions this can be got using the local package management system, +e.g. ``dnf install meson`` or ``apt-get install meson``. If meson is not +available as a suitable package, it can also be installed using the Python +3 ``pip`` tool, e.g. ``pip3 install meson``. Version 0.47.1 of meson is +required - if the version packaged is too old, the latest version is +generally available from "pip". + +The other dependency for building is the ``ninja`` tool, which acts similar +to make and performs the actual build using information provided by meson. +Installing meson will, in many cases, also install ninja, but, if not +already installed, it too is generally packaged by most Linux distributions. +If not available as a package, it can be downloaded as source or binary from +https://ninja-build.org/ + + +Configuring the Build +---------------------- + +To configure a build, run the meson tool, passing the path to the directory +to be used for the build e.g. ``meson build``, as shown above. If calling +meson from somewhere other than the root directory of the DPDK project the +path to the root directory should be passed as the first parameter, and the +build path as the second. For example, to build DPDK in /tmp/dpdk-build:: + + user@host:/tmp$ meson ~user/dpdk dpdk-build + +Meson will then configure the build based on settings in the project's +meson.build files, and by checking the build environment for e.g. compiler +properties or the presence of dependencies, such as libpcap, or openssl +libcrypto libraries. Once done, meson writes a ``build.ninja`` file in the +build directory to be used to do the build itself when ninja is called. + +Tuning of the build is possible, both as part of the original meson call, +or subsequently using ``meson configure`` command (``mesonconf`` in some +older versions). Some options, such as ``buildtype``, or ``werror`` are +built into meson, while others, such as ``max_lcores``, or the list of +examples to build, are DPDK-specific. To have a list of all options +available run ``meson configure`` in the build directory. + +Examples of adjusting the defaults when doing initial meson configuration. +Project-specific options are passed used -Doption=value:: + + meson --werror werrorbuild # build with warnings as errors + + meson --buildtype=debug debugbuild # build for debugging + + meson -Dexamples=l3fwd,l2fwd fwdbuild # build some examples as + # part of the normal DPDK build + + meson -Dmax_lcores=8 smallbuild # scale build for smaller systems + + meson -Denable_docs=true fullbuild # build and install docs + + meson -Dmachine=default # use builder-independent baseline -march + + meson -Ddisable_drivers=event/*,net/tap # disable tap driver and all + # eventdev PMDs for a smaller build + + meson -Denable_trace_fp=true tracebuild # build with fast path traces + # enabled + +Examples of setting some of the same options using meson configure:: + + meson configure -Dwerror=true + + meson configure -Dbuildtype=debug + + meson configure -Dexamples=l3fwd,l2fwd + + meson configure -Dmax_lcores=8 + + meson configure -Denable_trace_fp=true + +NOTE: once meson has been run to configure a build in a directory, it +cannot be run again on the same directory. Instead ``meson configure`` +should be used to change the build settings within the directory, and when +``ninja`` is called to do the build itself, it will trigger the necessary +re-scan from meson. + +NOTE: machine=default uses a config that works on all supported architectures +regardless of the capabilities of the machine where the build is happening. + +As well as those settings taken from ``meson configure``, other options +such as the compiler to use can be passed via environment variables. For +example:: + + CC=clang meson clang-build + +NOTE: for more comprehensive overriding of compilers or other environment +settings, the tools for cross-compilation may be considered. However, for +basic overriding of the compiler etc., the above form works as expected. + + +Performing the Build +--------------------- + +Use ``ninja`` to perform the actual build inside the build folder +previously configured. In most cases no arguments are necessary. + +Ninja accepts a number of flags which are similar to make. For example, to +call ninja from outside the build folder, you can use ``ninja -C build``. +Ninja also runs parallel builds by default, but you can limit this using +the ``-j`` flag, e.g. ``ninja -j1 -v`` to do the build one step at a time, +printing each command on a new line as it runs. + + +Installing the Compiled Files +------------------------------ + +Use ``ninja install`` to install the required DPDK files onto the system. +The install prefix defaults to ``/usr/local`` but can be used as with other +options above. The environment variable ``DESTDIR`` can be used to adjust +the root directory for the install, for example when packaging. + +With the base install directory, the individual directories for libraries +and headers are configurable. By default, the following will be the +installed layout:: + + headers -> /usr/local/include + libraries -> /usr/local/lib64 + drivers -> /usr/local/lib64/dpdk/drivers + libdpdk.pc -> /usr/local/lib64/pkgconfig + +For the drivers, these will also be symbolically linked into the library +install directory, so that ld.so can find them in cases where one driver may +depend on another, e.g. a NIC PMD depending upon the PCI bus driver. Within +the EAL, the default search path for drivers will be set to the configured +driver install path, so dynamically-linked applications can be run without +having to pass in ``-d /path/to/driver`` options for standard drivers. + + +Cross Compiling DPDK +-------------------- + +To cross-compile DPDK on a desired target machine we can use the following +command:: + + meson cross-build --cross-file <target_machine_configuration> + +For example if the target machine is arm64 we can use the following +command:: + + meson arm-build --cross-file config/arm/arm64_armv8_linux_gcc + +where config/arm/arm64_armv8_linux_gcc contains settings for the compilers +and other build tools to be used, as well as characteristics of the target +machine. + +Using the DPDK within an Application +------------------------------------- + +To compile and link against DPDK within an application, pkg-config should +be used to query the correct parameters. Examples of this are given in the +makefiles for the example applications included with DPDK. They demonstrate +how to link either against the DPDK shared libraries, or against the static +versions of the same. + +From examples/helloworld/Makefile:: + + PC_FILE := $(shell pkg-config --path libdpdk) + CFLAGS += -O3 $(shell pkg-config --cflags libdpdk) + LDFLAGS_SHARED = $(shell pkg-config --libs libdpdk) + LDFLAGS_STATIC = -Wl,-Bstatic $(shell pkg-config --static --libs libdpdk) + + build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build + $(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED) + + build/$(APP)-static: $(SRCS-y) Makefile $(PC_FILE) | build + $(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_STATIC) + + build: + @mkdir -p $@ diff --git a/src/spdk/dpdk/doc/guides/prog_guide/build_app.rst b/src/spdk/dpdk/doc/guides/prog_guide/build_app.rst new file mode 100644 index 000000000..bffa55bbe --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/build_app.rst @@ -0,0 +1,99 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +.. _Building_Your_Own_Application: + +Building Your Own Application +============================= + +Compiling a Sample Application in the Development Kit Directory +--------------------------------------------------------------- + +When compiling a sample application (for example, hello world), the following variables must be exported: +RTE_SDK and RTE_TARGET. + +.. code-block:: console + + ~/DPDK$ cd examples/helloworld/ + ~/DPDK/examples/helloworld$ export RTE_SDK=/home/user/DPDK + ~/DPDK/examples/helloworld$ export RTE_TARGET=x86_64-native-linux-gcc + ~/DPDK/examples/helloworld$ make + CC main.o + LD helloworld + INSTALL-APP helloworld + INSTALL-MAP helloworld.map + +The binary is generated in the build directory by default: + +.. code-block:: console + + ~/DPDK/examples/helloworld$ ls build/app + helloworld helloworld.map + +Build Your Own Application Outside the Development Kit +------------------------------------------------------ + +The sample application (Hello World) can be duplicated in a new directory as a starting point for your development: + +.. code-block:: console + + ~$ cp -r DPDK/examples/helloworld my_rte_app + ~$ cd my_rte_app/ + ~/my_rte_app$ export RTE_SDK=/home/user/DPDK + ~/my_rte_app$ export RTE_TARGET=x86_64-native-linux-gcc + ~/my_rte_app$ make + CC main.o + LD helloworld + INSTALL-APP helloworld + INSTALL-MAP helloworld.map + +Customizing Makefiles +--------------------- + +Application Makefile +~~~~~~~~~~~~~~~~~~~~ + +The default makefile provided with the Hello World sample application is a good starting point. It includes: + +* $(RTE_SDK)/mk/rte.vars.mk at the beginning + +* $(RTE_SDK)/mk/rte.extapp.mk at the end + +The user must define several variables: + +* APP: Contains the name of the application. + +* SRCS-y: List of source files (\*.c, \*.S). + +Library Makefile +~~~~~~~~~~~~~~~~ + +It is also possible to build a library in the same way: + +* Include $(RTE_SDK)/mk/rte.vars.mk at the beginning. + +* Include $(RTE_SDK)/mk/rte.extlib.mk at the end. + +The only difference is that APP should be replaced by LIB, which contains the name of the library. For example, libfoo.a. + +Customize Makefile Actions +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Some variables can be defined to customize Makefile actions. The most common are listed below. Refer to +:ref:`Makefile Description <Makefile_Description>` section in +:ref:`Development Kit Build System <Development_Kit_Build_System>` + +chapter for details. + +* VPATH: The path list where the build system will search for sources. By default, + RTE_SRCDIR will be included in VPATH. + +* CFLAGS_my_file.o: The specific flags to add for C compilation of my_file.c. + +* CFLAGS: The flags to use for C compilation. + +* LDFLAGS: The flags to use for linking. + +* CPPFLAGS: The flags to use to provide flags to the C preprocessor (only useful when assembling .S files) + +* LDLIBS: A list of libraries to link with (for example, -L /path/to/libfoo - lfoo) diff --git a/src/spdk/dpdk/doc/guides/prog_guide/compressdev.rst b/src/spdk/dpdk/doc/guides/prog_guide/compressdev.rst new file mode 100644 index 000000000..a089db1fa --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/compressdev.rst @@ -0,0 +1,637 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017-2018 Cavium Networks. + +Compression Device Library +=========================== + +The compression framework provides a generic set of APIs to perform compression services +as well as to query and configure compression devices both physical(hardware) and virtual(software) +to perform those services. The framework currently only supports lossless compression schemes: +Deflate and LZS. + +Device Management +----------------- + +Device Creation +~~~~~~~~~~~~~~~ + +Physical compression devices are discovered during the bus probe of the EAL function +which is executed at DPDK initialization, based on their unique device identifier. +For e.g. PCI devices can be identified using PCI BDF (bus/bridge, device, function). +Specific physical compression devices, like other physical devices in DPDK can be +white-listed or black-listed using the EAL command line options. + +Virtual devices can be created by two mechanisms, either using the EAL command +line options or from within the application using an EAL API directly. + +From the command line using the --vdev EAL option + +.. code-block:: console + + --vdev '<pmd name>,socket_id=0' + +.. Note:: + + * If DPDK application requires multiple software compression PMD devices then required + number of ``--vdev`` with appropriate libraries are to be added. + + * An Application with multiple compression device instances exposed by the same PMD must + specify a unique name for each device. + + Example: ``--vdev 'pmd0' --vdev 'pmd1'`` + +Or, by using the rte_vdev_init API within the application code. + +.. code-block:: c + + rte_vdev_init("<pmd_name>","socket_id=0") + +All virtual compression devices support the following initialization parameters: + +* ``socket_id`` - socket on which to allocate the device resources on. + +Device Identification +~~~~~~~~~~~~~~~~~~~~~ + +Each device, whether virtual or physical is uniquely designated by two +identifiers: + +- A unique device index used to designate the compression device in all functions + exported by the compressdev API. + +- A device name used to designate the compression device in console messages, for + administration or debugging purposes. + +Device Configuration +~~~~~~~~~~~~~~~~~~~~ + +The configuration of each compression device includes the following operations: + +- Allocation of resources, including hardware resources if a physical device. +- Resetting the device into a well-known default state. +- Initialization of statistics counters. + +The ``rte_compressdev_configure`` API is used to configure a compression device. + +The ``rte_compressdev_config`` structure is used to pass the configuration +parameters. + +See *DPDK API Reference* for details. + +Configuration of Queue Pairs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Each compression device queue pair is individually configured through the +``rte_compressdev_queue_pair_setup`` API. + +The ``max_inflight_ops`` is used to pass maximum number of +rte_comp_op that could be present in a queue at-a-time. +PMD then can allocate resources accordingly on a specified socket. + +See *DPDK API Reference* for details. + +Logical Cores, Memory and Queues Pair Relationships +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Library supports NUMA similarly as described in Cryptodev library section. + +A queue pair cannot be shared and should be exclusively used by a single processing +context for enqueuing operations or dequeuing operations on the same compression device +since sharing would require global locks and hinder performance. It is however possible +to use a different logical core to dequeue an operation on a queue pair from the logical +core on which it was enqueued. This means that a compression burst enqueue/dequeue +APIs are a logical place to transition from one logical core to another in a +data processing pipeline. + +Device Features and Capabilities +--------------------------------- + +Compression devices define their functionality through two mechanisms, global device +features and algorithm features. Global devices features identify device +wide level features which are applicable to the whole device such as supported hardware +acceleration and CPU features. List of compression device features can be seen in the +RTE_COMPDEV_FF_XXX macros. + +The algorithm features lists individual algo feature which device supports per-algorithm, +such as a stateful compression/decompression, checksums operation etc. List of algorithm +features can be seen in the RTE_COMP_FF_XXX macros. + +Capabilities +~~~~~~~~~~~~ +Each PMD has a list of capabilities, including algorithms listed in +enum ``rte_comp_algorithm`` and its associated feature flag and +sliding window range in log base 2 value. Sliding window tells +the minimum and maximum size of lookup window that algorithm uses +to find duplicates. + +See *DPDK API Reference* for details. + +Each Compression poll mode driver defines its array of capabilities +for each algorithm it supports. See PMD implementation for capability +initialization. + +Capabilities Discovery +~~~~~~~~~~~~~~~~~~~~~~ + +PMD capability and features are discovered via ``rte_compressdev_info_get`` function. + +The ``rte_compressdev_info`` structure contains all the relevant information for the device. + +See *DPDK API Reference* for details. + +Compression Operation +---------------------- + +DPDK compression supports two types of compression methodologies: + +- Stateless, data associated to a compression operation is compressed without any reference + to another compression operation. + +- Stateful, data in each compression operation is compressed with reference to previous compression + operations in the same data stream i.e. history of data is maintained between the operations. + +For more explanation, please refer RFC https://www.ietf.org/rfc/rfc1951.txt + +Operation Representation +~~~~~~~~~~~~~~~~~~~~~~~~ + +Compression operation is described via ``struct rte_comp_op``, which contains both input and +output data. The operation structure includes the operation type (stateless or stateful), +the operation status and the priv_xform/stream handle, source, destination and checksum buffer +pointers. It also contains the source mempool from which the operation is allocated. +PMD updates consumed field with amount of data read from source buffer and produced +field with amount of data of written into destination buffer along with status of +operation. See section *Produced, Consumed And Operation Status* for more details. + +Compression operations mempool also has an ability to allocate private memory with the +operation for application's purposes. Application software is responsible for specifying +all the operation specific fields in the ``rte_comp_op`` structure which are then used +by the compression PMD to process the requested operation. + + +Operation Management and Allocation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The compressdev library provides an API set for managing compression operations which +utilize the Mempool Library to allocate operation buffers. Therefore, it ensures +that the compression operation is interleaved optimally across the channels and +ranks for optimal processing. + +A ``rte_comp_op`` contains a field indicating the pool it originated from. + +``rte_comp_op_alloc()`` and ``rte_comp_op_bulk_alloc()`` are used to allocate +compression operations from a given compression operation mempool. +The operation gets reset before being returned to a user so that operation +is always in a good known state before use by the application. + +``rte_comp_op_free()`` is called by the application to return an operation to +its allocating pool. + +See *DPDK API Reference* for details. + +Passing source data as mbuf-chain +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +If input data is scattered across several different buffers, then +Application can either parse through all such buffers and make one +mbuf-chain and enqueue it for processing or, alternatively, it can +make multiple sequential enqueue_burst() calls for each of them +processing them statefully. See *Compression API Stateful Operation* +for stateful processing of ops. + +Operation Status +~~~~~~~~~~~~~~~~ +Each operation carries a status information updated by PMD after it is processed. +Following are currently supported: + +- RTE_COMP_OP_STATUS_SUCCESS, + Operation is successfully completed + +- RTE_COMP_OP_STATUS_NOT_PROCESSED, + Operation has not yet been processed by the device + +- RTE_COMP_OP_STATUS_INVALID_ARGS, + Operation failed due to invalid arguments in request + +- RTE_COMP_OP_STATUS_ERROR, + Operation failed because of internal error + +- RTE_COMP_OP_STATUS_INVALID_STATE, + Operation is invoked in invalid state + +- RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED, + Output buffer ran out of space during processing. Error case, + PMD cannot continue from here. + +- RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE, + Output buffer ran out of space before operation completed, but this + is not an error case. Output data up to op.produced can be used and + next op in the stream should continue on from op.consumed+1. + +Operation status after enqueue / dequeue +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Some of the above values may arise in the op after an +``rte_compressdev_enqueue_burst()``. If number ops enqueued < number ops requested then +the app should check the op.status of nb_enqd+1. If status is RTE_COMP_OP_STATUS_NOT_PROCESSED, +it likely indicates a full-queue case for a hardware device and a retry after dequeuing some ops is likely +to be successful. If the op holds any other status, e.g. RTE_COMP_OP_STATUS_INVALID_ARGS, a retry with +the same op is unlikely to be successful. + + +Produced, Consumed And Operation Status +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- If status is RTE_COMP_OP_STATUS_SUCCESS, + consumed = amount of data read from input buffer, and + produced = amount of data written in destination buffer +- If status is RTE_COMP_OP_STATUS_ERROR, + consumed = produced = undefined +- If status is RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED, + consumed = 0 and + produced = usually 0, but in decompression cases a PMD may return > 0 + i.e. amount of data successfully produced until out of space condition + hit. Application can consume output data in this case, if required. +- If status is RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE, + consumed = amount of data read, and + produced = amount of data successfully produced until + out of space condition hit. PMD has ability to recover + from here, so application can submit next op from + consumed+1 and a destination buffer with available space. + +Transforms +---------- + +Compression transforms (``rte_comp_xform``) are the mechanism +to specify the details of the compression operation such as algorithm, +window size and checksum. + +Compression API Hash support +---------------------------- + +Compression API allows application to enable digest calculation +alongside compression and decompression of data. A PMD reflects its +support for hash algorithms via capability algo feature flags. +If supported, PMD calculates digest always on plaintext i.e. +before compression and after decompression. + +Currently supported list of hash algos are SHA-1 and SHA2 family +SHA256. + +See *DPDK API Reference* for details. + +If required, application should set valid hash algo in compress +or decompress xforms during ``rte_compressdev_stream_create()`` +or ``rte_compressdev_private_xform_create()`` and pass a valid +output buffer in ``rte_comp_op`` hash field struct to store the +resulting digest. Buffer passed should be contiguous and large +enough to store digest which is 20 bytes for SHA-1 and +32 bytes for SHA2-256. + +Compression API Stateless operation +------------------------------------ + +An op is processed stateless if it has +- op_type set to RTE_COMP_OP_STATELESS +- flush value set to RTE_COMP_FLUSH_FULL or RTE_COMP_FLUSH_FINAL +(required only on compression side), +- All required input in source buffer + +When all of the above conditions are met, PMD initiates stateless processing +and releases acquired resources after processing of current operation is +complete. Application can enqueue multiple stateless ops in a single burst +and must attach priv_xform handle to such ops. + +priv_xform in Stateless operation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +priv_xform is PMD internally managed private data that it maintains to do stateless processing. +priv_xforms are initialized provided a generic xform structure by an application via making call +to ``rte_compressdev_private_xform_create``, at an output PMD returns an opaque priv_xform reference. +If PMD support SHAREABLE priv_xform indicated via algorithm feature flag, then application can +attach same priv_xform with many stateless ops at-a-time. If not, then application needs to +create as many priv_xforms as it expects to have stateless operations in-flight. + +.. figure:: img/stateless-op.* + + Stateless Ops using Non-Shareable priv_xform + + +.. figure:: img/stateless-op-shared.* + + Stateless Ops using Shareable priv_xform + + +Application should call ``rte_compressdev_private_xform_create()`` and attach to stateless op before +enqueuing them for processing and free via ``rte_compressdev_private_xform_free()`` during termination. + +An example pseudocode to setup and process NUM_OPS stateless ops with each of length OP_LEN +using priv_xform would look like: + +.. code-block:: c + + /* + * pseudocode for stateless compression + */ + + uint8_t cdev_id = rte_compressdev_get_dev_id(<pmd name>); + + /* configure the device. */ + if (rte_compressdev_configure(cdev_id, &conf) < 0) + rte_exit(EXIT_FAILURE, "Failed to configure compressdev %u", cdev_id); + + if (rte_compressdev_queue_pair_setup(cdev_id, 0, NUM_MAX_INFLIGHT_OPS, + socket_id()) < 0) + rte_exit(EXIT_FAILURE, "Failed to setup queue pair\n"); + + if (rte_compressdev_start(cdev_id) < 0) + rte_exit(EXIT_FAILURE, "Failed to start device\n"); + + /* setup compress transform */ + struct rte_comp_xform compress_xform = { + .type = RTE_COMP_COMPRESS, + .compress = { + .algo = RTE_COMP_ALGO_DEFLATE, + .deflate = { + .huffman = RTE_COMP_HUFFMAN_DEFAULT + }, + .level = RTE_COMP_LEVEL_PMD_DEFAULT, + .chksum = RTE_COMP_CHECKSUM_NONE, + .window_size = DEFAULT_WINDOW_SIZE, + .hash_algo = RTE_COMP_HASH_ALGO_NONE + } + }; + + /* create priv_xform and initialize it for the compression device. */ + rte_compressdev_info dev_info; + void *priv_xform = NULL; + int shareable = 1; + rte_compressdev_info_get(cdev_id, &dev_info); + if (dev_info.capabilities->comp_feature_flags & RTE_COMP_FF_SHAREABLE_PRIV_XFORM) { + rte_compressdev_private_xform_create(cdev_id, &compress_xform, &priv_xform); + } else { + shareable = 0; + } + + /* create operation pool via call to rte_comp_op_pool_create and alloc ops */ + struct rte_comp_op *comp_ops[NUM_OPS]; + rte_comp_op_bulk_alloc(op_pool, comp_ops, NUM_OPS); + + /* prepare ops for compression operations */ + for (i = 0; i < NUM_OPS; i++) { + struct rte_comp_op *op = comp_ops[i]; + if (!shareable) + rte_compressdev_private_xform_create(cdev_id, &compress_xform, &op->priv_xform) + else + op->private_xform = priv_xform; + op->op_type = RTE_COMP_OP_STATELESS; + op->flush_flag = RTE_COMP_FLUSH_FINAL; + + op->src.offset = 0; + op->dst.offset = 0; + op->src.length = OP_LEN; + op->input_chksum = 0; + setup op->m_src and op->m_dst; + } + num_enqd = rte_compressdev_enqueue_burst(cdev_id, 0, comp_ops, NUM_OPS); + /* wait for this to complete before enqueuing next*/ + do { + num_deque = rte_compressdev_dequeue_burst(cdev_id, 0 , &processed_ops, NUM_OPS); + } while (num_dqud < num_enqd); + + +Stateless and OUT_OF_SPACE +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +OUT_OF_SPACE is a condition when output buffer runs out of space and where PMD +still has more data to produce. If PMD runs into such condition, then PMD returns +RTE_COMP_OP_OUT_OF_SPACE_TERMINATED error. In such case, PMD resets itself and can set +consumed=0 and produced=amount of output it could produce before hitting out_of_space. +Application would need to resubmit the whole input with a larger output buffer, if it +wants the operation to be completed. + +Hash in Stateless +~~~~~~~~~~~~~~~~~ +If hash is enabled, digest buffer will contain valid data after op is successfully +processed i.e. dequeued with status = RTE_COMP_OP_STATUS_SUCCESS. + +Checksum in Stateless +~~~~~~~~~~~~~~~~~~~~~ +If checksum is enabled, checksum will only be available after op is successfully +processed i.e. dequeued with status = RTE_COMP_OP_STATUS_SUCCESS. + +Compression API Stateful operation +----------------------------------- + +Compression API provide RTE_COMP_FF_STATEFUL_COMPRESSION and +RTE_COMP_FF_STATEFUL_DECOMPRESSION feature flag for PMD to reflect +its support for Stateful operations. + +A Stateful operation in DPDK compression means application invokes enqueue +burst() multiple times to process related chunk of data because +application broke data into several ops. + +In such case +- ops are setup with op_type RTE_COMP_OP_STATEFUL, +- all ops except last set to flush value = RTE_COMP_FLUSH_NONE/SYNC +and last set to flush value RTE_COMP_FLUSH_FULL/FINAL. + +In case of either one or all of the above conditions, PMD initiates +stateful processing and releases acquired resources after processing +operation with flush value = RTE_COMP_FLUSH_FULL/FINAL is complete. +Unlike stateless, application can enqueue only one stateful op from +a particular stream at a time and must attach stream handle +to each op. + +Stream in Stateful operation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +`stream` in DPDK compression is a logical entity which identifies related set of ops, say, a one large +file broken into multiple chunks then file is represented by a stream and each chunk of that file is +represented by compression op `rte_comp_op`. Whenever application wants a stateful processing of such +data, then it must get a stream handle via making call to ``rte_compressdev_stream_create()`` +with xform, at an output the target PMD will return an opaque stream handle to application which +it must attach to all of the ops carrying data of that stream. In stateful processing, every op +requires previous op data for compression/decompression. A PMD allocates and set up resources such +as history, states, etc. within a stream, which are maintained during the processing of the related ops. + +Unlike priv_xforms, stream is always a NON_SHAREABLE entity. One stream handle must be attached to only +one set of related ops and cannot be reused until all of them are processed with status Success or failure. + +.. figure:: img/stateful-op.* + + Stateful Ops + + +Application should call ``rte_compressdev_stream_create()`` and attach to op before +enqueuing them for processing and free via ``rte_compressdev_stream_free()`` during +termination. All ops that are to be processed statefully should carry *same* stream. + +See *DPDK API Reference* document for details. + +An example pseudocode to set up and process a stream having NUM_CHUNKS with each chunk size of CHUNK_LEN would look like: + +.. code-block:: c + + /* + * pseudocode for stateful compression + */ + + uint8_t cdev_id = rte_compressdev_get_dev_id(<pmd name>); + + /* configure the device. */ + if (rte_compressdev_configure(cdev_id, &conf) < 0) + rte_exit(EXIT_FAILURE, "Failed to configure compressdev %u", cdev_id); + + if (rte_compressdev_queue_pair_setup(cdev_id, 0, NUM_MAX_INFLIGHT_OPS, + socket_id()) < 0) + rte_exit(EXIT_FAILURE, "Failed to setup queue pair\n"); + + if (rte_compressdev_start(cdev_id) < 0) + rte_exit(EXIT_FAILURE, "Failed to start device\n"); + + /* setup compress transform. */ + struct rte_comp_xform compress_xform = { + .type = RTE_COMP_COMPRESS, + .compress = { + .algo = RTE_COMP_ALGO_DEFLATE, + .deflate = { + .huffman = RTE_COMP_HUFFMAN_DEFAULT + }, + .level = RTE_COMP_LEVEL_PMD_DEFAULT, + .chksum = RTE_COMP_CHECKSUM_NONE, + .window_size = DEFAULT_WINDOW_SIZE, + .hash_algo = RTE_COMP_HASH_ALGO_NONE + } + }; + + /* create stream */ + void *stream; + rte_compressdev_stream_create(cdev_id, &compress_xform, &stream); + + /* create an op pool and allocate ops */ + rte_comp_op_bulk_alloc(op_pool, comp_ops, NUM_CHUNKS); + + /* Prepare source and destination mbufs for compression operations */ + unsigned int i; + for (i = 0; i < NUM_CHUNKS; i++) { + if (rte_pktmbuf_append(mbufs[i], CHUNK_LEN) == NULL) + rte_exit(EXIT_FAILURE, "Not enough room in the mbuf\n"); + comp_ops[i]->m_src = mbufs[i]; + if (rte_pktmbuf_append(dst_mbufs[i], CHUNK_LEN) == NULL) + rte_exit(EXIT_FAILURE, "Not enough room in the mbuf\n"); + comp_ops[i]->m_dst = dst_mbufs[i]; + } + + /* Set up the compress operations. */ + for (i = 0; i < NUM_CHUNKS; i++) { + struct rte_comp_op *op = comp_ops[i]; + op->stream = stream; + op->m_src = src_buf[i]; + op->m_dst = dst_buf[i]; + op->op_type = RTE_COMP_OP_STATEFUL; + if (i == NUM_CHUNKS-1) { + /* set to final, if last chunk*/ + op->flush_flag = RTE_COMP_FLUSH_FINAL; + } else { + /* set to NONE, for all intermediary ops */ + op->flush_flag = RTE_COMP_FLUSH_NONE; + } + op->src.offset = 0; + op->dst.offset = 0; + op->src.length = CHUNK_LEN; + op->input_chksum = 0; + num_enqd = rte_compressdev_enqueue_burst(cdev_id, 0, &op[i], 1); + /* wait for this to complete before enqueuing next*/ + do { + num_deqd = rte_compressdev_dequeue_burst(cdev_id, 0 , &processed_ops, 1); + } while (num_deqd < num_enqd); + /* analyze the amount of consumed and produced data before pushing next op*/ + } + + +Stateful and OUT_OF_SPACE +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If PMD supports stateful operation, then OUT_OF_SPACE status is not an actual +error for the PMD. In such case, PMD returns with status +RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE with consumed = number of input bytes +read and produced = length of complete output buffer. +Application should enqueue next op with source starting at consumed+1 and an +output buffer with available space. + +Hash in Stateful +~~~~~~~~~~~~~~~~ +If enabled, digest buffer will contain valid digest after last op in stream +(having flush = RTE_COMP_FLUSH_FINAL) is successfully processed i.e. dequeued +with status = RTE_COMP_OP_STATUS_SUCCESS. + +Checksum in Stateful +~~~~~~~~~~~~~~~~~~~~ +If enabled, checksum will only be available after last op in stream +(having flush = RTE_COMP_FLUSH_FINAL) is successfully processed i.e. dequeued +with status = RTE_COMP_OP_STATUS_SUCCESS. + +Burst in compression API +------------------------- + +Scheduling of compression operations on DPDK's application data path is +performed using a burst oriented asynchronous API set. A queue pair on a compression +device accepts a burst of compression operations using enqueue burst API. On physical +devices the enqueue burst API will place the operations to be processed +on the device's hardware input queue, for virtual devices the processing of the +operations is usually completed during the enqueue call to the compression +device. The dequeue burst API will retrieve any processed operations available +from the queue pair on the compression device, from physical devices this is usually +directly from the devices processed queue, and for virtual device's from a +``rte_ring`` where processed operations are placed after being processed on the +enqueue call. + +A burst in DPDK compression can be a combination of stateless and stateful operations with a condition +that for stateful ops only one op at-a-time should be enqueued from a particular stream i.e. no-two ops +should belong to same stream in a single burst. However a burst may contain multiple stateful ops as long +as each op is attached to a different stream i.e. a burst can look like: + ++---------------+--------------+--------------+-----------------+--------------+--------------+ +| enqueue_burst | op1.no_flush | op2.no_flush | op3.flush_final | op4.no_flush | op5.no_flush | ++---------------+--------------+--------------+-----------------+--------------+--------------+ + +Where, op1 .. op5 all belong to different independent data units. op1, op2, op4, op5 must be stateful +as stateless ops can only use flush full or final and op3 can be of type stateless or stateful. +Every op with type set to RTE_COMP_OP_STATELESS must be attached to priv_xform and +Every op with type set to RTE_COMP_OP_STATEFUL *must* be attached to stream. + +Since each operation in a burst is independent and thus can be completed +out-of-order, applications which need ordering, should setup per-op user data +area with reordering information so that it can determine enqueue order at +dequeue. + +Also if multiple threads calls enqueue_burst() on same queue pair then it’s +application onus to use proper locking mechanism to ensure exclusive enqueuing +of operations. + +Enqueue / Dequeue Burst APIs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The burst enqueue API uses a compression device identifier and a queue pair +identifier to specify the compression device queue pair to schedule the processing on. +The ``nb_ops`` parameter is the number of operations to process which are +supplied in the ``ops`` array of ``rte_comp_op`` structures. +The enqueue function returns the number of operations it actually enqueued for +processing, a return value equal to ``nb_ops`` means that all packets have been +enqueued. + +The dequeue API uses the same format as the enqueue API but +the ``nb_ops`` and ``ops`` parameters are now used to specify the max processed +operations the user wishes to retrieve and the location in which to store them. +The API call returns the actual number of processed operations returned, this +can never be larger than ``nb_ops``. + +Sample code +----------- + +There are unit test applications that show how to use the compressdev library inside +app/test/test_compressdev.c + +Compression Device API +~~~~~~~~~~~~~~~~~~~~~~ + +The compressdev Library API is described in the *DPDK API Reference* document. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/cryptodev_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/cryptodev_lib.rst new file mode 100644 index 000000000..c14f750fa --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/cryptodev_lib.rst @@ -0,0 +1,1131 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2016-2020 Intel Corporation. + +Cryptography Device Library +=========================== + +The cryptodev library provides a Crypto device framework for management and +provisioning of hardware and software Crypto poll mode drivers, defining generic +APIs which support a number of different Crypto operations. The framework +currently only supports cipher, authentication, chained cipher/authentication +and AEAD symmetric and asymmetric Crypto operations. + + +Design Principles +----------------- + +The cryptodev library follows the same basic principles as those used in DPDK's +Ethernet Device framework. The Crypto framework provides a generic Crypto device +framework which supports both physical (hardware) and virtual (software) Crypto +devices as well as a generic Crypto API which allows Crypto devices to be +managed and configured and supports Crypto operations to be provisioned on +Crypto poll mode driver. + + +Device Management +----------------- + +Device Creation +~~~~~~~~~~~~~~~ + +Physical Crypto devices are discovered during the PCI probe/enumeration of the +EAL function which is executed at DPDK initialization, based on +their PCI device identifier, each unique PCI BDF (bus/bridge, device, +function). Specific physical Crypto devices, like other physical devices in DPDK +can be white-listed or black-listed using the EAL command line options. + +Virtual devices can be created by two mechanisms, either using the EAL command +line options or from within the application using an EAL API directly. + +From the command line using the --vdev EAL option + +.. code-block:: console + + --vdev 'crypto_aesni_mb0,max_nb_queue_pairs=2,socket_id=0' + +.. Note:: + + * If DPDK application requires multiple software crypto PMD devices then required + number of ``--vdev`` with appropriate libraries are to be added. + + * An Application with crypto PMD instances sharing the same library requires unique ID. + + Example: ``--vdev 'crypto_aesni_mb0' --vdev 'crypto_aesni_mb1'`` + +Or using the rte_vdev_init API within the application code. + +.. code-block:: c + + rte_vdev_init("crypto_aesni_mb", + "max_nb_queue_pairs=2,socket_id=0") + +All virtual Crypto devices support the following initialization parameters: + +* ``max_nb_queue_pairs`` - maximum number of queue pairs supported by the device. +* ``socket_id`` - socket on which to allocate the device resources on. + + +Device Identification +~~~~~~~~~~~~~~~~~~~~~ + +Each device, whether virtual or physical is uniquely designated by two +identifiers: + +- A unique device index used to designate the Crypto device in all functions + exported by the cryptodev API. + +- A device name used to designate the Crypto device in console messages, for + administration or debugging purposes. For ease of use, the port name includes + the port index. + + +Device Configuration +~~~~~~~~~~~~~~~~~~~~ + +The configuration of each Crypto device includes the following operations: + +- Allocation of resources, including hardware resources if a physical device. +- Resetting the device into a well-known default state. +- Initialization of statistics counters. + +The rte_cryptodev_configure API is used to configure a Crypto device. + +.. code-block:: c + + int rte_cryptodev_configure(uint8_t dev_id, + struct rte_cryptodev_config *config) + +The ``rte_cryptodev_config`` structure is used to pass the configuration +parameters for socket selection and number of queue pairs. + +.. code-block:: c + + struct rte_cryptodev_config { + int socket_id; + /**< Socket to allocate resources on */ + uint16_t nb_queue_pairs; + /**< Number of queue pairs to configure on device */ + }; + + +Configuration of Queue Pairs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Each Crypto devices queue pair is individually configured through the +``rte_cryptodev_queue_pair_setup`` API. +Each queue pairs resources may be allocated on a specified socket. + +.. code-block:: c + + int rte_cryptodev_queue_pair_setup(uint8_t dev_id, uint16_t queue_pair_id, + const struct rte_cryptodev_qp_conf *qp_conf, + int socket_id) + + struct rte_cryptodev_qp_conf { + uint32_t nb_descriptors; /**< Number of descriptors per queue pair */ + struct rte_mempool *mp_session; + /**< The mempool for creating session in sessionless mode */ + struct rte_mempool *mp_session_private; + /**< The mempool for creating sess private data in sessionless mode */ + }; + + +The fields ``mp_session`` and ``mp_session_private`` are used for creating +temporary session to process the crypto operations in the session-less mode. +They can be the same other different mempools. Please note not all Cryptodev +PMDs supports session-less mode. + + +Logical Cores, Memory and Queues Pair Relationships +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Crypto device Library as the Poll Mode Driver library support NUMA for when +a processor’s logical cores and interfaces utilize its local memory. Therefore +Crypto operations, and in the case of symmetric Crypto operations, the session +and the mbuf being operated on, should be allocated from memory pools created +in the local memory. The buffers should, if possible, remain on the local +processor to obtain the best performance results and buffer descriptors should +be populated with mbufs allocated from a mempool allocated from local memory. + +The run-to-completion model also performs better, especially in the case of +virtual Crypto devices, if the Crypto operation and session and data buffer is +in local memory instead of a remote processor's memory. This is also true for +the pipe-line model provided all logical cores used are located on the same +processor. + +Multiple logical cores should never share the same queue pair for enqueuing +operations or dequeuing operations on the same Crypto device since this would +require global locks and hinder performance. It is however possible to use a +different logical core to dequeue an operation on a queue pair from the logical +core which it was enqueued on. This means that a crypto burst enqueue/dequeue +APIs are a logical place to transition from one logical core to another in a +packet processing pipeline. + + +Device Features and Capabilities +--------------------------------- + +Crypto devices define their functionality through two mechanisms, global device +features and algorithm capabilities. Global devices features identify device +wide level features which are applicable to the whole device such as +the device having hardware acceleration or supporting symmetric and/or asymmetric +Crypto operations. + +The capabilities mechanism defines the individual algorithms/functions which +the device supports, such as a specific symmetric Crypto cipher, +authentication operation or Authenticated Encryption with Associated Data +(AEAD) operation. + + +Device Features +~~~~~~~~~~~~~~~ + +Currently the following Crypto device features are defined: + +* Symmetric Crypto operations +* Asymmetric Crypto operations +* Chaining of symmetric Crypto operations +* SSE accelerated SIMD vector operations +* AVX accelerated SIMD vector operations +* AVX2 accelerated SIMD vector operations +* AESNI accelerated instructions +* Hardware off-load processing + + +Device Operation Capabilities +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Crypto capabilities which identify particular algorithm which the Crypto PMD +supports are defined by the operation type, the operation transform, the +transform identifier and then the particulars of the transform. For the full +scope of the Crypto capability see the definition of the structure in the +*DPDK API Reference*. + +.. code-block:: c + + struct rte_cryptodev_capabilities; + +Each Crypto poll mode driver defines its own private array of capabilities +for the operations it supports. Below is an example of the capabilities for a +PMD which supports the authentication algorithm SHA1_HMAC and the cipher +algorithm AES_CBC. + +.. code-block:: c + + static const struct rte_cryptodev_capabilities pmd_capabilities[] = { + { /* SHA1 HMAC */ + .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, + .sym = { + .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, + .auth = { + .algo = RTE_CRYPTO_AUTH_SHA1_HMAC, + .block_size = 64, + .key_size = { + .min = 64, + .max = 64, + .increment = 0 + }, + .digest_size = { + .min = 12, + .max = 12, + .increment = 0 + }, + .aad_size = { 0 }, + .iv_size = { 0 } + } + } + }, + { /* AES CBC */ + .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, + .sym = { + .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, + .cipher = { + .algo = RTE_CRYPTO_CIPHER_AES_CBC, + .block_size = 16, + .key_size = { + .min = 16, + .max = 32, + .increment = 8 + }, + .iv_size = { + .min = 16, + .max = 16, + .increment = 0 + } + } + } + } + } + + +Capabilities Discovery +~~~~~~~~~~~~~~~~~~~~~~ + +Discovering the features and capabilities of a Crypto device poll mode driver +is achieved through the ``rte_cryptodev_info_get`` function. + +.. code-block:: c + + void rte_cryptodev_info_get(uint8_t dev_id, + struct rte_cryptodev_info *dev_info); + +This allows the user to query a specific Crypto PMD and get all the device +features and capabilities. The ``rte_cryptodev_info`` structure contains all the +relevant information for the device. + +.. code-block:: c + + struct rte_cryptodev_info { + const char *driver_name; + uint8_t driver_id; + struct rte_device *device; + + uint64_t feature_flags; + + const struct rte_cryptodev_capabilities *capabilities; + + unsigned max_nb_queue_pairs; + + struct { + unsigned max_nb_sessions; + } sym; + }; + + +Operation Processing +-------------------- + +Scheduling of Crypto operations on DPDK's application data path is +performed using a burst oriented asynchronous API set. A queue pair on a Crypto +device accepts a burst of Crypto operations using enqueue burst API. On physical +Crypto devices the enqueue burst API will place the operations to be processed +on the devices hardware input queue, for virtual devices the processing of the +Crypto operations is usually completed during the enqueue call to the Crypto +device. The dequeue burst API will retrieve any processed operations available +from the queue pair on the Crypto device, from physical devices this is usually +directly from the devices processed queue, and for virtual device's from a +``rte_ring`` where processed operations are placed after being processed on the +enqueue call. + + +Private data +~~~~~~~~~~~~ +For session-based operations, the set and get API provides a mechanism for an +application to store and retrieve the private user data information stored along +with the crypto session. + +For example, suppose an application is submitting a crypto operation with a session +associated and wants to indicate private user data information which is required to be +used after completion of the crypto operation. In this case, the application can use +the set API to set the user data and retrieve it using get API. + +.. code-block:: c + + int rte_cryptodev_sym_session_set_user_data( + struct rte_cryptodev_sym_session *sess, void *data, uint16_t size); + + void * rte_cryptodev_sym_session_get_user_data( + struct rte_cryptodev_sym_session *sess); + +Please note the ``size`` passed to set API cannot be bigger than the predefined +``user_data_sz`` when creating the session header mempool, otherwise the +function will return error. Also when ``user_data_sz`` was defined as ``0`` when +creating the session header mempool, the get API will always return ``NULL``. + +For session-less mode, the private user data information can be placed along with the +``struct rte_crypto_op``. The ``rte_crypto_op::private_data_offset`` indicates the +start of private data information. The offset is counted from the start of the +rte_crypto_op including other crypto information such as the IVs (since there can +be an IV also for authentication). + + +Enqueue / Dequeue Burst APIs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The burst enqueue API uses a Crypto device identifier and a queue pair +identifier to specify the Crypto device queue pair to schedule the processing on. +The ``nb_ops`` parameter is the number of operations to process which are +supplied in the ``ops`` array of ``rte_crypto_op`` structures. +The enqueue function returns the number of operations it actually enqueued for +processing, a return value equal to ``nb_ops`` means that all packets have been +enqueued. + +.. code-block:: c + + uint16_t rte_cryptodev_enqueue_burst(uint8_t dev_id, uint16_t qp_id, + struct rte_crypto_op **ops, uint16_t nb_ops) + +The dequeue API uses the same format as the enqueue API of processed but +the ``nb_ops`` and ``ops`` parameters are now used to specify the max processed +operations the user wishes to retrieve and the location in which to store them. +The API call returns the actual number of processed operations returned, this +can never be larger than ``nb_ops``. + +.. code-block:: c + + uint16_t rte_cryptodev_dequeue_burst(uint8_t dev_id, uint16_t qp_id, + struct rte_crypto_op **ops, uint16_t nb_ops) + + +Operation Representation +~~~~~~~~~~~~~~~~~~~~~~~~ + +An Crypto operation is represented by an rte_crypto_op structure, which is a +generic metadata container for all necessary information required for the +Crypto operation to be processed on a particular Crypto device poll mode driver. + +.. figure:: img/crypto_op.* + +The operation structure includes the operation type, the operation status +and the session type (session-based/less), a reference to the operation +specific data, which can vary in size and content depending on the operation +being provisioned. It also contains the source mempool for the operation, +if it allocated from a mempool. + +If Crypto operations are allocated from a Crypto operation mempool, see next +section, there is also the ability to allocate private memory with the +operation for applications purposes. + +Application software is responsible for specifying all the operation specific +fields in the ``rte_crypto_op`` structure which are then used by the Crypto PMD +to process the requested operation. + + +Operation Management and Allocation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The cryptodev library provides an API set for managing Crypto operations which +utilize the Mempool Library to allocate operation buffers. Therefore, it ensures +that the crypto operation is interleaved optimally across the channels and +ranks for optimal processing. +A ``rte_crypto_op`` contains a field indicating the pool that it originated from. +When calling ``rte_crypto_op_free(op)``, the operation returns to its original pool. + +.. code-block:: c + + extern struct rte_mempool * + rte_crypto_op_pool_create(const char *name, enum rte_crypto_op_type type, + unsigned nb_elts, unsigned cache_size, uint16_t priv_size, + int socket_id); + +During pool creation ``rte_crypto_op_init()`` is called as a constructor to +initialize each Crypto operation which subsequently calls +``__rte_crypto_op_reset()`` to configure any operation type specific fields based +on the type parameter. + + +``rte_crypto_op_alloc()`` and ``rte_crypto_op_bulk_alloc()`` are used to allocate +Crypto operations of a specific type from a given Crypto operation mempool. +``__rte_crypto_op_reset()`` is called on each operation before being returned to +allocate to a user so the operation is always in a good known state before use +by the application. + +.. code-block:: c + + struct rte_crypto_op *rte_crypto_op_alloc(struct rte_mempool *mempool, + enum rte_crypto_op_type type) + + unsigned rte_crypto_op_bulk_alloc(struct rte_mempool *mempool, + enum rte_crypto_op_type type, + struct rte_crypto_op **ops, uint16_t nb_ops) + +``rte_crypto_op_free()`` is called by the application to return an operation to +its allocating pool. + +.. code-block:: c + + void rte_crypto_op_free(struct rte_crypto_op *op) + + +Symmetric Cryptography Support +------------------------------ + +The cryptodev library currently provides support for the following symmetric +Crypto operations; cipher, authentication, including chaining of these +operations, as well as also supporting AEAD operations. + + +Session and Session Management +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Sessions are used in symmetric cryptographic processing to store the immutable +data defined in a cryptographic transform which is used in the operation +processing of a packet flow. Sessions are used to manage information such as +expand cipher keys and HMAC IPADs and OPADs, which need to be calculated for a +particular Crypto operation, but are immutable on a packet to packet basis for +a flow. Crypto sessions cache this immutable data in a optimal way for the +underlying PMD and this allows further acceleration of the offload of +Crypto workloads. + +.. figure:: img/cryptodev_sym_sess.* + +The Crypto device framework provides APIs to create session mempool and allocate +and initialize sessions for crypto devices, where sessions are mempool objects. +The application has to use ``rte_cryptodev_sym_session_pool_create()`` to +create the session header mempool that creates a mempool with proper element +size automatically and stores necessary information for safely accessing the +session in the mempool's private data field. + +To create a mempool for storing session private data, the application has two +options. The first is to create another mempool with elt size equal to or +bigger than the maximum session private data size of all crypto devices that +will share the same session header. The creation of the mempool shall use the +traditional ``rte_mempool_create()`` with the correct ``elt_size``. The other +option is to change the ``elt_size`` parameter in +``rte_cryptodev_sym_session_pool_create()`` to the correct value. The first +option is more complex to implement but may result in better memory usage as +a session header normally takes smaller memory footprint as the session private +data. + +Once the session mempools have been created, ``rte_cryptodev_sym_session_create()`` +is used to allocate an uninitialized session from the given mempool. +The session then must be initialized using ``rte_cryptodev_sym_session_init()`` +for each of the required crypto devices. A symmetric transform chain +is used to specify the operation and its parameters. See the section below for +details on transforms. + +When a session is no longer used, user must call ``rte_cryptodev_sym_session_clear()`` +for each of the crypto devices that are using the session, to free all driver +private session data. Once this is done, session should be freed using +``rte_cryptodev_sym_session_free`` which returns them to their mempool. + + +Transforms and Transform Chaining +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Symmetric Crypto transforms (``rte_crypto_sym_xform``) are the mechanism used +to specify the details of the Crypto operation. For chaining of symmetric +operations such as cipher encrypt and authentication generate, the next pointer +allows transform to be chained together. Crypto devices which support chaining +must publish the chaining of symmetric Crypto operations feature flag. Allocation of the +xform structure is in the application domain. To allow future API extensions in a +backwardly compatible manner, e.g. addition of a new parameter, the application should +zero the full xform struct before populating it. + +Currently there are three transforms types cipher, authentication and AEAD. +Also it is important to note that the order in which the +transforms are passed indicates the order of the chaining. + +.. code-block:: c + + struct rte_crypto_sym_xform { + struct rte_crypto_sym_xform *next; + /**< next xform in chain */ + enum rte_crypto_sym_xform_type type; + /**< xform type */ + union { + struct rte_crypto_auth_xform auth; + /**< Authentication / hash xform */ + struct rte_crypto_cipher_xform cipher; + /**< Cipher xform */ + struct rte_crypto_aead_xform aead; + /**< AEAD xform */ + }; + }; + +The API does not place a limit on the number of transforms that can be chained +together but this will be limited by the underlying Crypto device poll mode +driver which is processing the operation. + +.. figure:: img/crypto_xform_chain.* + + +Symmetric Operations +~~~~~~~~~~~~~~~~~~~~ + +The symmetric Crypto operation structure contains all the mutable data relating +to performing symmetric cryptographic processing on a referenced mbuf data +buffer. It is used for either cipher, authentication, AEAD and chained +operations. + +As a minimum the symmetric operation must have a source data buffer (``m_src``), +a valid session (or transform chain if in session-less mode) and the minimum +authentication/ cipher/ AEAD parameters required depending on the type of operation +specified in the session or the transform +chain. + +.. code-block:: c + + struct rte_crypto_sym_op { + struct rte_mbuf *m_src; + struct rte_mbuf *m_dst; + + union { + struct rte_cryptodev_sym_session *session; + /**< Handle for the initialised session context */ + struct rte_crypto_sym_xform *xform; + /**< Session-less API Crypto operation parameters */ + }; + + union { + struct { + struct { + uint32_t offset; + uint32_t length; + } data; /**< Data offsets and length for AEAD */ + + struct { + uint8_t *data; + rte_iova_t phys_addr; + } digest; /**< Digest parameters */ + + struct { + uint8_t *data; + rte_iova_t phys_addr; + } aad; + /**< Additional authentication parameters */ + } aead; + + struct { + struct { + struct { + uint32_t offset; + uint32_t length; + } data; /**< Data offsets and length for ciphering */ + } cipher; + + struct { + struct { + uint32_t offset; + uint32_t length; + } data; + /**< Data offsets and length for authentication */ + + struct { + uint8_t *data; + rte_iova_t phys_addr; + } digest; /**< Digest parameters */ + } auth; + }; + }; + }; + +Synchronous mode +---------------- + +Some cryptodevs support synchronous mode alongside with a standard asynchronous +mode. In that case operations are performed directly when calling +``rte_cryptodev_sym_cpu_crypto_process`` method instead of enqueuing and +dequeuing an operation before. This mode of operation allows cryptodevs which +utilize CPU cryptographic acceleration to have significant performance boost +comparing to standard asynchronous approach. Cryptodevs supporting synchronous +mode have ``RTE_CRYPTODEV_FF_SYM_CPU_CRYPTO`` feature flag set. + +To perform a synchronous operation a call to +``rte_cryptodev_sym_cpu_crypto_process`` has to be made with vectorized +operation descriptor (``struct rte_crypto_sym_vec``) containing: + +- ``num`` - number of operations to perform, +- pointer to an array of size ``num`` containing a scatter-gather list + descriptors of performed operations (``struct rte_crypto_sgl``). Each instance + of ``struct rte_crypto_sgl`` consists of a number of segments and a pointer to + an array of segment descriptors ``struct rte_crypto_vec``; +- pointers to arrays of size ``num`` containing IV, AAD and digest information, +- pointer to an array of size ``num`` where status information will be stored + for each operation. + +Function returns a number of successfully completed operations and sets +appropriate status number for each operation in the status array provided as +a call argument. Status different than zero must be treated as error. + +For more details, e.g. how to convert an mbuf to an SGL, please refer to an +example usage in the IPsec library implementation. + +Sample code +----------- + +There are various sample applications that show how to use the cryptodev library, +such as the L2fwd with Crypto sample application (L2fwd-crypto) and +the IPsec Security Gateway application (ipsec-secgw). + +While these applications demonstrate how an application can be created to perform +generic crypto operation, the required complexity hides the basic steps of +how to use the cryptodev APIs. + +The following sample code shows the basic steps to encrypt several buffers +with AES-CBC (although performing other crypto operations is similar), +using one of the crypto PMDs available in DPDK. + +.. code-block:: c + + /* + * Simple example to encrypt several buffers with AES-CBC using + * the Cryptodev APIs. + */ + + #define MAX_SESSIONS 1024 + #define NUM_MBUFS 1024 + #define POOL_CACHE_SIZE 128 + #define BURST_SIZE 32 + #define BUFFER_SIZE 1024 + #define AES_CBC_IV_LENGTH 16 + #define AES_CBC_KEY_LENGTH 16 + #define IV_OFFSET (sizeof(struct rte_crypto_op) + \ + sizeof(struct rte_crypto_sym_op)) + + struct rte_mempool *mbuf_pool, *crypto_op_pool; + struct rte_mempool *session_pool, *session_priv_pool; + unsigned int session_size; + int ret; + + /* Initialize EAL. */ + ret = rte_eal_init(argc, argv); + if (ret < 0) + rte_exit(EXIT_FAILURE, "Invalid EAL arguments\n"); + + uint8_t socket_id = rte_socket_id(); + + /* Create the mbuf pool. */ + mbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", + NUM_MBUFS, + POOL_CACHE_SIZE, + 0, + RTE_MBUF_DEFAULT_BUF_SIZE, + socket_id); + if (mbuf_pool == NULL) + rte_exit(EXIT_FAILURE, "Cannot create mbuf pool\n"); + + /* + * The IV is always placed after the crypto operation, + * so some private data is required to be reserved. + */ + unsigned int crypto_op_private_data = AES_CBC_IV_LENGTH; + + /* Create crypto operation pool. */ + crypto_op_pool = rte_crypto_op_pool_create("crypto_op_pool", + RTE_CRYPTO_OP_TYPE_SYMMETRIC, + NUM_MBUFS, + POOL_CACHE_SIZE, + crypto_op_private_data, + socket_id); + if (crypto_op_pool == NULL) + rte_exit(EXIT_FAILURE, "Cannot create crypto op pool\n"); + + /* Create the virtual crypto device. */ + char args[128]; + const char *crypto_name = "crypto_aesni_mb0"; + snprintf(args, sizeof(args), "socket_id=%d", socket_id); + ret = rte_vdev_init(crypto_name, args); + if (ret != 0) + rte_exit(EXIT_FAILURE, "Cannot create virtual device"); + + uint8_t cdev_id = rte_cryptodev_get_dev_id(crypto_name); + + /* Get private session data size. */ + session_size = rte_cryptodev_sym_get_private_session_size(cdev_id); + + #ifdef USE_TWO_MEMPOOLS + /* Create session mempool for the session header. */ + session_pool = rte_cryptodev_sym_session_pool_create("session_pool", + MAX_SESSIONS, + 0, + POOL_CACHE_SIZE, + 0, + socket_id); + + /* + * Create session private data mempool for the + * private session data for the crypto device. + */ + session_priv_pool = rte_mempool_create("session_pool", + MAX_SESSIONS, + session_size, + POOL_CACHE_SIZE, + 0, NULL, NULL, NULL, + NULL, socket_id, + 0); + + #else + /* Use of the same mempool for session header and private data */ + session_pool = rte_cryptodev_sym_session_pool_create("session_pool", + MAX_SESSIONS * 2, + session_size, + POOL_CACHE_SIZE, + 0, + socket_id); + + session_priv_pool = session_pool; + + #endif + + /* Configure the crypto device. */ + struct rte_cryptodev_config conf = { + .nb_queue_pairs = 1, + .socket_id = socket_id + }; + + struct rte_cryptodev_qp_conf qp_conf = { + .nb_descriptors = 2048, + .mp_session = session_pool, + .mp_session_private = session_priv_pool + }; + + if (rte_cryptodev_configure(cdev_id, &conf) < 0) + rte_exit(EXIT_FAILURE, "Failed to configure cryptodev %u", cdev_id); + + if (rte_cryptodev_queue_pair_setup(cdev_id, 0, &qp_conf, socket_id) < 0) + rte_exit(EXIT_FAILURE, "Failed to setup queue pair\n"); + + if (rte_cryptodev_start(cdev_id) < 0) + rte_exit(EXIT_FAILURE, "Failed to start device\n"); + + /* Create the crypto transform. */ + uint8_t cipher_key[16] = {0}; + struct rte_crypto_sym_xform cipher_xform = { + .next = NULL, + .type = RTE_CRYPTO_SYM_XFORM_CIPHER, + .cipher = { + .op = RTE_CRYPTO_CIPHER_OP_ENCRYPT, + .algo = RTE_CRYPTO_CIPHER_AES_CBC, + .key = { + .data = cipher_key, + .length = AES_CBC_KEY_LENGTH + }, + .iv = { + .offset = IV_OFFSET, + .length = AES_CBC_IV_LENGTH + } + } + }; + + /* Create crypto session and initialize it for the crypto device. */ + struct rte_cryptodev_sym_session *session; + session = rte_cryptodev_sym_session_create(session_pool); + if (session == NULL) + rte_exit(EXIT_FAILURE, "Session could not be created\n"); + + if (rte_cryptodev_sym_session_init(cdev_id, session, + &cipher_xform, session_priv_pool) < 0) + rte_exit(EXIT_FAILURE, "Session could not be initialized " + "for the crypto device\n"); + + /* Get a burst of crypto operations. */ + struct rte_crypto_op *crypto_ops[BURST_SIZE]; + if (rte_crypto_op_bulk_alloc(crypto_op_pool, + RTE_CRYPTO_OP_TYPE_SYMMETRIC, + crypto_ops, BURST_SIZE) == 0) + rte_exit(EXIT_FAILURE, "Not enough crypto operations available\n"); + + /* Get a burst of mbufs. */ + struct rte_mbuf *mbufs[BURST_SIZE]; + if (rte_pktmbuf_alloc_bulk(mbuf_pool, mbufs, BURST_SIZE) < 0) + rte_exit(EXIT_FAILURE, "Not enough mbufs available"); + + /* Initialize the mbufs and append them to the crypto operations. */ + unsigned int i; + for (i = 0; i < BURST_SIZE; i++) { + if (rte_pktmbuf_append(mbufs[i], BUFFER_SIZE) == NULL) + rte_exit(EXIT_FAILURE, "Not enough room in the mbuf\n"); + crypto_ops[i]->sym->m_src = mbufs[i]; + } + + /* Set up the crypto operations. */ + for (i = 0; i < BURST_SIZE; i++) { + struct rte_crypto_op *op = crypto_ops[i]; + /* Modify bytes of the IV at the end of the crypto operation */ + uint8_t *iv_ptr = rte_crypto_op_ctod_offset(op, uint8_t *, + IV_OFFSET); + + generate_random_bytes(iv_ptr, AES_CBC_IV_LENGTH); + + op->sym->cipher.data.offset = 0; + op->sym->cipher.data.length = BUFFER_SIZE; + + /* Attach the crypto session to the operation */ + rte_crypto_op_attach_sym_session(op, session); + } + + /* Enqueue the crypto operations in the crypto device. */ + uint16_t num_enqueued_ops = rte_cryptodev_enqueue_burst(cdev_id, 0, + crypto_ops, BURST_SIZE); + + /* + * Dequeue the crypto operations until all the operations + * are processed in the crypto device. + */ + uint16_t num_dequeued_ops, total_num_dequeued_ops = 0; + do { + struct rte_crypto_op *dequeued_ops[BURST_SIZE]; + num_dequeued_ops = rte_cryptodev_dequeue_burst(cdev_id, 0, + dequeued_ops, BURST_SIZE); + total_num_dequeued_ops += num_dequeued_ops; + + /* Check if operation was processed successfully */ + for (i = 0; i < num_dequeued_ops; i++) { + if (dequeued_ops[i]->status != RTE_CRYPTO_OP_STATUS_SUCCESS) + rte_exit(EXIT_FAILURE, + "Some operations were not processed correctly"); + } + + rte_mempool_put_bulk(crypto_op_pool, (void **)dequeued_ops, + num_dequeued_ops); + } while (total_num_dequeued_ops < num_enqueued_ops); + +Asymmetric Cryptography +----------------------- + +The cryptodev library currently provides support for the following asymmetric +Crypto operations; RSA, Modular exponentiation and inversion, Diffie-Hellman +public and/or private key generation and shared secret compute, DSA Signature +generation and verification. + +Session and Session Management +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Sessions are used in asymmetric cryptographic processing to store the immutable +data defined in asymmetric cryptographic transform which is further used in the +operation processing. Sessions typically stores information, such as, public +and private key information or domain params or prime modulus data i.e. immutable +across data sets. Crypto sessions cache this immutable data in a optimal way for the +underlying PMD and this allows further acceleration of the offload of Crypto workloads. + +Like symmetric, the Crypto device framework provides APIs to allocate and initialize +asymmetric sessions for crypto devices, where sessions are mempool objects. +It is the application's responsibility to create and manage the session mempools. +Application using both symmetric and asymmetric sessions should allocate and maintain +different sessions pools for each type. + +An application can use ``rte_cryptodev_get_asym_session_private_size()`` to +get the private size of asymmetric session on a given crypto device. This +function would allow an application to calculate the max device asymmetric +session size of all crypto devices to create a single session mempool. +If instead an application creates multiple asymmetric session mempools, +the Crypto device framework also provides ``rte_cryptodev_asym_get_header_session_size()`` to get +the size of an uninitialized session. + +Once the session mempools have been created, ``rte_cryptodev_asym_session_create()`` +is used to allocate an uninitialized asymmetric session from the given mempool. +The session then must be initialized using ``rte_cryptodev_asym_session_init()`` +for each of the required crypto devices. An asymmetric transform chain +is used to specify the operation and its parameters. See the section below for +details on transforms. + +When a session is no longer used, user must call ``rte_cryptodev_asym_session_clear()`` +for each of the crypto devices that are using the session, to free all driver +private asymmetric session data. Once this is done, session should be freed using +``rte_cryptodev_asym_session_free()`` which returns them to their mempool. + +Asymmetric Sessionless Support +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Asymmetric crypto framework supports session-less operations as well. + +Fields that should be set by user are: + +Member xform of struct rte_crypto_asym_op should point to the user created rte_crypto_asym_xform. +Note that rte_crypto_asym_xform should be immutable for the lifetime of associated crypto_op. + +Member sess_type of rte_crypto_op should also be set to RTE_CRYPTO_OP_SESSIONLESS. + +Transforms and Transform Chaining +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Asymmetric Crypto transforms (``rte_crypto_asym_xform``) are the mechanism used +to specify the details of the asymmetric Crypto operation. Next pointer within +xform allows transform to be chained together. Also it is important to note that +the order in which the transforms are passed indicates the order of the chaining. Allocation +of the xform structure is in the application domain. To allow future API extensions in a +backwardly compatible manner, e.g. addition of a new parameter, the application should +zero the full xform struct before populating it. + +Not all asymmetric crypto xforms are supported for chaining. Currently supported +asymmetric crypto chaining is Diffie-Hellman private key generation followed by +public generation. Also, currently API does not support chaining of symmetric and +asymmetric crypto xforms. + +Each xform defines specific asymmetric crypto algo. Currently supported are: +* RSA +* Modular operations (Exponentiation and Inverse) +* Diffie-Hellman +* DSA +* None - special case where PMD may support a passthrough mode. More for diagnostic purpose + +See *DPDK API Reference* for details on each rte_crypto_xxx_xform struct + +Asymmetric Operations +~~~~~~~~~~~~~~~~~~~~~ + +The asymmetric Crypto operation structure contains all the mutable data relating +to asymmetric cryptographic processing on an input data buffer. It uses either +RSA, Modular, Diffie-Hellman or DSA operations depending upon session it is attached +to. + +Every operation must carry a valid session handle which further carries information +on xform or xform-chain to be performed on op. Every xform type defines its own set +of operational params in their respective rte_crypto_xxx_op_param struct. Depending +on xform information within session, PMD picks up and process respective op_param +struct. +Unlike symmetric, asymmetric operations do not use mbufs for input/output. +They operate on data buffer of type ``rte_crypto_param``. + +See *DPDK API Reference* for details on each rte_crypto_xxx_op_param struct + +Asymmetric crypto Sample code +----------------------------- + +There's a unit test application test_cryptodev_asym.c inside unit test framework that +show how to setup and process asymmetric operations using cryptodev library. + +The following sample code shows the basic steps to compute modular exponentiation +using 1024-bit modulus length using openssl PMD available in DPDK (performing other +crypto operations is similar except change to respective op and xform setup). + +.. code-block:: c + + /* + * Simple example to compute modular exponentiation with 1024-bit key + * + */ + #define MAX_ASYM_SESSIONS 10 + #define NUM_ASYM_BUFS 10 + + struct rte_mempool *crypto_op_pool, *asym_session_pool; + unsigned int asym_session_size; + int ret; + + /* Initialize EAL. */ + ret = rte_eal_init(argc, argv); + if (ret < 0) + rte_exit(EXIT_FAILURE, "Invalid EAL arguments\n"); + + uint8_t socket_id = rte_socket_id(); + + /* Create crypto operation pool. */ + crypto_op_pool = rte_crypto_op_pool_create( + "crypto_op_pool", + RTE_CRYPTO_OP_TYPE_ASYMMETRIC, + NUM_ASYM_BUFS, 0, 0, + socket_id); + if (crypto_op_pool == NULL) + rte_exit(EXIT_FAILURE, "Cannot create crypto op pool\n"); + + /* Create the virtual crypto device. */ + char args[128]; + const char *crypto_name = "crypto_openssl"; + snprintf(args, sizeof(args), "socket_id=%d", socket_id); + ret = rte_vdev_init(crypto_name, args); + if (ret != 0) + rte_exit(EXIT_FAILURE, "Cannot create virtual device"); + + uint8_t cdev_id = rte_cryptodev_get_dev_id(crypto_name); + + /* Get private asym session data size. */ + asym_session_size = rte_cryptodev_get_asym_private_session_size(cdev_id); + + /* + * Create session mempool, with two objects per session, + * one for the session header and another one for the + * private asym session data for the crypto device. + */ + asym_session_pool = rte_mempool_create("asym_session_pool", + MAX_ASYM_SESSIONS * 2, + asym_session_size, + 0, + 0, NULL, NULL, NULL, + NULL, socket_id, + 0); + + /* Configure the crypto device. */ + struct rte_cryptodev_config conf = { + .nb_queue_pairs = 1, + .socket_id = socket_id + }; + struct rte_cryptodev_qp_conf qp_conf = { + .nb_descriptors = 2048 + }; + + if (rte_cryptodev_configure(cdev_id, &conf) < 0) + rte_exit(EXIT_FAILURE, "Failed to configure cryptodev %u", cdev_id); + + if (rte_cryptodev_queue_pair_setup(cdev_id, 0, &qp_conf, + socket_id, asym_session_pool) < 0) + rte_exit(EXIT_FAILURE, "Failed to setup queue pair\n"); + + if (rte_cryptodev_start(cdev_id) < 0) + rte_exit(EXIT_FAILURE, "Failed to start device\n"); + + /* Setup crypto xform to do modular exponentiation with 1024 bit + * length modulus + */ + struct rte_crypto_asym_xform modex_xform = { + .next = NULL, + .xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX, + .modex = { + .modulus = { + .data = + (uint8_t *) + ("\xb3\xa1\xaf\xb7\x13\x08\x00\x0a\x35\xdc\x2b\x20\x8d" + "\xa1\xb5\xce\x47\x8a\xc3\x80\xf4\x7d\x4a\xa2\x62\xfd\x61\x7f" + "\xb5\xa8\xde\x0a\x17\x97\xa0\xbf\xdf\x56\x5a\x3d\x51\x56\x4f" + "\x70\x70\x3f\x63\x6a\x44\x5b\xad\x84\x0d\x3f\x27\x6e\x3b\x34" + "\x91\x60\x14\xb9\xaa\x72\xfd\xa3\x64\xd2\x03\xa7\x53\x87\x9e" + "\x88\x0b\xc1\x14\x93\x1a\x62\xff\xb1\x5d\x74\xcd\x59\x63\x18" + "\x11\x3d\x4f\xba\x75\xd4\x33\x4e\x23\x6b\x7b\x57\x44\xe1\xd3" + "\x03\x13\xa6\xf0\x8b\x60\xb0\x9e\xee\x75\x08\x9d\x71\x63\x13" + "\xcb\xa6\x81\x92\x14\x03\x22\x2d\xde\x55"), + .length = 128 + }, + .exponent = { + .data = (uint8_t *)("\x01\x00\x01"), + .length = 3 + } + } + }; + /* Create asym crypto session and initialize it for the crypto device. */ + struct rte_cryptodev_asym_session *asym_session; + asym_session = rte_cryptodev_asym_session_create(asym_session_pool); + if (asym_session == NULL) + rte_exit(EXIT_FAILURE, "Session could not be created\n"); + + if (rte_cryptodev_asym_session_init(cdev_id, asym_session, + &modex_xform, asym_session_pool) < 0) + rte_exit(EXIT_FAILURE, "Session could not be initialized " + "for the crypto device\n"); + + /* Get a burst of crypto operations. */ + struct rte_crypto_op *crypto_ops[1]; + if (rte_crypto_op_bulk_alloc(crypto_op_pool, + RTE_CRYPTO_OP_TYPE_ASYMMETRIC, + crypto_ops, 1) == 0) + rte_exit(EXIT_FAILURE, "Not enough crypto operations available\n"); + + /* Set up the crypto operations. */ + struct rte_crypto_asym_op *asym_op = crypto_ops[0]->asym; + + /* calculate mod exp of value 0xf8 */ + static unsigned char base[] = {0xF8}; + asym_op->modex.base.data = base; + asym_op->modex.base.length = sizeof(base); + asym_op->modex.base.iova = base; + + /* Attach the asym crypto session to the operation */ + rte_crypto_op_attach_asym_session(op, asym_session); + + /* Enqueue the crypto operations in the crypto device. */ + uint16_t num_enqueued_ops = rte_cryptodev_enqueue_burst(cdev_id, 0, + crypto_ops, 1); + + /* + * Dequeue the crypto operations until all the operations + * are processed in the crypto device. + */ + uint16_t num_dequeued_ops, total_num_dequeued_ops = 0; + do { + struct rte_crypto_op *dequeued_ops[1]; + num_dequeued_ops = rte_cryptodev_dequeue_burst(cdev_id, 0, + dequeued_ops, 1); + total_num_dequeued_ops += num_dequeued_ops; + + /* Check if operation was processed successfully */ + if (dequeued_ops[0]->status != RTE_CRYPTO_OP_STATUS_SUCCESS) + rte_exit(EXIT_FAILURE, + "Some operations were not processed correctly"); + + } while (total_num_dequeued_ops < num_enqueued_ops); + + +Asymmetric Crypto Device API +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The cryptodev Library API is described in the +`DPDK API Reference <https://doc.dpdk.org/api/>`_ diff --git a/src/spdk/dpdk/doc/guides/prog_guide/dev_kit_build_system.rst b/src/spdk/dpdk/doc/guides/prog_guide/dev_kit_build_system.rst new file mode 100644 index 000000000..74dba4dd1 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/dev_kit_build_system.rst @@ -0,0 +1,331 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +.. _Development_Kit_Build_System: + +Development Kit Build System +============================ + +The DPDK requires a build system for compilation activities and so on. +This section describes the constraints and the mechanisms used in the DPDK framework. + +There are two use-cases for the framework: + +* Compilation of the DPDK libraries and sample applications; + the framework generates specific binary libraries, + include files and sample applications + +* Compilation of an external application or library, using an installed binary DPDK + +Building the Development Kit Binary +----------------------------------- + +The following provides details on how to build the DPDK binary. + +Build Directory Concept +~~~~~~~~~~~~~~~~~~~~~~~ + +After installation, a build directory structure is created. +Each build directory contains include files, libraries, and applications. + +A build directory is specific to a configuration that includes architecture + execution environment + toolchain. +It is possible to have several build directories sharing the same sources with different configurations. + +For instance, to create a new build directory called my_sdk_build_dir using the default configuration template config/defconfig_x86_64-linux, +we use: + +.. code-block:: console + + cd ${RTE_SDK} + make config T=x86_64-native-linux-gcc O=my_sdk_build_dir + +This creates a new my_sdk_build_dir directory. After that, we can compile by doing: + +.. code-block:: console + + cd my_sdk_build_dir + make + +which is equivalent to: + +.. code-block:: console + + make O=my_sdk_build_dir + +Refer to +:ref:`Development Kit Root Makefile Help <Development_Kit_Root_Makefile_Help>` +for details about make commands that can be used from the root of DPDK. + +Building External Applications +------------------------------ + +Since DPDK is in essence a development kit, the first objective of end users will be to create an application using this SDK. +To compile an application, the user must set the RTE_SDK and RTE_TARGET environment variables. + +.. code-block:: console + + export RTE_SDK=/opt/DPDK + export RTE_TARGET=x86_64-native-linux-gcc + cd /path/to/my_app + +For a new application, the user must create their own Makefile that includes some .mk files, such as +${RTE_SDK}/mk/rte.vars.mk, and ${RTE_SDK}/mk/ rte.app.mk. +This is described in +:ref:`Building Your Own Application <Building_Your_Own_Application>`. + +Depending on the chosen target (architecture, machine, executive environment, toolchain) defined in the Makefile or as an environment variable, +the applications and libraries will compile using the appropriate .h files and will link with the appropriate .a files. +These files are located in ${RTE_SDK}/arch-machine-execenv-toolchain, which is referenced internally by ${RTE_BIN_SDK}. + +To compile their application, the user just has to call make. +The compilation result will be located in /path/to/my_app/build directory. + +Sample applications are provided in the examples directory. + +.. _Makefile_Description: + +Makefile Description +-------------------- + +General Rules For DPDK Makefiles +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In the DPDK, Makefiles always follow the same scheme: + +#. Include $(RTE_SDK)/mk/rte.vars.mk at the beginning. + +#. Define specific variables for RTE build system. + +#. Include a specific $(RTE_SDK)/mk/rte.XYZ.mk, where XYZ can be app, lib, extapp, extlib, obj, gnuconfigure, + and so on, depending on what kind of object you want to build. + :ref:`See Makefile Types <Makefile_Types>` below. + +#. Include user-defined rules and variables. + + The following is a very simple example of an external application Makefile: + + .. code-block:: make + + include $(RTE_SDK)/mk/rte.vars.mk + + # binary name + APP = helloworld + + # all source are stored in SRCS-y + SRCS-y := main.c + + CFLAGS += -O3 + CFLAGS += $(WERROR_FLAGS) + + include $(RTE_SDK)/mk/rte.extapp.mk + +.. _Makefile_Types: + +Makefile Types +~~~~~~~~~~~~~~ + +Depending on the .mk file which is included at the end of the user Makefile, the Makefile will have a different role. +Note that it is not possible to build a library and an application in the same Makefile. +For that, the user must create two separate Makefiles, possibly in two different directories. + +In any case, the rte.vars.mk file must be included in the user Makefile as soon as possible. + +Application +^^^^^^^^^^^ + +These Makefiles generate a binary application. + +* rte.app.mk: Application in the development kit framework + +* rte.extapp.mk: External application + +* rte.hostapp.mk: prerequisite tool to build dpdk + +Library +^^^^^^^ + +Generate a .a library. + +* rte.lib.mk: Library in the development kit framework + +* rte.extlib.mk: external library + +* rte.hostlib.mk: host library in the development kit framework + +Install +^^^^^^^ + +* rte.install.mk: Does not build anything, it is only used to create links or copy files to the installation directory. + This is useful for including files in the development kit framework. + +Kernel Module +^^^^^^^^^^^^^ + +* rte.module.mk: Build a kernel module in the development kit framework. + +Objects +^^^^^^^ + +* rte.obj.mk: Object aggregation (merge several .o in one) in the development kit framework. + +* rte.extobj.mk: Object aggregation (merge several .o in one) outside the development kit framework. + +Misc +^^^^ + +* rte.gnuconfigure.mk: Build an application that is configure-based. + +* rte.subdir.mk: Build several directories in the development kit framework. + +.. _Internally_Generated_Build_Tools: + +Internally Generated Build Tools +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``app/dpdk-pmdinfogen`` + + +``dpdk-pmdinfogen`` scans an object (.o) file for various well known symbol names. +These well known symbol names are defined by various macros and used to export +important information about hardware support and usage for pmd files. For +instance the macro: + +.. code-block:: c + + RTE_PMD_REGISTER_PCI(name, drv) + +Creates the following symbol: + +.. code-block:: c + + static char this_pmd_name0[] __attribute__((used)) = "<name>"; + + +Which ``dpdk-pmdinfogen`` scans for. Using this information other relevant +bits of data can be exported from the object file and used to produce a +hardware support description, that ``dpdk-pmdinfogen`` then encodes into a +JSON formatted string in the following format: + +.. code-block:: c + + static char <name_pmd_string>="PMD_INFO_STRING=\"{'name' : '<name>', ...}\""; + + +These strings can then be searched for by external tools to determine the +hardware support of a given library or application. + + +.. _Useful_Variables_Provided_by_the_Build_System: + +Useful Variables Provided by the Build System +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* RTE_SDK: The absolute path to the DPDK sources. + When compiling the development kit, this variable is automatically set by the framework. + It has to be defined by the user as an environment variable if compiling an external application. + +* RTE_SRCDIR: The path to the root of the sources. When compiling the development kit, RTE_SRCDIR = RTE_SDK. + When compiling an external application, the variable points to the root of external application sources. + +* RTE_OUTPUT: The path to which output files are written. + Typically, it is $(RTE_SRCDIR)/build, but it can be overridden by the O= option in the make command line. + +* RTE_TARGET: A string identifying the target for which we are building. + The format is arch-machine-execenv-toolchain. + When compiling the SDK, the target is deduced by the build system from the configuration (.config). + When building an external application, it must be specified by the user in the Makefile or as an environment variable. + +* RTE_SDK_BIN: References $(RTE_SDK)/$(RTE_TARGET). + +* RTE_ARCH: Defines the architecture (i686, x86_64). + It is the same value as CONFIG_RTE_ARCH but without the double-quotes around the string. + +* RTE_MACHINE: Defines the machine. + It is the same value as CONFIG_RTE_MACHINE but without the double-quotes around the string. + +* RTE_TOOLCHAIN: Defines the toolchain (gcc , icc). + It is the same value as CONFIG_RTE_TOOLCHAIN but without the double-quotes around the string. + +* RTE_EXEC_ENV: Defines the executive environment (linux). + It is the same value as CONFIG_RTE_EXEC_ENV but without the double-quotes around the string. + +* RTE_KERNELDIR: This variable contains the absolute path to the kernel sources that will be used to compile the kernel modules. + The kernel headers must be the same as the ones that will be used on the target machine (the machine that will run the application). + By default, the variable is set to /lib/modules/$(shell uname -r)/build, + which is correct when the target machine is also the build machine. + +* RTE_DEVEL_BUILD: Stricter options (stop on warning). It defaults to y in a git tree. + +Variables that Can be Set/Overridden in a Makefile Only +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* VPATH: The path list that the build system will search for sources. By default, RTE_SRCDIR will be included in VPATH. + +* CFLAGS: Flags to use for C compilation. The user should use += to append data in this variable. + +* LDFLAGS: Flags to use for linking. The user should use += to append data in this variable. + +* ASFLAGS: Flags to use for assembly. The user should use += to append data in this variable. + +* CPPFLAGS: Flags to use to give flags to C preprocessor (only useful when assembling .S files). + The user should use += to append data in this variable. + +* LDLIBS: In an application, the list of libraries to link with (for example, -L /path/to/libfoo -lfoo ). + The user should use += to append data in this variable. + +* SRC-y: A list of source files (.c, .S, or .o if the source is a binary) in case of application, library or object Makefiles. + The sources must be available from VPATH. + +* INSTALL-y-$(INSTPATH): A list of files to be installed in $(INSTPATH). + The files must be available from VPATH and will be copied in $(RTE_OUTPUT)/$(INSTPATH). Can be used in almost any RTE Makefile. + +* SYMLINK-y-$(INSTPATH): A list of files to be installed in $(INSTPATH). + The files must be available from VPATH and will be linked (symbolically) in $(RTE_OUTPUT)/$(INSTPATH). + This variable can be used in almost any DPDK Makefile. + +* PREBUILD: A list of prerequisite actions to be taken before building. The user should use += to append data in this variable. + +* POSTBUILD: A list of actions to be taken after the main build. The user should use += to append data in this variable. + +* PREINSTALL: A list of prerequisite actions to be taken before installing. The user should use += to append data in this variable. + +* POSTINSTALL: A list of actions to be taken after installing. The user should use += to append data in this variable. + +* PRECLEAN: A list of prerequisite actions to be taken before cleaning. The user should use += to append data in this variable. + +* POSTCLEAN: A list of actions to be taken after cleaning. The user should use += to append data in this variable. + +* DEPDIRS-$(DIR): Only used in the development kit framework to specify if the build of the current directory depends on build of another one. + This is needed to support parallel builds correctly. + +Variables that can be Set/Overridden by the User on the Command Line Only +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Some variables can be used to configure the build system behavior. They are documented in +:ref:`Development Kit Root Makefile Help <Development_Kit_Root_Makefile_Help>` and +:ref:`External Application/Library Makefile Help <External_Application/Library_Makefile_Help>` + + * WERROR_CFLAGS: By default, this is set to a specific value that depends on the compiler. + Users are encouraged to use this variable as follows: + + CFLAGS += $(WERROR_CFLAGS) + +This avoids the use of different cases depending on the compiler (icc or gcc). +Also, this variable can be overridden from the command line, which allows bypassing of the flags for testing purposes. + +Variables that Can be Set/Overridden by the User in a Makefile or Command Line +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* CFLAGS_my_file.o: Specific flags to add for C compilation of my_file.c. + +* LDFLAGS_my_app: Specific flags to add when linking my_app. + +* EXTRA_CFLAGS: The content of this variable is appended after CFLAGS when compiling. + +* EXTRA_LDFLAGS: The content of this variable is appended after LDFLAGS when linking. + +* EXTRA_LDLIBS: The content of this variable is appended after LDLIBS when linking. + +* EXTRA_ASFLAGS: The content of this variable is appended after ASFLAGS when assembling. + +* EXTRA_CPPFLAGS: The content of this variable is appended after CPPFLAGS when using a C preprocessor on assembly files. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/dev_kit_root_make_help.rst b/src/spdk/dpdk/doc/guides/prog_guide/dev_kit_root_make_help.rst new file mode 100644 index 000000000..a30db7d5b --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/dev_kit_root_make_help.rst @@ -0,0 +1,188 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +.. _Development_Kit_Root_Makefile_Help: + +Development Kit Root Makefile Help +================================== + +The DPDK provides a root level Makefile with targets for configuration, building, cleaning, testing, installation and others. +These targets are explained in the following sections. + +Configuration Targets +--------------------- + +The configuration target requires the name of the target, which is specified using T=mytarget and it is mandatory. +The list of available targets are in $(RTE_SDK)/config (remove the defconfig _ prefix). + +Configuration targets also support the specification of the name of the output directory, using O=mybuilddir. +This is an optional parameter, the default output directory is build. + +* Config + + This will create a build directory, and generates a configuration from a template. + A Makefile is also created in the new build directory. + + Example: + + .. code-block:: console + + make config O=mybuild T=x86_64-native-linux-gcc + +Build Targets +------------- + +Build targets support the optional specification of the name of the output directory, using O=mybuilddir. +The default output directory is build. + +* all, build or just make + + Build the DPDK in the output directory previously created by a make config. + + Example: + + .. code-block:: console + + make O=mybuild + +* clean + + Clean all objects created using make build. + + Example: + + .. code-block:: console + + make clean O=mybuild + +* %_sub + + Build a subdirectory only, without managing dependencies on other directories. + + Example: + + .. code-block:: console + + make lib/librte_eal_sub O=mybuild + +* %_clean + + Clean a subdirectory only. + + Example: + + .. code-block:: console + + make lib/librte_eal_clean O=mybuild + +Install Targets +--------------- + +* Install + + The list of available targets are in $(RTE_SDK)/config (remove the defconfig\_ prefix). + + The GNU standards variables may be used: + http://gnu.org/prep/standards/html_node/Directory-Variables.html and + http://gnu.org/prep/standards/html_node/DESTDIR.html + + Example: + + .. code-block:: console + + make install DESTDIR=myinstall prefix=/usr + +Test Targets +------------ + +* test + + Launch automatic tests for a build directory specified using O=mybuilddir. + It is optional, the default output directory is build. + + Example: + + .. code-block:: console + + make test O=mybuild + +Documentation Targets +--------------------- + +* doc + + Generate the documentation (API and guides). + +* doc-api-html + + Generate the Doxygen API documentation in html. + +* doc-guides-html + + Generate the guides documentation in html. + +* doc-guides-pdf + + Generate the guides documentation in pdf. + +Misc Targets +------------ + +* help + + Show a quick help. + +Other Useful Command-line Variables +----------------------------------- + +The following variables can be specified on the command line: + +* V= + + Enable verbose build (show full compilation command line, and some intermediate commands). + +* D= + + Enable dependency debugging. This provides some useful information about why a target is built or not. + +* EXTRA_CFLAGS=, EXTRA_LDFLAGS=, EXTRA_LDLIBS=, EXTRA_ASFLAGS=, EXTRA_CPPFLAGS= + + Append specific compilation, link or asm flags. + +* CROSS= + + Specify a cross toolchain header that will prefix all gcc/binutils applications. This only works when using gcc. + +Make in a Build Directory +------------------------- + +All targets described above are called from the SDK root $(RTE_SDK). +It is possible to run the same Makefile targets inside the build directory. +For instance, the following command: + +.. code-block:: console + + cd $(RTE_SDK) + make config O=mybuild T=x86_64-native-linux-gcc + make O=mybuild + +is equivalent to: + +.. code-block:: console + + cd $(RTE_SDK) + make config O=mybuild T=x86_64-native-linux-gcc + cd mybuild + + # no need to specify O= now + make + +Compiling for Debug +------------------- + +To compile the DPDK and sample applications with debugging information included and the optimization level set to 0, +the EXTRA_CFLAGS environment variable should be set before compiling as follows: + +.. code-block:: console + + export EXTRA_CFLAGS='-O0 -g' diff --git a/src/spdk/dpdk/doc/guides/prog_guide/efd_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/efd_lib.rst new file mode 100644 index 000000000..2b355ff2a --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/efd_lib.rst @@ -0,0 +1,428 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2016-2017 Intel Corporation. + +.. _Efd_Library: + +Elastic Flow Distributor Library +================================ + +Introduction +------------ + +In Data Centers today, clustering and scheduling of distributed workloads +is a very common task. Many workloads require a deterministic +partitioning of a flat key space among a cluster of machines. When a +packet enters the cluster, the ingress node will direct the packet to +its handling node. For example, data-centers with disaggregated storage +use storage metadata tables to forward I/O requests to the correct back end +storage cluster, stateful packet inspection will use match incoming +flows to signatures in flow tables to send incoming packets to their +intended deep packet inspection (DPI) devices, and so on. + +EFD is a distributor library that uses perfect hashing to determine a +target/value for a given incoming flow key. It has the following +advantages: first, because it uses perfect hashing it does not store the +key itself and hence lookup performance is not dependent on the key +size. Second, the target/value can be any arbitrary value hence the +system designer and/or operator can better optimize service rates and +inter-cluster network traffic locating. Third, since the storage +requirement is much smaller than a hash-based flow table (i.e. better +fit for CPU cache), EFD can scale to millions of flow keys. Finally, +with the current optimized library implementation, performance is fully +scalable with any number of CPU cores. + +Flow Based Distribution +----------------------- + +Computation Based Schemes +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Flow distribution and/or load balancing can be simply done using a +stateless computation, for instance using round-robin or a simple +computation based on the flow key as an input. For example, a hash +function can be used to direct a certain flow to a target based on +the flow key (e.g. ``h(key) mod n``) where h(key) is the hash value of the +flow key and n is the number of possible targets. + +.. _figure_efd1: + +.. figure:: img/efd_i1.* + + Load Balancing Using Front End Node + +In this scheme (:numref:`figure_efd1`), the front end server/distributor/load balancer +extracts the flow key from the input packet and applies a computation to determine where +this flow should be directed. Intuitively, this scheme is very simple +and requires no state to be kept at the front end node, and hence, +storage requirements are minimum. + +.. _figure_efd2: + +.. figure:: img/efd_i2.* + + Consistent Hashing + +A widely used flow distributor that belongs to the same category of +computation-based schemes is ``consistent hashing``, shown in :numref:`figure_efd2`. +Target destinations (shown in red) are hashed into the same space as the flow +keys (shown in blue), and keys are mapped to the nearest target in a clockwise +fashion. Dynamically adding and removing targets with consistent hashing +requires only K/n keys to be remapped on average, where K is the number of +keys, and n is the number of targets. In contrast, in a traditional hash-based +scheme, a change in the number of targets causes nearly all keys to be +remapped. + +Although computation-based schemes are simple and need very little +storage requirement, they suffer from the drawback that the system +designer/operator can’t fully control the target to assign a specific +key, as this is dictated by the hash function. +Deterministically co-locating of keys together (for example, to minimize +inter-server traffic or to optimize for network traffic conditions, +target load, etc.) is simply not possible. + +Flow-Table Based Schemes +~~~~~~~~~~~~~~~~~~~~~~~~ + +When using a Flow-Table based scheme to handle flow distribution/load +balancing, in contrast with computation-based schemes, the system designer +has the flexibility of assigning a given flow to any given +target. The flow table (e.g. DPDK RTE Hash Library) will simply store +both the flow key and the target value. + +.. _figure_efd3: + +.. figure:: img/efd_i3.* + + Table Based Flow Distribution + +As shown in :numref:`figure_efd3`, when doing a lookup, the flow-table +is indexed with the hash of the flow key and the keys (more than one is possible, +because of hash collision) stored in this index and corresponding values +are retrieved. The retrieved key(s) is matched with the input flow key +and if there is a match the value (target id) is returned. + +The drawback of using a hash table for flow distribution/load balancing +is the storage requirement, since the flow table need to store keys, +signatures and target values. This doesn't allow this scheme to scale to +millions of flow keys. Large tables will usually not fit in +the CPU cache, and hence, the lookup performance is degraded because of +the latency to access the main memory. + +EFD Based Scheme +~~~~~~~~~~~~~~~~ + +EFD combines the advantages of both flow-table based and computation-based +schemes. It doesn't require the large storage necessary for +flow-table based schemes (because EFD doesn't store the key as explained +below), and it supports any arbitrary value for any given key. + +.. _figure_efd4: + +.. figure:: img/efd_i4.* + + Searching for Perfect Hash Function + +The basic idea of EFD is when a given key is to be inserted, a family of +hash functions is searched until the correct hash function that maps the +input key to the correct value is found, as shown in :numref:`figure_efd4`. +However, rather than explicitly storing all keys and their associated values, +EFD stores only indices of hash functions that map keys to values, and +thereby consumes much less space than conventional flow-based tables. +The lookup operation is very simple, similar to a computational-based +scheme: given an input key the lookup operation is reduced to hashing +that key with the correct hash function. + +.. _figure_efd5: + +.. figure:: img/efd_i5.* + + Divide and Conquer for Millions of Keys + +Intuitively, finding a hash function that maps each of a large number +(millions) of input keys to the correct output value is effectively +impossible, as a result EFD, as shown in :numref:`figure_efd5`, +breaks the problem into smaller pieces (divide and conquer). +EFD divides the entire input key set into many small groups. +Each group consists of approximately 20-28 keys (a configurable parameter +for the library), then, for each small group, a brute force search to find +a hash function that produces the correct outputs for each key in the group. + +It should be mentioned that, since the online lookup table for EFD +doesn't store the key itself, the size of the EFD table is independent +of the key size and hence EFD lookup performance which is almost +constant irrespective of the length of the key which is a highly +desirable feature especially for longer keys. + +In summary, EFD is a set separation data structure that supports millions of +keys. It is used to distribute a given key to an intended target. By itself +EFD is not a FIB data structure with an exact match the input flow key. + +.. _Efd_example: + +Example of EFD Library Usage +---------------------------- + +EFD can be used along the data path of many network functions and middleboxes. +As previously mentioned, it can used as an index table for +<key,value> pairs, meta-data for objects, a flow-level load balancer, etc. +:numref:`figure_efd6` shows an example of using EFD as a flow-level load +balancer, where flows are received at a front end server before being forwarded +to the target back end server for processing. The system designer would +deterministically co-locate flows together in order to minimize cross-server +interaction. +(For example, flows requesting certain webpage objects are co-located +together, to minimize forwarding of common objects across servers). + +.. _figure_efd6: + +.. figure:: img/efd_i6.* + + EFD as a Flow-Level Load Balancer + +As shown in :numref:`figure_efd6`, the front end server will have an EFD table that +stores for each group what is the perfect hash index that satisfies the +correct output. Because the table size is small and fits in cache (since +keys are not stored), it sustains a large number of flows (N*X, where N +is the maximum number of flows served by each back end server of the X +possible targets). + +With an input flow key, the group id is computed (for example, using +last few bits of CRC hash) and then the EFD table is indexed with the +group id to retrieve the corresponding hash index to use. Once the index +is retrieved the key is hashed using this hash function and the result +will be the intended correct target where this flow is supposed to be +processed. + +It should be noted that as a result of EFD not matching the exact key but +rather distributing the flows to a target back end node based on the +perfect hash index, a key that has not been inserted before +will be distributed to a valid target. Hence, a local table which stores +the flows served at each node is used and is +exact matched with the input key to rule out new never seen before +flows. + +.. _Efd_api: + +Library API Overview +-------------------- + +The EFD library API is created with a very similar semantics of a +hash-index or a flow table. The application creates an EFD table for a +given maximum number of flows, a function is called to insert a flow key +with a specific target value, and another function is used to retrieve +target values for a given individual flow key or a bulk of keys. + +EFD Table Create +~~~~~~~~~~~~~~~~ + +The function ``rte_efd_create()`` is used to create and return a pointer +to an EFD table that is sized to hold up to num_flows key. +The online version of the EFD table (the one that does +not store the keys and is used for lookups) will be allocated and +created in the last level cache (LLC) of the socket defined by the +online_socket_bitmask, while the offline EFD table (the one that +stores the keys and is used for key inserts and for computing the +perfect hashing) is allocated and created in the LLC of the socket +defined by offline_socket_bitmask. It should be noted, that for +highest performance the socket id should match that where the thread is +running, i.e. the online EFD lookup table should be created on the same +socket as where the lookup thread is running. + +EFD Insert and Update +~~~~~~~~~~~~~~~~~~~~~ + +The EFD function to insert a key or update a key to a new value is +``rte_efd_update()``. This function will update an existing key to +a new value (target) if the key has already been inserted +before, or will insert the <key,value> pair if this key has not been inserted +before. It will return 0 upon success. It will return +``EFD_UPDATE_WARN_GROUP_FULL (1)`` if the operation is insert, and the +last available space in the key's group was just used. It will return +``EFD_UPDATE_FAILED (2)`` when the insertion or update has failed (either it +failed to find a suitable perfect hash or the group was full). The function +will return ``EFD_UPDATE_NO_CHANGE (3)`` if there is no change to the EFD +table (i.e, same value already exists). + +.. Note:: + + This function is not multi-thread safe and should only be called + from one thread. + +EFD Lookup +~~~~~~~~~~ + +To lookup a certain key in an EFD table, the function ``rte_efd_lookup()`` +is used to return the value associated with single key. +As previously mentioned, if the key has been inserted, the correct value +inserted is returned, if the key has not been inserted before, +a ‘random’ value (based on hashing of the key) is returned. +For better performance and to decrease the overhead of +function calls per key, it is always recommended to use a bulk lookup +function (simultaneous lookup of multiple keys) instead of a single key +lookup function. ``rte_efd_lookup_bulk()`` is the bulk lookup function, +that looks up num_keys simultaneously stored in the key_list and the +corresponding return values will be returned in the value_list. + +.. Note:: + + This function is multi-thread safe, but there should not be other threads + writing in the EFD table, unless locks are used. + +EFD Delete +~~~~~~~~~~ + +To delete a certain key in an EFD table, the function +``rte_efd_delete()`` can be used. The function returns zero upon success +when the key has been found and deleted. Socket_id is the parameter to +use to lookup the existing value, which is ideally the caller's socket id. +The previous value associated with this key will be returned +in the prev_value argument. + +.. Note:: + + This function is not multi-thread safe and should only be called + from one thread. + +.. _Efd_internals: + +Library Internals +----------------- + +This section provides the brief high-level idea and an overview +of the library internals to accompany the RFC. The intent of this +section is to explain to readers the high-level implementation of +insert, lookup and group rebalancing in the EFD library. + +Insert Function Internals +~~~~~~~~~~~~~~~~~~~~~~~~~ + +As previously mentioned the EFD divides the whole set of keys into +groups of a manageable size (e.g. 28 keys) and then searches for the +perfect hash that satisfies the intended target value for each key. EFD +stores two version of the <key,value> table: + +- Offline Version (in memory): Only used for the insertion/update + operation, which is less frequent than the lookup operation. In the + offline version the exact keys for each group is stored. When a new + key is added, the hash function is updated that will satisfy the + value for the new key together with the all old keys already inserted + in this group. + +- Online Version (in cache): Used for the frequent lookup operation. In + the online version, as previously mentioned, the keys are not stored + but rather only the hash index for each group. + +.. _figure_efd7: + +.. figure:: img/efd_i7.* + + Group Assignment + +:numref:`figure_efd7` depicts the group assignment for 7 flow keys as an example. +Given a flow key, a hash function (in our implementation CRC hash) is +used to get the group id. As shown in the figure, the groups can be +unbalanced. (We highlight group rebalancing further below). + +.. _figure_efd8: + +.. figure:: img/efd_i8.* + + Perfect Hash Search - Assigned Keys & Target Value + +Focusing on one group that has four keys, :numref:`figure_efd8` depicts the search +algorithm to find the perfect hash function. Assuming that the target +value bit for the keys is as shown in the figure, then the online EFD +table will store a 16 bit hash index and 16 bit lookup table per group +per value bit. + +.. _figure_efd9: + +.. figure:: img/efd_i9.* + + Perfect Hash Search - Satisfy Target Values + +For a given keyX, a hash function ``(h(keyX, seed1) + index * h(keyX, seed2))`` +is used to point to certain bit index in the 16bit lookup_table value, +as shown in :numref:`figure_efd9`. +The insert function will brute force search for all possible values for the +hash index until a non conflicting lookup_table is found. + +.. _figure_efd10: + +.. figure:: img/efd_i10.* + + Finding Hash Index for Conflict Free lookup_table + +For example, since both key3 and key7 have a target bit value of 1, it +is okay if the hash function of both keys point to the same bit in the +lookup table. A conflict will occur if a hash index is used that maps +both Key4 and Key7 to the same index in the lookup_table, +as shown in :numref:`figure_efd10`, since their target value bit are not the same. +Once a hash index is found that produces a lookup_table with no +contradictions, this index is stored for this group. This procedure is +repeated for each bit of target value. + +Lookup Function Internals +~~~~~~~~~~~~~~~~~~~~~~~~~ + +The design principle of EFD is that lookups are much more frequent than +inserts, and hence, EFD's design optimizes for the lookups which are +faster and much simpler than the slower insert procedure (inserts are +slow, because of perfect hash search as previously discussed). + +.. _figure_efd11: + +.. figure:: img/efd_i11.* + + EFD Lookup Operation + +:numref:`figure_efd11` depicts the lookup operation for EFD. Given an input key, +the group id is computed (using CRC hash) and then the hash index for this +group is retrieved from the EFD table. Using the retrieved hash index, +the hash function ``h(key, seed1) + index *h(key, seed2)`` is used which will +result in an index in the lookup_table, the bit corresponding to this +index will be the target value bit. This procedure is repeated for each +bit of the target value. + +Group Rebalancing Function Internals +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When discussing EFD inserts and lookups, the discussion is simplified by +assuming that a group id is simply a result of hash function. However, +since hashing in general is not perfect and will not always produce a +uniform output, this simplified assumption will lead to unbalanced +groups, i.e., some group will have more keys than other groups. +Typically, and to minimize insert time with an increasing number of keys, +it is preferable that all groups will have a balanced number of keys, so +the brute force search for the perfect hash terminates with a valid hash +index. In order to achieve this target, groups are rebalanced during +runtime inserts, and keys are moved around from a busy group to a less +crowded group as the more keys are inserted. + +.. _figure_efd12: + +.. figure:: img/efd_i12.* + + Runtime Group Rebalancing + +:numref:`figure_efd12` depicts the high level idea of group rebalancing, given an +input key the hash result is split into two parts a chunk id and 8-bit +bin id. A chunk contains 64 different groups and 256 bins (i.e. for any +given bin it can map to 4 distinct groups). When a key is inserted, the +bin id is computed, for example in :numref:`figure_efd12` bin_id=2, +and since each bin can be mapped to one of four different groups (2 bit storage), +the four possible mappings are evaluated and the one that will result in a +balanced key distribution across these four is selected the mapping result +is stored in these two bits. + + +.. _Efd_references: + +References +----------- + +1- EFD is based on collaborative research work between Intel and +Carnegie Mellon University (CMU), interested readers can refer to the paper +"Scaling Up Clustered Network Appliances with ScaleBricks" Dong Zhou et al. +at SIGCOMM 2015 (`http://conferences.sigcomm.org/sigcomm/2015/pdf/papers/p241.pdf`) +for more information. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/env_abstraction_layer.rst b/src/spdk/dpdk/doc/guides/prog_guide/env_abstraction_layer.rst new file mode 100644 index 000000000..48a2fec06 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/env_abstraction_layer.rst @@ -0,0 +1,954 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +.. _Environment_Abstraction_Layer: + +Environment Abstraction Layer +============================= + +The Environment Abstraction Layer (EAL) is responsible for gaining access to low-level resources such as hardware and memory space. +It provides a generic interface that hides the environment specifics from the applications and libraries. +It is the responsibility of the initialization routine to decide how to allocate these resources +(that is, memory space, devices, timers, consoles, and so on). + +Typical services expected from the EAL are: + +* DPDK Loading and Launching: + The DPDK and its application are linked as a single application and must be loaded by some means. + +* Core Affinity/Assignment Procedures: + The EAL provides mechanisms for assigning execution units to specific cores as well as creating execution instances. + +* System Memory Reservation: + The EAL facilitates the reservation of different memory zones, for example, physical memory areas for device interactions. + +* Trace and Debug Functions: Logs, dump_stack, panic and so on. + +* Utility Functions: Spinlocks and atomic counters that are not provided in libc. + +* CPU Feature Identification: Determine at runtime if a particular feature, for example, Intel® AVX is supported. + Determine if the current CPU supports the feature set that the binary was compiled for. + +* Interrupt Handling: Interfaces to register/unregister callbacks to specific interrupt sources. + +* Alarm Functions: Interfaces to set/remove callbacks to be run at a specific time. + +EAL in a Linux-userland Execution Environment +--------------------------------------------- + +In a Linux user space environment, the DPDK application runs as a user-space application using the pthread library. + +The EAL performs physical memory allocation using mmap() in hugetlbfs (using huge page sizes to increase performance). +This memory is exposed to DPDK service layers such as the :ref:`Mempool Library <Mempool_Library>`. + +At this point, the DPDK services layer will be initialized, then through pthread setaffinity calls, +each execution unit will be assigned to a specific logical core to run as a user-level thread. + +The time reference is provided by the CPU Time-Stamp Counter (TSC) or by the HPET kernel API through a mmap() call. + +Initialization and Core Launching +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Part of the initialization is done by the start function of glibc. +A check is also performed at initialization time to ensure that the micro architecture type chosen in the config file is supported by the CPU. +Then, the main() function is called. The core initialization and launch is done in rte_eal_init() (see the API documentation). +It consist of calls to the pthread library (more specifically, pthread_self(), pthread_create(), and pthread_setaffinity_np()). + +.. _figure_linux_launch: + +.. figure:: img/linuxapp_launch.* + + EAL Initialization in a Linux Application Environment + + +.. note:: + + Initialization of objects, such as memory zones, rings, memory pools, lpm tables and hash tables, + should be done as part of the overall application initialization on the master lcore. + The creation and initialization functions for these objects are not multi-thread safe. + However, once initialized, the objects themselves can safely be used in multiple threads simultaneously. + +Shutdown and Cleanup +~~~~~~~~~~~~~~~~~~~~ + +During the initialization of EAL resources such as hugepage backed memory can be +allocated by core components. The memory allocated during ``rte_eal_init()`` +can be released by calling the ``rte_eal_cleanup()`` function. Refer to the +API documentation for details. + +Multi-process Support +~~~~~~~~~~~~~~~~~~~~~ + +The Linux EAL allows a multi-process as well as a multi-threaded (pthread) deployment model. +See chapter +:ref:`Multi-process Support <Multi-process_Support>` for more details. + +Memory Mapping Discovery and Memory Reservation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The allocation of large contiguous physical memory is done using the hugetlbfs kernel filesystem. +The EAL provides an API to reserve named memory zones in this contiguous memory. +The physical address of the reserved memory for that memory zone is also returned to the user by the memory zone reservation API. + +There are two modes in which DPDK memory subsystem can operate: dynamic mode, +and legacy mode. Both modes are explained below. + +.. note:: + + Memory reservations done using the APIs provided by rte_malloc are also backed by pages from the hugetlbfs filesystem. + ++ Dynamic memory mode + +Currently, this mode is only supported on Linux. + +In this mode, usage of hugepages by DPDK application will grow and shrink based +on application's requests. Any memory allocation through ``rte_malloc()``, +``rte_memzone_reserve()`` or other methods, can potentially result in more +hugepages being reserved from the system. Similarly, any memory deallocation can +potentially result in hugepages being released back to the system. + +Memory allocated in this mode is not guaranteed to be IOVA-contiguous. If large +chunks of IOVA-contiguous are required (with "large" defined as "more than one +page"), it is recommended to either use VFIO driver for all physical devices (so +that IOVA and VA addresses can be the same, thereby bypassing physical addresses +entirely), or use legacy memory mode. + +For chunks of memory which must be IOVA-contiguous, it is recommended to use +``rte_memzone_reserve()`` function with ``RTE_MEMZONE_IOVA_CONTIG`` flag +specified. This way, memory allocator will ensure that, whatever memory mode is +in use, either reserved memory will satisfy the requirements, or the allocation +will fail. + +There is no need to preallocate any memory at startup using ``-m`` or +``--socket-mem`` command-line parameters, however it is still possible to do so, +in which case preallocate memory will be "pinned" (i.e. will never be released +by the application back to the system). It will be possible to allocate more +hugepages, and deallocate those, but any preallocated pages will not be freed. +If neither ``-m`` nor ``--socket-mem`` were specified, no memory will be +preallocated, and all memory will be allocated at runtime, as needed. + +Another available option to use in dynamic memory mode is +``--single-file-segments`` command-line option. This option will put pages in +single files (per memseg list), as opposed to creating a file per page. This is +normally not needed, but can be useful for use cases like userspace vhost, where +there is limited number of page file descriptors that can be passed to VirtIO. + +If the application (or DPDK-internal code, such as device drivers) wishes to +receive notifications about newly allocated memory, it is possible to register +for memory event callbacks via ``rte_mem_event_callback_register()`` function. +This will call a callback function any time DPDK's memory map has changed. + +If the application (or DPDK-internal code, such as device drivers) wishes to be +notified about memory allocations above specified threshold (and have a chance +to deny them), allocation validator callbacks are also available via +``rte_mem_alloc_validator_callback_register()`` function. + +A default validator callback is provided by EAL, which can be enabled with a +``--socket-limit`` command-line option, for a simple way to limit maximum amount +of memory that can be used by DPDK application. + +.. warning:: + Memory subsystem uses DPDK IPC internally, so memory allocations/callbacks + and IPC must not be mixed: it is not safe to allocate/free memory inside + memory-related or IPC callbacks, and it is not safe to use IPC inside + memory-related callbacks. See chapter + :ref:`Multi-process Support <Multi-process_Support>` for more details about + DPDK IPC. + ++ Legacy memory mode + +This mode is enabled by specifying ``--legacy-mem`` command-line switch to the +EAL. This switch will have no effect on FreeBSD as FreeBSD only supports +legacy mode anyway. + +This mode mimics historical behavior of EAL. That is, EAL will reserve all +memory at startup, sort all memory into large IOVA-contiguous chunks, and will +not allow acquiring or releasing hugepages from the system at runtime. + +If neither ``-m`` nor ``--socket-mem`` were specified, the entire available +hugepage memory will be preallocated. + ++ Hugepage allocation matching + +This behavior is enabled by specifying the ``--match-allocations`` command-line +switch to the EAL. This switch is Linux-only and not supported with +``--legacy-mem`` nor ``--no-huge``. + +Some applications using memory event callbacks may require that hugepages be +freed exactly as they were allocated. These applications may also require +that any allocation from the malloc heap not span across allocations +associated with two different memory event callbacks. Hugepage allocation +matching can be used by these types of applications to satisfy both of these +requirements. This can result in some increased memory usage which is +very dependent on the memory allocation patterns of the application. + ++ 32-bit support + +Additional restrictions are present when running in 32-bit mode. In dynamic +memory mode, by default maximum of 2 gigabytes of VA space will be preallocated, +and all of it will be on master lcore NUMA node unless ``--socket-mem`` flag is +used. + +In legacy mode, VA space will only be preallocated for segments that were +requested (plus padding, to keep IOVA-contiguousness). + ++ Maximum amount of memory + +All possible virtual memory space that can ever be used for hugepage mapping in +a DPDK process is preallocated at startup, thereby placing an upper limit on how +much memory a DPDK application can have. DPDK memory is stored in segment lists, +each segment is strictly one physical page. It is possible to change the amount +of virtual memory being preallocated at startup by editing the following config +variables: + +* ``CONFIG_RTE_MAX_MEMSEG_LISTS`` controls how many segment lists can DPDK have +* ``CONFIG_RTE_MAX_MEM_MB_PER_LIST`` controls how much megabytes of memory each + segment list can address +* ``CONFIG_RTE_MAX_MEMSEG_PER_LIST`` controls how many segments each segment can + have +* ``CONFIG_RTE_MAX_MEMSEG_PER_TYPE`` controls how many segments each memory type + can have (where "type" is defined as "page size + NUMA node" combination) +* ``CONFIG_RTE_MAX_MEM_MB_PER_TYPE`` controls how much megabytes of memory each + memory type can address +* ``CONFIG_RTE_MAX_MEM_MB`` places a global maximum on the amount of memory + DPDK can reserve + +Normally, these options do not need to be changed. + +.. note:: + + Preallocated virtual memory is not to be confused with preallocated hugepage + memory! All DPDK processes preallocate virtual memory at startup. Hugepages + can later be mapped into that preallocated VA space (if dynamic memory mode + is enabled), and can optionally be mapped into it at startup. + ++ Segment file descriptors + +On Linux, in most cases, EAL will store segment file descriptors in EAL. This +can become a problem when using smaller page sizes due to underlying limitations +of ``glibc`` library. For example, Linux API calls such as ``select()`` may not +work correctly because ``glibc`` does not support more than certain number of +file descriptors. + +There are two possible solutions for this problem. The recommended solution is +to use ``--single-file-segments`` mode, as that mode will not use a file +descriptor per each page, and it will keep compatibility with Virtio with +vhost-user backend. This option is not available when using ``--legacy-mem`` +mode. + +Another option is to use bigger page sizes. Since fewer pages are required to +cover the same memory area, fewer file descriptors will be stored internally +by EAL. + +Support for Externally Allocated Memory +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It is possible to use externally allocated memory in DPDK. There are two ways in +which using externally allocated memory can work: the malloc heap API's, and +manual memory management. + ++ Using heap API's for externally allocated memory + +Using a set of malloc heap API's is the recommended way to use externally +allocated memory in DPDK. In this way, support for externally allocated memory +is implemented through overloading the socket ID - externally allocated heaps +will have socket ID's that would be considered invalid under normal +circumstances. Requesting an allocation to take place from a specified +externally allocated memory is a matter of supplying the correct socket ID to +DPDK allocator, either directly (e.g. through a call to ``rte_malloc``) or +indirectly (through data structure-specific allocation API's such as +``rte_ring_create``). Using these API's also ensures that mapping of externally +allocated memory for DMA is also performed on any memory segment that is added +to a DPDK malloc heap. + +Since there is no way DPDK can verify whether memory is available or valid, this +responsibility falls on the shoulders of the user. All multiprocess +synchronization is also user's responsibility, as well as ensuring that all +calls to add/attach/detach/remove memory are done in the correct order. It is +not required to attach to a memory area in all processes - only attach to memory +areas as needed. + +The expected workflow is as follows: + +* Get a pointer to memory area +* Create a named heap +* Add memory area(s) to the heap + - If IOVA table is not specified, IOVA addresses will be assumed to be + unavailable, and DMA mappings will not be performed + - Other processes must attach to the memory area before they can use it +* Get socket ID used for the heap +* Use normal DPDK allocation procedures, using supplied socket ID +* If memory area is no longer needed, it can be removed from the heap + - Other processes must detach from this memory area before it can be removed +* If heap is no longer needed, remove it + - Socket ID will become invalid and will not be reused + +For more information, please refer to ``rte_malloc`` API documentation, +specifically the ``rte_malloc_heap_*`` family of function calls. + ++ Using externally allocated memory without DPDK API's + +While using heap API's is the recommended method of using externally allocated +memory in DPDK, there are certain use cases where the overhead of DPDK heap API +is undesirable - for example, when manual memory management is performed on an +externally allocated area. To support use cases where externally allocated +memory will not be used as part of normal DPDK workflow, there is also another +set of API's under the ``rte_extmem_*`` namespace. + +These API's are (as their name implies) intended to allow registering or +unregistering externally allocated memory to/from DPDK's internal page table, to +allow API's like ``rte_mem_virt2memseg`` etc. to work with externally allocated +memory. Memory added this way will not be available for any regular DPDK +allocators; DPDK will leave this memory for the user application to manage. + +The expected workflow is as follows: + +* Get a pointer to memory area +* Register memory within DPDK + - If IOVA table is not specified, IOVA addresses will be assumed to be + unavailable + - Other processes must attach to the memory area before they can use it +* Perform DMA mapping with ``rte_dev_dma_map`` if needed +* Use the memory area in your application +* If memory area is no longer needed, it can be unregistered + - If the area was mapped for DMA, unmapping must be performed before + unregistering memory + - Other processes must detach from the memory area before it can be + unregistered + +Since these externally allocated memory areas will not be managed by DPDK, it is +therefore up to the user application to decide how to use them and what to do +with them once they're registered. + +Per-lcore and Shared Variables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. note:: + + lcore refers to a logical execution unit of the processor, sometimes called a hardware *thread*. + +Shared variables are the default behavior. +Per-lcore variables are implemented using *Thread Local Storage* (TLS) to provide per-thread local storage. + +Logs +~~~~ + +A logging API is provided by EAL. +By default, in a Linux application, logs are sent to syslog and also to the console. +However, the log function can be overridden by the user to use a different logging mechanism. + +Trace and Debug Functions +^^^^^^^^^^^^^^^^^^^^^^^^^ + +There are some debug functions to dump the stack in glibc. +The rte_panic() function can voluntarily provoke a SIG_ABORT, +which can trigger the generation of a core file, readable by gdb. + +CPU Feature Identification +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The EAL can query the CPU at runtime (using the rte_cpu_get_features() function) to determine which CPU features are available. + +User Space Interrupt Event +~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++ User Space Interrupt and Alarm Handling in Host Thread + +The EAL creates a host thread to poll the UIO device file descriptors to detect the interrupts. +Callbacks can be registered or unregistered by the EAL functions for a specific interrupt event +and are called in the host thread asynchronously. +The EAL also allows timed callbacks to be used in the same way as for NIC interrupts. + +.. note:: + + In DPDK PMD, the only interrupts handled by the dedicated host thread are those for link status change + (link up and link down notification) and for sudden device removal. + + ++ RX Interrupt Event + +The receive and transmit routines provided by each PMD don't limit themselves to execute in polling thread mode. +To ease the idle polling with tiny throughput, it's useful to pause the polling and wait until the wake-up event happens. +The RX interrupt is the first choice to be such kind of wake-up event, but probably won't be the only one. + +EAL provides the event APIs for this event-driven thread mode. +Taking Linux as an example, the implementation relies on epoll. Each thread can monitor an epoll instance +in which all the wake-up events' file descriptors are added. The event file descriptors are created and mapped to +the interrupt vectors according to the UIO/VFIO spec. +From FreeBSD's perspective, kqueue is the alternative way, but not implemented yet. + +EAL initializes the mapping between event file descriptors and interrupt vectors, while each device initializes the mapping +between interrupt vectors and queues. In this way, EAL actually is unaware of the interrupt cause on the specific vector. +The eth_dev driver takes responsibility to program the latter mapping. + +.. note:: + + Per queue RX interrupt event is only allowed in VFIO which supports multiple MSI-X vector. In UIO, the RX interrupt + together with other interrupt causes shares the same vector. In this case, when RX interrupt and LSC(link status change) + interrupt are both enabled(intr_conf.lsc == 1 && intr_conf.rxq == 1), only the former is capable. + +The RX interrupt are controlled/enabled/disabled by ethdev APIs - 'rte_eth_dev_rx_intr_*'. They return failure if the PMD +hasn't support them yet. The intr_conf.rxq flag is used to turn on the capability of RX interrupt per device. + ++ Device Removal Event + +This event is triggered by a device being removed at a bus level. Its +underlying resources may have been made unavailable (i.e. PCI mappings +unmapped). The PMD must make sure that on such occurrence, the application can +still safely use its callbacks. + +This event can be subscribed to in the same way one would subscribe to a link +status change event. The execution context is thus the same, i.e. it is the +dedicated interrupt host thread. + +Considering this, it is likely that an application would want to close a +device having emitted a Device Removal Event. In such case, calling +``rte_eth_dev_close()`` can trigger it to unregister its own Device Removal Event +callback. Care must be taken not to close the device from the interrupt handler +context. It is necessary to reschedule such closing operation. + +Blacklisting +~~~~~~~~~~~~ + +The EAL PCI device blacklist functionality can be used to mark certain NIC ports as blacklisted, +so they are ignored by the DPDK. +The ports to be blacklisted are identified using the PCIe* description (Domain:Bus:Device.Function). + +Misc Functions +~~~~~~~~~~~~~~ + +Locks and atomic operations are per-architecture (i686 and x86_64). + +IOVA Mode Detection +~~~~~~~~~~~~~~~~~~~ + +IOVA Mode is selected by considering what the current usable Devices on the +system require and/or support. + +On FreeBSD, RTE_IOVA_PA is always the default. On Linux, the IOVA mode is +detected based on a 2-step heuristic detailed below. + +For the first step, EAL asks each bus its requirement in terms of IOVA mode +and decides on a preferred IOVA mode. + +- if all buses report RTE_IOVA_PA, then the preferred IOVA mode is RTE_IOVA_PA, +- if all buses report RTE_IOVA_VA, then the preferred IOVA mode is RTE_IOVA_VA, +- if all buses report RTE_IOVA_DC, no bus expressed a preferrence, then the + preferred mode is RTE_IOVA_DC, +- if the buses disagree (at least one wants RTE_IOVA_PA and at least one wants + RTE_IOVA_VA), then the preferred IOVA mode is RTE_IOVA_DC (see below with the + check on Physical Addresses availability), + +If the buses have expressed no preference on which IOVA mode to pick, then a +default is selected using the following logic: + +- if physical addresses are not available, RTE_IOVA_VA mode is used +- if /sys/kernel/iommu_groups is not empty, RTE_IOVA_VA mode is used +- otherwise, RTE_IOVA_PA mode is used + +In the case when the buses had disagreed on their preferred IOVA mode, part of +the buses won't work because of this decision. + +The second step checks if the preferred mode complies with the Physical +Addresses availability since those are only available to root user in recent +kernels. Namely, if the preferred mode is RTE_IOVA_PA but there is no access to +Physical Addresses, then EAL init fails early, since later probing of the +devices would fail anyway. + +.. note:: + + The RTE_IOVA_VA mode is preferred as the default in most cases for the + following reasons: + + - All drivers are expected to work in RTE_IOVA_VA mode, irrespective of + physical address availability. + - By default, the mempool, first asks for IOVA-contiguous memory using + ``RTE_MEMZONE_IOVA_CONTIG``. This is slow in RTE_IOVA_PA mode and it may + affect the application boot time. + - It is easy to enable large amount of IOVA-contiguous memory use-cases + with IOVA in VA mode. + + It is expected that all PCI drivers work in both RTE_IOVA_PA and + RTE_IOVA_VA modes. + + If a PCI driver does not support RTE_IOVA_PA mode, the + ``RTE_PCI_DRV_NEED_IOVA_AS_VA`` flag is used to dictate that this PCI + driver can only work in RTE_IOVA_VA mode. + + When the KNI kernel module is detected, RTE_IOVA_PA mode is preferred as a + performance penalty is expected in RTE_IOVA_VA mode. + +IOVA Mode Configuration +~~~~~~~~~~~~~~~~~~~~~~~ + +Auto detection of the IOVA mode, based on probing the bus and IOMMU configuration, may not report +the desired addressing mode when virtual devices that are not directly attached to the bus are present. +To facilitate forcing the IOVA mode to a specific value the EAL command line option ``--iova-mode`` can +be used to select either physical addressing('pa') or virtual addressing('va'). + +Memory Segments and Memory Zones (memzone) +------------------------------------------ + +The mapping of physical memory is provided by this feature in the EAL. +As physical memory can have gaps, the memory is described in a table of descriptors, +and each descriptor (called rte_memseg ) describes a physical page. + +On top of this, the memzone allocator's role is to reserve contiguous portions of physical memory. +These zones are identified by a unique name when the memory is reserved. + +The rte_memzone descriptors are also located in the configuration structure. +This structure is accessed using rte_eal_get_configuration(). +The lookup (by name) of a memory zone returns a descriptor containing the physical address of the memory zone. + +Memory zones can be reserved with specific start address alignment by supplying the align parameter +(by default, they are aligned to cache line size). +The alignment value should be a power of two and not less than the cache line size (64 bytes). +Memory zones can also be reserved from either 2 MB or 1 GB hugepages, provided that both are available on the system. + +Both memsegs and memzones are stored using ``rte_fbarray`` structures. Please +refer to *DPDK API Reference* for more information. + + +Multiple pthread +---------------- + +DPDK usually pins one pthread per core to avoid the overhead of task switching. +This allows for significant performance gains, but lacks flexibility and is not always efficient. + +Power management helps to improve the CPU efficiency by limiting the CPU runtime frequency. +However, alternately it is possible to utilize the idle cycles available to take advantage of +the full capability of the CPU. + +By taking advantage of cgroup, the CPU utilization quota can be simply assigned. +This gives another way to improve the CPU efficiency, however, there is a prerequisite; +DPDK must handle the context switching between multiple pthreads per core. + +For further flexibility, it is useful to set pthread affinity not only to a CPU but to a CPU set. + +EAL pthread and lcore Affinity +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The term "lcore" refers to an EAL thread, which is really a Linux/FreeBSD pthread. +"EAL pthreads" are created and managed by EAL and execute the tasks issued by *remote_launch*. +In each EAL pthread, there is a TLS (Thread Local Storage) called *_lcore_id* for unique identification. +As EAL pthreads usually bind 1:1 to the physical CPU, the *_lcore_id* is typically equal to the CPU ID. + +When using multiple pthreads, however, the binding is no longer always 1:1 between an EAL pthread and a specified physical CPU. +The EAL pthread may have affinity to a CPU set, and as such the *_lcore_id* will not be the same as the CPU ID. +For this reason, there is an EAL long option '--lcores' defined to assign the CPU affinity of lcores. +For a specified lcore ID or ID group, the option allows setting the CPU set for that EAL pthread. + +The format pattern: + --lcores='<lcore_set>[@cpu_set][,<lcore_set>[@cpu_set],...]' + +'lcore_set' and 'cpu_set' can be a single number, range or a group. + +A number is a "digit([0-9]+)"; a range is "<number>-<number>"; a group is "(<number|range>[,<number|range>,...])". + +If a '\@cpu_set' value is not supplied, the value of 'cpu_set' will default to the value of 'lcore_set'. + + :: + + For example, "--lcores='1,2@(5-7),(3-5)@(0,2),(0,6),7-8'" which means start 9 EAL thread; + lcore 0 runs on cpuset 0x41 (cpu 0,6); + lcore 1 runs on cpuset 0x2 (cpu 1); + lcore 2 runs on cpuset 0xe0 (cpu 5,6,7); + lcore 3,4,5 runs on cpuset 0x5 (cpu 0,2); + lcore 6 runs on cpuset 0x41 (cpu 0,6); + lcore 7 runs on cpuset 0x80 (cpu 7); + lcore 8 runs on cpuset 0x100 (cpu 8). + +Using this option, for each given lcore ID, the associated CPUs can be assigned. +It's also compatible with the pattern of corelist('-l') option. + +non-EAL pthread support +~~~~~~~~~~~~~~~~~~~~~~~ + +It is possible to use the DPDK execution context with any user pthread (aka. Non-EAL pthreads). +In a non-EAL pthread, the *_lcore_id* is always LCORE_ID_ANY which identifies that it is not an EAL thread with a valid, unique, *_lcore_id*. +Some libraries will use an alternative unique ID (e.g. TID), some will not be impacted at all, and some will work but with limitations (e.g. timer and mempool libraries). + +All these impacts are mentioned in :ref:`known_issue_label` section. + +Public Thread API +~~~~~~~~~~~~~~~~~ + +There are two public APIs ``rte_thread_set_affinity()`` and ``rte_thread_get_affinity()`` introduced for threads. +When they're used in any pthread context, the Thread Local Storage(TLS) will be set/get. + +Those TLS include *_cpuset* and *_socket_id*: + +* *_cpuset* stores the CPUs bitmap to which the pthread is affinitized. + +* *_socket_id* stores the NUMA node of the CPU set. If the CPUs in CPU set belong to different NUMA node, the *_socket_id* will be set to SOCKET_ID_ANY. + + +Control Thread API +~~~~~~~~~~~~~~~~~~ + +It is possible to create Control Threads using the public API +``rte_ctrl_thread_create()``. +Those threads can be used for management/infrastructure tasks and are used +internally by DPDK for multi process support and interrupt handling. + +Those threads will be scheduled on CPUs part of the original process CPU +affinity from which the dataplane and service lcores are excluded. + +For example, on a 8 CPUs system, starting a dpdk application with -l 2,3 +(dataplane cores), then depending on the affinity configuration which can be +controlled with tools like taskset (Linux) or cpuset (FreeBSD), + +- with no affinity configuration, the Control Threads will end up on + 0-1,4-7 CPUs. +- with affinity restricted to 2-4, the Control Threads will end up on + CPU 4. +- with affinity restricted to 2-3, the Control Threads will end up on + CPU 2 (master lcore, which is the default when no CPU is available). + +.. _known_issue_label: + +Known Issues +~~~~~~~~~~~~ + ++ rte_mempool + + The rte_mempool uses a per-lcore cache inside the mempool. + For non-EAL pthreads, ``rte_lcore_id()`` will not return a valid number. + So for now, when rte_mempool is used with non-EAL pthreads, the put/get operations will bypass the default mempool cache and there is a performance penalty because of this bypass. + Only user-owned external caches can be used in a non-EAL context in conjunction with ``rte_mempool_generic_put()`` and ``rte_mempool_generic_get()`` that accept an explicit cache parameter. + ++ rte_ring + + rte_ring supports multi-producer enqueue and multi-consumer dequeue. + However, it is non-preemptive, this has a knock on effect of making rte_mempool non-preemptable. + + .. note:: + + The "non-preemptive" constraint means: + + - a pthread doing multi-producers enqueues on a given ring must not + be preempted by another pthread doing a multi-producer enqueue on + the same ring. + - a pthread doing multi-consumers dequeues on a given ring must not + be preempted by another pthread doing a multi-consumer dequeue on + the same ring. + + Bypassing this constraint may cause the 2nd pthread to spin until the 1st one is scheduled again. + Moreover, if the 1st pthread is preempted by a context that has an higher priority, it may even cause a dead lock. + + This means, use cases involving preemptible pthreads should consider using rte_ring carefully. + + 1. It CAN be used for preemptible single-producer and single-consumer use case. + + 2. It CAN be used for non-preemptible multi-producer and preemptible single-consumer use case. + + 3. It CAN be used for preemptible single-producer and non-preemptible multi-consumer use case. + + 4. It MAY be used by preemptible multi-producer and/or preemptible multi-consumer pthreads whose scheduling policy are all SCHED_OTHER(cfs), SCHED_IDLE or SCHED_BATCH. User SHOULD be aware of the performance penalty before using it. + + 5. It MUST not be used by multi-producer/consumer pthreads, whose scheduling policies are SCHED_FIFO or SCHED_RR. + + Alternatively, applications can use the lock-free stack mempool handler. When + considering this handler, note that: + + - It is currently limited to the aarch64 and x86_64 platforms, because it uses + an instruction (16-byte compare-and-swap) that is not yet available on other + platforms. + - It has worse average-case performance than the non-preemptive rte_ring, but + software caching (e.g. the mempool cache) can mitigate this by reducing the + number of stack accesses. + ++ rte_timer + + Running ``rte_timer_manage()`` on a non-EAL pthread is not allowed. However, resetting/stopping the timer from a non-EAL pthread is allowed. + ++ rte_log + + In non-EAL pthreads, there is no per thread loglevel and logtype, global loglevels are used. + ++ misc + + The debug statistics of rte_ring, rte_mempool and rte_timer are not supported in a non-EAL pthread. + +cgroup control +~~~~~~~~~~~~~~ + +The following is a simple example of cgroup control usage, there are two pthreads(t0 and t1) doing packet I/O on the same core ($CPU). +We expect only 50% of CPU spend on packet IO. + + .. code-block:: console + + mkdir /sys/fs/cgroup/cpu/pkt_io + mkdir /sys/fs/cgroup/cpuset/pkt_io + + echo $cpu > /sys/fs/cgroup/cpuset/cpuset.cpus + + echo $t0 > /sys/fs/cgroup/cpu/pkt_io/tasks + echo $t0 > /sys/fs/cgroup/cpuset/pkt_io/tasks + + echo $t1 > /sys/fs/cgroup/cpu/pkt_io/tasks + echo $t1 > /sys/fs/cgroup/cpuset/pkt_io/tasks + + cd /sys/fs/cgroup/cpu/pkt_io + echo 100000 > pkt_io/cpu.cfs_period_us + echo 50000 > pkt_io/cpu.cfs_quota_us + + +Malloc +------ + +The EAL provides a malloc API to allocate any-sized memory. + +The objective of this API is to provide malloc-like functions to allow +allocation from hugepage memory and to facilitate application porting. +The *DPDK API Reference* manual describes the available functions. + +Typically, these kinds of allocations should not be done in data plane +processing because they are slower than pool-based allocation and make +use of locks within the allocation and free paths. +However, they can be used in configuration code. + +Refer to the rte_malloc() function description in the *DPDK API Reference* +manual for more information. + +Cookies +~~~~~~~ + +When CONFIG_RTE_MALLOC_DEBUG is enabled, the allocated memory contains +overwrite protection fields to help identify buffer overflows. + +Alignment and NUMA Constraints +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The rte_malloc() takes an align argument that can be used to request a memory +area that is aligned on a multiple of this value (which must be a power of two). + +On systems with NUMA support, a call to the rte_malloc() function will return +memory that has been allocated on the NUMA socket of the core which made the call. +A set of APIs is also provided, to allow memory to be explicitly allocated on a +NUMA socket directly, or by allocated on the NUMA socket where another core is +located, in the case where the memory is to be used by a logical core other than +on the one doing the memory allocation. + +Use Cases +~~~~~~~~~ + +This API is meant to be used by an application that requires malloc-like +functions at initialization time. + +For allocating/freeing data at runtime, in the fast-path of an application, +the memory pool library should be used instead. + +Internal Implementation +~~~~~~~~~~~~~~~~~~~~~~~ + +Data Structures +^^^^^^^^^^^^^^^ + +There are two data structure types used internally in the malloc library: + +* struct malloc_heap - used to track free space on a per-socket basis + +* struct malloc_elem - the basic element of allocation and free-space + tracking inside the library. + +Structure: malloc_heap +"""""""""""""""""""""" + +The malloc_heap structure is used to manage free space on a per-socket basis. +Internally, there is one heap structure per NUMA node, which allows us to +allocate memory to a thread based on the NUMA node on which this thread runs. +While this does not guarantee that the memory will be used on that NUMA node, +it is no worse than a scheme where the memory is always allocated on a fixed +or random node. + +The key fields of the heap structure and their function are described below +(see also diagram above): + +* lock - the lock field is needed to synchronize access to the heap. + Given that the free space in the heap is tracked using a linked list, + we need a lock to prevent two threads manipulating the list at the same time. + +* free_head - this points to the first element in the list of free nodes for + this malloc heap. + +* first - this points to the first element in the heap. + +* last - this points to the last element in the heap. + +.. _figure_malloc_heap: + +.. figure:: img/malloc_heap.* + + Example of a malloc heap and malloc elements within the malloc library + + +.. _malloc_elem: + +Structure: malloc_elem +"""""""""""""""""""""" + +The malloc_elem structure is used as a generic header structure for various +blocks of memory. +It is used in two different ways - all shown in the diagram above: + +#. As a header on a block of free or allocated memory - normal case + +#. As a padding header inside a block of memory + +The most important fields in the structure and how they are used are described below. + +Malloc heap is a doubly-linked list, where each element keeps track of its +previous and next elements. Due to the fact that hugepage memory can come and +go, neighboring malloc elements may not necessarily be adjacent in memory. +Also, since a malloc element may span multiple pages, its contents may not +necessarily be IOVA-contiguous either - each malloc element is only guaranteed +to be virtually contiguous. + +.. note:: + + If the usage of a particular field in one of the above three usages is not + described, the field can be assumed to have an undefined value in that + situation, for example, for padding headers only the "state" and "pad" + fields have valid values. + +* heap - this pointer is a reference back to the heap structure from which + this block was allocated. + It is used for normal memory blocks when they are being freed, to add the + newly-freed block to the heap's free-list. + +* prev - this pointer points to previous header element/block in memory. When + freeing a block, this pointer is used to reference the previous block to + check if that block is also free. If so, and the two blocks are immediately + adjacent to each other, then the two free blocks are merged to form a single + larger block. + +* next - this pointer points to next header element/block in memory. When + freeing a block, this pointer is used to reference the next block to check + if that block is also free. If so, and the two blocks are immediately + adjacent to each other, then the two free blocks are merged to form a single + larger block. + +* free_list - this is a structure pointing to previous and next elements in + this heap's free list. + It is only used in normal memory blocks; on ``malloc()`` to find a suitable + free block to allocate and on ``free()`` to add the newly freed element to + the free-list. + +* state - This field can have one of three values: ``FREE``, ``BUSY`` or + ``PAD``. + The former two are to indicate the allocation state of a normal memory block + and the latter is to indicate that the element structure is a dummy structure + at the end of the start-of-block padding, i.e. where the start of the data + within a block is not at the start of the block itself, due to alignment + constraints. + In that case, the pad header is used to locate the actual malloc element + header for the block. + +* pad - this holds the length of the padding present at the start of the block. + In the case of a normal block header, it is added to the address of the end + of the header to give the address of the start of the data area, i.e. the + value passed back to the application on a malloc. + Within a dummy header inside the padding, this same value is stored, and is + subtracted from the address of the dummy header to yield the address of the + actual block header. + +* size - the size of the data block, including the header itself. + +Memory Allocation +^^^^^^^^^^^^^^^^^ + +On EAL initialization, all preallocated memory segments are setup as part of the +malloc heap. This setup involves placing an :ref:`element header<malloc_elem>` +with ``FREE`` at the start of each virtually contiguous segment of memory. +The ``FREE`` element is then added to the ``free_list`` for the malloc heap. + +This setup also happens whenever memory is allocated at runtime (if supported), +in which case newly allocated pages are also added to the heap, merging with any +adjacent free segments if there are any. + +When an application makes a call to a malloc-like function, the malloc function +will first index the ``lcore_config`` structure for the calling thread, and +determine the NUMA node of that thread. +The NUMA node is used to index the array of ``malloc_heap`` structures which is +passed as a parameter to the ``heap_alloc()`` function, along with the +requested size, type, alignment and boundary parameters. + +The ``heap_alloc()`` function will scan the free_list of the heap, and attempt +to find a free block suitable for storing data of the requested size, with the +requested alignment and boundary constraints. + +When a suitable free element has been identified, the pointer to be returned +to the user is calculated. +The cache-line of memory immediately preceding this pointer is filled with a +struct malloc_elem header. +Because of alignment and boundary constraints, there could be free space at +the start and/or end of the element, resulting in the following behavior: + +#. Check for trailing space. + If the trailing space is big enough, i.e. > 128 bytes, then the free element + is split. + If it is not, then we just ignore it (wasted space). + +#. Check for space at the start of the element. + If the space at the start is small, i.e. <=128 bytes, then a pad header is + used, and the remaining space is wasted. + If, however, the remaining space is greater, then the free element is split. + +The advantage of allocating the memory from the end of the existing element is +that no adjustment of the free list needs to take place - the existing element +on the free list just has its size value adjusted, and the next/previous elements +have their "prev"/"next" pointers redirected to the newly created element. + +In case when there is not enough memory in the heap to satisfy allocation +request, EAL will attempt to allocate more memory from the system (if supported) +and, following successful allocation, will retry reserving the memory again. In +a multiprocessing scenario, all primary and secondary processes will synchronize +their memory maps to ensure that any valid pointer to DPDK memory is guaranteed +to be valid at all times in all currently running processes. + +Failure to synchronize memory maps in one of the processes will cause allocation +to fail, even though some of the processes may have allocated the memory +successfully. The memory is not added to the malloc heap unless primary process +has ensured that all other processes have mapped this memory successfully. + +Any successful allocation event will trigger a callback, for which user +applications and other DPDK subsystems can register. Additionally, validation +callbacks will be triggered before allocation if the newly allocated memory will +exceed threshold set by the user, giving a chance to allow or deny allocation. + +.. note:: + + Any allocation of new pages has to go through primary process. If the + primary process is not active, no memory will be allocated even if it was + theoretically possible to do so. This is because primary's process map acts + as an authority on what should or should not be mapped, while each secondary + process has its own, local memory map. Secondary processes do not update the + shared memory map, they only copy its contents to their local memory map. + +Freeing Memory +^^^^^^^^^^^^^^ + +To free an area of memory, the pointer to the start of the data area is passed +to the free function. +The size of the ``malloc_elem`` structure is subtracted from this pointer to get +the element header for the block. +If this header is of type ``PAD`` then the pad length is further subtracted from +the pointer to get the proper element header for the entire block. + +From this element header, we get pointers to the heap from which the block was +allocated and to where it must be freed, as well as the pointer to the previous +and next elements. These next and previous elements are then checked to see if +they are also ``FREE`` and are immediately adjacent to the current one, and if +so, they are merged with the current element. This means that we can never have +two ``FREE`` memory blocks adjacent to one another, as they are always merged +into a single block. + +If deallocating pages at runtime is supported, and the free element encloses +one or more pages, those pages can be deallocated and be removed from the heap. +If DPDK was started with command-line parameters for preallocating memory +(``-m`` or ``--socket-mem``), then those pages that were allocated at startup +will not be deallocated. + +Any successful deallocation event will trigger a callback, for which user +applications and other DPDK subsystems can register. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/event_crypto_adapter.rst b/src/spdk/dpdk/doc/guides/prog_guide/event_crypto_adapter.rst new file mode 100644 index 000000000..1e3eb7139 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/event_crypto_adapter.rst @@ -0,0 +1,301 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2018 Intel Corporation. All rights reserved. + +Event Crypto Adapter Library +============================ + +The DPDK :doc:`Eventdev library <eventdev>` provides event driven +programming model with features to schedule events. +The :doc:`Cryptodev library <cryptodev_lib>` provides an interface to +the crypto poll mode drivers which supports different crypto operations. +The Event Crypto Adapter is one of the adapter which is intended to +bridge between the event device and the crypto device. + +The packet flow from crypto device to the event device can be accomplished +using SW and HW based transfer mechanism. +The Adapter queries an eventdev PMD to determine which mechanism to be used. +The adapter uses an EAL service core function for SW based packet transfer +and uses the eventdev PMD functions to configure HW based packet transfer +between the crypto device and the event device. The crypto adapter uses a new +event type called ``RTE_EVENT_TYPE_CRYPTODEV`` to indicate the event source. + +The application can choose to submit a crypto operation directly to +crypto device or send it to the crypto adapter via eventdev based on +RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD capability. +The first mode is known as the event new(RTE_EVENT_CRYPTO_ADAPTER_OP_NEW) +mode and the second as the event forward(RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD) +mode. The choice of mode can be specified while creating the adapter. +In the former mode, it is an application responsibility to enable ingress +packet ordering. In the latter mode, it is the adapter responsibility to +enable the ingress packet ordering. + + +Adapter Mode +------------ + +RTE_EVENT_CRYPTO_ADAPTER_OP_NEW mode +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In the RTE_EVENT_CRYPTO_ADAPTER_OP_NEW mode, application submits crypto +operations directly to crypto device. The adapter then dequeues crypto +completions from crypto device and enqueues them as events to the event device. +This mode does not ensure ingress ordering, if the application directly +enqueues to the cryptodev without going through crypto/atomic stage. +In this mode, events dequeued from the adapter will be treated as new events. +The application needs to specify event information (response information) +which is needed to enqueue an event after the crypto operation is completed. + +.. _figure_event_crypto_adapter_op_new: + +.. figure:: img/event_crypto_adapter_op_new.* + + Working model of ``RTE_EVENT_CRYPTO_ADAPTER_OP_NEW`` mode + + +RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD mode +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In the RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD mode, if HW supports +RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD capability the application +can directly submit the crypto operations to the cryptodev. +If not, application retrieves crypto adapter's event port using +rte_event_crypto_adapter_event_port_get() API. Then, links its event +queue to this port and starts enqueuing crypto operations as events +to the eventdev. The adapter then dequeues the events and submits the +crypto operations to the cryptodev. After the crypto completions, the +adapter enqueues events to the event device. +Application can use this mode, when ingress packet ordering is needed. +In this mode, events dequeued from the adapter will be treated as +forwarded events. The application needs to specify the cryptodev ID +and queue pair ID (request information) needed to enqueue a crypto +operation in addition to the event information (response information) +needed to enqueue an event after the crypto operation has completed. + +.. _figure_event_crypto_adapter_op_forward: + +.. figure:: img/event_crypto_adapter_op_forward.* + + Working model of ``RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD`` mode + + +API Overview +------------ + +This section has a brief introduction to the event crypto adapter APIs. +The application is expected to create an adapter which is associated with +a single eventdev, then add cryptodev and queue pair to the adapter instance. + +Create an adapter instance +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +An adapter instance is created using ``rte_event_crypto_adapter_create()``. This +function is called with event device to be associated with the adapter and port +configuration for the adapter to setup an event port(if the adapter needs to use +a service function). + +Adapter can be started in ``RTE_EVENT_CRYPTO_ADAPTER_OP_NEW`` or +``RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD`` mode. + +.. code-block:: c + + int err; + uint8_t dev_id, id; + struct rte_event_dev_info dev_info; + struct rte_event_port_conf conf; + enum rte_event_crypto_adapter_mode mode; + + err = rte_event_dev_info_get(id, &dev_info); + + conf.new_event_threshold = dev_info.max_num_events; + conf.dequeue_depth = dev_info.max_event_port_dequeue_depth; + conf.enqueue_depth = dev_info.max_event_port_enqueue_depth; + mode = RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD; + err = rte_event_crypto_adapter_create(id, dev_id, &conf, mode); + +If the application desires to have finer control of eventdev port allocation +and setup, it can use the ``rte_event_crypto_adapter_create_ext()`` function. +The ``rte_event_crypto_adapter_create_ext()`` function is passed as a callback +function. The callback function is invoked if the adapter needs to use a +service function and needs to create an event port for it. The callback is +expected to fill the ``struct rte_event_crypto_adapter_conf`` structure +passed to it. + +For RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD mode, the event port created by adapter +can be retrieved using ``rte_event_crypto_adapter_event_port_get()`` API. +Application can use this event port to link with event queue on which it +enqueues events towards the crypto adapter. + +.. code-block:: c + + uint8_t id, evdev, crypto_ev_port_id, app_qid; + struct rte_event ev; + int ret; + + ret = rte_event_crypto_adapter_event_port_get(id, &crypto_ev_port_id); + ret = rte_event_queue_setup(evdev, app_qid, NULL); + ret = rte_event_port_link(evdev, crypto_ev_port_id, &app_qid, NULL, 1); + + // Fill in event info and update event_ptr with rte_crypto_op + memset(&ev, 0, sizeof(ev)); + ev.queue_id = app_qid; + . + . + ev.event_ptr = op; + ret = rte_event_enqueue_burst(evdev, app_ev_port_id, ev, nb_events); + +Querying adapter capabilities +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``rte_event_crypto_adapter_caps_get()`` function allows +the application to query the adapter capabilities for an eventdev and cryptodev +combination. This API provides whether cryptodev and eventdev are connected using +internal HW port or not. + +.. code-block:: c + + rte_event_crypto_adapter_caps_get(dev_id, cdev_id, &cap); + +Adding queue pair to the adapter instance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Cryptodev device id and queue pair are created using cryptodev APIs. +For more information see :doc:`here <cryptodev_lib>`. + +.. code-block:: c + + struct rte_cryptodev_config conf; + struct rte_cryptodev_qp_conf qp_conf; + uint8_t cdev_id = 0; + uint16_t qp_id = 0; + + rte_cryptodev_configure(cdev_id, &conf); + rte_cryptodev_queue_pair_setup(cdev_id, qp_id, &qp_conf); + +These cryptodev id and queue pair are added to the instance using the +``rte_event_crypto_adapter_queue_pair_add()`` API. +The same is removed using ``rte_event_crypto_adapter_queue_pair_del()`` API. +If HW supports RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_QP_EV_BIND +capability, event information must be passed to the add API. + +.. code-block:: c + + uint32_t cap; + int ret; + + ret = rte_event_crypto_adapter_caps_get(id, evdev, &cap); + if (cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_QP_EV_BIND) { + struct rte_event event; + + // Fill in event information & pass it to add API + rte_event_crypto_adapter_queue_pair_add(id, cdev_id, qp_id, &event); + } else + rte_event_crypto_adapter_queue_pair_add(id, cdev_id, qp_id, NULL); + +Configure the service function +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If the adapter uses a service function, the application is required to assign +a service core to the service function as show below. + +.. code-block:: c + + uint32_t service_id; + + if (rte_event_crypto_adapter_service_id_get(id, &service_id) == 0) + rte_service_map_lcore_set(service_id, CORE_ID); + +Set event request/response information +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In the RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD mode, the application needs +to specify the cryptodev ID and queue pair ID (request information) in +addition to the event information (response information) needed to enqueue +an event after the crypto operation has completed. The request and response +information are specified in the ``struct rte_crypto_op`` private data or +session's private data. + +In the RTE_EVENT_CRYPTO_ADAPTER_OP_NEW mode, the application is required +to provide only the response information. + +The SW adapter or HW PMD uses ``rte_crypto_op::sess_type`` to +decide whether request/response data is located in the crypto session/ +crypto security session or at an offset in the ``struct rte_crypto_op``. +The ``rte_crypto_op::private_data_offset`` is used to locate the request/ +response in the ``rte_crypto_op``. + +For crypto session, ``rte_cryptodev_sym_session_set_user_data()`` API +will be used to set request/response data. The same data will be obtained +by ``rte_cryptodev_sym_session_get_user_data()`` API. The +RTE_EVENT_CRYPTO_ADAPTER_CAP_SESSION_PRIVATE_DATA capability indicates +whether HW or SW supports this feature. + +For security session, ``rte_security_session_set_private_data()`` API +will be used to set request/response data. The same data will be obtained +by ``rte_security_session_get_private_data()`` API. + +For session-less it is mandatory to place the request/response data with +the ``rte_crypto_op``. + +.. code-block:: c + + union rte_event_crypto_metadata m_data; + struct rte_event ev; + struct rte_crypto_op *op; + + /* Allocate & fill op structure */ + op = rte_crypto_op_alloc(); + + memset(&m_data, 0, sizeof(m_data)); + memset(&ev, 0, sizeof(ev)); + /* Fill event information and update event_ptr to rte_crypto_op */ + ev.event_ptr = op; + + if (op->sess_type == RTE_CRYPTO_OP_WITH_SESSION) { + /* Copy response information */ + rte_memcpy(&m_data.response_info, &ev, sizeof(ev)); + /* Copy request information */ + m_data.request_info.cdev_id = cdev_id; + m_data.request_info.queue_pair_id = qp_id; + /* Call set API to store private data information */ + rte_cryptodev_sym_session_set_user_data( + op->sym->session, + &m_data, + sizeof(m_data)); + } if (op->sess_type == RTE_CRYPTO_OP_SESSIONLESS) { + uint32_t len = IV_OFFSET + MAXIMUM_IV_LENGTH + + (sizeof(struct rte_crypto_sym_xform) * 2); + op->private_data_offset = len; + /* Copy response information */ + rte_memcpy(&m_data.response_info, &ev, sizeof(ev)); + /* Copy request information */ + m_data.request_info.cdev_id = cdev_id; + m_data.request_info.queue_pair_id = qp_id; + /* Store private data information along with rte_crypto_op */ + rte_memcpy(op + len, &m_data, sizeof(m_data)); + } + +Start the adapter instance +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The application calls ``rte_event_crypto_adapter_start()`` to start the adapter. +This function calls the start callbacks of the eventdev PMDs for hardware based +eventdev-cryptodev connections and ``rte_service_run_state_set()`` to enable the +service function if one exists. + +.. code-block:: c + + rte_event_crypto_adapter_start(id, mode); + +.. Note:: + + The eventdev to which the event_crypto_adapter is connected needs to + be started before calling rte_event_crypto_adapter_start(). + +Get adapter statistics +~~~~~~~~~~~~~~~~~~~~~~ + +The ``rte_event_crypto_adapter_stats_get()`` function reports counters defined +in struct ``rte_event_crypto_adapter_stats``. The received packet and +enqueued event counts are a sum of the counts from the eventdev PMD callbacks +if the callback is supported, and the counts maintained by the service function, +if one exists. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/event_ethernet_rx_adapter.rst b/src/spdk/dpdk/doc/guides/prog_guide/event_ethernet_rx_adapter.rst new file mode 100644 index 000000000..c7dda9221 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/event_ethernet_rx_adapter.rst @@ -0,0 +1,192 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation. + +Event Ethernet Rx Adapter Library +================================= + +The DPDK Eventdev API allows the application to use an event driven programming +model for packet processing. In this model, the application polls an event +device port for receiving events that reference packets instead of polling Rx +queues of ethdev ports. Packet transfer between ethdev and the event device can +be supported in hardware or require a software thread to receive packets from +the ethdev port using ethdev poll mode APIs and enqueue these as events to the +event device using the eventdev API. Both transfer mechanisms may be present on +the same platform depending on the particular combination of the ethdev and +the event device. For SW based packet transfer, if the mbuf does not have a +timestamp set, the adapter adds a timestamp to the mbuf using +rte_get_tsc_cycles(), this provides a more accurate timestamp as compared to +if the application were to set the timestamp since it avoids event device +schedule latency. + +The Event Ethernet Rx Adapter library is intended for the application code to +configure both transfer mechanisms using a common API. A capability API allows +the eventdev PMD to advertise features supported for a given ethdev and allows +the application to perform configuration as per supported features. + +API Walk-through +---------------- + +This section will introduce the reader to the adapter API. The +application has to first instantiate an adapter which is associated with +a single eventdev, next the adapter instance is configured with Rx queues +that are either polled by a SW thread or linked using hardware support. Finally +the adapter is started. + +For SW based packet transfers from ethdev to eventdev, the adapter uses a +DPDK service function and the application is also required to assign a core to +the service function. + +Creating an Adapter Instance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +An adapter instance is created using ``rte_event_eth_rx_adapter_create()``. This +function is passed the event device to be associated with the adapter and port +configuration for the adapter to setup an event port if the adapter needs to use +a service function. + +.. code-block:: c + + int err; + uint8_t dev_id; + struct rte_event_dev_info dev_info; + struct rte_event_port_conf rx_p_conf; + + err = rte_event_dev_info_get(id, &dev_info); + + rx_p_conf.new_event_threshold = dev_info.max_num_events; + rx_p_conf.dequeue_depth = dev_info.max_event_port_dequeue_depth; + rx_p_conf.enqueue_depth = dev_info.max_event_port_enqueue_depth; + err = rte_event_eth_rx_adapter_create(id, dev_id, &rx_p_conf); + +If the application desires to have finer control of eventdev port allocation +and setup, it can use the ``rte_event_eth_rx_adapter_create_ext()`` function. +The ``rte_event_eth_rx_adapter_create_ext()`` function is passed a callback +function. The callback function is invoked if the adapter needs to use a +service function and needs to create an event port for it. The callback is +expected to fill the ``struct rte_event_eth_rx_adapter_conf structure`` +passed to it. + +Adding Rx Queues to the Adapter Instance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Ethdev Rx queues are added to the instance using the +``rte_event_eth_rx_adapter_queue_add()`` function. Configuration for the Rx +queue is passed in using a ``struct rte_event_eth_rx_adapter_queue_conf`` +parameter. Event information for packets from this Rx queue is encoded in the +``ev`` field of ``struct rte_event_eth_rx_adapter_queue_conf``. The +servicing_weight member of the struct rte_event_eth_rx_adapter_queue_conf +is the relative polling frequency of the Rx queue and is applicable when the +adapter uses a service core function. + +.. code-block:: c + + ev.queue_id = 0; + ev.sched_type = RTE_SCHED_TYPE_ATOMIC; + ev.priority = 0; + + queue_config.rx_queue_flags = 0; + queue_config.ev = ev; + queue_config.servicing_weight = 1; + + err = rte_event_eth_rx_adapter_queue_add(id, + eth_dev_id, + 0, &queue_config); + +Querying Adapter Capabilities +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``rte_event_eth_rx_adapter_caps_get()`` function allows +the application to query the adapter capabilities for an eventdev and ethdev +combination. For e.g, if the ``RTE_EVENT_ETH_RX_ADAPTER_CAP_OVERRIDE_FLOW_ID`` +is set, the application can override the adapter generated flow ID in the event +using ``rx_queue_flags`` field in ``struct rte_event_eth_rx_adapter_queue_conf`` +which is passed as a parameter to the ``rte_event_eth_rx_adapter_queue_add()`` +function. + +.. code-block:: c + + err = rte_event_eth_rx_adapter_caps_get(dev_id, eth_dev_id, &cap); + + queue_config.rx_queue_flags = 0; + if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_OVERRIDE_FLOW_ID) { + ev.flow_id = 1; + queue_config.rx_queue_flags = + RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID; + } + +Configuring the Service Function +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If the adapter uses a service function, the application is required to assign +a service core to the service function as show below. + +.. code-block:: c + + uint32_t service_id; + + if (rte_event_eth_rx_adapter_service_id_get(0, &service_id) == 0) + rte_service_map_lcore_set(service_id, RX_CORE_ID); + +Starting the Adapter Instance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The application calls ``rte_event_eth_rx_adapter_start()`` to start the adapter. +This function calls the start callbacks of the eventdev PMDs for hardware based +eventdev-ethdev connections and ``rte_service_run_state_set()`` to enable the +service function if one exists. + +.. Note:: + + The eventdev to which the event_eth_rx_adapter is connected needs to + be started before calling rte_event_eth_rx_adapter_start(). + +Getting Adapter Statistics +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``rte_event_eth_rx_adapter_stats_get()`` function reports counters defined +in struct ``rte_event_eth_rx_adapter_stats``. The received packet and +enqueued event counts are a sum of the counts from the eventdev PMD callbacks +if the callback is supported, and the counts maintained by the service function, +if one exists. The service function also maintains a count of cycles for which +it was not able to enqueue to the event device. + +Interrupt Based Rx Queues +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The service core function is typically set up to poll ethernet Rx queues for +packets. Certain queues may have low packet rates and it would be more +efficient to enable the Rx queue interrupt and read packets after receiving +the interrupt. + +The servicing_weight member of struct rte_event_eth_rx_adapter_queue_conf +is applicable when the adapter uses a service core function. The application +has to enable Rx queue interrupts when configuring the ethernet device +using the ``rte_eth_dev_configure()`` function and then use a servicing_weight +of zero when adding the Rx queue to the adapter. + +The adapter creates a thread blocked on the interrupt, on an interrupt this +thread enqueues the port id and the queue id to a ring buffer. The adapter +service function dequeues the port id and queue id from the ring buffer, +invokes the ``rte_eth_rx_burst()`` to receive packets on the queue and +converts the received packets to events in the same manner as packets +received on a polled Rx queue. The interrupt thread is affinitized to the same +CPUs as the lcores of the Rx adapter service function, if the Rx adapter +service function has not been mapped to any lcores, the interrupt thread +is mapped to the master lcore. + +Rx Callback for SW Rx Adapter +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For SW based packet transfers, i.e., when the +``RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT`` is not set in the adapter's +capabilities flags for a particular ethernet device, the service function +temporarily enqueues mbufs to an event buffer before batch enqueuing these +to the event device. If the buffer fills up, the service function stops +dequeuing packets from the ethernet device. The application may want to +monitor the buffer fill level and instruct the service function to selectively +enqueue packets to the event device. The application may also use some other +criteria to decide which packets should enter the event device even when +the event buffer fill level is low. The +``rte_event_eth_rx_adapter_cb_register()`` function allow the application +to register a callback that selects which packets to enqueue to the event +device. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/event_ethernet_tx_adapter.rst b/src/spdk/dpdk/doc/guides/prog_guide/event_ethernet_tx_adapter.rst new file mode 100644 index 000000000..a8c13e136 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/event_ethernet_tx_adapter.rst @@ -0,0 +1,166 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation. + +Event Ethernet Tx Adapter Library +================================= + +The DPDK Eventdev API allows the application to use an event driven programming +model for packet processing in which the event device distributes events +referencing packets to the application cores in a dynamic load balanced fashion +while handling atomicity and packet ordering. Event adapters provide the interface +between the ethernet, crypto and timer devices and the event device. Event adapter +APIs enable common application code by abstracting PMD specific capabilities. +The Event ethernet Tx adapter provides configuration and data path APIs for the +transmit stage of the application allowing the same application code to use eventdev +PMD support or in its absence, a common implementation. + +In the common implementation, the application enqueues mbufs to the adapter +which runs as a rte_service function. The service function dequeues events +from its event port and transmits the mbufs referenced by these events. + + +API Walk-through +---------------- + +This section will introduce the reader to the adapter API. The +application has to first instantiate an adapter which is associated with +a single eventdev, next the adapter instance is configured with Tx queues, +finally the adapter is started and the application can start enqueuing mbufs +to it. + +Creating an Adapter Instance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +An adapter instance is created using ``rte_event_eth_tx_adapter_create()``. This +function is passed the event device to be associated with the adapter and port +configuration for the adapter to setup an event port if the adapter needs to use +a service function. + +If the application desires to have finer control of eventdev port configuration, +it can use the ``rte_event_eth_tx_adapter_create_ext()`` function. The +``rte_event_eth_tx_adapter_create_ext()`` function is passed a callback function. +The callback function is invoked if the adapter needs to use a service function +and needs to create an event port for it. The callback is expected to fill the +``struct rte_event_eth_tx_adapter_conf`` structure passed to it. + +.. code-block:: c + + struct rte_event_dev_info dev_info; + struct rte_event_port_conf tx_p_conf = {0}; + + err = rte_event_dev_info_get(id, &dev_info); + + tx_p_conf.new_event_threshold = dev_info.max_num_events; + tx_p_conf.dequeue_depth = dev_info.max_event_port_dequeue_depth; + tx_p_conf.enqueue_depth = dev_info.max_event_port_enqueue_depth; + + err = rte_event_eth_tx_adapter_create(id, dev_id, &tx_p_conf); + +Adding Tx Queues to the Adapter Instance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Ethdev Tx queues are added to the instance using the +``rte_event_eth_tx_adapter_queue_add()`` function. A queue value +of -1 is used to indicate all queues within a device. + +.. code-block:: c + + int err = rte_event_eth_tx_adapter_queue_add(id, + eth_dev_id, + q); + +Querying Adapter Capabilities +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``rte_event_eth_tx_adapter_caps_get()`` function allows +the application to query the adapter capabilities for an eventdev and ethdev +combination. Currently, the only capability flag defined is +``RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT``, the application can +query this flag to determine if a service function is associated with the +adapter and retrieve its service identifier using the +``rte_event_eth_tx_adapter_service_id_get()`` API. + + +.. code-block:: c + + int err = rte_event_eth_tx_adapter_caps_get(dev_id, eth_dev_id, &cap); + + if (!(cap & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT)) + err = rte_event_eth_tx_adapter_service_id_get(id, &service_id); + +Linking a Queue to the Adapter's Event Port +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If the adapter uses a service function as described in the previous section, the +application is required to link a queue to the adapter's event port. The adapter's +event port can be obtained using the ``rte_event_eth_tx_adapter_event_port_get()`` +function. The queue can be configured with the ``RTE_EVENT_QUEUE_CFG_SINGLE_LINK`` +since it is linked to a single event port. + +Configuring the Service Function +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If the adapter uses a service function, the application can assign +a service core to the service function as shown below. + +.. code-block:: c + + if (rte_event_eth_tx_adapter_service_id_get(id, &service_id) == 0) + rte_service_map_lcore_set(service_id, TX_CORE_ID); + +Starting the Adapter Instance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The application calls ``rte_event_eth_tx_adapter_start()`` to start the adapter. +This function calls the start callback of the eventdev PMD if supported, +and the ``rte_service_run_state_set()`` to enable the service function if one exists. + +Enqueuing Packets to the Adapter +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The application needs to notify the adapter about the transmit port and queue used +to send the packet. The transmit port is set in the ``struct rte mbuf::port`` field +and the transmit queue is set using the ``rte_event_eth_tx_adapter_txq_set()`` +function. + +If the eventdev PMD supports the ``RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT`` +capability for a given ethernet device, the application should use the +``rte_event_eth_tx_adapter_enqueue()`` function to enqueue packets to the adapter. + +If the adapter uses a service function for the ethernet device then the application +should use the ``rte_event_enqueue_burst()`` function. + +.. code-block:: c + + struct rte_event event; + + if (cap & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT) { + + event.mbuf = m; + eq_flags = 0; + + m->port = tx_port; + rte_event_eth_tx_adapter_txq_set(m, tx_queue_id); + + rte_event_eth_tx_adapter_enqueue(dev_id, ev_port, &event, 1, eq_flags); + } else { + + event.queue_id = qid; /* event queue linked to adapter port */ + event.op = RTE_EVENT_OP_NEW; + event.event_type = RTE_EVENT_TYPE_CPU; + event.sched_type = RTE_SCHED_TYPE_ATOMIC; + event.mbuf = m; + + m->port = tx_port; + rte_event_eth_tx_adapter_txq_set(m, tx_queue_id); + + rte_event_enqueue_burst(dev_id, ev_port, &event, 1); + } + +Getting Adapter Statistics +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``rte_event_eth_tx_adapter_stats_get()`` function reports counters defined +in struct ``rte_event_eth_tx_adapter_stats``. The counter values are the sum of +the counts from the eventdev PMD callback if the callback is supported, and +the counts maintained by the service function, if one exists. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/event_timer_adapter.rst b/src/spdk/dpdk/doc/guides/prog_guide/event_timer_adapter.rst new file mode 100644 index 000000000..a95efbe0d --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/event_timer_adapter.rst @@ -0,0 +1,300 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation. All rights reserved. + +Event Timer Adapter Library +=========================== + +The DPDK :doc:`Event Device library <eventdev>` +introduces an event driven programming model which presents applications with +an alternative to the polling model traditionally used in DPDK +applications. Event devices can be coupled with arbitrary components to provide +new event sources by using **event adapters**. The Event Timer Adapter is one +such adapter; it bridges event devices and timer mechanisms. + +The Event Timer Adapter library extends the event driven model +by introducing a :ref:`new type of event <timer_expiry_event>` that represents +a timer expiration, and providing an API with which adapters can be created or +destroyed, and :ref:`event timers <event_timer>` can be armed and canceled. + +The Event Timer Adapter library is designed to interface with hardware or +software implementations of the timer mechanism; it will query an eventdev PMD +to determine which implementation should be used. The default software +implementation manages timers using the DPDK +:doc:`Timer library <timer_lib>`. + +Examples of using the API are presented in the `API Overview`_ and +`Processing Timer Expiry Events`_ sections. Code samples are abstracted and +are based on the example of handling a TCP retransmission. + +.. _event_timer: + +Event Timer struct +------------------ +Event timers are timers that enqueue a timer expiration event to an event +device upon timer expiration. + +The Event Timer Adapter API represents each event timer with a generic struct, +which contains an event and user metadata. The ``rte_event_timer`` struct is +defined in ``lib/librte_event/librte_event_timer_adapter.h``. + +.. _timer_expiry_event: + +Timer Expiry Event +~~~~~~~~~~~~~~~~~~ + +The event contained by an event timer is enqueued in the event device when the +timer expires, and the event device uses the attributes below when scheduling +it: + +* ``event_queue_id`` - Application should set this to specify an event queue to + which the timer expiry event should be enqueued +* ``event_priority`` - Application can set this to indicate the priority of the + timer expiry event in the event queue relative to other events +* ``sched_type`` - Application can set this to specify the scheduling type of + the timer expiry event +* ``flow_id`` - Application can set this to indicate which flow this timer + expiry event corresponds to +* ``op`` - Will be set to ``RTE_EVENT_OP_NEW`` by the event timer adapter +* ``event_type`` - Will be set to ``RTE_EVENT_TYPE_TIMER`` by the event timer + adapter + +Timeout Ticks +~~~~~~~~~~~~~ + +The number of ticks from now in which the timer will expire. The ticks value +has a resolution (``timer_tick_ns``) that is specified in the event timer +adapter configuration. + +State +~~~~~ + +Before arming an event timer, the application should initialize its state to +RTE_EVENT_TIMER_NOT_ARMED. The event timer's state will be updated when a +request to arm or cancel it takes effect. + +If the application wishes to rearm the timer after it has expired, it should +reset the state back to RTE_EVENT_TIMER_NOT_ARMED before doing so. + +User Metadata +~~~~~~~~~~~~~ + +Memory to store user specific metadata. The event timer adapter implementation +will not modify this area. + +API Overview +------------ + +This section will introduce the reader to the event timer adapter API, showing +how to create and configure an event timer adapter and use it to manage event +timers. + +From a high level, the setup steps are: + +* rte_event_timer_adapter_create() +* rte_event_timer_adapter_start() + +And to start and stop timers: + +* rte_event_timer_arm_burst() +* rte_event_timer_cancel_burst() + +Create and Configure an Adapter Instance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To create an event timer adapter instance, initialize an +``rte_event_timer_adapter_conf`` struct with the desired values, and pass it +to ``rte_event_timer_adapter_create()``. + +.. code-block:: c + + #define NSECPERSEC 1E9 // No of ns in 1 sec + const struct rte_event_timer_adapter_conf adapter_config = { + .event_dev_id = event_dev_id, + .timer_adapter_id = 0, + .clk_src = RTE_EVENT_TIMER_ADAPTER_CPU_CLK, + .timer_tick_ns = NSECPERSEC / 10, // 100 milliseconds + .max_tmo_nsec = 180 * NSECPERSEC // 2 minutes + .nb_timers = 40000, + .timer_adapter_flags = 0, + }; + + struct rte_event_timer_adapter *adapter = NULL; + adapter = rte_event_timer_adapter_create(&adapter_config); + + if (adapter == NULL) { ... }; + +Before creating an instance of a timer adapter, the application should create +and configure an event device along with its event ports. Based on the event +device capability, it might require creating an additional event port to be +used by the timer adapter. If required, the +``rte_event_timer_adapter_create()`` function will use a default method to +configure an event port; it will examine the current event device +configuration, determine the next available port identifier number, and create +a new event port with a default port configuration. + +If the application desires to have finer control of event port allocation +and setup, it can use the ``rte_event_timer_adapter_create_ext()`` function. +This function is passed a callback function that will be invoked if the +adapter needs to create an event port, giving the application the opportunity +to control how it is done. + +Retrieve Event Timer Adapter Contextual Information +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The event timer adapter implementation may have constraints on tick resolution +or maximum timer expiry timeout based on the given event timer adapter or +system. In this case, the implementation may adjust the tick resolution or +maximum timeout to the best possible configuration. + +Upon successful event timer adapter creation, the application can get the +configured resolution and max timeout with +``rte_event_timer_adapter_get_info()``. This function will return an +``rte_event_timer_adapter_info`` struct, which contains the following members: + +* ``min_resolution_ns`` - Minimum timer adapter tick resolution in ns. +* ``max_tmo_ns`` - Maximum timer timeout(expiry) in ns. +* ``adapter_conf`` - Configured event timer adapter attributes + +Configuring the Service Component +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If the adapter uses a service component, the application is required to map +the service to a service core before starting the adapter: + +.. code-block:: c + + uint32_t service_id; + + if (rte_event_timer_adapter_service_id_get(adapter, &service_id) == 0) + rte_service_map_lcore_set(service_id, EVTIM_CORE_ID); + +An event timer adapter uses a service component if the event device PMD +indicates that the adapter should use a software implementation. + +Starting the Adapter Instance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The application should call ``rte_event_timer_adapter_start()`` to start +running the event timer adapter. This function calls the start entry points +defined by eventdev PMDs for hardware implementations or puts a service +component into the running state in the software implementation. + +.. Note:: + + The eventdev to which the event_timer_adapter is connected needs to + be started before calling rte_event_timer_adapter_start(). + +Arming Event Timers +~~~~~~~~~~~~~~~~~~~ + +Once an event timer adapter has been started, an application can begin to +manage event timers with it. + +The application should allocate ``struct rte_event_timer`` objects from a +mempool or huge-page backed application buffers of required size. Upon +successful allocation, the application should initialize the event timer, and +then set any of the necessary event attributes described in the +`Timer Expiry Event`_ section. In the following example, assume ``conn`` +represents a TCP connection and that ``event_timer_pool`` is a mempool that +was created previously: + +.. code-block:: c + + rte_mempool_get(event_timer_pool, (void **)&conn->evtim); + if (conn->evtim == NULL) { ... } + + /* Set up the event timer. */ + conn->evtim->ev.op = RTE_EVENT_OP_NEW; + conn->evtim->ev.queue_id = event_queue_id; + conn->evtim->ev.sched_type = RTE_SCHED_TYPE_ATOMIC; + conn->evtim->ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL; + conn->evtim->ev.event_type = RTE_EVENT_TYPE_TIMER; + conn->evtim->ev.event_ptr = conn; + conn->evtim->state = RTE_EVENT_TIMER_NOT_ARMED; + conn->evtim->timeout_ticks = 30; //3 sec Per RFC1122(TCP returns) + +Note that it is necessary to initialize the event timer state to +RTE_EVENT_TIMER_NOT_ARMED. Also note that we have saved a pointer to the +``conn`` object in the timer's event payload. This will allow us to locate +the connection object again once we dequeue the timer expiry event from the +event device later. As a convenience, the application may specify no value for +ev.event_ptr, and the adapter will by default set it to point at the event +timer itself. + +Now we can arm the event timer with ``rte_event_timer_arm_burst()``: + +.. code-block:: c + + ret = rte_event_timer_arm_burst(adapter, &conn->evtim, 1); + if (ret != 1) { ... } + +Once an event timer expires, the application may free it or rearm it as +necessary. If the application will rearm the timer, the state should be reset +to RTE_EVENT_TIMER_NOT_ARMED by the application before rearming it. + +Multiple Event Timers with Same Expiry Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the special case that there is a set of event timers that should all expire +at the same time, the application may call +``rte_event_timer_arm_tmo_tick_burst()``, which allows the implementation to +optimize the operation if possible. + +Canceling Event Timers +~~~~~~~~~~~~~~~~~~~~~~ + +An event timer that has been armed as described in `Arming Event Timers`_ can +be canceled by calling ``rte_event_timer_cancel_burst()``: + +.. code-block:: c + + /* Ack for the previous tcp data packet has been received; + * cancel the retransmission timer + */ + rte_event_timer_cancel_burst(adapter, &conn->timer, 1); + +Processing Timer Expiry Events +------------------------------ + +Once an event timer has successfully enqueued a timer expiry event in the event +device, the application will subsequently dequeue it from the event device. +The application can use the event payload to retrieve a pointer to the object +associated with the event timer. It can then re-arm the event timer or free the +event timer object as desired: + +.. code-block:: c + + void + event_processing_loop(...) + { + while (...) { + /* Receive events from the configured event port. */ + rte_event_dequeue_burst(event_dev_id, event_port, &ev, 1, 0); + ... + switch(ev.event_type) { + ... + case RTE_EVENT_TYPE_TIMER: + process_timer_event(ev); + ... + break; + } + } + } + + uint8_t + process_timer_event(...) + { + /* A retransmission timeout for the connection has been received. */ + conn = ev.event_ptr; + /* Retransmit last packet (e.g. TCP segment). */ + ... + /* Re-arm timer using original values. */ + rte_event_timer_arm_burst(adapter_id, &conn->timer, 1); + } + +Summary +------- + +The Event Timer Adapter library extends the DPDK event-based programming model +by representing timer expirations as events in the system and allowing +applications to use existing event processing loops to arm and cancel event +timers or handle timer expiry events. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/eventdev.rst b/src/spdk/dpdk/doc/guides/prog_guide/eventdev.rst new file mode 100644 index 000000000..7bcd7603b --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/eventdev.rst @@ -0,0 +1,390 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation. + Copyright(c) 2018 Arm Limited. + +Event Device Library +==================== + +The DPDK Event device library is an abstraction that provides the application +with features to schedule events. This is achieved using the PMD architecture +similar to the ethdev or cryptodev APIs, which may already be familiar to the +reader. + +The eventdev framework introduces the event driven programming model. In a +polling model, lcores poll ethdev ports and associated Rx queues directly +to look for a packet. By contrast in an event driven model, lcores call the +scheduler that selects packets for them based on programmer-specified criteria. +The Eventdev library adds support for an event driven programming model, which +offers applications automatic multicore scaling, dynamic load balancing, +pipelining, packet ingress order maintenance and synchronization services to +simplify application packet processing. + +By introducing an event driven programming model, DPDK can support both polling +and event driven programming models for packet processing, and applications are +free to choose whatever model (or combination of the two) best suits their +needs. + +Step-by-step instructions of the eventdev design is available in the `API +Walk-through`_ section later in this document. + +Event struct +------------ + +The eventdev API represents each event with a generic struct, which contains a +payload and metadata required for scheduling by an eventdev. The +``rte_event`` struct is a 16 byte C structure, defined in +``libs/librte_eventdev/rte_eventdev.h``. + +Event Metadata +~~~~~~~~~~~~~~ + +The rte_event structure contains the following metadata fields, which the +application fills in to have the event scheduled as required: + +* ``flow_id`` - The targeted flow identifier for the enq/deq operation. +* ``event_type`` - The source of this event, e.g. RTE_EVENT_TYPE_ETHDEV or CPU. +* ``sub_event_type`` - Distinguishes events inside the application, that have + the same event_type (see above) +* ``op`` - This field takes one of the RTE_EVENT_OP_* values, and tells the + eventdev about the status of the event - valid values are NEW, FORWARD or + RELEASE. +* ``sched_type`` - Represents the type of scheduling that should be performed + on this event, valid values are the RTE_SCHED_TYPE_ORDERED, ATOMIC and + PARALLEL. +* ``queue_id`` - The identifier for the event queue that the event is sent to. +* ``priority`` - The priority of this event, see RTE_EVENT_DEV_PRIORITY. + +Event Payload +~~~~~~~~~~~~~ + +The rte_event struct contains a union for payload, allowing flexibility in what +the actual event being scheduled is. The payload is a union of the following: + +* ``uint64_t u64`` +* ``void *event_ptr`` +* ``struct rte_mbuf *mbuf`` + +These three items in a union occupy the same 64 bits at the end of the rte_event +structure. The application can utilize the 64 bits directly by accessing the +u64 variable, while the event_ptr and mbuf are provided as convenience +variables. For example the mbuf pointer in the union can used to schedule a +DPDK packet. + +Queues +~~~~~~ + +An event queue is a queue containing events that are scheduled by the event +device. An event queue contains events of different flows associated with +scheduling types, such as atomic, ordered, or parallel. + +Queue All Types Capable +^^^^^^^^^^^^^^^^^^^^^^^ + +If RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES capability bit is set in the event device, +then events of any type may be sent to any queue. Otherwise, the queues only +support events of the type that it was created with. + +Queue All Types Incapable +^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this case, each stage has a specified scheduling type. The application +configures each queue for a specific type of scheduling, and just enqueues all +events to the eventdev. An example of a PMD of this type is the eventdev +software PMD. + +The Eventdev API supports the following scheduling types per queue: + +* Atomic +* Ordered +* Parallel + +Atomic, Ordered and Parallel are load-balanced scheduling types: the output +of the queue can be spread out over multiple CPU cores. + +Atomic scheduling on a queue ensures that a single flow is not present on two +different CPU cores at the same time. Ordered allows sending all flows to any +core, but the scheduler must ensure that on egress the packets are returned to +ingress order on downstream queue enqueue. Parallel allows sending all flows +to all CPU cores, without any re-ordering guarantees. + +Single Link Flag +^^^^^^^^^^^^^^^^ + +There is a SINGLE_LINK flag which allows an application to indicate that only +one port will be connected to a queue. Queues configured with the single-link +flag follow a FIFO like structure, maintaining ordering but it is only capable +of being linked to a single port (see below for port and queue linking details). + + +Ports +~~~~~ + +Ports are the points of contact between worker cores and the eventdev. The +general use-case will see one CPU core using one port to enqueue and dequeue +events from an eventdev. Ports are linked to queues in order to retrieve events +from those queues (more details in `Linking Queues and Ports`_ below). + + +API Walk-through +---------------- + +This section will introduce the reader to the eventdev API, showing how to +create and configure an eventdev and use it for a two-stage atomic pipeline +with one core each for RX and TX. RX and TX cores are shown here for +illustration, refer to Eventdev Adapter documentation for further details. +The diagram below shows the final state of the application after this +walk-through: + +.. _figure_eventdev-usage1: + +.. figure:: img/eventdev_usage.* + + Sample eventdev usage, with RX, two atomic stages and a single-link to TX. + + +A high level overview of the setup steps are: + +* rte_event_dev_configure() +* rte_event_queue_setup() +* rte_event_port_setup() +* rte_event_port_link() +* rte_event_dev_start() + + +Init and Config +~~~~~~~~~~~~~~~ + +The eventdev library uses vdev options to add devices to the DPDK application. +The ``--vdev`` EAL option allows adding eventdev instances to your DPDK +application, using the name of the eventdev PMD as an argument. + +For example, to create an instance of the software eventdev scheduler, the +following vdev arguments should be provided to the application EAL command line: + +.. code-block:: console + + ./dpdk_application --vdev="event_sw0" + +In the following code, we configure eventdev instance with 3 queues +and 6 ports as follows. The 3 queues consist of 2 Atomic and 1 Single-Link, +while the 6 ports consist of 4 workers, 1 RX and 1 TX. + +.. code-block:: c + + const struct rte_event_dev_config config = { + .nb_event_queues = 3, + .nb_event_ports = 6, + .nb_events_limit = 4096, + .nb_event_queue_flows = 1024, + .nb_event_port_dequeue_depth = 128, + .nb_event_port_enqueue_depth = 128, + }; + int err = rte_event_dev_configure(dev_id, &config); + +The remainder of this walk-through assumes that dev_id is 0. + +Setting up Queues +~~~~~~~~~~~~~~~~~ + +Once the eventdev itself is configured, the next step is to configure queues. +This is done by setting the appropriate values in a queue_conf structure, and +calling the setup function. Repeat this step for each queue, starting from +0 and ending at ``nb_event_queues - 1`` from the event_dev config above. + +.. code-block:: c + + struct rte_event_queue_conf atomic_conf = { + .schedule_type = RTE_SCHED_TYPE_ATOMIC, + .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, + .nb_atomic_flows = 1024, + .nb_atomic_order_sequences = 1024, + }; + struct rte_event_queue_conf single_link_conf = { + .event_queue_cfg = RTE_EVENT_QUEUE_CFG_SINGLE_LINK, + }; + int dev_id = 0; + int atomic_q_1 = 0; + int atomic_q_2 = 1; + int single_link_q = 2; + int err = rte_event_queue_setup(dev_id, atomic_q_1, &atomic_conf); + int err = rte_event_queue_setup(dev_id, atomic_q_2, &atomic_conf); + int err = rte_event_queue_setup(dev_id, single_link_q, &single_link_conf); + +As shown above, queue IDs are as follows: + + * id 0, atomic queue #1 + * id 1, atomic queue #2 + * id 2, single-link queue + +These queues are used for the remainder of this walk-through. + +Setting up Ports +~~~~~~~~~~~~~~~~ + +Once queues are set up successfully, create the ports as required. + +.. code-block:: c + + struct rte_event_port_conf rx_conf = { + .dequeue_depth = 128, + .enqueue_depth = 128, + .new_event_threshold = 1024, + }; + struct rte_event_port_conf worker_conf = { + .dequeue_depth = 16, + .enqueue_depth = 64, + .new_event_threshold = 4096, + }; + struct rte_event_port_conf tx_conf = { + .dequeue_depth = 128, + .enqueue_depth = 128, + .new_event_threshold = 4096, + }; + int dev_id = 0; + int rx_port_id = 0; + int err = rte_event_port_setup(dev_id, rx_port_id, &rx_conf); + + for(int worker_port_id = 1; worker_port_id <= 4; worker_port_id++) { + int err = rte_event_port_setup(dev_id, worker_port_id, &worker_conf); + } + + int tx_port_id = 5; + int err = rte_event_port_setup(dev_id, tx_port_id, &tx_conf); + +As shown above: + + * port 0: RX core + * ports 1,2,3,4: Workers + * port 5: TX core + +These ports are used for the remainder of this walk-through. + +Linking Queues and Ports +~~~~~~~~~~~~~~~~~~~~~~~~ + +The final step is to "wire up" the ports to the queues. After this, the +eventdev is capable of scheduling events, and when cores request work to do, +the correct events are provided to that core. Note that the RX core takes input +from e.g.: a NIC so it is not linked to any eventdev queues. + +Linking all workers to atomic queues, and the TX core to the single-link queue +can be achieved like this: + +.. code-block:: c + + uint8_t rx_port_id = 0; + uint8_t tx_port_id = 5; + uint8_t atomic_qs[] = {0, 1}; + uint8_t single_link_q = 2; + uint8_t priority = RTE_EVENT_DEV_PRIORITY_NORMAL; + + for(int worker_port_id = 1; worker_port_id <= 4; worker_port_id++) { + int links_made = rte_event_port_link(dev_id, worker_port_id, atomic_qs, NULL, 2); + } + int links_made = rte_event_port_link(dev_id, tx_port_id, &single_link_q, &priority, 1); + +Starting the EventDev +~~~~~~~~~~~~~~~~~~~~~ + +A single function call tells the eventdev instance to start processing +events. Note that all queues must be linked to for the instance to start, as +if any queue is not linked to, enqueuing to that queue will cause the +application to backpressure and eventually stall due to no space in the +eventdev. + +.. code-block:: c + + int err = rte_event_dev_start(dev_id); + +.. Note:: + + EventDev needs to be started before starting the event producers such + as event_eth_rx_adapter, event_timer_adapter and event_crypto_adapter. + +Ingress of New Events +~~~~~~~~~~~~~~~~~~~~~ + +Now that the eventdev is set up, and ready to receive events, the RX core must +enqueue some events into the system for it to schedule. The events to be +scheduled are ordinary DPDK packets, received from an eth_rx_burst() as normal. +The following code shows how those packets can be enqueued into the eventdev: + +.. code-block:: c + + const uint16_t nb_rx = rte_eth_rx_burst(eth_port, 0, mbufs, BATCH_SIZE); + + for (i = 0; i < nb_rx; i++) { + ev[i].flow_id = mbufs[i]->hash.rss; + ev[i].op = RTE_EVENT_OP_NEW; + ev[i].sched_type = RTE_SCHED_TYPE_ATOMIC; + ev[i].queue_id = atomic_q_1; + ev[i].event_type = RTE_EVENT_TYPE_ETHDEV; + ev[i].sub_event_type = 0; + ev[i].priority = RTE_EVENT_DEV_PRIORITY_NORMAL; + ev[i].mbuf = mbufs[i]; + } + + const int nb_tx = rte_event_enqueue_burst(dev_id, rx_port_id, ev, nb_rx); + if (nb_tx != nb_rx) { + for(i = nb_tx; i < nb_rx; i++) + rte_pktmbuf_free(mbufs[i]); + } + +Forwarding of Events +~~~~~~~~~~~~~~~~~~~~ + +Now that the RX core has injected events, there is work to be done by the +workers. Note that each worker will dequeue as many events as it can in a burst, +process each one individually, and then burst the packets back into the +eventdev. + +The worker can lookup the events source from ``event.queue_id``, which should +indicate to the worker what workload needs to be performed on the event. +Once done, the worker can update the ``event.queue_id`` to a new value, to send +the event to the next stage in the pipeline. + +.. code-block:: c + + int timeout = 0; + struct rte_event events[BATCH_SIZE]; + uint16_t nb_rx = rte_event_dequeue_burst(dev_id, worker_port_id, events, BATCH_SIZE, timeout); + + for (i = 0; i < nb_rx; i++) { + /* process mbuf using events[i].queue_id as pipeline stage */ + struct rte_mbuf *mbuf = events[i].mbuf; + /* Send event to next stage in pipeline */ + events[i].queue_id++; + } + + uint16_t nb_tx = rte_event_enqueue_burst(dev_id, worker_port_id, events, nb_rx); + + +Egress of Events +~~~~~~~~~~~~~~~~ + +Finally, when the packet is ready for egress or needs to be dropped, we need +to inform the eventdev that the packet is no longer being handled by the +application. This can be done by calling dequeue() or dequeue_burst(), which +indicates that the previous burst of packets is no longer in use by the +application. + +An event driven worker thread has following typical workflow on fastpath: + +.. code-block:: c + + while (1) { + rte_event_dequeue_burst(...); + (event processing) + rte_event_enqueue_burst(...); + } + + +Summary +------- + +The eventdev library allows an application to easily schedule events as it +requires, either using a run-to-completion or pipeline processing model. The +queues and ports abstract the logical functionality of an eventdev, providing +the application with a generic method to schedule events. With the flexible +PMD infrastructure applications benefit of improvements in existing eventdevs +and additions of new ones without modification. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/ext_app_lib_make_help.rst b/src/spdk/dpdk/doc/guides/prog_guide/ext_app_lib_make_help.rst new file mode 100644 index 000000000..4312778dc --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/ext_app_lib_make_help.rst @@ -0,0 +1,98 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +.. _External_Application/Library_Makefile_help: + +External Application/Library Makefile help +========================================== + +External applications or libraries should include specific Makefiles from RTE_SDK, located in mk directory. +These Makefiles are: + +* ${RTE_SDK}/mk/rte.extapp.mk: Build an application + +* ${RTE_SDK}/mk/rte.extlib.mk: Build a static library + +* ${RTE_SDK}/mk/rte.extobj.mk: Build objects (.o) + +Prerequisites +------------- + +The following variables must be defined: + +* ${RTE_SDK}: Points to the root directory of the DPDK. + +* ${RTE_TARGET}: Reference the target to be used for compilation (for example, x86_64-native-linux-gcc). + +Build Targets +------------- + +Build targets support the specification of the name of the output directory, using O=mybuilddir. +This is optional; the default output directory is build. + +* all, "nothing" (meaning just make) + + Build the application or the library in the specified output directory. + + Example: + + .. code-block:: console + + make O=mybuild + +* clean + + Clean all objects created using make build. + + Example: + + .. code-block:: console + + make clean O=mybuild + +Help Targets +------------ + +* help + + Show this help. + +Other Useful Command-line Variables +----------------------------------- + +The following variables can be specified at the command line: + +* S= + + Specify the directory in which the sources are located. By default, it is the current directory. + +* M= + + Specify the Makefile to call once the output directory is created. By default, it uses $(S)/Makefile. + +* V= + + Enable verbose build (show full compilation command line and some intermediate commands). + +* D= + + Enable dependency debugging. This provides some useful information about why a target must be rebuilt or not. + +* EXTRA_CFLAGS=, EXTRA_LDFLAGS=, EXTRA_ASFLAGS=, EXTRA_CPPFLAGS= + + Append specific compilation, link or asm flags. + +* CROSS= + + Specify a cross-toolchain header that will prefix all gcc/binutils applications. This only works when using gcc. + +Make from Another Directory +--------------------------- + +It is possible to run the Makefile from another directory, by specifying the output and the source dir. For example: + +.. code-block:: console + + export RTE_SDK=/path/to/DPDK + export RTE_TARGET=x86_64-native-linux-icc + make -f /path/to/my_app/Makefile S=/path/to/my_app O=/path/to/build_dir diff --git a/src/spdk/dpdk/doc/guides/prog_guide/extend_dpdk.rst b/src/spdk/dpdk/doc/guides/prog_guide/extend_dpdk.rst new file mode 100644 index 000000000..a3b3d300b --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/extend_dpdk.rst @@ -0,0 +1,109 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +Extending the DPDK +========================= + +This chapter describes how a developer can extend the DPDK to provide a new library, +a new target, or support a new target. + +Example: Adding a New Library libfoo +------------------------------------ + +To add a new library to the DPDK, proceed as follows: + +#. Add a new configuration option: + + .. code-block:: bash + + for f in config/\*; do \ + echo CONFIG_RTE_LIBFOO=y >> $f; done + +#. Create a new directory with sources: + + .. code-block:: console + + mkdir ${RTE_SDK}/lib/libfoo + touch ${RTE_SDK}/lib/libfoo/foo.c + touch ${RTE_SDK}/lib/libfoo/foo.h + +#. Add a foo() function in libfoo. + + Definition is in foo.c: + + .. code-block:: c + + void foo(void) + { + } + + Declaration is in foo.h: + + .. code-block:: c + + extern void foo(void); + + +#. Update lib/Makefile: + + .. code-block:: console + + vi ${RTE_SDK}/lib/Makefile + # add: + # DIRS-$(CONFIG_RTE_LIBFOO) += libfoo + +#. Create a new Makefile for this library, for example, derived from mempool Makefile: + + .. code-block:: console + + cp ${RTE_SDK}/lib/librte_mempool/Makefile ${RTE_SDK}/lib/libfoo/ + + vi ${RTE_SDK}/lib/libfoo/Makefile + # replace: + # librte_mempool -> libfoo + # rte_mempool -> foo + + +#. Update mk/DPDK.app.mk, and add -lfoo in LDLIBS variable when the option is enabled. + This will automatically add this flag when linking a DPDK application. + + +#. Build the DPDK with the new library (we only show a specific target here): + + .. code-block:: console + + cd ${RTE_SDK} + make config T=x86_64-native-linux-gcc + make + + +#. Check that the library is installed: + + .. code-block:: console + + ls build/lib + ls build/include + +Example: Using libfoo in the Test Application +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The test application is used to validate all functionality of the DPDK. +Once you have added a library, a new test case should be added in the test application. + +* A new test_foo.c file should be added, that includes foo.h and calls the foo() function from test_foo(). + When the test passes, the test_foo() function should return 0. + +* Makefile, test.h and commands.c must be updated also, to handle the new test case. + +* Test report generation: autotest.py is a script that is used to generate the test report that is available in the + ${RTE_SDK}/doc/rst/test_report/autotests directory. This script must be updated also. + If libfoo is in a new test family, the links in ${RTE_SDK}/doc/rst/test_report/test_report.rst must be updated. + +* Build the DPDK with the updated test application (we only show a specific target here): + + + .. code-block:: console + + cd ${RTE_SDK} + make config T=x86_64-native-linux-gcc + make diff --git a/src/spdk/dpdk/doc/guides/prog_guide/flow_classify_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/flow_classify_lib.rst new file mode 100644 index 000000000..f0ed5a1a0 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/flow_classify_lib.rst @@ -0,0 +1,415 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation. + +Flow Classification Library +=========================== + +DPDK provides a Flow Classification library that provides the ability +to classify an input packet by matching it against a set of Flow rules. + +The initial implementation supports counting of IPv4 5-tuple packets which match +a particular Flow rule only. + +Please refer to the +:doc:`./rte_flow` +for more information. + +The Flow Classification library uses the ``librte_table`` API for managing Flow +rules and matching packets against the Flow rules. +The library is table agnostic and can use the following tables: +``Access Control List``, ``Hash`` and ``Longest Prefix Match(LPM)``. +The ``Access Control List`` table is used in the initial implementation. + +Please refer to the +:doc:`./packet_framework` +for more information.on ``librte_table``. + +DPDK provides an Access Control List library that provides the ability to +classify an input packet based on a set of classification rules. + +Please refer to the +:doc:`./packet_classif_access_ctrl` +library for more information on ``librte_acl``. + +There is also a Flow Classify sample application which demonstrates the use of +the Flow Classification Library API's. + +Please refer to the +:doc:`../sample_app_ug/flow_classify` +for more information on the ``flow_classify`` sample application. + +Overview +-------- + +The library has the following API's + +.. code-block:: c + + /** + * Flow classifier create + * + * @param params + * Parameters for flow classifier creation + * @return + * Handle to flow classifier instance on success or NULL otherwise + */ + struct rte_flow_classifier * + rte_flow_classifier_create(struct rte_flow_classifier_params *params); + + /** + * Flow classifier free + * + * @param cls + * Handle to flow classifier instance + * @return + * 0 on success, error code otherwise + */ + int + rte_flow_classifier_free(struct rte_flow_classifier *cls); + + /** + * Flow classify table create + * + * @param cls + * Handle to flow classifier instance + * @param params + * Parameters for flow_classify table creation + * @return + * 0 on success, error code otherwise + */ + int + rte_flow_classify_table_create(struct rte_flow_classifier *cls, + struct rte_flow_classify_table_params *params); + + /** + * Validate the flow classify rule + * + * @param[in] cls + * Handle to flow classifier instance + * @param[in] attr + * Flow rule attributes + * @param[in] pattern + * Pattern specification (list terminated by the END pattern item). + * @param[in] actions + * Associated actions (list terminated by the END pattern item). + * @param[out] error + * Perform verbose error reporting if not NULL. Structure + * initialised in case of error only. + * @return + * 0 on success, error code otherwise + */ + int + rte_flow_classify_validate(struct rte_flow_classifier *cls, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + struct rte_flow_error *error); + + /** + * Add a flow classify rule to the flow_classifier table. + * + * @param[in] cls + * Flow classifier handle + * @param[in] attr + * Flow rule attributes + * @param[in] pattern + * Pattern specification (list terminated by the END pattern item). + * @param[in] actions + * Associated actions (list terminated by the END pattern item). + * @param[out] key_found + * returns 1 if rule present already, 0 otherwise. + * @param[out] error + * Perform verbose error reporting if not NULL. Structure + * initialised in case of error only. + * @return + * A valid handle in case of success, NULL otherwise. + */ + struct rte_flow_classify_rule * + rte_flow_classify_table_entry_add(struct rte_flow_classifier *cls, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + int *key_found; + struct rte_flow_error *error); + + /** + * Delete a flow classify rule from the flow_classifier table. + * + * @param[in] cls + * Flow classifier handle + * @param[in] rule + * Flow classify rule + * @return + * 0 on success, error code otherwise. + */ + int + rte_flow_classify_table_entry_delete(struct rte_flow_classifier *cls, + struct rte_flow_classify_rule *rule); + + /** + * Query flow classifier for given rule. + * + * @param[in] cls + * Flow classifier handle + * @param[in] pkts + * Pointer to packets to process + * @param[in] nb_pkts + * Number of packets to process + * @param[in] rule + * Flow classify rule + * @param[in] stats + * Flow classify stats + * + * @return + * 0 on success, error code otherwise. + */ + int + rte_flow_classifier_query(struct rte_flow_classifier *cls, + struct rte_mbuf **pkts, + const uint16_t nb_pkts, + struct rte_flow_classify_rule *rule, + struct rte_flow_classify_stats *stats); + +Classifier creation +~~~~~~~~~~~~~~~~~~~ + +The application creates the ``Classifier`` using the +``rte_flow_classifier_create`` API. +The ``rte_flow_classify_params`` structure must be initialised by the +application before calling the API. + +.. code-block:: c + + struct rte_flow_classifier_params { + /** flow classifier name */ + const char *name; + + /** CPU socket ID where memory for the flow classifier and its */ + /** elements (tables) should be allocated */ + int socket_id; + }; + +The ``Classifier`` has the following internal structures: + +.. code-block:: c + + struct rte_cls_table { + /* Input parameters */ + struct rte_table_ops ops; + uint32_t entry_size; + enum rte_flow_classify_table_type type; + + /* Handle to the low-level table object */ + void *h_table; + }; + + #define RTE_FLOW_CLASSIFIER_MAX_NAME_SZ 256 + + struct rte_flow_classifier { + /* Input parameters */ + char name[RTE_FLOW_CLASSIFIER_MAX_NAME_SZ]; + int socket_id; + + /* Internal */ + /* ntuple_filter */ + struct rte_eth_ntuple_filter ntuple_filter; + + /* classifier tables */ + struct rte_cls_table tables[RTE_FLOW_CLASSIFY_TABLE_MAX]; + uint32_t table_mask; + uint32_t num_tables; + + uint16_t nb_pkts; + struct rte_flow_classify_table_entry + *entries[RTE_PORT_IN_BURST_SIZE_MAX]; + } __rte_cache_aligned; + +Adding a table to the Classifier +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The application adds a table to the ``Classifier`` using the +``rte_flow_classify_table_create`` API. +The ``rte_flow_classify_table_params`` structure must be initialised by the +application before calling the API. + +.. code-block:: c + + struct rte_flow_classify_table_params { + /** Table operations (specific to each table type) */ + struct rte_table_ops *ops; + + /** Opaque param to be passed to the table create operation */ + void *arg_create; + + /** Classifier table type */ + enum rte_flow_classify_table_type type; + }; + +To create an ACL table the ``rte_table_acl_params`` structure must be +initialised and assigned to ``arg_create`` in the +``rte_flow_classify_table_params`` structure. + +.. code-block:: c + + struct rte_table_acl_params { + /** Name */ + const char *name; + + /** Maximum number of ACL rules in the table */ + uint32_t n_rules; + + /** Number of fields in the ACL rule specification */ + uint32_t n_rule_fields; + + /** Format specification of the fields of the ACL rule */ + struct rte_acl_field_def field_format[RTE_ACL_MAX_FIELDS]; + }; + +The fields for the ACL rule must also be initialised by the application. + +An ACL table can be added to the ``Classifier`` for each ACL rule, for example +another table could be added for the IPv6 5-tuple rule. + +Flow Parsing +~~~~~~~~~~~~ + +The library currently supports three IPv4 5-tuple flow patterns, for UDP, TCP +and SCTP. + +.. code-block:: c + + /* Pattern for IPv4 5-tuple UDP filter */ + static enum rte_flow_item_type pattern_ntuple_1[] = { + RTE_FLOW_ITEM_TYPE_ETH, + RTE_FLOW_ITEM_TYPE_IPV4, + RTE_FLOW_ITEM_TYPE_UDP, + RTE_FLOW_ITEM_TYPE_END, + }; + + /* Pattern for IPv4 5-tuple TCP filter */ + static enum rte_flow_item_type pattern_ntuple_2[] = { + RTE_FLOW_ITEM_TYPE_ETH, + RTE_FLOW_ITEM_TYPE_IPV4, + RTE_FLOW_ITEM_TYPE_TCP, + RTE_FLOW_ITEM_TYPE_END, + }; + + /* Pattern for IPv4 5-tuple SCTP filter */ + static enum rte_flow_item_type pattern_ntuple_3[] = { + RTE_FLOW_ITEM_TYPE_ETH, + RTE_FLOW_ITEM_TYPE_IPV4, + RTE_FLOW_ITEM_TYPE_SCTP, + RTE_FLOW_ITEM_TYPE_END, + }; + +The API function ``rte_flow_classify_validate`` parses the +IPv4 5-tuple pattern, attributes and actions and returns the 5-tuple data in the +``rte_eth_ntuple_filter`` structure. + +.. code-block:: c + + static int + rte_flow_classify_validate(struct rte_flow_classifier *cls, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + struct rte_flow_error *error) + +Adding Flow Rules +~~~~~~~~~~~~~~~~~ + +The ``rte_flow_classify_table_entry_add`` API creates an +``rte_flow_classify`` object which contains the flow_classify id and type, the +action, a union of add and delete keys and a union of rules. +It uses the ``rte_flow_classify_validate`` API function for parsing the +flow parameters. +The 5-tuple ACL key data is obtained from the ``rte_eth_ntuple_filter`` +structure populated by the ``classify_parse_ntuple_filter`` function which +parses the Flow rule. + +.. code-block:: c + + struct acl_keys { + struct rte_table_acl_rule_add_params key_add; /* add key */ + struct rte_table_acl_rule_delete_params key_del; /* delete key */ + }; + + struct classify_rules { + enum rte_flow_classify_rule_type type; + union { + struct rte_flow_classify_ipv4_5tuple ipv4_5tuple; + } u; + }; + + struct rte_flow_classify { + uint32_t id; /* unique ID of classify object */ + enum rte_flow_classify_table_type tbl_type; /* rule table */ + struct classify_rules rules; /* union of rules */ + union { + struct acl_keys key; + } u; + int key_found; /* rule key found in table */ + struct rte_flow_classify_table_entry entry; /* rule meta data */ + void *entry_ptr; /* handle to the table entry for rule meta data */ + }; + +It then calls the ``table.ops.f_add`` API to add the rule to the ACL +table. + +Deleting Flow Rules +~~~~~~~~~~~~~~~~~~~ + +The ``rte_flow_classify_table_entry_delete`` API calls the +``table.ops.f_delete`` API to delete a rule from the ACL table. + +Packet Matching +~~~~~~~~~~~~~~~ + +The ``rte_flow_classifier_query`` API is used to find packets which match a +given flow Flow rule in the table. +This API calls the flow_classify_run internal function which calls the +``table.ops.f_lookup`` API to see if any packets in a burst match any +of the Flow rules in the table. +The meta data for the highest priority rule matched for each packet is returned +in the entries array in the ``rte_flow_classify`` object. +The internal function ``action_apply`` implements the ``Count`` action which is +used to return data which matches a particular Flow rule. + +The rte_flow_classifier_query API uses the following structures to return data +to the application. + +.. code-block:: c + + /** IPv4 5-tuple data */ + struct rte_flow_classify_ipv4_5tuple { + uint32_t dst_ip; /**< Destination IP address in big endian. */ + uint32_t dst_ip_mask; /**< Mask of destination IP address. */ + uint32_t src_ip; /**< Source IP address in big endian. */ + uint32_t src_ip_mask; /**< Mask of destination IP address. */ + uint16_t dst_port; /**< Destination port in big endian. */ + uint16_t dst_port_mask; /**< Mask of destination port. */ + uint16_t src_port; /**< Source Port in big endian. */ + uint16_t src_port_mask; /**< Mask of source port. */ + uint8_t proto; /**< L4 protocol. */ + uint8_t proto_mask; /**< Mask of L4 protocol. */ + }; + + /** + * Flow stats + * + * For the count action, stats can be returned by the query API. + * + * Storage for stats is provided by the application. + * + * + */ + struct rte_flow_classify_stats { + void *stats; + }; + + struct rte_flow_classify_5tuple_stats { + /** count of packets that match IPv4 5tuple pattern */ + uint64_t counter1; + /** IPv4 5tuple data */ + struct rte_flow_classify_ipv4_5tuple ipv4_5tuple; + }; diff --git a/src/spdk/dpdk/doc/guides/prog_guide/generic_receive_offload_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/generic_receive_offload_lib.rst new file mode 100644 index 000000000..5b3fb91c8 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/generic_receive_offload_lib.rst @@ -0,0 +1,212 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation. + +Generic Receive Offload Library +=============================== + +Generic Receive Offload (GRO) is a widely used SW-based offloading +technique to reduce per-packet processing overheads. By reassembling +small packets into larger ones, GRO enables applications to process +fewer large packets directly, thus reducing the number of packets to +be processed. To benefit DPDK-based applications, like Open vSwitch, +DPDK also provides own GRO implementation. In DPDK, GRO is implemented +as a standalone library. Applications explicitly use the GRO library to +reassemble packets. + +Overview +-------- + +In the GRO library, there are many GRO types which are defined by packet +types. One GRO type is in charge of process one kind of packets. For +example, TCP/IPv4 GRO processes TCP/IPv4 packets. + +Each GRO type has a reassembly function, which defines own algorithm and +table structure to reassemble packets. We assign input packets to the +corresponding GRO functions by MBUF->packet_type. + +The GRO library doesn't check if input packets have correct checksums and +doesn't re-calculate checksums for merged packets. The GRO library +assumes the packets are complete (i.e., MF==0 && frag_off==0), when IP +fragmentation is possible (i.e., DF==0). Additionally, it complies RFC +6864 to process the IPv4 ID field. + +Currently, the GRO library provides GRO supports for TCP/IPv4 packets and +VxLAN packets which contain an outer IPv4 header and an inner TCP/IPv4 +packet. + +Two Sets of API +--------------- + +For different usage scenarios, the GRO library provides two sets of API. +The one is called the lightweight mode API, which enables applications to +merge a small number of packets rapidly; the other is called the +heavyweight mode API, which provides fine-grained controls to +applications and supports to merge a large number of packets. + +Lightweight Mode API +~~~~~~~~~~~~~~~~~~~~ + +The lightweight mode only has one function ``rte_gro_reassemble_burst()``, +which process N packets at a time. Using the lightweight mode API to +merge packets is very simple. Calling ``rte_gro_reassemble_burst()`` is +enough. The GROed packets are returned to applications as soon as it +finishes. + +In ``rte_gro_reassemble_burst()``, table structures of different GRO +types are allocated in the stack. This design simplifies applications' +operations. However, limited by the stack size, the maximum number of +packets that ``rte_gro_reassemble_burst()`` can process in an invocation +should be less than or equal to ``RTE_GRO_MAX_BURST_ITEM_NUM``. + +Heavyweight Mode API +~~~~~~~~~~~~~~~~~~~~ + +Compared with the lightweight mode, using the heavyweight mode API is +relatively complex. Firstly, applications need to create a GRO context +by ``rte_gro_ctx_create()``. ``rte_gro_ctx_create()`` allocates tables +structures in the heap and stores their pointers in the GRO context. +Secondly, applications use ``rte_gro_reassemble()`` to merge packets. +If input packets have invalid parameters, ``rte_gro_reassemble()`` +returns them to applications. For example, packets of unsupported GRO +types or TCP SYN packets are returned. Otherwise, the input packets are +either merged with the existed packets in the tables or inserted into the +tables. Finally, applications use ``rte_gro_timeout_flush()`` to flush +packets from the tables, when they want to get the GROed packets. + +Note that all update/lookup operations on the GRO context are not thread +safe. So if different processes or threads want to access the same +context object simultaneously, some external syncing mechanisms must be +used. + +Reassembly Algorithm +-------------------- + +The reassembly algorithm is used for reassembling packets. In the GRO +library, different GRO types can use different algorithms. In this +section, we will introduce an algorithm, which is used by TCP/IPv4 GRO +and VxLAN GRO. + +Challenges +~~~~~~~~~~ + +The reassembly algorithm determines the efficiency of GRO. There are two +challenges in the algorithm design: + +- a high cost algorithm/implementation would cause packet dropping in a + high speed network. + +- packet reordering makes it hard to merge packets. For example, Linux + GRO fails to merge packets when encounters packet reordering. + +The above two challenges require our algorithm is: + +- lightweight enough to scale fast networking speed + +- capable of handling packet reordering + +In DPDK GRO, we use a key-based algorithm to address the two challenges. + +Key-based Reassembly Algorithm +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:numref:`figure_gro-key-algorithm` illustrates the procedure of the +key-based algorithm. Packets are classified into "flows" by some header +fields (we call them as "key"). To process an input packet, the algorithm +searches for a matched "flow" (i.e., the same value of key) for the +packet first, then checks all packets in the "flow" and tries to find a +"neighbor" for it. If find a "neighbor", merge the two packets together. +If can't find a "neighbor", store the packet into its "flow". If can't +find a matched "flow", insert a new "flow" and store the packet into the +"flow". + +.. note:: + Packets in the same "flow" that can't merge are always caused + by packet reordering. + +The key-based algorithm has two characters: + +- classifying packets into "flows" to accelerate packet aggregation is + simple (address challenge 1). + +- storing out-of-order packets makes it possible to merge later (address + challenge 2). + +.. _figure_gro-key-algorithm: + +.. figure:: img/gro-key-algorithm.* + :align: center + + Key-based Reassembly Algorithm + +TCP/IPv4 GRO +------------ + +The table structure used by TCP/IPv4 GRO contains two arrays: flow array +and item array. The flow array keeps flow information, and the item array +keeps packet information. + +Header fields used to define a TCP/IPv4 flow include: + +- source and destination: Ethernet and IP address, TCP port + +- TCP acknowledge number + +TCP/IPv4 packets whose FIN, SYN, RST, URG, PSH, ECE or CWR bit is set +won't be processed. + +Header fields deciding if two packets are neighbors include: + +- TCP sequence number + +- IPv4 ID. The IPv4 ID fields of the packets, whose DF bit is 0, should + be increased by 1. + +VxLAN GRO +--------- + +The table structure used by VxLAN GRO, which is in charge of processing +VxLAN packets with an outer IPv4 header and inner TCP/IPv4 packet, is +similar with that of TCP/IPv4 GRO. Differently, the header fields used +to define a VxLAN flow include: + +- outer source and destination: Ethernet and IP address, UDP port + +- VxLAN header (VNI and flag) + +- inner source and destination: Ethernet and IP address, TCP port + +Header fields deciding if packets are neighbors include: + +- outer IPv4 ID. The IPv4 ID fields of the packets, whose DF bit in the + outer IPv4 header is 0, should be increased by 1. + +- inner TCP sequence number + +- inner IPv4 ID. The IPv4 ID fields of the packets, whose DF bit in the + inner IPv4 header is 0, should be increased by 1. + +.. note:: + We comply RFC 6864 to process the IPv4 ID field. Specifically, + we check IPv4 ID fields for the packets whose DF bit is 0 and + ignore IPv4 ID fields for the packets whose DF bit is 1. + Additionally, packets which have different value of DF bit can't + be merged. + +GRO Library Limitations +----------------------- + +- GRO library uses MBUF->l2_len/l3_len/l4_len/outer_l2_len/ + outer_l3_len/packet_type to get protocol headers for the + input packet, rather than parsing the packet header. Therefore, + before call GRO APIs to merge packets, user applications + must set MBUF->l2_len/l3_len/l4_len/outer_l2_len/outer_l3_len/ + packet_type to the same values as the protocol headers of the + packet. + +- GRO library doesn't support to process the packets with IPv4 + Options or VLAN tagged. + +- GRO library just supports to process the packet organized + in a single MBUF. If the input packet consists of multiple + MBUFs (i.e. chained MBUFs), GRO reassembly behaviors are + unknown. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/generic_segmentation_offload_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/generic_segmentation_offload_lib.rst new file mode 100644 index 000000000..205cb8a86 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/generic_segmentation_offload_lib.rst @@ -0,0 +1,239 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation. + +Generic Segmentation Offload Library +==================================== + +Overview +-------- +Generic Segmentation Offload (GSO) is a widely used software implementation of +TCP Segmentation Offload (TSO), which reduces per-packet processing overhead. +Much like TSO, GSO gains performance by enabling upper layer applications to +process a smaller number of large packets (e.g. MTU size of 64KB), instead of +processing higher numbers of small packets (e.g. MTU size of 1500B), thus +reducing per-packet overhead. + +For example, GSO allows guest kernel stacks to transmit over-sized TCP segments +that far exceed the kernel interface's MTU; this eliminates the need to segment +packets within the guest, and improves the data-to-overhead ratio of both the +guest-host link, and PCI bus. The expectation of the guest network stack in this +scenario is that segmentation of egress frames will take place either in the NIC +HW, or where that hardware capability is unavailable, either in the host +application, or network stack. + +Bearing that in mind, the GSO library enables DPDK applications to segment +packets in software. Note however, that GSO is implemented as a standalone +library, and not via a 'fallback' mechanism (i.e. for when TSO is unsupported +in the underlying hardware); that is, applications must explicitly invoke the +GSO library to segment packets. The size of GSO segments ``(segsz)`` is +configurable by the application. + +Limitations +----------- + +#. The GSO library doesn't check if input packets have correct checksums. + +#. In addition, the GSO library doesn't re-calculate checksums for segmented + packets (that task is left to the application). + +#. IP fragments are unsupported by the GSO library. + +#. The egress interface's driver must support multi-segment packets. + +#. Currently, the GSO library supports the following IPv4 packet types: + + - TCP + - UDP + - VxLAN + - GRE + + See `Supported GSO Packet Types`_ for further details. + +Packet Segmentation +------------------- + +The ``rte_gso_segment()`` function is the GSO library's primary +segmentation API. + +Before performing segmentation, an application must create a GSO context object +``(struct rte_gso_ctx)``, which provides the library with some of the +information required to understand how the packet should be segmented. Refer to +`How to Segment a Packet`_ for additional details on same. Once the GSO context +has been created, and populated, the application can then use the +``rte_gso_segment()`` function to segment packets. + +The GSO library typically stores each segment that it creates in two parts: the +first part contains a copy of the original packet's headers, while the second +part contains a pointer to an offset within the original packet. This mechanism +is explained in more detail in `GSO Output Segment Format`_. + +The GSO library supports both single- and multi-segment input mbufs. + +GSO Output Segment Format +~~~~~~~~~~~~~~~~~~~~~~~~~ +To reduce the number of expensive memcpy operations required when segmenting a +packet, the GSO library typically stores each segment that it creates as a +two-part mbuf (technically, this is termed a 'two-segment' mbuf; however, since +the elements produced by the API are also called 'segments', for clarity the +term 'part' is used here instead). + +The first part of each output segment is a direct mbuf and contains a copy of +the original packet's headers, which must be prepended to each output segment. +These headers are copied from the original packet into each output segment. + +The second part of each output segment, represents a section of data from the +original packet, i.e. a data segment. Rather than copy the data directly from +the original packet into the output segment (which would impact performance +considerably), the second part of each output segment is an indirect mbuf, +which contains no actual data, but simply points to an offset within the +original packet. + +The combination of the 'header' segment and the 'data' segment constitutes a +single logical output GSO segment of the original packet. This is illustrated +in :numref:`figure_gso-output-segment-format`. + +.. _figure_gso-output-segment-format: + +.. figure:: img/gso-output-segment-format.* + :align: center + + Two-part GSO output segment + +In one situation, the output segment may contain additional 'data' segments. +This only occurs when: + +- the input packet on which GSO is to be performed is represented by a + multi-segment mbuf. + +- the output segment is required to contain data that spans the boundaries + between segments of the input multi-segment mbuf. + +The GSO library traverses each segment of the input packet, and produces +numerous output segments; for optimal performance, the number of output +segments is kept to a minimum. Consequently, the GSO library maximizes the +amount of data contained within each output segment; i.e. each output segment +``segsz`` bytes of data. The only exception to this is in the case of the very +final output segment; if ``pkt_len`` % ``segsz``, then the final segment is +smaller than the rest. + +In order for an output segment to meet its MSS, it may need to include data from +multiple input segments. Due to the nature of indirect mbufs (each indirect mbuf +can point to only one direct mbuf), the solution here is to add another indirect +mbuf to the output segment; this additional segment then points to the next +input segment. If necessary, this chaining process is repeated, until the sum of +all of the data 'contained' in the output segment reaches ``segsz``. This +ensures that the amount of data contained within each output segment is uniform, +with the possible exception of the last segment, as previously described. + +:numref:`figure_gso-three-seg-mbuf` illustrates an example of a three-part +output segment. In this example, the output segment needs to include data from +the end of one input segment, and the beginning of another. To achieve this, +an additional indirect mbuf is chained to the second part of the output segment, +and is attached to the next input segment (i.e. it points to the data in the +next input segment). + +.. _figure_gso-three-seg-mbuf: + +.. figure:: img/gso-three-seg-mbuf.* + :align: center + + Three-part GSO output segment + +Supported GSO Packet Types +-------------------------- + +TCP/IPv4 GSO +~~~~~~~~~~~~ +TCP/IPv4 GSO supports segmentation of suitably large TCP/IPv4 packets, which +may also contain an optional VLAN tag. + +UDP/IPv4 GSO +~~~~~~~~~~~~ +UDP/IPv4 GSO supports segmentation of suitably large UDP/IPv4 packets, which +may also contain an optional VLAN tag. UDP GSO is the same as IP fragmentation. +Specifically, UDP GSO treats the UDP header as a part of the payload and +does not modify it during segmentation. Therefore, after UDP GSO, only the +first output packet has the original UDP header, and others just have l2 +and l3 headers. + +VxLAN GSO +~~~~~~~~~ +VxLAN packets GSO supports segmentation of suitably large VxLAN packets, +which contain an outer IPv4 header, inner TCP/IPv4 headers, and optional +inner and/or outer VLAN tag(s). + +GRE GSO +~~~~~~~ +GRE GSO supports segmentation of suitably large GRE packets, which contain +an outer IPv4 header, inner TCP/IPv4 headers, and an optional VLAN tag. + +How to Segment a Packet +----------------------- + +To segment an outgoing packet, an application must: + +#. First create a GSO context ``(struct rte_gso_ctx)``; this contains: + + - a pointer to the mbuf pool for allocating the direct buffers, which are + used to store the GSO segments' packet headers. + + - a pointer to the mbuf pool for allocating indirect buffers, which are + used to locate GSO segments' packet payloads. + + .. note:: + + An application may use the same pool for both direct and indirect + buffers. However, since indirect mbufs simply store a pointer, the + application may reduce its memory consumption by creating a separate memory + pool, containing smaller elements, for the indirect pool. + + + - the size of each output segment, including packet headers and payload, + measured in bytes. + + - the bit mask of required GSO types. The GSO library uses the same macros as + those that describe a physical device's TX offloading capabilities (i.e. + ``DEV_TX_OFFLOAD_*_TSO``) for gso_types. For example, if an application + wants to segment TCP/IPv4 packets, it should set gso_types to + ``DEV_TX_OFFLOAD_TCP_TSO``. The only other supported values currently + supported for gso_types are ``DEV_TX_OFFLOAD_VXLAN_TNL_TSO``, and + ``DEV_TX_OFFLOAD_GRE_TNL_TSO``; a combination of these macros is also + allowed. + + - a flag, that indicates whether the IPv4 headers of output segments should + contain fixed or incremental ID values. + +2. Set the appropriate ol_flags in the mbuf. + + - The GSO library use the value of an mbuf's ``ol_flags`` attribute to + determine how a packet should be segmented. It is the application's + responsibility to ensure that these flags are set. + + - For example, in order to segment TCP/IPv4 packets, the application should + add the ``PKT_TX_IPV4`` and ``PKT_TX_TCP_SEG`` flags to the mbuf's + ol_flags. + + - If checksum calculation in hardware is required, the application should + also add the ``PKT_TX_TCP_CKSUM`` and ``PKT_TX_IP_CKSUM`` flags. + +#. Check if the packet should be processed. Packets with one of the + following properties are not processed and are returned immediately: + + - Packet length is less than ``segsz`` (i.e. GSO is not required). + + - Packet type is not supported by GSO library (see + `Supported GSO Packet Types`_). + + - Application has not enabled GSO support for the packet type. + + - Packet's ol_flags have been incorrectly set. + +#. Allocate space in which to store the output GSO segments. If the amount of + space allocated by the application is insufficient, segmentation will fail. + +#. Invoke the GSO segmentation API, ``rte_gso_segment()``. + +#. If required, update the L3 and L4 checksums of the newly-created segments. + For tunneled packets, the outer IPv4 headers' checksums should also be + updated. Alternatively, the application may offload checksum calculation + to HW. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/glossary.rst b/src/spdk/dpdk/doc/guides/prog_guide/glossary.rst new file mode 100644 index 000000000..21063a414 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/glossary.rst @@ -0,0 +1,244 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +Glossary +======== + + +ACL + Access Control List + +API + Application Programming Interface + +ASLR + Linux* kernel Address-Space Layout Randomization + +BSD + Berkeley Software Distribution + +Clr + Clear + +CIDR + Classless Inter-Domain Routing + +Control Plane + The control plane is concerned with the routing of packets and with + providing a start or end point. + +Core + A core may include several lcores or threads if the processor supports + hyperthreading. + +Core Components + A set of libraries provided by the DPDK, including eal, ring, mempool, + mbuf, timers, and so on. + +CPU + Central Processing Unit + +CRC + Cyclic Redundancy Check + +Data Plane + In contrast to the control plane, the data plane in a network architecture + are the layers involved when forwarding packets. These layers must be + highly optimized to achieve good performance. + +DIMM + Dual In-line Memory Module + +Doxygen + A documentation generator used in the DPDK to generate the API reference. + +DPDK + Data Plane Development Kit + +DRAM + Dynamic Random Access Memory + +EAL + The Environment Abstraction Layer (EAL) provides a generic interface that + hides the environment specifics from the applications and libraries. The + services expected from the EAL are: development kit loading and launching, + core affinity/ assignment procedures, system memory allocation/description, + PCI bus access, inter-partition communication. + +FIFO + First In First Out + +FPGA + Field Programmable Gate Array + +GbE + Gigabit Ethernet + +HW + Hardware + +HPET + High Precision Event Timer; a hardware timer that provides a precise time + reference on x86 platforms. + +ID + Identifier + +IOCTL + Input/Output Control + +I/O + Input/Output + +IP + Internet Protocol + +IPv4 + Internet Protocol version 4 + +IPv6 + Internet Protocol version 6 + +lcore + A logical execution unit of the processor, sometimes called a *hardware + thread*. + +KNI + Kernel Network Interface + +L1 + Layer 1 + +L2 + Layer 2 + +L3 + Layer 3 + +L4 + Layer 4 + +LAN + Local Area Network + +LPM + Longest Prefix Match + +master lcore + The execution unit that executes the main() function and that launches + other lcores. + +mbuf + An mbuf is a data structure used internally to carry messages (mainly + network packets). The name is derived from BSD stacks. To understand the + concepts of packet buffers or mbuf, refer to *TCP/IP Illustrated, Volume 2: + The Implementation*. + +MESI + Modified Exclusive Shared Invalid (CPU cache coherency protocol) + +MTU + Maximum Transfer Unit + +NIC + Network Interface Card + +OOO + Out Of Order (execution of instructions within the CPU pipeline) + +NUMA + Non-uniform Memory Access + +PCI + Peripheral Connect Interface + +PHY + An abbreviation for the physical layer of the OSI model. + +pktmbuf + An *mbuf* carrying a network packet. + +PMD + Poll Mode Driver + +QoS + Quality of Service + +RCU + Read-Copy-Update algorithm, an alternative to simple rwlocks. + +Rd + Read + +RED + Random Early Detection + +RSS + Receive Side Scaling + +RTE + Run Time Environment. Provides a fast and simple framework for fast packet + processing, in a lightweight environment as a Linux* application and using + Poll Mode Drivers (PMDs) to increase speed. + +Rx + Reception + +Slave lcore + Any *lcore* that is not the *master lcore*. + +Socket + A physical CPU, that includes several *cores*. + +SLA + Service Level Agreement + +srTCM + Single Rate Three Color Marking + +SRTD + Scheduler Round Trip Delay + +SW + Software + +Target + In the DPDK, the target is a combination of architecture, machine, + executive environment and toolchain. For example: + i686-native-linux-gcc. + +TCP + Transmission Control Protocol + +TC + Traffic Class + +TLB + Translation Lookaside Buffer + +TLS + Thread Local Storage + +trTCM + Two Rate Three Color Marking + +TSC + Time Stamp Counter + +Tx + Transmission + +TUN/TAP + TUN and TAP are virtual network kernel devices. + +VLAN + Virtual Local Area Network + +Wr + Write + +WRED + Weighted Random Early Detection + +WRR + Weighted Round Robin diff --git a/src/spdk/dpdk/doc/guides/prog_guide/graph_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/graph_lib.rst new file mode 100644 index 000000000..669d77c74 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/graph_lib.rst @@ -0,0 +1,397 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(C) 2020 Marvell International Ltd. + +Graph Library and Inbuilt Nodes +=============================== + +Graph architecture abstracts the data processing functions as a ``node`` and +``links`` them together to create a complex ``graph`` to enable reusable/modular +data processing functions. + +The graph library provides API to enable graph framework operations such as +create, lookup, dump and destroy on graph and node operations such as clone, +edge update, and edge shrink, etc. The API also allows to create the stats +cluster to monitor per graph and per node stats. + +Features +-------- + +Features of the Graph library are: + +- Nodes as plugins. +- Support for out of tree nodes. +- Inbuilt nodes for packet processing. +- Multi-process support. +- Low overhead graph walk and node enqueue. +- Low overhead statistics collection infrastructure. +- Support to export the graph as a Graphviz dot file. See ``rte_graph_export()``. +- Allow having another graph walk implementation in the future by segregating + the fast path(``rte_graph_worker.h``) and slow path code. + +Advantages of Graph architecture +-------------------------------- + +- Memory latency is the enemy for high-speed packet processing, moving the + similar packet processing code to a node will reduce the I cache and D + caches misses. +- Exploits the probability that most packets will follow the same nodes in the + graph. +- Allow SIMD instructions for packet processing of the node.- +- The modular scheme allows having reusable nodes for the consumers. +- The modular scheme allows us to abstract the vendor HW specific + optimizations as a node. + +Performance tuning parameters +----------------------------- + +- Test with various burst size values (256, 128, 64, 32) using + CONFIG_RTE_GRAPH_BURST_SIZE config option. + The testing shows, on x86 and arm64 servers, The sweet spot is 256 burst + size. While on arm64 embedded SoCs, it is either 64 or 128. +- Disable node statistics (using ``CONFIG_RTE_LIBRTE_GRAPH_STATS`` config option) + if not needed. +- Use arm64 optimized memory copy for arm64 architecture by + selecting ``CONFIG_RTE_ARCH_ARM64_MEMCPY``. + +Programming model +----------------- + +Anatomy of Node: +~~~~~~~~~~~~~~~~ + +.. _figure_anatomy_of_a_node: + +.. figure:: img/anatomy_of_a_node.* + +The :numref:`figure_anatomy_of_a_node` diagram depicts the anatomy of a node. + +The node is the basic building block of the graph framework. + +A node consists of: + +process(): +^^^^^^^^^^ + +The callback function will be invoked by worker thread using +``rte_graph_walk()`` function when there is data to be processed by the node. +A graph node process the function using ``process()`` and enqueue to next +downstream node using ``rte_node_enqueue*()`` function. + +Context memory: +^^^^^^^^^^^^^^^ + +It is memory allocated by the library to store the node-specific context +information. This memory will be used by process(), init(), fini() callbacks. + +init(): +^^^^^^^ + +The callback function will be invoked by ``rte_graph_create()`` on when +a node gets attached to a graph. + +fini(): +^^^^^^^ + +The callback function will be invoked by ``rte_graph_destroy()`` on when a +node gets detached to a graph. + +Node name: +^^^^^^^^^^ + +It is the name of the node. When a node registers to graph library, the library +gives the ID as ``rte_node_t`` type. Both ID or Name shall be used lookup the +node. ``rte_node_from_name()``, ``rte_node_id_to_name()`` are the node +lookup functions. + +nb_edges: +^^^^^^^^^ + +The number of downstream nodes connected to this node. The ``next_nodes[]`` +stores the downstream nodes objects. ``rte_node_edge_update()`` and +``rte_node_edge_shrink()`` functions shall be used to update the ``next_node[]`` +objects. Consumers of the node APIs are free to update the ``next_node[]`` +objects till ``rte_graph_create()`` invoked. + +next_node[]: +^^^^^^^^^^^^ + +The dynamic array to store the downstream nodes connected to this node. Downstream +node should not be current node itself or a source node. + +Source node: +^^^^^^^^^^^^ + +Source nodes are static nodes created using ``RTE_NODE_REGISTER`` by passing +``flags`` as ``RTE_NODE_SOURCE_F``. +While performing the graph walk, the ``process()`` function of all the source +nodes will be called first. So that these nodes can be used as input nodes for a graph. + +Node creation and registration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* Node implementer creates the node by implementing ops and attributes of + ``struct rte_node_register``. + +* The library registers the node by invoking RTE_NODE_REGISTER on library load + using the constructor scheme. The constructor scheme used here to support multi-process. + +Link the Nodes to create the graph topology +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. _figure_link_the_nodes: + +.. figure:: img/link_the_nodes.* + +The :numref:`figure_link_the_nodes` diagram shows a graph topology after +linking the N nodes. + +Once nodes are available to the program, Application or node public API +functions can links them together to create a complex packet processing graph. + +There are multiple different types of strategies to link the nodes. + +Method (a): +^^^^^^^^^^^ +Provide the ``next_nodes[]`` at the node registration time. See ``struct rte_node_register::nb_edges``. +This is a use case to address the static node scheme where one knows upfront the +``next_nodes[]`` of the node. + +Method (b): +^^^^^^^^^^^ +Use ``rte_node_edge_get()``, ``rte_node_edge_update()``, ``rte_node_edge_shrink()`` +to update the ``next_nodes[]`` links for the node runtime but before graph create. + +Method (c): +^^^^^^^^^^^ +Use ``rte_node_clone()`` to clone a already existing node, created using RTE_NODE_REGISTER. +When ``rte_node_clone()`` invoked, The library, would clone all the attributes +of the node and creates a new one. The name for cloned node shall be +``"parent_node_name-user_provided_name"``. + +This method enables the use case of Rx and Tx nodes where multiple of those nodes +need to be cloned based on the number of CPU available in the system. +The cloned nodes will be identical, except the ``"context memory"``. +Context memory will have information of port, queue pair in case of Rx and Tx +ethdev nodes. + +Create the graph object +~~~~~~~~~~~~~~~~~~~~~~~ +Now that the nodes are linked, Its time to create a graph by including +the required nodes. The application can provide a set of node patterns to +form a graph object. The ``famish()`` API used underneath for the pattern +matching to include the required nodes. After the graph create any changes to +nodes or graph is not allowed. + +The ``rte_graph_create()`` API shall be used to create the graph. + +Example of a graph object creation: + +.. code-block:: console + + {"ethdev_rx-0-0", ip4*, ethdev_tx-*"} + +In the above example, A graph object will be created with ethdev Rx +node of port 0 and queue 0, all ipv4* nodes in the system, +and ethdev tx node of all ports. + +Multicore graph processing +~~~~~~~~~~~~~~~~~~~~~~~~~~ +In the current graph library implementation, specifically, +``rte_graph_walk()`` and ``rte_node_enqueue*`` fast path API functions +are designed to work on single-core to have better performance. +The fast path API works on graph object, So the multi-core graph +processing strategy would be to create graph object PER WORKER. + +In fast path +~~~~~~~~~~~~ +Typical fast-path code looks like below, where the application +gets the fast-path graph object using ``rte_graph_lookup()`` +on the worker thread and run the ``rte_graph_walk()`` in a tight loop. + +.. code-block:: c + + struct rte_graph *graph = rte_graph_lookup("worker0"); + + while (!done) { + rte_graph_walk(graph); + } + +Context update when graph walk in action +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The fast-path object for the node is ``struct rte_node``. + +It may be possible that in slow-path or after the graph walk-in action, +the user needs to update the context of the node hence access to +``struct rte_node *`` memory. + +``rte_graph_foreach_node()``, ``rte_graph_node_get()``, +``rte_graph_node_get_by_name()`` APIs can be used to to get the +``struct rte_node*``. ``rte_graph_foreach_node()`` iterator function works on +``struct rte_graph *`` fast-path graph object while others works on graph ID or name. + +Get the node statistics using graph cluster +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The user may need to know the aggregate stats of the node across +multiple graph objects. Especially the situation where each graph object bound +to a worker thread. + +Introduced a graph cluster object for statistics. +``rte_graph_cluster_stats_create()`` API shall be used for creating a +graph cluster with multiple graph objects and ``rte_graph_cluster_stats_get()`` +to get the aggregate node statistics. + +An example statistics output from ``rte_graph_cluster_stats_get()`` + +.. code-block:: diff + + +---------+-----------+-------------+---------------+-----------+---------------+-----------+ + |Node |calls |objs |realloc_count |objs/call |objs/sec(10E6) |cycles/call| + +---------------------+-------------+---------------+-----------+---------------+-----------+ + |node0 |12977424 |3322220544 |5 |256.000 |3047.151872 |20.0000 | + |node1 |12977653 |3322279168 |0 |256.000 |3047.210496 |17.0000 | + |node2 |12977696 |3322290176 |0 |256.000 |3047.221504 |17.0000 | + |node3 |12977734 |3322299904 |0 |256.000 |3047.231232 |17.0000 | + |node4 |12977784 |3322312704 |1 |256.000 |3047.243776 |17.0000 | + |node5 |12977825 |3322323200 |0 |256.000 |3047.254528 |17.0000 | + +---------+-----------+-------------+---------------+-----------+---------------+-----------+ + +Node writing guidelines +~~~~~~~~~~~~~~~~~~~~~~~ + +The ``process()`` function of a node is the fast-path function and that needs +to be written carefully to achieve max performance. + +Broadly speaking, there are two different types of nodes. + +Static nodes +~~~~~~~~~~~~ +The first kind of nodes are those that have a fixed ``next_nodes[]`` for the +complete burst (like ethdev_rx, ethdev_tx) and it is simple to write. +``process()`` function can move the obj burst to the next node either using +``rte_node_next_stream_move()`` or using ``rte_node_next_stream_get()`` and +``rte_node_next_stream_put()``. + +Intermediate nodes +~~~~~~~~~~~~~~~~~~ +The second kind of such node is ``intermediate nodes`` that decide what is the +``next_node[]`` to send to on a per-packet basis. In these nodes, + +* Firstly, there has to be the best possible packet processing logic. + +* Secondly, each packet needs to be queued to its next node. + +This can be done using ``rte_node_enqueue_[x1|x2|x4]()`` APIs if +they are to single next or ``rte_node_enqueue_next()`` that takes array of nexts. + +In scenario where multiple intermediate nodes are present but most of the time +each node using the same next node for all its packets, the cost of moving every +pointer from current node's stream to next node's stream could be avoided. +This is called home run and ``rte_node_next_stream_move()`` could be used to +just move stream from the current node to the next node with least number of cycles. +Since this can be avoided only in the case where all the packets are destined +to the same next node, node implementation should be also having worst-case +handling where every packet could be going to different next node. + +Example of intermediate node implementation with home run: +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +1. Start with speculation that next_node = node->ctx. +This could be the next_node application used in the previous function call of this node. + +2. Get the next_node stream array with required space using +``rte_node_next_stream_get(next_node, space)``. + +3. while n_left_from > 0 (i.e packets left to be sent) prefetch next pkt_set +and process current pkt_set to find their next node + +4. if all the next nodes of the current pkt_set match speculated next node, +just count them as successfully speculated(``last_spec``) till now and +continue the loop without actually moving them to the next node. else if there is +a mismatch, copy all the pkt_set pointers that were ``last_spec`` and move the +current pkt_set to their respective next's nodes using ``rte_enqueue_next_x1()``. +Also, one of the next_node can be updated as speculated next_node if it is more +probable. Finally, reset ``last_spec`` to zero. + +5. if n_left_from != 0 then goto 3) to process remaining packets. + +6. if last_spec == nb_objs, All the objects passed were successfully speculated +to single next node. So, the current stream can be moved to next node using +``rte_node_next_stream_move(node, next_node)``. +This is the ``home run`` where memcpy of buffer pointers to next node is avoided. + +7. Update the ``node->ctx`` with more probable next node. + +Graph object memory layout +-------------------------- +.. _figure_graph_mem_layout: + +.. figure:: img/graph_mem_layout.* + +The :numref:`figure_graph_mem_layout` diagram shows ``rte_graph`` object memory +layout. Understanding the memory layout helps to debug the graph library and +improve the performance if needed. + +Graph object consists of a header, circular buffer to store the pending +stream when walking over the graph, and variable-length memory to store +the ``rte_node`` objects. + +The graph_nodes_mem_create() creates and populate this memory. The functions +such as ``rte_graph_walk()`` and ``rte_node_enqueue_*`` use this memory +to enable fastpath services. + +Inbuilt Nodes +------------- + +DPDK provides a set of nodes for data processing. The following section +details the documentation for the same. + +ethdev_rx +~~~~~~~~~ +This node does ``rte_eth_rx_burst()`` into stream buffer passed to it +(src node stream) and does ``rte_node_next_stream_move()`` only when +there are packets received. Each ``rte_node`` works only on one Rx port and +queue that it gets from node->ctx. For each (port X, rx_queue Y), +a rte_node is cloned from ethdev_rx_base_node as ``ethdev_rx-X-Y`` in +``rte_node_eth_config()`` along with updating ``node->ctx``. +Each graph needs to be associated with a unique rte_node for a (port, rx_queue). + +ethdev_tx +~~~~~~~~~ +This node does ``rte_eth_tx_burst()`` for a burst of objs received by it. +It sends the burst to a fixed Tx Port and Queue information from +node->ctx. For each (port X), this ``rte_node`` is cloned from +ethdev_tx_node_base as "ethdev_tx-X" in ``rte_node_eth_config()`` +along with updating node->context. + +Since each graph doesn't need more than one Txq, per port, a Txq is assigned +based on graph id to each rte_node instance. Each graph needs to be associated +with a rte_node for each (port). + +pkt_drop +~~~~~~~~ +This node frees all the objects passed to it considering them as +``rte_mbufs`` that need to be freed. + +ip4_lookup +~~~~~~~~~~ +This node is an intermediate node that does LPM lookup for the received +ipv4 packets and the result determines each packets next node. + +On successful LPM lookup, the result contains the ``next_node`` id and +``next-hop`` id with which the packet needs to be further processed. + +On LPM lookup failure, objects are redirected to pkt_drop node. +``rte_node_ip4_route_add()`` is control path API to add ipv4 routes. +To achieve home run, node use ``rte_node_stream_move()`` as mentioned in above +sections. + +ip4_rewrite +~~~~~~~~~~~ +This node gets packets from ``ip4_lookup`` node with next-hop id for each +packet is embedded in ``node_mbuf_priv1(mbuf)->nh``. This id is used +to determine the L2 header to be written to the packet before sending +the packet out to a particular ethdev_tx node. +``rte_node_ip4_rewrite_add()`` is control path API to add next-hop info. + +null +~~~~ +This node ignores the set of objects passed to it and reports that all are +processed. + diff --git a/src/spdk/dpdk/doc/guides/prog_guide/hash_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/hash_lib.rst new file mode 100644 index 000000000..d06c7de2e --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/hash_lib.rst @@ -0,0 +1,298 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2015 Intel Corporation. + Copyright(c) 2018 Arm Limited. + +.. _Hash_Library: + +Hash Library +============ + +The DPDK provides a Hash Library for creating hash table for fast lookup. +The hash table is a data structure optimized for searching through a set of entries that are each identified by a unique key. +For increased performance the DPDK Hash requires that all the keys have the same number of bytes which is set at the hash creation time. + +Hash API Overview +----------------- + +The main configuration parameters for the hash table are: + +* Total number of hash entries in the table + +* Size of the key in bytes + +* An extra flag to describe additional settings, for example the multithreading mode of operation and extendable bucket functionality (as will be described later) + +The hash table also allows the configuration of some low-level implementation related parameters such as: + +* Hash function to translate the key into a hash value + +The main methods exported by the Hash Library are: + +* Add entry with key: The key is provided as input. If the new entry is successfully added to the hash table for the specified key, + or there is already an entry in the hash table for the specified key, then the position of the entry is returned. + If the operation was not successful, for example due to lack of free entries in the hash table, then a negative value is returned. + +* Delete entry with key: The key is provided as input. If an entry with the specified key is found in the hash, + then the entry is removed from the hash table and the position where the entry was found in the hash table is returned. + If no entry with the specified key exists in the hash table, then a negative value is returned + +* Lookup for entry with key: The key is provided as input. If an entry with the specified key is found in the hash table (i.e., lookup hit), + then the position of the entry is returned, otherwise (i.e., lookup miss) a negative value is returned. + +Apart from the basic methods explained above, the Hash Library API provides a few more advanced methods to query and update the hash table: + +* Add / lookup / delete entry with key and precomputed hash: Both the key and its precomputed hash are provided as input. This allows + the user to perform these operations faster, as the hash value is already computed. + +* Add / lookup entry with key and data: A data is provided as input for add. Add allows the user to store + not only the key, but also the data which may be either a 8-byte integer or a pointer to external data (if data size is more than 8 bytes). + +* Combination of the two options above: User can provide key, precomputed hash, and data. + +* Ability to not free the position of the entry in the hash table upon calling delete. This is useful for multi-threaded scenarios where + readers continue to use the position even after the entry is deleted. + +Also, the API contains a method to allow the user to look up entries in batches, achieving higher performance +than looking up individual entries, as the function prefetches next entries at the time it is operating +with the current ones, which reduces significantly the performance overhead of the necessary memory accesses. + + +The actual data associated with each key can be either managed by the user using a separate table that +mirrors the hash in terms of number of entries and position of each entry, +as shown in the Flow Classification use case described in the following sections, +or stored in the hash table itself. + +The example hash tables in the L2/L3 Forwarding sample applications define which port to forward a packet to based on a packet flow identified by the five-tuple lookup. +However, this table could also be used for more sophisticated features and provide many other functions and actions that could be performed on the packets and flows. + +Multi-process support +--------------------- + +The hash library can be used in a multi-process environment. +The only function that can only be used in single-process mode is rte_hash_set_cmp_func(), which sets up +a custom compare function, which is assigned to a function pointer (therefore, it is not supported in +multi-process mode). + + +Multi-thread support +--------------------- + +The hash library supports multithreading, and the user specifies the needed mode of operation at the creation time of the hash table +by appropriately setting the flag. In all modes of operation lookups are thread-safe meaning lookups can be called from multiple +threads concurrently. + +For concurrent writes, and concurrent reads and writes the following flag values define the corresponding modes of operation: + +* If the multi-writer flag (RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD) is set, multiple threads writing to the table is allowed. + Key add, delete, and table reset are protected from other writer threads. With only this flag set, readers are not protected from ongoing writes. + +* If the read/write concurrency (RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY) is set, multithread read/write operation is safe + (i.e., application does not need to stop the readers from accessing the hash table until writers finish their updates. Readers and writers can operate on the table concurrently). + The library uses a reader-writer lock to provide the concurrency. + +* In addition to these two flag values, if the transactional memory flag (RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT) is also set, + the reader-writer lock will use hardware transactional memory (e.g., Intel® TSX) if supported to guarantee thread safety. + If the platform supports Intel® TSX, it is advised to set the transactional memory flag, as this will speed up concurrent table operations. + Otherwise concurrent operations will be slower because of the overhead associated with the software locking mechanisms. + +* If lock free read/write concurrency (RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF) is set, read/write concurrency is provided without using reader-writer lock. + For platforms (e.g., current ARM based platforms) that do not support transactional memory, it is advised to set this flag to achieve greater scalability in performance. + If this flag is set, the (RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL) flag is set by default. + +* If the 'do not free on delete' (RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL) flag is set, the position of the entry in the hash table is not freed upon calling delete(). This flag is enabled + by default when the lock free read/write concurrency flag is set. The application should free the position after all the readers have stopped referencing the position. + Where required, the application can make use of RCU mechanisms to determine when the readers have stopped referencing the position. + +Extendable Bucket Functionality support +---------------------------------------- +An extra flag is used to enable this functionality (flag is not set by default). When the (RTE_HASH_EXTRA_FLAGS_EXT_TABLE) is set and +in the very unlikely case due to excessive hash collisions that a key has failed to be inserted, the hash table bucket is extended with a linked +list to insert these failed keys. This feature is important for the workloads (e.g. telco workloads) that need to insert up to 100% of the +hash table size and can't tolerate any key insertion failure (even if very few). +Please note that with the 'lock free read/write concurrency' flag enabled, users need to call 'rte_hash_free_key_with_position' API in order to free the empty buckets and +deleted keys, to maintain the 100% capacity guarantee. + +Implementation Details (non Extendable Bucket Case) +--------------------------------------------------- + +The hash table has two main tables: + +* First table is an array of buckets each of which consists of multiple entries, + Each entry contains the signature + of a given key (explained below), and an index to the second table. + +* The second table is an array of all the keys stored in the hash table and its data associated to each key. + +The hash library uses the Cuckoo Hash algorithm to resolve collisions. +For any input key, there are two possible buckets (primary and secondary/alternative location) +to store that key in the hash table, therefore only the entries within those two buckets need to be examined +when the key is looked up. +The Hash Library uses a hash function (configurable) to translate the input key into a 4-byte hash value. +The bucket index and a 2-byte signature is derived from the hash value using partial-key hashing [partial-key]. + +Once the buckets are identified, the scope of the key add, +delete, and lookup operations is reduced to the entries in those buckets (it is very likely that entries are in the primary bucket). + +To speed up the search logic within the bucket, each hash entry stores the 2-byte key signature together with the full key for each hash table entry. +For large key sizes, comparing the input key against a key from the bucket can take significantly more time than +comparing the 2-byte signature of the input key against the signature of a key from the bucket. +Therefore, the signature comparison is done first and the full key comparison is done only when the signatures matches. +The full key comparison is still necessary, as two input keys from the same bucket can still potentially have the same 2-byte signature, +although this event is relatively rare for hash functions providing good uniform distributions for the set of input keys. + +Example of lookup: + +First of all, the primary bucket is identified and entry is likely to be stored there. +If signature was stored there, we compare its key against the one provided and return the position +where it was stored and/or the data associated to that key if there is a match. +If signature is not in the primary bucket, the secondary bucket is looked up, where same procedure +is carried out. If there is no match there either, key is not in the table and a negative value will be returned. + +Example of addition: + +Like lookup, the primary and secondary buckets are identified. If there is an empty entry in +the primary bucket, a signature is stored in that entry, key and data (if any) are added to +the second table and the index in the second table is stored in the entry of the first table. +If there is no space in the primary bucket, one of the entries on that bucket is pushed to its alternative location, +and the key to be added is inserted in its position. +To know where the alternative bucket of the evicted entry is, a mechanism called partial-key hashing [partial-key] is used. +If there is room in the alternative bucket, the evicted entry +is stored in it. If not, same process is repeated (one of the entries gets pushed) until an empty entry is found. +Notice that despite all the entry movement in the first table, the second table is not touched, which would impact +greatly in performance. + +In the very unlikely event that an empty entry cannot be found after certain number of displacements, +key is considered not able to be added (unless extendable bucket flag is set, and in that case the bucket is extended to insert the key, as will be explained later). +With random keys, this method allows the user to get more than 90% table utilization, without +having to drop any stored entry (e.g. using a LRU replacement policy) or allocate more memory (extendable buckets or rehashing). + + +Example of deletion: + +Similar to lookup, the key is searched in its primary and secondary buckets. If the key is found, the +entry is marked as empty. If the hash table was configured with 'no free on delete' or 'lock free read/write concurrency', +the position of the key is not freed. It is the responsibility of the user to free the position after +readers are not referencing the position anymore. + + +Implementation Details (with Extendable Bucket) +------------------------------------------------- +When the RTE_HASH_EXTRA_FLAGS_EXT_TABLE flag is set, the hash table implementation still uses the same Cuckoo Hash algorithm to store the keys into +the first and second tables. However, in the very unlikely event that a key can't be inserted after certain number of the Cuckoo displacements is +reached, the secondary bucket of this key is extended +with a linked list of extra buckets and the key is stored in this linked list. + +In case of lookup for a certain key, as before, the primary bucket is searched for a match and then the secondary bucket is looked up. +If there is no match there either, the extendable buckets (linked list of extra buckets) are searched one by one for a possible match and if there is no match +the key is considered not to be in the table. + +The deletion is the same as the case when the RTE_HASH_EXTRA_FLAGS_EXT_TABLE flag is not set. With one exception, if a key is deleted from any bucket +and an empty location is created, the last entry from the extendable buckets associated with this bucket is displaced into +this empty location to possibly shorten the linked list. + + +Entry distribution in hash table +-------------------------------- + +As mentioned above, Cuckoo hash implementation pushes elements out of their bucket, +if there is a new entry to be added which primary location coincides with their current bucket, +being pushed to their alternative location. +Therefore, as user adds more entries to the hash table, distribution of the hash values +in the buckets will change, being most of them in their primary location and a few in +their secondary location, which the later will increase, as table gets busier. +This information is quite useful, as performance may be lower as more entries +are evicted to their secondary location. + +See the tables below showing example entry distribution as table utilization increases. + +.. _table_hash_lib_1: + +.. table:: Entry distribution measured with an example table with 1024 random entries using jhash algorithm + + +--------------+-----------------------+-------------------------+ + | % Table used | % In Primary location | % In Secondary location | + +==============+=======================+=========================+ + | 25 | 100 | 0 | + +--------------+-----------------------+-------------------------+ + | 50 | 96.1 | 3.9 | + +--------------+-----------------------+-------------------------+ + | 75 | 88.2 | 11.8 | + +--------------+-----------------------+-------------------------+ + | 80 | 86.3 | 13.7 | + +--------------+-----------------------+-------------------------+ + | 85 | 83.1 | 16.9 | + +--------------+-----------------------+-------------------------+ + | 90 | 77.3 | 22.7 | + +--------------+-----------------------+-------------------------+ + | 95.8 | 64.5 | 35.5 | + +--------------+-----------------------+-------------------------+ + +| + +.. _table_hash_lib_2: + +.. table:: Entry distribution measured with an example table with 1 million random entries using jhash algorithm + + +--------------+-----------------------+-------------------------+ + | % Table used | % In Primary location | % In Secondary location | + +==============+=======================+=========================+ + | 50 | 96 | 4 | + +--------------+-----------------------+-------------------------+ + | 75 | 86.9 | 13.1 | + +--------------+-----------------------+-------------------------+ + | 80 | 83.9 | 16.1 | + +--------------+-----------------------+-------------------------+ + | 85 | 80.1 | 19.9 | + +--------------+-----------------------+-------------------------+ + | 90 | 74.8 | 25.2 | + +--------------+-----------------------+-------------------------+ + | 94.5 | 67.4 | 32.6 | + +--------------+-----------------------+-------------------------+ + +.. note:: + + Last values on the tables above are the average maximum table + utilization with random keys and using Jenkins hash function. + +Use Case: Flow Classification +----------------------------- + +Flow classification is used to map each input packet to the connection/flow it belongs to. +This operation is necessary as the processing of each input packet is usually done in the context of their connection, +so the same set of operations is applied to all the packets from the same flow. + +Applications using flow classification typically have a flow table to manage, with each separate flow having an entry associated with it in this table. +The size of the flow table entry is application specific, with typical values of 4, 16, 32 or 64 bytes. + +Each application using flow classification typically has a mechanism defined to uniquely identify a flow based on +a number of fields read from the input packet that make up the flow key. +One example is to use the DiffServ 5-tuple made up of the following fields of the IP and transport layer packet headers: +Source IP Address, Destination IP Address, Protocol, Source Port, Destination Port. + +The DPDK hash provides a generic method to implement an application specific flow classification mechanism. +Given a flow table implemented as an array, the application should create a hash object with the same number of entries as the flow table and +with the hash key size set to the number of bytes in the selected flow key. + +The flow table operations on the application side are described below: + +* Add flow: Add the flow key to hash. + If the returned position is valid, use it to access the flow entry in the flow table for adding a new flow or + updating the information associated with an existing flow. + Otherwise, the flow addition failed, for example due to lack of free entries for storing new flows. + +* Delete flow: Delete the flow key from the hash. If the returned position is valid, + use it to access the flow entry in the flow table to invalidate the information associated with the flow. + +* Free flow: Free flow key position. If 'no free on delete' or 'lock-free read/write concurrency' flags are set, + wait till the readers are not referencing the position returned during add/delete flow and then free the position. + RCU mechanisms can be used to find out when the readers are not referencing the position anymore. + +* Lookup flow: Lookup for the flow key in the hash. + If the returned position is valid (flow lookup hit), use the returned position to access the flow entry in the flow table. + Otherwise (flow lookup miss) there is no flow registered for the current packet. + +References +---------- + +* Donald E. Knuth, The Art of Computer Programming, Volume 3: Sorting and Searching (2nd Edition), 1998, Addison-Wesley Professional +* [partial-key] Bin Fan, David G. Andersen, and Michael Kaminsky, MemC3: compact and concurrent MemCache with dumber caching and smarter hashing, 2013, NSDI diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/anatomy_of_a_node.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/anatomy_of_a_node.svg new file mode 100644 index 000000000..fa4b5b2d5 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/anatomy_of_a_node.svg @@ -0,0 +1,1078 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(C) 2020 Marvell International Ltd. --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + viewBox="0.0 0.0 960.0 540.0" + fill="none" + stroke="none" + stroke-linecap="square" + stroke-miterlimit="10" + id="svg419" + sodipodi:docname="anatomy_of_a_node.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + <metadata + id="metadata425"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs423" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="3840" + inkscape:window-height="2115" + id="namedview421" + showgrid="false" + inkscape:zoom="2.406782" + inkscape:cx="470.64353" + inkscape:cy="284.06748" + inkscape:window-x="-13" + inkscape:window-y="-13" + inkscape:window-maximized="1" + inkscape:current-layer="svg419" /> + <clipPath + id="p.0"> + <path + d="m0 0l960.0 0l0 540.0l-960.0 0l0 -540.0z" + clip-rule="nonzero" + id="path10" /> + </clipPath> + <g + clip-path="url(#p.0)" + id="g417" + transform="matrix(1.0160138,0,0,1.0169275,-5.7394334,-5.6337913)"> + <path + d="M 0,0 H 960 V 540 H 0 Z" + id="path13" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 99.11286,61.721786 h 812.126 V 487.95799 h -812.126 z" + id="path15" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 99.11286,61.721786 h 812.126 V 487.95799 h -812.126 z" + id="path17" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#741b47;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 139.76378,88.51181 h 541.57477 v 372.8504 H 139.76378 Z" + id="path19" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 139.76378,88.51181 h 541.57477 v 372.8504 H 139.76378 Z" + id="path21" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#c27ba0;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:4, 3, 1, 3" /> + <path + d="M 540.8504,238.14069 V 415.12232" + id="path23" + inkscape:connector-curvature="0" + style="fill-rule:nonzero;stroke:#1155cc;stroke-width:1;stroke-linecap:butt" /> + <path + d="M 619.6588,238.14069 V 415.12232" + id="path25" + inkscape:connector-curvature="0" + style="fill-rule:nonzero;stroke:#1155cc;stroke-width:1;stroke-linecap:butt" /> + <path + d="m 540.3517,238.63937 h 79.80579" + id="path27" + inkscape:connector-curvature="0" + style="fill-rule:nonzero;stroke:#1155cc;stroke-width:1;stroke-linecap:butt" /> + <path + d="m 540.3517,273.8362 h 79.80579" + id="path29" + inkscape:connector-curvature="0" + style="fill-rule:nonzero;stroke:#1155cc;stroke-width:1;stroke-linecap:butt" /> + <path + d="m 540.3517,309.03308 h 79.80579" + id="path31" + inkscape:connector-curvature="0" + style="fill-rule:nonzero;stroke:#1155cc;stroke-width:1;stroke-linecap:butt" /> + <path + d="m 540.3517,344.22992 h 79.80579" + id="path33" + inkscape:connector-curvature="0" + style="fill-rule:nonzero;stroke:#1155cc;stroke-width:1;stroke-linecap:butt" /> + <path + d="m 540.3517,379.42676 h 79.80579" + id="path35" + inkscape:connector-curvature="0" + style="fill-rule:nonzero;stroke:#1155cc;stroke-width:1;stroke-linecap:butt" /> + <path + d="m 540.3517,414.62363 h 79.80579" + id="path37" + inkscape:connector-curvature="0" + style="fill-rule:nonzero;stroke:#1155cc;stroke-width:1;stroke-linecap:butt" /> + <path + d="m 559.7812,260.43936 v -9.54686 h 1.29687 l 5.01563,7.49998 v -7.49998 h 1.20312 v 9.54686 h -1.29687 l -5.01563,-7.49998 v 7.49998 z m 9.04706,-3.45312 q 0,-1.92186 1.07812,-2.84374 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57811 0,1.32812 -0.40625,2.09375 -0.39062,0.76562 -1.15625,1.1875 -0.76562,0.42187 -1.67187,0.42187 -1.45313,0 -2.35938,-0.92187 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32812 0.57813,1.98437 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67187 0.57813,-2.03125 0,-1.28123 -0.59375,-1.93748 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98436 z m 11.13123,3.45312 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45312 -0.6875,-0.45313 -1.07812,-1.26563 -0.375,-0.82812 -0.375,-1.89062 0,-1.03124 0.34375,-1.87499 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45312 1.54687,-0.45312 0.625,0 1.10938,0.26562 0.5,0.25 0.79687,0.67188 v -3.42188 h 1.17188 v 9.54686 z m -3.70313,-3.45312 q 0,1.32812 0.5625,1.98437 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42186 -0.54687,-2.07811 -0.54688,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51563,0.625 -0.51563,1.99999 z m 11.3656,1.23437 1.20313,0.14063 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57812 -1.96875,0.57812 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60937 0,-1.74999 0.89063,-2.70311 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65623 0,0.10938 0,0.3125 h -5.15625 q 0.0625,1.14063 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32812 0.45313,-0.34375 0.71875,-1.07813 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85936 -0.4375,-1.29686 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.43748 z m 9.89667,-0.57811 q 0,-1.6875 0.34375,-2.71875 0.35938,-1.03125 1.04688,-1.59375 0.6875,-0.5625 1.71875,-0.5625 0.78125,0 1.35937,0.3125 0.57813,0.29688 0.95313,0.89063 0.375,0.57812 0.59375,1.42187 0.21875,0.82813 0.21875,2.25 0,1.67186 -0.35938,2.70311 -0.34375,1.03125 -1.03125,1.59375 -0.67187,0.5625 -1.73437,0.5625 -1.375,0 -2.15625,-0.98438 -0.95313,-1.1875 -0.95313,-3.87498 z m 1.20313,0 q 0,2.34373 0.54687,3.12498 0.5625,0.78125 1.35938,0.78125 0.8125,0 1.35937,-0.78125 0.5625,-0.78125 0.5625,-3.12498 0,-2.35937 -0.5625,-3.125 -0.54687,-0.78125 -1.35937,-0.78125 -0.8125,0 -1.29688,0.6875 -0.60937,0.875 -0.60937,3.21875 z" + id="path39" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 559.7812,295.63623 v -9.54688 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54688 h -1.29687 l -5.01563,-7.5 v 7.5 z m 9.04706,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.13123,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45313 -0.6875,-0.45312 -1.07812,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45312 1.54687,-0.45312 0.625,0 1.10938,0.26562 0.5,0.25 0.79687,0.67188 v -3.42188 h 1.17188 v 9.54688 z m -3.70313,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54687,-2.07813 -0.54688,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51563,0.625 -0.51563,2 z m 11.3656,1.23438 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 14.31855,4.125 H 598.128 v -7.46875 q -0.42187,0.40625 -1.10937,0.8125 -0.6875,0.40625 -1.23438,0.60937 v -1.14062 q 0.98438,-0.45313 1.71875,-1.10938 0.73438,-0.67187 1.03125,-1.28125 h 0.76563 z" + id="path41" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 559.7812,330.83307 v -9.54687 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54687 h -1.29687 l -5.01563,-7.5 v 7.5 z m 9.04706,-3.45312 q 0,-1.92188 1.07812,-2.84375 0.89063,-0.76563 2.17188,-0.76563 1.42187,0 2.32812,0.9375 0.90625,0.92188 0.90625,2.57813 0,1.32812 -0.40625,2.09375 -0.39062,0.76562 -1.15625,1.1875 -0.76562,0.42187 -1.67187,0.42187 -1.45313,0 -2.35938,-0.92187 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32812 0.57813,1.98437 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67187 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98438 z m 11.13123,3.45312 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45312 -0.6875,-0.45313 -1.07812,-1.26563 -0.375,-0.82812 -0.375,-1.89062 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45313 1.54687,-0.45313 0.625,0 1.10938,0.26563 0.5,0.25 0.79687,0.67187 v -3.42187 h 1.17188 v 9.54687 z m -3.70313,-3.45312 q 0,1.32812 0.5625,1.98437 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42187 -0.54687,-2.07812 -0.54688,-0.67188 -1.34375,-0.67188 -0.78125,0 -1.3125,0.64063 -0.51563,0.625 -0.51563,2 z m 11.3656,1.23437 1.20313,0.14063 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57812 -1.96875,0.57812 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60937 0,-1.75 0.89063,-2.70313 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 h -5.15625 q 0.0625,1.14063 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32812 0.45313,-0.34375 0.71875,-1.07813 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54687 -0.54688,0.53125 -0.60938,1.4375 z m 16.05292,3 v 1.125 h -6.29687 q -0.0156,-0.42187 0.14062,-0.8125 0.23438,-0.64062 0.76563,-1.26562 0.53125,-0.625 1.53125,-1.45313 1.5625,-1.26562 2.10937,-2.01562 0.54688,-0.75 0.54688,-1.40625 0,-0.70313 -0.5,-1.17188 -0.5,-0.48437 -1.29688,-0.48437 -0.85937,0 -1.375,0.51562 -0.5,0.5 -0.5,1.39063 l -1.20312,-0.10938 q 0.125,-1.35937 0.92187,-2.0625 0.8125,-0.70312 2.17188,-0.70312 1.375,0 2.17187,0.76562 0.8125,0.75 0.8125,1.875 0,0.57813 -0.23437,1.14063 -0.23438,0.54687 -0.78125,1.15625 -0.54688,0.60937 -1.8125,1.67187 -1.04688,0.89063 -1.35938,1.21875 -0.29687,0.3125 -0.48437,0.625 z" + id="path43" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 577.7547,366.0299 v -1.32813 h 1.34375 v 1.32813 z m 3.703,0 v -1.32813 h 1.34375 v 1.32813 z" + id="path45" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 559.7812,401.22678 v -9.54687 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54687 h -1.29687 l -5.01563,-7.5 v 7.5 z m 9.04706,-3.45312 q 0,-1.92188 1.07812,-2.84375 0.89063,-0.76563 2.17188,-0.76563 1.42187,0 2.32812,0.9375 0.90625,0.92188 0.90625,2.57813 0,1.32812 -0.40625,2.09375 -0.39062,0.76562 -1.15625,1.1875 -0.76562,0.42187 -1.67187,0.42187 -1.45313,0 -2.35938,-0.92187 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32812 0.57813,1.98437 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67187 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98438 z m 11.13123,3.45312 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45312 -0.6875,-0.45313 -1.07812,-1.26563 -0.375,-0.82812 -0.375,-1.89062 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45313 1.54687,-0.45313 0.625,0 1.10938,0.26563 0.5,0.25 0.79687,0.67187 v -3.42187 h 1.17188 v 9.54687 z m -3.70313,-3.45312 q 0,1.32812 0.5625,1.98437 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42187 -0.54687,-2.07812 -0.54688,-0.67188 -1.34375,-0.67188 -0.78125,0 -1.3125,0.64063 -0.51563,0.625 -0.51563,2 z m 11.3656,1.23437 1.20313,0.14063 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57812 -1.96875,0.57812 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60937 0,-1.75 0.89063,-2.70313 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 h -5.15625 q 0.0625,1.14063 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32812 0.45313,-0.34375 0.71875,-1.07813 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54687 -0.54688,0.53125 -0.60938,1.4375 z m 10.2248,4.125 v -6.90625 h 1.0625 v 0.98438 q 0.75,-1.14063 2.1875,-1.14063 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26562,0.35938 0.375,0.85938 0.0625,0.32812 0.0625,1.14062 v 4.25 h -1.17188 v -4.20312 q 0,-0.71875 -0.14062,-1.0625 -0.14063,-0.35938 -0.48438,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29687,0.46875 -0.54688,0.46875 -0.54688,1.79687 v 3.78125 z" + id="path47" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 570.17847,112.47769 h 85.98425 v 35.2126 h -85.98425 z" + id="path49" + inkscape:connector-curvature="0" + style="fill:#fdf8f8;fill-rule:evenodd" /> + <path + d="m 570.17847,112.47769 h 85.98425 v 35.2126 h -85.98425 z" + id="path51" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 598.25494,126.88399 v -9.54688 h 1.29688 l 5.01562,7.5 v -7.5 h 1.20313 v 9.54688 h -1.29688 l -5.01562,-7.5 v 7.5 z m 9.047,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.13123,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45313 -0.6875,-0.45312 -1.07812,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45312 1.54687,-0.45312 0.625,0 1.10938,0.26562 0.5,0.25 0.79687,0.67188 v -3.42188 h 1.17188 v 9.54688 z m -3.70313,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54687,-2.07813 -0.54688,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51563,0.625 -0.51563,2 z m 11.3656,1.23438 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z" + id="path53" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 596.41,142.88399 v -9.54688 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54688 h -1.29687 l -5.01563,-7.5 v 7.5 z m 14.00012,-0.85938 q -0.65625,0.5625 -1.26562,0.79688 -0.59375,0.21875 -1.28125,0.21875 -1.14063,0 -1.75,-0.54688 -0.60938,-0.5625 -0.60938,-1.4375 0,-0.5 0.21875,-0.92187 0.23438,-0.42188 0.60938,-0.67188 0.375,-0.25 0.84375,-0.39062 0.34375,-0.0781 1.04687,-0.17188 1.42188,-0.17187 2.09375,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.32812,-1.01563 -0.45313,-0.39062 -1.34375,-0.39062 -0.8125,0 -1.21875,0.29687 -0.39063,0.28125 -0.57813,1.01563 l -1.14062,-0.15625 q 0.15625,-0.73438 0.51562,-1.1875 0.35938,-0.45313 1.03125,-0.6875 0.67188,-0.25 1.5625,-0.25 0.89063,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.26563,0.3125 0.375,0.79688 0.0469,0.29687 0.0469,1.07812 v 1.5625 q 0,1.625 0.0781,2.0625 0.0781,0.4375 0.29688,0.82813 h -1.21875 q -0.1875,-0.35938 -0.23438,-0.85938 z m -0.0937,-2.60937 q -0.64062,0.26562 -1.92187,0.4375 -0.71875,0.10937 -1.01563,0.25 -0.29687,0.125 -0.46875,0.375 -0.15625,0.25 -0.15625,0.54687 0,0.46875 0.34375,0.78125 0.35938,0.3125 1.04688,0.3125 0.67187,0 1.20312,-0.29687 0.53125,-0.29688 0.78125,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 2.9906,3.46875 v -6.90625 h 1.04688 v 0.96875 q 0.32812,-0.51563 0.85937,-0.8125 0.54688,-0.3125 1.23438,-0.3125 0.78125,0 1.26562,0.3125 0.48438,0.3125 0.6875,0.89062 0.82813,-1.20312 2.14063,-1.20312 1.03125,0 1.57812,0.57812 0.5625,0.5625 0.5625,1.73438 v 4.75 h -1.17187 v -4.35938 q 0,-0.70312 -0.125,-1 -0.10938,-0.3125 -0.40625,-0.5 -0.29688,-0.1875 -0.70313,-0.1875 -0.71875,0 -1.20312,0.48438 -0.48438,0.48437 -0.48438,1.54687 v 4.01563 h -1.17187 v -4.48438 q 0,-0.78125 -0.29688,-1.17187 -0.28125,-0.39063 -0.92187,-0.39063 -0.5,0 -0.92188,0.26563 -0.42187,0.25 -0.60937,0.75 -0.1875,0.5 -0.1875,1.45312 v 3.57813 z m 15.83686,-2.21875 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z" + id="path55" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="M 164.11023,161.09973 H 272.51968 V 416.65878 H 164.11023 Z" + id="path57" + inkscape:connector-curvature="0" + style="fill:#d9ead3;fill-rule:evenodd" /> + <path + d="M 164.11023,161.09973 H 272.51968 V 416.65878 H 164.11023 Z" + id="path59" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 186.03761,297.92676 v -11.48438 h 1.28125 v 1.07813 q 0.45312,-0.64063 1.01562,-0.95313 0.57813,-0.3125 1.39063,-0.3125 1.0625,0 1.875,0.54688 0.8125,0.54687 1.21875,1.54687 0.42187,0.98438 0.42187,2.17188 0,1.28125 -0.46875,2.29687 -0.45312,1.01563 -1.32812,1.5625 -0.85938,0.54688 -1.82813,0.54688 -0.70312,0 -1.26562,-0.29688 -0.54688,-0.29687 -0.90625,-0.75 v 4.04688 z m 1.26562,-7.29688 q 0,1.60938 0.64063,2.375 0.65625,0.76563 1.57812,0.76563 0.9375,0 1.60938,-0.79688 0.67187,-0.79687 0.67187,-2.45312 0,-1.59375 -0.65625,-2.375 -0.65625,-0.79688 -1.5625,-0.79688 -0.89062,0 -1.59375,0.84375 -0.6875,0.84375 -0.6875,2.4375 z m 7.61719,4.10938 v -8.29688 h 1.26563 v 1.25 q 0.48437,-0.875 0.89062,-1.15625 0.40625,-0.28125 0.90625,-0.28125 0.70313,0 1.4375,0.45313 l -0.48437,1.29687 q -0.51563,-0.29687 -1.03125,-0.29687 -0.45313,0 -0.82813,0.28125 -0.35937,0.26562 -0.51562,0.76562 -0.23438,0.75 -0.23438,1.64063 v 4.34375 z m 4.8125,-4.15625 q 0,-2.29688 1.28125,-3.40625 1.07813,-0.92188 2.60938,-0.92188 1.71875,0 2.79687,1.125 1.09375,1.10938 1.09375,3.09375 0,1.59375 -0.48437,2.51563 -0.48438,0.92187 -1.40625,1.4375 -0.90625,0.5 -2,0.5 -1.73438,0 -2.8125,-1.10938 -1.07813,-1.125 -1.07813,-3.23437 z m 1.45313,0 q 0,1.59375 0.6875,2.39062 0.70312,0.79688 1.75,0.79688 1.04687,0 1.73437,-0.79688 0.70313,-0.79687 0.70313,-2.4375 0,-1.53125 -0.70313,-2.32812 -0.6875,-0.79688 -1.73437,-0.79688 -1.04688,0 -1.75,0.79688 -0.6875,0.78125 -0.6875,2.375 z m 13.38281,1.10937 1.39062,0.1875 q -0.23437,1.42188 -1.17187,2.23438 -0.92188,0.8125 -2.28125,0.8125 -1.70313,0 -2.75,-1.10938 -1.03125,-1.125 -1.03125,-3.20312 0,-1.34375 0.4375,-2.34375 0.45312,-1.01563 1.35937,-1.51563 0.92188,-0.5 1.98438,-0.5 1.35937,0 2.21875,0.6875 0.85937,0.67188 1.09375,1.9375 l -1.35938,0.20313 q -0.20312,-0.82813 -0.70312,-1.25 -0.48438,-0.42188 -1.1875,-0.42188 -1.0625,0 -1.73438,0.76563 -0.65625,0.75 -0.65625,2.40625 0,1.67187 0.64063,2.4375 0.64062,0.75 1.67187,0.75 0.82813,0 1.375,-0.5 0.5625,-0.51563 0.70313,-1.57813 z m 8.26562,0.375 1.45313,0.17188 q -0.34375,1.28125 -1.28125,1.98437 -0.92188,0.70313 -2.35938,0.70313 -1.82812,0 -2.89062,-1.125 -1.0625,-1.125 -1.0625,-3.14063 0,-2.09375 1.07812,-3.25 1.07813,-1.15625 2.79688,-1.15625 1.65625,0 2.70312,1.14063 1.0625,1.125 1.0625,3.17187 0,0.125 0,0.375 h -6.1875 q 0.0781,1.375 0.76563,2.10938 0.70312,0.71875 1.73437,0.71875 0.78125,0 1.32813,-0.40625 0.54687,-0.40625 0.85937,-1.29688 z m -4.60937,-2.28125 h 4.625 q -0.0937,-1.04687 -0.53125,-1.5625 -0.67188,-0.8125 -1.73438,-0.8125 -0.96875,0 -1.64062,0.65625 -0.65625,0.64063 -0.71875,1.71875 z m 7.27344,2.46875 1.39062,-0.21875 q 0.10938,0.84375 0.64063,1.29688 0.54687,0.4375 1.5,0.4375 0.96875,0 1.4375,-0.39063 0.46875,-0.40625 0.46875,-0.9375 0,-0.46875 -0.40625,-0.75 -0.29688,-0.1875 -1.4375,-0.46875 -1.54688,-0.39062 -2.15625,-0.67187 -0.59375,-0.29688 -0.90625,-0.79688 -0.29688,-0.5 -0.29688,-1.10937 0,-0.5625 0.25,-1.03125 0.25,-0.46875 0.6875,-0.78125 0.32813,-0.25 0.89063,-0.40625 0.57812,-0.17188 1.21875,-0.17188 0.98437,0 1.71875,0.28125 0.73437,0.28125 1.07812,0.76563 0.35938,0.46875 0.5,1.28125 l -1.375,0.1875 q -0.0937,-0.64063 -0.54687,-1 -0.45313,-0.35938 -1.26563,-0.35938 -0.96875,0 -1.39062,0.32813 -0.40625,0.3125 -0.40625,0.73437 0,0.28125 0.17187,0.5 0.17188,0.21875 0.53125,0.375 0.21875,0.0781 1.25,0.35938 1.48438,0.39062 2.07813,0.65625 0.59375,0.25 0.92187,0.73437 0.34375,0.48438 0.34375,1.20313 0,0.70312 -0.42187,1.32812 -0.40625,0.60938 -1.1875,0.95313 -0.76563,0.34375 -1.73438,0.34375 -1.625,0 -2.46875,-0.67188 -0.84375,-0.67187 -1.07812,-2 z m 8,0 1.39062,-0.21875 q 0.10938,0.84375 0.64063,1.29688 0.54687,0.4375 1.5,0.4375 0.96875,0 1.4375,-0.39063 0.46875,-0.40625 0.46875,-0.9375 0,-0.46875 -0.40625,-0.75 -0.29688,-0.1875 -1.4375,-0.46875 -1.54688,-0.39062 -2.15625,-0.67187 -0.59375,-0.29688 -0.90625,-0.79688 -0.29688,-0.5 -0.29688,-1.10937 0,-0.5625 0.25,-1.03125 0.25,-0.46875 0.6875,-0.78125 0.32813,-0.25 0.89063,-0.40625 0.57812,-0.17188 1.21875,-0.17188 0.98437,0 1.71875,0.28125 0.73437,0.28125 1.07812,0.76563 0.35938,0.46875 0.5,1.28125 l -1.375,0.1875 q -0.0937,-0.64063 -0.54687,-1 -0.45313,-0.35938 -1.26563,-0.35938 -0.96875,0 -1.39062,0.32813 -0.40625,0.3125 -0.40625,0.73437 0,0.28125 0.17187,0.5 0.17188,0.21875 0.53125,0.375 0.21875,0.0781 1.25,0.35938 1.48438,0.39062 2.07813,0.65625 0.59375,0.25 0.92187,0.73437 0.34375,0.48438 0.34375,1.20313 0,0.70312 -0.42187,1.32812 -0.40625,0.60938 -1.1875,0.95313 -0.76563,0.34375 -1.73438,0.34375 -1.625,0 -2.46875,-0.67188 -0.84375,-0.67187 -1.07812,-2 z m 11.25,5.85938 q -1.17188,-1.46875 -1.98438,-3.4375 -0.79687,-1.98438 -0.79687,-4.09375 0,-1.85938 0.60937,-3.5625 0.70313,-1.96875 2.17188,-3.9375 h 1 q -0.9375,1.625 -1.25,2.32812 -0.46875,1.07813 -0.75,2.25 -0.32813,1.45313 -0.32813,2.9375 0,3.75 2.32813,7.51563 z m 3.5625,0 h -1.01563 q 2.34375,-3.76563 2.34375,-7.51563 0,-1.46875 -0.34375,-2.92187 -0.26562,-1.17188 -0.73437,-2.25 -0.3125,-0.70313 -1.26563,-2.34375 h 1.01563 q 1.46875,1.96875 2.17187,3.9375 0.59375,1.70312 0.59375,3.5625 0,2.10937 -0.8125,4.09375 -0.79687,1.96875 -1.95312,3.4375 z" + id="path61" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 308.11023,161.09973 h 161.48032 v 141.7008 H 308.11023 Z" + id="path63" + inkscape:connector-curvature="0" + style="fill:#cfe2f3;fill-rule:evenodd" /> + <path + d="m 308.11023,161.09973 h 161.48032 v 141.7008 H 308.11023 Z" + id="path65" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 372.79996,224.29451 1.51562,0.375 q -0.46875,1.875 -1.71875,2.85937 -1.23437,0.98438 -3.01562,0.98438 -1.85938,0 -3.01563,-0.75 -1.15625,-0.76563 -1.76562,-2.1875 -0.60938,-1.4375 -0.60938,-3.07813 0,-1.79687 0.6875,-3.125 0.6875,-1.32812 1.9375,-2.01562 1.26563,-0.70313 2.78125,-0.70313 1.71875,0 2.89063,0.875 1.17187,0.875 1.64062,2.46875 l -1.5,0.34375 q -0.39062,-1.25 -1.15625,-1.8125 -0.75,-0.57812 -1.90625,-0.57812 -1.3125,0 -2.20312,0.64062 -0.89063,0.625 -1.25,1.70313 -0.35938,1.0625 -0.35938,2.1875 0,1.46875 0.42188,2.5625 0.4375,1.07812 1.32812,1.625 0.90625,0.53125 1.95313,0.53125 1.26562,0 2.14062,-0.73438 0.89063,-0.73437 1.20313,-2.17187 z m 2.67969,-0.14063 q 0,-2.29687 1.28125,-3.40625 1.07812,-0.92187 2.60937,-0.92187 1.71875,0 2.79688,1.125 1.09375,1.10937 1.09375,3.09375 0,1.59375 -0.48438,2.51562 -0.48437,0.92188 -1.40625,1.4375 -0.90625,0.5 -2,0.5 -1.73437,0 -2.8125,-1.10937 -1.07812,-1.125 -1.07812,-3.23438 z m 1.45312,0 q 0,1.59375 0.6875,2.39063 0.70313,0.79687 1.75,0.79687 1.04688,0 1.73438,-0.79687 0.70312,-0.79688 0.70312,-2.4375 0,-1.53125 -0.70312,-2.32813 -0.6875,-0.79687 -1.73438,-0.79687 -1.04687,0 -1.75,0.79687 -0.6875,0.78125 -0.6875,2.375 z m 7.97656,4.15625 v -8.29687 h 1.26563 v 1.17187 q 0.90625,-1.35937 2.64062,-1.35937 0.75,0 1.375,0.26562 0.625,0.26563 0.9375,0.70313 0.3125,0.4375 0.4375,1.04687 0.0781,0.39063 0.0781,1.35938 v 5.10937 h -1.40625 v -5.04687 q 0,-0.85938 -0.17188,-1.28125 -0.15625,-0.4375 -0.57812,-0.6875 -0.40625,-0.25 -0.96875,-0.25 -0.90625,0 -1.5625,0.57812 -0.64063,0.5625 -0.64063,2.15625 v 4.53125 z m 11.96094,-1.26562 0.20313,1.25 q -0.59375,0.125 -1.0625,0.125 -0.76563,0 -1.1875,-0.23438 -0.42188,-0.25 -0.59375,-0.64062 -0.17188,-0.40625 -0.17188,-1.67188 v -4.76562 h -1.03125 v -1.09375 h 1.03125 v -2.0625 l 1.40625,-0.84375 v 2.90625 h 1.40625 v 1.09375 h -1.40625 v 4.84375 q 0,0.60937 0.0625,0.78125 0.0781,0.17187 0.25,0.28125 0.17188,0.0937 0.48438,0.0937 0.23437,0 0.60937,-0.0625 z m 7.05469,-1.40625 1.45312,0.17187 q -0.34375,1.28125 -1.28125,1.98438 -0.92187,0.70312 -2.35937,0.70312 -1.82813,0 -2.89063,-1.125 -1.0625,-1.125 -1.0625,-3.14062 0,-2.09375 1.07813,-3.25 1.07812,-1.15625 2.79687,-1.15625 1.65625,0 2.70313,1.14062 1.0625,1.125 1.0625,3.17188 0,0.125 0,0.375 h -6.1875 q 0.0781,1.375 0.76562,2.10937 0.70313,0.71875 1.73438,0.71875 0.78125,0 1.32812,-0.40625 0.54688,-0.40625 0.85938,-1.29687 z m -4.60938,-2.28125 h 4.625 q -0.0937,-1.04688 -0.53125,-1.5625 -0.67187,-0.8125 -1.73437,-0.8125 -0.96875,0 -1.64063,0.65625 -0.65625,0.64062 -0.71875,1.71875 z m 6.89844,4.95312 3.03125,-4.3125 -2.8125,-3.98437 h 1.76563 l 1.26562,1.9375 q 0.35938,0.5625 0.57813,0.9375 0.34375,-0.51563 0.64062,-0.92188 l 1.39063,-1.95312 h 1.6875 l -2.875,3.90625 3.09375,4.39062 h -1.73438 l -1.70312,-2.57812 -0.45313,-0.70313 -2.17187,3.28125 z m 12,-1.26562 0.20313,1.25 q -0.59375,0.125 -1.0625,0.125 -0.76563,0 -1.1875,-0.23438 -0.42188,-0.25 -0.59375,-0.64062 -0.17188,-0.40625 -0.17188,-1.67188 v -4.76562 h -1.03125 v -1.09375 h 1.03125 v -2.0625 l 1.40625,-0.84375 v 2.90625 h 1.40625 v 1.09375 h -1.40625 v 4.84375 q 0,0.60937 0.0625,0.78125 0.0781,0.17187 0.25,0.28125 0.17188,0.0937 0.48438,0.0937 0.23437,0 0.60937,-0.0625 z" + id="path67" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="M 364.5812,247.31013 V 235.857 h 2.28125 l 2.71875,8.10938 q 0.375,1.125 0.54688,1.6875 0.1875,-0.625 0.60937,-1.82813 l 2.73438,-7.96875 h 2.04687 v 11.45313 h -1.46875 v -9.59375 l -3.32812,9.59375 h -1.35938 l -3.3125,-9.75 v 9.75 z m 18.875,-2.67188 1.45313,0.17188 q -0.34375,1.28125 -1.28125,1.98437 -0.92188,0.70313 -2.35938,0.70313 -1.82812,0 -2.89062,-1.125 -1.0625,-1.125 -1.0625,-3.14063 0,-2.09375 1.07812,-3.25 1.07813,-1.15625 2.79688,-1.15625 1.65625,0 2.70312,1.14063 1.0625,1.125 1.0625,3.17187 0,0.125 0,0.375 h -6.1875 q 0.0781,1.375 0.76563,2.10938 0.70312,0.71875 1.73437,0.71875 0.78125,0 1.32813,-0.40625 0.54687,-0.40625 0.85937,-1.29688 z m -4.60937,-2.28125 h 4.625 q -0.0937,-1.04687 -0.53125,-1.5625 -0.67188,-0.8125 -1.73438,-0.8125 -0.96875,0 -1.64062,0.65625 -0.65625,0.64063 -0.71875,1.71875 z m 7.83593,4.95313 v -8.29688 h 1.25 v 1.15625 q 0.39063,-0.60937 1.03125,-0.96875 0.65625,-0.375 1.48438,-0.375 0.92187,0 1.51562,0.39063 0.59375,0.375 0.82813,1.0625 0.98437,-1.45313 2.5625,-1.45313 1.23437,0 1.89062,0.6875 0.67188,0.67188 0.67188,2.09375 v 5.70313 h -1.39063 v -5.23438 q 0,-0.84375 -0.14062,-1.20312 -0.14063,-0.375 -0.5,-0.59375 -0.35938,-0.23438 -0.84375,-0.23438 -0.875,0 -1.45313,0.57813 -0.57812,0.57812 -0.57812,1.85937 v 4.82813 h -1.40625 v -5.39063 q 0,-0.9375 -0.34375,-1.40625 -0.34375,-0.46875 -1.125,-0.46875 -0.59375,0 -1.09375,0.3125 -0.5,0.3125 -0.73438,0.92188 -0.21875,0.59375 -0.21875,1.71875 v 4.3125 z m 12.79688,-4.15625 q 0,-2.29688 1.28125,-3.40625 1.07812,-0.92188 2.60937,-0.92188 1.71875,0 2.79688,1.125 1.09375,1.10938 1.09375,3.09375 0,1.59375 -0.48438,2.51563 -0.48437,0.92187 -1.40625,1.4375 -0.90625,0.5 -2,0.5 -1.73437,0 -2.8125,-1.10938 -1.07812,-1.125 -1.07812,-3.23437 z m 1.45312,0 q 0,1.59375 0.6875,2.39062 0.70313,0.79688 1.75,0.79688 1.04688,0 1.73438,-0.79688 0.70312,-0.79687 0.70312,-2.4375 0,-1.53125 -0.70312,-2.32812 -0.6875,-0.79688 -1.73438,-0.79688 -1.04687,0 -1.75,0.79688 -0.6875,0.78125 -0.6875,2.375 z m 7.96094,4.15625 v -8.29688 h 1.26563 v 1.25 q 0.48437,-0.875 0.89062,-1.15625 0.40625,-0.28125 0.90625,-0.28125 0.70313,0 1.4375,0.45313 l -0.48437,1.29687 q -0.51563,-0.29687 -1.03125,-0.29687 -0.45313,0 -0.82813,0.28125 -0.35937,0.26562 -0.51562,0.76562 -0.23438,0.75 -0.23438,1.64063 v 4.34375 z m 5.28125,3.20312 -0.15625,-1.32812 q 0.45313,0.125 0.79688,0.125 0.46875,0 0.75,-0.15625 0.28125,-0.15625 0.46875,-0.4375 0.125,-0.20313 0.42187,-1.04688 0.0469,-0.10937 0.125,-0.34375 l -3.14062,-8.3125 h 1.51562 l 1.71875,4.79688 q 0.34375,0.92187 0.60938,1.92187 0.23437,-0.96875 0.57812,-1.89062 l 1.76563,-4.82813 h 1.40625 l -3.15625,8.4375 q -0.5,1.375 -0.78125,1.89063 -0.375,0.6875 -0.85938,1.01562 -0.48437,0.32813 -1.15625,0.32813 -0.40625,0 -0.90625,-0.17188 z" + id="path69" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 308.11023,334.86877 h 74.4567 v 80.97638 h -74.4567 z" + id="path71" + inkscape:connector-curvature="0" + style="fill:#f4cccc;fill-rule:evenodd" /> + <path + d="m 308.11023,334.86877 h 74.4567 v 80.97638 h -74.4567 z" + id="path73" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 330.8464,371.3732 v -1.60938 h 1.40625 v 1.60938 z m 0,9.84375 v -8.29688 h 1.40625 v 8.29688 z m 3.55469,0 v -8.29688 h 1.26562 v 1.17188 q 0.90625,-1.35938 2.64063,-1.35938 0.75,0 1.375,0.26563 0.625,0.26562 0.9375,0.70312 0.3125,0.4375 0.4375,1.04688 0.0781,0.39062 0.0781,1.35937 v 5.10938 h -1.40625 v -5.04688 q 0,-0.85937 -0.17187,-1.28125 -0.15625,-0.4375 -0.57813,-0.6875 -0.40625,-0.25 -0.96875,-0.25 -0.90625,0 -1.5625,0.57813 -0.64062,0.5625 -0.64062,2.15625 v 4.53125 z m 8.89844,-9.84375 v -1.60938 h 1.40625 v 1.60938 z m 0,9.84375 v -8.29688 h 1.40625 v 8.29688 z m 6.61718,-1.26563 0.20313,1.25 q -0.59375,0.125 -1.0625,0.125 -0.76563,0 -1.1875,-0.23437 -0.42188,-0.25 -0.59375,-0.64063 -0.17188,-0.40625 -0.17188,-1.67187 v -4.76563 h -1.03125 v -1.09375 h 1.03125 v -2.0625 l 1.40625,-0.84375 v 2.90625 h 1.40625 v 1.09375 h -1.40625 v 4.84375 q 0,0.60938 0.0625,0.78125 0.0781,0.17188 0.25,0.28125 0.17188,0.0937 0.48438,0.0937 0.23437,0 0.60937,-0.0625 z m 4.07032,4.64063 q -1.17188,-1.46875 -1.98438,-3.4375 -0.79687,-1.98438 -0.79687,-4.09375 0,-1.85938 0.60937,-3.5625 0.70313,-1.96875 2.17188,-3.9375 h 1 q -0.9375,1.625 -1.25,2.32812 -0.46875,1.07813 -0.75,2.25 -0.32813,1.45313 -0.32813,2.9375 0,3.75 2.32813,7.51563 z m 3.5625,0 h -1.01563 q 2.34375,-3.76563 2.34375,-7.51563 0,-1.46875 -0.34375,-2.92187 -0.26562,-1.17188 -0.73437,-2.25 -0.3125,-0.70313 -1.26563,-2.34375 h 1.01563 q 1.46875,1.96875 2.17187,3.9375 0.59375,1.70312 0.59375,3.5625 0,2.10937 -0.8125,4.09375 -0.79687,1.96875 -1.95312,3.4375 z" + id="path75" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 395.14435,334.86877 h 74.4567 v 80.97638 h -74.4567 z" + id="path77" + inkscape:connector-curvature="0" + style="fill:#f4cccc;fill-rule:evenodd" /> + <path + d="m 395.14435,334.86877 h 74.4567 v 80.97638 h -74.4567 z" + id="path79" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 418.20865,381.21695 v -7.20313 h -1.23438 v -1.09375 h 1.23438 v -0.89062 q 0,-0.82813 0.15625,-1.23438 0.20312,-0.54687 0.70312,-0.89062 0.51563,-0.34375 1.4375,-0.34375 0.59375,0 1.3125,0.14062 l -0.20312,1.23438 q -0.4375,-0.0781 -0.82813,-0.0781 -0.64062,0 -0.90625,0.28125 -0.26562,0.26563 -0.26562,1.01563 v 0.76562 h 1.60937 v 1.09375 h -1.60937 v 7.20313 z m 4.11719,-9.84375 v -1.60938 h 1.40625 v 1.60938 z m 0,9.84375 v -8.29688 h 1.40625 v 8.29688 z m 3.55468,0 v -8.29688 h 1.26563 v 1.17188 q 0.90625,-1.35938 2.64062,-1.35938 0.75,0 1.375,0.26563 0.625,0.26562 0.9375,0.70312 0.3125,0.4375 0.4375,1.04688 0.0781,0.39062 0.0781,1.35937 v 5.10938 h -1.40625 v -5.04688 q 0,-0.85937 -0.17188,-1.28125 -0.15625,-0.4375 -0.57812,-0.6875 -0.40625,-0.25 -0.96875,-0.25 -0.90625,0 -1.5625,0.57813 -0.64063,0.5625 -0.64063,2.15625 v 4.53125 z m 8.89844,-9.84375 v -1.60938 h 1.40625 v 1.60938 z m 0,9.84375 v -8.29688 h 1.40625 v 8.29688 z m 6.24219,3.375 q -1.17188,-1.46875 -1.98438,-3.4375 -0.79687,-1.98438 -0.79687,-4.09375 0,-1.85938 0.60937,-3.5625 0.70313,-1.96875 2.17188,-3.9375 h 1 q -0.9375,1.625 -1.25,2.32812 -0.46875,1.07813 -0.75,2.25 -0.32813,1.45313 -0.32813,2.9375 0,3.75 2.32813,7.51563 z m 3.5625,0 h -1.01563 q 2.34375,-3.76563 2.34375,-7.51563 0,-1.46875 -0.34375,-2.92187 -0.26562,-1.17188 -0.73437,-2.25 -0.3125,-0.70313 -1.26563,-2.34375 h 1.01563 q 1.46875,1.96875 2.17187,3.9375 0.59375,1.70312 0.59375,3.5625 0,2.10937 -0.8125,4.09375 -0.79687,1.96875 -1.95312,3.4375 z" + id="path81" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 272.51968,240.83989 6.33072,-6.3307 v 3.16536 h 22.92914 v -3.16536 l 6.33069,6.3307 -6.33069,6.33072 v -3.16536 H 278.8504 v 3.16536 z" + id="path83" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 272.51968,240.83989 6.33072,-6.3307 v 3.16536 h 22.92914 v -3.16536 l 6.33069,6.3307 -6.33069,6.33072 v -3.16536 H 278.8504 v 3.16536 z" + id="path85" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 344.71915,308.78217 3.16537,-3.16537 3.16535,3.16537 h -1.58267 v 18.86612 h 1.58267 l -3.16535,3.16537 -3.16537,-3.16537 h 1.5827 v -18.86612 z" + id="path87" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 344.71915,308.78217 3.16537,-3.16537 3.16535,3.16537 h -1.58267 v 18.86612 h 1.58267 l -3.16535,3.16537 -3.16537,-3.16537 h 1.5827 v -18.86612 z" + id="path89" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 424.71915,308.78217 3.16537,-3.16537 3.16535,3.16537 h -1.58267 v 18.86612 h 1.58267 l -3.16535,3.16537 -3.16537,-3.16537 h 1.5827 v -18.86612 z" + id="path91" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 424.71915,308.78217 3.16537,-3.16537 3.16535,3.16537 h -1.58267 v 18.86612 h 1.58267 l -3.16535,3.16537 -3.16537,-3.16537 h 1.5827 v -18.86612 z" + id="path93" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 532.8373,210.97375 h 99.40155 v 27.46457 H 532.8373 Z" + id="path95" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 542.7123,232.77376 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26563,0.35937 0.375,0.85937 0.0625,0.32813 0.0625,1.14063 v 4.25 h -1.17187 v -4.20313 q 0,-0.71875 -0.14063,-1.0625 -0.14062,-0.35937 -0.48437,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29688,0.46875 -0.54687,0.46875 -0.54687,1.79688 v 3.78125 z m 12.14685,-2.21875 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 5.7406,4.125 2.53125,-3.59375 -2.34375,-3.3125 h 1.46875 l 1.0625,1.60937 q 0.29688,0.46875 0.48438,0.78125 0.28125,-0.4375 0.51562,-0.76562 l 1.17188,-1.625 h 1.40625 l -2.39063,3.25 2.5625,3.65625 h -1.4375 l -1.42187,-2.14063 -0.375,-0.59375 -1.8125,2.73438 z m 10.00781,-1.04688 0.17188,1.03125 q -0.5,0.10938 -0.89063,0.10938 -0.64062,0 -1,-0.20313 -0.34375,-0.20312 -0.48437,-0.53125 -0.14063,-0.32812 -0.14063,-1.39062 v -3.96875 h -0.85937 v -0.90625 h 0.85937 v -1.71875 l 1.17188,-0.70313 v 2.42188 h 1.17187 v 0.90625 h -1.17187 v 4.04687 q 0,0.5 0.0469,0.64063 0.0625,0.14062 0.20313,0.23437 0.14062,0.0781 0.40625,0.0781 0.20312,0 0.51562,-0.0469 z m 0.0624,3.70313 v -0.85938 h 7.76563 v 0.85938 z m 8.4906,-2.65625 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26563,0.35937 0.375,0.85937 0.0625,0.32813 0.0625,1.14063 v 4.25 h -1.17187 v -4.20313 q 0,-0.71875 -0.14063,-1.0625 -0.14062,-0.35937 -0.48437,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29688,0.46875 -0.54687,0.46875 -0.54687,1.79688 v 3.78125 z m 6.97498,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.13123,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45313 -0.6875,-0.45312 -1.07812,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45312 1.54687,-0.45312 0.625,0 1.10938,0.26562 0.5,0.25 0.79687,0.67188 v -3.42188 h 1.17188 v 9.54688 z m -3.70313,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54687,-2.07813 -0.54688,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51563,0.625 -0.51563,2 z m 11.36561,1.23438 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 6.0531,2.0625 1.15625,-0.1875 q 0.10937,0.70312 0.54687,1.07812 0.45313,0.35938 1.25,0.35938 0.8125,0 1.20313,-0.32813 0.39062,-0.32812 0.39062,-0.76562 0,-0.39063 -0.35937,-0.625 -0.23438,-0.15625 -1.1875,-0.39063 -1.29688,-0.32812 -1.79688,-0.5625 -0.48437,-0.25 -0.75,-0.65625 -0.25,-0.42187 -0.25,-0.9375 0,-0.45312 0.20313,-0.84375 0.21875,-0.40625 0.57812,-0.67187 0.28125,-0.1875 0.75,-0.32813 0.46875,-0.14062 1.01563,-0.14062 0.8125,0 1.42187,0.23437 0.60938,0.23438 0.90625,0.64063 0.29688,0.39062 0.40625,1.0625 l -1.14062,0.15625 q -0.0781,-0.53125 -0.45313,-0.82813 -0.375,-0.3125 -1.0625,-0.3125 -0.8125,0 -1.15625,0.26563 -0.34375,0.26562 -0.34375,0.625 0,0.23437 0.14063,0.42187 0.15625,0.1875 0.45312,0.3125 0.17188,0.0625 1.03125,0.29688 1.25,0.32812 1.73438,0.54687 0.5,0.20313 0.78125,0.60938 0.28125,0.40625 0.28125,1 0,0.59375 -0.34375,1.10937 -0.34375,0.51563 -1,0.79688 -0.64063,0.28125 -1.45313,0.28125 -1.34375,0 -2.04687,-0.5625 -0.70313,-0.5625 -0.90625,-1.65625 z m 7.16406,4.71875 v -12.20313 h 2.57812 v 0.96875 h -1.40625 v 10.25 h 1.40625 v 0.98438 z m 5.64044,0 h -2.59375 v -0.98438 h 1.42188 v -10.25 h -1.42188 v -0.96875 h 2.59375 z" + id="path97" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 526.56824,415.85303 c -7.18402,0 -13.00787,-0.97061 -13.00787,-2.16791 v -85.33349 c 0,-1.1973 -5.82383,-2.16791 -13.00788,-2.16791 v 0 c 7.18405,0 13.00788,-0.97058 13.00788,-2.16788 v -85.33351 0 c 0,-1.19729 5.82385,-2.16789 13.00787,-2.16789 z" + id="path99" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 526.56824,415.85303 c -7.18402,0 -13.00787,-0.97061 -13.00787,-2.16791 v -85.33349 c 0,-1.1973 -5.82383,-2.16791 -13.00788,-2.16791 v 0 c 7.18405,0 13.00788,-0.97058 13.00788,-2.16788 v -85.33351 0 c 0,-1.19729 5.82385,-2.16789 13.00787,-2.16789" + id="path101" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 526.56824,415.85303 c -7.18402,0 -13.00787,-0.97061 -13.00787,-2.16791 v -85.33349 c 0,-1.1973 -5.82383,-2.16791 -13.00788,-2.16791 v 0 c 7.18405,0 13.00788,-0.97058 13.00788,-2.16788 v -85.33351 0 c 0,-1.19729 5.82385,-2.16789 13.00787,-2.16789" + id="path103" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 445.60104,298.39108 h 99.40158 v 27.46457 h -99.40158 z" + id="path105" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 455.39792,318.91107 v -6.21875 h 0.9375 v 0.875 q 0.6875,-1.01563 1.98437,-1.01563 0.5625,0 1.03125,0.20313 0.48438,0.20312 0.71875,0.53125 0.23438,0.32812 0.32813,0.76562 0.0469,0.29688 0.0469,1.03125 v 3.82813 h -1.04687 v -3.78125 q 0,-0.65625 -0.125,-0.96875 -0.125,-0.3125 -0.4375,-0.5 -0.3125,-0.20313 -0.73438,-0.20313 -0.67187,0 -1.17187,0.4375 -0.48438,0.42188 -0.48438,1.60938 v 3.40625 z m 7.64258,0 h -0.98438 v -8.59375 h 1.0625 v 3.0625 q 0.67188,-0.82813 1.70313,-0.82813 0.57812,0 1.07812,0.23438 0.51563,0.21875 0.84375,0.64062 0.34375,0.42188 0.53125,1.01563 0.1875,0.59375 0.1875,1.26562 0,1.59375 -0.79687,2.46875 -0.79688,0.875 -1.89063,0.875 -1.10937,0 -1.73437,-0.92187 z m -0.0156,-3.15625 q 0,1.10937 0.3125,1.60937 0.5,0.8125 1.34375,0.8125 0.6875,0 1.1875,-0.59375 0.51563,-0.59375 0.51563,-1.79687 0,-1.21875 -0.48438,-1.79688 -0.48437,-0.57812 -1.17187,-0.57812 -0.6875,0 -1.20313,0.60937 -0.5,0.59375 -0.5,1.73438 z m 4.73633,5.54687 v -0.76562 h 7 v 0.76562 z m 11.9082,-4.39062 1.09375,0.125 q -0.25,0.95312 -0.95312,1.48437 -0.70313,0.53125 -1.78125,0.53125 -1.35938,0 -2.17188,-0.84375 -0.79687,-0.84375 -0.79687,-2.35937 0,-1.5625 0.8125,-2.42188 0.8125,-0.875 2.09375,-0.875 1.25,0 2.03125,0.84375 0.79687,0.84375 0.79687,2.39063 0,0.0937 0,0.28125 h -4.64062 q 0.0625,1.03125 0.57812,1.57812 0.51563,0.53125 1.29688,0.53125 0.57812,0 0.98437,-0.29687 0.42188,-0.3125 0.65625,-0.96875 z m -3.45312,-1.70313 h 3.46875 q -0.0625,-0.79687 -0.39063,-1.1875 -0.51562,-0.60937 -1.3125,-0.60937 -0.73437,0 -1.23437,0.48437 -0.48438,0.48438 -0.53125,1.3125 z m 9.9082,3.70313 v -0.78125 q -0.59375,0.92187 -1.73437,0.92187 -0.75,0 -1.375,-0.40625 -0.625,-0.42187 -0.96875,-1.15625 -0.34375,-0.73437 -0.34375,-1.6875 0,-0.92187 0.3125,-1.6875 0.3125,-0.76562 0.9375,-1.15625 0.625,-0.40625 1.39062,-0.40625 0.5625,0 1,0.23438 0.4375,0.23437 0.71875,0.60937 v -3.07812 h 1.04688 v 8.59375 z m -3.32812,-3.10938 q 0,1.20313 0.5,1.79688 0.5,0.57812 1.1875,0.57812 0.6875,0 1.17187,-0.5625 0.48438,-0.5625 0.48438,-1.71875 0,-1.28125 -0.5,-1.875 -0.48438,-0.59375 -1.20313,-0.59375 -0.70312,0 -1.17187,0.57813 -0.46875,0.5625 -0.46875,1.79687 z m 5.76758,3.625 1.03125,0.15625 q 0.0625,0.46875 0.35937,0.6875 0.39063,0.29688 1.0625,0.29688 0.73438,0 1.125,-0.29688 0.40625,-0.29687 0.54688,-0.8125 0.0937,-0.32812 0.0781,-1.35937 -0.6875,0.8125 -1.71875,0.8125 -1.28125,0 -1.98437,-0.92188 -0.70313,-0.9375 -0.70313,-2.21875 0,-0.89062 0.3125,-1.64062 0.32813,-0.76563 0.9375,-1.17188 0.60938,-0.40625 1.4375,-0.40625 1.10938,0 1.82813,0.89063 v -0.75 h 0.96875 v 5.375 q 0,1.45312 -0.29688,2.0625 -0.29687,0.60937 -0.9375,0.95312 -0.64062,0.35938 -1.57812,0.35938 -1.10938,0 -1.79688,-0.5 -0.6875,-0.5 -0.67187,-1.51563 z m 0.875,-3.73437 q 0,1.21875 0.48437,1.78125 0.48438,0.5625 1.21875,0.5625 0.73438,0 1.21875,-0.5625 0.5,-0.5625 0.5,-1.75 0,-1.14063 -0.51562,-1.71875 -0.5,-0.57813 -1.21875,-0.57813 -0.70313,0 -1.20313,0.57813 -0.48437,0.5625 -0.48437,1.6875 z m 10.25195,1.21875 1.09375,0.125 q -0.25,0.95312 -0.95313,1.48437 -0.70312,0.53125 -1.78125,0.53125 -1.35937,0 -2.17187,-0.84375 -0.79688,-0.84375 -0.79688,-2.35937 0,-1.5625 0.8125,-2.42188 0.8125,-0.875 2.09375,-0.875 1.25,0 2.03125,0.84375 0.79688,0.84375 0.79688,2.39063 0,0.0937 0,0.28125 h -4.64063 q 0.0625,1.03125 0.57813,1.57812 0.51562,0.53125 1.29687,0.53125 0.57813,0 0.98438,-0.29687 0.42187,-0.3125 0.65625,-0.96875 z m -3.45313,-1.70313 h 3.46875 q -0.0625,-0.79687 -0.39062,-1.1875 -0.51563,-0.60937 -1.3125,-0.60937 -0.73438,0 -1.23438,0.48437 -0.48437,0.48438 -0.53125,1.3125 z m 5.45508,1.84375 1.03125,-0.15625 q 0.0937,0.625 0.48438,0.95313 0.40625,0.32812 1.14062,0.32812 0.71875,0 1.0625,-0.28125 0.35938,-0.29687 0.35938,-0.70312 0,-0.35938 -0.3125,-0.5625 -0.21875,-0.14063 -1.07813,-0.35938 -1.15625,-0.29687 -1.60937,-0.5 -0.4375,-0.21875 -0.67188,-0.59375 -0.23437,-0.375 -0.23437,-0.84375 0,-0.40625 0.1875,-0.76562 0.1875,-0.35938 0.51562,-0.59375 0.25,-0.17188 0.67188,-0.29688 0.42187,-0.125 0.92187,-0.125 0.71875,0 1.26563,0.21875 0.5625,0.20313 0.82812,0.5625 0.26563,0.35938 0.35938,0.95313 l -1.03125,0.14062 q -0.0625,-0.46875 -0.40625,-0.73437 -0.32813,-0.28125 -0.95313,-0.28125 -0.71875,0 -1.03125,0.25 -0.3125,0.23437 -0.3125,0.5625 0,0.20312 0.125,0.35937 0.14063,0.17188 0.40625,0.28125 0.15625,0.0625 0.9375,0.26563 1.125,0.3125 1.5625,0.5 0.4375,0.1875 0.6875,0.54687 0.25,0.35938 0.25,0.90625 0,0.53125 -0.3125,1 -0.29687,0.45313 -0.875,0.71875 -0.57812,0.25 -1.3125,0.25 -1.21875,0 -1.85937,-0.5 -0.625,-0.51562 -0.79688,-1.5 z" + id="path107" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="M 89.115486,28.062992 H 289.55644 V 55.527557 H 89.115486 Z" + id="path109" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 98.084236,54.98299 5.125004,-13.359375 h 1.90625 l 5.46875,13.359375 h -2.01563 l -1.54687,-4.046875 h -5.59375 l -1.468754,4.046875 z m 3.859374,-5.484375 h 4.53125 l -1.40625,-3.703125 q -0.625,-1.6875 -0.9375,-2.765625 -0.26562,1.28125 -0.71875,2.546875 z m 9.84982,5.484375 v -9.671875 h 1.46875 v 1.375 q 1.0625,-1.59375 3.07813,-1.59375 0.875,0 1.60937,0.3125 0.73438,0.3125 1.09375,0.828125 0.375,0.5 0.51563,1.203125 0.0937,0.453125 0.0937,1.59375 v 5.953125 h -1.64063 v -5.890625 q 0,-1 -0.20312,-1.484375 -0.1875,-0.5 -0.67188,-0.796875 -0.48437,-0.296875 -1.14062,-0.296875 -1.04688,0 -1.8125,0.671875 -0.75,0.65625 -0.75,2.515625 v 5.28125 z m 16.68821,-1.1875 q -0.92186,0.765625 -1.76561,1.09375 -0.82813,0.3125 -1.79688,0.3125 -1.59375,0 -2.45312,-0.78125 -0.85938,-0.78125 -0.85938,-1.984375 0,-0.71875 0.32813,-1.296875 0.32812,-0.59375 0.84375,-0.9375 0.53125,-0.359375 1.1875,-0.546875 0.46875,-0.125 1.45312,-0.25 1.98438,-0.234375 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.421875 0,-1 -0.46874,-1.421875 -0.625,-0.546875 -1.875,-0.546875 -1.15625,0 -1.70312,0.40625 -0.54688,0.40625 -0.8125,1.421875 l -1.60938,-0.21875 q 0.21875,-1.015625 0.71875,-1.640625 0.5,-0.640625 1.45313,-0.984375 0.95312,-0.34375 2.1875,-0.34375 1.25,0 2.01561,0.296875 0.78125,0.28125 1.14063,0.734375 0.375,0.4375 0.51562,1.109375 0.0781,0.421875 0.0781,1.515625 v 2.1875 q 0,2.28125 0.10937,2.890625 0.10938,0.59375 0.40625,1.15625 h -1.70312 q -0.26563,-0.515625 -0.32813,-1.1875 z m -0.14062,-3.671875 q -0.89062,0.375 -2.67187,0.625 -1.01562,0.140625 -1.4375,0.328125 -0.42187,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45313,0.4375 0.9375,0 1.67187,-0.40625 0.75,-0.421875 1.09374,-1.140625 0.26563,-0.5625 0.26563,-1.640625 z m 7.78197,3.390625 0.23437,1.453125 q -0.6875,0.140625 -1.23437,0.140625 -0.89063,0 -1.39063,-0.28125 -0.48437,-0.28125 -0.6875,-0.734375 -0.20312,-0.46875 -0.20312,-1.9375 V 46.57674 h -1.20313 v -1.265625 h 1.20313 V 42.92049 l 1.625,-0.984375 v 3.375 h 1.65625 v 1.265625 h -1.65625 v 5.671875 q 0,0.6875 0.0781,0.890625 0.0937,0.203125 0.28125,0.328125 0.20313,0.109375 0.57813,0.109375 0.26562,0 0.71875,-0.0625 z m 0.9958,-3.375 q 0,-2.6875 1.48437,-3.96875 1.25,-1.078125 3.04688,-1.078125 2,0 3.26562,1.3125 1.26563,1.296875 1.26563,3.609375 0,1.859375 -0.5625,2.9375 -0.5625,1.0625 -1.64063,1.65625 -1.0625,0.59375 -2.32812,0.59375 -2.03125,0 -3.28125,-1.296875 -1.25,-1.3125 -1.25,-3.765625 z m 1.6875,0 q 0,1.859375 0.79687,2.796875 0.8125,0.921875 2.04688,0.921875 1.21875,0 2.03125,-0.921875 0.8125,-0.9375 0.8125,-2.84375 0,-1.796875 -0.8125,-2.71875 -0.8125,-0.921875 -2.03125,-0.921875 -1.23438,0 -2.04688,0.921875 -0.79687,0.90625 -0.79687,2.765625 z m 9.29759,4.84375 v -9.671875 h 1.46875 v 1.359375 q 0.45313,-0.71875 1.20313,-1.140625 0.76562,-0.4375 1.71875,-0.4375 1.07812,0 1.76562,0.453125 0.6875,0.4375 0.96875,1.234375 1.15625,-1.6875 2.98438,-1.6875 1.45312,0 2.21875,0.796875 0.78125,0.796875 0.78125,2.453125 v 6.640625 h -1.64063 v -6.09375 q 0,-0.984375 -0.15625,-1.40625 -0.15625,-0.4375 -0.57812,-0.703125 -0.42188,-0.265625 -0.98438,-0.265625 -1.01562,0 -1.6875,0.6875 -0.67187,0.671875 -0.67187,2.15625 v 5.625 h -1.64063 v -6.28125 q 0,-1.09375 -0.40625,-1.640625 -0.40625,-0.546875 -1.3125,-0.546875 -0.6875,0 -1.28125,0.359375 -0.59375,0.359375 -0.85937,1.0625 -0.25,0.703125 -0.25,2.03125 v 5.015625 z m 15.46268,3.71875 -0.1875,-1.53125 q 0.54687,0.140625 0.9375,0.140625 0.54687,0 0.875,-0.1875 0.32812,-0.171875 0.54687,-0.5 0.15625,-0.25 0.5,-1.21875 0.0469,-0.140625 0.14063,-0.40625 l -3.67188,-9.6875 h 1.76563 l 2.01562,5.59375 q 0.39063,1.078125 0.70313,2.25 0.28125,-1.125 0.67187,-2.203125 l 2.07813,-5.640625 h 1.64062 l -3.6875,9.828125 q -0.59375,1.609375 -0.92187,2.203125 -0.4375,0.8125 -1,1.1875 -0.5625,0.375 -1.34375,0.375 -0.48438,0 -1.0625,-0.203125 z m 13.98018,-8.5625 q 0,-2.6875 1.48437,-3.96875 1.25,-1.078125 3.04688,-1.078125 2,0 3.26562,1.3125 1.26563,1.296875 1.26563,3.609375 0,1.859375 -0.5625,2.9375 -0.5625,1.0625 -1.64063,1.65625 -1.0625,0.59375 -2.32812,0.59375 -2.03125,0 -3.28125,-1.296875 -1.25,-1.3125 -1.25,-3.765625 z m 1.6875,0 q 0,1.859375 0.79687,2.796875 0.8125,0.921875 2.04688,0.921875 1.21875,0 2.03125,-0.921875 0.8125,-0.9375 0.8125,-2.84375 0,-1.796875 -0.8125,-2.71875 -0.8125,-0.921875 -2.03125,-0.921875 -1.23438,0 -2.04688,0.921875 -0.79687,0.90625 -0.79687,2.765625 z m 9.68821,4.84375 v -8.40625 h -1.45312 v -1.265625 h 1.45312 v -1.03125 q 0,-0.96875 0.17188,-1.453125 0.23437,-0.640625 0.82812,-1.03125 0.59375,-0.390625 1.67188,-0.390625 0.6875,0 1.53125,0.15625 l -0.25,1.4375 q -0.5,-0.09375 -0.95313,-0.09375 -0.75,0 -1.0625,0.328125 -0.3125,0.3125 -0.3125,1.1875 v 0.890625 h 1.89063 v 1.265625 h -1.89063 v 8.40625 z m 16.28849,-1.1875 q -0.92188,0.765625 -1.76563,1.09375 -0.82812,0.3125 -1.79687,0.3125 -1.59375,0 -2.45313,-0.78125 -0.85937,-0.78125 -0.85937,-1.984375 0,-0.71875 0.32812,-1.296875 0.32813,-0.59375 0.84375,-0.9375 0.53125,-0.359375 1.1875,-0.546875 0.46875,-0.125 1.45313,-0.25 1.98437,-0.234375 2.92187,-0.5625 0.0156,-0.34375 0.0156,-0.421875 0,-1 -0.46875,-1.421875 -0.625,-0.546875 -1.875,-0.546875 -1.15625,0 -1.70313,0.40625 -0.54687,0.40625 -0.8125,1.421875 l -1.60937,-0.21875 q 0.21875,-1.015625 0.71875,-1.640625 0.5,-0.640625 1.45312,-0.984375 0.95313,-0.34375 2.1875,-0.34375 1.25,0 2.01563,0.296875 0.78125,0.28125 1.14062,0.734375 0.375,0.4375 0.51563,1.109375 0.0781,0.421875 0.0781,1.515625 v 2.1875 q 0,2.28125 0.10938,2.890625 0.10937,0.59375 0.40625,1.15625 h -1.70313 q -0.26562,-0.515625 -0.32812,-1.1875 z m -0.14063,-3.671875 q -0.89062,0.375 -2.67187,0.625 -1.01563,0.140625 -1.4375,0.328125 -0.42188,0.1875 -0.65625,0.53125 -0.21875,0.34375 -0.21875,0.78125 0,0.65625 0.5,1.09375 0.5,0.4375 1.45312,0.4375 0.9375,0 1.67188,-0.40625 0.75,-0.421875 1.09375,-1.140625 0.26562,-0.5625 0.26562,-1.640625 z m 9.38715,4.859375 v -9.671875 h 1.46875 v 1.375 q 1.0625,-1.59375 3.07812,-1.59375 0.875,0 1.60938,0.3125 0.73437,0.3125 1.09375,0.828125 0.375,0.5 0.51562,1.203125 0.0937,0.453125 0.0937,1.59375 v 5.953125 h -1.64062 v -5.890625 q 0,-1 -0.20313,-1.484375 -0.1875,-0.5 -0.67187,-0.796875 -0.48438,-0.296875 -1.14063,-0.296875 -1.04687,0 -1.8125,0.671875 -0.75,0.65625 -0.75,2.515625 v 5.28125 z m 9.76634,-4.84375 q 0,-2.6875 1.48438,-3.96875 1.25,-1.078125 3.04687,-1.078125 2,0 3.26563,1.3125 1.26562,1.296875 1.26562,3.609375 0,1.859375 -0.5625,2.9375 -0.5625,1.0625 -1.64062,1.65625 -1.0625,0.59375 -2.32813,0.59375 -2.03125,0 -3.28125,-1.296875 -1.25,-1.3125 -1.25,-3.765625 z m 1.6875,0 q 0,1.859375 0.79688,2.796875 0.8125,0.921875 2.04687,0.921875 1.21875,0 2.03125,-0.921875 0.8125,-0.9375 0.8125,-2.84375 0,-1.796875 -0.8125,-2.71875 -0.8125,-0.921875 -2.03125,-0.921875 -1.23437,0 -2.04687,0.921875 -0.79688,0.90625 -0.79688,2.765625 z m 15.56322,4.84375 v -1.21875 q -0.90625,1.4375 -2.70313,1.4375 -1.15625,0 -2.125,-0.640625 -0.96875,-0.640625 -1.5,-1.78125 -0.53125,-1.140625 -0.53125,-2.625 0,-1.453125 0.48438,-2.625 0.48437,-1.1875 1.4375,-1.8125 0.96875,-0.625 2.17187,-0.625 0.875,0 1.54688,0.375 0.6875,0.359375 1.10937,0.953125 v -4.796875 h 1.64063 V 54.98299 Z m -5.17188,-4.828125 q 0,1.859375 0.78125,2.78125 0.78125,0.921875 1.84375,0.921875 1.07813,0 1.82813,-0.875 0.75,-0.890625 0.75,-2.6875 0,-1.984375 -0.76563,-2.90625 -0.76562,-0.9375 -1.89062,-0.9375 -1.07813,0 -1.8125,0.890625 -0.73438,0.890625 -0.73438,2.8125 z m 15.90697,1.71875 1.6875,0.203125 q -0.40625,1.484375 -1.48438,2.3125 -1.07812,0.8125 -2.76562,0.8125 -2.125,0 -3.375,-1.296875 -1.23438,-1.3125 -1.23438,-3.671875 0,-2.453125 1.25,-3.796875 1.26563,-1.34375 3.26563,-1.34375 1.9375,0 3.15625,1.328125 1.23437,1.3125 1.23437,3.703125 0,0.15625 0,0.4375 h -7.21875 q 0.0937,1.59375 0.90625,2.453125 0.8125,0.84375 2.01563,0.84375 0.90625,0 1.54687,-0.46875 0.64063,-0.484375 1.01563,-1.515625 z m -5.39063,-2.65625 h 5.40625 q -0.10937,-1.21875 -0.625,-1.828125 -0.78125,-0.953125 -2.03125,-0.953125 -1.125,0 -1.90625,0.765625 -0.76562,0.75 -0.84375,2.015625 z" + id="path111" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 784.2409,84.97754 h 86.01471 v 74.04492 H 784.2409 Z" + id="path113" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 784.2409,84.97754 h 86.01471 v 74.04492 H 784.2409 Z" + id="path115" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#cc0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 854.0783,92.15187 h 12.664 v 7.173988 h -12.664 z" + id="path117" + inkscape:connector-curvature="0" + style="fill:#fdf8f8;fill-rule:evenodd" /> + <path + d="m 854.0783,92.15187 h 12.664 v 7.173988 h -12.664 z" + id="path119" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 796.6742,97.166214 h 15.94489 V 149.21876 H 796.6742 Z" + id="path121" + inkscape:connector-curvature="0" + style="fill:#d9ead3;fill-rule:evenodd" /> + <path + d="m 796.6742,97.166214 h 15.94489 V 149.21876 H 796.6742 Z" + id="path123" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 817.86584,97.166214 h 23.76062 v 28.860576 h -23.76062 z" + id="path125" + inkscape:connector-curvature="0" + style="fill:#cfe2f3;fill-rule:evenodd" /> + <path + d="m 817.86584,97.166214 h 23.76062 v 28.860576 h -23.76062 z" + id="path127" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 817.86584,132.55469 h 10.95038 v 16.4884 h -10.95038 z" + id="path129" + inkscape:connector-curvature="0" + style="fill:#f4cccc;fill-rule:evenodd" /> + <path + d="m 817.86584,132.55469 h 10.95038 v 16.4884 h -10.95038 z" + id="path131" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 830.6742,132.55469 h 10.95032 v 16.4884 H 830.6742 Z" + id="path133" + inkscape:connector-curvature="0" + style="fill:#f4cccc;fill-rule:evenodd" /> + <path + d="m 830.6742,132.55469 h 10.95032 v 16.4884 H 830.6742 Z" + id="path135" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 812.6282,113.40989 1.2937,-1.29367 v 0.64683 h 2.65796 v -0.64683 l 1.29364,1.29367 -1.29364,1.29367 v -0.64683 h -2.65796 v 0.64683 z" + id="path137" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 812.6282,113.40989 1.2937,-1.29367 v 0.64683 h 2.65796 v -0.64683 l 1.29364,1.29367 -1.29364,1.29367 v -0.64683 h -2.65796 v 0.64683 z" + id="path139" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 823.25336,127.06765 0.47021,-0.4702 0.47022,0.4702 h -0.23511 v 4.18723 h 0.23511 l -0.47022,0.4702 -0.47021,-0.4702 h 0.23511 v -4.18723 z" + id="path141" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 823.25336,127.06765 0.47021,-0.4702 0.47022,0.4702 h -0.23511 v 4.18723 h 0.23511 l -0.47022,0.4702 -0.47021,-0.4702 h 0.23511 v -4.18723 z" + id="path143" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 835.02655,127.06765 0.47015,-0.4702 0.47022,0.4702 h -0.23511 v 4.18723 h 0.23511 l -0.47022,0.4702 -0.47015,-0.4702 h 0.23505 v -4.18723 z" + id="path145" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 835.02655,127.06765 0.47015,-0.4702 0.47022,0.4702 h -0.23511 v 4.18723 h 0.23511 l -0.47022,0.4702 -0.47015,-0.4702 h 0.23505 v -4.18723 z" + id="path147" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 850.9376,107.32317 h 14.62836 v 5.59806 H 850.9376 Z" + id="path149" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 850.01074,149.05312 c -1.05603,0 -1.91211,-0.94864 -1.91211,-2.11884 v -14.02659 c 0,-1.1702 -0.85614,-2.11884 -1.91217,-2.11884 v 0 c 1.05603,0 1.91217,-0.94864 1.91217,-2.11883 v -14.02659 0 c 0,-1.1702 0.85608,-2.11884 1.91211,-2.11884 z" + id="path151" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 850.01074,149.05312 c -1.05603,0 -1.91211,-0.94864 -1.91211,-2.11884 v -14.02659 c 0,-1.1702 -0.85614,-2.11884 -1.91217,-2.11884 v 0 c 1.05603,0 1.91217,-0.94864 1.91217,-2.11883 v -14.02659 0 c 0,-1.1702 0.85608,-2.11884 1.91211,-2.11884" + id="path153" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 850.01074,149.05312 c -1.05603,0 -1.91211,-0.94864 -1.91211,-2.11884 v -14.02659 c 0,-1.1702 -0.85614,-2.11884 -1.91217,-2.11884 v 0 c 1.05603,0 1.91217,-0.94864 1.91217,-2.11883 v -14.02659 0 c 0,-1.1702 0.85608,-2.11884 1.91211,-2.11884" + id="path155" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 838.0996,125.12592 h 14.62836 v 5.59805 H 838.0996 Z" + id="path157" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 855.78827,115.21598 h 7.92023 v 7.17398 h -7.92023 z" + id="path159" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,115.21598 h 7.92023 v 7.17398 h -7.92023 z" + id="path161" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,121.19038 h 7.92023 v 7.17399 h -7.92023 z" + id="path163" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,121.19038 h 7.92023 v 7.17399 h -7.92023 z" + id="path165" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,127.16478 h 7.92023 v 7.17398 h -7.92023 z" + id="path167" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,127.16478 h 7.92023 v 7.17398 h -7.92023 z" + id="path169" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,133.13918 h 7.92023 v 7.17398 h -7.92023 z" + id="path171" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,133.13918 h 7.92023 v 7.17398 h -7.92023 z" + id="path173" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,139.11357 h 7.92023 v 7.174 h -7.92023 z" + id="path175" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,139.11357 h 7.92023 v 7.174 h -7.92023 z" + id="path177" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 784.2409,188.97754 h 86.01471 v 74.04492 H 784.2409 Z" + id="path179" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 784.2409,188.97754 h 86.01471 v 74.04492 H 784.2409 Z" + id="path181" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#cc0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 854.0783,196.15187 h 12.664 v 7.17398 h -12.664 z" + id="path183" + inkscape:connector-curvature="0" + style="fill:#fdf8f8;fill-rule:evenodd" /> + <path + d="m 854.0783,196.15187 h 12.664 v 7.17398 h -12.664 z" + id="path185" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 796.6742,201.16621 h 15.94489 v 52.05255 H 796.6742 Z" + id="path187" + inkscape:connector-curvature="0" + style="fill:#d9ead3;fill-rule:evenodd" /> + <path + d="m 796.6742,201.16621 h 15.94489 v 52.05255 H 796.6742 Z" + id="path189" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 817.86584,201.16621 h 23.76062 v 28.86058 h -23.76062 z" + id="path191" + inkscape:connector-curvature="0" + style="fill:#cfe2f3;fill-rule:evenodd" /> + <path + d="m 817.86584,201.16621 h 23.76062 v 28.86058 h -23.76062 z" + id="path193" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 817.86584,236.55469 h 10.95038 v 16.4884 h -10.95038 z" + id="path195" + inkscape:connector-curvature="0" + style="fill:#f4cccc;fill-rule:evenodd" /> + <path + d="m 817.86584,236.55469 h 10.95038 v 16.4884 h -10.95038 z" + id="path197" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 830.6742,236.55469 h 10.95032 v 16.4884 H 830.6742 Z" + id="path199" + inkscape:connector-curvature="0" + style="fill:#f4cccc;fill-rule:evenodd" /> + <path + d="m 830.6742,236.55469 h 10.95032 v 16.4884 H 830.6742 Z" + id="path201" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 812.6282,217.40988 1.2937,-1.29367 v 0.64683 h 2.65796 v -0.64683 l 1.29364,1.29367 -1.29364,1.29367 v -0.64683 h -2.65796 v 0.64683 z" + id="path203" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 812.6282,217.40988 1.2937,-1.29367 v 0.64683 h 2.65796 v -0.64683 l 1.29364,1.29367 -1.29364,1.29367 v -0.64683 h -2.65796 v 0.64683 z" + id="path205" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 823.25336,231.06764 0.47021,-0.47018 0.47022,0.47018 h -0.23511 v 4.18724 h 0.23511 l -0.47022,0.4702 -0.47021,-0.4702 h 0.23511 v -4.18724 z" + id="path207" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 823.25336,231.06764 0.47021,-0.47018 0.47022,0.47018 h -0.23511 v 4.18724 h 0.23511 l -0.47022,0.4702 -0.47021,-0.4702 h 0.23511 v -4.18724 z" + id="path209" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 835.02655,231.06764 0.47015,-0.47018 0.47022,0.47018 h -0.23511 v 4.18724 h 0.23511 l -0.47022,0.4702 -0.47015,-0.4702 h 0.23505 v -4.18724 z" + id="path211" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 835.02655,231.06764 0.47015,-0.47018 0.47022,0.47018 h -0.23511 v 4.18724 h 0.23511 l -0.47022,0.4702 -0.47015,-0.4702 h 0.23505 v -4.18724 z" + id="path213" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 850.9376,211.32317 h 14.62836 v 5.59807 H 850.9376 Z" + id="path215" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 850.01074,253.05312 c -1.05603,0 -1.91211,-0.94864 -1.91211,-2.11884 v -14.02659 c 0,-1.1702 -0.85614,-2.11884 -1.91217,-2.11884 v 0 c 1.05603,0 1.91217,-0.94864 1.91217,-2.11883 v -14.02658 0 c 0,-1.17021 0.85608,-2.11884 1.91211,-2.11884 z" + id="path217" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 850.01074,253.05312 c -1.05603,0 -1.91211,-0.94864 -1.91211,-2.11884 v -14.02659 c 0,-1.1702 -0.85614,-2.11884 -1.91217,-2.11884 v 0 c 1.05603,0 1.91217,-0.94864 1.91217,-2.11883 v -14.02658 0 c 0,-1.17021 0.85608,-2.11884 1.91211,-2.11884" + id="path219" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 850.01074,253.05312 c -1.05603,0 -1.91211,-0.94864 -1.91211,-2.11884 v -14.02659 c 0,-1.1702 -0.85614,-2.11884 -1.91217,-2.11884 v 0 c 1.05603,0 1.91217,-0.94864 1.91217,-2.11883 v -14.02658 0 c 0,-1.17021 0.85608,-2.11884 1.91211,-2.11884" + id="path221" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 838.0996,229.12592 h 14.62836 v 5.59805 H 838.0996 Z" + id="path223" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 855.78827,219.21597 h 7.92023 v 7.17398 h -7.92023 z" + id="path225" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,219.21597 h 7.92023 v 7.17398 h -7.92023 z" + id="path227" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,225.19038 h 7.92023 v 7.17398 h -7.92023 z" + id="path229" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,225.19038 h 7.92023 v 7.17398 h -7.92023 z" + id="path231" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,231.16478 h 7.92023 v 7.17398 h -7.92023 z" + id="path233" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,231.16478 h 7.92023 v 7.17398 h -7.92023 z" + id="path235" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,237.13918 h 7.92023 v 7.17398 h -7.92023 z" + id="path237" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,237.13918 h 7.92023 v 7.17398 h -7.92023 z" + id="path239" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,243.11357 h 7.92023 v 7.174 h -7.92023 z" + id="path241" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,243.11357 h 7.92023 v 7.174 h -7.92023 z" + id="path243" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 784.2409,284.97754 h 86.01471 v 74.04492 H 784.2409 Z" + id="path245" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 784.2409,284.97754 h 86.01471 v 74.04492 H 784.2409 Z" + id="path247" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#cc0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 854.0783,292.1519 h 12.664 v 7.17398 h -12.664 z" + id="path249" + inkscape:connector-curvature="0" + style="fill:#fdf8f8;fill-rule:evenodd" /> + <path + d="m 854.0783,292.1519 h 12.664 v 7.17398 h -12.664 z" + id="path251" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 796.6742,297.1662 h 15.94489 v 52.05255 H 796.6742 Z" + id="path253" + inkscape:connector-curvature="0" + style="fill:#d9ead3;fill-rule:evenodd" /> + <path + d="m 796.6742,297.1662 h 15.94489 v 52.05255 H 796.6742 Z" + id="path255" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 817.86584,297.1662 h 23.76062 v 28.8606 h -23.76062 z" + id="path257" + inkscape:connector-curvature="0" + style="fill:#cfe2f3;fill-rule:evenodd" /> + <path + d="m 817.86584,297.1662 h 23.76062 v 28.8606 h -23.76062 z" + id="path259" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 817.86584,332.5547 h 10.95038 v 16.4884 h -10.95038 z" + id="path261" + inkscape:connector-curvature="0" + style="fill:#f4cccc;fill-rule:evenodd" /> + <path + d="m 817.86584,332.5547 h 10.95038 v 16.4884 h -10.95038 z" + id="path263" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 830.6742,332.5547 h 10.95032 v 16.4884 H 830.6742 Z" + id="path265" + inkscape:connector-curvature="0" + style="fill:#f4cccc;fill-rule:evenodd" /> + <path + d="m 830.6742,332.5547 h 10.95032 v 16.4884 H 830.6742 Z" + id="path267" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 812.6282,313.40988 1.2937,-1.29367 v 0.64685 h 2.65796 v -0.64685 l 1.29364,1.29367 -1.29364,1.29367 v -0.64682 h -2.65796 v 0.64682 z" + id="path269" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 812.6282,313.40988 1.2937,-1.29367 v 0.64685 h 2.65796 v -0.64685 l 1.29364,1.29367 -1.29364,1.29367 v -0.64682 h -2.65796 v 0.64682 z" + id="path271" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 823.25336,327.06766 0.47021,-0.47021 0.47022,0.47021 h -0.23511 v 4.18723 h 0.23511 l -0.47022,0.47021 -0.47021,-0.47021 h 0.23511 v -4.18723 z" + id="path273" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 823.25336,327.06766 0.47021,-0.47021 0.47022,0.47021 h -0.23511 v 4.18723 h 0.23511 l -0.47022,0.47021 -0.47021,-0.47021 h 0.23511 v -4.18723 z" + id="path275" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 835.02655,327.06766 0.47015,-0.47021 0.47022,0.47021 h -0.23511 v 4.18723 h 0.23511 l -0.47022,0.47021 -0.47015,-0.47021 h 0.23505 v -4.18723 z" + id="path277" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 835.02655,327.06766 0.47015,-0.47021 0.47022,0.47021 h -0.23511 v 4.18723 h 0.23511 l -0.47022,0.47021 -0.47015,-0.47021 h 0.23505 v -4.18723 z" + id="path279" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 850.9376,307.32318 h 14.62836 v 5.59805 H 850.9376 Z" + id="path281" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 850.01074,349.0531 c -1.05603,0 -1.91211,-0.94864 -1.91211,-2.11884 v -14.02658 c 0,-1.17019 -0.85614,-2.11883 -1.91217,-2.11883 v 0 c 1.05603,0 1.91217,-0.94864 1.91217,-2.11884 v -14.02658 0 c 0,-1.17019 0.85608,-2.11883 1.91211,-2.11883 z" + id="path283" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 850.01074,349.0531 c -1.05603,0 -1.91211,-0.94864 -1.91211,-2.11884 v -14.02658 c 0,-1.17019 -0.85614,-2.11883 -1.91217,-2.11883 v 0 c 1.05603,0 1.91217,-0.94864 1.91217,-2.11884 v -14.02658 0 c 0,-1.17019 0.85608,-2.11883 1.91211,-2.11883" + id="path285" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 850.01074,349.0531 c -1.05603,0 -1.91211,-0.94864 -1.91211,-2.11884 v -14.02658 c 0,-1.17019 -0.85614,-2.11883 -1.91217,-2.11883 v 0 c 1.05603,0 1.91217,-0.94864 1.91217,-2.11884 v -14.02658 0 c 0,-1.17019 0.85608,-2.11883 1.91211,-2.11883" + id="path287" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 838.0996,325.12592 h 14.62836 v 5.59805 H 838.0996 Z" + id="path289" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 855.78827,315.21597 h 7.92023 v 7.17398 h -7.92023 z" + id="path291" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,315.21597 h 7.92023 v 7.17398 h -7.92023 z" + id="path293" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,321.19037 h 7.92023 v 7.17398 h -7.92023 z" + id="path295" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,321.19037 h 7.92023 v 7.17398 h -7.92023 z" + id="path297" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,327.16476 h 7.92023 v 7.17401 h -7.92023 z" + id="path299" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,327.16476 h 7.92023 v 7.17401 h -7.92023 z" + id="path301" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,333.1392 h 7.92023 v 7.17398 h -7.92023 z" + id="path303" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,333.1392 h 7.92023 v 7.17398 h -7.92023 z" + id="path305" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,339.1136 h 7.92023 v 7.17398 h -7.92023 z" + id="path307" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,339.1136 h 7.92023 v 7.17398 h -7.92023 z" + id="path309" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 784.2409,380.97754 h 86.01471 v 74.04492 H 784.2409 Z" + id="path311" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 784.2409,380.97754 h 86.01471 v 74.04492 H 784.2409 Z" + id="path313" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#cc0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 854.0783,388.1519 h 12.664 v 7.17398 h -12.664 z" + id="path315" + inkscape:connector-curvature="0" + style="fill:#fdf8f8;fill-rule:evenodd" /> + <path + d="m 854.0783,388.1519 h 12.664 v 7.17398 h -12.664 z" + id="path317" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 796.6742,393.1662 h 15.94489 v 52.05255 H 796.6742 Z" + id="path319" + inkscape:connector-curvature="0" + style="fill:#d9ead3;fill-rule:evenodd" /> + <path + d="m 796.6742,393.1662 h 15.94489 v 52.05255 H 796.6742 Z" + id="path321" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 817.86584,393.1662 h 23.76062 v 28.8606 h -23.76062 z" + id="path323" + inkscape:connector-curvature="0" + style="fill:#cfe2f3;fill-rule:evenodd" /> + <path + d="m 817.86584,393.1662 h 23.76062 v 28.8606 h -23.76062 z" + id="path325" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 817.86584,428.5547 h 10.95038 v 16.4884 h -10.95038 z" + id="path327" + inkscape:connector-curvature="0" + style="fill:#f4cccc;fill-rule:evenodd" /> + <path + d="m 817.86584,428.5547 h 10.95038 v 16.4884 h -10.95038 z" + id="path329" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 830.6742,428.5547 h 10.95032 v 16.4884 H 830.6742 Z" + id="path331" + inkscape:connector-curvature="0" + style="fill:#f4cccc;fill-rule:evenodd" /> + <path + d="m 830.6742,428.5547 h 10.95032 v 16.4884 H 830.6742 Z" + id="path333" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 812.6282,409.40988 1.2937,-1.29367 v 0.64685 h 2.65796 v -0.64685 l 1.29364,1.29367 -1.29364,1.29367 v -0.64682 h -2.65796 v 0.64682 z" + id="path335" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 812.6282,409.40988 1.2937,-1.29367 v 0.64685 h 2.65796 v -0.64685 l 1.29364,1.29367 -1.29364,1.29367 v -0.64682 h -2.65796 v 0.64682 z" + id="path337" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 823.25336,423.06766 0.47021,-0.47021 0.47022,0.47021 h -0.23511 v 4.18723 h 0.23511 l -0.47022,0.47021 -0.47021,-0.47021 h 0.23511 v -4.18723 z" + id="path339" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 823.25336,423.06766 0.47021,-0.47021 0.47022,0.47021 h -0.23511 v 4.18723 h 0.23511 l -0.47022,0.47021 -0.47021,-0.47021 h 0.23511 v -4.18723 z" + id="path341" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 835.02655,423.06766 0.47015,-0.47021 0.47022,0.47021 h -0.23511 v 4.18723 h 0.23511 l -0.47022,0.47021 -0.47015,-0.47021 h 0.23505 v -4.18723 z" + id="path343" + inkscape:connector-curvature="0" + style="fill:#eeeeee;fill-rule:evenodd" /> + <path + d="m 835.02655,423.06766 0.47015,-0.47021 0.47022,0.47021 h -0.23511 v 4.18723 h 0.23511 l -0.47022,0.47021 -0.47015,-0.47021 h 0.23505 v -4.18723 z" + id="path345" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 850.9376,403.32318 h 14.62836 v 5.59805 H 850.9376 Z" + id="path347" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 850.01074,445.0531 c -1.05603,0 -1.91211,-0.94864 -1.91211,-2.11884 v -14.02658 c 0,-1.17019 -0.85614,-2.11883 -1.91217,-2.11883 v 0 c 1.05603,0 1.91217,-0.94864 1.91217,-2.11884 v -14.02658 0 c 0,-1.17019 0.85608,-2.11883 1.91211,-2.11883 z" + id="path349" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 850.01074,445.0531 c -1.05603,0 -1.91211,-0.94864 -1.91211,-2.11884 v -14.02658 c 0,-1.17019 -0.85614,-2.11883 -1.91217,-2.11883 v 0 c 1.05603,0 1.91217,-0.94864 1.91217,-2.11884 v -14.02658 0 c 0,-1.17019 0.85608,-2.11883 1.91211,-2.11883" + id="path351" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 850.01074,445.0531 c -1.05603,0 -1.91211,-0.94864 -1.91211,-2.11884 v -14.02658 c 0,-1.17019 -0.85614,-2.11883 -1.91217,-2.11883 v 0 c 1.05603,0 1.91217,-0.94864 1.91217,-2.11884 v -14.02658 0 c 0,-1.17019 0.85608,-2.11883 1.91211,-2.11883" + id="path353" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 838.0996,421.12592 h 14.62836 v 5.59805 H 838.0996 Z" + id="path355" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 855.78827,411.21597 h 7.92023 v 7.17398 h -7.92023 z" + id="path357" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,411.21597 h 7.92023 v 7.17398 h -7.92023 z" + id="path359" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,417.19037 h 7.92023 v 7.17398 h -7.92023 z" + id="path361" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,417.19037 h 7.92023 v 7.17398 h -7.92023 z" + id="path363" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,423.16476 h 7.92023 v 7.17401 h -7.92023 z" + id="path365" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,423.16476 h 7.92023 v 7.17401 h -7.92023 z" + id="path367" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,429.1392 h 7.92023 v 7.17398 h -7.92023 z" + id="path369" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,429.1392 h 7.92023 v 7.17398 h -7.92023 z" + id="path371" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 855.78827,435.1136 h 7.92023 v 7.17398 h -7.92023 z" + id="path373" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 855.78827,435.1136 h 7.92023 v 7.17398 h -7.92023 z" + id="path375" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" /> + <path + d="m 618.7606,261.25125 c 40.95276,0 61.42914,-35.92914 81.90552,-71.85828 20.47638,-35.92914 40.95276,-71.85827 81.90552,-71.85827" + id="path377" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 618.7606,261.25125 c 40.95276,0 61.42914,-35.92914 81.90546,-71.85826 10.23822,-17.96457 20.47638,-35.92915 33.27411,-49.40257 6.39886,-6.73671 13.43762,-12.35065 21.43622,-16.2804 3.99933,-1.96487 8.23858,-3.5087 12.75781,-4.56131 2.25958,-0.52631 4.58911,-0.92981 6.99371,-1.20174 1.20227,-0.13596 2.42334,-0.23902 3.66376,-0.3081 l 0.35388,-0.0172" + id="path379" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:8, 3" /> + <path + d="m 779.1456,117.62166 -1.0957,1.15275 3.06024,-1.20262 -3.11731,-1.04582 z" + id="path381" + inkscape:connector-curvature="0" + style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt" /> + <path + d="m 618.7606,293.24408 c 41.37006,0 62.05511,-16.81101 82.74017,-33.62204 C 722.18577,242.81102 742.87083,226 784.24088,226" + id="path383" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 618.7606,293.24408 c 41.37006,0 62.05511,-16.81101 82.74011,-33.62204 10.34253,-8.4055 20.68506,-16.81102 33.61322,-23.11514 6.46405,-3.15207 13.57452,-5.7788 21.6546,-7.61751 4.0401,-0.91934 8.32251,-1.64169 12.88776,-2.1342 2.28265,-0.24626 4.63592,-0.43506 7.06506,-0.5623 1.21448,-0.0636 2.448,-0.11184 3.70105,-0.14415 l 0.39166,-0.009" + id="path385" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:8, 3" /> + <path + d="m 780.814,226.03992 -1.11139,1.1376 3.07648,-1.16049 -3.10266,-1.08851 z" + id="path387" + inkscape:connector-curvature="0" + style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt" /> + <path + d="m 618.7606,333.24408 c 39.72443,0 59.58661,3.52759 79.44879,7.05515 19.86224,3.52755 39.72443,7.05511 79.44885,7.05511" + id="path389" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 618.7606,333.24408 c 39.72443,0 59.58661,3.52759 79.44879,7.05515 9.93109,1.76376 19.86218,3.52755 32.27606,4.85037 6.20697,0.66144 13.03455,1.21261 20.79322,1.59842 3.87939,0.19293 7.99151,0.34451 12.37512,0.44784 2.19183,0.0517 4.45147,0.0913 6.78399,0.11798 1.1662,0.0133 2.35065,0.0235 3.55384,0.0303 l 0.2395,9.7e-4" + id="path391" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:8, 3" /> + <path + d="m 774.23114,347.34512 -1.12762,1.12155 3.09283,-1.11627 -3.08673,-1.1329 z" + id="path393" + inkscape:connector-curvature="0" + style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt" /> + <path + d="m 618.7606,397.24408 c 40.95276,0 61.42914,11.07877 81.90552,22.1575 20.47638,11.07874 40.95276,22.15747 81.90552,22.15747" + id="path395" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 618.7606,397.24408 c 40.95276,0 61.42914,11.07877 81.90546,22.1575 10.23822,5.53937 20.47638,11.07874 33.27411,15.23328 6.39886,2.07724 13.43762,3.80829 21.43622,5.02005 3.99933,0.60583 8.23858,1.08188 12.75781,1.40649 2.25958,0.16226 4.58911,0.28668 6.99371,0.37052 1.20227,0.0419 2.42334,0.0737 3.66376,0.095 l 0.35291,0.005" + id="path397" + inkscape:connector-curvature="0" + style="fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:8, 3" /> + <path + d="m 779.1446,441.53223 -1.1333,1.11575 3.09845,-1.10037 -3.08087,-1.14874 z" + id="path399" + inkscape:connector-curvature="0" + style="fill:#595959;fill-rule:evenodd;stroke:#595959;stroke-width:1;stroke-linecap:butt" /> + <path + d="m 780.8373,58.973755 h 99.40155 v 27.46457 H 780.8373 Z" + id="path401" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="M 811.0304,80.77375 V 73.8675 h 1.0625 v 0.984375 q 0.75,-1.140625 2.1875,-1.140625 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26562,0.359375 0.375,0.859375 0.0625,0.328125 0.0625,1.140625 v 4.25 h -1.17188 v -4.203125 q 0,-0.71875 -0.14062,-1.0625 -0.14063,-0.359375 -0.48438,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29687,0.46875 -0.54688,0.46875 -0.54688,1.796875 v 3.78125 z m 6.97498,-3.453125 q 0,-1.921875 1.07812,-2.84375 0.89063,-0.765625 2.17188,-0.765625 1.42187,0 2.32812,0.9375 0.90625,0.921875 0.90625,2.578125 0,1.328125 -0.40625,2.09375 -0.39062,0.765625 -1.15625,1.1875 -0.76562,0.421875 -1.67187,0.421875 -1.45313,0 -2.35938,-0.921875 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.328125 0.57813,1.984375 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.671875 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.984375 z m 11.13123,3.453125 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.453125 -0.6875,-0.453125 -1.07812,-1.265625 -0.375,-0.828125 -0.375,-1.890625 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.453125 1.54687,-0.453125 0.625,0 1.10938,0.265625 0.5,0.25 0.79687,0.671875 v -3.421875 h 1.17188 v 9.546875 z m -3.70313,-3.453125 q 0,1.328125 0.5625,1.984375 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.421875 -0.54687,-2.078125 Q 829.2616,74.68 828.46473,74.68 q -0.78125,0 -1.3125,0.640625 -0.51563,0.625 -0.51563,2 z m 11.3656,1.234375 1.20313,0.140625 q -0.28125,1.0625 -1.0625,1.65625 Q 837.3772,80.93 836.17408,80.93 q -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.609375 0,-1.75 0.89063,-2.703125 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.109375 0,0.3125 h -5.15625 q 0.0625,1.140625 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.328125 0.45313,-0.34375 0.71875,-1.078125 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.859375 -0.4375,-1.296875 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.546875 -0.54688,0.53125 -0.60938,1.4375 z m 9.89667,-0.578125 q 0,-1.6875 0.34375,-2.71875 0.35938,-1.03125 1.04688,-1.59375 0.6875,-0.5625 1.71875,-0.5625 0.78125,0 1.35937,0.3125 0.57813,0.296875 0.95313,0.890625 0.375,0.578125 0.59375,1.421875 0.21875,0.828125 0.21875,2.25 0,1.671875 -0.35938,2.703125 -0.34375,1.03125 -1.03125,1.59375 -0.67187,0.5625 -1.73437,0.5625 -1.375,0 -2.15625,-0.984375 -0.95313,-1.1875 -0.95313,-3.875 z m 1.20313,0 q 0,2.34375 0.54687,3.125 0.5625,0.78125 1.35938,0.78125 0.8125,0 1.35937,-0.78125 0.5625,-0.78125 0.5625,-3.125 0,-2.359375 -0.5625,-3.125 -0.54687,-0.78125 -1.35937,-0.78125 -0.8125,0 -1.29688,0.6875 -0.60937,0.875 -0.60937,3.21875 z" + id="path403" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 780.8373,162.97375 h 99.40155 v 27.46457 H 780.8373 Z" + id="path405" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 811.0304,184.77376 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26562,0.35937 0.375,0.85937 0.0625,0.32813 0.0625,1.14063 v 4.25 h -1.17188 v -4.20313 q 0,-0.71875 -0.14062,-1.0625 -0.14063,-0.35937 -0.48438,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29687,0.46875 -0.54688,0.46875 -0.54688,1.79688 v 3.78125 z m 6.97498,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.13123,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45313 -0.6875,-0.45312 -1.07812,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45312 1.54687,-0.45312 0.625,0 1.10938,0.26562 0.5,0.25 0.79687,0.67188 v -3.42188 h 1.17188 v 9.54688 z m -3.70313,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54687,-2.07813 -0.54688,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51563,0.625 -0.51563,2 z m 11.3656,1.23438 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 14.31855,4.125 h -1.17188 v -7.46875 q -0.42187,0.40625 -1.10937,0.8125 -0.6875,0.40625 -1.23438,0.60937 v -1.14062 q 0.98438,-0.45313 1.71875,-1.10938 0.73438,-0.67187 1.03125,-1.28125 h 0.76563 z" + id="path407" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 780.8373,258.97375 h 99.40155 v 27.46457 H 780.8373 Z" + id="path409" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 811.0304,280.77374 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26562,0.35937 0.375,0.85937 0.0625,0.32813 0.0625,1.14063 v 4.25 h -1.17188 v -4.20313 q 0,-0.71875 -0.14062,-1.0625 -0.14063,-0.35937 -0.48438,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29687,0.46875 -0.54688,0.46875 -0.54688,1.79688 v 3.78125 z m 6.97498,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.13123,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45313 -0.6875,-0.45312 -1.07812,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45312 1.54687,-0.45312 0.625,0 1.10938,0.26562 0.5,0.25 0.79687,0.67188 v -3.42188 h 1.17188 v 9.54688 z m -3.70313,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54687,-2.07813 -0.54688,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51563,0.625 -0.51563,2 z m 11.3656,1.23438 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 16.05292,3 v 1.125 h -6.29688 q -0.0156,-0.42188 0.14063,-0.8125 0.23437,-0.64063 0.76562,-1.26563 0.53125,-0.625 1.53125,-1.45312 1.5625,-1.26563 2.10938,-2.01563 0.54687,-0.75 0.54687,-1.40625 0,-0.70312 -0.5,-1.17187 -0.5,-0.48438 -1.29687,-0.48438 -0.85938,0 -1.375,0.51563 -0.5,0.5 -0.5,1.39062 l -1.20313,-0.10937 q 0.125,-1.35938 0.92188,-2.0625 0.8125,-0.70313 2.17187,-0.70313 1.375,0 2.17188,0.76563 0.8125,0.75 0.8125,1.875 0,0.57812 -0.23438,1.14062 -0.23437,0.54688 -0.78125,1.15625 -0.54687,0.60938 -1.8125,1.67188 -1.04687,0.89062 -1.35937,1.21875 -0.29688,0.3125 -0.48438,0.625 z" + id="path411" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + <path + d="m 780.8373,354.97375 h 99.40155 v 27.46457 H 780.8373 Z" + id="path413" + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:0;fill-rule:evenodd" /> + <path + d="m 811.0304,376.77374 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26562,0.35937 0.375,0.85937 0.0625,0.32813 0.0625,1.14063 v 4.25 h -1.17188 v -4.20313 q 0,-0.71875 -0.14062,-1.0625 -0.14063,-0.35937 -0.48438,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29687,0.46875 -0.54688,0.46875 -0.54688,1.79688 v 3.78125 z m 6.97498,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.13123,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45313 -0.6875,-0.45312 -1.07812,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45312 1.54687,-0.45312 0.625,0 1.10938,0.26562 0.5,0.25 0.79687,0.67188 v -3.42188 h 1.17188 v 9.54688 z m -3.70313,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54687,-2.07813 -0.54688,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51563,0.625 -0.51563,2 z m 11.3656,1.23438 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 10.2248,4.125 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26562,0.35937 0.375,0.85937 0.0625,0.32813 0.0625,1.14063 v 4.25 h -1.17188 v -4.20313 q 0,-0.71875 -0.14062,-1.0625 -0.14063,-0.35937 -0.48438,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29687,0.46875 -0.54688,0.46875 -0.54688,1.79688 v 3.78125 z" + id="path415" + inkscape:connector-curvature="0" + style="fill:#000000;fill-rule:nonzero" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/architecture-overview.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/architecture-overview.svg new file mode 100644 index 000000000..cd8efaae9 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/architecture-overview.svg @@ -0,0 +1,980 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="635.30798" + height="570.86243" + id="svg14043" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="architecture-overview.svg" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/architecture.png" + inkscape:export-xdpi="176.10001" + inkscape:export-ydpi="176.10001"> + <defs + id="defs14045"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4058" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path4437" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + id="path14797" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective14051" /> + <inkscape:perspective + id="perspective14061" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective14096" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective14096-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective14096-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective14096-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective14096-26" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective14176" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective14204" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15450" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15488" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15547" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15591" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15666" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15741" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15811" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15833" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15833-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15833-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15833-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15833-09" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective15833-80" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3331" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3353" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3147" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-4" + style="overflow:visible"> + <path + id="path14797-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3147-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-5" + style="overflow:visible"> + <path + id="path14797-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3147-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-0" + style="overflow:visible"> + <path + id="path14797-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4712" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-5" + style="overflow:visible"> + <path + id="path4437-5" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4768" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-9" + style="overflow:visible"> + <path + id="path4437-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3098" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3123" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3148" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="350.05313" + inkscape:cy="253.33451" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1116" + inkscape:window-height="1059" + inkscape:window-x="502" + inkscape:window-y="5" + inkscape:window-maximized="0" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1" /> + <metadata + id="metadata14048"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-13.525282,-9.9128498)"> + <rect + style="fill:#000000;fill-opacity:0.10041839;stroke:none" + id="rect15785-3" + width="206.63405" + height="186.88545" + x="13.625282" + y="355.8284" + rx="25.958084" + ry="32.630138" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" /> + <rect + style="fill:#000000;fill-opacity:0.10041839;stroke:none" + id="rect15785" + width="190.11443" + height="227.2632" + x="242.76669" + y="353.41208" + rx="25.958084" + ry="32.630138" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" /> + <rect + style="fill:#000000;fill-opacity:0.10041839;stroke:none" + id="rect15785-1" + width="188.80969" + height="271.01321" + x="243.41907" + y="76.721405" + rx="25.958084" + ry="32.630138" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" /> + <rect + style="fill:#000000;fill-opacity:0.10041839;stroke:none" + id="rect15785-1-3" + width="186.89807" + height="171.30821" + x="23.493267" + y="152.36273" + rx="25.958084" + ry="32.630138" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" /> + <rect + style="fill:#000000;fill-opacity:0.10041839;stroke:none" + id="rect15785-1-4" + width="194.58926" + height="169.67664" + x="454.14401" + y="10.01285" + rx="25.958084" + ry="32.630138" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" /> + <rect + style="fill:#000000;fill-opacity:0.10041839;stroke:none" + id="rect15785-1-5" + width="193.38757" + height="203.93829" + x="454.74484" + y="199.21135" + rx="25.958084" + ry="32.630138" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" /> + <rect + style="fill:#000000;fill-opacity:0.10041839;stroke:none" + id="rect15785-1-2-0" + width="185.60017" + height="137.04657" + x="458.63852" + y="432.4848" + rx="25.958084" + ry="32.630138" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" /> + <g + id="g14229" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + transform="matrix(1.2848591,0,0,1.6151089,-288.29741,-857.02037)"> + <rect + ry="7.0710678" + rx="8.586297" + y="756.77777" + x="252.9953" + height="44.501003" + width="124.80181" + id="rect2837-4-06-5" + style="fill:#c3c4ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text14084" + y="781.64789" + x="285.35715" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="781.64789" + x="285.35715" + id="tspan14086" + sodipodi:role="line">rte_malloc</tspan></text> + </g> + <g + id="g14234" + transform="matrix(1.2848591,0,0,1.6151089,-66.98918,-730.50352)" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504"> + <rect + ry="7.0710678" + rx="8.586297" + y="678.20636" + x="252.66327" + height="44.501003" + width="124.80181" + id="rect2837-4-06-5-3" + style="fill:#c3c4ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text14084-0" + y="703.07648" + x="283.86636" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="703.07648" + x="283.86636" + id="tspan14086-7" + sodipodi:role="line">rte_eal + libc</tspan></text> + </g> + <g + id="g14239" + transform="matrix(1.2848591,0,0,1.6151089,165.66317,-754.1564)" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504"> + <rect + ry="7.0710678" + rx="8.586297" + y="600.34924" + x="237.84637" + height="44.501003" + width="124.80181" + id="rect2837-4-06-5-6" + style="fill:#c3c4ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text14084-8" + y="625.21936" + x="275.35715" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="625.21936" + x="275.35715" + id="tspan14086-8" + sodipodi:role="line">rte_ring</tspan></text> + </g> + <g + id="g14254" + transform="matrix(1.2848591,0,0,1.6151089,-388.59024,-722.81247)" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504"> + <rect + ry="7.0710678" + rx="8.586297" + y="588.20636" + x="502.9639" + height="44.501003" + width="124.80181" + id="rect2837-4-06-5-31" + style="fill:#c3c4ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text14084-4" + y="613.07648" + x="526.78571" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="613.07648" + x="526.78571" + id="tspan14086-9" + sodipodi:role="line">rte_mempool</tspan></text> + </g> + <g + id="g14244" + transform="matrix(1.2848591,0,0,1.6151089,160.86376,-719.73612)" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504"> + <rect + ry="7.0710678" + rx="8.586297" + y="501.06354" + x="241.58173" + height="44.501003" + width="124.80181" + id="rect2837-4-06-5-0" + style="fill:#c3c4ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text14084-6" + y="525.93365" + x="275.35715" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="525.93365" + x="275.35715" + id="tspan14086-89" + sodipodi:role="line">rte_mbuf</tspan></text> + </g> + <g + id="g15423" + transform="matrix(1.2848591,0,0,1.6151089,-52.842661,-589.8906)" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504"> + <rect + ry="7.0710678" + rx="8.586297" + y="510.82596" + x="69.741951" + height="44.501003" + width="124.80181" + id="rect2837-4-06-5-0-0-7" + style="fill:#c3c4ff;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <text + id="text14084-6-4-1" + y="535.69611" + x="103.23904" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="535.69611" + x="103.23904" + id="tspan14086-89-8-7" + sodipodi:role="line">rte_timer</tspan></text> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1.44055104px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:none" + d="m 257.64752,400.95017 -60.52887,0.10538" + id="path14259" + inkscape:connector-type="polyline" + inkscape:connection-start="#g14234" + inkscape:connection-end="#g14229" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + inkscape:connection-start-point="d4" + inkscape:connection-end-point="d4" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.44055104px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="M 500.0555,287.34697 389.20701,364.87361" + id="path14261" + inkscape:connector-type="polyline" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + inkscape:connection-end="#g14234" + inkscape:connection-start="#g14239" + inkscape:connection-start-point="d4" + inkscape:connection-end-point="d4" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.44024909;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Mstart-9);marker-end:none" + d="M 469.93838,257.33479 418.9627,257.1672" + id="path14263" + inkscape:connector-type="polyline" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.44024909;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Mstart-9);marker-end:url(#Arrow1Mend)" + d="m 337.82388,299.07882 1e-5,65.79479" + id="path14265" + inkscape:connector-type="polyline" + inkscape:connection-start="#g14254" + inkscape:connection-end="#g14234" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + inkscape:connection-start-point="d4" + inkscape:connection-end-point="d4" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.44055104px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="m 51.331468,66.475997 58.736412,0" + id="path15233" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14.40550995px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="62.267147" + y="84.593857" + id="text15419" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + transform="scale(0.89192198,1.1211743)"><tspan + sodipodi:role="line" + id="tspan15421" + x="62.267147" + y="84.593857">X uses Y</tspan></text> + <text + xml:space="preserve" + style="font-size:14.40550995px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="56.602165" + y="417.21744" + id="text15436" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + transform="scale(0.89192198,1.1211743)"><tspan + sodipodi:role="line" + id="tspan15438" + x="56.602165" + y="417.21744">Allocation of named</tspan><tspan + sodipodi:role="line" + x="56.602165" + y="435.22433" + id="tspan15440">memory zones using</tspan><tspan + sodipodi:role="line" + x="56.602165" + y="453.2312" + id="tspan3464">libc's malloc()</tspan></text> + <text + xml:space="preserve" + style="font-size:14.40550995px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="278.89865" + y="419.93082" + id="text15436-2" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + transform="scale(0.89192198,1.1211743)"><tspan + sodipodi:role="line" + x="278.89865" + y="419.93082" + id="tspan3092">Environment abstraction</tspan><tspan + sodipodi:role="line" + x="278.89865" + y="437.93771" + id="tspan3129">layer: RTE loading, memory</tspan><tspan + sodipodi:role="line" + x="278.89865" + y="455.94458" + id="tspan3096">allocation, time reference,</tspan><tspan + sodipodi:role="line" + x="278.89865" + y="473.95148" + id="tspan3102">PCI access, logging</tspan><tspan + sodipodi:role="line" + x="278.89865" + y="491.95837" + id="tspan3104" /></text> + <text + xml:space="preserve" + style="font-size:14.40550995px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="49.941029" + y="158.51849" + id="text15436-2-2" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + transform="scale(0.89192198,1.1211743)"><tspan + sodipodi:role="line" + x="49.941029" + y="158.51849" + id="tspan15537">Timer facilities. Based</tspan><tspan + sodipodi:role="line" + x="49.941029" + y="176.52538" + id="tspan3238">on HPET interface that</tspan><tspan + sodipodi:role="line" + x="49.941029" + y="194.53227" + id="tspan3240">is provided by EAL.</tspan></text> + <text + xml:space="preserve" + style="font-size:14.40550995px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="288.36832" + y="101.2496" + id="text15436-2-2-5" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + transform="scale(0.89192198,1.1211743)"><tspan + sodipodi:role="line" + x="288.36832" + y="101.2496" + id="tspan15537-9">Handle a pool of objects</tspan><tspan + sodipodi:role="line" + x="288.36832" + y="119.25649" + id="tspan15575">using a ring to store</tspan><tspan + sodipodi:role="line" + x="288.36832" + y="137.26338" + id="tspan15581">them. Allow bulk</tspan><tspan + sodipodi:role="line" + x="288.36832" + y="155.27026" + id="tspan15775">enqueue/dequeue and</tspan><tspan + sodipodi:role="line" + x="288.36832" + y="173.27716" + id="tspan15781">per-CPU cache.</tspan></text> + <text + xml:space="preserve" + style="font-size:14.40550995px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="534.00629" + y="297.33395" + id="text15436-2-2-5-0" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + transform="scale(0.89192198,1.1211743)"><tspan + sodipodi:role="line" + x="534.00629" + y="297.33395" + id="tspan15581-1">Fixed-size lockless </tspan><tspan + sodipodi:role="line" + x="534.00629" + y="315.34085" + id="tspan15634">FIFO for storing objects</tspan><tspan + sodipodi:role="line" + x="534.00629" + y="333.34772" + id="tspan15656">in a table.</tspan></text> + <text + xml:space="preserve" + style="font-size:14.40550995px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="529.16345" + y="33.516106" + id="text15436-2-2-5-0-1" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + transform="scale(0.89192198,1.1211743)"><tspan + sodipodi:role="line" + x="529.16345" + y="33.516106" + id="tspan15719">Manipulation of packet</tspan><tspan + sodipodi:role="line" + x="529.16345" + y="51.522995" + id="tspan15727">buffers carrying network</tspan><tspan + sodipodi:role="line" + x="529.16345" + y="69.529877" + id="tspan3246">data.</tspan></text> + <rect + style="fill:#c3c4ff;fill-opacity:1;stroke:#000000;stroke-width:1.44055104;stroke-opacity:1" + id="rect2837-4-06-5-0-0-9" + width="160.35275" + height="71.873962" + x="471.26224" + y="445.24567" + rx="11.032183" + ry="11.420545" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" /> + <text + xml:space="preserve" + style="font-size:14.40550995px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="581.71051" + y="432.95102" + id="text14084-6-4-4" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + transform="scale(0.89192198,1.1211743)"><tspan + sodipodi:role="line" + id="tspan14086-89-8-78" + x="581.71051" + y="432.95102">rte_debug</tspan></text> + <text + xml:space="preserve" + style="font-size:14.40550995px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="533.41541" + y="480.62653" + id="text15432-4" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + transform="scale(0.89192198,1.1211743)"><tspan + sodipodi:role="line" + id="tspan15434-5" + x="533.41541" + y="480.62653">Provides debug helpers</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.44055104px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend);display:inline" + d="M 472.46111,451.46754 416.80139,430.5257" + id="path14261-1" + inkscape:connector-type="polyline" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + inkscape:connection-start="#rect2837-4-06-5-0-0-9" + inkscape:connection-end="#g14234" + inkscape:connection-start-point="d4" + inkscape:connection-end-point="d4" + inkscape:connector-curvature="0" /> + <flowRoot + xml:space="preserve" + id="flowRoot3225" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + transform="matrix(1.066935,0,0,1.3411713,-43.506194,-197.99784)"><flowRegion + id="flowRegion3227"><rect + id="rect3229" + width="7.1428571" + height="12.857142" + x="157.14285" + y="171.6479" /></flowRegion><flowPara + id="flowPara3231" /></flowRoot> <path + style="fill:none;stroke:#000000;stroke-width:1.44055104px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:none;display:inline" + d="M 276.63415,364.87361 178.13203,307.02292" + id="path14259-4" + inkscape:connector-type="polyline" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + inkscape:connection-end="#g15423" + inkscape:connection-start="#g14234" + inkscape:connection-start-point="d4" + inkscape:connection-end-point="d4" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.44055104px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:none;display:inline" + d="m 393.58574,227.20486 102.091,-65.79483" + id="path14259-4-7" + inkscape:connector-type="polyline" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + inkscape:connection-end="#g14244" + inkscape:connection-start="#g14254" + inkscape:connection-start-point="d4" + inkscape:connection-end-point="d4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14.40550995px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="41.768562" + y="63.652237" + id="text15419-1" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + transform="scale(0.89192198,1.1211743)"><tspan + sodipodi:role="line" + id="tspan15421-7" + x="41.768562" + y="63.652237">X</tspan></text> + <text + xml:space="preserve" + style="font-size:14.40550995px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="134.9883" + y="62.797791" + id="text15419-9" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture.png" + inkscape:export-xdpi="300.7504" + inkscape:export-ydpi="300.7504" + transform="scale(0.89192198,1.1211743)"><tspan + sodipodi:role="line" + id="tspan15421-4" + x="134.9883" + y="62.797791">Y</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/blk_diag_dropper.png b/src/spdk/dpdk/doc/guides/prog_guide/img/blk_diag_dropper.png Binary files differnew file mode 100644 index 000000000..d2ef8fe6d --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/blk_diag_dropper.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-0.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-0.svg new file mode 100644 index 000000000..850e4d3b6 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-0.svg @@ -0,0 +1,640 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2014 Intel Corporation --> +<!-- Generated by Microsoft Visio, SVG Export link bonding - mode 0.svg Page-4 --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="332.15576" + height="334.46951" + viewBox="0 0 265.725 267.57566" + xml:space="preserve" + color-interpolation-filters="sRGB" + class="st16" + id="svg3406" + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="bond-mode-0.svg" + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible"><metadata + id="metadata3652"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1056" + id="namedview3650" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="1.1907084" + inkscape:cx="509.87351" + inkscape:cy="57.377583" + inkscape:window-x="0" + inkscape:window-y="29" + inkscape:window-maximized="1" + inkscape:current-layer="svg3406" /><style + type="text/css" + id="style3408"> + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25} + .st3 {fill:#4f87bb;stroke:#40709c;stroke-width:0.75} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st5 {fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75} + .st6 {fill:#4f87bb;font-family:Calibri;font-size:0.833336em} + .st7 {fill:#759fcc;fill-opacity:0.25;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.25} + .st8 {fill:#668bb3;stroke:#547395;stroke-width:0.75} + .st9 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st10 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st11 {fill:#759fcc;fill-opacity:0.22;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.22} + .st12 {fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25} + .st13 {fill:url(#grad0-40);stroke:#a6b6cd;stroke-width:0.75} + .st14 {fill:#70ad47;fill-opacity:0.25;filter:url(#filter_2);stroke:#70ad47;stroke-opacity:0.25} + .st15 {fill:#61973d;stroke:#507e31;stroke-width:0.75} + .st16 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + </style><defs + id="Patterns_And_Gradients"><linearGradient + id="grad0-11" + x1="-0.24584444" + y1="740.8343" + x2="167.49742" + y2="740.8343" + gradientTransform="scale(1.5253548,0.65558519)" + gradientUnits="userSpaceOnUse"><stop + offset="0" + stop-color="#e9eff7" + stop-opacity="1" + id="stop3412" /><stop + offset="0.24" + stop-color="#f4f7fb" + stop-opacity="1" + id="stop3414" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop3416" /></linearGradient><linearGradient + id="grad0-40" + x1="0" + y1="0" + x2="1" + y2="0" + gradientTransform="matrix(0.5,0.8660254,-0.8660254,0.5,0.6830127,-0.1830127)"><stop + offset="0" + stop-color="#f3f6fa" + stop-opacity="1" + id="stop3419" /><stop + offset="0.24" + stop-color="#f9fafc" + stop-opacity="1" + id="stop3421" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop3423" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient3654" + gradientTransform="scale(2.9084098,0.3438305)" + x1="-0.12893644" + y1="1717.1688" + x2="28.140807" + y2="1717.1688" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient3656" + gradientTransform="scale(2.093628,0.47763977)" + x1="-0.17911492" + y1="1233.6389" + x2="25.111911" + y2="1233.6389" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient3658" + gradientTransform="scale(2.093628,0.47763977)" + x1="-0.17911492" + y1="1233.6389" + x2="25.111911" + y2="1233.6389" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient3660" + gradientTransform="scale(2.1254139,0.4704966)" + x1="-0.17643623" + y1="1252.3682" + x2="25.498563" + y2="1252.3682" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient3662" + gradientTransform="scale(2.1254139,0.4704966)" + x1="-0.17643623" + y1="1252.3682" + x2="25.498563" + y2="1252.3682" + gradientUnits="userSpaceOnUse" /></defs><defs + id="Filters"><filter + id="filter_2" + color-interpolation-filters="sRGB"><feGaussianBlur + stdDeviation="2" + id="feGaussianBlur3427" /></filter></defs><g + id="g3429" + transform="translate(-13.045598,-14.663414)"><title + id="title3431">Page-4</title><g + id="shape1-1" + transform="translate(18,-516.416)"><title + id="title3434">Rectangle.7</title><desc + id="desc3436">User Application</desc><g + id="shadow1-2" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="534.41602" + width="255.118" + height="60.859798" + class="st2" + id="rect3439" + style="fill:#5b9bd5;fill-opacity:0.25;stroke:#5b9bd5;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="534.41602" + width="255.118" + height="60.859798" + class="st3" + id="rect3441" + style="fill:#4f87bb;stroke:#40709c;stroke-width:0.75" /><text + x="94" + y="567.84998" + class="st4" + id="text3443" + style="fill:#feffff;font-family:Calibri">User Application</text> +</g><g + id="group2-7" + transform="translate(18,-355.662)"><title + id="title3446">Sheet.2</title><g + id="shape3-8"><title + id="title3449">Rectangle.38</title><desc + id="desc3451">DPDK</desc><rect + x="0" + y="486.05499" + width="255.118" + height="109.22" + class="st5" + id="rect3453" + style="fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75" /><text + x="228.45" + y="499.06" + class="st6" + id="text3455" + style="fill:#4f87bb;font-family:Calibri">DPDK</text> +</g><g + id="shape4-13" + transform="translate(6.87402,-7.17304)"><title + id="title3458">Rectangle.16</title><desc + id="desc3460">bonded ethdev</desc><g + id="shadow4-14" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="523.16803" + width="241.157" + height="72.107201" + class="st7" + id="rect3463" + style="fill:#759fcc;fill-opacity:0.25;stroke:#759fcc;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="523.16803" + width="241.157" + height="72.107201" + class="st8" + id="rect3465" + style="fill:#668bb3;stroke:#547395;stroke-width:0.75" /><text + x="89.650002" + y="536.16998" + class="st4" + id="text3467" + style="fill:#feffff;font-family:Calibri">bonded ethdev</text> +</g><g + id="shape5-19" + transform="translate(13.9606,-14.1732)"><title + id="title3470">Rectangle.11</title><desc + id="desc3472">ethdev port</desc><g + id="shadow5-20" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st9" + id="rect3475" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st10" + id="rect3477" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text3479" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g><g + id="shape6-25" + transform="translate(91.9134,-14.1732)"><title + id="title3482">Rectangle.14</title><desc + id="desc3484">ethdev port</desc><g + id="shadow6-26" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st11" + id="rect3487" + style="fill:#759fcc;fill-opacity:0.22000002;stroke:#759fcc;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st12" + id="rect3489" + style="fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text3491" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g><g + id="shape7-31" + transform="translate(169.866,-14.1732)"><title + id="title3494">Rectangle.15</title><desc + id="desc3496">ethdev port</desc><g + id="shadow7-32" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st11" + id="rect3499" + style="fill:#759fcc;fill-opacity:0.22000002;stroke:#759fcc;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st12" + id="rect3501" + style="fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text3503" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g></g><g + id="shape8-37" + transform="matrix(0.00130551,-0.99999915,0.99999915,0.00130551,-449.822,159.557)"><title + id="title3506">Simple Double Arrow.14</title><path + d="m 0,595.28 11.34,-4.49 0,2.24 58.8,0 0,-2.24 11.33,4.49 -11.33,4.48 0,-2.24 -58.8,0 0,2.24 L 0,595.28 z" + class="st13" + id="path3508" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient3654);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape9-41" + transform="matrix(0.01125714,-0.99993664,0.99993664,0.01125714,-532.876,272.07)"><title + id="title3511">Simple Arrow</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 40.86,0 0,2.84 0,2.83 -40.86,0 0,2.83 L 0,595.28 z" + class="st13" + id="path3513" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient3656);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape10-44" + transform="matrix(-0.01125714,0.99993664,-0.99993664,-0.01125714,670.114,232.099)"><title + id="title3516">Simple Arrow.37</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 40.86,0 0,2.84 0,2.83 -40.86,0 0,2.83 L 0,595.28 z" + class="st13" + id="path3518" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient3658);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape11-47" + transform="matrix(0.01448398,-0.9998951,0.9998951,0.01448398,-450.646,270.634)"><title + id="title3521">Simple Arrow.38</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 42.48,0 0,2.84 0,2.83 -42.48,0 0,2.83 L 0,595.28 z" + class="st13" + id="path3523" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient3660);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape12-50" + transform="matrix(-0.01185051,-0.99992978,0.99992978,-0.01185051,-371.297,286.31)"><title + id="title3526">Simple Arrow.39</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 42.48,0 0,2.84 0,2.83 -42.48,0 0,2.83 L 0,595.28 z" + class="st13" + id="path3528" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient3662);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape13-53" + transform="translate(124.724,-436.365)"><title + id="title3531">Square.114</title><desc + id="desc3533">1</desc><g + id="shadow13-54" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect3536" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect3538" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text3540" + style="fill:#feffff;font-family:Calibri">1</text> +</g><g + id="shape14-59" + transform="translate(124.724,-455.698)"><title + id="title3543">Square.115</title><desc + id="desc3545">2</desc><g + id="shadow14-60" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect3548" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect3550" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text3552" + style="fill:#feffff;font-family:Calibri">2</text> +</g><g + id="shape15-65" + transform="translate(124.724,-474.406)"><title + id="title3555">Square.116</title><desc + id="desc3557">3</desc><g + id="shadow15-66" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect3560" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect3562" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text3564" + style="fill:#feffff;font-family:Calibri">3</text> +</g><g + id="shape16-71" + transform="translate(124.724,-493.739)"><title + id="title3567">Square.117</title><desc + id="desc3569">4</desc><g + id="shadow16-72" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect3572" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect3574" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text3576" + style="fill:#feffff;font-family:Calibri">4</text> +</g><g + id="shape17-77" + transform="translate(124.724,-513.071)"><title + id="title3579">Square.118</title><desc + id="desc3581">5</desc><g + id="shadow17-78" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect3584" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect3586" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text3588" + style="fill:#feffff;font-family:Calibri">5</text> +</g><g + id="shape18-83" + transform="translate(39.685,-320.315)"><title + id="title3591">Square.120</title><desc + id="desc3593">1</desc><g + id="shadow18-84" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect3596" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect3598" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text3600" + style="fill:#feffff;font-family:Calibri">1</text> +</g><g + id="shape19-89" + transform="translate(119.055,-320.315)"><title + id="title3603">Square.121</title><desc + id="desc3605">2</desc><g + id="shadow19-90" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect3608" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect3610" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text3612" + style="fill:#feffff;font-family:Calibri">2</text> +</g><g + id="shape20-95" + transform="translate(198.425,-320.315)"><title + id="title3615">Square.122</title><desc + id="desc3617">3</desc><g + id="shadow20-96" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect3620" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect3622" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text3624" + style="fill:#feffff;font-family:Calibri">3</text> +</g><g + id="shape21-101" + transform="translate(39.685,-338.74)"><title + id="title3627">Square.123</title><desc + id="desc3629">4</desc><g + id="shadow21-102" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect3632" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect3634" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text3636" + style="fill:#feffff;font-family:Calibri">4</text> +</g><g + id="shape22-107" + transform="translate(119.055,-338.74)"><title + id="title3639">Square.124</title><desc + id="desc3641">5</desc><g + id="shadow22-108" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect3644" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect3646" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text3648" + style="fill:#feffff;font-family:Calibri">5</text> +</g></g></svg>
\ No newline at end of file diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-1.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-1.svg new file mode 100644 index 000000000..7c81b856b --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-1.svg @@ -0,0 +1,726 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2014 Intel Corporation --> +<!-- Generated by Microsoft Visio, SVG Export link bonding - mode 1.svg Page-4 --> + +<svg + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="332.147" + height="304.04852" + viewBox="0 0 265.71799 243.23887" + xml:space="preserve" + color-interpolation-filters="sRGB" + class="st16" + id="svg4008" + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="bond-mode-1.svg" + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible"><metadata + id="metadata4196"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="640" + inkscape:window-height="480" + id="namedview4194" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="0.29932695" + inkscape:cx="509.87351" + inkscape:cy="-49.657453" + inkscape:window-x="0" + inkscape:window-y="29" + inkscape:window-maximized="0" + inkscape:current-layer="svg4008" /><v:documentProperties + v:langID="1033" + v:metric="true" + v:viewMarkup="false"><v:userDefs><v:ud + v:nameU="msvSubprocessMaster" + v:prompt="" + v:val="VT4(Rectangle)" /><v:ud + v:nameU="msvNoAutoConnect" + v:val="VT0(1):26" /></v:userDefs></v:documentProperties><style + type="text/css" + id="style4010"> + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25} + .st3 {fill:#4f87bb;stroke:#40709c;stroke-width:0.75} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st5 {fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75} + .st6 {fill:#4f87bb;font-family:Calibri;font-size:0.833336em} + .st7 {fill:#759fcc;fill-opacity:0.25;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.25} + .st8 {fill:#668bb3;stroke:#547395;stroke-width:0.75} + .st9 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st10 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st11 {fill:#bdd0e9;fill-opacity:0.22;filter:url(#filter_2);stroke:#bdd0e9;stroke-opacity:0.22} + .st12 {fill:#bdd0e9;stroke:#c7c8c8;stroke-width:0.25} + .st13 {fill:url(#grad0-40);stroke:#a6b6cd;stroke-width:0.75} + .st14 {fill:#70ad47;fill-opacity:0.25;filter:url(#filter_2);stroke:#70ad47;stroke-opacity:0.25} + .st15 {fill:#61973d;stroke:#507e31;stroke-width:0.75} + .st16 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + </style><defs + id="Patterns_And_Gradients"><linearGradient + id="grad0-11" + x1="-0.24584444" + y1="740.8343" + x2="167.49742" + y2="740.8343" + gradientTransform="scale(1.5253548,0.65558519)" + gradientUnits="userSpaceOnUse"><stop + offset="0" + stop-color="#e9eff7" + stop-opacity="1" + id="stop4014" /><stop + offset="0.24" + stop-color="#f4f7fb" + stop-opacity="1" + id="stop4016" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop4018" /></linearGradient><linearGradient + id="grad0-40" + x1="0" + y1="0" + x2="1" + y2="0" + gradientTransform="matrix(0.5,0.8660254,-0.8660254,0.5,0.6830127,-0.1830127)"><stop + offset="0" + stop-color="#f3f6fa" + stop-opacity="1" + id="stop4021" /><stop + offset="0.24" + stop-color="#f9fafc" + stop-opacity="1" + id="stop4023" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop4025" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient4198" + gradientTransform="scale(2.2585002,0.44277172)" + x1="-0.16603939" + y1="1333.4524" + x2="21.786582" + y2="1333.4524" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient4200" + gradientTransform="scale(2.093628,0.47763977)" + x1="-0.17911492" + y1="1233.6389" + x2="25.111911" + y2="1233.6389" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient4202" + gradientTransform="scale(2.093628,0.47763977)" + x1="-0.17911492" + y1="1233.6389" + x2="25.111911" + y2="1233.6389" + gradientUnits="userSpaceOnUse" /></defs><defs + id="Filters"><filter + id="filter_2" + color-interpolation-filters="sRGB"><feGaussianBlur + stdDeviation="2" + id="feGaussianBlur4029" /></filter></defs><g + v:mID="6" + v:index="4" + v:groupContext="foregroundPage" + id="g4031" + transform="translate(-13.045598,-14.67318)"><v:userDefs><v:ud + v:nameU="msvThemeOrder" + v:val="VT0(0):26" /></v:userDefs><title + id="title4033">Page-4</title><v:pageProperties + v:drawingScale="0.0393701" + v:pageScale="0.0393701" + v:drawingUnits="24" + v:shadowOffsetX="8.50394" + v:shadowOffsetY="-8.50394" /><g + id="shape39-1" + v:mID="39" + v:groupContext="shape" + transform="translate(18,-516.416)"><title + id="title4036">Rectangle.40</title><desc + id="desc4038">User Application</desc><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /></v:userDefs><v:textBlock + v:margins="rect(4,4,4,4)" + v:tabSpace="42.5197" /><v:textRect + cx="127.559" + cy="564.846" + width="255.12" + height="60.8598" /><g + id="shadow39-2" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="534.41602" + width="255.118" + height="60.859798" + class="st2" + id="rect4041" + style="fill:#5b9bd5;fill-opacity:0.25;stroke:#5b9bd5;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="534.41602" + width="255.118" + height="60.859798" + class="st3" + id="rect4043" + style="fill:#4f87bb;stroke:#40709c;stroke-width:0.75" /><text + x="94" + y="567.84998" + class="st4" + v:langID="2057" + id="text4045" + style="fill:#feffff;font-family:Calibri"><v:paragraph + v:horizAlign="1" /><v:tabList />User Application</text> +</g><g + id="group40-7" + transform="translate(18,-388.303)" + v:mID="40" + v:groupContext="group"><title + id="title4048">Sheet.40</title><g + id="shape41-8" + v:mID="41" + v:groupContext="shape"><title + id="title4051">Rectangle.38</title><desc + id="desc4053">DPDK</desc><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /></v:userDefs><v:textBlock + v:margins="rect(4,4,4,4)" + v:tabSpace="42.5197" + v:verticalAlign="0" /><v:textRect + cx="127.559" + cy="540.665" + width="255.12" + height="109.22" /><rect + x="0" + y="486.05499" + width="255.118" + height="109.22" + class="st5" + id="rect4055" + style="fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75" /><text + x="228.45" + y="499.06" + class="st6" + v:langID="2057" + id="text4057" + style="fill:#4f87bb;font-family:Calibri"><v:paragraph + v:horizAlign="2" /><v:tabList />DPDK</text> +</g><g + id="shape42-13" + v:mID="42" + v:groupContext="shape" + transform="translate(6.87402,-7.17304)"><title + id="title4060">Rectangle.16</title><desc + id="desc4062">bonded ethdev</desc><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /></v:userDefs><v:textBlock + v:margins="rect(4,4,4,4)" + v:tabSpace="42.5197" + v:verticalAlign="0" /><v:textRect + cx="120.579" + cy="559.222" + width="241.16" + height="72.1072" /><g + id="shadow42-14" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="523.16803" + width="241.157" + height="72.107201" + class="st7" + id="rect4065" + style="fill:#759fcc;fill-opacity:0.25;stroke:#759fcc;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="523.16803" + width="241.157" + height="72.107201" + class="st8" + id="rect4067" + style="fill:#668bb3;stroke:#547395;stroke-width:0.75" /><text + x="89.650002" + y="536.16998" + class="st4" + v:langID="2057" + id="text4069" + style="fill:#feffff;font-family:Calibri"><v:paragraph + v:horizAlign="1" /><v:tabList />bonded ethdev</text> +</g><g + id="shape43-19" + v:mID="43" + v:groupContext="shape" + transform="translate(13.9606,-14.1732)"><title + id="title4072">Rectangle.11</title><desc + id="desc4074">ethdev port</desc><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /></v:userDefs><v:textBlock + v:margins="rect(4,4,4,4)" + v:tabSpace="42.5197" /><v:textRect + cx="35.4331" + cy="577.516" + width="70.87" + height="35.5195" /><g + id="shadow43-20" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st9" + id="rect4077" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st10" + id="rect4079" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + v:langID="2057" + id="text4081" + style="fill:#feffff;font-family:Calibri"><v:paragraph + v:horizAlign="1" /><v:tabList />ethdev port</text> +</g><g + id="shape44-25" + v:mID="44" + v:groupContext="shape" + transform="translate(91.9134,-14.1732)"><title + id="title4084">Rectangle.14</title><desc + id="desc4086">ethdev port</desc><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /></v:userDefs><v:textBlock + v:margins="rect(4,4,4,4)" + v:tabSpace="42.5197" /><v:textRect + cx="35.4331" + cy="577.516" + width="70.87" + height="35.5195" /><g + id="shadow44-26" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st11" + id="rect4089" + style="fill:#bdd0e9;fill-opacity:0.22000002;stroke:#bdd0e9;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st12" + id="rect4091" + style="fill:#bdd0e9;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + v:langID="2057" + id="text4093" + style="fill:#feffff;font-family:Calibri"><v:paragraph + v:horizAlign="1" /><v:tabList />ethdev port</text> +</g><g + id="shape45-31" + v:mID="45" + v:groupContext="shape" + transform="translate(169.866,-14.1732)"><title + id="title4096">Rectangle.15</title><desc + id="desc4098">ethdev port</desc><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /></v:userDefs><v:textBlock + v:margins="rect(4,4,4,4)" + v:tabSpace="42.5197" /><v:textRect + cx="35.4331" + cy="577.516" + width="70.87" + height="35.5195" /><g + id="shadow45-32" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st11" + id="rect4101" + style="fill:#bdd0e9;fill-opacity:0.22000002;stroke:#bdd0e9;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st12" + id="rect4103" + style="fill:#bdd0e9;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + v:langID="2057" + id="text4105" + style="fill:#feffff;font-family:Calibri"><v:paragraph + v:horizAlign="1" /><v:tabList />ethdev port</text> +</g></g><g + id="shape46-37" + v:mID="46" + v:groupContext="shape" + transform="matrix(0.00217642,-0.99999763,0.99999763,0.00217642,-449.821,126.396)"><title + id="title4108">Simple Double Arrow.47</title><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /><v:ud + v:nameU="ArrowType" + v:prompt="" + v:val="VT0(3):26" /></v:userDefs><path + d="m 0,595.28 11.34,-4.49 0,2.24 26.15,0 0,-2.24 11.34,4.49 -11.34,4.48 0,-2.24 -26.15,0 0,2.24 L 0,595.28 z" + class="st13" + id="path4110" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient4198);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape47-41" + v:mID="47" + v:groupContext="shape" + transform="matrix(0.01125714,-0.99993664,0.99993664,0.01125714,-532.876,239.429)"><title + id="title4113">Simple Arrow.47</title><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /><v:ud + v:nameU="ArrowType" + v:prompt="" + v:val="VT0(2):26" /></v:userDefs><path + d="m 0,595.28 11.34,-5.67 0,2.83 40.86,0 0,2.84 0,2.83 -40.86,0 0,2.83 L 0,595.28 z" + class="st13" + id="path4115" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient4200);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape48-44" + v:mID="48" + v:groupContext="shape" + transform="matrix(-0.01125714,0.99993664,-0.99993664,-0.01125714,670.114,199.457)"><title + id="title4118">Simple Arrow.49</title><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /><v:ud + v:nameU="ArrowType" + v:prompt="" + v:val="VT0(2):26" /></v:userDefs><path + d="m 0,595.28 11.34,-5.67 0,2.83 40.86,0 0,2.84 0,2.83 -40.86,0 0,2.83 L 0,595.28 z" + class="st13" + id="path4120" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient4202);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape49-47" + v:mID="49" + v:groupContext="shape" + transform="translate(156.898,-472.791)"><title + id="title4123">Square.108</title><desc + id="desc4125">1</desc><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /></v:userDefs><v:textBlock + v:margins="rect(4,4,4,4)" + v:tabSpace="42.5197" /><v:textRect + cx="7.08661" + cy="588.189" + width="14.18" + height="14.1732" /><g + id="shadow49-48" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect4128" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect4130" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + v:langID="2057" + id="text4132" + style="fill:#feffff;font-family:Calibri"><v:paragraph + v:horizAlign="1" /><v:tabList />1</text> +</g><g + id="shape50-53" + v:mID="50" + v:groupContext="shape" + transform="translate(156.898,-492.123)"><title + id="title4135">Square.109</title><desc + id="desc4137">2</desc><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /></v:userDefs><v:textBlock + v:margins="rect(4,4,4,4)" + v:tabSpace="42.5197" /><v:textRect + cx="7.08661" + cy="588.189" + width="14.18" + height="14.1732" /><g + id="shadow50-54" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect4140" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect4142" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + v:langID="2057" + id="text4144" + style="fill:#feffff;font-family:Calibri"><v:paragraph + v:horizAlign="1" /><v:tabList />2</text> +</g><g + id="shape51-59" + v:mID="51" + v:groupContext="shape" + transform="translate(156.898,-510.831)"><title + id="title4147">Square.110</title><desc + id="desc4149">3</desc><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /></v:userDefs><v:textBlock + v:margins="rect(4,4,4,4)" + v:tabSpace="42.5197" /><v:textRect + cx="7.08661" + cy="588.189" + width="14.18" + height="14.1732" /><g + id="shadow51-60" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect4152" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect4154" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + v:langID="2057" + id="text4156" + style="fill:#feffff;font-family:Calibri"><v:paragraph + v:horizAlign="1" /><v:tabList />3</text> +</g><g + id="shape52-65" + v:mID="52" + v:groupContext="shape" + transform="translate(39.2598,-344.636)"><title + id="title4159">Square.111</title><desc + id="desc4161">1</desc><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /></v:userDefs><v:textBlock + v:margins="rect(4,4,4,4)" + v:tabSpace="42.5197" /><v:textRect + cx="7.08661" + cy="588.189" + width="14.18" + height="14.1732" /><g + id="shadow52-66" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect4164" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect4166" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + v:langID="2057" + id="text4168" + style="fill:#feffff;font-family:Calibri"><v:paragraph + v:horizAlign="1" /><v:tabList />1</text> +</g><g + id="shape53-71" + v:mID="53" + v:groupContext="shape" + transform="translate(39.2598,-363.969)"><title + id="title4171">Square.112</title><desc + id="desc4173">2</desc><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /></v:userDefs><v:textBlock + v:margins="rect(4,4,4,4)" + v:tabSpace="42.5197" /><v:textRect + cx="7.08661" + cy="588.189" + width="14.18" + height="14.1732" /><g + id="shadow53-72" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect4176" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect4178" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + v:langID="2057" + id="text4180" + style="fill:#feffff;font-family:Calibri"><v:paragraph + v:horizAlign="1" /><v:tabList />2</text> +</g><g + id="shape54-77" + v:mID="54" + v:groupContext="shape" + transform="translate(39.2598,-382.677)"><title + id="title4183">Square.113</title><desc + id="desc4185">3</desc><v:userDefs><v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /></v:userDefs><v:textBlock + v:margins="rect(4,4,4,4)" + v:tabSpace="42.5197" /><v:textRect + cx="7.08661" + cy="588.189" + width="14.18" + height="14.1732" /><g + id="shadow54-78" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect4188" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect4190" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + v:langID="2057" + id="text4192" + style="fill:#feffff;font-family:Calibri"><v:paragraph + v:horizAlign="1" /><v:tabList />3</text> +</g></g></svg>
\ No newline at end of file diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-2.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-2.svg new file mode 100644 index 000000000..eb63a03a9 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-2.svg @@ -0,0 +1,704 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2014 Intel Corporation --> +<!-- Generated by Microsoft Visio, SVG Export link bonding - mode 2.svg Page-4 --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="332.147" + height="358.22595" + viewBox="0 0 265.71799 286.58082" + xml:space="preserve" + color-interpolation-filters="sRGB" + class="st20" + id="svg5449" + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="bond-mode-2.svg" + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible"><metadata + id="metadata5725"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="640" + inkscape:window-height="480" + id="namedview5723" + showgrid="false" + inkscape:zoom="0.29932695" + inkscape:cx="509.87351" + inkscape:cy="4.5199676" + inkscape:window-x="0" + inkscape:window-y="29" + inkscape:window-maximized="0" + inkscape:current-layer="svg5449" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><style + type="text/css" + id="style5451"> + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25} + .st3 {fill:#4f87bb;stroke:#40709c;stroke-width:0.75} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st5 {fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75} + .st6 {fill:#4f87bb;font-family:Calibri;font-size:0.833336em} + .st7 {fill:#759fcc;fill-opacity:0.25;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.25} + .st8 {fill:#668bb3;stroke:#547395;stroke-width:0.75} + .st9 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st10 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st11 {fill:#759fcc;fill-opacity:0.22;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.22} + .st12 {fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25} + .st13 {fill:url(#grad0-40);stroke:#a6b6cd;stroke-width:0.75} + .st14 {fill:#70ad47;fill-opacity:0.25;filter:url(#filter_2);stroke:#70ad47;stroke-opacity:0.25} + .st15 {fill:#61973d;stroke:#507e31;stroke-width:0.75} + .st16 {fill:#fec000;fill-opacity:0.25;filter:url(#filter_2);stroke:#fec000;stroke-opacity:0.25} + .st17 {fill:#dfa800;stroke:#ba8c00;stroke-width:0.75} + .st18 {fill:#ed7d31;fill-opacity:0.25;filter:url(#filter_2);stroke:#ed7d31;stroke-opacity:0.25} + .st19 {fill:#d06d29;stroke:#ae5a21;stroke-width:0.75} + .st20 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + </style><defs + id="Patterns_And_Gradients"><linearGradient + id="grad0-11" + x1="-0.24584444" + y1="740.8343" + x2="167.49742" + y2="740.8343" + gradientTransform="scale(1.5253548,0.65558519)" + gradientUnits="userSpaceOnUse"><stop + offset="0" + stop-color="#e9eff7" + stop-opacity="1" + id="stop5455" /><stop + offset="0.24" + stop-color="#f4f7fb" + stop-opacity="1" + id="stop5457" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop5459" /></linearGradient><linearGradient + id="grad0-40" + x1="0" + y1="0" + x2="1" + y2="0" + gradientTransform="matrix(0.5,0.8660254,-0.8660254,0.5,0.6830127,-0.1830127)"><stop + offset="0" + stop-color="#f3f6fa" + stop-opacity="1" + id="stop5462" /><stop + offset="0.24" + stop-color="#f9fafc" + stop-opacity="1" + id="stop5464" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop5466" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6619" + gradientTransform="scale(3.1025013,0.32232057)" + x1="-0.12087021" + y1="1831.7633" + x2="30.035443" + y2="1831.7633" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6621" + gradientTransform="scale(2.093628,0.47763977)" + x1="-0.17911492" + y1="1233.6389" + x2="25.111911" + y2="1233.6389" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6623" + gradientTransform="scale(2.093628,0.47763977)" + x1="-0.17911492" + y1="1233.6389" + x2="25.111911" + y2="1233.6389" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6625" + gradientTransform="scale(2.1254139,0.4704966)" + x1="-0.17643623" + y1="1252.3682" + x2="25.498563" + y2="1252.3682" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6627" + gradientTransform="scale(2.1254139,0.4704966)" + x1="-0.17643623" + y1="1252.3682" + x2="25.498563" + y2="1252.3682" + gradientUnits="userSpaceOnUse" /></defs><defs + id="Filters"><filter + id="filter_2" + color-interpolation-filters="sRGB"><feGaussianBlur + stdDeviation="2" + id="feGaussianBlur5470" /></filter></defs><g + id="g5472" + transform="translate(-13.045598,-14.67318)"><title + id="title5474">Page-4</title><g + id="shape55-1" + transform="translate(18,-516.416)"><title + id="title5477">Rectangle.151</title><desc + id="desc5479">User Application</desc><g + id="shadow55-2" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="534.41602" + width="255.118" + height="60.859798" + class="st2" + id="rect5482" + style="fill:#5b9bd5;fill-opacity:0.25;stroke:#5b9bd5;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="534.41602" + width="255.118" + height="60.859798" + class="st3" + id="rect5484" + style="fill:#4f87bb;stroke:#40709c;stroke-width:0.75" /><text + x="94" + y="567.84998" + class="st4" + id="text5486" + style="fill:#feffff;font-family:Calibri">User Application</text> +</g><g + id="group56-7" + transform="translate(18,-344.323)"><title + id="title5489">Sheet.56</title><g + id="shape57-8"><title + id="title5492">Rectangle.38</title><desc + id="desc5494">DPDK</desc><rect + x="0" + y="486.05499" + width="255.118" + height="109.22" + class="st5" + id="rect5496" + style="fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75" /><text + x="228.45" + y="499.06" + class="st6" + id="text5498" + style="fill:#4f87bb;font-family:Calibri">DPDK</text> +</g><g + id="shape58-13" + transform="translate(6.87402,-7.17304)"><title + id="title5501">Rectangle.16</title><desc + id="desc5503">bonded ethdev</desc><g + id="shadow58-14" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="523.16803" + width="241.157" + height="72.107201" + class="st7" + id="rect5506" + style="fill:#759fcc;fill-opacity:0.25;stroke:#759fcc;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="523.16803" + width="241.157" + height="72.107201" + class="st8" + id="rect5508" + style="fill:#668bb3;stroke:#547395;stroke-width:0.75" /><text + x="89.650002" + y="536.16998" + class="st4" + id="text5510" + style="fill:#feffff;font-family:Calibri">bonded ethdev</text> +</g><g + id="shape59-19" + transform="translate(13.9606,-14.1732)"><title + id="title5513">Rectangle.11</title><desc + id="desc5515">ethdev port</desc><g + id="shadow59-20" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st9" + id="rect5518" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st10" + id="rect5520" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text5522" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g><g + id="shape60-25" + transform="translate(91.9134,-14.1732)"><title + id="title5525">Rectangle.14</title><desc + id="desc5527">ethdev port</desc><g + id="shadow60-26" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st11" + id="rect5530" + style="fill:#759fcc;fill-opacity:0.22000002;stroke:#759fcc;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st12" + id="rect5532" + style="fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text5534" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g><g + id="shape61-31" + transform="translate(169.866,-14.1732)"><title + id="title5537">Rectangle.15</title><desc + id="desc5539">ethdev port</desc><g + id="shadow61-32" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st11" + id="rect5542" + style="fill:#759fcc;fill-opacity:0.22000002;stroke:#759fcc;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st12" + id="rect5544" + style="fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text5546" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g></g><g + id="shape62-37" + transform="matrix(0.00114494,-0.99999934,0.99999934,0.00114494,-449.822,170.991)"><title + id="title5549">Simple Double Arrow.158</title><path + d="m 0,595.28 11.34,-4.49 0,2.24 70.13,0 0,-2.24 11.34,4.49 -11.34,4.48 0,-2.24 -70.13,0 0,2.24 L 0,595.28 z" + class="st13" + id="path5551" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6619);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape63-41" + transform="matrix(0.01125714,-0.99993664,0.99993664,0.01125714,-532.876,283.409)"><title + id="title5554">Simple Arrow.159</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 40.86,0 0,2.84 0,2.83 -40.86,0 0,2.83 L 0,595.28 z" + class="st13" + id="path5556" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6621);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape64-44" + transform="matrix(-0.01125714,0.99993664,-0.99993664,-0.01125714,670.114,243.437)"><title + id="title5559">Simple Arrow.160</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 40.86,0 0,2.84 0,2.83 -40.86,0 0,2.83 L 0,595.28 z" + class="st13" + id="path5561" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6623);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape65-47" + transform="matrix(0.01448398,-0.9998951,0.9998951,0.01448398,-450.646,281.973)"><title + id="title5564">Simple Arrow.161</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 42.48,0 0,2.84 0,2.83 -42.48,0 0,2.83 L 0,595.28 z" + class="st13" + id="path5566" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6625);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape66-50" + transform="matrix(-0.01185051,-0.99992978,0.99992978,-0.01185051,-371.297,297.649)"><title + id="title5569">Simple Arrow.162</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 42.48,0 0,2.84 0,2.83 -42.48,0 0,2.83 L 0,595.28 z" + class="st13" + id="path5571" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6627);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape67-53" + transform="translate(121.039,-421.115)"><title + id="title5574">Square.163</title><desc + id="desc5576">1</desc><g + id="shadow67-54" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5579" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5581" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5583" + style="fill:#feffff;font-family:Calibri">1</text> +</g><g + id="shape68-59" + transform="translate(121.039,-440.447)"><title + id="title5586">Square.164</title><desc + id="desc5588">2</desc><g + id="shadow68-60" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st16" + id="rect5591" + style="fill:#fec000;fill-opacity:0.25;stroke:#fec000;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st17" + id="rect5593" + style="fill:#dfa800;stroke:#ba8c00;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5595" + style="fill:#feffff;font-family:Calibri">2</text> +</g><g + id="shape69-65" + transform="translate(121.039,-459.156)"><title + id="title5598">Square.165</title><desc + id="desc5600">3</desc><g + id="shadow69-66" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5603" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5605" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5607" + style="fill:#feffff;font-family:Calibri">3</text> +</g><g + id="shape70-71" + transform="translate(121.039,-478.488)"><title + id="title5610">Square.166</title><desc + id="desc5612">4</desc><g + id="shadow70-72" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st16" + id="rect5615" + style="fill:#fec000;fill-opacity:0.25;stroke:#fec000;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st17" + id="rect5617" + style="fill:#dfa800;stroke:#ba8c00;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5619" + style="fill:#feffff;font-family:Calibri">4</text> +</g><g + id="shape71-77" + transform="translate(121.039,-497.82)"><title + id="title5622">Square.167</title><desc + id="desc5624">5</desc><g + id="shadow71-78" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5627" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5629" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5631" + style="fill:#feffff;font-family:Calibri">5</text> +</g><g + id="shape72-83" + transform="translate(121.039,-517.153)"><title + id="title5634">Square.168</title><desc + id="desc5636">6</desc><g + id="shadow72-84" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st18" + id="rect5639" + style="fill:#ed7d31;fill-opacity:0.25;stroke:#ed7d31;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st19" + id="rect5641" + style="fill:#d06d29;stroke:#ae5a21;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5643" + style="fill:#feffff;font-family:Calibri">6</text> +</g><g + id="group73-89" + transform="translate(116.787,-301.294)"><title + id="title5646">Sheet.73</title><g + id="shape74-90"><title + id="title5649">Square.172</title><desc + id="desc5651">2</desc><g + id="shadow74-91" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st16" + id="rect5654" + style="fill:#fec000;fill-opacity:0.25;stroke:#fec000;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st17" + id="rect5656" + style="fill:#dfa800;stroke:#ba8c00;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5658" + style="fill:#feffff;font-family:Calibri">2</text> +</g><g + id="shape75-96" + transform="translate(0,-19.0205)"><title + id="title5661">Square.173</title><desc + id="desc5663">4</desc><g + id="shadow75-97" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st16" + id="rect5666" + style="fill:#fec000;fill-opacity:0.25;stroke:#fec000;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st17" + id="rect5668" + style="fill:#dfa800;stroke:#ba8c00;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5670" + style="fill:#feffff;font-family:Calibri">4</text> +</g></g><g + id="shape76-102" + transform="translate(194.74,-301.294)"><title + id="title5673">Square.175</title><desc + id="desc5675">6</desc><g + id="shadow76-103" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st18" + id="rect5678" + style="fill:#ed7d31;fill-opacity:0.25;stroke:#ed7d31;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st19" + id="rect5680" + style="fill:#d06d29;stroke:#ae5a21;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5682" + style="fill:#feffff;font-family:Calibri">6</text> +</g><g + id="group77-108" + transform="translate(38.8346,-301.294)"><title + id="title5685">Sheet.77</title><g + id="shape78-109"><title + id="title5688">Square.169</title><desc + id="desc5690">1</desc><g + id="shadow78-110" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5693" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5695" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5697" + style="fill:#feffff;font-family:Calibri">1</text> +</g><g + id="shape79-115" + transform="translate(0,-19.0205)"><title + id="title5700">Square.170</title><desc + id="desc5702">3</desc><g + id="shadow79-116" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5705" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5707" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5709" + style="fill:#feffff;font-family:Calibri">3</text> +</g><g + id="shape80-121" + transform="translate(0,-38.1813)"><title + id="title5712">Square.171</title><desc + id="desc5714">5</desc><g + id="shadow80-122" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5717" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5719" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5721" + style="fill:#feffff;font-family:Calibri">5</text> +</g></g></g></svg>
\ No newline at end of file diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-3.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-3.svg new file mode 100644 index 000000000..0afe4a27b --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-3.svg @@ -0,0 +1,704 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2014 Intel Corporation --> +<!-- Generated by Microsoft Visio, SVG Export link bonding - mode 3.svg Page-4 --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="332.147" + height="300.50479" + viewBox="0 0 265.71799 240.40388" + xml:space="preserve" + color-interpolation-filters="sRGB" + class="st16" + id="svg5727" + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="bond-mode-3.svg" + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible"><metadata + id="metadata6009"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="640" + inkscape:window-height="480" + id="namedview6007" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="0.29932695" + inkscape:cx="509.87351" + inkscape:cy="-53.201198" + inkscape:window-x="0" + inkscape:window-y="29" + inkscape:window-maximized="0" + inkscape:current-layer="svg5727" /><style + type="text/css" + id="style5729"> + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25} + .st3 {fill:#4f87bb;stroke:#40709c;stroke-width:0.75} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st5 {fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75} + .st6 {fill:#4f87bb;font-family:Calibri;font-size:0.833336em} + .st7 {fill:#759fcc;fill-opacity:0.25;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.25} + .st8 {fill:#668bb3;stroke:#547395;stroke-width:0.75} + .st9 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st10 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st11 {fill:#759fcc;fill-opacity:0.22;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.22} + .st12 {fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25} + .st13 {fill:url(#grad0-40);stroke:#a6b6cd;stroke-width:0.75} + .st14 {fill:#70ad47;fill-opacity:0.25;filter:url(#filter_2);stroke:#70ad47;stroke-opacity:0.25} + .st15 {fill:#61973d;stroke:#507e31;stroke-width:0.75} + .st16 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + </style><defs + id="Patterns_And_Gradients"><linearGradient + id="grad0-11" + x1="-0.24584444" + y1="740.8343" + x2="167.49742" + y2="740.8343" + gradientTransform="scale(1.5253548,0.65558519)" + gradientUnits="userSpaceOnUse"><stop + offset="0" + stop-color="#e9eff7" + stop-opacity="1" + id="stop5733" /><stop + offset="0.24" + stop-color="#f4f7fb" + stop-opacity="1" + id="stop5735" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop5737" /></linearGradient><linearGradient + id="grad0-40" + x1="0" + y1="0" + x2="1" + y2="0" + gradientTransform="matrix(0.5,0.8660254,-0.8660254,0.5,0.6830127,-0.1830127)"><stop + offset="0" + stop-color="#f3f6fa" + stop-opacity="1" + id="stop5740" /><stop + offset="0.24" + stop-color="#f9fafc" + stop-opacity="1" + id="stop5742" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop5744" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6590" + gradientTransform="scale(2.2585002,0.44277172)" + x1="-0.16603939" + y1="1333.4524" + x2="21.786582" + y2="1333.4524" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6592" + gradientTransform="scale(2.093628,0.47763977)" + x1="-0.17911492" + y1="1233.6389" + x2="25.111911" + y2="1233.6389" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6594" + gradientTransform="scale(2.093628,0.47763977)" + x1="-0.17911492" + y1="1233.6389" + x2="25.111911" + y2="1233.6389" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6596" + gradientTransform="scale(2.1254139,0.4704966)" + x1="-0.17643623" + y1="1252.3682" + x2="25.498563" + y2="1252.3682" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6598" + gradientTransform="scale(2.1254139,0.4704966)" + x1="-0.17643623" + y1="1252.3682" + x2="25.498563" + y2="1252.3682" + gradientUnits="userSpaceOnUse" /></defs><defs + id="Filters"><filter + id="filter_2" + color-interpolation-filters="sRGB"><feGaussianBlur + stdDeviation="2" + id="feGaussianBlur5748" /></filter></defs><g + id="g5750" + transform="translate(-13.045598,-14.67318)"><title + id="title5752">Page-4</title><g + id="shape81-1" + transform="translate(18,-516.416)"><title + id="title5755">Rectangle.74</title><desc + id="desc5757">User Application</desc><g + id="shadow81-2" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="534.41602" + width="255.118" + height="60.859798" + class="st2" + id="rect5760" + style="fill:#5b9bd5;fill-opacity:0.25;stroke:#5b9bd5;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="534.41602" + width="255.118" + height="60.859798" + class="st3" + id="rect5762" + style="fill:#4f87bb;stroke:#40709c;stroke-width:0.75" /><text + x="94" + y="567.84998" + class="st4" + id="text5764" + style="fill:#feffff;font-family:Calibri">User Application</text> +</g><g + id="group82-7" + transform="translate(18,-388.303)"><title + id="title5767">Sheet.82</title><g + id="shape83-8"><title + id="title5770">Rectangle.38</title><desc + id="desc5772">DPDK</desc><rect + x="0" + y="486.05499" + width="255.118" + height="109.22" + class="st5" + id="rect5774" + style="fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75" /><text + x="228.45" + y="499.06" + class="st6" + id="text5776" + style="fill:#4f87bb;font-family:Calibri">DPDK</text> +</g><g + id="shape84-13" + transform="translate(6.87402,-7.17304)"><title + id="title5779">Rectangle.16</title><desc + id="desc5781">bonded ethdev</desc><g + id="shadow84-14" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="523.16803" + width="241.157" + height="72.107201" + class="st7" + id="rect5784" + style="fill:#759fcc;fill-opacity:0.25;stroke:#759fcc;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="523.16803" + width="241.157" + height="72.107201" + class="st8" + id="rect5786" + style="fill:#668bb3;stroke:#547395;stroke-width:0.75" /><text + x="89.650002" + y="536.16998" + class="st4" + id="text5788" + style="fill:#feffff;font-family:Calibri">bonded ethdev</text> +</g><g + id="shape85-19" + transform="translate(13.9606,-14.1732)"><title + id="title5791">Rectangle.11</title><desc + id="desc5793">ethdev port</desc><g + id="shadow85-20" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st9" + id="rect5796" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st10" + id="rect5798" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text5800" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g><g + id="shape86-25" + transform="translate(91.9134,-14.1732)"><title + id="title5803">Rectangle.14</title><desc + id="desc5805">ethdev port</desc><g + id="shadow86-26" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st11" + id="rect5808" + style="fill:#759fcc;fill-opacity:0.22000002;stroke:#759fcc;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st12" + id="rect5810" + style="fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text5812" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g><g + id="shape87-31" + transform="translate(169.866,-14.1732)"><title + id="title5815">Rectangle.15</title><desc + id="desc5817">ethdev port</desc><g + id="shadow87-32" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st11" + id="rect5820" + style="fill:#759fcc;fill-opacity:0.22000002;stroke:#759fcc;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st12" + id="rect5822" + style="fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text5824" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g></g><g + id="shape88-37" + transform="matrix(0.00217642,-0.99999763,0.99999763,0.00217642,-449.821,126.396)"><title + id="title5827">Simple Double Arrow.81</title><path + d="m 0,595.28 11.34,-4.49 0,2.24 26.15,0 0,-2.24 11.34,4.49 -11.34,4.48 0,-2.24 -26.15,0 0,2.24 L 0,595.28 z" + class="st13" + id="path5829" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6590);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape89-41" + transform="matrix(0.01125714,-0.99993664,0.99993664,0.01125714,-532.876,239.429)"><title + id="title5832">Simple Arrow.82</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 40.86,0 0,2.84 0,2.83 -40.86,0 0,2.83 L 0,595.28 z" + class="st13" + id="path5834" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6592);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape90-44" + transform="matrix(-0.01125714,0.99993664,-0.99993664,-0.01125714,670.114,199.457)"><title + id="title5837">Simple Arrow.83</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 40.86,0 0,2.84 0,2.83 -40.86,0 0,2.83 L 0,595.28 z" + class="st13" + id="path5839" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6594);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape91-47" + transform="matrix(0.01448398,-0.9998951,0.9998951,0.01448398,-450.646,237.992)"><title + id="title5842">Simple Arrow.84</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 42.48,0 0,2.84 0,2.83 -42.48,0 0,2.83 L 0,595.28 z" + class="st13" + id="path5844" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6596);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape92-50" + transform="matrix(-0.01185051,-0.99992978,0.99992978,-0.01185051,-371.297,253.669)"><title + id="title5847">Simple Arrow.85</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 42.48,0 0,2.84 0,2.83 -42.48,0 0,2.83 L 0,595.28 z" + class="st13" + id="path5849" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6598);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="group93-53" + transform="translate(37.8425,-347.471)"><title + id="title5852">Sheet.93</title><g + id="shape94-54"><title + id="title5855">Square.125</title><desc + id="desc5857">1</desc><g + id="shadow94-55" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5860" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5862" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5864" + style="fill:#feffff;font-family:Calibri">1</text> +</g><g + id="shape95-60" + transform="translate(0,-19.3323)"><title + id="title5867">Square.126</title><desc + id="desc5869">2</desc><g + id="shadow95-61" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5872" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5874" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5876" + style="fill:#feffff;font-family:Calibri">2</text> +</g><g + id="shape96-66" + transform="translate(0,-38.0409)"><title + id="title5879">Square.127</title><desc + id="desc5881">3</desc><g + id="shadow96-67" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5884" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5886" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5888" + style="fill:#feffff;font-family:Calibri">3</text> +</g></g><g + id="group97-72" + transform="translate(119.055,-347.471)"><title + id="title5891">Sheet.97</title><g + id="shape98-73"><title + id="title5894">Square.125</title><desc + id="desc5896">1</desc><g + id="shadow98-74" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5899" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5901" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5903" + style="fill:#feffff;font-family:Calibri">1</text> +</g><g + id="shape99-79" + transform="translate(0,-19.3323)"><title + id="title5906">Square.126</title><desc + id="desc5908">2</desc><g + id="shadow99-80" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5911" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5913" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5915" + style="fill:#feffff;font-family:Calibri">2</text> +</g><g + id="shape100-85" + transform="translate(0,-38.0409)"><title + id="title5918">Square.127</title><desc + id="desc5920">3</desc><g + id="shadow100-86" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5923" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5925" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5927" + style="fill:#feffff;font-family:Calibri">3</text> +</g></g><g + id="group101-91" + transform="translate(200.268,-347.471)"><title + id="title5930">Sheet.101</title><g + id="shape102-92"><title + id="title5933">Square.125</title><desc + id="desc5935">1</desc><g + id="shadow102-93" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5938" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5940" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5942" + style="fill:#feffff;font-family:Calibri">1</text> +</g><g + id="shape103-98" + transform="translate(0,-19.3323)"><title + id="title5945">Square.126</title><desc + id="desc5947">2</desc><g + id="shadow103-99" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5950" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5952" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5954" + style="fill:#feffff;font-family:Calibri">2</text> +</g><g + id="shape104-104" + transform="translate(0,-38.0409)"><title + id="title5957">Square.127</title><desc + id="desc5959">3</desc><g + id="shadow104-105" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5962" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5964" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5966" + style="fill:#feffff;font-family:Calibri">3</text> +</g></g><g + id="group105-110" + transform="translate(122.882,-473.386)"><title + id="title5969">Sheet.105</title><g + id="shape106-111"><title + id="title5972">Square.125</title><desc + id="desc5974">1</desc><g + id="shadow106-112" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5977" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5979" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5981" + style="fill:#feffff;font-family:Calibri">1</text> +</g><g + id="shape107-117" + transform="translate(0,-19.3323)"><title + id="title5984">Square.126</title><desc + id="desc5986">2</desc><g + id="shadow107-118" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect5989" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect5991" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text5993" + style="fill:#feffff;font-family:Calibri">2</text> +</g><g + id="shape108-123" + transform="translate(0,-38.0409)"><title + id="title5996">Square.127</title><desc + id="desc5998">3</desc><g + id="shadow108-124" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect6001" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect6003" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6005" + style="fill:#feffff;font-family:Calibri">3</text> +</g></g></g></svg>
\ No newline at end of file diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-4.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-4.svg new file mode 100644 index 000000000..d0caf854c --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-4.svg @@ -0,0 +1,786 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2014 Intel Corporation --> +<!-- Generated by Microsoft Visio, SVG Export link bonding - mode 4.svg Page-4 --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="332.147" + height="380.51215" + viewBox="0 0 265.71799 304.40978" + xml:space="preserve" + color-interpolation-filters="sRGB" + class="st22" + id="svg6011" + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="bond-mode-4.svg" + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible"><metadata + id="metadata6317"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="640" + inkscape:window-height="480" + id="namedview6315" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="0.29932695" + inkscape:cx="509.87351" + inkscape:cy="26.806185" + inkscape:window-x="0" + inkscape:window-y="29" + inkscape:window-maximized="0" + inkscape:current-layer="svg6011" /><style + type="text/css" + id="style6013"> + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25} + .st3 {fill:#4f87bb;stroke:#40709c;stroke-width:0.75} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st5 {fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75} + .st6 {fill:#4f87bb;font-family:Calibri;font-size:0.833336em} + .st7 {fill:#759fcc;fill-opacity:0.25;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.25} + .st8 {fill:#668bb3;stroke:#547395;stroke-width:0.75} + .st9 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st10 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st11 {fill:#759fcc;fill-opacity:0.22;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.22} + .st12 {fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25} + .st13 {fill:url(#grad0-40);stroke:#a6b6cd;stroke-width:0.75} + .st14 {fill:#70ad47;fill-opacity:0.25;filter:url(#filter_2);stroke:#70ad47;stroke-opacity:0.25} + .st15 {fill:#61973d;stroke:#507e31;stroke-width:0.75} + .st16 {fill:#fec000;fill-opacity:0.25;filter:url(#filter_2);stroke:#fec000;stroke-opacity:0.25} + .st17 {fill:#dfa800;stroke:#ba8c00;stroke-width:0.75} + .st18 {fill:#ed7d31;fill-opacity:0.25;filter:url(#filter_2);stroke:#ed7d31;stroke-opacity:0.25} + .st19 {fill:#d06d29;stroke:#ae5a21;stroke-width:0.75} + .st20 {fill:#bdd0e9;fill-opacity:0.25;filter:url(#filter_2);stroke:#bdd0e9;stroke-opacity:0.25} + .st21 {fill:#a6b6cd;stroke:#8a98ab;stroke-width:0.75} + .st22 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + </style><defs + id="Patterns_And_Gradients"><linearGradient + id="grad0-11" + x1="-0.24584444" + y1="740.8343" + x2="167.49742" + y2="740.8343" + gradientTransform="scale(1.5253548,0.65558519)" + gradientUnits="userSpaceOnUse"><stop + offset="0" + stop-color="#e9eff7" + stop-opacity="1" + id="stop6017" /><stop + offset="0.24" + stop-color="#f4f7fb" + stop-opacity="1" + id="stop6019" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop6021" /></linearGradient><linearGradient + id="grad0-40" + x1="0" + y1="0" + x2="1" + y2="0" + gradientTransform="matrix(0.5,0.8660254,-0.8660254,0.5,0.6830127,-0.1830127)"><stop + offset="0" + stop-color="#f3f6fa" + stop-opacity="1" + id="stop6024" /><stop + offset="0.24" + stop-color="#f9fafc" + stop-opacity="1" + id="stop6026" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop6028" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6580" + gradientTransform="scale(3.1025013,0.32232057)" + x1="-0.12087021" + y1="1831.7633" + x2="30.035443" + y2="1831.7633" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6582" + gradientTransform="scale(2.093628,0.47763977)" + x1="-0.17911492" + y1="1233.6389" + x2="25.111911" + y2="1233.6389" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6584" + gradientTransform="scale(2.093628,0.47763977)" + x1="-0.17911492" + y1="1233.6389" + x2="25.111911" + y2="1233.6389" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6586" + gradientTransform="scale(2.1254139,0.4704966)" + x1="-0.17643623" + y1="1252.3682" + x2="25.498563" + y2="1252.3682" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6588" + gradientTransform="scale(2.1254139,0.4704966)" + x1="-0.17643623" + y1="1252.3682" + x2="25.498563" + y2="1252.3682" + gradientUnits="userSpaceOnUse" /></defs><defs + id="Filters"><filter + id="filter_2" + color-interpolation-filters="sRGB"><feGaussianBlur + stdDeviation="2" + id="feGaussianBlur6032" /></filter></defs><g + id="g6034" + transform="translate(-13.045598,-14.67318)"><title + id="title6036">Page-4</title><g + id="shape109-1" + transform="translate(18,-516.416)"><title + id="title6039">Rectangle.177</title><desc + id="desc6041">User Application</desc><g + id="shadow109-2" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="534.41602" + width="255.118" + height="60.859798" + class="st2" + id="rect6044" + style="fill:#5b9bd5;fill-opacity:0.25;stroke:#5b9bd5;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="534.41602" + width="255.118" + height="60.859798" + class="st3" + id="rect6046" + style="fill:#4f87bb;stroke:#40709c;stroke-width:0.75" /><text + x="94" + y="567.84998" + class="st4" + id="text6048" + style="fill:#feffff;font-family:Calibri">User Application</text> +</g><g + id="group110-7" + transform="translate(18,-344.323)"><title + id="title6051">Sheet.110</title><g + id="shape111-8"><title + id="title6054">Rectangle.38</title><desc + id="desc6056">DPDK</desc><rect + x="0" + y="486.05499" + width="255.118" + height="109.22" + class="st5" + id="rect6058" + style="fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75" /><text + x="228.45" + y="499.06" + class="st6" + id="text6060" + style="fill:#4f87bb;font-family:Calibri">DPDK</text> +</g><g + id="shape112-13" + transform="translate(6.87402,-7.17304)"><title + id="title6063">Rectangle.16</title><desc + id="desc6065">bonded ethdev</desc><g + id="shadow112-14" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="523.16803" + width="241.157" + height="72.107201" + class="st7" + id="rect6068" + style="fill:#759fcc;fill-opacity:0.25;stroke:#759fcc;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="523.16803" + width="241.157" + height="72.107201" + class="st8" + id="rect6070" + style="fill:#668bb3;stroke:#547395;stroke-width:0.75" /><text + x="89.650002" + y="536.16998" + class="st4" + id="text6072" + style="fill:#feffff;font-family:Calibri">bonded ethdev</text> +</g><g + id="shape113-19" + transform="translate(13.9606,-14.1732)"><title + id="title6075">Rectangle.11</title><desc + id="desc6077">ethdev port</desc><g + id="shadow113-20" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st9" + id="rect6080" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st10" + id="rect6082" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text6084" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g><g + id="shape114-25" + transform="translate(91.9134,-14.1732)"><title + id="title6087">Rectangle.14</title><desc + id="desc6089">ethdev port</desc><g + id="shadow114-26" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st11" + id="rect6092" + style="fill:#759fcc;fill-opacity:0.22000002;stroke:#759fcc;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st12" + id="rect6094" + style="fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text6096" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g><g + id="shape115-31" + transform="translate(169.866,-14.1732)"><title + id="title6099">Rectangle.15</title><desc + id="desc6101">ethdev port</desc><g + id="shadow115-32" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st11" + id="rect6104" + style="fill:#759fcc;fill-opacity:0.22000002;stroke:#759fcc;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st12" + id="rect6106" + style="fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text6108" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g></g><g + id="shape116-37" + transform="matrix(0.00114494,-0.99999934,0.99999934,0.00114494,-449.822,170.991)"><title + id="title6111">Simple Double Arrow.184</title><path + d="m 0,595.28 11.34,-4.49 0,2.24 70.13,0 0,-2.24 11.34,4.49 -11.34,4.48 0,-2.24 -70.13,0 0,2.24 L 0,595.28 z" + class="st13" + id="path6113" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6580);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape117-41" + transform="matrix(0.01125714,-0.99993664,0.99993664,0.01125714,-532.876,283.409)"><title + id="title6116">Simple Arrow.185</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 40.86,0 0,2.84 0,2.83 -40.86,0 0,2.83 L 0,595.28 z" + class="st13" + id="path6118" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6582);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape118-44" + transform="matrix(-0.01125714,0.99993664,-0.99993664,-0.01125714,670.114,243.437)"><title + id="title6121">Simple Arrow.186</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 40.86,0 0,2.84 0,2.83 -40.86,0 0,2.83 L 0,595.28 z" + class="st13" + id="path6123" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6584);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape119-47" + transform="matrix(0.01448398,-0.9998951,0.9998951,0.01448398,-450.646,281.973)"><title + id="title6126">Simple Arrow.187</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 42.48,0 0,2.84 0,2.83 -42.48,0 0,2.83 L 0,595.28 z" + class="st13" + id="path6128" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6586);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape120-50" + transform="matrix(-0.01185051,-0.99992978,0.99992978,-0.01185051,-371.297,297.649)"><title + id="title6131">Simple Arrow.188</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 42.48,0 0,2.84 0,2.83 -42.48,0 0,2.83 L 0,595.28 z" + class="st13" + id="path6133" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6588);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape121-53" + transform="translate(121.039,-421.115)"><title + id="title6136">Square.189</title><desc + id="desc6138">1</desc><g + id="shadow121-54" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect6141" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect6143" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6145" + style="fill:#feffff;font-family:Calibri">1</text> +</g><g + id="shape122-59" + transform="translate(121.039,-440.447)"><title + id="title6148">Square.190</title><desc + id="desc6150">2</desc><g + id="shadow122-60" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st16" + id="rect6153" + style="fill:#fec000;fill-opacity:0.25;stroke:#fec000;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st17" + id="rect6155" + style="fill:#dfa800;stroke:#ba8c00;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6157" + style="fill:#feffff;font-family:Calibri">2</text> +</g><g + id="shape123-65" + transform="translate(121.039,-459.156)"><title + id="title6160">Square.191</title><desc + id="desc6162">3</desc><g + id="shadow123-66" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect6165" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect6167" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6169" + style="fill:#feffff;font-family:Calibri">3</text> +</g><g + id="shape124-71" + transform="translate(121.039,-478.488)"><title + id="title6172">Square.192</title><desc + id="desc6174">4</desc><g + id="shadow124-72" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st16" + id="rect6177" + style="fill:#fec000;fill-opacity:0.25;stroke:#fec000;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st17" + id="rect6179" + style="fill:#dfa800;stroke:#ba8c00;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6181" + style="fill:#feffff;font-family:Calibri">4</text> +</g><g + id="shape125-77" + transform="translate(121.039,-497.82)"><title + id="title6184">Square.193</title><desc + id="desc6186">5</desc><g + id="shadow125-78" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect6189" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect6191" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6193" + style="fill:#feffff;font-family:Calibri">5</text> +</g><g + id="shape126-83" + transform="translate(121.039,-517.153)"><title + id="title6196">Square.194</title><desc + id="desc6198">6</desc><g + id="shadow126-84" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st18" + id="rect6201" + style="fill:#ed7d31;fill-opacity:0.25;stroke:#ed7d31;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st19" + id="rect6203" + style="fill:#d06d29;stroke:#ae5a21;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6205" + style="fill:#feffff;font-family:Calibri">6</text> +</g><g + id="shape127-89" + transform="translate(117.213,-283.465)"><title + id="title6208">Square.172</title><desc + id="desc6210">2</desc><g + id="shadow127-90" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st16" + id="rect6213" + style="fill:#fec000;fill-opacity:0.25;stroke:#fec000;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st17" + id="rect6215" + style="fill:#dfa800;stroke:#ba8c00;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6217" + style="fill:#feffff;font-family:Calibri">2</text> +</g><g + id="shape128-95" + transform="translate(117.213,-301.493)"><title + id="title6220">Square.173</title><desc + id="desc6222">4</desc><g + id="shadow128-96" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st16" + id="rect6225" + style="fill:#fec000;fill-opacity:0.25;stroke:#fec000;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st17" + id="rect6227" + style="fill:#dfa800;stroke:#ba8c00;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6229" + style="fill:#feffff;font-family:Calibri">4</text> +</g><g + id="shape129-101" + transform="translate(196.583,-301.493)"><title + id="title6232">Square.198</title><desc + id="desc6234">6</desc><g + id="shadow129-102" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st18" + id="rect6237" + style="fill:#ed7d31;fill-opacity:0.25;stroke:#ed7d31;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st19" + id="rect6239" + style="fill:#d06d29;stroke:#ae5a21;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6241" + style="fill:#feffff;font-family:Calibri">6</text> +</g><g + id="shape130-107" + transform="translate(38.8346,-283.465)"><title + id="title6244">Square.169</title><desc + id="desc6246">1</desc><g + id="shadow130-108" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect6249" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect6251" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6253" + style="fill:#feffff;font-family:Calibri">1</text> +</g><g + id="shape131-113" + transform="translate(38.8346,-320.315)"><title + id="title6256">Square.170</title><desc + id="desc6258">3</desc><g + id="shadow131-114" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect6261" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect6263" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6265" + style="fill:#feffff;font-family:Calibri">3</text> +</g><g + id="shape132-119" + transform="translate(38.8346,-339.476)"><title + id="title6268">Square.171</title><desc + id="desc6270">5</desc><g + id="shadow132-120" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st14" + id="rect6273" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st15" + id="rect6275" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.5500002" + y="591.19" + class="st4" + id="text6277" + style="fill:#feffff;font-family:Calibri">5</text> +</g><g + id="shape133-125" + transform="translate(38.8346,-301.154)"><title + id="title6280">Square.203</title><desc + id="desc6282">O</desc><g + id="shadow133-126" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st20" + id="rect6285" + style="fill:#bdd0e9;fill-opacity:0.25;stroke:#bdd0e9;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st21" + id="rect6287" + style="fill:#a6b6cd;stroke:#8a98ab;stroke-width:0.75" /><text + x="4" + y="591.19" + class="st4" + id="text6289" + style="fill:#feffff;font-family:Calibri">O</text> +</g><g + id="shape134-131" + transform="translate(117.213,-320.315)"><title + id="title6292">Square.204</title><desc + id="desc6294">O</desc><g + id="shadow134-132" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st20" + id="rect6297" + style="fill:#bdd0e9;fill-opacity:0.25;stroke:#bdd0e9;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st21" + id="rect6299" + style="fill:#a6b6cd;stroke:#8a98ab;stroke-width:0.75" /><text + x="4" + y="591.19" + class="st4" + id="text6301" + style="fill:#feffff;font-family:Calibri">O</text> +</g><g + id="shape135-137" + transform="translate(196.583,-283.465)"><title + id="title6304">Square.205</title><desc + id="desc6306">O</desc><g + id="shadow135-138" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st20" + id="rect6309" + style="fill:#bdd0e9;fill-opacity:0.25;stroke:#bdd0e9;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="14.1732" + height="14.1732" + class="st21" + id="rect6311" + style="fill:#a6b6cd;stroke:#8a98ab;stroke-width:0.75" /><text + x="4" + y="591.19" + class="st4" + id="text6313" + style="fill:#feffff;font-family:Calibri">O</text> +</g></g></svg>
\ No newline at end of file diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-5.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-5.svg new file mode 100644 index 000000000..56192fb6e --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-mode-5.svg @@ -0,0 +1,644 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2014 Intel Corporation --> +<!-- Generated by Microsoft Visio, SVG Export link bonding - mode 5.svg Page-4 --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="332.147" + height="392.50714" + viewBox="0 0 265.71799 314.00578" + xml:space="preserve" + color-interpolation-filters="sRGB" + class="st17" + id="svg6319" + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="bond-mode-5.svg" + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible"><metadata + id="metadata6568"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="640" + inkscape:window-height="480" + id="namedview6566" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="0.29932695" + inkscape:cx="509.87351" + inkscape:cy="38.801168" + inkscape:window-x="0" + inkscape:window-y="29" + inkscape:window-maximized="0" + inkscape:current-layer="svg6319" /><style + type="text/css" + id="style6321"> + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25} + .st3 {fill:#4f87bb;stroke:#40709c;stroke-width:0.75} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st5 {fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75} + .st6 {fill:#4f87bb;font-family:Calibri;font-size:0.833336em} + .st7 {fill:#759fcc;fill-opacity:0.25;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.25} + .st8 {fill:#668bb3;stroke:#547395;stroke-width:0.75} + .st9 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st10 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st11 {fill:#759fcc;fill-opacity:0.22;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.22} + .st12 {fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25} + .st13 {fill:url(#grad0-40);stroke:#a6b6cd;stroke-width:0.75} + .st14 {fill:#70ad47;fill-opacity:0.25;filter:url(#filter_2);stroke:#70ad47;stroke-opacity:0.25} + .st15 {fill:#61973d;stroke:#507e31;stroke-width:0.75} + .st16 {fill:#feffff;font-family:Calibri;font-size:0.666664em} + .st17 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + </style><defs + id="Patterns_And_Gradients"><linearGradient + id="grad0-11" + x1="-0.24584444" + y1="740.8343" + x2="167.49742" + y2="740.8343" + gradientTransform="scale(1.5253548,0.65558519)" + gradientUnits="userSpaceOnUse"><stop + offset="0" + stop-color="#e9eff7" + stop-opacity="1" + id="stop6325" /><stop + offset="0.24" + stop-color="#f4f7fb" + stop-opacity="1" + id="stop6327" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop6329" /></linearGradient><linearGradient + id="grad0-40" + x1="0" + y1="0" + x2="1" + y2="0" + gradientTransform="matrix(0.5,0.8660254,-0.8660254,0.5,0.6830127,-0.1830127)"><stop + offset="0" + stop-color="#f3f6fa" + stop-opacity="1" + id="stop6332" /><stop + offset="0.24" + stop-color="#f9fafc" + stop-opacity="1" + id="stop6334" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop6336" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6570" + gradientTransform="scale(3.5585925,0.28100998)" + x1="-0.10537874" + y1="2101.0464" + x2="34.48414" + y2="2101.0464" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6572" + gradientTransform="scale(2.093628,0.47763977)" + x1="-0.17911492" + y1="1233.6389" + x2="25.111911" + y2="1233.6389" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6574" + gradientTransform="scale(2.093628,0.47763977)" + x1="-0.17911492" + y1="1233.6389" + x2="25.111911" + y2="1233.6389" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6576" + gradientTransform="scale(2.1254139,0.4704966)" + x1="-0.17643623" + y1="1252.3682" + x2="25.498563" + y2="1252.3682" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-40" + id="linearGradient6578" + gradientTransform="scale(2.1254139,0.4704966)" + x1="-0.17643623" + y1="1252.3682" + x2="25.498563" + y2="1252.3682" + gradientUnits="userSpaceOnUse" /></defs><defs + id="Filters"><filter + id="filter_2" + color-interpolation-filters="sRGB"><feGaussianBlur + stdDeviation="2" + id="feGaussianBlur6340" /></filter></defs><g + id="g6342" + transform="translate(-13.045598,-14.67318)"><title + id="title6344">Page-4</title><g + id="shape136-1" + transform="translate(18,-516.416)"><title + id="title6347">Rectangle.209</title><desc + id="desc6349">User Application</desc><g + id="shadow136-2" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="534.41602" + width="255.118" + height="60.859798" + class="st2" + id="rect6352" + style="fill:#5b9bd5;fill-opacity:0.25;stroke:#5b9bd5;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="534.41602" + width="255.118" + height="60.859798" + class="st3" + id="rect6354" + style="fill:#4f87bb;stroke:#40709c;stroke-width:0.75" /><text + x="94" + y="567.84998" + class="st4" + id="text6356" + style="fill:#feffff;font-family:Calibri">User Application</text> +</g><g + id="group137-7" + transform="translate(18,-314.793)"><title + id="title6359">Sheet.137</title><g + id="shape138-8"><title + id="title6362">Rectangle.38</title><desc + id="desc6364">DPDK</desc><rect + x="0" + y="486.05499" + width="255.118" + height="109.22" + class="st5" + id="rect6366" + style="fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75" /><text + x="228.45" + y="499.06" + class="st6" + id="text6368" + style="fill:#4f87bb;font-family:Calibri">DPDK</text> +</g><g + id="shape139-13" + transform="translate(6.87402,-7.17304)"><title + id="title6371">Rectangle.16</title><desc + id="desc6373">bonded ethdev</desc><g + id="shadow139-14" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="523.16803" + width="241.157" + height="72.107201" + class="st7" + id="rect6376" + style="fill:#759fcc;fill-opacity:0.25;stroke:#759fcc;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="523.16803" + width="241.157" + height="72.107201" + class="st8" + id="rect6378" + style="fill:#668bb3;stroke:#547395;stroke-width:0.75" /><text + x="89.650002" + y="536.16998" + class="st4" + id="text6380" + style="fill:#feffff;font-family:Calibri">bonded ethdev</text> +</g><g + id="shape140-19" + transform="translate(13.9606,-14.1732)"><title + id="title6383">Rectangle.11</title><desc + id="desc6385">ethdev port</desc><g + id="shadow140-20" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st9" + id="rect6388" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st10" + id="rect6390" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text6392" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g><g + id="shape141-25" + transform="translate(91.9134,-14.1732)"><title + id="title6395">Rectangle.14</title><desc + id="desc6397">ethdev port</desc><g + id="shadow141-26" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st11" + id="rect6400" + style="fill:#759fcc;fill-opacity:0.22000002;stroke:#759fcc;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st12" + id="rect6402" + style="fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text6404" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g><g + id="shape142-31" + transform="translate(169.866,-14.1732)"><title + id="title6407">Rectangle.15</title><desc + id="desc6409">ethdev port</desc><g + id="shadow142-32" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st11" + id="rect6412" + style="fill:#759fcc;fill-opacity:0.22000002;stroke:#759fcc;stroke-opacity:0.22000002;filter:url(#filter_2)" /></g><rect + x="0" + y="559.75598" + width="70.866096" + height="35.519501" + class="st12" + id="rect6414" + style="fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25" /><text + x="11.46" + y="580.52002" + class="st4" + id="text6416" + style="fill:#feffff;font-family:Calibri">ethdev port</text> +</g></g><g + id="shape143-37" + transform="matrix(8.6917386e-4,-0.99999962,0.99999962,8.6917386e-4,-449.823,200.685)"><title + id="title6419">Simple Double Arrow.216</title><path + d="m 0,595.28 11.34,-4.49 0,2.24 99.66,0 0,-2.24 11.34,4.49 -11.34,4.48 0,-2.24 -99.66,0 0,2.24 L 0,595.28 z" + class="st13" + id="path6421" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6570);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape144-41" + transform="matrix(0.01125714,-0.99993664,0.99993664,0.01125714,-532.876,312.939)"><title + id="title6424">Simple Arrow.217</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 40.86,0 0,2.84 0,2.83 -40.86,0 0,2.83 L 0,595.28 z" + class="st13" + id="path6426" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6572);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape145-44" + transform="matrix(-0.01125714,0.99993664,-0.99993664,-0.01125714,670.114,272.967)"><title + id="title6429">Simple Arrow.218</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 40.86,0 0,2.84 0,2.83 -40.86,0 0,2.83 L 0,595.28 z" + class="st13" + id="path6431" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6574);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape146-47" + transform="matrix(0.01448398,-0.9998951,0.9998951,0.01448398,-450.646,311.502)"><title + id="title6434">Simple Arrow.219</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 42.48,0 0,2.84 0,2.83 -42.48,0 0,2.83 L 0,595.28 z" + class="st13" + id="path6436" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6576);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="shape147-50" + transform="matrix(-0.01185051,-0.99992978,0.99992978,-0.01185051,-371.297,327.178)"><title + id="title6439">Simple Arrow.220</title><path + d="m 0,595.28 11.34,-5.67 0,2.83 42.48,0 0,2.84 0,2.83 -42.48,0 0,2.83 L 0,595.28 z" + class="st13" + id="path6441" + inkscape:connector-curvature="0" + style="fill:url(#linearGradient6578);stroke:#a6b6cd;stroke-width:0.75" /></g><g + id="group148-53" + transform="translate(37.8425,-273.961)"><title + id="title6444">Sheet.148</title></g><g + id="shape149-54" + transform="translate(108.709,-473.712)"><title + id="title6447">Rectangle</title><desc + id="desc6449">5006</desc><g + id="shadow149-55" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st14" + id="rect6452" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st15" + id="rect6454" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="6.0599999" + y="590.59003" + class="st16" + id="text6456" + style="fill:#feffff;font-family:Calibri">5006</text> +</g><g + id="shape150-60" + transform="translate(108.709,-453.869)"><title + id="title6459">Rectangle.242</title><desc + id="desc6461">5005</desc><g + id="shadow150-61" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st14" + id="rect6464" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st15" + id="rect6466" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="6.0599999" + y="590.59003" + class="st16" + id="text6468" + style="fill:#feffff;font-family:Calibri">5005</text> +</g><g + id="shape151-66" + transform="translate(108.85,-405.893)"><title + id="title6471">Rectangle.243</title><desc + id="desc6473">0001</desc><g + id="shadow151-67" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st14" + id="rect6476" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st15" + id="rect6478" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="6.0599999" + y="590.59003" + class="st16" + id="text6480" + style="fill:#feffff;font-family:Calibri">0001</text> +</g><g + id="shape152-72" + transform="translate(108.85,-425.523)"><title + id="title6483">Rectangle.244</title><desc + id="desc6485">0002</desc><g + id="shadow152-73" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st14" + id="rect6488" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st15" + id="rect6490" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="6.0599999" + y="590.59003" + class="st16" + id="text6492" + style="fill:#feffff;font-family:Calibri">0002</text> +</g><g + id="shape153-78" + transform="translate(108.709,-503.476)"><title + id="title6495">Rectangle.246</title><desc + id="desc6497">12003</desc><g + id="shadow153-79" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st14" + id="rect6500" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st15" + id="rect6502" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.04" + y="590.59003" + class="st16" + id="text6504" + style="fill:#feffff;font-family:Calibri">12003</text> +</g><g + id="shape154-84" + transform="translate(24.2437,-273.976)"><title + id="title6507">Rectangle.247</title><desc + id="desc6509">0001</desc><g + id="shadow154-85" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st14" + id="rect6512" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st15" + id="rect6514" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="6.0599999" + y="590.59003" + class="st16" + id="text6516" + style="fill:#feffff;font-family:Calibri">0001</text> +</g><g + id="shape155-90" + transform="translate(24.2437,-293.606)"><title + id="title6519">Rectangle.248</title><desc + id="desc6521">0002</desc><g + id="shadow155-91" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st14" + id="rect6524" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st15" + id="rect6526" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="6.0599999" + y="590.59003" + class="st16" + id="text6528" + style="fill:#feffff;font-family:Calibri">0002</text> +</g><g + id="shape156-96" + transform="translate(108.537,-293.712)"><title + id="title6531">Rectangle.249</title><desc + id="desc6533">5006</desc><g + id="shadow156-97" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st14" + id="rect6536" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st15" + id="rect6538" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="6.0599999" + y="590.59003" + class="st16" + id="text6540" + style="fill:#feffff;font-family:Calibri">5006</text> +</g><g + id="shape157-102" + transform="translate(108.537,-273.869)"><title + id="title6543">Rectangle.250</title><desc + id="desc6545">5005</desc><g + id="shadow157-103" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st14" + id="rect6548" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st15" + id="rect6550" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="6.0599999" + y="590.59003" + class="st16" + id="text6552" + style="fill:#feffff;font-family:Calibri">5005</text> +</g><g + id="shape158-108" + transform="translate(187.236,-273.869)"><title + id="title6555">Rectangle.251</title><desc + id="desc6557">12003</desc><g + id="shadow158-109" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st14" + id="rect6560" + style="fill:#70ad47;fill-opacity:0.25;stroke:#70ad47;stroke-opacity:0.25;filter:url(#filter_2)" /></g><rect + x="0" + y="581.10199" + width="28.3465" + height="14.1732" + class="st15" + id="rect6562" + style="fill:#61973d;stroke:#507e31;stroke-width:0.75" /><text + x="4.04" + y="590.59003" + class="st16" + id="text6564" + style="fill:#feffff;font-family:Calibri">12003</text> +</g></g></svg>
\ No newline at end of file diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/bond-overview.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-overview.svg new file mode 100644 index 000000000..42ee1f995 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/bond-overview.svg @@ -0,0 +1,123 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2014 Intel Corporation --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export Link Bonding Modes.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + width="4.42446in" height="2.20365in" viewBox="0 0 318.561 158.663" xml:space="preserve" color-interpolation-filters="sRGB" + class="st13"> + <style type="text/css"> + <![CDATA[ + .st1 {fill:url(#grad0-4);stroke:#4f87bb;stroke-width:0.75} + .st2 {fill:#4f87bb;font-family:Calibri;font-size:0.833336em} + .st3 {visibility:visible} + .st4 {fill:#759fcc;fill-opacity:0.25;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.25} + .st5 {fill:#668bb3;stroke:#547395;stroke-width:0.75} + .st6 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st7 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25} + .st8 {fill:#4f87bb;stroke:#40709c;stroke-width:0.75} + .st9 {fill:#759fcc;fill-opacity:0.22;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.22} + .st10 {fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25} + .st11 {font-size:1em} + .st12 {fill:url(#grad0-56);stroke:#a6b6cd;stroke-width:0.75} + .st13 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Patterns_And_Gradients"> + <linearGradient id="grad0-4" x1="0" y1="0" x2="1" y2="0" gradientTransform="rotate(60 0.5 0.5)"> + <stop offset="0" stop-color="#e9eff7" stop-opacity="1"/> + <stop offset="0.24" stop-color="#f4f7fb" stop-opacity="1"/> + <stop offset="0.54" stop-color="#feffff" stop-opacity="1"/> + </linearGradient> + <linearGradient id="grad0-56" x1="0" y1="0" x2="1" y2="0" gradientTransform="rotate(60 0.5 0.5)"> + <stop offset="0" stop-color="#f3f6fa" stop-opacity="1"/> + <stop offset="0.24" stop-color="#f9fafc" stop-opacity="1"/> + <stop offset="0.54" stop-color="#feffff" stop-opacity="1"/> + </linearGradient> + </defs> + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g> + <title>Page-1</title> + <g id="shape38-1" transform="translate(3.0294,-0.75)"> + <title>Rectangle.38</title> + <desc>DPDK</desc> + <rect x="0" y="70.7886" width="311.811" height="87.874" class="st1"/> + <text x="285.14" y="83.79" class="st2">DPDK</text> </g> + <g id="shape8-6" transform="translate(12.5358,-7.83661)"> + <title>Rectangle.8</title> + <desc>bonded ethdev</desc> + <g id="shadow8-7" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3"> + <rect x="0" y="87.7965" width="171.911" height="70.8661" class="st4"/> + </g> + <rect x="0" y="87.7965" width="171.911" height="70.8661" class="st5"/> + <text x="55.03" y="100.8" class="st6">bonded ethdev</text> </g> + <g id="shape3-12" transform="translate(3.0294,-121.309)"> + <title>Rectangle</title> + <desc>User Application</desc> + <g id="shadow3-13" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3"> + <rect x="0" y="122.711" width="311.811" height="35.9516" class="st7"/> + </g> + <rect x="0" y="122.711" width="311.811" height="35.9516" class="st8"/> + <text x="122.34" y="143.69" class="st6">User Application</text> </g> + <g id="shape5-18" transform="translate(17.2026,-14.9232)"> + <title>Rectangle.5</title> + <desc>ethdev port</desc> + <g id="shadow5-19" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3"> + <rect x="0" y="123.143" width="47.3593" height="35.5195" class="st9"/> + </g> + <rect x="0" y="123.143" width="47.3593" height="35.5195" class="st10"/> + <text x="9.52" y="137.9" class="st6">ethdev <tspan x="15" dy="1.2em" class="st11">port</tspan></text> </g> + <g id="shape6-25" transform="translate(73.8955,-14.9232)"> + <title>Rectangle.6</title> + <desc>ethdev port</desc> + <g id="shadow6-26" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3"> + <rect x="0" y="123.143" width="47.3593" height="35.5195" class="st9"/> + </g> + <rect x="0" y="123.143" width="47.3593" height="35.5195" class="st10"/> + <text x="9.52" y="137.9" class="st6">ethdev <tspan x="15" dy="1.2em" class="st11">port</tspan></text> </g> + <g id="shape7-32" transform="translate(130.588,-14.9232)"> + <title>Rectangle.7</title> + <desc>ethdev port</desc> + <g id="shadow7-33" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3"> + <rect x="0" y="123.143" width="47.3593" height="35.5195" class="st9"/> + </g> + <rect x="0" y="123.143" width="47.3593" height="35.5195" class="st10"/> + <text x="9.52" y="137.9" class="st6">ethdev <tspan x="15" dy="1.2em" class="st11">port</tspan></text> </g> + <g id="shape9-39" transform="translate(199.035,-14.8368)"> + <title>Rectangle.9</title> + <desc>ethdev port</desc> + <g id="shadow9-40" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3"> + <rect x="0" y="123.143" width="47.3593" height="35.5195" class="st9"/> + </g> + <rect x="0" y="123.143" width="47.3593" height="35.5195" class="st10"/> + <text x="9.52" y="137.9" class="st6">ethdev <tspan x="15" dy="1.2em" class="st11">port</tspan></text> </g> + <g id="shape10-46" transform="translate(255.728,-14.8368)"> + <title>Rectangle.10</title> + <desc>ethdev port</desc> + <g id="shadow10-47" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3"> + <rect x="0" y="123.143" width="47.3593" height="35.5195" class="st9"/> + </g> + <rect x="0" y="123.143" width="47.3593" height="35.5195" class="st10"/> + <text x="9.52" y="137.9" class="st6">ethdev <tspan x="15" dy="1.2em" class="st11">port</tspan></text> </g> + <g id="shape28-53" transform="translate(-60.1711,80.2563) rotate(-90.107)"> + <title>Simple Double Arrow</title> + <path d="M0 158.66 L11.34 154.18 L11.34 156.42 L29.38 156.42 L29.38 154.18 L40.72 158.66 L29.38 163.15 L29.38 160.9 L11.34 + 160.9 L11.34 163.15 L0 158.66 Z" class="st12"/> + </g> + <g id="shape30-57" transform="translate(120.746,108.97) rotate(-90.2397)"> + <title>Simple Double Arrow.30</title> + <path d="M0 158.66 L11.34 154.18 L11.34 156.42 L56.41 156.42 L56.41 154.18 L67.75 158.66 L56.41 163.15 L56.41 160.9 L11.34 + 160.9 L11.34 163.15 L0 158.66 Z" class="st12"/> + </g> + <g id="shape42-60" transform="translate(64.0521,108.636) rotate(-90.1191)"> + <title>Simple Double Arrow.42</title> + <path d="M0 158.66 L11.34 154.18 L11.34 156.42 L56.87 156.42 L56.87 154.18 L68.21 158.66 L56.87 163.15 L56.87 160.9 L11.34 + 160.9 L11.34 163.15 L0 158.66 Z" class="st12"/> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/crypto_op.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/crypto_op.svg new file mode 100644 index 000000000..96e3affac --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/crypto_op.svg @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export crypto_op.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + width="2.17241in" height="2.8102in" viewBox="0 0 156.413 202.335" xml:space="preserve" color-interpolation-filters="sRGB" + class="st10"> + <style type="text/css"> + <![CDATA[ + .st1 {fill:url(#grad0-4);stroke:#386288;stroke-width:0.75} + .st2 {fill:#386288;font-family:Calibri;font-size:0.833336em} + .st3 {fill:#ffffff;stroke:#41719c;stroke-width:0.75} + .st4 {fill:#41719c;font-family:Calibri;font-size:0.833336em} + .st5 {font-size:0.799995em} + .st6 {font-size:0.799995em;font-weight:bold} + .st7 {visibility:visible} + .st8 {fill:#bdd0e9;fill-opacity:0.25;filter:url(#filter_2);stroke:#bdd0e9;stroke-opacity:0.25} + .st9 {fill:#a6b6cd;stroke:#41719c;stroke-width:0.75} + .st10 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Patterns_And_Gradients"> + <linearGradient id="grad0-4" x1="0" y1="0" x2="1" y2="0" gradientTransform="rotate(60 0.5 0.5)"> + <stop offset="0" stop-color="#e8ebef" stop-opacity="1"/> + <stop offset="0.24" stop-color="#f4f5f7" stop-opacity="1"/> + <stop offset="0.54" stop-color="#feffff" stop-opacity="1"/> + </linearGradient> + </defs> + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g> + <title>Page-1</title> + <g id="shape1-1" transform="translate(0.749889,-0.75)"> + <title>Rounded Rectangle.24</title> + <desc>Crypto Operation</desc> + <path d="M6.78 202.33 L148.14 202.33 A6.77735 6.77735 -180 0 0 154.91 195.56 L154.91 8.28 A6.77735 6.77735 -180 0 0 148.14 + 1.5 L6.78 1.5 A6.77735 6.77735 -180 0 0 -0 8.28 L0 195.56 A6.77735 6.77735 -180 0 0 6.78 202.33 Z" + class="st1"/> + <text x="42.07" y="14.5" class="st2">Crypto Operation</text> </g> + <g id="shape2-6" transform="translate(10.6711,-66.2303)"> + <title>Rounded Rectangle.7</title> + <desc>Operation Specific Data (struct rte_crypto_sym_op)</desc> + <path d="M5.91 202.33 L129.16 202.33 A5.90925 5.90925 -180 0 0 135.07 196.43 L135.07 160.06 A5.90925 5.90925 -180 0 0 + 129.16 154.15 L5.91 154.15 A5.90925 5.90925 -180 0 0 -0 160.06 L0 196.43 A5.90925 5.90925 -180 0 0 5.91 + 202.33 Z" class="st3"/> + <text x="19.62" y="175.24" class="st4">Operation Specific Data <tspan x="22.66" dy="1.5em" class="st5">(</tspan><tspan + class="st6">struct </tspan><tspan class="st5">rte</tspan><tspan class="st5">_</tspan><tspan class="st5">crypto</tspan><tspan + class="st5">_</tspan><tspan class="st5">sym</tspan><tspan class="st5">_</tspan><tspan class="st5">op</tspan><tspan + class="st5">)</tspan></text> </g> + <g id="shape3-19" transform="translate(10.6711,-9.5374)"> + <title>Rounded Rectangle.8</title> + <desc>private data</desc> + <g id="shadow3-20" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st7"> + <path d="M5.91 202.33 L129.16 202.33 A5.90925 5.90925 -180 0 0 135.07 196.43 L135.07 160.06 A5.90925 5.90925 -180 + 0 0 129.16 154.15 L5.91 154.15 A5.90925 5.90925 -180 0 0 -0 160.06 L0 196.43 A5.90925 5.90925 -180 0 + 0 5.91 202.33 Z" class="st8"/> + </g> + <path d="M5.91 202.33 L129.16 202.33 A5.90925 5.90925 -180 0 0 135.07 196.43 L135.07 160.06 A5.90925 5.90925 -180 0 0 + 129.16 154.15 L5.91 154.15 A5.90925 5.90925 -180 0 0 -0 160.06 L0 196.43 A5.90925 5.90925 -180 0 0 5.91 + 202.33 Z" class="st9"/> + <text x="42.98" y="181.24" class="st4">private data</text> </g> + <g id="shape4-25" transform="translate(10.6711,-122.923)"> + <title>Rounded Rectangle.9</title> + <desc>General Operation Data (struct rte_crypto_op)</desc> + <path d="M5.91 202.33 L129.16 202.33 A5.90925 5.90925 -180 0 0 135.07 196.43 L135.07 160.06 A5.90925 5.90925 -180 0 0 + 129.16 154.15 L5.91 154.15 A5.90925 5.90925 -180 0 0 -0 160.06 L0 196.43 A5.90925 5.90925 -180 0 0 5.91 + 202.33 Z" class="st3"/> + <text x="19.04" y="175.24" class="st4">General Operation Data <tspan x="31.23" dy="1.5em" class="st5">(</tspan><tspan + class="st6">struct </tspan><tspan class="st5">rte</tspan><tspan class="st5">_</tspan><tspan class="st5">crypto</tspan><tspan + class="st5">_</tspan><tspan class="st5">op</tspan><tspan class="st5">)</tspan></text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/crypto_xform_chain.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/crypto_xform_chain.svg new file mode 100644 index 000000000..136816315 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/crypto_xform_chain.svg @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export crypto_xform_chain.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + width="4.9352in" height="4.2584in" viewBox="0 0 355.334 306.605" xml:space="preserve" color-interpolation-filters="sRGB" + class="st12"> + <style type="text/css"> + <![CDATA[ + .st1 {fill:url(#grad0-4);stroke:#386288;stroke-width:0.75} + .st2 {fill:#386288;font-family:Calibri;font-size:0.833336em} + .st3 {font-size:0.799995em} + .st4 {font-size:0.799995em;font-weight:bold} + .st5 {visibility:visible} + .st6 {fill:#bdd0e9;fill-opacity:0.25;filter:url(#filter_2);stroke:#bdd0e9;stroke-opacity:0.25} + .st7 {fill:#a6b6cd;stroke:#41719c;stroke-width:0.75} + .st8 {fill:#41719c;font-family:Calibri;font-size:0.833336em} + .st9 {fill:#ffffff;stroke:#41719c;stroke-width:0.75} + .st10 {marker-end:url(#mrkr4-135);stroke:#41719c;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st11 {fill:#41719c;fill-opacity:1;stroke:#41719c;stroke-opacity:1;stroke-width:0.28409090909091} + .st12 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Patterns_And_Gradients"> + <linearGradient id="grad0-4" x1="0" y1="0" x2="1" y2="0" gradientTransform="rotate(60 0.5 0.5)"> + <stop offset="0" stop-color="#e8ebef" stop-opacity="1"/> + <stop offset="0.24" stop-color="#f4f5f7" stop-opacity="1"/> + <stop offset="0.54" stop-color="#feffff" stop-opacity="1"/> + </linearGradient> + </defs> + <defs id="Markers"> + <g id="lend4"> + <path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/> + </g> + <marker id="mrkr4-135" class="st11" refX="-7.04" orient="auto" markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend4" transform="scale(-3.52,-3.52) "/> + </marker> + </defs> + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g> + <title>Page-1</title> + <g id="shape9-1" transform="translate(0.749889,-75.0177)"> + <title>Rounded Rectangle.24</title> + <desc>Symmetric Transform (struct rte_crypto_sym_xform)</desc> + <path d="M6.78 306.6 L148.14 306.6 A6.77735 6.77735 -180 0 0 154.91 299.83 L154.91 82.55 A6.77735 6.77735 -180 0 0 148.14 + 75.77 L6.78 75.77 A6.77735 6.77735 -180 0 0 -0 82.55 L0 299.83 A6.77735 6.77735 -180 0 0 6.78 306.6 Z" + class="st1"/> + <text x="33.55" y="88.77" class="st2">Symmetric Transform <tspan x="27.14" dy="1.5em" class="st3">(</tspan><tspan + class="st4">struct </tspan><tspan class="st3">rte</tspan><tspan class="st3">_</tspan><tspan class="st3">crypto</tspan><tspan + class="st3">_</tspan><tspan class="st3">sym</tspan><tspan class="st3">_</tspan><tspan class="st3">xform</tspan><tspan + class="st3">)</tspan></text> </g> + <g id="shape10-16" transform="translate(10.6711,-83.0965)"> + <title>Rounded Rectangle.25</title> + <desc>Transform Parameters struct rte_crypto_auth_xform struct rte_...</desc> + <g id="shadow10-17" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st5"> + <path d="M5.91 306.6 L129.16 306.6 A5.90925 5.90925 -180 0 0 135.07 300.7 L135.07 207.92 A5.90925 5.90925 -180 0 + 0 129.16 202.01 L5.91 202.01 A5.90925 5.90925 -180 0 0 -0 207.92 L0 300.7 A5.90925 5.90925 -180 0 0 + 5.91 306.6 Z" class="st6"/> + </g> + <path d="M5.91 306.6 L129.16 306.6 A5.90925 5.90925 -180 0 0 135.07 300.7 L135.07 207.92 A5.90925 5.90925 -180 0 0 129.16 + 202.01 L5.91 202.01 A5.90925 5.90925 -180 0 0 -0 207.92 L0 300.7 A5.90925 5.90925 -180 0 0 5.91 306.6 Z" + class="st7"/> + <text x="21.89" y="241.71" class="st8">Transform Parameters <tspan x="18.76" dy="2.475em" class="st4">struct </tspan><tspan + class="st3">rte</tspan><tspan class="st3">_</tspan><tspan class="st3">crypto</tspan><tspan class="st3">_</tspan><tspan + class="st3">auth</tspan><tspan class="st3">_</tspan><tspan class="st3">xform </tspan><tspan x="16.02" + dy="1.425em" class="st4">struct </tspan><tspan class="st3">rte</tspan><tspan class="st3">_</tspan><tspan + class="st3">crypto</tspan><tspan class="st3">_</tspan><tspan class="st3">cipher</tspan><tspan class="st3">_</tspan><tspan + class="st3">xform</tspan><tspan x="18.76" dy="1.425em" class="st4">struct </tspan><tspan + class="st3">rte</tspan><tspan class="st3">_</tspan><tspan class="st3">crypto</tspan><tspan class="st3">_</tspan><tspan + class="st3">aead</tspan><tspan class="st3">_</tspan><tspan class="st3">xform</tspan></text> </g> + <g id="shape11-38" transform="translate(10.6711,-238.133)"> + <title>Rounded Rectangle.26</title> + <desc>next transform (struct rte_crypto_sym_xform *)</desc> + <path d="M5.91 306.6 L129.16 306.6 A5.90925 5.90925 -180 0 0 135.07 300.7 L135.07 283.84 A5.90925 5.90925 -180 0 0 129.16 + 277.93 L5.91 277.93 A5.90925 5.90925 -180 0 0 0 283.84 L0 300.7 A5.90925 5.90925 -180 0 0 5.91 306.6 Z" + class="st9"/> + <text x="37.15" y="289.27" class="st8">next transform <tspan x="14.33" dy="1.5em" class="st3">(</tspan><tspan + class="st4">struct </tspan><tspan class="st3">rte</tspan><tspan class="st3">_</tspan><tspan class="st3">crypto</tspan><tspan + class="st3">_</tspan><tspan class="st3">sym</tspan><tspan class="st3">_</tspan><tspan class="st3">xform </tspan><tspan + class="st3">*)</tspan></text> </g> + <g id="shape12-51" transform="translate(10.6711,-199.175)"> + <title>Rounded Rectangle.29</title> + <desc>transform type (enum rte_crypto_sym_xform_type)</desc> + <path d="M5.91 306.6 L129.16 306.6 A5.90925 5.90925 -180 0 0 135.07 300.7 L135.07 283.84 A5.90925 5.90925 -180 0 0 129.16 + 277.93 L5.91 277.93 A5.90925 5.90925 -180 0 0 0 283.84 L0 300.7 A5.90925 5.90925 -180 0 0 5.91 306.6 Z" + class="st9"/> + <text x="37.06" y="289.27" class="st8">transform type <tspan x="8.04" dy="1.5em" class="st3">(</tspan><tspan + class="st4">enum </tspan><tspan class="st3">rte</tspan><tspan class="st3">_</tspan><tspan class="st3">crypto</tspan><tspan + class="st3">_</tspan><tspan class="st3">sym</tspan><tspan class="st3">_</tspan><tspan class="st3">xform</tspan><tspan + class="st3">_</tspan><tspan class="st3">type</tspan><tspan class="st3">)</tspan></text> </g> + <g id="shape13-66" transform="translate(199.671,-0.75)"> + <title>Rounded Rectangle.30</title> + <desc>Symmetric Transform (struct rte_crypto_sym_xform)</desc> + <path d="M6.78 306.6 L148.14 306.6 A6.77735 6.77735 -180 0 0 154.91 299.83 L154.91 82.55 A6.77735 6.77735 -180 0 0 148.14 + 75.77 L6.78 75.77 A6.77735 6.77735 -180 0 0 -0 82.55 L0 299.83 A6.77735 6.77735 -180 0 0 6.78 306.6 Z" + class="st1"/> + <text x="33.55" y="88.77" class="st2">Symmetric Transform <tspan x="27.14" dy="1.5em" class="st3">(</tspan><tspan + class="st4">struct </tspan><tspan class="st3">rte</tspan><tspan class="st3">_</tspan><tspan class="st3">crypto</tspan><tspan + class="st3">_</tspan><tspan class="st3">sym</tspan><tspan class="st3">_</tspan><tspan class="st3">xform</tspan><tspan + class="st3">)</tspan></text> </g> + <g id="shape14-80" transform="translate(209.592,-8.82874)"> + <title>Rounded Rectangle.31</title> + <desc>Transform Parameters struct rte_crypto_auth_xform struct rte_...</desc> + <g id="shadow14-81" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st5"> + <path d="M5.91 306.6 L129.16 306.6 A5.90925 5.90925 -180 0 0 135.07 300.7 L135.07 207.92 A5.90925 5.90925 -180 0 + 0 129.16 202.01 L5.91 202.01 A5.90925 5.90925 -180 0 0 -0 207.92 L0 300.7 A5.90925 5.90925 -180 0 0 + 5.91 306.6 Z" class="st6"/> + </g> + <path d="M5.91 306.6 L129.16 306.6 A5.90925 5.90925 -180 0 0 135.07 300.7 L135.07 207.92 A5.90925 5.90925 -180 0 0 129.16 + 202.01 L5.91 202.01 A5.90925 5.90925 -180 0 0 -0 207.92 L0 300.7 A5.90925 5.90925 -180 0 0 5.91 306.6 Z" + class="st7"/> + <text x="21.89" y="241.71" class="st8">Transform Parameters <tspan x="18.76" dy="2.475em" class="st4">struct </tspan><tspan + class="st3">rte</tspan><tspan class="st3">_</tspan><tspan class="st3">crypto</tspan><tspan class="st3">_</tspan><tspan + class="st3">auth</tspan><tspan class="st3">_</tspan><tspan class="st3">xform </tspan><tspan x="16.02" + dy="1.425em" class="st4">struct </tspan><tspan class="st3">rte</tspan><tspan class="st3">_</tspan><tspan + class="st3">crypto</tspan><tspan class="st3">_</tspan><tspan class="st3">cipher</tspan><tspan class="st3">_</tspan><tspan + class="st3">xform</tspan><tspan x="18.76" dy="1.425em" class="st4">struct </tspan><tspan + class="st3">rte</tspan><tspan class="st3">_</tspan><tspan class="st3">crypto</tspan><tspan class="st3">_</tspan><tspan + class="st3">aead</tspan><tspan class="st3">_</tspan><tspan class="st3">xform</tspan></text> </g> + <g id="shape15-102" transform="translate(209.592,-163.865)"> + <title>Rounded Rectangle.32</title> + <desc>next transform (struct rte_crypto_sym_xform *)</desc> + <path d="M5.91 306.6 L129.16 306.6 A5.90925 5.90925 -180 0 0 135.07 300.7 L135.07 283.84 A5.90925 5.90925 -180 0 0 129.16 + 277.93 L5.91 277.93 A5.90925 5.90925 -180 0 0 0 283.84 L0 300.7 A5.90925 5.90925 -180 0 0 5.91 306.6 Z" + class="st9"/> + <text x="37.15" y="289.27" class="st8">next transform <tspan x="14.33" dy="1.5em" class="st3">(</tspan><tspan + class="st4">struct </tspan><tspan class="st3">rte</tspan><tspan class="st3">_</tspan><tspan class="st3">crypto</tspan><tspan + class="st3">_</tspan><tspan class="st3">sym</tspan><tspan class="st3">_</tspan><tspan class="st3">xform </tspan><tspan + class="st3">*)</tspan></text> </g> + <g id="shape16-115" transform="translate(209.592,-124.907)"> + <title>Rounded Rectangle.33</title> + <desc>transform type (enum rte_crypto_sym_xform_type)</desc> + <path d="M5.91 306.6 L129.16 306.6 A5.90925 5.90925 -180 0 0 135.07 300.7 L135.07 283.84 A5.90925 5.90925 -180 0 0 129.16 + 277.93 L5.91 277.93 A5.90925 5.90925 -180 0 0 0 283.84 L0 300.7 A5.90925 5.90925 -180 0 0 5.91 306.6 Z" + class="st9"/> + <text x="37.06" y="289.27" class="st8">transform type <tspan x="8.04" dy="1.5em" class="st3">(</tspan><tspan + class="st4">enum </tspan><tspan class="st3">rte</tspan><tspan class="st3">_</tspan><tspan class="st3">crypto</tspan><tspan + class="st3">_</tspan><tspan class="st3">sym</tspan><tspan class="st3">_</tspan><tspan class="st3">xform</tspan><tspan + class="st3">_</tspan><tspan class="st3">type</tspan><tspan class="st3">)</tspan></text> </g> + <g id="shape17-130" transform="translate(145.742,-252.47)"> + <title>Dynamic connector</title> + <path d="M0 306.6 L131.39 306.6 L131.39 320.45" class="st10"/> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/cryptodev_sym_sess.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/cryptodev_sym_sess.svg new file mode 100644 index 000000000..9b522458c --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/cryptodev_sym_sess.svg @@ -0,0 +1,417 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generated by Microsoft Visio, SVG Export cryptodev_sym_sess.svg Page-1 --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="4.8933434in" + height="3.8972795in" + viewBox="0 0 352.31955 280.60496" + xml:space="preserve" + class="st10" + version="1.1" + id="svg70" + sodipodi:docname="cryptodev_sym_sess.svg" + style="font-size:12px;overflow:visible;color-interpolation-filters:sRGB;fill:none;fill-rule:evenodd;stroke-linecap:square;stroke-miterlimit:3" + inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata + id="metadata74"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="956" + id="namedview72" + showgrid="false" + inkscape:zoom="1.7495789" + inkscape:cx="208.74719" + inkscape:cy="170.80248" + inkscape:window-x="0" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="shape18-1-4" /><style + type="text/css" + id="style2"><![CDATA[ + .st1 {fill:url(#grad0-4);stroke:#386288;stroke-width:0.75} + .st2 {fill:#386288;font-family:Calibri;font-size:0.833336em} + .st3 {visibility:visible} + .st4 {fill:#bdd0e9;fill-opacity:0.25;filter:url(#filter_2);stroke:#bdd0e9;stroke-opacity:0.25} + .st5 {fill:#a6b6cd;stroke:#41719c;stroke-width:0.75} + .st6 {fill:#41719c;font-family:Calibri;font-size:0.833336em} + .st7 {fill:#ffffff;stroke:#41719c;stroke-width:0.75} + .st8 {font-size:0.799995em} + .st9 {font-size:0.799995em;font-weight:bold} + .st10 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]></style><defs + id="Patterns_And_Gradients"><marker + inkscape:isstock="true" + style="overflow:visible" + id="marker5421" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Lend"><path + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:#41719c;fill-opacity:1;fill-rule:evenodd;stroke:#41719c;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + id="path5419" + inkscape:connector-curvature="0" /></marker><marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend" + style="overflow:visible" + inkscape:isstock="true"><path + id="path5004" + style="fill:#41719c;fill-opacity:1;fill-rule:evenodd;stroke:#41719c;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" + inkscape:connector-curvature="0" /></marker><marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible" + inkscape:isstock="true"><path + id="path4986" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /></marker><linearGradient + id="grad0-4" + x1="0" + y1="0" + x2="1" + y2="0" + gradientTransform="rotate(60,0.5,0.5)"><stop + offset="0" + stop-color="#e8ebef" + stop-opacity="1" + id="stop4" /><stop + offset="0.24" + stop-color="#f4f5f7" + stop-opacity="1" + id="stop6" /><stop + offset="0.54" + stop-color="#feffff" + stop-opacity="1" + id="stop8" /></linearGradient><filter + id="filter_2-4"><feGaussianBlur + stdDeviation="2" + id="feGaussianBlur12-0" /></filter><linearGradient + inkscape:collect="always" + xlink:href="#grad0-4" + id="linearGradient189" + gradientTransform="scale(0.8787489,1.1379815)" + x1="-0.42674366" + y1="0.98859203" + x2="176.71146" + y2="0.98859203" + gradientUnits="userSpaceOnUse" /><filter + id="filter_2-5"><feGaussianBlur + stdDeviation="2" + id="feGaussianBlur12-8" /></filter><filter + id="filter_2-3"><feGaussianBlur + stdDeviation="2" + id="feGaussianBlur12-2" /></filter><linearGradient + inkscape:collect="always" + xlink:href="#grad0-4" + id="linearGradient189-7" + gradientTransform="scale(0.8787489,1.1379815)" + x1="-0.42674366" + y1="0.98859203" + x2="176.71146" + y2="0.98859203" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#grad0-4" + id="linearGradient500" + gradientTransform="matrix(0.87785006,0,0,2.0116303,15.940232,20.619826)" + x1="-0.42674366" + y1="0.98859203" + x2="176.71146" + y2="0.98859203" + gradientUnits="userSpaceOnUse" /></defs><defs + id="Filters"><filter + id="filter_2"><feGaussianBlur + stdDeviation="2" + id="feGaussianBlur12" /></filter></defs><g + transform="matrix(1,0,0,0.46836022,-12.05774,-7.0354309)" + id="shape18-1"><title + id="title18">Rounded Rectangle.12</title><desc + id="desc20">Crypto Symmetric Session</desc><path + inkscape:connector-curvature="0" + style="fill:url(#linearGradient500);stroke:#386288;stroke-width:0.99665654" + id="path22" + class="st1" + d="M 22.713297,378.28219 H 163.92871 a 6.7704177,11.980443 0 0 0 6.76307,-11.96745 V 35.256532 A 6.7704177,11.980443 0 0 0 163.92871,23.271405 H 22.713297 A 6.7704177,11.980443 0 0 0 15.940232,35.256532 V 366.31474 a 6.7704177,11.980443 0 0 0 6.773065,11.96745 z" /></g><g + transform="matrix(1,0,0,0.41409874,-2.136529,-9.5289258)" + id="shape19-6"><title + id="title27">Rounded Rectangle.13</title><desc + id="desc29">Private Session Data</desc></g><path + d="m 16.65204,162.41822 h 123.21341 a 5.9074955,17.266947 0 0 0 5.90824,-17.2399 V 38.904442 A 5.9074955,17.266947 0 0 0 139.86545,21.635299 H 16.65204 A 5.9074955,17.266947 0 0 0 10.743795,38.904442 V 145.17832 a 5.9074955,17.266947 0 0 0 5.908245,17.2399 z" + class="st7" + id="path43" + inkscape:connector-curvature="0" + style="fill:#ffffff;stroke:#41719c;stroke-width:1.28185344" /><rect + style="fill:none;fill-opacity:1;stroke:#41719c;stroke-width:0.7760548;stroke-opacity:1" + id="rect4604" + width="15.963434" + height="15.954105" + x="25.091528" + y="121.37455" /><rect + style="font-size:12px;overflow:visible;color-interpolation-filters:sRGB;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#41719c;stroke-width:0.7760548;stroke-linecap:square;stroke-miterlimit:3;stroke-opacity:1" + id="rect4604-7" + width="15.963433" + height="15.954105" + x="41.054958" + y="121.37455" /><rect + style="font-size:12px;overflow:visible;color-interpolation-filters:sRGB;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#41719c;stroke-width:0.7760548;stroke-linecap:square;stroke-miterlimit:3;stroke-opacity:1" + id="rect4604-7-6" + width="15.963433" + height="15.954105" + x="57.018402" + y="121.37455" /><rect + style="font-size:12px;overflow:visible;color-interpolation-filters:sRGB;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#41719c;stroke-width:0.7760548;stroke-linecap:square;stroke-miterlimit:3;stroke-opacity:1" + id="rect4604-7-6-9" + width="15.963433" + height="15.954105" + x="72.981834" + y="121.37455" /><rect + style="font-size:12px;overflow:visible;color-interpolation-filters:sRGB;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#41719c;stroke-width:0.7760548;stroke-linecap:square;stroke-miterlimit:3;stroke-opacity:1" + id="rect4604-7-6-9-8" + width="15.963433" + height="15.954105" + x="88.945259" + y="121.37455" /><rect + style="font-size:12px;overflow:visible;color-interpolation-filters:sRGB;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#41719c;stroke-width:0.7760548;stroke-linecap:square;stroke-miterlimit:3;stroke-opacity:1" + id="rect4604-7-6-9-8-9" + width="15.963433" + height="15.954105" + x="104.90869" + y="121.37455" /><rect + style="font-size:12px;overflow:visible;color-interpolation-filters:sRGB;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#41719c;stroke-width:0.7760548;stroke-linecap:square;stroke-miterlimit:3;stroke-opacity:1" + id="rect4604-7-6-9-8-9-6" + width="15.963433" + height="15.954105" + x="120.87212" + y="121.37455" /><text + x="50.562523" + y="49.898369" + class="st6" + id="text65-3" + style="font-size:22.36531448px;font-family:Calibri;overflow:visible;color-interpolation-filters:sRGB;fill:#41719c;fill-rule:evenodd;stroke-width:2.23652411;stroke-linecap:square;stroke-miterlimit:3" + transform="scale(0.47106923,2.1228302)" /> +<text + id="text4129" + y="80.842018" + x="27.862804" + style="font-style:normal;font-weight:normal;font-size:30.00008965px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.75000226" + xml:space="preserve"><tspan + style="stroke-width:0.75000226" + y="107.38506" + x="27.862804" + id="tspan4127" + sodipodi:role="line"></tspan></text> +<text + id="text4139" + y="72.697174" + x="25.290758" + style="font-style:normal;font-weight:normal;font-size:30.00008965px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.75000226" + xml:space="preserve"><tspan + style="stroke-width:0.75000226" + y="99.240219" + x="25.290758" + id="tspan4137" + sodipodi:role="line"></tspan></text> +<path + style="fill:none;fill-opacity:1;stroke:#41719c;stroke-width:0.86738265px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" + d="m 128.80127,137.90141 -0.20704,20.06801 44.6966,-0.10399 0.20705,-93.424256 16.84434,0.62379" + id="path5030" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /><g + transform="matrix(1,0,0,0.57815109,191.45876,-0.65041967)" + id="shape18-1-4"><title + id="title18-4">Rounded Rectangle.12</title><desc + id="desc20-6">Crypto Symmetric Session</desc><path + style="fill:url(#linearGradient189);stroke:#386288;stroke-width:0.75" + id="path22-0" + class="st1" + d="m 6.78,202.33 h 141.36 a 6.77735,6.77735 -180 0 0 6.77,-6.77 V 8.28 A 6.77735,6.77735 -180 0 0 148.14,1.5 H 6.78 A 6.77735,6.77735 -180 0 0 0,8.28 v 187.28 a 6.77735,6.77735 -180 0 0 6.78,6.77 z" + inkscape:connector-curvature="0" /><text + transform="scale(0.71276665,1.4029837)" + style="font-size:14.02988338px;font-family:Calibri;fill:#386288;stroke-width:1.40298378" + id="text24-5" + class="st2" + y="17.335487" + x="26.317923">Crypto Driver Private Session</text> +<text + transform="scale(0.71276665,1.4029837)" + style="font-size:14.02988338px;font-family:Calibri;overflow:visible;color-interpolation-filters:sRGB;fill:#386288;fill-rule:evenodd;stroke-width:1.40298378;stroke-linecap:square;stroke-miterlimit:3" + id="text24-5-3" + class="st2" + y="19.076277" + x="-240.04274">Crypto Symmetric Session</text> +<text + transform="scale(0.71276665,1.4029837)" + style="font-size:14.02988338px;font-family:Calibri;overflow:visible;color-interpolation-filters:sRGB;fill:#386288;fill-rule:evenodd;stroke-width:1.40298378;stroke-linecap:square;stroke-miterlimit:3" + id="text24-5-5" + class="st2" + y="46.557648" + x="-241.24557">uint16_t nb_drivers;</text> +<text + transform="scale(0.71276665,1.4029837)" + style="font-size:14.02988338px;font-family:Calibri;overflow:visible;color-interpolation-filters:sRGB;fill:#386288;fill-rule:evenodd;stroke-width:1.40298378;stroke-linecap:square;stroke-miterlimit:3" + id="text24-5-6" + class="st2" + y="98.349464" + x="-240.04272">struct {</text> +<text + transform="scale(0.71276665,1.4029837)" + style="font-size:14.02988338px;font-family:Calibri;overflow:visible;color-interpolation-filters:sRGB;fill:#386288;fill-rule:evenodd;stroke-width:1.40298378;stroke-linecap:square;stroke-miterlimit:3" + id="text24-5-2" + class="st2" + y="115.26107" + x="-204.55865">void *data;</text> +<text + transform="scale(0.71276665,1.4029837)" + style="font-size:14.02988338px;font-family:Calibri;overflow:visible;color-interpolation-filters:sRGB;fill:#386288;fill-rule:evenodd;stroke-width:1.40298378;stroke-linecap:square;stroke-miterlimit:3" + id="text24-5-9" + class="st2" + y="144.3279" + x="-240.04274">} session_data[];</text> +<text + transform="scale(0.71276665,1.4029837)" + style="font-size:14.02988338px;font-family:Calibri;overflow:visible;color-interpolation-filters:sRGB;fill:#386288;fill-rule:evenodd;stroke-width:1.40298378;stroke-linecap:square;stroke-miterlimit:3" + id="text24-5-5-1" + class="st2" + y="58.945786" + x="-240.51538">uint16_t user_data_sz;</text> +<text + transform="scale(0.71276665,1.4029837)" + style="font-size:14.02988338px;font-family:Calibri;overflow:visible;color-interpolation-filters:sRGB;fill:#386288;fill-rule:evenodd;stroke-width:1.40298378;stroke-linecap:square;stroke-miterlimit:3" + id="text24-5-5-2" + class="st2" + y="189.4823" + x="-185.78569">user_data</text> +<text + transform="scale(0.71276665,1.4029837)" + style="font-size:14.02988338px;font-family:Calibri;overflow:visible;color-interpolation-filters:sRGB;fill:#386288;fill-rule:evenodd;stroke-width:1.40298378;stroke-linecap:square;stroke-miterlimit:3" + id="text24-5-5-1-4" + class="st2" + y="129.23468" + x="-204.95244">uint16_t refcnt;</text> +<text + transform="scale(0.71276665,1.4029837)" + style="font-size:14.02988338px;font-family:Calibri;overflow:visible;color-interpolation-filters:sRGB;fill:#386288;fill-rule:evenodd;stroke-width:1.40298378;stroke-linecap:square;stroke-miterlimit:3" + id="text24-5-5-1-4-3" + class="st2" + y="72.641953" + x="-242.00067">uint64_t opaque_data;</text> +</g><g + transform="matrix(1.022976,0,0,0.71529071,199.82034,-39.936699)" + id="shape19-6-5"><title + id="title27-2">Rounded Rectangle.13</title><desc + id="desc29-0">Private Session Data</desc><g + style="visibility:visible" + class="st3" + transform="translate(0.345598,1.97279)" + id="shadow19-7-1"><path + style="fill:#bdd0e9;fill-opacity:0.25;stroke:#bdd0e9;stroke-opacity:0.25;filter:url(#filter_2)" + id="path31-8" + class="st4" + d="m 5.91,202.33 h 123.25 a 5.90925,5.90925 -180 0 0 5.91,-5.9 v -92.78 a 5.90925,5.90925 -180 0 0 -5.91,-5.91 H 5.91 A 5.90925,5.90925 -180 0 0 0,103.65 v 92.78 a 5.90925,5.90925 -180 0 0 5.91,5.9 z" + inkscape:connector-curvature="0" /></g><path + style="fill:#a6b6cd;stroke:#41719c;stroke-width:0.75" + id="path34-8" + class="st5" + d="m 5.91,202.33 h 123.25 a 5.90925,5.90925 -180 0 0 5.91,-5.9 v -92.78 a 5.90925,5.90925 -180 0 0 -5.91,-5.91 H 5.91 A 5.90925,5.90925 -180 0 0 0,103.65 v 92.78 a 5.90925,5.90925 -180 0 0 5.91,5.9 z" + inkscape:connector-curvature="0" /><text + transform="scale(0.76039781,1.3151011)" + style="font-size:13.15105343px;font-family:Calibri;fill:#41719c;stroke-width:1.31510115" + id="text36-7" + class="st6" + y="119.96548" + x="34.639763">Private Session Data</text> +</g><g + transform="matrix(1,0,0,0.57815109,191.61478,163.41083)" + id="shape18-1-4-7"><title + id="title18-4-3">Rounded Rectangle.12</title><desc + id="desc20-6-5">Crypto Symmetric Session</desc><path + style="fill:url(#linearGradient189-7);stroke:#386288;stroke-width:0.75" + id="path22-0-8" + class="st1" + d="m 6.78,202.33 h 141.36 a 6.77735,6.77735 -180 0 0 6.77,-6.77 V 8.28 A 6.77735,6.77735 -180 0 0 148.14,1.5 H 6.78 A 6.77735,6.77735 -180 0 0 0,8.28 v 187.28 a 6.77735,6.77735 -180 0 0 6.78,6.77 z" + inkscape:connector-curvature="0" /><text + transform="scale(0.71276665,1.4029837)" + style="font-size:14.02988338px;font-family:Calibri;fill:#386288;stroke-width:1.40298378" + id="text24-5-1" + class="st2" + y="17.335487" + x="26.317923">Crypto Driver Private Session</text> +</g><g + transform="matrix(1.022976,0,0,0.71529071,199.97637,124.12455)" + id="shape19-6-5-1"><title + id="title27-2-4">Rounded Rectangle.13</title><desc + id="desc29-0-9">Private Session Data</desc><g + style="visibility:visible" + class="st3" + transform="translate(0.345598,1.97279)" + id="shadow19-7-1-8"><path + style="fill:#bdd0e9;fill-opacity:0.25;stroke:#bdd0e9;stroke-opacity:0.25;filter:url(#filter_2-3)" + id="path31-8-4" + class="st4" + d="m 5.91,202.33 h 123.25 a 5.90925,5.90925 -180 0 0 5.91,-5.9 v -92.78 a 5.90925,5.90925 -180 0 0 -5.91,-5.91 H 5.91 A 5.90925,5.90925 -180 0 0 0,103.65 v 92.78 a 5.90925,5.90925 -180 0 0 5.91,5.9 z" + inkscape:connector-curvature="0" /></g><path + style="fill:#a6b6cd;stroke:#41719c;stroke-width:0.75" + id="path34-8-3" + class="st5" + d="m 5.91,202.33 h 123.25 a 5.90925,5.90925 -180 0 0 5.91,-5.9 v -92.78 a 5.90925,5.90925 -180 0 0 -5.91,-5.91 H 5.91 A 5.90925,5.90925 -180 0 0 0,103.65 v 92.78 a 5.90925,5.90925 -180 0 0 5.91,5.9 z" + inkscape:connector-curvature="0" /><text + transform="scale(0.76039781,1.3151011)" + style="font-size:13.15105343px;font-family:Calibri;fill:#41719c;stroke-width:1.31510115" + id="text36-7-6" + class="st6" + y="119.96548" + x="34.639763">Private Session Data</text> +</g><text + id="text5070" + y="145.4136" + x="248.24945" + style="font-style:normal;font-weight:normal;font-size:30.00008774px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.75000221" + xml:space="preserve"><tspan + style="stroke-width:0.75000221" + y="171.95665" + x="248.24945" + id="tspan5068" + sodipodi:role="line" /></text> +<text + id="text5074" + y="142.68553" + x="251.28064" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.00006485px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.75000221" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.00006485px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.75000221" + y="142.68553" + x="251.28064" + id="tspan5072" + sodipodi:role="line">...</tspan></text> +<path + inkscape:connector-curvature="0" + id="path5076" + d="m 32.13263,137.96494 1.19624,93.60569 156.25849,0.0883" + style="fill:none;stroke:#41719c;stroke-width:0.56864393px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5421)" /></svg>
\ No newline at end of file diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/data_struct_per_port.png b/src/spdk/dpdk/doc/guides/prog_guide/img/data_struct_per_port.png Binary files differnew file mode 100644 index 000000000..ab80052fa --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/data_struct_per_port.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/drop_probability_eq3.png b/src/spdk/dpdk/doc/guides/prog_guide/img/drop_probability_eq3.png Binary files differnew file mode 100644 index 000000000..790f0a3fc --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/drop_probability_eq3.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/drop_probability_eq4.png b/src/spdk/dpdk/doc/guides/prog_guide/img/drop_probability_eq4.png Binary files differnew file mode 100644 index 000000000..ef8e765e7 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/drop_probability_eq4.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/drop_probability_graph.png b/src/spdk/dpdk/doc/guides/prog_guide/img/drop_probability_graph.png Binary files differnew file mode 100644 index 000000000..e6e189859 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/drop_probability_graph.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i1.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i1.svg new file mode 100644 index 000000000..7f8fcb3bb --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i1.svg @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export efd_i1.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="3.25609in" height="3.375in" + viewBox="0 0 234.439 243" xml:space="preserve" color-interpolation-filters="sRGB" class="st10"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st3 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st5 {marker-end:url(#mrkr5-12);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:6} + .st6 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.70422535211268} + .st7 {stroke:#5b9bd5;stroke-dasharray:2.25,4.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.25} + .st8 {marker-end:url(#mrkr5-39);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5} + .st9 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.37313432835821} + .st10 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-12" class="st6" v:arrowType="5" v:arrowSize="2" v:setback="2.485" refX="-2.485" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-1.42,-1.42) "/> + </marker> + <marker id="mrkr5-39" class="st9" v:arrowType="5" v:arrowSize="2" v:setback="4.69" refX="-4.69" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-2.68,-2.68) "/> + </marker> + </defs> + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape2-1" v:mID="2" v:groupContext="shape" transform="translate(77.718,-113.348)"> + <title>Square</title> + <desc>LB</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="18" cy="225" width="36" height="36"/> + <g id="shadow2-2" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="207" width="36" height="36" class="st2"/> + </g> + <rect x="0" y="207" width="36" height="36" class="st3"/> + <text x="13.18" y="228" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>LB</text> </g> + <g id="shape3-7" v:mID="3" v:groupContext="shape" transform="translate(37.0513,-131.348)"> + <title>Sheet.3</title> + <path d="M0 243 L25.76 243" class="st5"/> + </g> + <g id="shape4-13" v:mID="4" v:groupContext="shape" transform="translate(167.718,-178.598)"> + <title>Square.4</title> + <desc>Target 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="22.5" cy="220.5" width="45" height="45"/> + <g id="shadow4-14" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="198" width="45" height="45" class="st2"/> + </g> + <rect x="0" y="198" width="45" height="45" class="st3"/> + <text x="5.74" y="223.5" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Target 1</text> </g> + <g id="shape5-19" v:mID="5" v:groupContext="shape" transform="translate(167.718,-121.005)"> + <title>Square.5</title> + <desc>Target 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="22.5" cy="220.5" width="45" height="45"/> + <g id="shadow5-20" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="198" width="45" height="45" class="st2"/> + </g> + <rect x="0" y="198" width="45" height="45" class="st3"/> + <text x="5.74" y="223.5" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Target 2</text> </g> + <g id="shape7-25" v:mID="7" v:groupContext="shape" transform="translate(167.718,-23.3478)"> + <title>Square.7</title> + <desc>Target N</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="22.5" cy="220.5" width="45" height="45"/> + <g id="shadow7-26" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="198" width="45" height="45" class="st2"/> + </g> + <rect x="0" y="198" width="45" height="45" class="st3"/> + <text x="5.05" y="223.5" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Target N</text> </g> + <g id="shape8-31" v:mID="8" v:groupContext="shape" transform="translate(433.218,132.402) rotate(90)"> + <title>Sheet.8</title> + <path d="M0 243 L34.59 243" class="st7"/> + </g> + <g id="shape9-34" v:mID="9" v:groupContext="shape" transform="translate(-78.4279,-37.1059) rotate(-52.2532)"> + <title>Sheet.9</title> + <path d="M0 243 L81.18 243" class="st8"/> + </g> + <g id="shape11-40" v:mID="11" v:groupContext="shape" transform="translate(60.3469,-125.414) rotate(-12.6875)"> + <title>Sheet.11</title> + <path d="M0 243 L48.32 243" class="st8"/> + </g> + <g id="shape12-45" v:mID="12" v:groupContext="shape" transform="translate(319.172,-18.1081) rotate(57.7244)"> + <title>Sheet.12</title> + <path d="M0 243 L94.09 243" class="st8"/> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i10.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i10.svg new file mode 100644 index 000000000..d26ec61ee --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i10.svg @@ -0,0 +1,384 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export efd_i11.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="9.76715in" height="2.82917in" + viewBox="0 0 703.234 203.701" xml:space="preserve" color-interpolation-filters="sRGB" class="st15"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:#ffffff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st2 {fill:none;stroke:#00aeef;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st3 {stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st4 {fill:#000000;font-family:Arial;font-size:0.998566em} + .st5 {fill:#0071c5;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st6 {fill:#000000;font-family:Arial;font-size:0.918686em;font-style:italic} + .st7 {fill:#000000;font-family:Arial;font-size:0.918686em} + .st8 {fill:#7e8d96;font-family:Arial;font-size:0.998566em;font-weight:bold} + .st9 {fill:#00b050;font-family:Arial;font-size:0.998566em;font-weight:bold} + .st10 {fill:#ff0000;font-family:Arial;font-size:0.998566em;font-weight:bold} + .st11 {fill:#004280;stroke:#004280;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0299855} + .st12 {fill:#ffffff;font-family:Arial;font-size:1.49785em} + .st13 {stroke:#004280;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st14 {fill:#004280;stroke:#004280;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0149927} + .st15 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape3-1" v:mID="3" v:groupContext="shape" transform="translate(19.0195,-93.4328)"> + <title>Sheet.3</title> + <path d="M0 182.93 C0 180.64 1.87 178.78 4.16 178.78 L109.18 178.78 C111.47 178.78 113.33 180.64 113.33 182.93 L113.33 + 199.55 C113.33 201.84 111.47 203.7 109.18 203.7 L4.16 203.7 C1.87 203.7 0 201.84 0 199.55 L0 182.93 Z" + class="st1"/> + </g> + <g id="shape4-3" v:mID="4" v:groupContext="shape" transform="translate(19.0195,-93.4328)"> + <title>Sheet.4</title> + <path d="M0 182.93 C0 180.64 1.87 178.78 4.16 178.78 L109.18 178.78 C111.47 178.78 113.33 180.64 113.33 182.93 L113.33 + 199.55 C113.33 201.84 111.47 203.7 109.18 203.7 L4.16 203.7 C1.87 203.7 0 201.84 0 199.55 L0 182.93 Z" + class="st2"/> + </g> + <g id="shape5-5" v:mID="5" v:groupContext="shape" transform="translate(19.0195,-96.9057)"> + <title>Sheet.5</title> + <desc>Key1: Value = 0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="58.0575" cy="196.509" width="116.12" height="14.3829"/> + <path d="M116.11 189.32 L0 189.32 L0 203.7 L116.11 203.7 L116.11 189.32" class="st3"/> + <text x="15.59" y="200.1" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key1: Value = 0</text> </g> + <g id="shape6-9" v:mID="6" v:groupContext="shape" transform="translate(19.0195,-68.6284)"> + <title>Sheet.6</title> + <path d="M0 182.93 C0 180.64 1.87 178.78 4.16 178.78 L109.18 178.78 C111.47 178.78 113.33 180.64 113.33 182.93 L113.33 + 199.55 C113.33 201.84 111.47 203.7 109.18 203.7 L4.16 203.7 C1.87 203.7 0 201.84 0 199.55 L0 182.93 Z" + class="st1"/> + </g> + <g id="shape7-11" v:mID="7" v:groupContext="shape" transform="translate(19.0195,-68.6284)"> + <title>Sheet.7</title> + <path d="M0 182.93 C0 180.64 1.87 178.78 4.16 178.78 L109.18 178.78 C111.47 178.78 113.33 180.64 113.33 182.93 L113.33 + 199.55 C113.33 201.84 111.47 203.7 109.18 203.7 L4.16 203.7 C1.87 203.7 0 201.84 0 199.55 L0 182.93 Z" + class="st2"/> + </g> + <g id="shape8-13" v:mID="8" v:groupContext="shape" transform="translate(19.0195,-72.0832)"> + <title>Sheet.8</title> + <desc>Key3: Value = 1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="58.0575" cy="196.509" width="116.12" height="14.3829"/> + <path d="M116.11 189.32 L0 189.32 L0 203.7 L116.11 203.7 L116.11 189.32" class="st3"/> + <text x="15.59" y="200.1" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key3: Value = 1</text> </g> + <g id="shape9-17" v:mID="9" v:groupContext="shape" transform="translate(19.0195,-43.5843)"> + <title>Sheet.9</title> + <path d="M0 182.84 C-0 180.53 1.88 178.66 4.19 178.66 L109.15 178.66 C111.46 178.66 113.33 180.53 113.33 182.84 L113.33 + 199.53 C113.33 201.84 111.46 203.7 109.15 203.7 L4.19 203.7 C1.88 203.7 0 201.84 0 199.53 L0 182.84 Z" + class="st1"/> + </g> + <g id="shape10-19" v:mID="10" v:groupContext="shape" transform="translate(19.0195,-43.5843)"> + <title>Sheet.10</title> + <path d="M0 182.84 C-0 180.53 1.88 178.66 4.19 178.66 L109.15 178.66 C111.46 178.66 113.33 180.53 113.33 182.84 L113.33 + 199.53 C113.33 201.84 111.46 203.7 109.15 203.7 L4.19 203.7 C1.88 203.7 0 201.84 0 199.53 L0 182.84 Z" + class="st2"/> + </g> + <g id="shape11-21" v:mID="11" v:groupContext="shape" transform="translate(19.0195,-47.1109)"> + <title>Sheet.11</title> + <desc>Key4: Value = 0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="58.0575" cy="196.509" width="116.12" height="14.3829"/> + <path d="M116.11 189.32 L0 189.32 L0 203.7 L116.11 203.7 L116.11 189.32" class="st3"/> + <text x="15.59" y="200.1" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key4: Value = 0</text> </g> + <g id="shape12-25" v:mID="12" v:groupContext="shape" transform="translate(19.0195,-19.0195)"> + <title>Sheet.12</title> + <path d="M0 182.84 C-0 180.53 1.88 178.66 4.19 178.66 L109.15 178.66 C111.46 178.66 113.33 180.53 113.33 182.84 L113.33 + 199.53 C113.33 201.84 111.46 203.7 109.15 203.7 L4.19 203.7 C1.88 203.7 0 201.84 0 199.53 L0 182.84 Z" + class="st1"/> + </g> + <g id="shape13-27" v:mID="13" v:groupContext="shape" transform="translate(19.0195,-19.0195)"> + <title>Sheet.13</title> + <path d="M0 182.84 C-0 180.53 1.88 178.66 4.19 178.66 L109.15 178.66 C111.46 178.66 113.33 180.53 113.33 182.84 L113.33 + 199.53 C113.33 201.84 111.46 203.7 109.15 203.7 L4.19 203.7 C1.88 203.7 0 201.84 0 199.53 L0 182.84 Z" + class="st2"/> + </g> + <g id="shape14-29" v:mID="14" v:groupContext="shape" transform="translate(19.0195,-22.5475)"> + <title>Sheet.14</title> + <desc>Key7: Value = 1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="58.0575" cy="196.509" width="116.12" height="14.3829"/> + <path d="M116.11 189.32 L0 189.32 L0 203.7 L116.11 203.7 L116.11 189.32" class="st3"/> + <text x="15.59" y="200.1" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key7: Value = 1</text> </g> + <g id="shape15-33" v:mID="15" v:groupContext="shape" transform="translate(141.656,-45.5615)"> + <title>Sheet.15</title> + <path d="M0 169.01 L22.75 169.01 L22.75 157.45 L45.5 180.57 L22.75 203.7 L22.75 192.14 L0 192.14 L0 169.01 Z" + class="st5"/> + </g> + <g id="shape16-35" v:mID="16" v:groupContext="shape" transform="translate(193.22,-56.0464)"> + <title>Sheet.16</title> + <path d="M0 182.84 C0 180.53 1.88 178.66 4.19 178.66 L96.55 178.66 C98.87 178.66 100.73 180.53 100.73 182.84 L100.73 + 199.54 C100.73 201.84 98.87 203.7 96.55 203.7 L4.19 203.7 C1.88 203.7 0 201.84 0 199.54 L0 182.84 Z" + class="st1"/> + </g> + <g id="shape17-37" v:mID="17" v:groupContext="shape" transform="translate(193.22,-56.0464)"> + <title>Sheet.17</title> + <path d="M0 182.84 C0 180.53 1.88 178.66 4.19 178.66 L96.55 178.66 C98.87 178.66 100.73 180.53 100.73 182.84 L100.73 + 199.54 C100.73 201.84 98.87 203.7 96.55 203.7 L4.19 203.7 C1.88 203.7 0 201.84 0 199.54 L0 182.84 Z" + class="st2"/> + </g> + <g id="shape18-39" v:mID="18" v:groupContext="shape" transform="translate(228.157,-66.9545)"> + <title>Sheet.18</title> + <desc>F</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="5.63538" cy="197.084" width="11.28" height="13.2327"/> + <path d="M11.27 190.47 L0 190.47 L0 203.7 L11.27 203.7 L11.27 190.47" class="st3"/> + <text x="2.27" y="200.39" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>F</text> </g> + <g id="shape19-43" v:mID="19" v:groupContext="shape" transform="translate(234.88,-66.9545)"> + <title>Sheet.19</title> + <desc>(key,</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="17.261" cy="197.084" width="34.53" height="13.2327"/> + <path d="M34.52 190.47 L0 190.47 L0 203.7 L34.52 203.7 L34.52 190.47" class="st3"/> + <text x="5.32" y="200.39" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(key, </text> </g> + <g id="shape20-47" v:mID="20" v:groupContext="shape" transform="translate(198.215,-53.7734)"> + <title>Sheet.20</title> + <desc>hash_index =</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="41.4128" cy="197.084" width="82.83" height="13.2327"/> + <path d="M82.83 190.47 L0 190.47 L0 203.7 L82.83 203.7 L82.83 190.47" class="st3"/> + <text x="8.47" y="200.39" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash_index = </text> </g> + <g id="shape21-51" v:mID="21" v:groupContext="shape" transform="translate(274.858,-53.7734)"> + <title>Sheet.21</title> + <desc>i)</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="5.28241" cy="197.084" width="10.57" height="13.2327"/> + <path d="M10.56 190.47 L0 190.47 L0 203.7 L10.56 203.7 L10.56 190.47" class="st3"/> + <text x="2.22" y="200.39" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>i)</text> </g> + <g id="shape22-55" v:mID="22" v:groupContext="shape" transform="translate(351.453,-93.7923)"> + <title>Sheet.22</title> + <path d="M0 182.84 C0 180.53 1.88 178.66 4.19 178.66 L109.16 178.66 C111.47 178.66 113.33 180.53 113.33 182.84 L113.33 + 199.54 C113.33 201.84 111.47 203.7 109.16 203.7 L4.19 203.7 C1.88 203.7 0 201.84 0 199.54 L0 182.84 Z" + class="st1"/> + </g> + <g id="shape23-57" v:mID="23" v:groupContext="shape" transform="translate(351.453,-93.7923)"> + <title>Sheet.23</title> + <path d="M0 182.84 C0 180.53 1.88 178.66 4.19 178.66 L109.16 178.66 C111.47 178.66 113.33 180.53 113.33 182.84 L113.33 + 199.54 C113.33 201.84 111.47 203.7 109.16 203.7 L4.19 203.7 C1.88 203.7 0 201.84 0 199.54 L0 182.84 Z" + class="st2"/> + </g> + <g id="shape24-59" v:mID="24" v:groupContext="shape" transform="translate(355.798,-97.3147)"> + <title>Sheet.24</title> + <desc>Key1: Position 4</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="51.7083" cy="196.509" width="103.42" height="14.3829"/> + <path d="M103.42 189.32 L0 189.32 L0 203.7 L103.42 203.7 L103.42 189.32" class="st3"/> + <text x="8.41" y="200.1" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key1: Position 4</text> </g> + <g id="shape25-63" v:mID="25" v:groupContext="shape" transform="translate(351.453,-68.9879)"> + <title>Sheet.25</title> + <path d="M0 182.94 C0 180.65 1.88 178.78 4.17 178.78 L109.18 178.78 C111.47 178.78 113.33 180.65 113.33 182.94 L113.33 + 199.55 C113.33 201.84 111.47 203.7 109.18 203.7 L4.17 203.7 C1.88 203.7 0 201.84 0 199.55 L0 182.94 Z" + class="st1"/> + </g> + <g id="shape26-65" v:mID="26" v:groupContext="shape" transform="translate(351.453,-68.9879)"> + <title>Sheet.26</title> + <path d="M0 182.94 C0 180.65 1.88 178.78 4.17 178.78 L109.18 178.78 C111.47 178.78 113.33 180.65 113.33 182.94 L113.33 + 199.55 C113.33 201.84 111.47 203.7 109.18 203.7 L4.17 203.7 C1.88 203.7 0 201.84 0 199.55 L0 182.94 Z" + class="st2"/> + </g> + <g id="shape27-67" v:mID="27" v:groupContext="shape" transform="translate(355.798,-72.4921)"> + <title>Sheet.27</title> + <desc>Key3: Position 6</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="51.7083" cy="196.509" width="103.42" height="14.3829"/> + <path d="M103.42 189.32 L0 189.32 L0 203.7 L103.42 203.7 L103.42 189.32" class="st3"/> + <text x="8.41" y="200.1" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key3: Position 6</text> </g> + <g id="shape28-71" v:mID="28" v:groupContext="shape" transform="translate(351.453,-44.0636)"> + <title>Sheet.28</title> + <path d="M0 182.94 C0 180.65 1.88 178.78 4.17 178.78 L109.18 178.78 C111.47 178.78 113.33 180.65 113.33 182.94 L113.33 + 199.55 C113.33 201.84 111.47 203.7 109.18 203.7 L4.17 203.7 C1.88 203.7 0 201.84 0 199.55 L0 182.94 Z" + class="st1"/> + </g> + <g id="shape29-73" v:mID="29" v:groupContext="shape" transform="translate(351.453,-44.0636)"> + <title>Sheet.29</title> + <path d="M0 182.94 C0 180.65 1.88 178.78 4.17 178.78 L109.18 178.78 C111.47 178.78 113.33 180.65 113.33 182.94 L113.33 + 199.55 C113.33 201.84 111.47 203.7 109.18 203.7 L4.17 203.7 C1.88 203.7 0 201.84 0 199.55 L0 182.94 Z" + class="st2"/> + </g> + <g id="shape30-75" v:mID="30" v:groupContext="shape" transform="translate(351.215,-47.5198)"> + <title>Sheet.30</title> + <desc>Key4: Position 14</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="55.5403" cy="196.509" width="111.09" height="14.3829"/> + <path d="M111.08 189.32 L0 189.32 L0 203.7 L111.08 203.7 L111.08 189.32" class="st3"/> + <text x="8.91" y="200.1" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key4: Position 14</text> </g> + <g id="shape31-79" v:mID="31" v:groupContext="shape" transform="translate(351.453,-19.4988)"> + <title>Sheet.31</title> + <path d="M0 182.94 C0 180.65 1.88 178.78 4.17 178.78 L109.18 178.78 C111.47 178.78 113.33 180.65 113.33 182.94 L113.33 + 199.55 C113.33 201.84 111.47 203.7 109.18 203.7 L4.17 203.7 C1.88 203.7 0 201.84 0 199.55 L0 182.94 Z" + class="st1"/> + </g> + <g id="shape32-81" v:mID="32" v:groupContext="shape" transform="translate(351.453,-19.4988)"> + <title>Sheet.32</title> + <path d="M0 182.94 C0 180.65 1.88 178.78 4.17 178.78 L109.18 178.78 C111.47 178.78 113.33 180.65 113.33 182.94 L113.33 + 199.55 C113.33 201.84 111.47 203.7 109.18 203.7 L4.17 203.7 C1.88 203.7 0 201.84 0 199.55 L0 182.94 Z" + class="st2"/> + </g> + <g id="shape33-83" v:mID="33" v:groupContext="shape" transform="translate(351.215,-22.9565)"> + <title>Sheet.33</title> + <desc>Key7: Position 14</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="55.5403" cy="196.509" width="111.09" height="14.3829"/> + <path d="M111.08 189.32 L0 189.32 L0 203.7 L111.08 203.7 L111.08 189.32" class="st3"/> + <text x="8.91" y="200.1" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key7: Position 14</text> </g> + <g id="shape34-87" v:mID="34" v:groupContext="shape" transform="translate(299.89,-46.0408)"> + <title>Sheet.34</title> + <path d="M0 169.01 L22.75 169.01 L22.75 157.45 L45.5 180.57 L22.75 203.7 L22.75 192.14 L0 192.14 L0 169.01 Z" + class="st5"/> + </g> + <g id="shape35-89" v:mID="35" v:groupContext="shape" transform="translate(528.896,-117.518)"> + <title>Sheet.35</title> + <path d="M0 182.94 C0 180.66 1.89 178.78 4.17 178.78 L137.64 178.78 C139.92 178.78 141.79 180.66 141.79 182.94 L141.79 + 199.57 C141.79 201.84 139.92 203.7 137.64 203.7 L4.17 203.7 C1.89 203.7 0 201.84 0 199.57 L0 182.94 Z" + class="st1"/> + </g> + <g id="shape36-91" v:mID="36" v:groupContext="shape" transform="translate(528.896,-117.518)"> + <title>Sheet.36</title> + <path d="M0 182.94 C0 180.66 1.89 178.78 4.17 178.78 L137.64 178.78 C139.92 178.78 141.79 180.66 141.79 182.94 L141.79 + 199.57 C141.79 201.84 139.92 203.7 137.64 203.7 L4.17 203.7 C1.89 203.7 0 201.84 0 199.57 L0 182.94 Z" + class="st2"/> + </g> + <g id="shape37-93" v:mID="37" v:groupContext="shape" transform="translate(530.056,-121.017)"> + <title>Sheet.37</title> + <desc>0000</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="19.1585" cy="196.509" width="38.32" height="14.3829"/> + <path d="M38.32 189.32 L0 189.32 L0 203.7 L38.32 203.7 L38.32 189.32" class="st3"/> + <text x="5.83" y="200.1" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0000 </text> </g> + <g id="shape38-97" v:mID="38" v:groupContext="shape" transform="translate(567.215,-121.017)"> + <title>Sheet.38</title> + <desc>0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="5.7483" cy="196.509" width="11.5" height="14.3829"/> + <path d="M11.5 189.32 L0 189.32 L0 203.7 L11.5 203.7 L11.5 189.32" class="st3"/> + <text x="2.42" y="200.1" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0</text> </g> + <g id="shape39-101" v:mID="39" v:groupContext="shape" transform="translate(576.215,-121.017)"> + <title>Sheet.39</title> + <desc>0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="5.7483" cy="196.509" width="11.5" height="14.3829"/> + <path d="M11.5 189.32 L0 189.32 L0 203.7 L11.5 203.7 L11.5 189.32" class="st3"/> + <text x="2.42" y="200.1" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0</text> </g> + <g id="shape40-105" v:mID="40" v:groupContext="shape" transform="translate(584.486,-121.017)"> + <title>Sheet.40</title> + <desc>1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="5.7483" cy="196.509" width="11.5" height="14.3829"/> + <path d="M11.5 189.32 L0 189.32 L0 203.7 L11.5 203.7 L11.5 189.32" class="st3"/> + <text x="2.42" y="200.1" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>1</text> </g> + <g id="shape41-109" v:mID="41" v:groupContext="shape" transform="translate(588.646,-121.017)"> + <title>Sheet.41</title> + <desc>0 0000 00</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="32.5687" cy="196.509" width="65.14" height="14.3829"/> + <path d="M65.14 189.32 L0 189.32 L0 203.7 L65.14 203.7 L65.14 189.32" class="st3"/> + <text x="5.91" y="200.1" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0 0000 00</text> </g> + <g id="shape42-113" v:mID="42" v:groupContext="shape" transform="translate(644.965,-121.017)"> + <title>Sheet.42</title> + <desc>?</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="6.12511" cy="196.509" width="12.26" height="14.3829"/> + <path d="M12.25 189.32 L0 189.32 L0 203.7 L12.25 203.7 L12.25 189.32" class="st3"/> + <text x="2.47" y="200.1" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>?</text> </g> + <g id="shape43-117" v:mID="43" v:groupContext="shape" transform="translate(654.718,-121.017)"> + <title>Sheet.43</title> + <desc>0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="5.7483" cy="196.509" width="11.5" height="14.3829"/> + <path d="M11.5 189.32 L0 189.32 L0 203.7 L11.5 203.7 L11.5 189.32" class="st3"/> + <text x="2.42" y="200.1" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0</text> </g> + <g id="shape44-121" v:mID="44" v:groupContext="shape" transform="translate(464.786,-105.296)"> + <title>Sheet.44</title> + <path d="M0 203.7 L108.29 203.7 C108.86 203.7 109.31 203.22 109.31 202.68 L109.31 189.5 L107.27 189.5 L107.27 202.68 + L108.29 201.66 L0 201.66 L0 203.7 ZM111.35 190.52 L108.29 184.41 L105.23 190.55 L111.35 190.52 Z" + class="st11"/> + </g> + <g id="shape45-123" v:mID="45" v:groupContext="shape" transform="translate(464.786,-80.4315)"> + <title>Sheet.45</title> + <path d="M0 203.7 L123.63 203.7 C124.2 203.7 124.65 203.25 124.65 202.68 L124.65 164.28 L122.61 164.28 L122.61 202.68 + L123.63 201.66 L0 201.66 L0 203.7 ZM126.69 165.3 L123.6 159.18 L120.57 165.33 L126.69 165.3 Z" + class="st11"/> + </g> + <g id="shape46-125" v:mID="46" v:groupContext="shape" transform="translate(464.786,-55.4772)"> + <title>Sheet.46</title> + <path d="M0 203.7 L186.48 203.7 C186.75 203.7 186.99 203.61 187.2 203.4 C187.38 203.22 187.5 202.95 187.5 202.68 L187.41 + 139.32 L185.37 139.32 L185.46 202.68 L186.48 201.66 L0 201.66 L0 203.7 ZM189.51 140.07 L185.94 134.23 L183.41 + 140.61 L189.51 140.07 Z" class="st11"/> + </g> + <g id="shape47-127" v:mID="47" v:groupContext="shape" transform="translate(464.786,-30.9125)"> + <title>Sheet.47</title> + <path d="M0 203.7 L186.48 203.7 C186.75 203.7 186.99 203.61 187.2 203.4 C187.38 203.22 187.5 202.95 187.5 202.68 L187.41 + 114.76 L185.37 114.76 L185.46 202.68 L186.48 201.66 L0 201.66 L0 203.7 ZM189.51 115.51 L185.94 109.67 L183.41 + 116.05 L189.51 115.51 Z" class="st11"/> + </g> + <g id="shape48-129" v:mID="48" v:groupContext="shape" transform="translate(442.996,-151.106)"> + <title>Sheet.48</title> + <path d="M0 179.56 C0 176.89 2.19 174.7 4.86 174.7 L70.8 174.7 C73.47 174.7 75.64 176.89 75.64 179.56 L75.64 198.88 C75.64 + 201.54 73.47 203.7 70.8 203.7 L4.86 203.7 C2.19 203.7 0 201.54 0 198.88 L0 179.56 Z" class="st5"/> + </g> + <g id="shape49-131" v:mID="49" v:groupContext="shape" transform="translate(443.529,-155.018)"> + <title>Sheet.49</title> + <desc>Values</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="37.8175" cy="192.914" width="75.64" height="21.5726"/> + <path d="M75.64 182.13 L0 182.13 L0 203.7 L75.64 203.7 L75.64 182.13" class="st3"/> + <text x="10.34" y="198.31" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Values</text> </g> + <g id="shape50-135" v:mID="50" v:groupContext="shape" transform="translate(102.458,-122.192)"> + <title>Sheet.50</title> + <path d="M0 203.7 C-0 199.21 0.62 195.55 1.37 195.55 L11.67 195.55 C12.42 195.55 13.03 191.9 13.03 187.4 C13.03 191.9 + 13.64 195.55 14.39 195.55 L24.69 195.55 C25.44 195.55 26.05 199.21 26.05 203.7" class="st13"/> + </g> + <g id="shape51-138" v:mID="51" v:groupContext="shape" transform="translate(115.454,-137.5)"> + <title>Sheet.51</title> + <path d="M0.2 203.7 L322.66 174.12 L322.48 172.1 L0 201.68 L0.2 203.7 L0.2 203.7 ZM321.84 176.24 L327.66 172.64 L321.28 + 170.16 L321.84 176.24 L321.84 176.24 Z" class="st14"/> + </g> + <g id="shape52-140" v:mID="52" v:groupContext="shape" transform="translate(518.211,-142.473)"> + <title>Sheet.52</title> + <path d="M0.99 176.74 L44.78 200.38 L43.82 202.17 L0 178.51 L0.99 176.74 L0.99 176.74 ZM44.87 198.1 L48.8 203.7 L41.96 + 203.46 L44.87 198.1 L44.87 198.1 Z" class="st11"/> + </g> + <g id="shape53-142" v:mID="53" v:groupContext="shape" transform="translate(518.331,-141.963)"> + <title>Sheet.53</title> + <path d="M0.75 176.17 L60.09 200.32 L59.34 202.2 L0 178.06 L0.75 176.17 L0.75 176.17 ZM59.91 198.04 L64.44 203.19 L57.6 + 203.7 L59.91 198.04 L59.91 198.04 Z" class="st11"/> + </g> + <g id="shape54-144" v:mID="54" v:groupContext="shape" transform="translate(576.558,-153.706)"> + <title>Sheet.54</title> + <path d="M0 177.04 C0 174.1 2.4 171.71 5.34 171.71 L101.51 171.71 C104.48 171.71 106.85 174.1 106.85 177.04 L106.85 198.37 + C106.85 201.33 104.48 203.7 101.51 203.7 L5.34 203.7 C2.4 203.7 0 201.33 0 198.37 L0 177.04 Z" class="st1"/> + </g> + <g id="shape55-146" v:mID="55" v:groupContext="shape" transform="translate(577.365,-151.611)"> + <title>Sheet.55</title> + <path d="M0 177.04 C0 174.1 2.4 171.71 5.34 171.71 L101.51 171.71 C104.48 171.71 106.85 174.1 106.85 177.04 L106.85 198.37 + C106.85 201.33 104.48 203.7 101.51 203.7 L5.34 203.7 C2.4 203.7 0 201.33 0 198.37 L0 177.04 Z" class="st2"/> + </g> + <g id="shape56-148" v:mID="56" v:groupContext="shape" transform="translate(593.952,-167.894)"> + <title>Sheet.56</title> + <desc>Lookup_table</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="43.2942" cy="196.509" width="86.59" height="14.3829"/> + <path d="M86.59 189.32 L0 189.32 L0 203.7 L86.59 203.7 L86.59 189.32" class="st3"/> + <text x="7.31" y="200.1" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Lookup_table</text> </g> + <g id="shape57-152" v:mID="57" v:groupContext="shape" transform="translate(608.239,-153.515)"> + <title>Sheet.57</title> + <desc>(16 bits)</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="26.8054" cy="196.509" width="53.62" height="14.3829"/> + <path d="M53.61 189.32 L0 189.32 L0 203.7 L53.61 203.7 L53.61 189.32" class="st3"/> + <text x="5.16" y="200.1" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(16 bits)</text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i11.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i11.svg new file mode 100644 index 000000000..f2cc656b6 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i11.svg @@ -0,0 +1,319 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export efd_i12.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="10.2783in" height="4.28958in" + viewBox="0 0 740.039 308.85" xml:space="preserve" color-interpolation-filters="sRGB" class="st21"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:#ffffff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st2 {fill:none;stroke:#00aeef;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st3 {stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st4 {fill:#000000;font-family:Arial;font-size:0.998566em} + .st5 {fill:#0071c5;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st6 {stroke:#00b050;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st7 {stroke:#00aeef;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st8 {fill:#000000;font-family:Arial;font-size:0.918686em;font-weight:bold} + .st9 {fill:#00b050;font-size:1em} + .st10 {fill:#c00000;font-family:Arial;font-size:0.828804em;font-weight:bold} + .st11 {fill:#004280;stroke:#004280;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.00749637} + .st12 {fill:#ffffff;font-family:Arial;font-size:1.16833em} + .st13 {fill:#2e75b5;stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st14 {fill:#ffffff;font-family:Arial;font-size:1.16666em} + .st15 {font-size:1em} + .st16 {fill:none;stroke:none;stroke-width:0.25} + .st17 {fill:#000000;font-family:Calibri;font-size:1.00001em} + .st18 {marker-end:url(#mrkr5-121);stroke:#5b9bd5;stroke-dasharray:1.5,3;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5} + .st19 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.37313432835821} + .st20 {fill:#000000;font-family:Calibri;font-size:1.16666em} + .st21 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-121" class="st19" v:arrowType="5" v:arrowSize="2" v:setback="4.69" refX="-4.69" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-2.68,-2.68) "/> + </marker> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape5-1" v:mID="5" v:groupContext="shape" transform="translate(36.0674,-256.878)"> + <title>Sheet.5</title> + <path d="M0 291.88 C0 290 1.52 288.48 3.41 288.48 L68.51 288.48 C70.4 288.48 71.91 290 71.91 291.88 L71.91 305.46 C71.91 + 307.33 70.4 308.85 68.51 308.85 L3.41 308.85 C1.52 308.85 0 307.33 0 305.46 L0 291.88 Z" class="st1"/> + </g> + <g id="shape6-3" v:mID="6" v:groupContext="shape" transform="translate(36.0674,-256.878)"> + <title>Sheet.6</title> + <path d="M0 291.88 C0 290 1.52 288.48 3.41 288.48 L68.51 288.48 C70.4 288.48 71.91 290 71.91 291.88 L71.91 305.46 C71.91 + 307.33 70.4 308.85 68.51 308.85 L3.41 308.85 C1.52 308.85 0 307.33 0 305.46 L0 291.88 Z" class="st2"/> + </g> + <g id="shape7-5" v:mID="7" v:groupContext="shape" transform="translate(61.6502,-258.089)"> + <title>Sheet.7</title> + <desc>Key</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="13.7891" cy="301.658" width="27.58" height="14.3829"/> + <path d="M27.58 294.47 L0 294.47 L0 308.85 L27.58 308.85 L27.58 294.47" class="st3"/> + <text x="3.46" y="305.25" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key</text> </g> + <g id="shape8-9" v:mID="8" v:groupContext="shape" transform="translate(51.9748,-236.328)"> + <title>Sheet.8</title> + <path d="M0 298.54 L9.81 298.54 L9.81 288.24 L29.44 288.24 L29.44 298.54 L39.26 298.54 L19.63 308.85 L0 298.54 Z" + class="st5"/> + </g> + <g id="shape9-11" v:mID="9" v:groupContext="shape" transform="translate(36.0674,-215.298)"> + <title>Sheet.9</title> + <path d="M0 291.77 C0 289.89 1.54 288.36 3.42 288.36 L68.49 288.36 C70.38 288.36 71.91 289.89 71.91 291.77 L71.91 305.43 + C71.91 307.32 70.38 308.85 68.49 308.85 L3.42 308.85 C1.54 308.85 0 307.32 0 305.43 L0 291.77 Z" + class="st1"/> + </g> + <g id="shape10-13" v:mID="10" v:groupContext="shape" transform="translate(36.0674,-215.298)"> + <title>Sheet.10</title> + <path d="M0 291.77 C0 289.89 1.54 288.36 3.42 288.36 L68.49 288.36 C70.38 288.36 71.91 289.89 71.91 291.77 L71.91 305.43 + C71.91 307.32 70.38 308.85 68.49 308.85 L3.42 308.85 C1.54 308.85 0 307.32 0 305.43 L0 291.77 Z" + class="st2"/> + </g> + <g id="shape11-15" v:mID="11" v:groupContext="shape" transform="translate(58.8889,-216.57)"> + <title>Sheet.11</title> + <desc>hash</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="16.8573" cy="301.658" width="33.72" height="14.3829"/> + <path d="M33.71 294.47 L0 294.47 L0 308.85 L33.71 308.85 L33.71 294.47" class="st3"/> + <text x="3.86" y="305.25" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash</text> </g> + <g id="shape12-19" v:mID="12" v:groupContext="shape" transform="translate(27.3033,-174.437)"> + <title>Sheet.12</title> + <path d="M0 292.58 C0 290.78 1.46 289.32 3.26 289.32 L87.15 289.32 C88.95 289.32 90.4 290.78 90.4 292.58 L90.4 305.6 + C90.4 307.4 88.95 308.85 87.15 308.85 L3.26 308.85 C1.46 308.85 0 307.4 0 305.6 L0 292.58 Z" class="st1"/> + </g> + <g id="shape13-21" v:mID="13" v:groupContext="shape" transform="translate(27.3033,-174.437)"> + <title>Sheet.13</title> + <path d="M0 292.58 C0 290.78 1.46 289.32 3.26 289.32 L87.15 289.32 C88.95 289.32 90.4 290.78 90.4 292.58 L90.4 305.6 + C90.4 307.4 88.95 308.85 87.15 308.85 L3.26 308.85 C1.46 308.85 0 307.4 0 305.6 L0 292.58 Z" class="st2"/> + </g> + <g id="shape14-23" v:mID="14" v:groupContext="shape" transform="translate(36.0515,-175.256)"> + <title>Sheet.14</title> + <desc>0x0102ABCD</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="43.6644" cy="301.658" width="87.33" height="14.3829"/> + <path d="M87.33 294.47 L0 294.47 L0 308.85 L87.33 308.85 L87.33 294.47" class="st3"/> + <text x="7.36" y="305.25" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0x0102ABCD</text> </g> + <g id="shape15-27" v:mID="15" v:groupContext="shape" transform="translate(51.9748,-194.029)"> + <title>Sheet.15</title> + <path d="M0 298.48 L9.81 298.48 L9.81 288.12 L29.44 288.12 L29.44 298.48 L39.26 298.48 L19.63 308.85 L0 298.48 Z" + class="st5"/> + </g> + <g id="shape16-29" v:mID="16" v:groupContext="shape" transform="translate(48.9133,-159.818)"> + <title>Sheet.16</title> + <path d="M26.41 296.87 C26.41 300.18 25.97 302.86 25.41 302.86 L14.21 302.86 C13.66 302.86 13.21 305.55 13.21 308.85 + C13.21 305.55 12.76 302.86 12.21 302.86 L1.01 302.86 C0.45 302.86 0 300.18 0 296.87" class="st6"/> + </g> + <g id="shape17-32" v:mID="17" v:groupContext="shape" transform="translate(19.0195,-19.0195)"> + <title>Sheet.17</title> + <path d="M0 196.93 L0 308.85 L145.15 308.85 L145.15 196.93 L0 196.93 L0 196.93 Z" class="st1"/> + </g> + <g id="shape18-34" v:mID="18" v:groupContext="shape" transform="translate(19.0195,-19.0195)"> + <title>Sheet.18</title> + <path d="M0 196.93 L145.15 196.93 L145.15 308.85 L0 308.85 L0 196.93" class="st7"/> + </g> + <g id="shape19-37" v:mID="19" v:groupContext="shape" transform="translate(28.2638,-70.6655)"> + <title>Sheet.19</title> + <path d="M0 280.69 C0 277.58 2.53 275.06 5.64 275.06 L124.14 275.06 C127.26 275.06 129.78 277.58 129.78 280.69 L129.78 + 303.22 C129.78 306.33 127.26 308.85 124.14 308.85 L5.64 308.85 C2.53 308.85 0 306.33 0 303.22 L0 280.69 + Z" class="st1"/> + </g> + <g id="shape20-39" v:mID="20" v:groupContext="shape" transform="translate(28.2638,-70.6655)"> + <title>Sheet.20</title> + <path d="M0 280.69 C0 277.58 2.53 275.06 5.64 275.06 L124.14 275.06 C127.26 275.06 129.78 277.58 129.78 280.69 L129.78 + 303.22 C129.78 306.33 127.26 308.85 124.14 308.85 L5.64 308.85 C2.53 308.85 0 306.33 0 303.22 L0 280.69 + Z" class="st2"/> + </g> + <g id="shape21-41" v:mID="21" v:groupContext="shape" transform="translate(57.4514,-85.7513)"> + <title>Sheet.21</title> + <desc>hash_index =</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="45.0133" cy="301.658" width="90.03" height="14.3829"/> + <path d="M90.03 294.47 L0 294.47 L0 308.85 L90.03 308.85 L90.03 294.47" class="st3"/> + <text x="9.2" y="305.25" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash_index = </text> </g> + <g id="shape22-45" v:mID="22" v:groupContext="shape" transform="translate(76.3001,-71.3719)"> + <title>Sheet.22</title> + <desc>38123</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="21.0762" cy="301.658" width="42.16" height="14.3829"/> + <path d="M42.15 294.47 L0 294.47 L0 308.85 L42.15 308.85 L42.15 294.47" class="st3"/> + <text x="4.42" y="305.25" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>38123</text> </g> + <g id="shape23-49" v:mID="23" v:groupContext="shape" transform="translate(28.2638,-27.048)"> + <title>Sheet.23</title> + <path d="M0 280.69 C0 277.59 2.54 275.06 5.64 275.06 L124.14 275.06 C127.26 275.06 129.78 277.59 129.78 280.69 L129.78 + 303.22 C129.78 306.33 127.26 308.85 124.14 308.85 L5.64 308.85 C2.54 308.85 0 306.33 0 303.22 L0 280.69 + Z" class="st1"/> + </g> + <g id="shape24-51" v:mID="24" v:groupContext="shape" transform="translate(28.2638,-27.048)"> + <title>Sheet.24</title> + <path d="M0 280.69 C0 277.59 2.54 275.06 5.64 275.06 L124.14 275.06 C127.26 275.06 129.78 277.59 129.78 280.69 L129.78 + 303.22 C129.78 306.33 127.26 308.85 124.14 308.85 L5.64 308.85 C2.54 308.85 0 306.33 0 303.22 L0 280.69 + Z" class="st2"/> + </g> + <g id="shape25-53" v:mID="25" v:groupContext="shape" transform="translate(54.0924,-41.564)"> + <title>Sheet.25</title> + <desc>lookup_table =</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="46.931" cy="301.658" width="93.87" height="14.3829"/> + <path d="M93.86 294.47 L0 294.47 L0 308.85 L93.86 308.85 L93.86 294.47" class="st3"/> + <text x="7.79" y="305.25" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>lookup_table =</text> </g> + <g id="shape26-57" v:mID="26" v:groupContext="shape" transform="translate(28.0195,-28.5506)"> + <title>Sheet.26</title> + <desc>0110 1100 0101 1101</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="64.89" cy="302.233" width="129.79" height="13.2327"/> + <path d="M129.78 295.62 L0 295.62 L0 308.85 L129.78 308.85 L129.78 295.62" class="st3"/> + <text x="11.25" y="305.54" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0110 11<tspan + class="st9">0</tspan>0 0101 1101</text> </g> + <g id="shape27-62" v:mID="27" v:groupContext="shape" transform="translate(26.2461,-113.863)"> + <title>Sheet.27</title> + <desc>Group ID: 0x0102</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="48.6286" cy="302.881" width="97.26" height="11.9384"/> + <path d="M97.26 296.91 L0 296.91 L0 308.85 L97.26 308.85 L97.26 296.91" class="st3"/> + <text x="7.73" y="305.86" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Group ID: 0x0102</text> </g> + <g id="shape28-66" v:mID="28" v:groupContext="shape" transform="translate(42.3703,-135.313)"> + <title>Sheet.28</title> + <path d="M0 298.48 L9.84 298.48 L9.84 288.12 L29.53 288.12 L29.53 298.48 L39.38 298.48 L19.69 308.85 L0 298.48 Z" + class="st5"/> + </g> + <g id="shape29-68" v:mID="29" v:groupContext="shape" transform="translate(117.645,-244.476)"> + <title>Sheet.29</title> + <path d="M0 274.07 L22.75 274.07 L22.75 262.48 L45.5 285.66 L22.75 308.85 L22.75 297.26 L0 297.26 L0 274.07 Z" + class="st5"/> + </g> + <g id="shape30-70" v:mID="30" v:groupContext="shape" transform="translate(169.209,-251.966)"> + <title>Sheet.30</title> + <path d="M0 283.69 C0 280.91 2.27 278.65 5.04 278.65 L111.77 278.65 C114.56 278.65 116.81 280.91 116.81 283.69 L116.81 + 303.82 C116.81 306.6 114.56 308.85 111.77 308.85 L5.04 308.85 C2.27 308.85 0 306.6 0 303.82 L0 283.69 Z" + class="st1"/> + </g> + <g id="shape31-72" v:mID="31" v:groupContext="shape" transform="translate(169.209,-251.966)"> + <title>Sheet.31</title> + <path d="M0 283.69 C0 280.91 2.27 278.65 5.04 278.65 L111.77 278.65 C114.56 278.65 116.81 280.91 116.81 283.69 L116.81 + 303.82 C116.81 306.6 114.56 308.85 111.77 308.85 L5.04 308.85 C2.27 308.85 0 306.6 0 303.82 L0 283.69 Z" + class="st2"/> + </g> + <g id="shape35-74" v:mID="35" v:groupContext="shape" transform="translate(291.966,-244.476)"> + <title>Sheet.35</title> + <path d="M0 274.07 L22.69 274.07 L22.69 262.48 L45.38 285.66 L22.69 308.85 L22.69 297.26 L0 297.26 L0 274.07 Z" + class="st5"/> + </g> + <g id="shape36-76" v:mID="36" v:groupContext="shape" transform="translate(343.17,-254.482)"> + <title>Sheet.36</title> + <path d="M0 288.09 C0 285.8 1.88 283.93 4.17 283.93 L109.18 283.93 C111.47 283.93 113.33 285.8 113.33 288.09 L113.33 + 304.7 C113.33 306.99 111.47 308.85 109.18 308.85 L4.17 308.85 C1.88 308.85 0 306.99 0 304.7 L0 288.09 Z" + class="st1"/> + </g> + <g id="shape37-78" v:mID="37" v:groupContext="shape" transform="translate(343.17,-254.482)"> + <title>Sheet.37</title> + <path d="M0 288.09 C0 285.8 1.88 283.93 4.17 283.93 L109.18 283.93 C111.47 283.93 113.33 285.8 113.33 288.09 L113.33 + 304.7 C113.33 306.99 111.47 308.85 109.18 308.85 L4.17 308.85 C1.88 308.85 0 306.99 0 304.7 L0 288.09 Z" + class="st2"/> + </g> + <g id="shape38-80" v:mID="38" v:groupContext="shape" transform="translate(368.337,-257.958)"> + <title>Sheet.38</title> + <desc>Position = 6</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="38.1131" cy="301.658" width="76.23" height="14.3829"/> + <path d="M76.23 294.47 L0 294.47 L0 308.85 L76.23 308.85 L76.23 294.47" class="st3"/> + <text x="6.64" y="305.25" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Position = 6</text> </g> + <g id="shape39-84" v:mID="39" v:groupContext="shape" transform="translate(158.044,-86.5202)"> + <title>Sheet.39</title> + <path d="M0 308.85 L69.59 308.85 C70.16 308.85 70.62 308.39 70.62 307.83 L70.62 148.5 L68.57 148.5 L68.57 307.83 L69.59 + 306.81 L0 306.81 L0 308.85 ZM72.66 149.52 L69.59 143.4 L66.53 149.52 L72.66 149.52 Z" class="st11"/> + </g> + <g id="shape41-86" v:mID="41" v:groupContext="shape" transform="translate(335.112,-199.647)"> + <title>Sheet.41</title> + <desc>Apply the equation</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="71.2648" cy="300.436" width="142.53" height="16.8275"/> + <path d="M142.53 292.02 L0 292.02 L0 308.85 L142.53 308.85 L142.53 292.02" class="st3"/> + <text x="13.19" y="304.64" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Apply the equation </text> </g> + <g id="shape42-90" v:mID="42" v:groupContext="shape" transform="translate(341.115,-182.871)"> + <title>Sheet.42</title> + <desc>to retrieve the bit</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="64.5256" cy="300.436" width="129.06" height="16.8275"/> + <path d="M129.05 292.02 L0 292.02 L0 308.85 L129.05 308.85 L129.05 292.02" class="st3"/> + <text x="12.31" y="304.64" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>to retrieve the bit </text> </g> + <g id="shape43-94" v:mID="43" v:groupContext="shape" transform="translate(349.999,-166.095)"> + <title>Sheet.43</title> + <desc>position in the</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="54.2285" cy="300.436" width="108.46" height="16.8275"/> + <path d="M108.46 292.02 L0 292.02 L0 308.85 L108.46 308.85 L108.46 292.02" class="st3"/> + <text x="10.97" y="304.64" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>position in the </text> </g> + <g id="shape44-98" v:mID="44" v:groupContext="shape" transform="translate(353.361,-149.319)"> + <title>Sheet.44</title> + <desc>lookup_table</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="47.9619" cy="300.436" width="95.93" height="16.8275"/> + <path d="M95.92 292.02 L0 292.02 L0 308.85 L95.92 308.85 L95.92 292.02" class="st3"/> + <text x="8.21" y="304.64" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>lookup_table</text> </g> + <g id="shape47-102" v:mID="47" v:groupContext="shape" transform="translate(115.17,255.2) rotate(-90)"> + <title>1-D word balloon</title> + <desc>Retrieve the value “0' from the specified location in the loo...</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="Scale" v:val="VT0(1):26"/> + <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="29.2016" cy="218.85" width="180" height="58.4032" transform="rotate(90)"/> + <path d="M0 308.85 L58.4 308.85 L58.4 128.85 L0 128.85 L0 204.67 L-11.87 38.85 L-7.09 233.03 L0 233.03 L0 308.85 Z" + class="st13"/> + <text x="136.98" y="-41.8" transform="rotate(90)" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Retrieve the value “0' from <tspan + x="134.41" dy="1.2em" class="st15">the specified location in the </tspan><tspan x="181.1" dy="1.2em" + class="st15">lookup table</tspan></text> </g> + <g id="shape48-107" v:mID="48" v:groupContext="shape" transform="translate(169.209,-251.966)"> + <title>Sheet.48</title> + <desc>F(Key, hash_index = 38123</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54.2285" cy="295.35" width="108.46" height="27"/> + <rect x="0" y="281.85" width="108.457" height="27" class="st16"/> + <text x="5.86" y="291.75" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>F(Key, hash_index = <tspan + x="39.02" dy="1.2em" class="st15">38123</tspan></text> </g> + <g id="shape49-111" v:mID="49" v:groupContext="shape" transform="translate(553.962,99) rotate(90)"> + <title>1-D word balloon.49</title> + <desc>Apply the equation to retrieve the bit position in the lookup...</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="Scale" v:val="VT0(1):26"/> + <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="29.2016" cy="218.85" width="180" height="58.4032" transform="rotate(-90)"/> + <path d="M0 308.85 L58.4 308.85 L58.4 128.85 L0 128.85 L0 204.67 L-51.13 299.85 L0 233.03 L0 308.85 Z" class="st13"/> + <text x="-284.62" y="16.6" transform="rotate(-90)" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Apply the equation to <tspan + x="-296.67" dy="1.2em" class="st15">retrieve the bit position in </tspan><tspan x="-270.22" dy="1.2em" + class="st15">the lookup</tspan>_table</text> </g> + <g id="shape50-116" v:mID="50" v:groupContext="shape" transform="translate(640.132,-104.709) rotate(44.1224)"> + <title>Sheet.50</title> + <path d="M0 308.85 L54.13 308.85" class="st18"/> + </g> + <g id="shape51-122" v:mID="51" v:groupContext="shape" transform="translate(433.02,-122.267)"> + <title>Sheet.51</title> + <desc>(Hash(key,seed1)+38123*hash(key,seed2))%16</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="144" cy="295.35" width="288" height="27"/> + <rect x="0" y="281.85" width="288" height="27" class="st2"/> + <text x="9.86" y="299.55" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(Hash(key,seed1)+38123*hash(key,seed2))%16</text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i12.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i12.svg new file mode 100644 index 000000000..a309d5829 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i12.svg @@ -0,0 +1,1008 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export efd_i13.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="10.2932in" height="5.27505in" + viewBox="0 0 741.108 379.804" xml:space="preserve" color-interpolation-filters="sRGB" class="st30"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {stroke:#004280;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st2 {stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st3 {fill:#004280;font-family:Arial;font-size:0.828804em} + .st4 {fill:#ffffff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st5 {stroke:#00aeef;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st6 {fill:#7030a0;font-family:Arial;font-size:0.828804em;font-weight:bold} + .st7 {fill:#d0d6d9;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st8 {fill:#006fc5;stroke:#006fc5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.00749637} + .st9 {fill:#006fc5;stroke:#006fc5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0149927} + .st10 {fill:#d0d6d9;stroke:#d0d6d9;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0299855} + .st11 {fill:#d0d6d9;stroke:#d0d6d9;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0149927} + .st12 {fill:#004280;font-family:Arial;font-size:0.828804em;font-weight:bold} + .st13 {fill:#00b050;font-family:Arial;font-size:0.828804em;font-weight:bold} + .st14 {fill:#ff0000;font-family:Arial;font-size:0.828804em;font-weight:bold} + .st15 {fill:#00b050;stroke:#00b050;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0299855} + .st16 {fill:#c00000;font-family:Arial;font-size:0.828804em;font-weight:bold} + .st17 {fill:#000000;font-family:Arial;font-size:0.828804em;font-weight:bold} + .st18 {fill:#7f6d00;font-family:Arial;font-size:0.828804em;font-weight:bold} + .st19 {fill:#ff0000;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st20 {fill:#7e8d96;font-family:Arial;font-size:0.828804em;font-weight:bold} + .st21 {fill:none;stroke:#00aeef;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st22 {fill:#000000;font-family:Arial;font-size:0.998566em} + .st23 {fill:#0071c5;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st24 {stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st25 {fill:#ffffff;font-family:Arial;font-size:0.998566em} + .st26 {fill:#ff6600;stroke:#ff6600;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.00749637} + .st27 {fill:#004280;stroke:#004280;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0299855} + .st28 {fill:#ff0000;stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0299855} + .st29 {fill:#ffffff;font-family:Arial;font-size:1.49785em} + .st30 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape3-1" v:mID="3" v:groupContext="shape" transform="translate(304.703,-329.32)"> + <title>Sheet.3</title> + <path d="M0 379.8 C-0 375.37 0.6 371.78 1.35 371.78 L205.05 371.78 C205.78 371.78 206.38 368.18 206.38 363.75 C206.38 + 368.18 206.98 371.78 207.73 371.78 L411.43 371.78 C412.15 371.78 412.75 375.37 412.75 379.8" class="st1"/> + </g> + <g id="shape4-4" v:mID="4" v:groupContext="shape" transform="translate(219.943,-329.32)"> + <title>Sheet.4</title> + <path d="M0 379.8 C0 375.64 0.57 372.25 1.26 372.25 L29.77 372.25 C30.48 372.25 31.03 368.88 31.03 364.71 C31.03 368.88 + 31.6 372.25 32.29 372.25 L60.81 372.25 C61.51 372.25 62.07 375.64 62.07 379.8" class="st1"/> + </g> + <g id="shape5-7" v:mID="5" v:groupContext="shape" transform="translate(241.175,-343.9)"> + <title>Sheet.5</title> + <desc>Bins</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="12.7158" cy="373.835" width="25.44" height="11.9384"/> + <path d="M25.43 367.87 L0 367.87 L0 379.8 L25.43 379.8 L25.43 367.87" class="st2"/> + <text x="3.04" y="376.82" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Bins</text> </g> + <g id="shape6-11" v:mID="6" v:groupContext="shape" transform="translate(496.212,-344.504)"> + <title>Sheet.6</title> + <desc>Groups</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="20.3447" cy="373.835" width="40.69" height="11.9384"/> + <path d="M40.69 367.87 L0 367.87 L0 379.8 L40.69 379.8 L40.69 367.87" class="st2"/> + <text x="4.04" y="376.82" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Groups</text> </g> + <g id="shape7-15" v:mID="7" v:groupContext="shape" transform="translate(131.823,-260.299)"> + <title>Sheet.7</title> + <path d="M0 314.02 L0 379.8 L41.18 379.8 L41.18 314.02 L0 314.02 L0 314.02 Z" class="st4"/> + </g> + <g id="shape8-17" v:mID="8" v:groupContext="shape" transform="translate(131.823,-260.299)"> + <title>Sheet.8</title> + <path d="M0 314.02 L41.18 314.02 L41.18 379.8 L0 379.8 L0 314.02" class="st5"/> + </g> + <g id="shape9-20" v:mID="9" v:groupContext="shape" transform="translate(134.706,-310.738)"> + <title>Sheet.9</title> + <desc>0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0</text> </g> + <g id="shape10-24" v:mID="10" v:groupContext="shape" transform="translate(122.218,-329.32)"> + <title>Sheet.10</title> + <path d="M0 379.8 C-0 375.64 0.57 372.25 1.26 372.25 L29.77 372.25 C30.47 372.25 31.03 368.88 31.03 364.71 C31.03 368.88 + 31.6 372.25 32.29 372.25 L60.81 372.25 C61.51 372.25 62.07 375.64 62.07 379.8" class="st1"/> + </g> + <g id="shape11-27" v:mID="11" v:groupContext="shape" transform="translate(137.598,-343.9)"> + <title>Sheet.11</title> + <desc>Chunks</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="20.9813" cy="373.835" width="41.97" height="11.9384"/> + <path d="M41.96 367.87 L0 367.87 L0 379.8 L41.96 379.8 L41.96 367.87" class="st2"/> + <text x="4.12" y="376.82" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Chunks</text> </g> + <g id="shape12-31" v:mID="12" v:groupContext="shape" transform="translate(131.823,-195.232)"> + <title>Sheet.12</title> + <path d="M0 314.02 L0 379.8 L41.18 379.8 L41.18 314.02 L0 314.02 L0 314.02 Z" class="st4"/> + </g> + <g id="shape13-33" v:mID="13" v:groupContext="shape" transform="translate(131.823,-195.232)"> + <title>Sheet.13</title> + <path d="M0 314.02 L41.18 314.02 L41.18 379.8 L0 379.8 L0 314.02" class="st5"/> + </g> + <g id="shape14-36" v:mID="14" v:groupContext="shape" transform="translate(134.706,-245.682)"> + <title>Sheet.14</title> + <desc>1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>1</text> </g> + <g id="shape15-40" v:mID="15" v:groupContext="shape" transform="translate(131.823,-130.525)"> + <title>Sheet.15</title> + <path d="M0 314.02 L0 379.8 L41.18 379.8 L41.18 314.02 L0 314.02 L0 314.02 Z" class="st7"/> + </g> + <g id="shape16-42" v:mID="16" v:groupContext="shape" transform="translate(131.823,-130.525)"> + <title>Sheet.16</title> + <path d="M0 314.02 L41.18 314.02 L41.18 379.8 L0 379.8 L0 314.02" class="st5"/> + </g> + <g id="shape17-45" v:mID="17" v:groupContext="shape" transform="translate(134.706,-180.952)"> + <title>Sheet.17</title> + <desc>…</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="7.30974" cy="373.835" width="14.62" height="11.9384"/> + <path d="M14.62 367.87 L0 367.87 L0 379.8 L14.62 379.8 L14.62 367.87" class="st2"/> + <text x="2.34" y="376.82" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>…</text> </g> + <g id="shape18-49" v:mID="18" v:groupContext="shape" transform="translate(131.823,-65.4584)"> + <title>Sheet.18</title> + <path d="M0 314.02 L0 379.8 L41.18 379.8 L41.18 314.02 L0 314.02 L0 314.02 Z" class="st4"/> + </g> + <g id="shape19-51" v:mID="19" v:groupContext="shape" transform="translate(131.823,-65.4584)"> + <title>Sheet.19</title> + <path d="M0 314.02 L41.18 314.02 L41.18 379.8 L0 379.8 L0 314.02" class="st5"/> + </g> + <g id="shape20-54" v:mID="20" v:groupContext="shape" transform="translate(130.403,-115.896)"> + <title>Sheet.20</title> + <desc>variable</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="24.7986" cy="373.835" width="49.6" height="11.9384"/> + <path d="M49.6 367.87 L0 367.87 L0 379.8 L49.6 379.8 L49.6 367.87" class="st2"/> + <text x="6" y="376.82" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>variable </text> </g> + <g id="shape21-58" v:mID="21" v:groupContext="shape" transform="translate(130.403,-103.913)"> + <title>Sheet.21</title> + <desc># of</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="13.347" cy="373.835" width="26.7" height="11.9384"/> + <path d="M26.69 367.87 L0 367.87 L0 379.8 L26.69 379.8 L26.69 367.87" class="st2"/> + <text x="4.51" y="376.82" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/># of </text> </g> + <g id="shape22-62" v:mID="22" v:groupContext="shape" transform="translate(130.403,-91.93)"> + <title>Sheet.22</title> + <desc>chunks</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="21.6122" cy="373.835" width="43.23" height="11.9384"/> + <path d="M43.22 367.87 L0 367.87 L0 379.8 L43.22 379.8 L43.22 367.87" class="st2"/> + <text x="4.2" y="376.82" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>chunks</text> </g> + <g id="shape23-66" v:mID="23" v:groupContext="shape" transform="translate(130.403,-79.9472)"> + <title>Sheet.23</title> + <desc>(power</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="21.9251" cy="373.835" width="43.86" height="11.9384"/> + <path d="M43.85 367.87 L0 367.87 L0 379.8 L43.85 379.8 L43.85 367.87" class="st2"/> + <text x="5.62" y="376.82" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(power </text> </g> + <g id="shape24-70" v:mID="24" v:groupContext="shape" transform="translate(130.403,-67.9643)"> + <title>Sheet.24</title> + <desc>of 2)</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="13.6626" cy="373.835" width="27.33" height="11.9384"/> + <path d="M27.33 367.87 L0 367.87 L0 379.8 L27.33 379.8 L27.33 367.87" class="st2"/> + <text x="3.17" y="376.82" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>of 2)</text> </g> + <g id="shape25-74" v:mID="25" v:groupContext="shape" transform="translate(172.289,-260.838)"> + <title>Sheet.25</title> + <path d="M1.43 379.8 L3.29 375.51 L1.85 374.9 L0 379.19 L1.43 379.8 L1.43 379.8 ZM3.9 374.08 L5.76 369.79 L4.32 369.18 + L2.47 373.47 L3.9 374.08 L3.9 374.08 ZM6.37 368.36 L8.22 364.07 L6.79 363.45 L4.94 367.75 L6.37 368.36 L6.37 + 368.36 ZM8.84 362.64 L10.69 358.35 L9.26 357.73 L7.41 362.02 L8.84 362.64 L8.84 362.64 ZM11.31 356.92 L13.16 + 352.62 L11.73 352 L9.87 356.3 L11.31 356.92 L11.31 356.92 ZM13.78 351.19 L15.63 346.9 L14.2 346.28 L12.34 + 350.57 L13.78 351.19 L13.78 351.19 ZM16.25 345.47 L18.1 341.17 L16.67 340.56 L14.81 344.85 L16.25 345.47 + L16.25 345.47 ZM18.71 339.74 L20.57 335.45 L19.13 334.84 L17.28 339.13 L18.71 339.74 L18.71 339.74 ZM21.18 + 334.02 L23.04 329.73 L21.6 329.12 L19.75 333.41 L21.18 334.02 L21.18 334.02 ZM23.65 328.3 L25.5 324.01 L24.07 + 323.39 L22.22 327.68 L23.65 328.3 L23.65 328.3 ZM26.12 322.58 L27.97 318.28 L26.54 317.67 L24.69 321.96 + L26.12 322.58 L26.12 322.58 ZM28.59 316.85 L29.44 314.87 L28.01 314.25 L27.16 316.24 L28.59 316.85 L28.59 + 316.85 Z" class="st8"/> + </g> + <g id="shape26-76" v:mID="26" v:groupContext="shape" transform="translate(172.476,-20.463)"> + <title>Sheet.26</title> + <path d="M1.55 203.84 L2.28 208.45 L0.74 208.7 L0 204.09 L1.55 203.84 L1.55 203.84 ZM2.52 209.99 L3.27 214.61 L1.73 214.86 + L0.99 210.23 L2.52 209.99 L2.52 209.99 ZM3.51 216.15 L4.25 220.76 L2.7 221 L1.97 216.39 L3.51 216.15 L3.51 + 216.15 ZM4.49 222.3 L5.24 226.92 L3.69 227.16 L2.96 222.54 L4.49 222.3 L4.49 222.3 ZM5.48 228.45 L6.21 233.07 + L4.67 233.31 L3.93 228.7 L5.48 228.45 L5.48 228.45 ZM6.47 234.6 L7.2 239.22 L5.66 239.47 L4.92 234.86 L6.47 + 234.6 L6.47 234.6 ZM7.44 240.76 L8.18 245.37 L6.65 245.63 L5.9 241 L7.44 240.76 L7.44 240.76 ZM8.43 246.91 + L9.17 251.53 L7.62 251.77 L6.89 247.15 L8.43 246.91 L8.43 246.91 ZM9.41 253.07 L10.14 257.68 L8.61 257.92 + L7.88 253.31 L9.41 253.07 L9.41 253.07 ZM10.4 259.21 L11.14 263.84 L9.59 264.08 L8.85 259.47 L10.4 259.21 + L10.4 259.21 ZM11.38 265.37 L12.13 269.98 L10.58 270.24 L9.84 265.62 L11.38 265.37 L11.38 265.37 ZM12.37 + 271.52 L13.1 276.14 L11.56 276.39 L10.82 271.76 L12.37 271.52 L12.37 271.52 ZM13.34 277.68 L14.09 282.29 + L12.55 282.53 L11.81 277.92 L13.34 277.68 L13.34 277.68 ZM14.33 283.84 L15.07 288.45 L13.52 288.69 L12.79 + 284.08 L14.33 283.84 L14.33 283.84 ZM15.32 289.99 L16.06 294.61 L14.51 294.85 L13.78 290.23 L15.32 289.99 + L15.32 289.99 ZM16.3 296.13 L17.03 300.75 L15.5 301 L14.75 296.39 L16.3 296.13 L16.3 296.13 ZM17.29 302.29 + L18.02 306.9 L16.48 307.16 L15.74 302.53 L17.29 302.29 L17.29 302.29 ZM18.26 308.45 L19 313.06 L17.47 313.3 + L16.73 308.69 L18.26 308.45 L18.26 308.45 ZM19.25 314.6 L19.99 319.22 L18.44 319.46 L17.71 314.84 L19.25 + 314.6 L19.25 314.6 ZM20.23 320.76 L20.96 325.37 L19.43 325.61 L18.7 321 L20.23 320.76 L20.23 320.76 ZM21.22 + 326.9 L21.96 331.51 L20.41 331.77 L19.67 327.15 L21.22 326.9 L21.22 326.9 ZM22.2 333.06 L22.95 337.67 L21.4 + 337.92 L20.66 333.31 L22.2 333.06 L22.2 333.06 ZM23.19 339.21 L23.92 343.83 L22.38 344.07 L21.64 339.45 + L23.19 339.21 L23.19 339.21 ZM24.18 345.37 L24.91 349.98 L23.37 350.22 L22.63 345.61 L24.18 345.37 L24.18 + 345.37 ZM25.15 351.52 L25.89 356.14 L24.36 356.38 L23.61 351.76 L25.15 351.52 L25.15 351.52 ZM26.14 357.67 + L26.88 362.28 L25.33 362.53 L24.6 357.92 L26.14 357.67 L26.14 357.67 ZM27.12 363.82 L27.85 368.44 L26.32 + 368.69 L25.59 364.08 L27.12 363.82 L27.12 363.82 ZM28.11 369.98 L28.84 374.59 L27.3 374.83 L26.56 370.22 + L28.11 369.98 L28.11 369.98 ZM29.08 376.13 L29.64 379.55 L28.09 379.8 L27.55 376.37 L29.08 376.13 L29.08 + 376.13 Z" class="st9"/> + </g> + <g id="shape27-78" v:mID="27" v:groupContext="shape" transform="translate(276.159,-233.368)"> + <title>Sheet.27</title> + <path d="M0.45 294.85 L354.04 376.06 L353.59 378.04 L0 296.85 L0.45 294.85 L0.45 294.85 ZM353.5 373.84 L358.79 378.19 + L352.12 379.8 L353.5 373.84 L353.5 373.84 Z" class="st10"/> + </g> + <g id="shape28-80" v:mID="28" v:groupContext="shape" transform="translate(275.859,-178.726)"> + <title>Sheet.28</title> + <path d="M1.05 240.32 L231.44 376.33 L230.39 378.1 L0 242.09 L1.05 240.32 L1.05 240.32 ZM231.59 374.05 L235.31 379.8 + L228.47 379.32 L231.59 374.05 L231.59 374.05 Z" class="st10"/> + </g> + <g id="shape29-82" v:mID="29" v:groupContext="shape" transform="translate(275.379,-87.6866)"> + <title>Sheet.29</title> + <path d="M2 149.94 L50.05 374.61 L48.05 375.04 L0 150.38 L2 149.94 L2 149.94 ZM51.83 373.18 L50.12 379.8 L45.85 374.47 + L51.83 373.18 L51.83 373.18 Z" class="st11"/> + </g> + <g id="shape30-84" v:mID="30" v:groupContext="shape" transform="translate(276.279,-177.108)"> + <title>Sheet.30</title> + <path d="M0.21 353.74 L229.55 375.85 L229.34 377.89 L0 355.75 L0.21 353.74 L0.21 353.74 ZM228.71 373.72 L234.53 377.35 + L228.14 379.8 L228.71 373.72 L228.71 373.72 Z" class="st10"/> + </g> + <g id="shape31-86" v:mID="31" v:groupContext="shape" transform="translate(275.919,-213.926)"> + <title>Sheet.31</title> + <path d="M0.45 308.72 L312.65 376.06 L312.2 378.04 L0 310.72 L0.45 308.72 L0.45 308.72 ZM312.08 373.84 L317.43 378.13 + L310.79 379.8 L312.08 373.84 L312.08 373.84 Z" class="st10"/> + </g> + <g id="shape32-88" v:mID="32" v:groupContext="shape" transform="translate(275.439,-143.377)"> + <title>Sheet.32</title> + <path d="M1.4 238.41 L150.34 375.59 L148.96 377.09 L0 239.9 L1.4 238.41 L1.4 238.41 ZM150.98 373.41 L153.4 379.8 L146.83 + 377.9 L150.98 373.41 L150.98 373.41 Z" class="st11"/> + </g> + <g id="shape33-90" v:mID="33" v:groupContext="shape" transform="translate(275.274,-108.821)"> + <title>Sheet.33</title> + <path d="M1.73 236.53 L90.79 374.97 L89.08 376.07 L0 237.63 L1.73 236.53 L1.73 236.53 ZM91.96 373 L92.7 379.8 L86.82 + 376.31 L91.96 373 L91.96 373 Z" class="st11"/> + </g> + <g id="shape34-92" v:mID="34" v:groupContext="shape" transform="translate(275.364,-124.069)"> + <title>Sheet.34</title> + <path d="M1.55 251.66 L108.22 375.28 L106.67 376.61 L0 253 L1.55 251.66 L1.55 251.66 ZM109.1 373.18 L110.78 379.8 L104.46 + 377.17 L109.1 373.18 L109.1 373.18 Z" class="st11"/> + </g> + <g id="shape35-94" v:mID="35" v:groupContext="shape" transform="translate(275.154,-87.7165)"> + <title>Sheet.35</title> + <path d="M1.97 215.68 L49.85 374.64 L47.9 375.22 L0 216.27 L1.97 215.68 L1.97 215.68 ZM51.52 373.08 L50.35 379.8 L45.65 + 374.83 L51.52 373.08 L51.52 373.08 Z" class="st11"/> + </g> + <g id="shape36-96" v:mID="36" v:groupContext="shape" transform="translate(276.009,-143.736)"> + <title>Sheet.36</title> + <path d="M0.74 320.41 L147.92 376.36 L147.2 378.26 L0 322.32 L0.74 320.41 L0.74 320.41 ZM147.7 374.08 L152.34 379.11 + L145.52 379.8 L147.7 374.08 L147.7 374.08 Z" class="st11"/> + </g> + <g id="shape37-98" v:mID="37" v:groupContext="shape" transform="translate(275.649,-108.821)"> + <title>Sheet.37</title> + <path d="M1.46 285.74 L89.46 375.45 L88 376.87 L0 287.16 L1.46 285.74 L1.46 285.74 ZM90.21 373.29 L92.29 379.8 L85.82 + 377.57 L90.21 373.29 L90.21 373.29 Z" class="st11"/> + </g> + <g id="shape38-100" v:mID="38" v:groupContext="shape" transform="translate(275.934,-108.686)"> + <title>Sheet.38</title> + <path d="M0.89 335.24 L87.85 376.57 L86.97 378.41 L0 337.09 L0.89 335.24 L0.89 335.24 ZM87.81 374.29 L92.01 379.67 L85.16 + 379.8 L87.81 374.29 L87.81 374.29 Z" class="st11"/> + </g> + <g id="shape39-102" v:mID="39" v:groupContext="shape" transform="translate(275.574,-89.454)"> + <title>Sheet.39</title> + <path d="M1.61 316.29 L48.49 375.18 L46.88 376.45 L0 317.57 L1.61 316.29 L1.61 316.29 ZM49.45 373.11 L50.86 379.8 L44.65 + 376.91 L49.45 373.11 L49.45 373.11 Z" class="st11"/> + </g> + <g id="shape40-104" v:mID="40" v:groupContext="shape" transform="translate(276.324,-141.744)"> + <title>Sheet.40</title> + <path d="M0.11 368.21 L146.74 375.79 L146.62 377.83 L0 370.23 L0.11 368.21 L0.11 368.21 ZM145.82 373.71 L151.78 377.08 + L145.51 379.8 L145.82 373.71 L145.82 373.71 Z" class="st11"/> + </g> + <g id="shape41-106" v:mID="41" v:groupContext="shape" transform="translate(230.508,-309.069)"> + <title>Sheet.41</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st4"/> + </g> + <g id="shape42-108" v:mID="42" v:groupContext="shape" transform="translate(230.508,-309.069)"> + <title>Sheet.42</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape43-111" v:mID="43" v:groupContext="shape" transform="translate(233.39,-309.868)"> + <title>Sheet.43</title> + <desc>0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0</text> </g> + <g id="shape44-115" v:mID="44" v:groupContext="shape" transform="translate(263.764,-309.869)"> + <title>Sheet.44</title> + <desc>4</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>4</text> </g> + <g id="shape45-119" v:mID="45" v:groupContext="shape" transform="translate(230.508,-292.413)"> + <title>Sheet.45</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st7"/> + </g> + <g id="shape46-121" v:mID="46" v:groupContext="shape" transform="translate(230.508,-292.413)"> + <title>Sheet.46</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape47-124" v:mID="47" v:groupContext="shape" transform="translate(233.39,-293.221)"> + <title>Sheet.47</title> + <desc>1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>1</text> </g> + <g id="shape48-128" v:mID="48" v:groupContext="shape" transform="translate(230.508,-275.757)"> + <title>Sheet.48</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st4"/> + </g> + <g id="shape49-130" v:mID="49" v:groupContext="shape" transform="translate(230.508,-275.757)"> + <title>Sheet.49</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape50-133" v:mID="50" v:groupContext="shape" transform="translate(233.39,-276.574)"> + <title>Sheet.50</title> + <desc>2</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>2</text> </g> + <g id="shape51-137" v:mID="51" v:groupContext="shape" transform="translate(252.478,-276.574)"> + <title>Sheet.51</title> + <desc>3</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>3</text> </g> + <g id="shape52-141" v:mID="52" v:groupContext="shape" transform="translate(258.001,-276.574)"> + <title>Sheet.52</title> + <desc>+1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="8.11122" cy="373.835" width="16.23" height="11.9384"/> + <path d="M16.22 367.87 L0 367.87 L0 379.8 L16.22 379.8 L16.22 367.87" class="st2"/> + <text x="2.44" y="376.82" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>+1</text> </g> + <g id="shape53-145" v:mID="53" v:groupContext="shape" transform="translate(230.508,-259.7)"> + <title>Sheet.53</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st7"/> + </g> + <g id="shape54-147" v:mID="54" v:groupContext="shape" transform="translate(230.508,-259.7)"> + <title>Sheet.54</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape55-150" v:mID="55" v:groupContext="shape" transform="translate(233.39,-260.497)"> + <title>Sheet.55</title> + <desc>3</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>3</text> </g> + <g id="shape56-154" v:mID="56" v:groupContext="shape" transform="translate(230.508,-243.164)"> + <title>Sheet.56</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st4"/> + </g> + <g id="shape57-156" v:mID="57" v:groupContext="shape" transform="translate(230.508,-243.164)"> + <title>Sheet.57</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape58-159" v:mID="58" v:groupContext="shape" transform="translate(233.39,-244.053)"> + <title>Sheet.58</title> + <desc>4</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>4</text> </g> + <g id="shape59-163" v:mID="59" v:groupContext="shape" transform="translate(263.764,-244.053)"> + <title>Sheet.59</title> + <desc>0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0</text> </g> + <g id="shape60-167" v:mID="60" v:groupContext="shape" transform="translate(230.508,-227.107)"> + <title>Sheet.60</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st7"/> + </g> + <g id="shape61-169" v:mID="61" v:groupContext="shape" transform="translate(230.508,-227.107)"> + <title>Sheet.61</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape62-172" v:mID="62" v:groupContext="shape" transform="translate(233.39,-227.976)"> + <title>Sheet.62</title> + <desc>5</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>5</text> </g> + <g id="shape63-176" v:mID="63" v:groupContext="shape" transform="translate(230.508,-210.211)"> + <title>Sheet.63</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st7"/> + </g> + <g id="shape64-178" v:mID="64" v:groupContext="shape" transform="translate(230.508,-210.211)"> + <title>Sheet.64</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape65-181" v:mID="65" v:groupContext="shape" transform="translate(233.39,-211.085)"> + <title>Sheet.65</title> + <desc>6</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>6</text> </g> + <g id="shape66-185" v:mID="66" v:groupContext="shape" transform="translate(230.508,-193.794)"> + <title>Sheet.66</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st4"/> + </g> + <g id="shape67-187" v:mID="67" v:groupContext="shape" transform="translate(230.508,-193.794)"> + <title>Sheet.67</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape68-190" v:mID="68" v:groupContext="shape" transform="translate(233.39,-194.681)"> + <title>Sheet.68</title> + <desc>7</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>7</text> </g> + <g id="shape69-194" v:mID="69" v:groupContext="shape" transform="translate(263.764,-194.681)"> + <title>Sheet.69</title> + <desc>2</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>2</text> </g> + <g id="shape70-198" v:mID="70" v:groupContext="shape" transform="translate(230.508,-177.258)"> + <title>Sheet.70</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st7"/> + </g> + <g id="shape71-200" v:mID="71" v:groupContext="shape" transform="translate(230.508,-177.258)"> + <title>Sheet.71</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape72-203" v:mID="72" v:groupContext="shape" transform="translate(233.39,-178.117)"> + <title>Sheet.72</title> + <desc>8</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>8</text> </g> + <g id="shape73-207" v:mID="73" v:groupContext="shape" transform="translate(230.508,-160.602)"> + <title>Sheet.73</title> + <path d="M0 363.15 L0 379.8 L41.18 379.8 L41.18 363.15 L0 363.15 L0 363.15 Z" class="st7"/> + </g> + <g id="shape74-209" v:mID="74" v:groupContext="shape" transform="translate(230.508,-160.602)"> + <title>Sheet.74</title> + <path d="M0 363.15 L41.18 363.15 L41.18 379.8 L0 379.8 L0 363.15" class="st5"/> + </g> + <g id="shape75-212" v:mID="75" v:groupContext="shape" transform="translate(233.39,-161.505)"> + <title>Sheet.75</title> + <desc>9</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>9</text> </g> + <g id="shape76-216" v:mID="76" v:groupContext="shape" transform="translate(230.508,-143.946)"> + <title>Sheet.76</title> + <path d="M0 363.15 L0 379.8 L41.18 379.8 L41.18 363.15 L0 363.15 L0 363.15 Z" class="st4"/> + </g> + <g id="shape77-218" v:mID="77" v:groupContext="shape" transform="translate(230.508,-143.946)"> + <title>Sheet.77</title> + <path d="M0 363.15 L41.18 363.15 L41.18 379.8 L0 379.8 L0 363.15" class="st5"/> + </g> + <g id="shape78-221" v:mID="78" v:groupContext="shape" transform="translate(233.39,-144.841)"> + <title>Sheet.78</title> + <desc>10</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="7.95203" cy="373.835" width="15.91" height="11.9384"/> + <path d="M15.9 367.87 L0 367.87 L0 379.8 L15.9 379.8 L15.9 367.87" class="st2"/> + <text x="2.42" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>10</text> </g> + <g id="shape79-225" v:mID="79" v:groupContext="shape" transform="translate(263.764,-144.841)"> + <title>Sheet.79</title> + <desc>1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>1</text> </g> + <g id="shape80-229" v:mID="80" v:groupContext="shape" transform="translate(230.508,-127.529)"> + <title>Sheet.80</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st7"/> + </g> + <g id="shape81-231" v:mID="81" v:groupContext="shape" transform="translate(230.508,-127.529)"> + <title>Sheet.81</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape82-234" v:mID="82" v:groupContext="shape" transform="translate(233.39,-128.329)"> + <title>Sheet.82</title> + <desc>11</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="7.95203" cy="373.835" width="15.91" height="11.9384"/> + <path d="M15.9 367.87 L0 367.87 L0 379.8 L15.9 379.8 L15.9 367.87" class="st2"/> + <text x="2.42" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>11</text> </g> + <g id="shape83-238" v:mID="83" v:groupContext="shape" transform="translate(230.508,-110.754)"> + <title>Sheet.83</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st7"/> + </g> + <g id="shape84-240" v:mID="84" v:groupContext="shape" transform="translate(230.508,-110.754)"> + <title>Sheet.84</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape85-243" v:mID="85" v:groupContext="shape" transform="translate(233.39,-111.64)"> + <title>Sheet.85</title> + <desc>12</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="7.95203" cy="373.835" width="15.91" height="11.9384"/> + <path d="M15.9 367.87 L0 367.87 L0 379.8 L15.9 379.8 L15.9 367.87" class="st2"/> + <text x="2.42" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>12</text> </g> + <g id="shape86-247" v:mID="86" v:groupContext="shape" transform="translate(230.508,-94.9362)"> + <title>Sheet.86</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st7"/> + </g> + <g id="shape87-249" v:mID="87" v:groupContext="shape" transform="translate(230.508,-94.9362)"> + <title>Sheet.87</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape88-252" v:mID="88" v:groupContext="shape" transform="translate(233.39,-95.7375)"> + <title>Sheet.88</title> + <desc>…</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="7.30974" cy="373.835" width="14.62" height="11.9384"/> + <path d="M14.62 367.87 L0 367.87 L0 379.8 L14.62 379.8 L14.62 367.87" class="st2"/> + <text x="2.34" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>…</text> </g> + <g id="shape89-256" v:mID="89" v:groupContext="shape" transform="translate(230.508,-78.999)"> + <title>Sheet.89</title> + <path d="M0 363.27 L0 379.8 L41.18 379.8 L41.18 363.27 L0 363.27 L0 363.27 Z" class="st7"/> + </g> + <g id="shape90-258" v:mID="90" v:groupContext="shape" transform="translate(230.508,-78.999)"> + <title>Sheet.90</title> + <path d="M0 363.27 L41.18 363.27 L41.18 379.8 L0 379.8 L0 363.27" class="st5"/> + </g> + <g id="shape91-261" v:mID="91" v:groupContext="shape" transform="translate(233.39,-79.8525)"> + <title>Sheet.91</title> + <desc>255</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="11.1326" cy="373.835" width="22.27" height="11.9384"/> + <path d="M22.27 367.87 L0 367.87 L0 379.8 L22.27 379.8 L22.27 367.87" class="st2"/> + <text x="2.84" y="376.82" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>255</text> </g> + <g id="shape92-265" v:mID="92" v:groupContext="shape" transform="translate(276.219,-250.503)"> + <title>Sheet.92</title> + <path d="M0.33 311.98 L396.81 375.94 L396.48 377.95 L0 313.99 L0.33 311.98 L0.33 311.98 ZM396.12 373.75 L401.68 377.74 + L395.16 379.8 L396.12 373.75 L396.12 373.75 Z" class="st15"/> + </g> + <g id="shape93-267" v:mID="93" v:groupContext="shape" transform="translate(275.859,-178.426)"> + <title>Sheet.93</title> + <path d="M0.57 305.72 L230.93 376.21 L230.33 378.16 L0 307.67 L0.57 305.72 L0.57 305.72 ZM230.57 373.96 L235.52 378.67 + L228.77 379.8 L230.57 373.96 L230.57 373.96 Z" class="st15"/> + </g> + <g id="shape94-269" v:mID="94" v:groupContext="shape" transform="translate(276.279,-151.285)"> + <title>Sheet.94</title> + <path d="M0.21 379.8 L230.12 353.17 L229.88 351.14 L0 377.8 L0.21 379.8 L0.21 379.8 ZM229.34 355.3 L235.07 351.55 L228.65 + 349.25 L229.34 355.3 L229.34 355.3 Z" class="st15"/> + </g> + <g id="shape95-271" v:mID="95" v:groupContext="shape" transform="translate(276.009,-232.679)"> + <title>Sheet.95</title> + <path d="M0.27 327.47 L354.22 375.91 L353.95 377.92 L0 329.48 L0.27 327.47 L0.27 327.47 ZM353.5 373.75 L359.15 377.62 + L352.66 379.8 L353.5 373.75 L353.5 373.75 Z" class="st10"/> + </g> + <g id="shape96-273" v:mID="96" v:groupContext="shape" transform="translate(276.279,-201.134)"> + <title>Sheet.96</title> + <path d="M0.21 379.8 L353.86 348.14 L353.68 346.1 L0 377.77 L0.21 379.8 L0.21 379.8 ZM353.05 350.24 L358.88 346.64 L352.48 + 344.16 L353.05 350.24 L353.05 350.24 Z" class="st15"/> + </g> + <g id="shape97-275" v:mID="97" v:groupContext="shape" transform="translate(346.482,-41.2531)"> + <title>Sheet.97</title> + <path d="M0 314.02 L0 379.8 L41.18 379.8 L41.18 314.02 L0 314.02 L0 314.02 Z" class="st7"/> + </g> + <g id="shape98-277" v:mID="98" v:groupContext="shape" transform="translate(346.482,-41.2531)"> + <title>Sheet.98</title> + <path d="M0 314.02 L41.18 314.02 L41.18 379.8 L0 379.8 L0 314.02" class="st5"/> + </g> + <g id="shape99-280" v:mID="99" v:groupContext="shape" transform="translate(349.371,-91.6514)"> + <title>Sheet.99</title> + <desc>…</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="7.30974" cy="373.835" width="14.62" height="11.9384"/> + <path d="M14.62 367.87 L0 367.87 L0 379.8 L14.62 379.8 L14.62 367.87" class="st2"/> + <text x="2.34" y="376.82" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>…</text> </g> + <g id="shape100-284" v:mID="100" v:groupContext="shape" transform="translate(470.019,-94.337)"> + <title>Sheet.100</title> + <path d="M0 314.02 L0 379.8 L41.18 379.8 L41.18 314.02 L0 314.02 L0 314.02 Z" class="st7"/> + </g> + <g id="shape101-286" v:mID="101" v:groupContext="shape" transform="translate(470.019,-94.337)"> + <title>Sheet.101</title> + <path d="M0 314.02 L41.18 314.02 L41.18 379.8 L0 379.8 L0 314.02" class="st5"/> + </g> + <g id="shape102-289" v:mID="102" v:groupContext="shape" transform="translate(472.925,-144.778)"> + <title>Sheet.102</title> + <desc>5</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>5</text> </g> + <g id="shape103-293" v:mID="103" v:groupContext="shape" transform="translate(511.558,-113.749)"> + <title>Sheet.103</title> + <path d="M0 314.02 L0 379.8 L41.18 379.8 L41.18 314.02 L0 314.02 L0 314.02 Z" class="st4"/> + </g> + <g id="shape104-295" v:mID="104" v:groupContext="shape" transform="translate(511.558,-113.749)"> + <title>Sheet.104</title> + <path d="M0 314.02 L41.18 314.02 L41.18 379.8 L0 379.8 L0 314.02" class="st5"/> + </g> + <g id="shape105-298" v:mID="105" v:groupContext="shape" transform="translate(514.441,-164.138)"> + <title>Sheet.105</title> + <desc>4</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>4</text> </g> + <g id="shape106-302" v:mID="106" v:groupContext="shape" transform="translate(542.148,-164.138)"> + <title>Sheet.106</title> + <desc>2</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>2</text> </g> + <g id="shape107-306" v:mID="107" v:groupContext="shape" transform="translate(542.148,-152.155)"> + <title>Sheet.107</title> + <desc>4</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>4</text> </g> + <g id="shape108-310" v:mID="108" v:groupContext="shape" transform="translate(536.626,-140.172)"> + <title>Sheet.108</title> + <desc>10</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="7.95203" cy="373.835" width="15.91" height="11.9384"/> + <path d="M15.9 367.87 L0 367.87 L0 379.8 L15.9 379.8 L15.9 367.87" class="st2"/> + <text x="2.42" y="376.82" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>10</text> </g> + <g id="shape109-314" v:mID="109" v:groupContext="shape" transform="translate(514.201,-114.441)"> + <title>Sheet.109</title> + <desc>1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>1</text> </g> + <g id="shape110-318" v:mID="110" v:groupContext="shape" transform="translate(519.723,-114.441)"> + <title>Sheet.110</title> + <desc>+4</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="8.11122" cy="373.835" width="16.23" height="11.9384"/> + <path d="M16.22 367.87 L0 367.87 L0 379.8 L16.22 379.8 L16.22 367.87" class="st2"/> + <text x="2.44" y="376.82" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>+4</text> </g> + <g id="shape111-322" v:mID="111" v:groupContext="shape" transform="translate(552.257,-130.525)"> + <title>Sheet.111</title> + <path d="M0 314.02 L0 379.8 L41.18 379.8 L41.18 314.02 L0 314.02 L0 314.02 Z" class="st7"/> + </g> + <g id="shape112-324" v:mID="112" v:groupContext="shape" transform="translate(552.257,-130.525)"> + <title>Sheet.112</title> + <path d="M0 314.02 L41.18 314.02 L41.18 379.8 L0 379.8 L0 314.02" class="st5"/> + </g> + <g id="shape113-327" v:mID="113" v:groupContext="shape" transform="translate(555.203,-180.952)"> + <title>Sheet.113</title> + <desc>3</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>3</text> </g> + <g id="shape114-331" v:mID="114" v:groupContext="shape" transform="translate(634.615,-169.11)"> + <title>Sheet.114</title> + <path d="M0 313.9 L0 379.8 L41.18 379.8 L41.18 313.9 L0 313.9 L0 313.9 Z" class="st4"/> + </g> + <g id="shape115-333" v:mID="115" v:groupContext="shape" transform="translate(634.615,-169.11)"> + <title>Sheet.115</title> + <path d="M0 313.9 L41.18 313.9 L41.18 379.8 L0 379.8 L0 313.9" class="st5"/> + </g> + <g id="shape116-336" v:mID="116" v:groupContext="shape" transform="translate(637.526,-219.595)"> + <title>Sheet.116</title> + <desc>1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>1</text> </g> + <g id="shape117-340" v:mID="117" v:groupContext="shape" transform="translate(665.234,-219.595)"> + <title>Sheet.117</title> + <desc>2</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>2</text> </g> + <g id="shape118-344" v:mID="118" v:groupContext="shape" transform="translate(665.2,-225.489)"> + <title>Sheet.118</title> + <path d="M0 379.32 L0 379.8 L5.52 379.8 L5.52 379.32 L0 379.32 L0 379.32 Z" class="st19"/> + </g> + <g id="shape119-346" v:mID="119" v:groupContext="shape" transform="translate(665.234,-207.612)"> + <title>Sheet.119</title> + <desc>7</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>7</text> </g> + <g id="shape120-350" v:mID="120" v:groupContext="shape" transform="translate(637.286,-169.898)"> + <title>Sheet.120</title> + <desc>5</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>5</text> </g> + <g id="shape121-354" v:mID="121" v:groupContext="shape" transform="translate(642.809,-169.898)"> + <title>Sheet.121</title> + <desc>-</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="3.49545" cy="373.835" width="7" height="11.9384"/> + <path d="M6.99 367.87 L0 367.87 L0 379.8 L6.99 379.8 L6.99 367.87" class="st2"/> + <text x="1.84" y="376.82" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>-</text> </g> + <g id="shape122-358" v:mID="122" v:groupContext="shape" transform="translate(646.17,-169.898)"> + <title>Sheet.122</title> + <desc>3</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>3</text> </g> + <g id="shape123-362" v:mID="123" v:groupContext="shape" transform="translate(676.275,-186.725)"> + <title>Sheet.123</title> + <path d="M0 314.02 L0 379.8 L41.18 379.8 L41.18 314.02 L0 314.02 L0 314.02 Z" class="st4"/> + </g> + <g id="shape124-364" v:mID="124" v:groupContext="shape" transform="translate(676.275,-186.725)"> + <title>Sheet.124</title> + <path d="M0 314.02 L41.18 314.02 L41.18 379.8 L0 379.8 L0 314.02" class="st5"/> + </g> + <g id="shape125-367" v:mID="125" v:groupContext="shape" transform="translate(679.141,-237.17)"> + <title>Sheet.125</title> + <desc>0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0</text> </g> + <g id="shape126-371" v:mID="126" v:groupContext="shape" transform="translate(706.849,-237.17)"> + <title>Sheet.126</title> + <desc>0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0</text> </g> + <g id="shape127-375" v:mID="127" v:groupContext="shape" transform="translate(678.901,-187.474)"> + <title>Sheet.127</title> + <desc>4</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>4</text> </g> + <g id="shape128-379" v:mID="128" v:groupContext="shape" transform="translate(304.943,-21.841)"> + <title>Sheet.128</title> + <path d="M0 314.02 L0 379.8 L41.18 379.8 L41.18 314.02 L0 314.02 L0 314.02 Z" class="st4"/> + </g> + <g id="shape129-381" v:mID="129" v:groupContext="shape" transform="translate(304.943,-21.841)"> + <title>Sheet.129</title> + <path d="M0 314.02 L41.18 314.02 L41.18 379.8 L0 379.8 L0 314.02" class="st5"/> + </g> + <g id="shape130-384" v:mID="130" v:groupContext="shape" transform="translate(307.855,-72.2917)"> + <title>Sheet.130</title> + <desc>64</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="7.95203" cy="373.835" width="15.91" height="11.9384"/> + <path d="M15.9 367.87 L0 367.87 L0 379.8 L15.9 379.8 L15.9 367.87" class="st2"/> + <text x="2.42" y="376.82" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>64</text> </g> + <g id="shape131-388" v:mID="131" v:groupContext="shape" transform="translate(330.041,-72.2917)"> + <title>Sheet.131</title> + <desc>96</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="7.95203" cy="373.835" width="15.91" height="11.9384"/> + <path d="M15.9 367.87 L0 367.87 L0 379.8 L15.9 379.8 L15.9 367.87" class="st2"/> + <text x="2.42" y="376.82" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>96</text> </g> + <g id="shape132-392" v:mID="132" v:groupContext="shape" transform="translate(307.616,-22.5952)"> + <title>Sheet.132</title> + <desc>7</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>7</text> </g> + <g id="shape133-396" v:mID="133" v:groupContext="shape" transform="translate(428.72,-77.4413)"> + <title>Sheet.133</title> + <path d="M0 314.02 L0 379.8 L41.18 379.8 L41.18 314.02 L0 314.02 L0 314.02 Z" class="st4"/> + </g> + <g id="shape134-398" v:mID="134" v:groupContext="shape" transform="translate(428.72,-77.4413)"> + <title>Sheet.134</title> + <path d="M0 314.02 L41.18 314.02 L41.18 379.8 L0 379.8 L0 314.02" class="st5"/> + </g> + <g id="shape135-401" v:mID="135" v:groupContext="shape" transform="translate(431.648,-127.825)"> + <title>Sheet.135</title> + <desc>6</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>6</text> </g> + <g id="shape136-405" v:mID="136" v:groupContext="shape" transform="translate(453.834,-127.825)"> + <title>Sheet.136</title> + <desc>98</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="7.95203" cy="373.835" width="15.91" height="11.9384"/> + <path d="M15.9 367.87 L0 367.87 L0 379.8 L15.9 379.8 L15.9 367.87" class="st2"/> + <text x="2.42" y="376.82" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>98</text> </g> + <g id="shape137-409" v:mID="137" v:groupContext="shape" transform="translate(431.409,-78.1289)"> + <title>Sheet.137</title> + <desc>5</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>5</text> </g> + <g id="shape138-413" v:mID="138" v:groupContext="shape" transform="translate(593.796,-149.818)"> + <title>Sheet.138</title> + <path d="M0 313.9 L0 379.8 L41.18 379.8 L41.18 313.9 L0 313.9 L0 313.9 Z" class="st4"/> + </g> + <g id="shape139-415" v:mID="139" v:groupContext="shape" transform="translate(593.796,-149.818)"> + <title>Sheet.139</title> + <path d="M0 313.9 L41.18 313.9 L41.18 379.8 L0 379.8 L0 313.9" class="st5"/> + </g> + <g id="shape140-418" v:mID="140" v:groupContext="shape" transform="translate(596.718,-200.312)"> + <title>Sheet.140</title> + <desc>2</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>2</text> </g> + <g id="shape141-422" v:mID="141" v:groupContext="shape" transform="translate(618.904,-200.312)"> + <title>Sheet.141</title> + <desc>99</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="7.95203" cy="373.835" width="15.91" height="11.9384"/> + <path d="M15.9 367.87 L0 367.87 L0 379.8 L15.9 379.8 L15.9 367.87" class="st2"/> + <text x="2.42" y="376.82" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>99</text> </g> + <g id="shape142-426" v:mID="142" v:groupContext="shape" transform="translate(596.478,-150.615)"> + <title>Sheet.142</title> + <desc>9</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>9</text> </g> + <g id="shape143-430" v:mID="143" v:groupContext="shape" transform="translate(387.181,-58.0291)"> + <title>Sheet.143</title> + <path d="M0 314.02 L0 379.8 L41.18 379.8 L41.18 314.02 L0 314.02 L0 314.02 Z" class="st4"/> + </g> + <g id="shape144-432" v:mID="144" v:groupContext="shape" transform="translate(387.181,-58.0291)"> + <title>Sheet.144</title> + <path d="M0 314.02 L41.18 314.02 L41.18 379.8 L0 379.8 L0 314.02" class="st5"/> + </g> + <g id="shape145-435" v:mID="145" v:groupContext="shape" transform="translate(390.133,-108.466)"> + <title>Sheet.145</title> + <desc>7</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>7</text> </g> + <g id="shape146-439" v:mID="146" v:groupContext="shape" transform="translate(412.318,-108.466)"> + <title>Sheet.146</title> + <desc>97</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="7.95203" cy="373.835" width="15.91" height="11.9384"/> + <path d="M15.9 367.87 L0 367.87 L0 379.8 L15.9 379.8 L15.9 367.87" class="st2"/> + <text x="2.42" y="376.82" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>97</text> </g> + <g id="shape147-443" v:mID="147" v:groupContext="shape" transform="translate(389.893,-58.7692)"> + <title>Sheet.147</title> + <desc>6</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.77151" cy="373.835" width="9.55" height="11.9384"/> + <path d="M9.54 367.87 L0 367.87 L0 379.8 L9.54 379.8 L9.54 367.87" class="st2"/> + <text x="2.01" y="376.82" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>6</text> </g> + <g id="shape148-447" v:mID="148" v:groupContext="shape" transform="translate(31.8163,-277.674)"> + <title>Sheet.148</title> + <path d="M0 362.83 C0 360.95 1.52 359.43 3.41 359.43 L68.51 359.43 C70.4 359.43 71.91 360.95 71.91 362.83 L71.91 376.41 + C71.91 378.28 70.4 379.8 68.51 379.8 L3.41 379.8 C1.52 379.8 0 378.28 0 376.41 L0 362.83 Z" class="st4"/> + </g> + <g id="shape149-449" v:mID="149" v:groupContext="shape" transform="translate(31.8163,-277.674)"> + <title>Sheet.149</title> + <path d="M0 362.83 C0 360.95 1.52 359.43 3.41 359.43 L68.51 359.43 C70.4 359.43 71.91 360.95 71.91 362.83 L71.91 376.41 + C71.91 378.28 70.4 379.8 68.51 379.8 L3.41 379.8 C1.52 379.8 0 378.28 0 376.41 L0 362.83 Z" class="st21"/> + </g> + <g id="shape150-451" v:mID="150" v:groupContext="shape" transform="translate(36,-278.851)"> + <title>Sheet.150</title> + <desc>Insert key</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="35.613" cy="372.612" width="71.23" height="14.3829"/> + <path d="M71.23 365.42 L0 365.42 L0 379.8 L71.23 379.8 L71.23 365.42" class="st2"/> + <text x="9.64" y="376.21" class="st22" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Insert key </text> </g> + <g id="shape151-455" v:mID="151" v:groupContext="shape" transform="translate(47.7236,-257.004)"> + <title>Sheet.151</title> + <path d="M0 369.44 L9.81 369.44 L9.81 359.07 L29.44 359.07 L29.44 369.44 L39.26 369.44 L19.63 379.8 L0 369.44 Z" + class="st23"/> + </g> + <g id="shape152-457" v:mID="152" v:groupContext="shape" transform="translate(31.8163,-236.094)"> + <title>Sheet.152</title> + <path d="M0 362.73 C0 360.85 1.54 359.31 3.42 359.31 L68.49 359.31 C70.38 359.31 71.91 360.85 71.91 362.73 L71.91 376.39 + C71.91 378.28 70.38 379.8 68.49 379.8 L3.42 379.8 C1.54 379.8 0 378.28 0 376.39 L0 362.73 Z" class="st4"/> + </g> + <g id="shape153-459" v:mID="153" v:groupContext="shape" transform="translate(31.8163,-236.094)"> + <title>Sheet.153</title> + <path d="M0 362.73 C0 360.85 1.54 359.31 3.42 359.31 L68.49 359.31 C70.38 359.31 71.91 360.85 71.91 362.73 L71.91 376.39 + C71.91 378.28 70.38 379.8 68.49 379.8 L3.42 379.8 C1.54 379.8 0 378.28 0 376.39 L0 362.73 Z" class="st21"/> + </g> + <g id="shape154-461" v:mID="154" v:groupContext="shape" transform="translate(54.6845,-237.332)"> + <title>Sheet.154</title> + <desc>hash</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="16.8573" cy="372.612" width="33.72" height="14.3829"/> + <path d="M33.71 365.42 L0 365.42 L0 379.8 L33.71 379.8 L33.71 365.42" class="st2"/> + <text x="3.86" y="376.21" class="st22" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash</text> </g> + <g id="shape155-465" v:mID="155" v:groupContext="shape" transform="translate(23.0522,-195.232)"> + <title>Sheet.155</title> + <path d="M0 363.53 C0 361.73 1.46 360.27 3.26 360.27 L87.15 360.27 C88.95 360.27 90.4 361.73 90.4 363.53 L90.4 376.55 + C90.4 378.35 88.95 379.8 87.15 379.8 L3.26 379.8 C1.46 379.8 0 378.35 0 376.55 L0 363.53 Z" class="st4"/> + </g> + <g id="shape156-467" v:mID="156" v:groupContext="shape" transform="translate(23.0522,-195.232)"> + <title>Sheet.156</title> + <path d="M0 363.53 C0 361.73 1.46 360.27 3.26 360.27 L87.15 360.27 C88.95 360.27 90.4 361.73 90.4 363.53 L90.4 376.55 + C90.4 378.35 88.95 379.8 87.15 379.8 L3.26 379.8 C1.46 379.8 0 378.35 0 376.55 L0 363.53 Z" class="st21"/> + </g> + <g id="shape157-469" v:mID="157" v:groupContext="shape" transform="translate(27,-196.017)"> + <title>Sheet.157</title> + <desc>0x0102ABCD</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="43.6644" cy="372.612" width="87.33" height="14.3829"/> + <path d="M87.33 365.42 L0 365.42 L0 379.8 L87.33 379.8 L87.33 365.42" class="st2"/> + <text x="7.36" y="376.21" class="st22" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0x0102ABCD</text> </g> + <g id="shape158-473" v:mID="158" v:groupContext="shape" transform="translate(47.7236,-214.824)"> + <title>Sheet.158</title> + <path d="M0 369.5 L9.81 369.5 L9.81 359.19 L29.44 359.19 L29.44 369.5 L39.26 369.5 L19.63 379.8 L0 369.5 Z" + class="st23"/> + </g> + <g id="shape159-475" v:mID="159" v:groupContext="shape" transform="translate(49.8539,-181.212)"> + <title>Sheet.159</title> + <path d="M11.89 368.42 C11.89 371.57 11.47 374.11 10.94 374.11 L6.9 374.11 C6.37 374.11 5.94 376.67 5.94 379.8 C5.94 + 376.67 5.52 374.11 5 374.11 L0.95 374.11 C0.43 374.11 0 371.57 0 368.42" class="st24"/> + </g> + <g id="shape160-478" v:mID="160" v:groupContext="shape" transform="translate(64.2606,-180.973)"> + <title>Sheet.160</title> + <path d="M9.54 368.54 C9.54 371.66 9.21 374.17 8.79 374.17 L5.53 374.17 C5.11 374.17 4.77 376.7 4.77 379.8 C4.77 376.7 + 4.43 374.17 4.02 374.17 L0.76 374.17 C0.34 374.17 0 371.66 0 368.54" class="st24"/> + </g> + <g id="shape161-481" v:mID="161" v:groupContext="shape" transform="translate(18.19,-60.9649)"> + <title>Sheet.161</title> + <path d="M0 354.74 C0 351.97 2.25 349.73 5.03 349.73 L10.77 349.73 L30.27 267.14 L26.92 349.73 L59.58 349.73 C62.35 349.73 + 64.59 351.97 64.59 354.74 L64.59 354.74 L64.59 362.26 L64.59 374.8 C64.59 377.57 62.35 379.8 59.58 379.8 + L26.92 379.8 L10.77 379.8 L10.77 379.8 L5.03 379.8 C2.25 379.8 0 377.57 0 374.8 L0 362.26 L0 354.74 L0 354.74 + Z" class="st23"/> + </g> + <g id="shape162-483" v:mID="162" v:groupContext="shape" transform="translate(28.141,-66.9569)"> + <title>Sheet.162</title> + <desc>chunk id</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="27.5794" cy="372.612" width="55.16" height="14.3829"/> + <path d="M55.16 365.42 L0 365.42 L0 379.8 L55.16 379.8 L55.16 365.42" class="st2"/> + <text x="5.26" y="376.21" class="st25" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>chunk id</text> </g> + <g id="shape163-487" v:mID="163" v:groupContext="shape" transform="translate(50.8451,-112.132)"> + <title>Sheet.163</title> + <path d="M0 354.64 C0 351.87 2.27 349.61 5.04 349.61 L10.74 349.61 L16.27 313.66 L26.86 349.61 L59.43 349.61 C62.22 349.61 + 64.47 351.87 64.47 354.64 L64.47 354.64 L64.47 362.19 L64.47 374.77 C64.47 377.56 62.22 379.8 59.43 379.8 + L26.86 379.8 L10.74 379.8 L10.74 379.8 L5.04 379.8 C2.27 379.8 0 377.56 0 374.77 L0 362.19 L0 354.64 L0 + 354.64 Z" class="st23"/> + </g> + <g id="shape164-489" v:mID="164" v:groupContext="shape" transform="translate(68.8168,-118.181)"> + <title>Sheet.164</title> + <desc>bin id</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="18.3881" cy="372.612" width="36.78" height="14.3829"/> + <path d="M36.78 365.42 L0 365.42 L0 379.8 L36.78 379.8 L36.78 365.42" class="st2"/> + <text x="4.06" y="376.21" class="st25" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>bin id</text> </g> + <g id="shape165-493" v:mID="165" v:groupContext="shape" transform="translate(113.454,-225.085)"> + <title>Sheet.165</title> + <path d="M0.01 375.68 L13.23 375.73 L13.22 377.77 L0 377.72 L0.01 375.68 L0.01 375.68 ZM12.22 373.69 L18.33 376.76 L12.2 + 379.8 L12.22 373.69 L12.22 373.69 Z" class="st26"/> + </g> + <g id="shape166-495" v:mID="166" v:groupContext="shape" transform="translate(200.975,-280.969)"> + <title>Sheet.166</title> + <path d="M0 375.73 L20.11 375.73 L20.11 377.77 L0 377.77 L0 375.73 L0 375.73 ZM19.09 373.69 L25.21 376.75 L19.09 379.8 + L19.09 373.69 L19.09 373.69 Z" class="st26"/> + </g> + <g id="shape167-497" v:mID="167" v:groupContext="shape" transform="translate(275.739,-179.745)"> + <title>Sheet.167</title> + <path d="M0.81 274.59 L231.38 376.48 L230.54 378.37 L0 276.48 L0.81 274.59 L0.81 274.59 ZM231.26 374.2 L235.64 379.47 + L228.8 379.8 L231.26 374.2 L231.26 374.2 Z" class="st27"/> + </g> + <g id="shape168-499" v:mID="168" v:groupContext="shape" transform="translate(521.823,-96.8834)"> + <title>Sheet.168</title> + <path d="M127.17 309.02 L127.17 378.79 C127.17 379.35 126.72 379.8 126.15 379.8 L3.06 379.8 C2.52 379.8 2.04 379.35 2.04 + 378.79 L2.04 369.59 L4.08 369.59 L4.08 378.79 L3.06 377.77 L126.15 377.77 L125.13 378.79 L125.13 309.02 + L127.17 309.02 ZM0 370.61 L3.06 364.5 L6.12 370.61 L0 370.61 Z" class="st28"/> + </g> + <g id="shape169-501" v:mID="169" v:groupContext="shape" transform="translate(478.603,-39.7553)"> + <title>Sheet.169</title> + <path d="M0 347.57 C0 344.01 2.91 341.1 6.48 341.1 L237.86 341.1 C241.43 341.1 244.31 344.01 244.31 347.57 L244.31 373.36 + C244.31 376.93 241.43 379.8 237.86 379.8 L6.48 379.8 C2.91 379.8 0 376.93 0 373.36 L0 347.57 Z" + class="st23"/> + </g> + <g id="shape170-503" v:mID="170" v:groupContext="shape" transform="translate(487.717,-45.5378)"> + <title>Sheet.170</title> + <desc>Move bin from group 1 to 4</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="126.387" cy="369.018" width="252.78" height="21.5726"/> + <path d="M252.77 358.23 L0 358.23 L0 379.8 L252.77 379.8 L252.77 358.23" class="st2"/> + <text x="18.98" y="374.41" class="st29" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Move bin from group 1 to 4</text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i2.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i2.svg new file mode 100644 index 000000000..a5f43f949 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i2.svg @@ -0,0 +1,280 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export efd_i2.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="2.85156in" height="2.98777in" + viewBox="0 0 205.313 215.12" xml:space="preserve" color-interpolation-filters="sRGB" class="st18"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st3 {fill:#deebf6;stroke:#c7c8c8;stroke-width:0.25} + .st4 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st5 {fill:#ff0000;stroke:#c7c8c8;stroke-width:0.25} + .st6 {fill:none;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st7 {fill:none;stroke:#0070c0;stroke-width:1.5} + .st8 {marker-end:url(#mrkr5-91);stroke:#0070c0;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5} + .st9 {fill:#0070c0;fill-opacity:1;stroke:#0070c0;stroke-opacity:1;stroke-width:0.37313432835821} + .st10 {fill:none;stroke:none;stroke-width:0.25} + .st11 {fill:#ff0000;font-family:Calibri;font-size:1.00001em;font-weight:bold} + .st12 {font-size:1em} + .st13 {marker-end:url(#mrkr5-101);stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st14 {fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1;stroke-width:0.28409090909091} + .st15 {fill:#5b9bd5;font-family:Calibri;font-size:1.00001em;font-weight:bold} + .st16 {marker-end:url(#mrkr5-110);stroke:#41719c;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st17 {fill:#41719c;fill-opacity:1;stroke:#41719c;stroke-opacity:1;stroke-width:0.28409090909091} + .st18 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-91" class="st9" v:arrowType="5" v:arrowSize="2" v:setback="4.45" refX="-4.45" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-2.68,-2.68) "/> + </marker> + <marker id="mrkr5-101" class="st14" v:arrowType="5" v:arrowSize="2" v:setback="6.16" refX="-6.16" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-3.52,-3.52) "/> + </marker> + <marker id="mrkr5-110" class="st17" v:arrowType="5" v:arrowSize="2" v:setback="6.16" refX="-6.16" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-3.52,-3.52) "/> + </marker> + </defs> + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape2-1" v:mID="2" v:groupContext="shape" transform="translate(24.4044,-42.7174)"> + <title>Circle</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow2-2" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 138.62 A76.5 76.5 0 0 1 153 138.62 A76.5 76.5 0 1 1 0 138.62 Z" class="st2"/> + </g> + <path d="M0 138.62 A76.5 76.5 0 0 1 153 138.62 A76.5 76.5 0 1 1 0 138.62 Z" class="st3"/> + </g> + <g id="shape3-6" v:mID="3" v:groupContext="shape" transform="translate(24.4044,-144.53)"> + <title>Circle.3</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow3-7" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st4"/> + </g> + <g id="shape4-11" v:mID="4" v:groupContext="shape" transform="translate(21.0294,-102.342)"> + <title>Circle.4</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow4-12" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st4"/> + </g> + <g id="shape5-16" v:mID="5" v:groupContext="shape" transform="translate(69.4044,-183.342)"> + <title>Circle.5</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow5-17" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st4"/> + </g> + <g id="shape6-21" v:mID="6" v:groupContext="shape" transform="translate(117.217,-183.342)"> + <title>Circle.6</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow6-22" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st5"/> + </g> + <g id="shape7-26" v:mID="7" v:groupContext="shape" transform="translate(171.217,-104.03)"> + <title>Circle.7</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow7-27" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st5"/> + </g> + <g id="shape8-31" v:mID="8" v:groupContext="shape" transform="translate(109.904,-38.2174)"> + <title>Circle.8</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow8-32" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st5"/> + </g> + <g id="shape9-36" v:mID="9" v:groupContext="shape" transform="translate(21.0294,-124.842)"> + <title>Circle.9</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow9-37" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st5"/> + </g> + <g id="shape10-41" v:mID="10" v:groupContext="shape" transform="translate(147.029,-168.717)"> + <title>Circle.10</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow10-42" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st4"/> + </g> + <g id="shape11-46" v:mID="11" v:groupContext="shape" transform="translate(138.029,-48.3424)"> + <title>Circle.11</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow11-47" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st4"/> + </g> + <g id="shape12-51" v:mID="12" v:groupContext="shape" transform="translate(160.529,-74.2174)"> + <title>Circle.12</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow12-52" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st4"/> + </g> + <g id="shape13-56" v:mID="13" v:groupContext="shape" transform="translate(40.7169,-57.3424)"> + <title>Circle.13</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow13-57" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st4"/> + </g> + <g id="shape14-61" v:mID="14" v:groupContext="shape" transform="translate(42.4044,-168.717)"> + <title>Circle.14</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow14-62" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st4"/> + </g> + <g id="shape15-66" v:mID="15" v:groupContext="shape" transform="translate(66.0294,-42.7174)"> + <title>Circle.15</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow15-67" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st4"/> + </g> + <g id="shape16-71" v:mID="16" v:groupContext="shape" transform="translate(25.5294,-79.8424)"> + <title>Circle.16</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow16-72" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st4"/> + </g> + <g id="shape17-76" v:mID="17" v:groupContext="shape" transform="translate(165.029,-143.405)"> + <title>Circle.17</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow17-77" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st2"/> + </g> + <path d="M0 208.93 A6.1875 6.1875 0 1 1 12.37 208.93 A6.1875 6.1875 0 0 1 0 208.93 Z" class="st4"/> + </g> + <g id="shape18-81" v:mID="18" v:groupContext="shape" transform="translate(276.618,4.50201) rotate(45)"> + <title>Ellipse</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow18-82" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,1.63935,1.1506)" class="st1"> + <path d="M0 187.01 A14.7383 28.1086 0 1 1 29.48 187.01 A14.7383 28.1086 0 1 1 0 187.01 Z" class="st6"/> + </g> + <path d="M0 187.01 A14.7383 28.1086 0 1 1 29.48 187.01 A14.7383 28.1086 0 1 1 0 187.01 Z" class="st7"/> + </g> + <g id="shape19-86" v:mID="19" v:groupContext="shape" transform="translate(251.273,355.436) rotate(156.038)"> + <title>Sheet.19</title> + <path d="M-0 215.12 A73.4538 31.2572 85.43 0 1 40.92 208.96 L41.1 209.27" class="st8"/> + </g> + <g id="shape20-92" v:mID="20" v:groupContext="shape" transform="translate(62.705,-78.7174)"> + <title>Sheet.20</title> + <desc>Target Hashed Value</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="42.6994" cy="203.87" width="85.4" height="22.5"/> + <rect x="0" y="192.62" width="85.3987" height="22.5" class="st10"/> + <text x="6.73" y="200.27" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Target Hashed <tspan + x="28.48" dy="1.2em" class="st12">Value</tspan></text> </g> + <g id="shape21-96" v:mID="21" v:groupContext="shape" transform="translate(314.101,88.728) rotate(75.9638)"> + <title>Sheet.21</title> + <path d="M0 215.12 L16.92 215.12" class="st13"/> + </g> + <g id="shape23-102" v:mID="23" v:groupContext="shape" transform="translate(60.4044,-138.342)"> + <title>Sheet.23</title> + <desc>Keys</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="24.75" cy="203.87" width="49.5" height="22.5"/> + <rect x="0" y="192.62" width="49.5" height="22.5" class="st10"/> + <text x="13.21" y="207.47" class="st15" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Keys</text> </g> + <g id="shape24-105" v:mID="24" v:groupContext="shape" transform="translate(-125.293,114.034) rotate(-104.574)"> + <title>Sheet.24</title> + <path d="M0 215.12 L22.9 215.12" class="st16"/> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i3.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i3.svg new file mode 100644 index 000000000..ae2290372 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i3.svg @@ -0,0 +1,634 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export efd_i3.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="6.56036in" height="5.44284in" + viewBox="0 0 472.346 391.884" xml:space="preserve" color-interpolation-filters="sRGB" class="st22"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st3 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st5 {marker-end:url(#mrkr5-24);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st6 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.28409090909091} + .st7 {fill:none;stroke:#2e75b5;stroke-width:1} + .st8 {fill:#5b9bd5;font-family:Calibri;font-size:1.00001em} + .st9 {font-size:1em} + .st10 {fill:none;stroke:none;stroke-width:1} + .st11 {fill:#feffff;font-family:Calibri;font-size:1.00001em;font-weight:bold} + .st12 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25} + .st13 {fill:#4f87bb;stroke:#40709c;stroke-width:0.75} + .st14 {fill:#feffff;font-family:Calibri;font-size:0.75em} + .st15 {fill:none;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st16 {fill:none;stroke:#2e75b5;stroke-width:2.25} + .st17 {stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st18 {fill:#305497;stroke:#2e75b5;stroke-width:1} + .st19 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:none} + .st20 {fill:#92d050;fill-opacity:0.3;stroke:none;stroke-width:0.25} + .st21 {fill:#feffff;font-family:Calibri;font-size:1.16666em} + .st22 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-24" class="st6" v:arrowType="5" v:arrowSize="2" v:setback="6.16" refX="-6.16" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-3.52,-3.52) "/> + </marker> + </defs> + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <v:layer v:name="Connector" v:index="0"/> + <g id="shape2-1" v:mID="2" v:groupContext="shape" transform="translate(111.25,-354.482)"> + <title>Rectangle</title> + <desc>Packet Header</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="42.75" cy="382.884" width="85.5" height="18"/> + <g id="shadow2-2" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="85.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="85.5" height="18" class="st3"/> + <text x="13.24" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Packet Header</text> </g> + <g id="shape3-7" v:mID="3" v:groupContext="shape" transform="translate(192.25,-354.482)"> + <title>Rectangle.3</title> + <desc>Payload</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="382.884" width="108" height="18"/> + <g id="shadow3-8" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="108" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="108" height="18" class="st3"/> + <text x="37.95" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Payload</text> </g> + <g id="shape4-13" v:mID="4" v:groupContext="shape" transform="translate(136,-311.232)"> + <title>Rectangle.4</title> + <desc>Flow Key</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="27" cy="382.884" width="54" height="18"/> + <g id="shadow4-14" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="54" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="54" height="18" class="st3"/> + <text x="8.87" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Flow Key</text> </g> + <g id="shape5-19" v:mID="5" v:groupContext="shape" transform="translate(465.501,-160.057) rotate(59.7436)"> + <title>Sheet.5</title> + <path d="M0 391.88 L25.1 391.88" class="st5"/> + </g> + <g id="shape8-25" v:mID="8" v:groupContext="shape" transform="translate(219.25,-320.169)"> + <title>Sheet.8</title> + <desc>Fields of the packet are used to form a flow Key</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="67.5" cy="377.822" width="135" height="28.125"/> + <rect x="0" y="363.759" width="135" height="28.125" class="st7"/> + <text x="10.7" y="374.22" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Fields of the packet are <tspan + x="9.67" dy="1.2em" class="st9">used to form a flow Key</tspan></text> </g> + <g id="group13-29" transform="translate(120.25,-266.897)" v:mID="13" v:groupContext="group"> + <title>Sheet.13</title> + <g id="shape11-30" v:mID="11" v:groupContext="shape" transform="translate(85.5,751.143) rotate(180)"> + <title>Trapezoid</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow11-31" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,-0.345598,-1.97279)" class="st1"> + <path d="M0 391.88 L85.5 391.88 L60.19 359.26 L25.31 359.26 L0 391.88 Z" class="st2"/> + </g> + <path d="M0 391.88 L85.5 391.88 L60.19 359.26 L25.31 359.26 L0 391.88 Z" class="st3"/> + </g> + <g id="shape12-35" v:mID="12" v:groupContext="shape" transform="translate(13.5,-6.525)"> + <title>Sheet.12</title> + <desc>H(..)</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="27" cy="381.689" width="54" height="20.3906"/> + <rect x="0" y="371.494" width="54" height="20.3906" class="st10"/> + <text x="16.27" y="385.29" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>H(..)</text> </g> + </g> + <g id="shape14-38" v:mID="14" v:groupContext="shape" transform="translate(-229.872,96.3648) rotate(-90.0429)"> + <title>Simple Arrow</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="ArrowType" v:prompt="" v:val="VT0(2):26"/> + </v:userDefs> + <g id="shadow14-39" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,-1.97305,0.344122)" class="st1"> + <path d="M0 391.88 L10.18 387.38 L10.18 389.63 L16.71 389.63 L16.71 391.88 L16.71 394.13 L10.18 394.13 L10.18 396.38 + L0 391.88 Z" class="st12"/> + </g> + <path d="M0 391.88 L10.18 387.38 L10.18 389.63 L16.71 389.63 L16.71 391.88 L16.71 394.13 L10.18 394.13 L10.18 396.38 + L0 391.88 Z" class="st13"/> + </g> + <g id="shape15-43" v:mID="15" v:groupContext="shape" transform="translate(212.5,-271.46)"> + <title>Sheet.15</title> + <desc>Hash function is used to create a flow table index</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="67.5" cy="377.822" width="135" height="28.125"/> + <rect x="0" y="363.759" width="135" height="28.125" class="st7"/> + <text x="9.05" y="374.22" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Hash function is used to <tspan + x="7.39" dy="1.2em" class="st9">create a flow table index</tspan></text> </g> + <g id="shape58-47" v:mID="58" v:groupContext="shape" transform="translate(199,-221.397)"> + <title>Rectangle.58</title> + <desc>Key 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="382.884" width="31.5" height="18"/> + <g id="shadow58-48" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + <text x="4.74" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key 1</text> </g> + <g id="shape59-53" v:mID="59" v:groupContext="shape" transform="translate(232.75,-221.397)"> + <title>Rectangle.59</title> + <desc>Action 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="382.884" width="42.75" height="18"/> + <g id="shadow59-54" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="42.75" height="18" class="st3"/> + <text x="4.62" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action 1</text> </g> + <g id="shape60-59" v:mID="60" v:groupContext="shape" transform="translate(280,-221.397)"> + <title>Rectangle.60</title> + <desc>Key 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="382.884" width="31.5" height="18"/> + <g id="shadow60-60" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + <text x="4.74" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key 2</text> </g> + <g id="shape61-65" v:mID="61" v:groupContext="shape" transform="translate(313.75,-221.397)"> + <title>Rectangle.61</title> + <desc>Action 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="382.884" width="42.75" height="18"/> + <g id="shadow61-66" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="42.75" height="18" class="st3"/> + <text x="4.62" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action 2</text> </g> + <g id="shape62-71" v:mID="62" v:groupContext="shape" transform="translate(361,-221.397)"> + <title>Rectangle.62</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow62-72" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + </g> + <g id="shape63-76" v:mID="63" v:groupContext="shape" transform="translate(394.75,-221.397)"> + <title>Rectangle.63</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow63-77" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="42.75" height="18" class="st3"/> + </g> + <g id="shape64-81" v:mID="64" v:groupContext="shape" transform="translate(199,-198.897)"> + <title>Rectangle.64</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow64-82" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + </g> + <g id="shape65-86" v:mID="65" v:groupContext="shape" transform="translate(232.75,-198.897)"> + <title>Rectangle.65</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow65-87" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="42.75" height="18" class="st3"/> + </g> + <g id="shape66-91" v:mID="66" v:groupContext="shape" transform="translate(280,-198.897)"> + <title>Rectangle.66</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow66-92" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + </g> + <g id="shape67-96" v:mID="67" v:groupContext="shape" transform="translate(313.75,-198.897)"> + <title>Rectangle.67</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow67-97" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="42.75" height="18" class="st3"/> + </g> + <g id="shape68-101" v:mID="68" v:groupContext="shape" transform="translate(361,-198.897)"> + <title>Rectangle.68</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow68-102" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + </g> + <g id="shape69-106" v:mID="69" v:groupContext="shape" transform="translate(394.75,-198.897)"> + <title>Rectangle.69</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow69-107" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="42.75" height="18" class="st3"/> + </g> + <g id="shape70-111" v:mID="70" v:groupContext="shape" transform="translate(199,-162.897)"> + <title>Rectangle.70</title> + <desc>Key x</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="382.884" width="31.5" height="18"/> + <g id="shadow70-112" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + <text x="5.11" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key x</text> </g> + <g id="shape71-117" v:mID="71" v:groupContext="shape" transform="translate(232.75,-162.897)"> + <title>Rectangle.71</title> + <desc>Action x</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="382.884" width="42.75" height="18"/> + <g id="shadow71-118" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="42.75" height="18" class="st3"/> + <text x="4.99" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action x</text> </g> + <g id="shape72-123" v:mID="72" v:groupContext="shape" transform="translate(280,-162.897)"> + <title>Rectangle.72</title> + <desc>Key y</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="382.884" width="31.5" height="18"/> + <g id="shadow72-124" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + <text x="5.01" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key y</text> </g> + <g id="shape73-129" v:mID="73" v:groupContext="shape" transform="translate(313.75,-162.897)"> + <title>Rectangle.73</title> + <desc>Action y</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="382.884" width="42.75" height="18"/> + <g id="shadow73-130" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="42.75" height="18" class="st3"/> + <text x="4.89" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action y</text> </g> + <g id="shape74-135" v:mID="74" v:groupContext="shape" transform="translate(361,-162.897)"> + <title>Rectangle.74</title> + <desc>Key z</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="382.884" width="31.5" height="18"/> + <g id="shadow74-136" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + <text x="5.3" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key z</text> </g> + <g id="shape75-141" v:mID="75" v:groupContext="shape" transform="translate(394.75,-162.897)"> + <title>Rectangle.75</title> + <desc>Action z</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="382.884" width="42.75" height="18"/> + <g id="shadow75-142" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="42.75" height="18" class="st3"/> + <text x="5.18" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action z</text> </g> + <g id="shape76-147" v:mID="76" v:groupContext="shape" transform="translate(199,-126.397)"> + <title>Rectangle.76</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow76-148" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + </g> + <g id="shape77-152" v:mID="77" v:groupContext="shape" transform="translate(232.75,-126.397)"> + <title>Rectangle.77</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow77-153" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="42.75" height="18" class="st3"/> + </g> + <g id="shape78-157" v:mID="78" v:groupContext="shape" transform="translate(280,-126.397)"> + <title>Rectangle.78</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow78-158" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + </g> + <g id="shape79-162" v:mID="79" v:groupContext="shape" transform="translate(313.75,-126.397)"> + <title>Rectangle.79</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow79-163" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="42.75" height="18" class="st3"/> + </g> + <g id="shape80-167" v:mID="80" v:groupContext="shape" transform="translate(361,-126.397)"> + <title>Rectangle.80</title> + <desc>Key N</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="382.884" width="31.5" height="18"/> + <g id="shadow80-168" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + <text x="5.21" y="385.58" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key N</text> </g> + <g id="shape81-173" v:mID="81" v:groupContext="shape" transform="translate(394.75,-126.397)"> + <title>Rectangle.81</title> + <desc>Action N</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="382.884" width="42.75" height="18"/> + <g id="shadow81-174" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="42.75" height="18" class="st3"/> + <text x="5.67" y="385.58" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action N</text> </g> + <g id="shape82-179" v:mID="82" v:groupContext="shape" transform="translate(196.75,-117.397)"> + <title>Rectangle.82</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow82-180" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="256.384" width="245.25" height="135.5" class="st15"/> + </g> + <rect x="0" y="256.384" width="245.25" height="135.5" class="st16"/> + </g> + <g id="shape83-184" v:mID="83" v:groupContext="shape" transform="translate(554.884,123.862) rotate(90)"> + <title>Sheet.83</title> + <path d="M0 391.88 L99 391.88" class="st17"/> + </g> + <g id="shape84-187" v:mID="84" v:groupContext="shape" transform="translate(208,-248.397)"> + <title>Sheet.84</title> + <desc>Load Balancing Flow Table</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="91.75" cy="386.259" width="183.5" height="11.25"/> + <rect x="0" y="380.634" width="183.5" height="11.25" class="st18"/> + <text x="26.14" y="389.86" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Load Balancing Flow Table</text> </g> + <g id="shape85-190" v:mID="85" v:groupContext="shape" transform="translate(190,-157.835)"> + <title>Rectangle.85</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow85-191" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="363.759" width="261" height="28.125" class="st19"/> + </g> + <rect x="0" y="363.759" width="261" height="28.125" class="st20"/> + </g> + <g id="shape86-195" v:mID="86" v:groupContext="shape" transform="translate(163,-169.022)"> + <title>Sheet.86</title> + <path d="M0 391.88 L18.76 391.88" class="st5"/> + </g> + <g id="shape87-200" v:mID="87" v:groupContext="shape" transform="translate(19,-198.107)"> + <title>Sheet.87</title> + <desc>Hash value used to index Flow table</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="67.5" cy="377.822" width="135" height="28.125"/> + <rect x="0" y="363.759" width="135" height="28.125" class="st7"/> + <text x="6.79" y="374.22" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Hash value used to index <tspan + x="42.16" dy="1.2em" class="st9">Flow table</tspan></text> </g> + <g id="shape88-204" v:mID="88" v:groupContext="shape" transform="translate(551.381,21.2928) rotate(87.9001)"> + <title>Sheet.88</title> + <path d="M0 391.88 L20.86 391.88" class="st5"/> + </g> + <g id="shape89-209" v:mID="89" v:groupContext="shape" transform="translate(494.785,297.309) rotate(131.987)"> + <title>Sheet.89</title> + <path d="M0 391.88 L30.84 391.88" class="st5"/> + </g> + <g id="shape90-214" v:mID="90" v:groupContext="shape" transform="translate(228.25,-92.5847)"> + <title>Rectangle.90</title> + <desc>Key x</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="382.884" width="31.5" height="18"/> + <g id="shadow90-215" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + <text x="5.11" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key x</text> </g> + <g id="shape91-220" v:mID="91" v:groupContext="shape" transform="translate(340.75,-92.5847)"> + <title>Rectangle.91</title> + <desc>Key z</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="382.884" width="31.5" height="18"/> + <g id="shadow91-221" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + <text x="5.3" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key z</text> </g> + <g id="group96-226" transform="translate(253,-51.4597)" v:mID="96" v:groupContext="group"> + <title>Sheet.96</title> + <g id="shape97-227" v:mID="97" v:groupContext="shape" transform="translate(85.5,751.143) rotate(180)"> + <title>Trapezoid</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow97-228" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,-0.345598,-1.97279)" class="st1"> + <path d="M0 391.88 L85.5 391.88 L60.19 359.26 L25.31 359.26 L0 391.88 Z" class="st2"/> + </g> + <path d="M0 391.88 L85.5 391.88 L60.19 359.26 L25.31 359.26 L0 391.88 Z" class="st3"/> + </g> + <g id="shape98-232" v:mID="98" v:groupContext="shape" transform="translate(13.5,-6.525)"> + <title>Sheet.98</title> + <desc>Match</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="27" cy="381.689" width="54" height="20.3906"/> + <rect x="0" y="371.494" width="54" height="20.3906" class="st10"/> + <text x="10.98" y="385.29" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Match</text> </g> + </g> + <g id="shape99-235" v:mID="99" v:groupContext="shape" transform="translate(532.137,0.00916548) rotate(54.6508)"> + <title>Sheet.99</title> + <path d="M0 391.88 L93.23 391.88" class="st5"/> + </g> + <g id="shape100-240" v:mID="100" v:groupContext="shape" transform="translate(683.134,224.487) rotate(90)"> + <title>Sheet.100</title> + <path d="M0 391.88 L77.15 391.88" class="st5"/> + </g> + <g id="shape101-245" v:mID="101" v:groupContext="shape" transform="translate(692.213,476.024) rotate(129.078)"> + <title>Sheet.101</title> + <path d="M0 391.88 L95.37 391.88" class="st5"/> + </g> + <g id="shape102-250" v:mID="102" v:groupContext="shape" transform="translate(293.5,-97.0847)"> + <title>Rectangle.102</title> + <desc>Key y</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="382.884" width="31.5" height="18"/> + <g id="shadow102-251" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="31.5" height="18" class="st3"/> + <text x="5.01" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key y</text> </g> + <g id="shape103-256" v:mID="103" v:groupContext="shape" transform="translate(169.75,-55.9597)"> + <title>Rectangle.103</title> + <desc>Flow Key</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="27" cy="382.884" width="54" height="18"/> + <g id="shadow103-257" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="54" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="54" height="18" class="st3"/> + <text x="8.87" y="385.88" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Flow Key</text> </g> + <g id="shape104-262" v:mID="104" v:groupContext="shape" transform="translate(226,-64.9597)"> + <title>Sheet.104</title> + <path d="M0 391.88 L34.34 391.88" class="st5"/> + </g> + <g id="shape105-267" v:mID="105" v:groupContext="shape" transform="translate(54,-82.4597)"> + <title>Sheet.105</title> + <desc>Retrieved keys are matched with input key</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="67.5" cy="377.822" width="135" height="28.125"/> + <rect x="0" y="363.759" width="135" height="28.125" class="st7"/> + <text x="22.51" y="374.22" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Retrieved keys are <tspan + x="9.83" dy="1.2em" class="st9">matched with input key</tspan></text> </g> + <g id="shape106-271" v:mID="106" v:groupContext="shape" transform="translate(271,-23.9597)"> + <title>Rectangle.106</title> + <desc>Action</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="27" cy="382.884" width="54" height="18"/> + <g id="shadow106-272" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="373.884" width="54" height="18" class="st2"/> + </g> + <rect x="0" y="373.884" width="54" height="18" class="st3"/> + <text x="8.67" y="387.08" class="st21" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action</text> </g> + <g id="shape111-277" v:mID="111" v:groupContext="shape" transform="translate(-94.8716,350.902) rotate(-90.0429)"> + <title>Simple Arrow.111</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="ArrowType" v:prompt="" v:val="VT0(2):26"/> + </v:userDefs> + <g id="shadow111-278" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,-1.97305,0.344122)" class="st1"> + <path d="M0 391.88 L10.18 387.38 L10.18 389.63 L16.71 389.63 L16.71 391.88 L16.71 394.13 L10.18 394.13 L10.18 396.38 + L0 391.88 Z" class="st12"/> + </g> + <path d="M0 391.88 L10.18 387.38 L10.18 389.63 L16.71 389.63 L16.71 391.88 L16.71 394.13 L10.18 394.13 L10.18 396.38 + L0 391.88 Z" class="st13"/> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i4.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i4.svg new file mode 100644 index 000000000..5be5ccd77 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i4.svg @@ -0,0 +1,203 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export efd_i4.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="2.78993in" height="1.78151in" + viewBox="0 0 200.875 128.269" xml:space="preserve" color-interpolation-filters="sRGB" class="st19"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:none;stroke:none;stroke-width:0.25} + .st2 {fill:#5b9bd5;font-family:Calibri;font-size:0.75em} + .st3 {font-size:1em} + .st4 {fill:#5b9bd5;font-family:Calibri;font-size:0.75em;font-weight:bold} + .st5 {fill:#deebf6;stroke:none;stroke-width:0.25} + .st6 {stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st7 {stroke:#5b9bd5;stroke-dasharray:0.75,1.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st8 {fill:#ff0000;font-size:1em} + .st9 {baseline-shift:-28.8834%;font-size:0.577667em} + .st10 {fill:#ff0000;font-family:Calibri;font-size:0.75em} + .st11 {fill:#5b9bd5;font-size:1em} + .st12 {visibility:visible} + .st13 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25} + .st14 {fill:url(#grad0-73);stroke:#40709c;stroke-width:0.75} + .st15 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st16 {fill:#00fefe;font-size:1em} + .st17 {fill:#00b050} + .st18 {stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st19 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Patterns_And_Gradients"> + <linearGradient id="grad0-73" x1="0" y1="0" x2="1" y2="0" gradientTransform="rotate(250 0.5 0.5)"> + <stop offset="0" stop-color="#4f87bb" stop-opacity="1"/> + <stop offset="0.48" stop-color="#4f87bb" stop-opacity="1"/> + <stop offset="0.82" stop-color="#5b9bd5" stop-opacity="1"/> + </linearGradient> + </defs> + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape2-1" v:mID="2" v:groupContext="shape" transform="translate(18.25,-59.3478)"> + <title>Sheet.2</title> + <desc>Key 1 Key 2 ... Key 28</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="18" cy="121.519" width="36" height="13.5"/> + <rect x="0" y="114.769" width="36" height="13.5" class="st1"/> + <text x="8.09" y="108.02" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key 1<v:newlineChar/><tspan + x="8.09" dy="1.2em" class="st3">Key </tspan>2<v:newlineChar/><tspan x="14.59" dy="1.2em" class="st3">...<v:newlineChar/></tspan><tspan + x="5.81" dy="1.2em" class="st3">Key </tspan>28</text> </g> + <g id="shape9-7" v:mID="9" v:groupContext="shape" transform="translate(52,-91.9728)"> + <title>Sheet.9</title> + <desc>Target Value</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="17.4375" cy="122.644" width="34.88" height="11.25"/> + <rect x="0" y="117.019" width="34.875" height="11.25" class="st1"/> + <text x="5.43" y="119.94" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Target <tspan x="6.77" + dy="1.2em" class="st3">Value</tspan></text> </g> + <g id="shape11-11" v:mID="11" v:groupContext="shape" transform="translate(52,-42.4728)"> + <title>Sheet.11</title> + <desc>0 1 0</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="17.4375" cy="105.769" width="34.88" height="45"/> + <rect x="0" y="83.2689" width="34.875" height="45" class="st5"/> + <text x="15.16" y="92.27" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0<v:newlineChar/><tspan + x="15.16" dy="1.2em" class="st3">1<v:newlineChar/><v:newlineChar/></tspan><tspan x="15.16" dy="2.4em" + class="st3">0</tspan></text> </g> + <g id="shape8-16" v:mID="8" v:groupContext="shape" transform="translate(180.269,21.6711) rotate(90)"> + <title>Sheet.8</title> + <path d="M0 128.27 L69.75 128.27" class="st6"/> + </g> + <g id="shape10-19" v:mID="10" v:groupContext="shape" transform="translate(215.144,21.6711) rotate(90)"> + <title>Sheet.10</title> + <path d="M0 128.27 L69.75 128.27" class="st6"/> + </g> + <g id="shape4-22" v:mID="4" v:groupContext="shape" transform="translate(22.75,-77.3478)"> + <title>Sheet.4</title> + <path d="M0 128.27 L157.5 128.27" class="st7"/> + </g> + <g id="shape5-25" v:mID="5" v:groupContext="shape" transform="translate(23.875,-66.0978)"> + <title>Sheet.5</title> + <path d="M0 128.27 L158.62 128.27" class="st7"/> + </g> + <g id="shape6-28" v:mID="6" v:groupContext="shape" transform="translate(22.75,-54.8478)"> + <title>Sheet.6</title> + <path d="M0 128.27 L159.75 128.27" class="st7"/> + </g> + <g id="shape7-31" v:mID="7" v:groupContext="shape" transform="translate(22.75,-87.4728)"> + <title>Sheet.7</title> + <path d="M0 128.27 L155.25 128.27" class="st6"/> + </g> + <g id="shape12-34" v:mID="12" v:groupContext="shape" transform="translate(91.9375,-42.4728)"> + <title>Sheet.12</title> + <desc>0 0 0</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="8.4375" cy="105.769" width="16.88" height="45"/> + <rect x="0" y="83.2689" width="16.875" height="45" class="st1"/> + <text x="6.16" y="92.27" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0<v:newlineChar/><tspan + x="6.16" dy="1.2em" class="st8">0<v:newlineChar/><v:newlineChar/></tspan><tspan x="6.16" dy="2.4em" + class="st3">0</tspan></text> </g> + <g id="shape26-39" v:mID="26" v:groupContext="shape" transform="translate(86.875,-88.5978)"> + <title>Sheet.26</title> + <desc>H1(x)</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="14.0625" cy="122.644" width="28.13" height="11.25"/> + <rect x="0" y="117.019" width="28.125" height="11.25" class="st1"/> + <text x="5.03" y="125.34" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>H<tspan dy="-0.284em" + class="st9" v:baseFontSize="8">1</tspan><tspan dy="0.164em" class="st3">(</tspan>x)</text> </g> + <g id="shape27-44" v:mID="27" v:groupContext="shape" transform="translate(115,-42.4728)"> + <title>Sheet.27</title> + <desc>1 1 0</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="8.4375" cy="105.769" width="16.88" height="45"/> + <rect x="0" y="83.2689" width="16.875" height="45" class="st1"/> + <text x="6.16" y="92.27" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>1<v:newlineChar/><tspan + x="6.16" dy="1.2em" class="st11">1<v:newlineChar/><v:newlineChar/></tspan><tspan x="6.16" dy="2.4em" + class="st11">0</tspan></text> </g> + <g id="shape28-49" v:mID="28" v:groupContext="shape" transform="translate(109.938,-88.5978)"> + <title>Sheet.28</title> + <desc>H2(x)</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="14.0625" cy="122.644" width="28.13" height="11.25"/> + <rect x="0" y="117.019" width="28.125" height="11.25" class="st1"/> + <text x="5.03" y="125.34" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>H<tspan dy="-0.284em" + class="st9" v:baseFontSize="8">2</tspan><tspan dy="0.164em" class="st3">(</tspan>x)</text> </g> + <g id="shape29-54" v:mID="29" v:groupContext="shape" transform="translate(155.5,-42.4728)"> + <title>Sheet.29</title> + <desc>0 1 0</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="8.4375" cy="105.769" width="16.88" height="45"/> + <rect x="0" y="83.2689" width="16.875" height="45" class="st1"/> + <text x="6.16" y="92.27" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0<v:newlineChar/><tspan + x="6.16" dy="1.2em" class="st3">1<v:newlineChar/><v:newlineChar/></tspan><tspan x="6.16" dy="2.4em" + class="st3">0</tspan></text> </g> + <g id="shape30-59" v:mID="30" v:groupContext="shape" transform="translate(150.438,-88.5978)"> + <title>Sheet.30</title> + <desc>Hm(x)</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="14.0625" cy="122.644" width="28.13" height="11.25"/> + <rect x="0" y="117.019" width="28.125" height="11.25" class="st1"/> + <text x="4.24" y="125.34" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>H<tspan dy="-0.284em" + class="st9" v:baseFontSize="8">m</tspan><tspan dy="0.164em" class="st3">(</tspan>x)</text> </g> + <g id="shape31-64" v:mID="31" v:groupContext="shape" transform="translate(130.188,-89.7228)"> + <title>Sheet.31</title> + <desc>…..</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="14.0625" cy="122.644" width="28.13" height="11.25"/> + <rect x="0" y="117.019" width="28.125" height="11.25" class="st1"/> + <text x="8.46" y="125.34" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>…..</text> </g> + <g id="shape32-67" v:mID="32" v:groupContext="shape" transform="translate(34,-23.3478)"> + <title>Sheet.32</title> + <desc>Store m for this group of keys</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="66.375" cy="122.644" width="132.75" height="11.25"/> + <g id="shadow32-68" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st12"> + <rect x="0" y="117.019" width="132.75" height="11.25" class="st13"/> + </g> + <rect x="0" y="117.019" width="132.75" height="11.25" class="st14"/> + <text x="6.32" y="125.64" class="st15" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Store <tspan + class="st16">m</tspan> for this group of keys</text> </g> + <g id="shape36-76" v:mID="36" v:groupContext="shape" transform="translate(159.381,-100.964)"> + <title>Sheet.36</title> + <path d="M3.45 125.81 L6.87 119.34 L7.99 120.16 L3.87 128.27 L0 124.35 L0.86 123.13 L3.45 125.81 Z" class="st17"/> + </g> + <g id="group44-79" transform="translate(97.5625,-100.086)" v:mID="44" v:groupContext="group"> + <title>Sheet.44</title> + <g id="shape42-80" v:mID="42" v:groupContext="shape" transform="translate(85.4972,28.6255) rotate(41.8011)"> + <title>Sheet.42</title> + <path d="M0 128.27 L6.04 128.27" class="st18"/> + </g> + <g id="shape43-83" v:mID="43" v:groupContext="shape" transform="translate(-87.9035,34.8564) rotate(-43.2597)"> + <title>Sheet.43</title> + <path d="M0 128.27 L5.87 128.27" class="st18"/> + </g> + </g> + <g id="group45-86" transform="translate(120.625,-100.086)" v:mID="45" v:groupContext="group"> + <title>Sheet.45</title> + <g id="shape46-87" v:mID="46" v:groupContext="shape" transform="translate(85.4972,28.6255) rotate(41.8011)"> + <title>Sheet.46</title> + <path d="M0 128.27 L6.04 128.27" class="st18"/> + </g> + <g id="shape47-90" v:mID="47" v:groupContext="shape" transform="translate(-87.9035,34.8564) rotate(-43.2597)"> + <title>Sheet.47</title> + <path d="M0 128.27 L5.87 128.27" class="st18"/> + </g> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i5.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i5.svg new file mode 100644 index 000000000..b6540ba4c --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i5.svg @@ -0,0 +1,183 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export efd_i5.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="8.34375in" height="2.86443in" + viewBox="0 0 600.75 206.239" xml:space="preserve" color-interpolation-filters="sRGB" class="st14"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st3 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st4 {fill:#feffff;font-family:Calibri;font-size:1.5em} + .st5 {fill:#feffff;font-family:Calibri;font-size:1.16666em} + .st6 {marker-end:url(#mrkr5-36);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5} + .st7 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.37313432835821} + .st8 {stroke:#5b9bd5;stroke-dasharray:1.5,3;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5} + .st9 {fill:none;stroke:none;stroke-width:0.25} + .st10 {fill:#5b9bd5;font-family:Calibri;font-size:1.5em;font-weight:bold} + .st11 {baseline-shift:-32.4951%;font-size:0.649902em} + .st12 {fill:#deebf6;stroke:#0070c0;stroke-width:1} + .st13 {fill:#5b9bd5;font-family:Calibri;font-size:1.5em} + .st14 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-36" class="st7" v:arrowType="5" v:arrowSize="2" v:setback="4.69" refX="-4.69" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-2.68,-2.68) "/> + </marker> + </defs> + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape2-1" v:mID="2" v:groupContext="shape" transform="translate(93.0294,-158.5)"> + <title>Rectangle</title> + <desc>All Keys</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="216" cy="192.739" width="432" height="27"/> + <g id="shadow2-2" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="179.239" width="432" height="27" class="st2"/> + </g> + <rect x="0" y="179.239" width="432" height="27" class="st3"/> + <text x="187.88" y="198.14" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>All Keys</text> </g> + <g id="shape3-7" v:mID="3" v:groupContext="shape" transform="translate(21.0294,-77.5)"> + <title>Rectangle.3</title> + <desc>Group 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="188.239" width="108" height="36"/> + <g id="shadow3-8" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="170.239" width="108" height="36" class="st2"/> + </g> + <rect x="0" y="170.239" width="108" height="36" class="st3"/> + <text x="30.97" y="192.44" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Group 1</text> </g> + <g id="shape4-13" v:mID="4" v:groupContext="shape" transform="translate(156.029,-77.5)"> + <title>Rectangle.4</title> + <desc>Group 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="188.239" width="108" height="36"/> + <g id="shadow4-14" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="170.239" width="108" height="36" class="st2"/> + </g> + <rect x="0" y="170.239" width="108" height="36" class="st3"/> + <text x="30.97" y="192.44" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Group 2</text> </g> + <g id="shape5-19" v:mID="5" v:groupContext="shape" transform="translate(291.029,-77.5)"> + <title>Rectangle.5</title> + <desc>Group 3</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="188.239" width="108" height="36"/> + <g id="shadow5-20" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="170.239" width="108" height="36" class="st2"/> + </g> + <rect x="0" y="170.239" width="108" height="36" class="st3"/> + <text x="30.97" y="192.44" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Group 3</text> </g> + <g id="shape6-25" v:mID="6" v:groupContext="shape" transform="translate(471.029,-77.5)"> + <title>Rectangle.6</title> + <desc>Group X</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="188.239" width="108" height="36"/> + <g id="shadow6-26" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="170.239" width="108" height="36" class="st2"/> + </g> + <rect x="0" y="170.239" width="108" height="36" class="st3"/> + <text x="30.88" y="192.44" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Group X</text> </g> + <g id="shape7-31" v:mID="7" v:groupContext="shape" transform="translate(359.05,247.819) rotate(165.964)"> + <title>Sheet.7</title> + <path d="M0 206.24 L178.5 206.24" class="st6"/> + </g> + <g id="shape8-37" v:mID="8" v:groupContext="shape" transform="translate(428.903,215.562) rotate(144.462)"> + <title>Sheet.8</title> + <path d="M0 206.24 L70.39 206.24" class="st6"/> + </g> + <g id="shape9-42" v:mID="9" v:groupContext="shape" transform="translate(470.075,-81.0976) rotate(51.3402)"> + <title>Sheet.9</title> + <path d="M0 206.24 L50.59 206.24" class="st6"/> + </g> + <g id="shape10-47" v:mID="10" v:groupContext="shape" transform="translate(364.228,-150.976) rotate(15.5241)"> + <title>Sheet.10</title> + <path d="M0 206.24 L161.1 206.24" class="st6"/> + </g> + <g id="shape11-52" v:mID="11" v:groupContext="shape" transform="translate(408.029,-95.5)"> + <title>Sheet.11</title> + <path d="M0 206.24 L45 206.24" class="st8"/> + </g> + <g id="shape12-55" v:mID="12" v:groupContext="shape" transform="translate(48.0294,-50.5)"> + <title>Sheet.12</title> + <desc>H7</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="22.5" cy="192.739" width="45" height="27"/> + <rect x="0" y="179.239" width="45" height="27" class="st9"/> + <text x="13.86" y="198.14" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>H<tspan + dy="-0.284em" class="st11" v:baseFontSize="18">7</tspan></text> </g> + <g id="shape13-59" v:mID="13" v:groupContext="shape" transform="translate(192.029,-50.5)"> + <title>Sheet.13</title> + <desc>H267</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="22.5" cy="192.739" width="45" height="27"/> + <rect x="0" y="179.239" width="45" height="27" class="st9"/> + <text x="7.93" y="198.14" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>H<tspan dy="-0.284em" + class="st11" v:baseFontSize="18">267</tspan></text> </g> + <g id="shape14-63" v:mID="14" v:groupContext="shape" transform="translate(318.029,-50.5)"> + <title>Sheet.14</title> + <desc>H46</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="22.5" cy="192.739" width="45" height="27"/> + <rect x="0" y="179.239" width="45" height="27" class="st9"/> + <text x="10.89" y="198.14" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>H<tspan + dy="-0.284em" class="st11" v:baseFontSize="18">46</tspan></text> </g> + <g id="shape15-67" v:mID="15" v:groupContext="shape" transform="translate(502.529,-50.5)"> + <title>Sheet.15</title> + <desc>H132</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="22.5" cy="192.739" width="45" height="27"/> + <rect x="0" y="179.239" width="45" height="27" class="st9"/> + <text x="7.93" y="198.14" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>H<tspan dy="-0.284em" + class="st11" v:baseFontSize="18">132</tspan></text> </g> + <g id="shape16-71" v:mID="16" v:groupContext="shape" transform="translate(111.029,-19)"> + <title>Sheet.16</title> + <desc>Store hash function index for each group of keys</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="189" cy="192.739" width="378" height="27"/> + <rect x="0" y="179.239" width="378" height="27" class="st12"/> + <text x="12.27" y="198.14" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Store hash function index for each group of keys</text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i6.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i6.svg new file mode 100644 index 000000000..9aee30bc2 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i6.svg @@ -0,0 +1,1254 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export efd_i6.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="8.2496in" height="5.89673in" + viewBox="0 0 593.971 424.565" xml:space="preserve" color-interpolation-filters="sRGB" class="st27"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st3 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st5 {fill:#feffff;font-family:Calibri;font-size:0.75em} + .st6 {fill:none;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st7 {fill:none;stroke:#2e75b5;stroke-width:2.25} + .st8 {fill:#305497;stroke:#2e75b5;stroke-width:1} + .st9 {fill:#feffff;font-family:Calibri;font-size:0.833336em;font-weight:bold} + .st10 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2)} + .st11 {fill:#5b9bd5} + .st12 {stroke:#c7c8c8;stroke-width:0.25} + .st13 {fill:#acccea;stroke:#c7c8c8;stroke-width:0.25} + .st14 {fill:#feffff;font-family:Calibri;font-size:1.00001em;font-weight:bold} + .st15 {fill:#ed7d31;stroke:#c7c8c8;stroke-width:0.25} + .st16 {fill:#deebf6;stroke:#c7c8c8;stroke-width:0.25} + .st17 {marker-end:url(#mrkr5-212);stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st18 {fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1;stroke-width:0.28409090909091} + .st19 {fill:none;stroke:#2e75b5;stroke-width:1} + .st20 {fill:#5b9bd5;font-family:Calibri;font-size:1.00001em} + .st21 {fill:none;stroke:none;stroke-width:0.25} + .st22 {font-size:1em} + .st23 {fill:#ffffff} + .st24 {stroke:#5b9bd5;stroke-dasharray:1.5,3;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5} + .st25 {marker-end:url(#mrkr5-444);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5} + .st26 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.37313432835821} + .st27 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-212" class="st18" v:arrowType="5" v:arrowSize="2" v:setback="5.8" refX="-5.8" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-3.52,-3.52) "/> + </marker> + <marker id="mrkr5-444" class="st26" v:arrowType="5" v:arrowSize="2" v:setback="4.69" refX="-4.69" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-2.68,-2.68) "/> + </marker> + </defs> + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape3-1" v:mID="3" v:groupContext="shape" transform="translate(319.501,-335.688)"> + <title>Rectangle.58</title> + <desc>Key 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="415.565" width="31.5" height="18"/> + <g id="shadow3-2" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + <text x="4.74" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key 1</text> </g> + <g id="shape4-7" v:mID="4" v:groupContext="shape" transform="translate(353.251,-335.688)"> + <title>Rectangle.59</title> + <desc>Action 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="415.565" width="42.75" height="18"/> + <g id="shadow4-8" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + <text x="4.62" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action 1</text> </g> + <g id="shape5-13" v:mID="5" v:groupContext="shape" transform="translate(400.501,-335.688)"> + <title>Rectangle.60</title> + <desc>Key 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="415.565" width="31.5" height="18"/> + <g id="shadow5-14" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + <text x="4.74" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key 2</text> </g> + <g id="shape6-19" v:mID="6" v:groupContext="shape" transform="translate(434.251,-335.688)"> + <title>Rectangle.61</title> + <desc>Action 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="415.565" width="42.75" height="18"/> + <g id="shadow6-20" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + <text x="4.62" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action 2</text> </g> + <g id="shape7-25" v:mID="7" v:groupContext="shape" transform="translate(481.501,-335.688)"> + <title>Rectangle.62</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow7-26" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + </g> + <g id="shape8-30" v:mID="8" v:groupContext="shape" transform="translate(515.251,-335.688)"> + <title>Rectangle.63</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow8-31" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + </g> + <g id="shape9-35" v:mID="9" v:groupContext="shape" transform="translate(319.501,-313.188)"> + <title>Rectangle.64</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow9-36" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + </g> + <g id="shape10-40" v:mID="10" v:groupContext="shape" transform="translate(353.251,-313.188)"> + <title>Rectangle.65</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow10-41" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + </g> + <g id="shape11-45" v:mID="11" v:groupContext="shape" transform="translate(400.501,-313.188)"> + <title>Rectangle.66</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow11-46" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + </g> + <g id="shape12-50" v:mID="12" v:groupContext="shape" transform="translate(434.251,-313.188)"> + <title>Rectangle.67</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow12-51" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + </g> + <g id="shape13-55" v:mID="13" v:groupContext="shape" transform="translate(481.501,-313.188)"> + <title>Rectangle.68</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow13-56" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + </g> + <g id="shape14-60" v:mID="14" v:groupContext="shape" transform="translate(515.251,-313.188)"> + <title>Rectangle.69</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow14-61" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + </g> + <g id="shape15-65" v:mID="15" v:groupContext="shape" transform="translate(319.501,-277.188)"> + <title>Rectangle.70</title> + <desc>Key x</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="415.565" width="31.5" height="18"/> + <g id="shadow15-66" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + <text x="5.11" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key x</text> </g> + <g id="shape16-71" v:mID="16" v:groupContext="shape" transform="translate(353.251,-277.188)"> + <title>Rectangle.71</title> + <desc>Action x</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="415.565" width="42.75" height="18"/> + <g id="shadow16-72" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + <text x="4.99" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action x</text> </g> + <g id="shape17-77" v:mID="17" v:groupContext="shape" transform="translate(400.501,-277.188)"> + <title>Rectangle.72</title> + <desc>Key y</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="415.565" width="31.5" height="18"/> + <g id="shadow17-78" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + <text x="5.01" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key y</text> </g> + <g id="shape18-83" v:mID="18" v:groupContext="shape" transform="translate(434.251,-277.188)"> + <title>Rectangle.73</title> + <desc>Action y</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="415.565" width="42.75" height="18"/> + <g id="shadow18-84" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + <text x="4.89" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action y</text> </g> + <g id="shape19-89" v:mID="19" v:groupContext="shape" transform="translate(481.501,-277.188)"> + <title>Rectangle.74</title> + <desc>Key z</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="415.565" width="31.5" height="18"/> + <g id="shadow19-90" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + <text x="5.3" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key z</text> </g> + <g id="shape20-95" v:mID="20" v:groupContext="shape" transform="translate(515.251,-277.188)"> + <title>Rectangle.75</title> + <desc>Action z</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="415.565" width="42.75" height="18"/> + <g id="shadow20-96" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + <text x="5.18" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action z</text> </g> + <g id="shape21-101" v:mID="21" v:groupContext="shape" transform="translate(319.501,-240.687)"> + <title>Rectangle.76</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow21-102" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + </g> + <g id="shape22-106" v:mID="22" v:groupContext="shape" transform="translate(353.251,-240.687)"> + <title>Rectangle.77</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow22-107" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + </g> + <g id="shape23-111" v:mID="23" v:groupContext="shape" transform="translate(400.501,-240.687)"> + <title>Rectangle.78</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow23-112" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + </g> + <g id="shape24-116" v:mID="24" v:groupContext="shape" transform="translate(434.251,-240.687)"> + <title>Rectangle.79</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow24-117" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + </g> + <g id="shape25-121" v:mID="25" v:groupContext="shape" transform="translate(481.501,-240.687)"> + <title>Rectangle.80</title> + <desc>Key N</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="415.565" width="31.5" height="18"/> + <g id="shadow25-122" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + <text x="5.21" y="418.26" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key N</text> </g> + <g id="shape26-127" v:mID="26" v:groupContext="shape" transform="translate(515.251,-240.687)"> + <title>Rectangle.81</title> + <desc>Action N</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="415.565" width="42.75" height="18"/> + <g id="shadow26-128" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + <text x="5.67" y="418.26" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action N</text> </g> + <g id="shape27-133" v:mID="27" v:groupContext="shape" transform="translate(317.251,-231.687)"> + <title>Rectangle.82</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow27-134" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="289.065" width="245.25" height="135.5" class="st6"/> + </g> + <rect x="0" y="289.065" width="245.25" height="135.5" class="st7"/> + </g> + <g id="shape28-138" v:mID="28" v:groupContext="shape" transform="translate(328.501,-362.688)"> + <title>Sheet.28</title> + <desc>Local Table for N Specific Flows Serviced at Node 1</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="110.423" cy="418.94" width="220.85" height="11.25"/> + <rect x="0" y="413.315" width="220.846" height="11.25" class="st8"/> + <text x="5.77" y="421.94" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Local Table for N Specific Flows Serviced at Node 1</text> </g> + <g id="group34-141" transform="translate(66.0294,-165.569)" v:mID="34" v:groupContext="group"> + <v:custProps> + <v:cp v:nameU="AssetNumber" v:lbl="Asset Number" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="SerialNumber" v:lbl="Serial Number" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Location" v:lbl="Location" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Building" v:lbl="Building" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Room" v:lbl="Room" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Manufacturer" v:lbl="Manufacturer" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ProductNumber" v:lbl="Product Number" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="PartNumber" v:lbl="Part Number" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ProductDescription" v:lbl="Product Description" v:prompt="" v:type="0" v:format="" + v:sortKey="Equipment" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NetworkName" v:lbl="Network Name" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="IPAddress" v:lbl="IP Address" v:prompt="" v:type="0" v:format="" v:sortKey="Network" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="SubnetMask" v:lbl="Subnet Mask" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="AdminInterface" v:lbl="Administrative Interface" v:prompt="" v:type="0" v:format="" + v:sortKey="Network" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NumberofPorts" v:lbl="Number of Ports" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="CommunityString" v:lbl="Community String" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NetworkDescription" v:lbl="Network Description" v:prompt="" v:type="0" v:format="" + v:sortKey="Network" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="MACAddress" v:lbl="MAC Address" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ShapeClass" v:lbl="ShapeClass" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0" v:val="VT4(Equipment)"/> + <v:cp v:nameU="ShapeType" v:lbl="ShapeType" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0" v:val="VT4(Device)"/> + <v:cp v:nameU="SubShapeType" v:lbl="SubShapeType" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0" v:val="VT4(Load balancer)"/> + </v:custProps> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="ShapeClass" v:prompt="" v:val="VT0(5):26"/> + <v:ud v:nameU="SolSH" v:prompt="" v:val="VT15({BF0433D9-CD73-4EB5-8390-8653BE590246}):41"/> + <v:ud v:nameU="visLegendShape" v:prompt="" v:val="VT0(2):26"/> + </v:userDefs> + <title>Load balancer</title> + <g id="shape35-142" v:mID="35" v:groupContext="shape" transform="translate(0,-7.33146)"> + <title>Sheet.35</title> + <g id="shadow35-143" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M54 367.23 L18 367.23 L0 377.86 L0 424.56 L72 424.56 L72 377.86 L54 367.23 Z" class="st10"/> + <path d="M0 377.86 L72 377.86" class="st6"/> + <path d="M54 367.23 L18 367.23 L0 377.86 L0 424.56 L72 424.56 L72 377.86 L54 367.23" class="st6"/> + </g> + <path d="M54 367.23 L18 367.23 L0 377.86 L0 424.56 L72 424.56 L72 377.86 L54 367.23 Z" class="st11"/> + <path d="M0 377.86 L72 377.86" class="st12"/> + <path d="M54 367.23 L18 367.23 L0 377.86 L0 424.56 L72 424.56 L72 377.86 L54 367.23" class="st12"/> + </g> + <g id="shape36-152" v:mID="36" v:groupContext="shape" transform="translate(8.03054,-12.9324)"> + <title>Sheet.36</title> + <g id="shadow36-153" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M45.34 421.81 L41.2 422.66 L44.12 424.56 L49.68 423.16 L48.75 417.51 L45.8 415.59 L46.69 419.68 L36.97 + 413.34 L35.6 415.45 L45.34 421.81 ZM50.83 405.36 L39.2 405.36 L39.2 407.88 L50.8 407.88 L47.82 410.83 + L51.34 410.83 L55.21 406.61 L51.32 402.39 L47.83 402.39 L50.83 405.36 ZM46.49 392.01 L36.75 398.37 + L38.13 400.48 L47.84 394.14 L46.96 398.23 L49.91 396.31 L50.84 390.66 L45.28 389.26 L42.36 391.16 + L46.49 392.01 ZM27.71 397.16 C22.66 397.16 18.58 401.25 18.58 406.29 C18.58 411.33 22.66 415.42 + 27.71 415.42 C32.75 415.42 36.84 411.33 36.84 406.29 C36.84 401.25 32.75 397.16 27.71 397.16 ZM27.71 + 400.04 C31.15 400.04 33.96 402.84 33.96 406.29 C33.96 409.74 31.15 412.54 27.71 412.54 C24.26 412.54 + 21.46 409.74 21.46 406.29 C21.46 402.84 24.26 400.04 27.71 400.04 ZM11.64 405.04 L0 405.04 L0 407.56 + L11.6 407.56 L8.62 410.51 L12.14 410.51 L16.01 406.29 L12.12 402.07 L8.64 402.07 L11.64 405.04 Z" + class="st2"/> + </g> + <path d="M45.34 421.81 L41.2 422.66 L44.12 424.56 L49.68 423.16 L48.75 417.51 L45.8 415.59 L46.69 419.68 L36.97 413.34 + L35.6 415.45 L45.34 421.81 ZM50.83 405.36 L39.2 405.36 L39.2 407.88 L50.8 407.88 L47.82 410.83 L51.34 + 410.83 L55.21 406.61 L51.32 402.39 L47.83 402.39 L50.83 405.36 ZM46.49 392.01 L36.75 398.37 L38.13 400.48 + L47.84 394.14 L46.96 398.23 L49.91 396.31 L50.84 390.66 L45.28 389.26 L42.36 391.16 L46.49 392.01 ZM27.71 + 397.16 C22.66 397.16 18.58 401.25 18.58 406.29 C18.58 411.33 22.66 415.42 27.71 415.42 C32.75 415.42 + 36.84 411.33 36.84 406.29 C36.84 401.25 32.75 397.16 27.71 397.16 ZM27.71 400.04 C31.15 400.04 33.96 + 402.84 33.96 406.29 C33.96 409.74 31.15 412.54 27.71 412.54 C24.26 412.54 21.46 409.74 21.46 406.29 + C21.46 402.84 24.26 400.04 27.71 400.04 ZM11.64 405.04 L0 405.04 L0 407.56 L11.6 407.56 L8.62 410.51 + L12.14 410.51 L16.01 406.29 L12.12 402.07 L8.64 402.07 L11.64 405.04 Z" class="st13"/> + </g> + </g> + <g id="shape37-157" v:mID="37" v:groupContext="shape" transform="translate(21.0294,-45.4375)"> + <title>Rectangle</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow37-158" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="336.433" width="135" height="88.1315" class="st2"/> + </g> + <rect x="0" y="336.433" width="135" height="88.1315" class="st3"/> + </g> + <g id="shape38-162" v:mID="38" v:groupContext="shape" transform="translate(34.693,-126.438)"> + <title>Sheet.38</title> + <desc>EFD Table</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="49.3364" cy="415.565" width="98.68" height="18"/> + <rect x="0" y="406.565" width="98.6728" height="18" class="st8"/> + <text x="24.87" y="419.17" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>EFD Table</text> </g> + <g id="shape39-165" v:mID="39" v:groupContext="shape" transform="translate(30.0294,-99.4375)"> + <title>Rectangle.39</title> + <desc>Group_id</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="26.9182" cy="415.565" width="53.84" height="18"/> + <g id="shadow39-166" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="53.8364" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="53.8364" height="18" class="st15"/> + <text x="7.87" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Group_id</text> </g> + <g id="shape40-171" v:mID="40" v:groupContext="shape" transform="translate(93.193,-99.4375)"> + <title>Rectangle.40</title> + <desc>Hash index</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="26.9182" cy="415.565" width="53.84" height="18"/> + <g id="shadow40-172" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="53.8364" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="53.8364" height="18" class="st15"/> + <text x="4.64" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Hash index</text> </g> + <g id="shape41-177" v:mID="41" v:groupContext="shape" transform="translate(30.193,-82.4275)"> + <title>Rectangle.41</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow41-178" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="413.315" width="53.8364" height="11.25" class="st2"/> + </g> + <rect x="0" y="413.315" width="53.8364" height="11.25" class="st16"/> + </g> + <g id="shape42-182" v:mID="42" v:groupContext="shape" transform="translate(30.193,-66.8125)"> + <title>Rectangle.42</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow42-183" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="413.315" width="53.8364" height="11.25" class="st2"/> + </g> + <rect x="0" y="413.315" width="53.8364" height="11.25" class="st16"/> + </g> + <g id="shape43-187" v:mID="43" v:groupContext="shape" transform="translate(30.1112,-52.1875)"> + <title>Rectangle.43</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow43-188" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="413.315" width="53.8364" height="11.25" class="st2"/> + </g> + <rect x="0" y="413.315" width="53.8364" height="11.25" class="st16"/> + </g> + <g id="shape44-192" v:mID="44" v:groupContext="shape" transform="translate(93.0294,-81.4375)"> + <title>Rectangle.44</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow44-193" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="413.315" width="53.8364" height="11.25" class="st2"/> + </g> + <rect x="0" y="413.315" width="53.8364" height="11.25" class="st16"/> + </g> + <g id="shape45-197" v:mID="45" v:groupContext="shape" transform="translate(93.193,-66.8125)"> + <title>Rectangle.45</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow45-198" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="413.315" width="53.8364" height="11.25" class="st2"/> + </g> + <rect x="0" y="413.315" width="53.8364" height="11.25" class="st16"/> + </g> + <g id="shape46-202" v:mID="46" v:groupContext="shape" transform="translate(93.193,-52.1875)"> + <title>Rectangle.46</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow46-203" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="413.315" width="53.8364" height="11.25" class="st2"/> + </g> + <rect x="0" y="413.315" width="53.8364" height="11.25" class="st16"/> + </g> + <g id="shape47-207" v:mID="47" v:groupContext="shape" transform="translate(374.924,544.022) rotate(135)"> + <title>Sheet.47</title> + <path d="M-0 417.75 A40.674 18.0151 -156.2 0 0 40.24 422.15 L40.49 421.89" class="st17"/> + </g> + <g id="shape48-213" v:mID="48" v:groupContext="shape" transform="translate(21.0294,-19)"> + <title>Sheet.48</title> + <desc>Supports X*N Flows</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="67.5" cy="415.565" width="135" height="18"/> + <rect x="0" y="406.565" width="135" height="18" class="st19"/> + <text x="19.05" y="419.17" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Supports X*N Flows</text> </g> + <g id="shape49-216" v:mID="49" v:groupContext="shape" transform="translate(48.0294,-229.938)"> + <title>Sheet.49</title> + <desc>Frontend Server or Load Balancer</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="400.94" width="108" height="47.25"/> + <rect x="0" y="377.315" width="108" height="47.25" class="st21"/> + <text x="14.56" y="397.34" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Frontend Server<v:newlineChar/><tspan + x="13.16" dy="1.2em" class="st22">or Load Balancer </tspan> </text> </g> + <g id="group51-220" transform="translate(223.876,-310.938)" v:mID="51" v:groupContext="group"> + <v:custProps> + <v:cp v:nameU="AssetNumber" v:lbl="Asset Number" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="SerialNumber" v:lbl="Serial Number" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Location" v:lbl="Location" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Building" v:lbl="Building" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Room" v:lbl="Room" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Manufacturer" v:lbl="Manufacturer" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ProductNumber" v:lbl="Product Number" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="PartNumber" v:lbl="Part Number" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ProductDescription" v:lbl="Product Description" v:prompt="" v:type="0" v:format="" + v:sortKey="Equipment" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NetworkName" v:lbl="Network Name" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="IPAddress" v:lbl="IP Address" v:prompt="" v:type="0" v:format="" v:sortKey="Network" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="SubnetMask" v:lbl="Subnet Mask" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="AdminInterface" v:lbl="Administrative Interface" v:prompt="" v:type="0" v:format="" + v:sortKey="Network" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NumberofPorts" v:lbl="Number of Ports" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="CommunityString" v:lbl="Community String" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NetworkDescription" v:lbl="Network Description" v:prompt="" v:type="0" v:format="" + v:sortKey="Network" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="MACAddress" v:lbl="MAC Address" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="CPU" v:lbl="CPU" v:prompt="" v:type="0" v:format="" v:sortKey="Workstation" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Memory" v:lbl="Memory" v:prompt="" v:type="0" v:format="" v:sortKey="Workstation" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="OperatingSystem" v:lbl="Operating System" v:prompt="" v:type="0" v:format="" v:sortKey="Workstation" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="HardDriveSize" v:lbl="Hard Drive Capacity" v:prompt="" v:type="0" v:format="" + v:sortKey="Workstation" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Department" v:lbl="Department" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ShapeClass" v:lbl="ShapeClass" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0" v:val="VT4(Equipment)"/> + <v:cp v:nameU="ShapeType" v:lbl="ShapeType" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0" v:val="VT4(Server)"/> + <v:cp v:nameU="BelongsTo" v:lbl="Belongs To" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0"/> + </v:custProps> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="ShapeClass" v:prompt="" v:val="VT0(5):26"/> + <v:ud v:nameU="SolSH" v:prompt="" v:val="VT15({BF0433D9-CD73-4EB5-8390-8653BE590246}):41"/> + <v:ud v:nameU="visLegendShape" v:prompt="" v:val="VT0(2):26"/> + </v:userDefs> + <title>Server</title> + <g id="shape52-221" v:mID="52" v:groupContext="shape" transform="translate(13.0183,0)"> + <title>Sheet.52</title> + <g id="shadow52-222" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="352.565" width="45.9634" height="72" class="st2"/> + </g> + <rect x="0" y="352.565" width="45.9634" height="72" class="st3"/> + </g> + <g id="shape53-226" v:mID="53" v:groupContext="shape" transform="translate(47.371,-30.7354)"> + <title>Sheet.53</title> + <g id="shadow53-227" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <ellipse cx="2.77848" cy="421.786" rx="2.77848" ry="2.77848" class="st2"/> + </g> + <ellipse cx="2.77848" cy="421.786" rx="2.77848" ry="2.77848" class="st13"/> + </g> + <g id="shape54-231" v:mID="54" v:groupContext="shape" transform="translate(30.51,-11.8022)"> + <title>Sheet.54</title> + <v:userDefs> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(1)"/> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(#5b9bd5)"/> + </v:userDefs> + <g id="shadow54-232" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M-0 424.56 L22.42 424.56 L22.42 422.76 L-0 422.76 L-0 424.56 ZM-0 419.11 L22.42 419.11 L22.42 417.31 + L-0 417.31 L-0 419.11 ZM-0 413.65 L22.42 413.65 L22.42 411.84 L-0 411.84 L-0 413.65 Z" + class="st10"/> + </g> + <path d="M-0 424.56 L22.42 424.56 L22.42 422.76 L-0 422.76 L-0 424.56 ZM-0 419.11 L22.42 419.11 L22.42 417.31 L-0 + 417.31 L-0 419.11 ZM-0 413.65 L22.42 413.65 L22.42 411.84 L-0 411.84 L-0 413.65 Z" class="st23"/> + </g> + </g> + <g id="shape59-239" v:mID="59" v:groupContext="shape" transform="translate(277.876,-373.938)"> + <title>Sheet.59</title> + <path d="M-0 424.56 A111.108 53.2538 42.31 0 1 93.83 421.21 L94.14 421.41" class="st17"/> + </g> + <g id="shape60-244" v:mID="60" v:groupContext="shape" transform="translate(205.876,-283.938)"> + <title>Sheet.60</title> + <desc>Backend Server 1</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="408.124" width="108" height="32.8815"/> + <rect x="0" y="391.683" width="108" height="32.8815" class="st21"/> + <text x="11.93" y="411.72" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Backend Server 1</text> </g> + <g id="group61-247" transform="translate(223.876,-207.438)" v:mID="61" v:groupContext="group"> + <v:custProps> + <v:cp v:nameU="AssetNumber" v:lbl="Asset Number" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="SerialNumber" v:lbl="Serial Number" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Location" v:lbl="Location" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Building" v:lbl="Building" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Room" v:lbl="Room" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Manufacturer" v:lbl="Manufacturer" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ProductNumber" v:lbl="Product Number" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="PartNumber" v:lbl="Part Number" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ProductDescription" v:lbl="Product Description" v:prompt="" v:type="0" v:format="" + v:sortKey="Equipment" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NetworkName" v:lbl="Network Name" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="IPAddress" v:lbl="IP Address" v:prompt="" v:type="0" v:format="" v:sortKey="Network" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="SubnetMask" v:lbl="Subnet Mask" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="AdminInterface" v:lbl="Administrative Interface" v:prompt="" v:type="0" v:format="" + v:sortKey="Network" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NumberofPorts" v:lbl="Number of Ports" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="CommunityString" v:lbl="Community String" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NetworkDescription" v:lbl="Network Description" v:prompt="" v:type="0" v:format="" + v:sortKey="Network" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="MACAddress" v:lbl="MAC Address" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="CPU" v:lbl="CPU" v:prompt="" v:type="0" v:format="" v:sortKey="Workstation" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Memory" v:lbl="Memory" v:prompt="" v:type="0" v:format="" v:sortKey="Workstation" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="OperatingSystem" v:lbl="Operating System" v:prompt="" v:type="0" v:format="" v:sortKey="Workstation" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="HardDriveSize" v:lbl="Hard Drive Capacity" v:prompt="" v:type="0" v:format="" + v:sortKey="Workstation" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Department" v:lbl="Department" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ShapeClass" v:lbl="ShapeClass" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0" v:val="VT4(Equipment)"/> + <v:cp v:nameU="ShapeType" v:lbl="ShapeType" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0" v:val="VT4(Server)"/> + <v:cp v:nameU="BelongsTo" v:lbl="Belongs To" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0"/> + </v:custProps> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="ShapeClass" v:prompt="" v:val="VT0(5):26"/> + <v:ud v:nameU="SolSH" v:prompt="" v:val="VT15({BF0433D9-CD73-4EB5-8390-8653BE590246}):41"/> + <v:ud v:nameU="visLegendShape" v:prompt="" v:val="VT0(2):26"/> + </v:userDefs> + <title>Server.61</title> + <g id="shape62-248" v:mID="62" v:groupContext="shape" transform="translate(13.0183,0)"> + <title>Sheet.62</title> + <g id="shadow62-249" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="352.565" width="45.9634" height="72" class="st2"/> + </g> + <rect x="0" y="352.565" width="45.9634" height="72" class="st3"/> + </g> + <g id="shape63-253" v:mID="63" v:groupContext="shape" transform="translate(47.371,-30.7354)"> + <title>Sheet.63</title> + <g id="shadow63-254" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <ellipse cx="2.77848" cy="421.786" rx="2.77848" ry="2.77848" class="st2"/> + </g> + <ellipse cx="2.77848" cy="421.786" rx="2.77848" ry="2.77848" class="st13"/> + </g> + <g id="shape64-258" v:mID="64" v:groupContext="shape" transform="translate(30.51,-11.8022)"> + <title>Sheet.64</title> + <v:userDefs> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(1)"/> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(#5b9bd5)"/> + </v:userDefs> + <g id="shadow64-259" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M-0 424.56 L22.42 424.56 L22.42 422.76 L-0 422.76 L-0 424.56 ZM-0 419.11 L22.42 419.11 L22.42 417.31 + L-0 417.31 L-0 419.11 ZM-0 413.65 L22.42 413.65 L22.42 411.84 L-0 411.84 L-0 413.65 Z" + class="st10"/> + </g> + <path d="M-0 424.56 L22.42 424.56 L22.42 422.76 L-0 422.76 L-0 424.56 ZM-0 419.11 L22.42 419.11 L22.42 417.31 L-0 + 417.31 L-0 419.11 ZM-0 413.65 L22.42 413.65 L22.42 411.84 L-0 411.84 L-0 413.65 Z" class="st23"/> + </g> + </g> + <g id="shape65-266" v:mID="65" v:groupContext="shape" transform="translate(205.876,-180.437)"> + <title>Sheet.65</title> + <desc>Backend Server 2</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="408.124" width="108" height="32.8815"/> + <rect x="0" y="391.683" width="108" height="32.8815" class="st21"/> + <text x="11.93" y="411.72" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Backend Server 2</text> </g> + <g id="group66-269" transform="translate(219.029,-58.9375)" v:mID="66" v:groupContext="group"> + <v:custProps> + <v:cp v:nameU="AssetNumber" v:lbl="Asset Number" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="SerialNumber" v:lbl="Serial Number" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Location" v:lbl="Location" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Building" v:lbl="Building" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Room" v:lbl="Room" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Manufacturer" v:lbl="Manufacturer" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ProductNumber" v:lbl="Product Number" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="PartNumber" v:lbl="Part Number" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ProductDescription" v:lbl="Product Description" v:prompt="" v:type="0" v:format="" + v:sortKey="Equipment" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NetworkName" v:lbl="Network Name" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="IPAddress" v:lbl="IP Address" v:prompt="" v:type="0" v:format="" v:sortKey="Network" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="SubnetMask" v:lbl="Subnet Mask" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="AdminInterface" v:lbl="Administrative Interface" v:prompt="" v:type="0" v:format="" + v:sortKey="Network" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NumberofPorts" v:lbl="Number of Ports" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="CommunityString" v:lbl="Community String" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NetworkDescription" v:lbl="Network Description" v:prompt="" v:type="0" v:format="" + v:sortKey="Network" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="MACAddress" v:lbl="MAC Address" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="CPU" v:lbl="CPU" v:prompt="" v:type="0" v:format="" v:sortKey="Workstation" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Memory" v:lbl="Memory" v:prompt="" v:type="0" v:format="" v:sortKey="Workstation" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="OperatingSystem" v:lbl="Operating System" v:prompt="" v:type="0" v:format="" v:sortKey="Workstation" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="HardDriveSize" v:lbl="Hard Drive Capacity" v:prompt="" v:type="0" v:format="" + v:sortKey="Workstation" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Department" v:lbl="Department" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ShapeClass" v:lbl="ShapeClass" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0" v:val="VT4(Equipment)"/> + <v:cp v:nameU="ShapeType" v:lbl="ShapeType" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0" v:val="VT4(Server)"/> + <v:cp v:nameU="BelongsTo" v:lbl="Belongs To" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0"/> + </v:custProps> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="ShapeClass" v:prompt="" v:val="VT0(5):26"/> + <v:ud v:nameU="SolSH" v:prompt="" v:val="VT15({BF0433D9-CD73-4EB5-8390-8653BE590246}):41"/> + <v:ud v:nameU="visLegendShape" v:prompt="" v:val="VT0(2):26"/> + </v:userDefs> + <title>Server.66</title> + <g id="shape67-270" v:mID="67" v:groupContext="shape" transform="translate(13.0183,0)"> + <title>Sheet.67</title> + <g id="shadow67-271" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="352.565" width="45.9634" height="72" class="st2"/> + </g> + <rect x="0" y="352.565" width="45.9634" height="72" class="st3"/> + </g> + <g id="shape68-275" v:mID="68" v:groupContext="shape" transform="translate(47.371,-30.7354)"> + <title>Sheet.68</title> + <g id="shadow68-276" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <ellipse cx="2.77848" cy="421.786" rx="2.77848" ry="2.77848" class="st2"/> + </g> + <ellipse cx="2.77848" cy="421.786" rx="2.77848" ry="2.77848" class="st13"/> + </g> + <g id="shape69-280" v:mID="69" v:groupContext="shape" transform="translate(30.51,-11.8022)"> + <title>Sheet.69</title> + <v:userDefs> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(1)"/> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(#5b9bd5)"/> + </v:userDefs> + <g id="shadow69-281" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M-0 424.56 L22.42 424.56 L22.42 422.76 L-0 422.76 L-0 424.56 ZM-0 419.11 L22.42 419.11 L22.42 417.31 + L-0 417.31 L-0 419.11 ZM-0 413.65 L22.42 413.65 L22.42 411.84 L-0 411.84 L-0 413.65 Z" + class="st10"/> + </g> + <path d="M-0 424.56 L22.42 424.56 L22.42 422.76 L-0 422.76 L-0 424.56 ZM-0 419.11 L22.42 419.11 L22.42 417.31 L-0 + 417.31 L-0 419.11 ZM-0 413.65 L22.42 413.65 L22.42 411.84 L-0 411.84 L-0 413.65 Z" class="st23"/> + </g> + </g> + <g id="shape70-288" v:mID="70" v:groupContext="shape" transform="translate(201.029,-26.056)"> + <title>Sheet.70</title> + <desc>Backend Server X</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="408.124" width="108" height="32.8815"/> + <rect x="0" y="391.683" width="108" height="32.8815" class="st21"/> + <text x="11.86" y="411.72" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Backend Server X</text> </g> + <g id="shape71-291" v:mID="71" v:groupContext="shape" transform="translate(684.44,239.627) rotate(90)"> + <title>Sheet.71</title> + <path d="M0 424.56 L45 424.56" class="st24"/> + </g> + <g id="shape72-294" v:mID="72" v:groupContext="shape" transform="translate(6.85967,-22.443) rotate(-38.1076)"> + <title>Sheet.72</title> + <path d="M-0 424.56 A96.1331 44.4001 55.03 0 1 68.24 420.56 L68.51 420.79" class="st17"/> + </g> + <g id="shape73-299" v:mID="73" v:groupContext="shape" transform="translate(328.501,-135.937)"> + <title>Rectangle.73</title> + <desc>Key 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="415.565" width="31.5" height="18"/> + <g id="shadow73-300" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + <text x="4.74" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key 1</text> </g> + <g id="shape74-305" v:mID="74" v:groupContext="shape" transform="translate(362.251,-135.937)"> + <title>Rectangle.74</title> + <desc>Action 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="415.565" width="42.75" height="18"/> + <g id="shadow74-306" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + <text x="4.62" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action 1</text> </g> + <g id="shape75-311" v:mID="75" v:groupContext="shape" transform="translate(409.501,-135.937)"> + <title>Rectangle.75</title> + <desc>Key 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="415.565" width="31.5" height="18"/> + <g id="shadow75-312" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + <text x="4.74" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key 2</text> </g> + <g id="shape76-317" v:mID="76" v:groupContext="shape" transform="translate(443.251,-135.937)"> + <title>Rectangle.76</title> + <desc>Action 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="415.565" width="42.75" height="18"/> + <g id="shadow76-318" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + <text x="4.62" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action 2</text> </g> + <g id="shape77-323" v:mID="77" v:groupContext="shape" transform="translate(490.501,-135.937)"> + <title>Rectangle.77</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow77-324" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + </g> + <g id="shape78-328" v:mID="78" v:groupContext="shape" transform="translate(524.251,-135.937)"> + <title>Rectangle.78</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow78-329" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + </g> + <g id="shape79-333" v:mID="79" v:groupContext="shape" transform="translate(328.501,-113.437)"> + <title>Rectangle.79</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow79-334" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + </g> + <g id="shape80-338" v:mID="80" v:groupContext="shape" transform="translate(362.251,-113.437)"> + <title>Rectangle.80</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow80-339" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + </g> + <g id="shape81-343" v:mID="81" v:groupContext="shape" transform="translate(409.501,-113.437)"> + <title>Rectangle.81</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow81-344" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + </g> + <g id="shape82-348" v:mID="82" v:groupContext="shape" transform="translate(443.251,-113.437)"> + <title>Rectangle.82</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow82-349" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + </g> + <g id="shape83-353" v:mID="83" v:groupContext="shape" transform="translate(490.501,-113.437)"> + <title>Rectangle.83</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow83-354" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + </g> + <g id="shape84-358" v:mID="84" v:groupContext="shape" transform="translate(524.251,-113.437)"> + <title>Rectangle.84</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow84-359" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + </g> + <g id="shape85-363" v:mID="85" v:groupContext="shape" transform="translate(328.501,-77.4375)"> + <title>Rectangle.85</title> + <desc>Key x</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="415.565" width="31.5" height="18"/> + <g id="shadow85-364" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + <text x="5.11" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key x</text> </g> + <g id="shape86-369" v:mID="86" v:groupContext="shape" transform="translate(362.251,-77.4375)"> + <title>Rectangle.86</title> + <desc>Action x</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="415.565" width="42.75" height="18"/> + <g id="shadow86-370" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + <text x="4.99" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action x</text> </g> + <g id="shape87-375" v:mID="87" v:groupContext="shape" transform="translate(409.501,-77.4375)"> + <title>Rectangle.87</title> + <desc>Key y</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="415.565" width="31.5" height="18"/> + <g id="shadow87-376" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + <text x="5.01" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key y</text> </g> + <g id="shape88-381" v:mID="88" v:groupContext="shape" transform="translate(443.251,-77.4375)"> + <title>Rectangle.88</title> + <desc>Action y</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="415.565" width="42.75" height="18"/> + <g id="shadow88-382" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + <text x="4.89" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action y</text> </g> + <g id="shape89-387" v:mID="89" v:groupContext="shape" transform="translate(490.501,-77.4375)"> + <title>Rectangle.89</title> + <desc>Key z</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="415.565" width="31.5" height="18"/> + <g id="shadow89-388" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + <text x="5.3" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key z</text> </g> + <g id="shape90-393" v:mID="90" v:groupContext="shape" transform="translate(524.251,-77.4375)"> + <title>Rectangle.90</title> + <desc>Action z</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="415.565" width="42.75" height="18"/> + <g id="shadow90-394" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + <text x="5.18" y="418.56" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action z</text> </g> + <g id="shape91-399" v:mID="91" v:groupContext="shape" transform="translate(328.501,-40.9375)"> + <title>Rectangle.91</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow91-400" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + </g> + <g id="shape92-404" v:mID="92" v:groupContext="shape" transform="translate(362.251,-40.9375)"> + <title>Rectangle.92</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow92-405" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + </g> + <g id="shape93-409" v:mID="93" v:groupContext="shape" transform="translate(409.501,-40.9375)"> + <title>Rectangle.93</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow93-410" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + </g> + <g id="shape94-414" v:mID="94" v:groupContext="shape" transform="translate(443.251,-40.9375)"> + <title>Rectangle.94</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow94-415" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + </g> + <g id="shape95-419" v:mID="95" v:groupContext="shape" transform="translate(490.501,-40.9375)"> + <title>Rectangle.95</title> + <desc>Key N</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.75" cy="415.565" width="31.5" height="18"/> + <g id="shadow95-420" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="31.5" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="31.5" height="18" class="st3"/> + <text x="5.21" y="418.26" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key N</text> </g> + <g id="shape96-425" v:mID="96" v:groupContext="shape" transform="translate(524.251,-40.9375)"> + <title>Rectangle.96</title> + <desc>Action N</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="415.565" width="42.75" height="18"/> + <g id="shadow96-426" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="406.565" width="42.75" height="18" class="st2"/> + </g> + <rect x="0" y="406.565" width="42.75" height="18" class="st3"/> + <text x="5.67" y="418.26" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Action N</text> </g> + <g id="shape97-431" v:mID="97" v:groupContext="shape" transform="translate(326.251,-31.9375)"> + <title>Rectangle.97</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow97-432" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="289.065" width="245.25" height="135.5" class="st6"/> + </g> + <rect x="0" y="289.065" width="245.25" height="135.5" class="st7"/> + </g> + <g id="shape98-436" v:mID="98" v:groupContext="shape" transform="translate(337.501,-162.938)"> + <title>Sheet.98</title> + <desc>Local Table for N Specific Flows Serviced at Node X</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="110.423" cy="418.94" width="220.85" height="11.25"/> + <rect x="0" y="413.315" width="220.846" height="11.25" class="st8"/> + <text x="5.55" y="421.94" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Local Table for N Specific Flows Serviced at Node X</text> </g> + <g id="shape99-439" v:mID="99" v:groupContext="shape" transform="translate(-204.342,-29.4449) rotate(-53.7462)"> + <title>Sheet.99</title> + <path d="M0 424.56 L160.37 424.56" class="st25"/> + </g> + <g id="shape100-445" v:mID="100" v:groupContext="shape" transform="translate(-37.6568,-164.882) rotate(-24.444)"> + <title>Sheet.100</title> + <path d="M0 424.56 L101.71 424.56" class="st25"/> + </g> + <g id="shape101-450" v:mID="101" v:groupContext="shape" transform="translate(464.049,-50.8578) rotate(50.099)"> + <title>Sheet.101</title> + <path d="M0 424.56 L139.8 424.56" class="st25"/> + </g> + <g id="shape102-455" v:mID="102" v:groupContext="shape" transform="translate(372.376,-207.438)"> + <title>Sheet.102</title> + <desc>Supports N Flows</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="67.5" cy="415.565" width="135" height="18"/> + <rect x="0" y="406.565" width="135" height="18" class="st19"/> + <text x="25.15" y="419.17" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Supports N Flows</text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i7.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i7.svg new file mode 100644 index 000000000..98f80005d --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i7.svg @@ -0,0 +1,790 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export efd_i8.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="10.6168in" height="4.81965in" + viewBox="0 0 764.409 347.015" xml:space="preserve" color-interpolation-filters="sRGB" class="st27"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:#ffffff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st2 {fill:none;stroke:#00aeef;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st3 {stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st4 {fill:#000000;font-family:Intel Clear;font-size:0.998566em} + .st5 {fill:#0071c5;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st6 {stroke:#00b050;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st7 {stroke:#004280;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st8 {stroke:#ca8f02;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st9 {stroke:#00aeef;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st10 {fill:#c00000;font-family:Intel Clear;font-size:0.828804em;font-weight:bold} + .st11 {fill:#7f6d00;font-family:Intel Clear;font-size:0.828804em;font-weight:bold} + .st12 {fill:#00b050;stroke:#00b050;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0149927} + .st13 {fill:#004280;stroke:#004280;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0149927} + .st14 {fill:#00b050;stroke:#00b050;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0299855} + .st15 {fill:#ca8f02;stroke:#ca8f02;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0299855} + .st16 {fill:#004280;font-family:Intel Clear;font-size:0.828804em} + .st17 {fill:#ffffff;font-family:Intel Clear;font-size:0.998566em} + .st18 {fill:#ffffff;font-family:Intel Clear;font-size:1.49785em} + .st19 {visibility:visible} + .st20 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st21 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st22 {fill:#feffff;font-family:Symbol;font-size:1.16666em} + .st23 {font-size:1em} + .st24 {font-family:Calibri;font-size:1em} + .st25 {fill:none;stroke:none;stroke-width:0.25} + .st26 {fill:#ffffff;font-family:Calibri;font-size:1.00001em} + .st27 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape3-1" v:mID="3" v:groupContext="shape" transform="translate(27.7836,-307.505)"> + <title>Sheet.3</title> + <path d="M0 329.94 C-0 328.06 1.54 326.52 3.42 326.52 L68.49 326.52 C70.38 326.52 71.91 328.06 71.91 329.94 L71.91 343.6 + C71.91 345.49 70.38 347.02 68.49 347.02 L3.42 347.02 C1.54 347.02 0 345.49 0 343.6 L0 329.94 Z" + class="st1"/> + </g> + <g id="shape4-3" v:mID="4" v:groupContext="shape" transform="translate(27.7836,-307.505)"> + <title>Sheet.4</title> + <path d="M0 329.94 C-0 328.06 1.54 326.52 3.42 326.52 L68.49 326.52 C70.38 326.52 71.91 328.06 71.91 329.94 L71.91 343.6 + C71.91 345.49 70.38 347.02 68.49 347.02 L3.42 347.02 C1.54 347.02 0 345.49 0 343.6 L0 329.94 Z" + class="st2"/> + </g> + <g id="shape5-5" v:mID="5" v:groupContext="shape" transform="translate(50.1544,-309.121)"> + <title>Sheet.5</title> + <desc>Key1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="17.3237" cy="339.824" width="34.65" height="14.3829"/> + <path d="M34.65 332.63 L0 332.63 L0 347.02 L34.65 347.02 L34.65 332.63" class="st3"/> + <text x="3.72" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key1</text> </g> + <g id="shape6-9" v:mID="6" v:groupContext="shape" transform="translate(43.6909,-286.954)"> + <title>Sheet.6</title> + <path d="M0 336.65 L9.81 336.65 L9.81 326.28 L29.44 326.28 L29.44 336.65 L39.26 336.65 L19.63 347.02 L0 336.65 Z" + class="st5"/> + </g> + <g id="shape7-11" v:mID="7" v:groupContext="shape" transform="translate(27.7836,-266.044)"> + <title>Sheet.7</title> + <path d="M0 330.04 C0 328.16 1.52 326.64 3.41 326.64 L68.51 326.64 C70.4 326.64 71.91 328.16 71.91 330.04 L71.91 343.62 + C71.91 345.49 70.4 347.02 68.51 347.02 L3.41 347.02 C1.52 347.02 0 345.49 0 343.62 L0 330.04 Z" + class="st1"/> + </g> + <g id="shape8-13" v:mID="8" v:groupContext="shape" transform="translate(27.7836,-266.044)"> + <title>Sheet.8</title> + <path d="M0 330.04 C0 328.16 1.52 326.64 3.41 326.64 L68.51 326.64 C70.4 326.64 71.91 328.16 71.91 330.04 L71.91 343.62 + C71.91 345.49 70.4 347.02 68.51 347.02 L3.41 347.02 C1.52 347.02 0 345.49 0 343.62 L0 330.04 Z" + class="st2"/> + </g> + <g id="shape9-15" v:mID="9" v:groupContext="shape" transform="translate(50.7572,-267.602)"> + <title>Sheet.9</title> + <desc>hash</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="16.5866" cy="339.824" width="33.18" height="14.3829"/> + <path d="M33.17 332.63 L0 332.63 L0 347.02 L33.17 347.02 L33.17 332.63" class="st3"/> + <text x="3.63" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash</text> </g> + <g id="shape10-19" v:mID="10" v:groupContext="shape" transform="translate(19.0195,-225.183)"> + <title>Sheet.10</title> + <path d="M0 330.74 C0 328.94 1.46 327.48 3.26 327.48 L87.15 327.48 C88.95 327.48 90.4 328.94 90.4 330.74 L90.4 343.76 + C90.4 345.56 88.95 347.02 87.15 347.02 L3.26 347.02 C1.46 347.02 0 345.56 0 343.76 L0 330.74 Z" + class="st1"/> + </g> + <g id="shape11-21" v:mID="11" v:groupContext="shape" transform="translate(19.0195,-225.183)"> + <title>Sheet.11</title> + <path d="M0 330.74 C0 328.94 1.46 327.48 3.26 327.48 L87.15 327.48 C88.95 327.48 90.4 328.94 90.4 330.74 L90.4 343.76 + C90.4 345.56 88.95 347.02 87.15 347.02 L3.26 347.02 C1.46 347.02 0 345.56 0 343.76 L0 330.74 Z" + class="st2"/> + </g> + <g id="shape12-23" v:mID="12" v:groupContext="shape" transform="translate(28.0373,-226.287)"> + <title>Sheet.12</title> + <desc>0x0102ABCD</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="43.3615" cy="339.824" width="86.73" height="14.3829"/> + <path d="M86.72 332.63 L0 332.63 L0 347.02 L86.72 347.02 L86.72 332.63" class="st3"/> + <text x="7.12" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0x0102ABCD</text> </g> + <g id="shape13-27" v:mID="13" v:groupContext="shape" transform="translate(43.6909,-244.775)"> + <title>Sheet.13</title> + <path d="M0 336.71 L9.81 336.71 L9.81 326.4 L29.44 326.4 L29.44 336.71 L39.26 336.71 L19.63 347.02 L0 336.71 Z" + class="st5"/> + </g> + <g id="shape14-29" v:mID="14" v:groupContext="shape" transform="translate(40.7496,-210.444)"> + <title>Sheet.14</title> + <path d="M26.29 334.91 C26.29 338.26 25.84 340.96 25.29 340.96 L14.16 340.96 C13.6 340.96 13.15 343.67 13.15 347.02 C13.15 + 343.67 12.7 340.96 12.14 340.96 L1.01 340.96 C0.46 340.96 0 338.26 0 334.91" class="st6"/> + </g> + <g id="shape15-32" v:mID="15" v:groupContext="shape" transform="translate(125.629,-307.625)"> + <title>Sheet.15</title> + <path d="M0 330.04 C0 328.16 1.52 326.64 3.41 326.64 L68.63 326.64 C70.51 326.64 72.03 328.16 72.03 330.04 L72.03 343.62 + C72.03 345.49 70.51 347.02 68.63 347.02 L3.41 347.02 C1.52 347.02 0 345.49 0 343.62 L0 330.04 Z" + class="st1"/> + </g> + <g id="shape16-34" v:mID="16" v:groupContext="shape" transform="translate(125.629,-307.625)"> + <title>Sheet.16</title> + <path d="M0 330.04 C0 328.16 1.52 326.64 3.41 326.64 L68.63 326.64 C70.51 326.64 72.03 328.16 72.03 330.04 L72.03 343.62 + C72.03 345.49 70.51 347.02 68.63 347.02 L3.41 347.02 C1.52 347.02 0 345.49 0 343.62 L0 330.04 Z" + class="st2"/> + </g> + <g id="shape17-36" v:mID="17" v:groupContext="shape" transform="translate(148.034,-309.155)"> + <title>Sheet.17</title> + <desc>Key2</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="17.3237" cy="339.824" width="34.65" height="14.3829"/> + <path d="M34.65 332.63 L0 332.63 L0 347.02 L34.65 347.02 L34.65 332.63" class="st3"/> + <text x="3.72" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key2</text> </g> + <g id="shape18-40" v:mID="18" v:groupContext="shape" transform="translate(141.536,-286.954)"> + <title>Sheet.18</title> + <path d="M0 336.65 L9.81 336.65 L9.81 326.28 L29.44 326.28 L29.44 336.65 L39.26 336.65 L19.63 347.02 L0 336.65 Z" + class="st5"/> + </g> + <g id="shape19-42" v:mID="19" v:groupContext="shape" transform="translate(125.629,-266.044)"> + <title>Sheet.19</title> + <path d="M0 329.94 C0 328.06 1.54 326.52 3.42 326.52 L68.61 326.52 C70.5 326.52 72.03 328.06 72.03 329.94 L72.03 343.6 + C72.03 345.49 70.5 347.02 68.61 347.02 L3.42 347.02 C1.54 347.02 0 345.49 0 343.6 L0 329.94 Z" class="st1"/> + </g> + <g id="shape20-44" v:mID="20" v:groupContext="shape" transform="translate(125.629,-266.044)"> + <title>Sheet.20</title> + <path d="M0 329.94 C0 328.06 1.54 326.52 3.42 326.52 L68.61 326.52 C70.5 326.52 72.03 328.06 72.03 329.94 L72.03 343.6 + C72.03 345.49 70.5 347.02 68.61 347.02 L3.42 347.02 C1.54 347.02 0 345.49 0 343.6 L0 329.94 Z" class="st2"/> + </g> + <g id="shape21-46" v:mID="21" v:groupContext="shape" transform="translate(148.636,-267.636)"> + <title>Sheet.21</title> + <desc>hash</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="16.5866" cy="339.824" width="33.18" height="14.3829"/> + <path d="M33.17 332.63 L0 332.63 L0 347.02 L33.17 347.02 L33.17 332.63" class="st3"/> + <text x="3.63" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash</text> </g> + <g id="shape22-50" v:mID="22" v:groupContext="shape" transform="translate(116.865,-225.183)"> + <title>Sheet.22</title> + <path d="M0 330.74 C0 328.94 1.46 327.48 3.26 327.48 L87.15 327.48 C88.95 327.48 90.4 328.94 90.4 330.74 L90.4 343.76 + C90.4 345.56 88.95 347.02 87.15 347.02 L3.26 347.02 C1.46 347.02 0 345.56 0 343.76 L0 330.74 Z" + class="st1"/> + </g> + <g id="shape23-52" v:mID="23" v:groupContext="shape" transform="translate(116.865,-225.183)"> + <title>Sheet.23</title> + <path d="M0 330.74 C0 328.94 1.46 327.48 3.26 327.48 L87.15 327.48 C88.95 327.48 90.4 328.94 90.4 330.74 L90.4 343.76 + C90.4 345.56 88.95 347.02 87.15 347.02 L3.26 347.02 C1.46 347.02 0 345.56 0 343.76 L0 330.74 Z" + class="st2"/> + </g> + <g id="shape24-54" v:mID="24" v:groupContext="shape" transform="translate(125.917,-226.322)"> + <title>Sheet.24</title> + <desc>0x0103CDAB</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="43.3615" cy="339.824" width="86.73" height="14.3829"/> + <path d="M86.72 332.63 L0 332.63 L0 347.02 L86.72 347.02 L86.72 332.63" class="st3"/> + <text x="7.12" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0x0103CDAB</text> </g> + <g id="shape25-58" v:mID="25" v:groupContext="shape" transform="translate(141.536,-244.775)"> + <title>Sheet.25</title> + <path d="M0 336.71 L9.81 336.71 L9.81 326.4 L29.44 326.4 L29.44 336.71 L39.26 336.71 L19.63 347.02 L0 336.71 Z" + class="st5"/> + </g> + <g id="shape26-60" v:mID="26" v:groupContext="shape" transform="translate(138.595,-210.444)"> + <title>Sheet.26</title> + <path d="M26.29 334.91 C26.29 338.26 25.84 340.96 25.29 340.96 L14.16 340.96 C13.6 340.96 13.15 343.67 13.15 347.02 C13.15 + 343.67 12.7 340.96 12.14 340.96 L1.01 340.96 C0.46 340.96 0 338.26 0 334.91" class="st7"/> + </g> + <g id="shape27-63" v:mID="27" v:groupContext="shape" transform="translate(221.793,-307.625)"> + <title>Sheet.27</title> + <path d="M0 330.04 C0 328.17 1.53 326.64 3.41 326.64 L68.64 326.64 C70.52 326.64 72.03 328.17 72.03 330.04 L72.03 343.63 + C72.03 345.5 70.52 347.02 68.64 347.02 L3.41 347.02 C1.53 347.02 0 345.5 0 343.63 L0 330.04 Z" class="st1"/> + </g> + <g id="shape28-65" v:mID="28" v:groupContext="shape" transform="translate(221.793,-307.625)"> + <title>Sheet.28</title> + <path d="M0 330.04 C0 328.17 1.53 326.64 3.41 326.64 L68.64 326.64 C70.52 326.64 72.03 328.17 72.03 330.04 L72.03 343.63 + C72.03 345.5 70.52 347.02 68.64 347.02 L3.41 347.02 C1.53 347.02 0 345.5 0 343.63 L0 330.04 Z" class="st2"/> + </g> + <g id="shape29-67" v:mID="29" v:groupContext="shape" transform="translate(244.237,-309.155)"> + <title>Sheet.29</title> + <desc>Key3</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="17.3237" cy="339.824" width="34.65" height="14.3829"/> + <path d="M34.65 332.63 L0 332.63 L0 347.02 L34.65 347.02 L34.65 332.63" class="st3"/> + <text x="3.72" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key3</text> </g> + <g id="shape30-71" v:mID="30" v:groupContext="shape" transform="translate(237.701,-286.954)"> + <title>Sheet.30</title> + <path d="M0 336.65 L9.84 336.65 L9.84 326.28 L29.53 326.28 L29.53 336.65 L39.38 336.65 L19.69 347.02 L0 336.65 Z" + class="st5"/> + </g> + <g id="shape31-73" v:mID="31" v:groupContext="shape" transform="translate(221.793,-266.044)"> + <title>Sheet.31</title> + <path d="M0 329.94 C-0 328.07 1.55 326.52 3.42 326.52 L68.61 326.52 C70.5 326.52 72.03 328.07 72.03 329.94 L72.03 343.6 + C72.03 345.49 70.5 347.02 68.61 347.02 L3.42 347.02 C1.55 347.02 0 345.49 0 343.6 L0 329.94 Z" class="st1"/> + </g> + <g id="shape32-75" v:mID="32" v:groupContext="shape" transform="translate(221.793,-266.044)"> + <title>Sheet.32</title> + <path d="M0 329.94 C-0 328.07 1.55 326.52 3.42 326.52 L68.61 326.52 C70.5 326.52 72.03 328.07 72.03 329.94 L72.03 343.6 + C72.03 345.49 70.5 347.02 68.61 347.02 L3.42 347.02 C1.55 347.02 0 345.49 0 343.6 L0 329.94 Z" class="st2"/> + </g> + <g id="shape33-77" v:mID="33" v:groupContext="shape" transform="translate(244.84,-267.636)"> + <title>Sheet.33</title> + <desc>hash</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="16.5866" cy="339.824" width="33.18" height="14.3829"/> + <path d="M33.17 332.63 L0 332.63 L0 347.02 L33.17 347.02 L33.17 332.63" class="st3"/> + <text x="3.63" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash</text> </g> + <g id="shape34-81" v:mID="34" v:groupContext="shape" transform="translate(213.029,-225.183)"> + <title>Sheet.34</title> + <path d="M0 330.75 C0 328.95 1.47 327.48 3.27 327.48 L87.27 327.48 C89.07 327.48 90.52 328.95 90.52 330.75 L90.52 343.76 + C90.52 345.56 89.07 347.02 87.27 347.02 L3.27 347.02 C1.47 347.02 0 345.56 0 343.76 L0 330.75 Z" + class="st1"/> + </g> + <g id="shape35-83" v:mID="35" v:groupContext="shape" transform="translate(213.029,-225.183)"> + <title>Sheet.35</title> + <path d="M0 330.75 C0 328.95 1.47 327.48 3.27 327.48 L87.27 327.48 C89.07 327.48 90.52 328.95 90.52 330.75 L90.52 343.76 + C90.52 345.56 89.07 347.02 87.27 347.02 L3.27 347.02 C1.47 347.02 0 345.56 0 343.76 L0 330.75 Z" + class="st2"/> + </g> + <g id="shape36-85" v:mID="36" v:groupContext="shape" transform="translate(222.002,-226.322)"> + <title>Sheet.36</title> + <desc>0x0102BAAD</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="43.4787" cy="339.824" width="86.96" height="14.3829"/> + <path d="M86.96 332.63 L0 332.63 L0 347.02 L86.96 347.02 L86.96 332.63" class="st3"/> + <text x="7.13" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0x0102BAAD</text> </g> + <g id="shape37-89" v:mID="37" v:groupContext="shape" transform="translate(237.701,-244.775)"> + <title>Sheet.37</title> + <path d="M0 336.71 L9.84 336.71 L9.84 326.4 L29.53 326.4 L29.53 336.71 L39.38 336.71 L19.69 347.02 L0 336.71 Z" + class="st5"/> + </g> + <g id="shape38-91" v:mID="38" v:groupContext="shape" transform="translate(234.759,-210.444)"> + <title>Sheet.38</title> + <path d="M26.41 334.91 C26.41 338.26 25.96 340.96 25.41 340.96 L14.22 340.96 C13.66 340.96 13.21 343.67 13.21 347.02 + C13.21 343.67 12.76 340.96 12.2 340.96 L1.01 340.96 C0.46 340.96 0 338.26 0 334.91" class="st6"/> + </g> + <g id="shape39-94" v:mID="39" v:groupContext="shape" transform="translate(319.759,-307.625)"> + <title>Sheet.39</title> + <path d="M0 330.04 C0 328.17 1.53 326.64 3.41 326.64 L68.52 326.64 C70.4 326.64 71.91 328.17 71.91 330.04 L71.91 343.63 + C71.91 345.5 70.4 347.02 68.52 347.02 L3.41 347.02 C1.53 347.02 0 345.5 0 343.63 L0 330.04 Z" class="st1"/> + </g> + <g id="shape40-96" v:mID="40" v:groupContext="shape" transform="translate(319.759,-307.625)"> + <title>Sheet.40</title> + <path d="M0 330.04 C0 328.17 1.53 326.64 3.41 326.64 L68.52 326.64 C70.4 326.64 71.91 328.17 71.91 330.04 L71.91 343.63 + C71.91 345.5 70.4 347.02 68.52 347.02 L3.41 347.02 C1.53 347.02 0 345.5 0 343.63 L0 330.04 Z" class="st2"/> + </g> + <g id="shape41-98" v:mID="41" v:groupContext="shape" transform="translate(342.125,-309.155)"> + <title>Sheet.41</title> + <desc>Key4</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="17.3237" cy="339.824" width="34.65" height="14.3829"/> + <path d="M34.65 332.63 L0 332.63 L0 347.02 L34.65 347.02 L34.65 332.63" class="st3"/> + <text x="3.72" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key4</text> </g> + <g id="shape42-102" v:mID="42" v:groupContext="shape" transform="translate(335.666,-286.954)"> + <title>Sheet.42</title> + <path d="M0 336.65 L9.81 336.65 L9.81 326.28 L29.44 326.28 L29.44 336.65 L39.26 336.65 L19.63 347.02 L0 336.65 Z" + class="st5"/> + </g> + <g id="shape43-104" v:mID="43" v:groupContext="shape" transform="translate(319.759,-266.044)"> + <title>Sheet.43</title> + <path d="M0 329.94 C0 328.07 1.55 326.52 3.42 326.52 L68.49 326.52 C70.38 326.52 71.91 328.07 71.91 329.94 L71.91 343.6 + C71.91 345.49 70.38 347.02 68.49 347.02 L3.42 347.02 C1.55 347.02 0 345.49 0 343.6 L0 329.94 Z" + class="st1"/> + </g> + <g id="shape44-106" v:mID="44" v:groupContext="shape" transform="translate(319.759,-266.044)"> + <title>Sheet.44</title> + <path d="M0 329.94 C0 328.07 1.55 326.52 3.42 326.52 L68.49 326.52 C70.38 326.52 71.91 328.07 71.91 329.94 L71.91 343.6 + C71.91 345.49 70.38 347.02 68.49 347.02 L3.42 347.02 C1.55 347.02 0 345.49 0 343.6 L0 329.94 Z" + class="st2"/> + </g> + <g id="shape45-108" v:mID="45" v:groupContext="shape" transform="translate(342.728,-267.636)"> + <title>Sheet.45</title> + <desc>hash</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="16.5866" cy="339.824" width="33.18" height="14.3829"/> + <path d="M33.17 332.63 L0 332.63 L0 347.02 L33.17 347.02 L33.17 332.63" class="st3"/> + <text x="3.63" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash</text> </g> + <g id="shape46-112" v:mID="46" v:groupContext="shape" transform="translate(310.995,-225.183)"> + <title>Sheet.46</title> + <path d="M0 330.75 C0 328.95 1.47 327.48 3.27 327.48 L87.15 327.48 C88.95 327.48 90.4 328.95 90.4 330.75 L90.4 343.76 + C90.4 345.56 88.95 347.02 87.15 347.02 L3.27 347.02 C1.47 347.02 0 345.56 0 343.76 L0 330.75 Z" + class="st1"/> + </g> + <g id="shape47-114" v:mID="47" v:groupContext="shape" transform="translate(310.995,-225.183)"> + <title>Sheet.47</title> + <path d="M0 330.75 C0 328.95 1.47 327.48 3.27 327.48 L87.15 327.48 C88.95 327.48 90.4 328.95 90.4 330.75 L90.4 343.76 + C90.4 345.56 88.95 347.02 87.15 347.02 L3.27 347.02 C1.47 347.02 0 345.56 0 343.76 L0 330.75 Z" + class="st2"/> + </g> + <g id="shape48-116" v:mID="48" v:groupContext="shape" transform="translate(321.689,-226.322)"> + <title>Sheet.48</title> + <desc>0x0104BEEF</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="41.4183" cy="339.824" width="82.84" height="14.3829"/> + <path d="M82.84 332.63 L0 332.63 L0 347.02 L82.84 347.02 L82.84 332.63" class="st3"/> + <text x="6.87" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0x0104BEEF</text> </g> + <g id="shape49-120" v:mID="49" v:groupContext="shape" transform="translate(335.666,-244.775)"> + <title>Sheet.49</title> + <path d="M0 336.71 L9.81 336.71 L9.81 326.4 L29.44 326.4 L29.44 336.71 L39.26 336.71 L19.63 347.02 L0 336.71 Z" + class="st5"/> + </g> + <g id="shape50-122" v:mID="50" v:groupContext="shape" transform="translate(332.725,-210.444)"> + <title>Sheet.50</title> + <path d="M26.29 334.91 C26.29 338.27 25.84 340.96 25.29 340.96 L14.17 340.96 C13.61 340.96 13.15 343.67 13.15 347.02 + C13.15 343.67 12.7 340.96 12.14 340.96 L1.02 340.96 C0.47 340.96 0 338.27 0 334.91" class="st6"/> + </g> + <g id="shape51-125" v:mID="51" v:groupContext="shape" transform="translate(416.884,-307.625)"> + <title>Sheet.51</title> + <path d="M0 330.04 C0 328.17 1.53 326.64 3.41 326.64 L68.52 326.64 C70.4 326.64 71.91 328.17 71.91 330.04 L71.91 343.63 + C71.91 345.5 70.4 347.02 68.52 347.02 L3.41 347.02 C1.53 347.02 0 345.5 0 343.63 L0 330.04 Z" class="st1"/> + </g> + <g id="shape52-127" v:mID="52" v:groupContext="shape" transform="translate(416.884,-307.625)"> + <title>Sheet.52</title> + <path d="M0 330.04 C0 328.17 1.53 326.64 3.41 326.64 L68.52 326.64 C70.4 326.64 71.91 328.17 71.91 330.04 L71.91 343.63 + C71.91 345.5 70.4 347.02 68.52 347.02 L3.41 347.02 C1.53 347.02 0 345.5 0 343.63 L0 330.04 Z" class="st2"/> + </g> + <g id="shape53-129" v:mID="53" v:groupContext="shape" transform="translate(439.255,-309.155)"> + <title>Sheet.53</title> + <desc>Key5</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="17.3237" cy="339.824" width="34.65" height="14.3829"/> + <path d="M34.65 332.63 L0 332.63 L0 347.02 L34.65 347.02 L34.65 332.63" class="st3"/> + <text x="3.72" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key5</text> </g> + <g id="shape54-133" v:mID="54" v:groupContext="shape" transform="translate(432.791,-286.954)"> + <title>Sheet.54</title> + <path d="M0 336.65 L9.81 336.65 L9.81 326.28 L29.44 326.28 L29.44 336.65 L39.26 336.65 L19.63 347.02 L0 336.65 Z" + class="st5"/> + </g> + <g id="shape55-135" v:mID="55" v:groupContext="shape" transform="translate(416.884,-266.044)"> + <title>Sheet.55</title> + <path d="M0 329.94 C0 328.07 1.55 326.52 3.42 326.52 L68.49 326.52 C70.38 326.52 71.91 328.07 71.91 329.94 L71.91 343.6 + C71.91 345.49 70.38 347.02 68.49 347.02 L3.42 347.02 C1.55 347.02 0 345.49 0 343.6 L0 329.94 Z" + class="st1"/> + </g> + <g id="shape56-137" v:mID="56" v:groupContext="shape" transform="translate(416.884,-266.044)"> + <title>Sheet.56</title> + <path d="M0 329.94 C0 328.07 1.55 326.52 3.42 326.52 L68.49 326.52 C70.38 326.52 71.91 328.07 71.91 329.94 L71.91 343.6 + C71.91 345.49 70.38 347.02 68.49 347.02 L3.42 347.02 C1.55 347.02 0 345.49 0 343.6 L0 329.94 Z" + class="st2"/> + </g> + <g id="shape57-139" v:mID="57" v:groupContext="shape" transform="translate(439.858,-267.636)"> + <title>Sheet.57</title> + <desc>hash</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="16.5866" cy="339.824" width="33.18" height="14.3829"/> + <path d="M33.17 332.63 L0 332.63 L0 347.02 L33.17 347.02 L33.17 332.63" class="st3"/> + <text x="3.63" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash</text> </g> + <g id="shape58-143" v:mID="58" v:groupContext="shape" transform="translate(408.12,-225.183)"> + <title>Sheet.58</title> + <path d="M0 330.75 C0 328.95 1.47 327.48 3.27 327.48 L87.15 327.48 C88.95 327.48 90.4 328.95 90.4 330.75 L90.4 343.76 + C90.4 345.56 88.95 347.02 87.15 347.02 L3.27 347.02 C1.47 347.02 0 345.56 0 343.76 L0 330.75 Z" + class="st1"/> + </g> + <g id="shape59-145" v:mID="59" v:groupContext="shape" transform="translate(408.12,-225.183)"> + <title>Sheet.59</title> + <path d="M0 330.75 C0 328.95 1.47 327.48 3.27 327.48 L87.15 327.48 C88.95 327.48 90.4 328.95 90.4 330.75 L90.4 343.76 + C90.4 345.56 88.95 347.02 87.15 347.02 L3.27 347.02 C1.47 347.02 0 345.56 0 343.76 L0 330.75 Z" + class="st2"/> + </g> + <g id="shape60-147" v:mID="60" v:groupContext="shape" transform="translate(416.778,-226.322)"> + <title>Sheet.60</title> + <desc>0x0103DABD</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="43.7817" cy="339.824" width="87.57" height="14.3829"/> + <path d="M87.56 332.63 L0 332.63 L0 347.02 L87.56 347.02 L87.56 332.63" class="st3"/> + <text x="7.17" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0x0103DABD</text> </g> + <g id="shape61-151" v:mID="61" v:groupContext="shape" transform="translate(432.791,-244.775)"> + <title>Sheet.61</title> + <path d="M0 336.71 L9.81 336.71 L9.81 326.4 L29.44 326.4 L29.44 336.71 L39.26 336.71 L19.63 347.02 L0 336.71 Z" + class="st5"/> + </g> + <g id="shape62-153" v:mID="62" v:groupContext="shape" transform="translate(429.85,-210.444)"> + <title>Sheet.62</title> + <path d="M26.29 334.91 C26.29 338.27 25.84 340.96 25.29 340.96 L14.17 340.96 C13.61 340.96 13.15 343.67 13.15 347.02 + C13.15 343.67 12.7 340.96 12.14 340.96 L1.02 340.96 C0.47 340.96 0 338.27 0 334.91" class="st7"/> + </g> + <g id="shape63-156" v:mID="63" v:groupContext="shape" transform="translate(514.489,-307.625)"> + <title>Sheet.63</title> + <path d="M0 330.06 C-0 328.17 1.53 326.64 3.42 326.64 L68.64 326.64 C70.53 326.64 72.03 328.17 72.03 330.06 L72.03 343.63 + C72.03 345.52 70.53 347.02 68.64 347.02 L3.42 347.02 C1.53 347.02 0 345.52 0 343.63 L0 330.06 Z" + class="st1"/> + </g> + <g id="shape64-158" v:mID="64" v:groupContext="shape" transform="translate(514.489,-307.625)"> + <title>Sheet.64</title> + <path d="M0 330.06 C-0 328.17 1.53 326.64 3.42 326.64 L68.64 326.64 C70.53 326.64 72.03 328.17 72.03 330.06 L72.03 343.63 + C72.03 345.52 70.53 347.02 68.64 347.02 L3.42 347.02 C1.53 347.02 0 345.52 0 343.63 L0 330.06 Z" + class="st2"/> + </g> + <g id="shape65-160" v:mID="65" v:groupContext="shape" transform="translate(536.883,-309.19)"> + <title>Sheet.65</title> + <desc>Key6</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="17.3237" cy="339.824" width="34.65" height="14.3829"/> + <path d="M34.65 332.63 L0 332.63 L0 347.02 L34.65 347.02 L34.65 332.63" class="st3"/> + <text x="3.72" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key6</text> </g> + <g id="shape66-164" v:mID="66" v:groupContext="shape" transform="translate(530.396,-287.074)"> + <title>Sheet.66</title> + <path d="M0 336.71 L9.81 336.71 L9.81 326.4 L29.44 326.4 L29.44 336.71 L39.26 336.71 L19.63 347.02 L0 336.71 Z" + class="st5"/> + </g> + <g id="shape67-166" v:mID="67" v:groupContext="shape" transform="translate(514.489,-266.044)"> + <title>Sheet.67</title> + <path d="M0 329.94 C0 328.08 1.56 326.52 3.42 326.52 L68.61 326.52 C70.5 326.52 72.03 328.08 72.03 329.94 L72.03 343.6 + C72.03 345.49 70.5 347.02 68.61 347.02 L3.42 347.02 C1.56 347.02 0 345.49 0 343.6 L0 329.94 Z" class="st1"/> + </g> + <g id="shape68-168" v:mID="68" v:groupContext="shape" transform="translate(514.489,-266.044)"> + <title>Sheet.68</title> + <path d="M0 329.94 C0 328.08 1.56 326.52 3.42 326.52 L68.61 326.52 C70.5 326.52 72.03 328.08 72.03 329.94 L72.03 343.6 + C72.03 345.49 70.5 347.02 68.61 347.02 L3.42 347.02 C1.56 347.02 0 345.49 0 343.6 L0 329.94 Z" class="st2"/> + </g> + <g id="shape69-170" v:mID="69" v:groupContext="shape" transform="translate(537.486,-267.671)"> + <title>Sheet.69</title> + <desc>hash</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="16.5866" cy="339.824" width="33.18" height="14.3829"/> + <path d="M33.17 332.63 L0 332.63 L0 347.02 L33.17 347.02 L33.17 332.63" class="st3"/> + <text x="3.63" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash</text> </g> + <g id="shape70-174" v:mID="70" v:groupContext="shape" transform="translate(505.725,-225.183)"> + <title>Sheet.70</title> + <path d="M0 330.75 C0 328.95 1.47 327.48 3.27 327.48 L87.16 327.48 C88.96 327.48 90.4 328.95 90.4 330.75 L90.4 343.78 + C90.4 345.58 88.96 347.02 87.16 347.02 L3.27 347.02 C1.47 347.02 0 345.58 0 343.78 L0 330.75 Z" + class="st1"/> + </g> + <g id="shape71-176" v:mID="71" v:groupContext="shape" transform="translate(505.725,-225.183)"> + <title>Sheet.71</title> + <path d="M0 330.75 C0 328.95 1.47 327.48 3.27 327.48 L87.16 327.48 C88.96 327.48 90.4 328.95 90.4 330.75 L90.4 343.78 + C90.4 345.58 88.96 347.02 87.16 347.02 L3.27 347.02 C1.47 347.02 0 345.58 0 343.78 L0 330.75 Z" + class="st2"/> + </g> + <g id="shape72-178" v:mID="72" v:groupContext="shape" transform="translate(514.766,-226.356)"> + <title>Sheet.72</title> + <desc>0x0102ADCB</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="43.3615" cy="339.824" width="86.73" height="14.3829"/> + <path d="M86.72 332.63 L0 332.63 L0 347.02 L86.72 347.02 L86.72 332.63" class="st3"/> + <text x="7.12" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0x0102ADCB</text> </g> + <g id="shape73-182" v:mID="73" v:groupContext="shape" transform="translate(530.396,-244.775)"> + <title>Sheet.73</title> + <path d="M0 336.65 L9.81 336.65 L9.81 326.28 L29.44 326.28 L29.44 336.65 L39.26 336.65 L19.63 347.02 L0 336.65 Z" + class="st5"/> + </g> + <g id="shape74-184" v:mID="74" v:groupContext="shape" transform="translate(527.455,-210.564)"> + <title>Sheet.74</title> + <path d="M26.29 335.03 C26.29 338.36 25.87 341.02 25.3 341.02 L14.17 341.02 C13.6 341.02 13.15 343.72 13.15 347.02 C13.15 + 343.72 12.73 341.02 12.16 341.02 L1.02 341.02 C0.45 341.02 0 338.36 0 335.03" class="st6"/> + </g> + <g id="shape75-187" v:mID="75" v:groupContext="shape" transform="translate(610.653,-307.505)"> + <title>Sheet.75</title> + <path d="M0 329.94 C0 328.08 1.56 326.52 3.42 326.52 L68.61 326.52 C70.5 326.52 72.03 328.08 72.03 329.94 L72.03 343.6 + C72.03 345.49 70.5 347.02 68.61 347.02 L3.42 347.02 C1.56 347.02 0 345.49 0 343.6 L0 329.94 Z" class="st1"/> + </g> + <g id="shape76-189" v:mID="76" v:groupContext="shape" transform="translate(610.653,-307.505)"> + <title>Sheet.76</title> + <path d="M0 329.94 C0 328.08 1.56 326.52 3.42 326.52 L68.61 326.52 C70.5 326.52 72.03 328.08 72.03 329.94 L72.03 343.6 + C72.03 345.49 70.5 347.02 68.61 347.02 L3.42 347.02 C1.56 347.02 0 345.49 0 343.6 L0 329.94 Z" class="st2"/> + </g> + <g id="shape77-191" v:mID="77" v:groupContext="shape" transform="translate(633.086,-309.121)"> + <title>Sheet.77</title> + <desc>Key7</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="17.3237" cy="339.824" width="34.65" height="14.3829"/> + <path d="M34.65 332.63 L0 332.63 L0 347.02 L34.65 347.02 L34.65 332.63" class="st3"/> + <text x="3.72" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key7</text> </g> + <g id="shape78-195" v:mID="78" v:groupContext="shape" transform="translate(626.561,-286.954)"> + <title>Sheet.78</title> + <path d="M0 336.65 L9.84 336.65 L9.84 326.28 L29.53 326.28 L29.53 336.65 L39.38 336.65 L19.69 347.02 L0 336.65 Z" + class="st5"/> + </g> + <g id="shape79-197" v:mID="79" v:groupContext="shape" transform="translate(610.653,-266.044)"> + <title>Sheet.79</title> + <path d="M0 330.06 C-0 328.17 1.53 326.64 3.42 326.64 L68.64 326.64 C70.53 326.64 72.03 328.17 72.03 330.06 L72.03 343.63 + C72.03 345.52 70.53 347.02 68.64 347.02 L3.42 347.02 C1.53 347.02 0 345.52 0 343.63 L0 330.06 Z" + class="st1"/> + </g> + <g id="shape80-199" v:mID="80" v:groupContext="shape" transform="translate(610.653,-266.044)"> + <title>Sheet.80</title> + <path d="M0 330.06 C-0 328.17 1.53 326.64 3.42 326.64 L68.64 326.64 C70.53 326.64 72.03 328.17 72.03 330.06 L72.03 343.63 + C72.03 345.52 70.53 347.02 68.64 347.02 L3.42 347.02 C1.53 347.02 0 345.52 0 343.63 L0 330.06 Z" + class="st2"/> + </g> + <g id="shape81-201" v:mID="81" v:groupContext="shape" transform="translate(633.689,-267.602)"> + <title>Sheet.81</title> + <desc>hash</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="16.5866" cy="339.824" width="33.18" height="14.3829"/> + <path d="M33.17 332.63 L0 332.63 L0 347.02 L33.17 347.02 L33.17 332.63" class="st3"/> + <text x="3.63" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash</text> </g> + <g id="shape82-205" v:mID="82" v:groupContext="shape" transform="translate(601.889,-225.183)"> + <title>Sheet.82</title> + <path d="M0 330.75 C0 328.95 1.47 327.48 3.27 327.48 L87.28 327.48 C89.08 327.48 90.52 328.95 90.52 330.75 L90.52 343.78 + C90.52 345.58 89.08 347.02 87.28 347.02 L3.27 347.02 C1.47 347.02 0 345.58 0 343.78 L0 330.75 Z" + class="st1"/> + </g> + <g id="shape83-207" v:mID="83" v:groupContext="shape" transform="translate(601.889,-225.183)"> + <title>Sheet.83</title> + <path d="M0 330.75 C0 328.95 1.47 327.48 3.27 327.48 L87.28 327.48 C89.08 327.48 90.52 328.95 90.52 330.75 L90.52 343.78 + C90.52 345.58 89.08 347.02 87.28 347.02 L3.27 347.02 C1.47 347.02 0 345.58 0 343.78 L0 330.75 Z" + class="st2"/> + </g> + <g id="shape84-209" v:mID="84" v:groupContext="shape" transform="translate(610.969,-226.287)"> + <title>Sheet.84</title> + <desc>0x0104DBCA</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="43.3615" cy="339.824" width="86.73" height="14.3829"/> + <path d="M86.72 332.63 L0 332.63 L0 347.02 L86.72 347.02 L86.72 332.63" class="st3"/> + <text x="7.12" y="343.42" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0x0104DBCA</text> </g> + <g id="shape85-213" v:mID="85" v:groupContext="shape" transform="translate(626.561,-244.775)"> + <title>Sheet.85</title> + <path d="M0 336.71 L9.84 336.71 L9.84 326.4 L29.53 326.4 L29.53 336.71 L39.38 336.71 L19.69 347.02 L0 336.71 Z" + class="st5"/> + </g> + <g id="shape86-215" v:mID="86" v:groupContext="shape" transform="translate(623.619,-210.444)"> + <title>Sheet.86</title> + <path d="M26.41 334.91 C26.41 338.27 25.96 340.96 25.42 340.96 L14.23 340.96 C13.69 340.96 13.21 343.69 13.21 347.02 + C13.21 343.69 12.76 340.96 12.22 340.96 L1.02 340.96 C0.48 340.96 0 338.27 0 334.91" class="st8"/> + </g> + <g id="shape87-218" v:mID="87" v:groupContext="shape" transform="translate(242.323,-81.6288)"> + <title>Sheet.87</title> + <path d="M0 281.23 L0 347.02 L41.18 347.02 L41.18 281.23 L0 281.23 L0 281.23 Z" class="st1"/> + </g> + <g id="shape88-220" v:mID="88" v:groupContext="shape" transform="translate(247.009,-81.6288)"> + <title>Sheet.88</title> + <path d="M0 281.23 L41.18 281.23 L41.18 347.02 L0 347.02 L0 281.23" class="st9"/> + </g> + <g id="shape89-223" v:mID="89" v:groupContext="shape" transform="translate(245.254,-132.398)"> + <title>Sheet.89</title> + <desc>0x0102</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="21.3211" cy="341.046" width="42.65" height="11.9384"/> + <path d="M42.64 335.08 L0 335.08 L0 347.02 L42.64 347.02 L42.64 335.08" class="st3"/> + <text x="4" y="344.03" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0x0102</text> </g> + <g id="shape90-227" v:mID="90" v:groupContext="shape" transform="translate(245.015,-82.7016)"> + <title>Sheet.90</title> + <desc>4</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.79425" cy="341.046" width="9.59" height="11.9384"/> + <path d="M9.59 335.08 L0 335.08 L0 347.02 L9.59 347.02 L9.59 335.08" class="st3"/> + <text x="1.84" y="344.03" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>4</text> </g> + <g id="shape91-231" v:mID="91" v:groupContext="shape" transform="translate(336.326,-81.6288)"> + <title>Sheet.91</title> + <path d="M0 281.23 L0 347.02 L41.18 347.02 L41.18 281.23 L0 281.23 L0 281.23 Z" class="st1"/> + </g> + <g id="shape92-233" v:mID="92" v:groupContext="shape" transform="translate(339.598,-81.6288)"> + <title>Sheet.92</title> + <path d="M0 281.23 L41.18 281.23 L41.18 347.02 L0 347.02 L0 281.23" class="st9"/> + </g> + <g id="shape93-236" v:mID="93" v:groupContext="shape" transform="translate(339.264,-132.398)"> + <title>Sheet.93</title> + <desc>0x0103</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="21.3211" cy="341.046" width="42.65" height="11.9384"/> + <path d="M42.64 335.08 L0 335.08 L0 347.02 L42.64 347.02 L42.64 335.08" class="st3"/> + <text x="4" y="344.03" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0x0103</text> </g> + <g id="shape94-240" v:mID="94" v:groupContext="shape" transform="translate(339.024,-82.7016)"> + <title>Sheet.94</title> + <desc>2</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.79425" cy="341.046" width="9.59" height="11.9384"/> + <path d="M9.59 335.08 L0 335.08 L0 347.02 L9.59 347.02 L9.59 335.08" class="st3"/> + <text x="1.84" y="344.03" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>2</text> </g> + <g id="shape95-244" v:mID="95" v:groupContext="shape" transform="translate(438.598,-81.5089)"> + <title>Sheet.95</title> + <path d="M0 281.23 L0 347.02 L41.18 347.02 L41.18 281.23 L0 281.23 L0 281.23 Z" class="st1"/> + </g> + <g id="shape96-246" v:mID="96" v:groupContext="shape" transform="translate(438.598,-81.5089)"> + <title>Sheet.96</title> + <path d="M0 281.23 L41.18 281.23 L41.18 347.02 L0 347.02 L0 281.23" class="st9"/> + </g> + <g id="shape97-249" v:mID="97" v:groupContext="shape" transform="translate(437.81,-132.27)"> + <title>Sheet.97</title> + <desc>0x0104</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="21.3211" cy="341.046" width="42.65" height="11.9384"/> + <path d="M42.64 335.08 L0 335.08 L0 347.02 L42.64 347.02 L42.64 335.08" class="st3"/> + <text x="4" y="344.03" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0x0104</text> </g> + <g id="shape98-253" v:mID="98" v:groupContext="shape" transform="translate(437.57,-82.5735)"> + <title>Sheet.98</title> + <desc>1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="4.79425" cy="341.046" width="9.59" height="11.9384"/> + <path d="M9.59 335.08 L0 335.08 L0 347.02 L9.59 347.02 L9.59 335.08" class="st3"/> + <text x="1.84" y="344.03" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>1</text> </g> + <g id="shape99-257" v:mID="99" v:groupContext="shape" transform="translate(53.5505,-147.924)"> + <title>Sheet.99</title> + <path d="M0.59 283.52 L206.27 343.39 L205.7 345.34 L0 285.48 L0.59 283.52 L0.59 283.52 ZM205.85 341.14 L210.88 345.79 + L204.14 347.02 L205.85 341.14 L205.85 341.14 Z" class="st12"/> + </g> + <g id="shape100-259" v:mID="100" v:groupContext="shape" transform="translate(151.516,-147.924)"> + <title>Sheet.100</title> + <path d="M0.59 283.52 L202.41 343.41 L201.83 345.35 L0 285.48 L0.59 283.52 L0.59 283.52 ZM202.01 341.16 L207.01 345.83 + L200.27 347.02 L202.01 341.16 L202.01 341.16 Z" class="st13"/> + </g> + <g id="shape101-261" v:mID="101" v:groupContext="shape" transform="translate(246.975,-147.37)"> + <title>Sheet.101</title> + <path d="M2 283.72 L15.77 341.83 L13.79 342.3 L0 284.18 L2 283.72 L2 283.72 ZM17.53 340.36 L15.97 347.02 L11.57 341.77 + L17.53 340.36 L17.53 340.36 Z" class="st12"/> + </g> + <g id="shape102-263" v:mID="102" v:groupContext="shape" transform="translate(262.972,-147.37)"> + <title>Sheet.102</title> + <path d="M82.31 283.13 L3.45 343.12 L4.68 344.74 L83.54 284.76 L82.31 283.13 L82.31 283.13 ZM3.02 340.89 L0 347.02 L6.74 + 345.74 L3.02 340.89 L3.02 340.89 Z" class="st12"/> + </g> + <g id="shape103-265" v:mID="103" v:groupContext="shape" transform="translate(358.537,-149.107)"> + <title>Sheet.103</title> + <path d="M83.92 284.85 L3.53 343.2 L4.73 344.84 L85.12 286.5 L83.92 284.85 L83.92 284.85 ZM3.15 340.95 L0 347.02 L6.75 + 345.89 L3.15 340.95 L3.15 340.95 Z" class="st13"/> + </g> + <g id="shape104-267" v:mID="104" v:groupContext="shape" transform="translate(264.413,-147.534)"> + <title>Sheet.104</title> + <path d="M275.95 283 L4.77 343.27 L5.22 345.25 L276.37 285 L275.95 283 L275.95 283 ZM5.31 341.05 L0 345.37 L6.66 347.02 + L5.31 341.05 L5.31 341.05 Z" class="st14"/> + </g> + <g id="shape105-269" v:mID="105" v:groupContext="shape" transform="translate(456.982,-148.103)"> + <title>Sheet.105</title> + <path d="M179.48 283.72 L4.5 343.48 L5.16 345.43 L180.14 285.66 L179.48 283.72 L179.48 283.72 ZM4.8 341.23 L0 346.12 + L6.81 347.02 L4.8 341.23 L4.8 341.23 Z" class="st15"/> + </g> + <g id="shape106-271" v:mID="106" v:groupContext="shape" transform="translate(335.628,-18)"> + <title>Sheet.106</title> + <path d="M0 309.64 C0 305.52 2.99 302.16 6.65 302.16 L14.2 302.16 L8.01 284.85 L35.48 302.16 L78.47 302.16 C82.15 302.16 + 85.12 305.52 85.12 309.64 L85.12 309.64 L85.12 320.85 L85.12 339.54 C85.12 343.68 82.15 347.02 78.47 347.02 + L35.48 347.02 L14.2 347.02 L14.2 347.02 L6.65 347.02 C2.99 347.02 0 343.68 0 339.54 L0 320.85 L0 309.64 + L0 309.64 Z" class="st5"/> + </g> + <g id="shape109-273" v:mID="109" v:groupContext="shape" transform="translate(157.564,-62.4234)"> + <title>Sheet.109</title> + <path d="M16.21 347.02 C11.74 347.02 8.1 346.42 8.1 345.67 L8.1 303.49 C8.1 302.75 4.49 302.14 0 302.14 C4.49 302.14 + 8.1 301.54 8.1 300.79 L8.1 258.61 C8.1 257.88 11.74 257.26 16.21 257.26" class="st7"/> + </g> + <g id="shape110-276" v:mID="110" v:groupContext="shape" transform="translate(113.844,-100.157)"> + <title>Sheet.110</title> + <desc>Groups</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="20.2175" cy="341.046" width="40.44" height="11.9384"/> + <path d="M40.44 335.08 L0 335.08 L0 347.02 L40.44 347.02 L40.44 335.08" class="st3"/> + <text x="3.85" y="344.03" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Groups</text> </g> + <g id="shape111-280" v:mID="111" v:groupContext="shape" transform="translate(196.718,-76.2186)"> + <title>Sheet.111</title> + <path d="M0 331.97 C0 330.32 2.27 328.96 5.04 328.96 L37.61 328.96 L60.43 284.85 L53.72 328.96 L59.43 328.96 C62.22 328.96 + 64.47 330.32 64.47 331.97 L64.47 331.97 L64.47 336.48 L64.47 344.01 C64.47 345.67 62.22 347.02 59.43 347.02 + L53.72 347.02 L37.61 347.02 L37.61 347.02 L5.04 347.02 C2.27 347.02 0 345.67 0 344.01 L0 336.48 L0 331.97 + L0 331.97 Z" class="st5"/> + </g> + <g id="shape112-282" v:mID="112" v:groupContext="shape" transform="translate(196.65,-80.2991)"> + <title>Sheet.112</title> + <desc>group id</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="27.7691" cy="339.824" width="55.54" height="14.3829"/> + <path d="M55.54 332.63 L0 332.63 L0 347.02 L55.54 347.02 L55.54 332.63" class="st3"/> + <text x="5.09" y="343.42" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>group id</text> </g> + <g id="shape114-286" v:mID="114" v:groupContext="shape" transform="translate(506.433,-128.007)"> + <title>Sheet.114</title> + <desc>-</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="6.63728" cy="336.229" width="13.28" height="21.5726"/> + <path d="M13.27 325.44 L0 325.44 L0 347.02 L13.27 347.02 L13.27 325.44" class="st3"/> + <text x="3.06" y="341.62" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>-</text> </g> + <g id="shape115-290" v:mID="115" v:groupContext="shape" transform="translate(529.004,-128.007)"> + <title>Sheet.115</title> + <desc>Keys separated into</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="97.1729" cy="336.229" width="194.35" height="21.5726"/> + <path d="M194.35 325.44 L0 325.44 L0 347.02 L194.35 347.02 L194.35 325.44" class="st3"/> + <text x="17.06" y="341.62" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Keys separated into </text> </g> + <g id="shape116-294" v:mID="116" v:groupContext="shape" transform="translate(529.004,-106.438)"> + <title>Sheet.116</title> + <desc>groups based on</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="83.1587" cy="336.229" width="166.32" height="21.5726"/> + <path d="M166.32 325.44 L0 325.44 L0 347.02 L166.32 347.02 L166.32 325.44" class="st3"/> + <text x="15.23" y="341.62" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>groups based on </text> </g> + <g id="shape117-298" v:mID="117" v:groupContext="shape" transform="translate(529.004,-84.869)"> + <title>Sheet.117</title> + <desc>some bits from hash</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="97.731" cy="336.229" width="195.47" height="21.5726"/> + <path d="M195.46 325.44 L0 325.44 L0 347.02 L195.46 347.02 L195.46 325.44" class="st3"/> + <text x="14.94" y="341.62" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>some bits from hash</text> </g> + <g id="shape118-302" v:mID="118" v:groupContext="shape" transform="translate(506.433,-63.2999)"> + <title>Sheet.118</title> + <desc>-</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="6.63728" cy="336.229" width="13.28" height="21.5726"/> + <path d="M13.27 325.44 L0 325.44 L0 347.02 L13.27 347.02 L13.27 325.44" class="st3"/> + <text x="3.06" y="341.62" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>-</text> </g> + <g id="shape119-306" v:mID="119" v:groupContext="shape" transform="translate(529.004,-63.2999)"> + <title>Sheet.119</title> + <desc>Groups contain a</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="84.2539" cy="336.229" width="168.51" height="21.5726"/> + <path d="M168.51 325.44 L0 325.44 L0 347.02 L168.51 347.02 L168.51 325.44" class="st3"/> + <text x="15.38" y="341.62" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Groups contain a </text> </g> + <g id="shape120-310" v:mID="120" v:groupContext="shape" transform="translate(529.004,-41.7308)"> + <title>Sheet.120</title> + <desc>small number of</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="81.4635" cy="336.229" width="162.93" height="21.5726"/> + <path d="M162.93 325.44 L0 325.44 L0 347.02 L162.93 347.02 L162.93 325.44" class="st3"/> + <text x="15.01" y="341.62" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>small number of </text> </g> + <g id="shape121-314" v:mID="121" v:groupContext="shape" transform="translate(529.004,-20.1617)"> + <title>Sheet.121</title> + <desc>keys (<28)</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="50.4481" cy="336.229" width="100.9" height="21.5726"/> + <path d="M100.9 325.44 L0 325.44 L0 347.02 L100.9 347.02 L100.9 325.44" class="st3"/> + <text x="8.77" y="341.62" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>keys (<28)</text> </g> + <g id="shape122-318" v:mID="122" v:groupContext="shape" transform="translate(19.1996,-146.276)"> + <title>Sheet.122</title> + <path d="M0 310.17 C-0 306.1 3.62 302.8 8.07 302.8 L14.46 302.8 L29.68 282.28 L36.14 302.8 L78.65 302.8 C83.11 302.8 + 86.72 306.1 86.72 310.17 L86.72 310.17 L86.72 321.22 L86.72 339.65 C86.72 343.72 83.11 347.02 78.65 347.02 + L36.14 347.02 L14.46 347.02 L14.46 347.02 L8.07 347.02 C3.62 347.02 0 343.72 0 339.65 L0 321.22 L0 310.17 + L0 310.17 Z" class="st5"/> + </g> + <g id="shape123-320" v:mID="123" v:groupContext="shape" transform="translate(41.9777,-174.053)"> + <title>Sheet.123</title> + <desc>Group</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="22.8289" cy="339.824" width="45.66" height="14.3829"/> + <path d="M45.66 332.63 L0 332.63 L0 347.02 L45.66 347.02 L45.66 332.63" class="st3"/> + <text x="5.9" y="343.42" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Group </text> </g> + <g id="shape124-324" v:mID="124" v:groupContext="shape" transform="translate(34.4142,-159.674)"> + <title>Sheet.124</title> + <desc>Identifier</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="31.5173" cy="339.824" width="63.04" height="14.3829"/> + <path d="M63.03 332.63 L0 332.63 L0 347.02 L63.03 347.02 L63.03 332.63" class="st3"/> + <text x="7.04" y="343.42" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Identifier </text> </g> + <g id="shape125-328" v:mID="125" v:groupContext="shape" transform="translate(28.7716,-145.295)"> + <title>Sheet.125</title> + <desc>(simplified)</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="36.2165" cy="339.824" width="72.44" height="14.3829"/> + <path d="M72.43 332.63 L0 332.63 L0 347.02 L72.43 347.02 L72.43 332.63" class="st3"/> + <text x="6.19" y="343.42" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(simplified)</text> </g> + <g id="shape127-332" v:mID="127" v:groupContext="shape" transform="translate(517.688,-71.2991)"> + <title>Sheet.127</title> + <desc>Keys separated into groups based on some bits from hash. Grou...</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="112.5" cy="302.139" width="225" height="89.7513"/> + <g id="shadow127-333" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st19"> + <rect x="0" y="257.264" width="225" height="89.7513" class="st20"/> + </g> + <rect x="0" y="257.264" width="225" height="89.7513" class="st21"/> + <text x="4" y="281.09" class="st22" v:langID="1033"><v:paragraph v:indentFirst="-18" v:indentLeft="18" v:bullet="1"/><v:tabList/><tspan + class="st23" v:isBullet="true">·</tspan> <tspan class="st24">Keys separated into groups based </tspan><tspan + x="22" dy="1.204em" class="st24">on some bits from hash</tspan><tspan class="st24">.<v:newlineChar/></tspan><tspan + x="4" dy="1.211em" class="st23" v:isBullet="true">·</tspan> <tspan class="st24">Groups contain a small number of </tspan><tspan + x="22" dy="1.204em" class="st24">keys </tspan><tspan class="st24">(</tspan><tspan class="st24"><</tspan><tspan + class="st24">28</tspan><tspan class="st24">)</tspan></text> </g> + <g id="shape129-349" v:mID="129" v:groupContext="shape" transform="translate(336.326,-26.2991)"> + <title>Sheet.129</title> + <desc>Total # of keys in group so far</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="39.6784" cy="333.515" width="79.36" height="27"/> + <rect x="0" y="320.015" width="79.3567" height="27" class="st25"/> + <text x="4.5" y="329.92" class="st26" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Total # of keys <tspan + x="4.39" dy="1.2em" class="st23">in group so far</tspan></text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i8.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i8.svg new file mode 100644 index 000000000..d0fd463aa --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i8.svg @@ -0,0 +1,182 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export efd_i9.svg Page-2 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="4.98372in" height="2.08442in" + viewBox="0 0 358.828 150.078" xml:space="preserve" color-interpolation-filters="sRGB" class="st8"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:#ffffff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st2 {stroke:#00aeef;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st3 {fill:none;stroke:#00aeef;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st4 {stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st5 {fill:#000000;font-family:Intel Clear;font-size:0.998566em} + .st6 {fill:#c00000;font-family:Intel Clear;font-size:0.828804em;font-weight:bold} + .st7 {fill:#0071c5;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st8 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <g v:mID="4" v:index="2" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-2</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape4-1" v:mID="4" v:groupContext="shape" transform="translate(206.306,-19.0195)"> + <title>Sheet.4</title> + <path d="M0 38.04 L0 150.08 L133.5 150.08 L133.5 38.04 L0 38.04 L0 38.04 Z" class="st1"/> + </g> + <g id="shape5-3" v:mID="5" v:groupContext="shape" transform="translate(206.306,-19.0195)"> + <title>Sheet.5</title> + <path d="M0 38.04 L133.5 38.04 L133.5 150.08 L0 150.08 L0 38.04" class="st2"/> + </g> + <g id="shape6-6" v:mID="6" v:groupContext="shape" transform="translate(215.55,-70.7853)"> + <title>Sheet.6</title> + <path d="M0 121.92 C0 118.82 2.54 116.29 5.64 116.29 L110.69 116.29 C113.81 116.29 116.33 118.82 116.33 121.92 L116.33 + 144.45 C116.33 147.56 113.81 150.08 110.69 150.08 L5.64 150.08 C2.54 150.08 0 147.56 0 144.45 L0 121.92 + Z" class="st1"/> + </g> + <g id="shape7-8" v:mID="7" v:groupContext="shape" transform="translate(215.55,-70.7853)"> + <title>Sheet.7</title> + <path d="M0 121.92 C0 118.82 2.54 116.29 5.64 116.29 L110.69 116.29 C113.81 116.29 116.33 118.82 116.33 121.92 L116.33 + 144.45 C116.33 147.56 113.81 150.08 110.69 150.08 L5.64 150.08 C2.54 150.08 0 147.56 0 144.45 L0 121.92 + Z" class="st3"/> + </g> + <g id="shape8-10" v:mID="8" v:groupContext="shape" transform="translate(242.756,-86.1914)"> + <title>Sheet.8</title> + <desc>hash_index</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="36.9951" cy="142.887" width="74" height="14.3829"/> + <path d="M73.99 135.7 L0 135.7 L0 150.08 L73.99 150.08 L73.99 135.7" class="st4"/> + <text x="6.29" y="146.48" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash_index</text> </g> + <g id="shape9-14" v:mID="9" v:groupContext="shape" transform="translate(229.67,-71.812)"> + <title>Sheet.9</title> + <desc>(integer, 16 bits)</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="52.0635" cy="142.887" width="104.13" height="14.3829"/> + <path d="M104.13 135.7 L0 135.7 L0 150.08 L104.13 150.08 L104.13 135.7" class="st4"/> + <text x="8.25" y="146.48" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(integer, 16 bits)</text> </g> + <g id="shape10-18" v:mID="10" v:groupContext="shape" transform="translate(215.55,-27.1678)"> + <title>Sheet.10</title> + <path d="M0 121.92 C0 118.82 2.54 116.29 5.64 116.29 L110.69 116.29 C113.81 116.29 116.33 118.82 116.33 121.92 L116.33 + 144.45 C116.33 147.56 113.81 150.08 110.69 150.08 L5.64 150.08 C2.54 150.08 0 147.56 0 144.45 L0 121.92 + Z" class="st1"/> + </g> + <g id="shape11-20" v:mID="11" v:groupContext="shape" transform="translate(215.55,-27.1678)"> + <title>Sheet.11</title> + <path d="M0 121.92 C0 118.82 2.54 116.29 5.64 116.29 L110.69 116.29 C113.81 116.29 116.33 118.82 116.33 121.92 L116.33 + 144.45 C116.33 147.56 113.81 150.08 110.69 150.08 L5.64 150.08 C2.54 150.08 0 147.56 0 144.45 L0 121.92 + Z" class="st3"/> + </g> + <g id="shape12-22" v:mID="12" v:groupContext="shape" transform="translate(237.836,-42.6033)"> + <title>Sheet.12</title> + <desc>lookup_table</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="42.693" cy="142.887" width="85.39" height="14.3829"/> + <path d="M85.39 135.7 L0 135.7 L0 150.08 L85.39 150.08 L85.39 135.7" class="st4"/> + <text x="7.03" y="146.48" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>lookup_table</text> </g> + <g id="shape13-26" v:mID="13" v:groupContext="shape" transform="translate(251.643,-28.2239)"> + <title>Sheet.13</title> + <desc>(16 bits)</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="26.9562" cy="142.887" width="53.92" height="14.3829"/> + <path d="M53.91 135.7 L0 135.7 L0 150.08 L53.91 150.08 L53.91 135.7" class="st4"/> + <text x="4.98" y="146.48" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(16 bits)</text> </g> + <g id="shape14-30" v:mID="14" v:groupContext="shape" transform="translate(213.473,-114.303)"> + <title>Sheet.14</title> + <desc>Group ID: 0x0102</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="47.976" cy="144.109" width="95.96" height="11.9384"/> + <path d="M95.95 138.14 L0 138.14 L0 150.08 L95.95 150.08 L95.95 138.14" class="st4"/> + <text x="7.47" y="147.09" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Group ID: 0x0102</text> </g> + <g id="shape15-34" v:mID="15" v:groupContext="shape" transform="translate(19.0195,-99.4242)"> + <title>Sheet.15</title> + <path d="M0 129.31 C0 127.02 1.87 125.15 4.16 125.15 L109.18 125.15 C111.47 125.15 113.33 127.02 113.33 129.31 L113.33 + 145.93 C113.33 148.22 111.47 150.08 109.18 150.08 L4.16 150.08 C1.87 150.08 0 148.22 0 145.93 L0 129.31 + Z" class="st1"/> + </g> + <g id="shape16-36" v:mID="16" v:groupContext="shape" transform="translate(19.0195,-99.4242)"> + <title>Sheet.16</title> + <path d="M0 129.31 C0 127.02 1.87 125.15 4.16 125.15 L109.18 125.15 C111.47 125.15 113.33 127.02 113.33 129.31 L113.33 + 145.93 C113.33 148.22 111.47 150.08 109.18 150.08 L4.16 150.08 C1.87 150.08 0 148.22 0 145.93 L0 129.31 + Z" class="st3"/> + </g> + <g id="shape17-38" v:mID="17" v:groupContext="shape" transform="translate(33.9485,-103.285)"> + <title>Sheet.17</title> + <desc>Key1: Value = 0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="49.6862" cy="142.887" width="99.38" height="14.3829"/> + <path d="M99.37 135.7 L0 135.7 L0 150.08 L99.37 150.08 L99.37 135.7" class="st4"/> + <text x="7.94" y="146.48" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key1: Value = 0</text> </g> + <g id="shape18-42" v:mID="18" v:groupContext="shape" transform="translate(19.0195,-74.6198)"> + <title>Sheet.18</title> + <path d="M0 129.31 C0 127.02 1.87 125.15 4.16 125.15 L109.18 125.15 C111.47 125.15 113.33 127.02 113.33 129.31 L113.33 + 145.93 C113.33 148.22 111.47 150.08 109.18 150.08 L4.16 150.08 C1.87 150.08 0 148.22 0 145.93 L0 129.31 + Z" class="st1"/> + </g> + <g id="shape19-44" v:mID="19" v:groupContext="shape" transform="translate(19.0195,-74.6198)"> + <title>Sheet.19</title> + <path d="M0 129.31 C0 127.02 1.87 125.15 4.16 125.15 L109.18 125.15 C111.47 125.15 113.33 127.02 113.33 129.31 L113.33 + 145.93 C113.33 148.22 111.47 150.08 109.18 150.08 L4.16 150.08 C1.87 150.08 0 148.22 0 145.93 L0 129.31 + Z" class="st3"/> + </g> + <g id="shape20-46" v:mID="20" v:groupContext="shape" transform="translate(33.9485,-78.4626)"> + <title>Sheet.20</title> + <desc>Key3: Value = 1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="49.6862" cy="142.887" width="99.38" height="14.3829"/> + <path d="M99.37 135.7 L0 135.7 L0 150.08 L99.37 150.08 L99.37 135.7" class="st4"/> + <text x="7.94" y="146.48" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key3: Value = 1</text> </g> + <g id="shape21-50" v:mID="21" v:groupContext="shape" transform="translate(19.0195,-49.5757)"> + <title>Sheet.21</title> + <path d="M0 129.21 C0 126.91 1.88 125.03 4.19 125.03 L109.15 125.03 C111.46 125.03 113.33 126.91 113.33 129.21 L113.33 + 145.91 C113.33 148.21 111.46 150.08 109.15 150.08 L4.19 150.08 C1.88 150.08 0 148.21 0 145.91 L0 129.21 + Z" class="st1"/> + </g> + <g id="shape22-52" v:mID="22" v:groupContext="shape" transform="translate(19.0195,-49.5757)"> + <title>Sheet.22</title> + <path d="M0 129.21 C0 126.91 1.88 125.03 4.19 125.03 L109.15 125.03 C111.46 125.03 113.33 126.91 113.33 129.21 L113.33 + 145.91 C113.33 148.21 111.46 150.08 109.15 150.08 L4.19 150.08 C1.88 150.08 0 148.21 0 145.91 L0 129.21 + Z" class="st3"/> + </g> + <g id="shape23-54" v:mID="23" v:groupContext="shape" transform="translate(33.9485,-53.4903)"> + <title>Sheet.23</title> + <desc>Key4: Value = 0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="49.6862" cy="142.887" width="99.38" height="14.3829"/> + <path d="M99.37 135.7 L0 135.7 L0 150.08 L99.37 150.08 L99.37 135.7" class="st4"/> + <text x="7.94" y="146.48" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key4: Value = 0</text> </g> + <g id="shape24-58" v:mID="24" v:groupContext="shape" transform="translate(19.0195,-25.0109)"> + <title>Sheet.24</title> + <path d="M0 129.21 C0 126.91 1.88 125.03 4.19 125.03 L109.15 125.03 C111.46 125.03 113.33 126.91 113.33 129.21 L113.33 + 145.91 C113.33 148.21 111.46 150.08 109.15 150.08 L4.19 150.08 C1.88 150.08 0 148.21 0 145.91 L0 129.21 + Z" class="st1"/> + </g> + <g id="shape25-60" v:mID="25" v:groupContext="shape" transform="translate(19.0195,-25.0109)"> + <title>Sheet.25</title> + <path d="M0 129.21 C0 126.91 1.88 125.03 4.19 125.03 L109.15 125.03 C111.46 125.03 113.33 126.91 113.33 129.21 L113.33 + 145.91 C113.33 148.21 111.46 150.08 109.15 150.08 L4.19 150.08 C1.88 150.08 0 148.21 0 145.91 L0 129.21 + Z" class="st3"/> + </g> + <g id="shape26-62" v:mID="26" v:groupContext="shape" transform="translate(33.9485,-28.927)"> + <title>Sheet.26</title> + <desc>Key7: Value = 1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="49.6862" cy="142.887" width="99.38" height="14.3829"/> + <path d="M99.37 135.7 L0 135.7 L0 150.08 L99.37 150.08 L99.37 135.7" class="st4"/> + <text x="7.94" y="146.48" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key7: Value = 1</text> </g> + <g id="shape27-66" v:mID="27" v:groupContext="shape" transform="translate(141.536,-51.5529)"> + <title>Sheet.27</title> + <path d="M0 115.39 L22.75 115.39 L22.75 103.82 L45.5 126.95 L22.75 150.08 L22.75 138.51 L0 138.51 L0 115.39 Z" + class="st7"/> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i9.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i9.svg new file mode 100644 index 000000000..b2e385d16 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/efd_i9.svg @@ -0,0 +1,390 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export efd_i10.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="9.8125in" height="3.76365in" + viewBox="0 0 706.5 270.983" xml:space="preserve" color-interpolation-filters="sRGB" class="st9"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:#ffffff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st2 {fill:none;stroke:#00aeef;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.03901} + .st3 {stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st4 {fill:#000000;font-family:Arial;font-size:0.998566em} + .st5 {fill:#000000;font-family:Arial;font-size:0.918686em} + .st6 {fill:#0071c5;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st7 {fill:#ffffff;font-family:Arial;font-size:0.998566em} + .st8 {fill:#ffffff;font-family:Arial;font-size:1.49785em} + .st9 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape68-1" v:mID="68" v:groupContext="shape" transform="translate(196.523,-158.978)"> + <title>Sheet.68</title> + <path d="M0 250.22 C0 247.95 1.89 246.06 4.17 246.06 L317.25 246.06 C319.53 246.06 321.39 247.95 321.39 250.22 L321.39 + 266.85 C321.39 269.13 319.53 270.98 317.25 270.98 L4.17 270.98 C1.89 270.98 0 269.13 0 266.85 L0 250.22 + Z" class="st1"/> + </g> + <g id="shape69-3" v:mID="69" v:groupContext="shape" transform="translate(196.523,-158.978)"> + <title>Sheet.69</title> + <path d="M0 250.22 C0 247.95 1.89 246.06 4.17 246.06 L317.25 246.06 C319.53 246.06 321.39 247.95 321.39 250.22 L321.39 + 266.85 C321.39 269.13 319.53 270.98 317.25 270.98 L4.17 270.98 C1.89 270.98 0 269.13 0 266.85 L0 250.22 + Z" class="st2"/> + </g> + <g id="shape70-5" v:mID="70" v:groupContext="shape" transform="translate(186.139,-162.437)"> + <title>Sheet.70</title> + <desc>(hash(key, seed1) + hash_index *</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="106.671" cy="263.792" width="213.35" height="14.3829"/> + <path d="M213.34 256.6 L0 256.6 L0 270.98 L213.34 270.98 L213.34 256.6" class="st3"/> + <text x="17.24" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(hash(key, seed1) + hash_index * </text> </g> + <g id="shape71-9" v:mID="71" v:groupContext="shape" transform="translate(381.48,-162.845)"> + <title>Sheet.71</title> + <desc>hash(key</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="27.4843" cy="264.367" width="54.97" height="13.2327"/> + <path d="M54.97 257.75 L0 257.75 L0 270.98 L54.97 270.98 L54.97 257.75" class="st3"/> + <text x="5.12" y="267.67" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash(key</text> </g> + <g id="shape72-13" v:mID="72" v:groupContext="shape" transform="translate(424.755,-162.437)"> + <title>Sheet.72</title> + <desc>, seed2)) % 16</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="46.7254" cy="263.792" width="93.46" height="14.3829"/> + <path d="M93.45 256.6 L0 256.6 L0 270.98 L93.45 270.98 L93.45 256.6" class="st3"/> + <text x="7.76" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>, seed2)) % 16</text> </g> + <g id="shape73-17" v:mID="73" v:groupContext="shape" transform="translate(524.094,-148.373)"> + <title>Sheet.73</title> + <path d="M0 236.29 L22.75 236.29 L22.75 224.73 L45.5 247.86 L22.75 270.98 L22.75 259.42 L0 259.42 L0 236.29 Z" + class="st6"/> + </g> + <g id="shape74-19" v:mID="74" v:groupContext="shape" transform="translate(574.148,-217.574)"> + <title>Sheet.74</title> + <path d="M0 244.83 C-0 241.95 2.37 239.59 5.25 239.59 L108.11 239.59 C110.99 239.59 113.33 241.95 113.33 244.83 L113.33 + 265.77 C113.33 268.65 110.99 270.98 108.11 270.98 L5.25 270.98 C2.37 270.98 0 268.65 0 265.77 L0 244.83 + Z" class="st1"/> + </g> + <g id="shape75-21" v:mID="75" v:groupContext="shape" transform="translate(574.148,-217.574)"> + <title>Sheet.75</title> + <path d="M0 244.83 C-0 241.95 2.37 239.59 5.25 239.59 L108.11 239.59 C110.99 239.59 113.33 241.95 113.33 244.83 L113.33 + 265.77 C113.33 268.65 110.99 270.98 108.11 270.98 L5.25 270.98 C2.37 270.98 0 268.65 0 265.77 L0 244.83 + Z" class="st2"/> + </g> + <g id="shape76-23" v:mID="76" v:groupContext="shape" transform="translate(584.296,-231.499)"> + <title>Sheet.76</title> + <desc>lookup_table</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="40.993" cy="263.792" width="81.99" height="14.3829"/> + <path d="M81.99 256.6 L0 256.6 L0 270.98 L81.99 270.98 L81.99 256.6" class="st3"/> + <text x="7.01" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>lookup_table</text> </g> + <g id="shape77-27" v:mID="77" v:groupContext="shape" transform="translate(655.369,-231.499)"> + <title>Sheet.77</title> + <desc>bit</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="11.1076" cy="263.792" width="22.22" height="14.3829"/> + <path d="M22.22 256.6 L0 256.6 L0 270.98 L22.22 270.98 L22.22 256.6" class="st3"/> + <text x="4.78" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>bit </text> </g> + <g id="shape78-31" v:mID="78" v:groupContext="shape" transform="translate(588.858,-217.12)"> + <title>Sheet.78</title> + <desc>index for key1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="44.8113" cy="263.792" width="89.63" height="14.3829"/> + <path d="M89.62 256.6 L0 256.6 L0 270.98 L89.62 270.98 L89.62 256.6" class="st3"/> + <text x="7.51" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>index for key1</text> </g> + <g id="shape79-35" v:mID="79" v:groupContext="shape" transform="translate(573.548,-178.869)"> + <title>Sheet.79</title> + <path d="M0 244.83 C-0 241.95 2.37 239.59 5.25 239.59 L108.11 239.59 C110.99 239.59 113.33 241.95 113.33 244.83 L113.33 + 265.77 C113.33 268.65 110.99 270.98 108.11 270.98 L5.25 270.98 C2.37 270.98 0 268.65 0 265.77 L0 244.83 + Z" class="st1"/> + </g> + <g id="shape80-37" v:mID="80" v:groupContext="shape" transform="translate(573.548,-178.869)"> + <title>Sheet.80</title> + <path d="M0 244.83 C-0 241.95 2.37 239.59 5.25 239.59 L108.11 239.59 C110.99 239.59 113.33 241.95 113.33 244.83 L113.33 + 265.77 C113.33 268.65 110.99 270.98 108.11 270.98 L5.25 270.98 C2.37 270.98 0 268.65 0 265.77 L0 244.83 + Z" class="st2"/> + </g> + <g id="shape81-39" v:mID="81" v:groupContext="shape" transform="translate(584.296,-192.768)"> + <title>Sheet.81</title> + <desc>lookup_table</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="40.993" cy="263.792" width="81.99" height="14.3829"/> + <path d="M81.99 256.6 L0 256.6 L0 270.98 L81.99 270.98 L81.99 256.6" class="st3"/> + <text x="7.01" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>lookup_table</text> </g> + <g id="shape82-43" v:mID="82" v:groupContext="shape" transform="translate(655.369,-192.768)"> + <title>Sheet.82</title> + <desc>bit</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="11.1076" cy="263.792" width="22.22" height="14.3829"/> + <path d="M22.22 256.6 L0 256.6 L0 270.98 L22.22 270.98 L22.22 256.6" class="st3"/> + <text x="4.78" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>bit </text> </g> + <g id="shape83-47" v:mID="83" v:groupContext="shape" transform="translate(588.858,-178.388)"> + <title>Sheet.83</title> + <desc>index for key3</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="44.8113" cy="263.792" width="89.63" height="14.3829"/> + <path d="M89.62 256.6 L0 256.6 L0 270.98 L89.62 270.98 L89.62 256.6" class="st3"/> + <text x="7.51" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>index for key3</text> </g> + <g id="shape84-51" v:mID="84" v:groupContext="shape" transform="translate(574.148,-139.326)"> + <title>Sheet.84</title> + <path d="M0 244.83 C-0 241.95 2.37 239.59 5.25 239.59 L108.11 239.59 C110.99 239.59 113.33 241.95 113.33 244.83 L113.33 + 265.77 C113.33 268.65 110.99 270.98 108.11 270.98 L5.25 270.98 C2.37 270.98 0 268.65 0 265.77 L0 244.83 + Z" class="st1"/> + </g> + <g id="shape85-53" v:mID="85" v:groupContext="shape" transform="translate(574.148,-139.326)"> + <title>Sheet.85</title> + <path d="M0 244.83 C-0 241.95 2.37 239.59 5.25 239.59 L108.11 239.59 C110.99 239.59 113.33 241.95 113.33 244.83 L113.33 + 265.77 C113.33 268.65 110.99 270.98 108.11 270.98 L5.25 270.98 C2.37 270.98 0 268.65 0 265.77 L0 244.83 + Z" class="st2"/> + </g> + <g id="shape86-55" v:mID="86" v:groupContext="shape" transform="translate(584.296,-153.227)"> + <title>Sheet.86</title> + <desc>lookup_table</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="40.993" cy="263.792" width="81.99" height="14.3829"/> + <path d="M81.99 256.6 L0 256.6 L0 270.98 L81.99 270.98 L81.99 256.6" class="st3"/> + <text x="7.01" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>lookup_table</text> </g> + <g id="shape87-59" v:mID="87" v:groupContext="shape" transform="translate(655.369,-153.227)"> + <title>Sheet.87</title> + <desc>bit</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="11.1076" cy="263.792" width="22.22" height="14.3829"/> + <path d="M22.22 256.6 L0 256.6 L0 270.98 L22.22 270.98 L22.22 256.6" class="st3"/> + <text x="4.78" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>bit </text> </g> + <g id="shape88-63" v:mID="88" v:groupContext="shape" transform="translate(588.858,-138.848)"> + <title>Sheet.88</title> + <desc>index for key4</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="44.8113" cy="263.792" width="89.63" height="14.3829"/> + <path d="M89.62 256.6 L0 256.6 L0 270.98 L89.62 270.98 L89.62 256.6" class="st3"/> + <text x="7.51" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>index for key4</text> </g> + <g id="shape89-67" v:mID="89" v:groupContext="shape" transform="translate(574.148,-100.622)"> + <title>Sheet.89</title> + <path d="M0 244.83 C-0 241.95 2.37 239.59 5.25 239.59 L108.11 239.59 C110.99 239.59 113.33 241.95 113.33 244.83 L113.33 + 265.77 C113.33 268.65 110.99 270.98 108.11 270.98 L5.25 270.98 C2.37 270.98 0 268.65 0 265.77 L0 244.83 + Z" class="st1"/> + </g> + <g id="shape90-69" v:mID="90" v:groupContext="shape" transform="translate(574.148,-100.622)"> + <title>Sheet.90</title> + <path d="M0 244.83 C-0 241.95 2.37 239.59 5.25 239.59 L108.11 239.59 C110.99 239.59 113.33 241.95 113.33 244.83 L113.33 + 265.77 C113.33 268.65 110.99 270.98 108.11 270.98 L5.25 270.98 C2.37 270.98 0 268.65 0 265.77 L0 244.83 + Z" class="st2"/> + </g> + <g id="shape91-71" v:mID="91" v:groupContext="shape" transform="translate(584.296,-114.496)"> + <title>Sheet.91</title> + <desc>lookup_table</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="40.993" cy="263.792" width="81.99" height="14.3829"/> + <path d="M81.99 256.6 L0 256.6 L0 270.98 L81.99 270.98 L81.99 256.6" class="st3"/> + <text x="7.01" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>lookup_table</text> </g> + <g id="shape92-75" v:mID="92" v:groupContext="shape" transform="translate(655.369,-114.496)"> + <title>Sheet.92</title> + <desc>bit</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="11.1076" cy="263.792" width="22.22" height="14.3829"/> + <path d="M22.22 256.6 L0 256.6 L0 270.98 L22.22 270.98 L22.22 256.6" class="st3"/> + <text x="4.78" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>bit </text> </g> + <g id="shape93-79" v:mID="93" v:groupContext="shape" transform="translate(588.858,-100.117)"> + <title>Sheet.93</title> + <desc>index for key7</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="44.8113" cy="263.792" width="89.63" height="14.3829"/> + <path d="M89.62 256.6 L0 256.6 L0 270.98 L89.62 270.98 L89.62 256.6" class="st3"/> + <text x="7.51" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>index for key7</text> </g> + <g id="shape94-83" v:mID="94" v:groupContext="shape" transform="translate(205.227,-191.137)"> + <title>Sheet.94</title> + <path d="M0 217.76 C0 213 3.87 209.14 8.64 209.14 L14.53 209.14 L14.53 209.14 L36.32 209.14 L78.52 209.14 C83.3 209.14 + 87.16 213 87.16 217.76 L87.16 239.33 L87.16 239.33 L87.16 252.27 L87.16 252.27 C87.16 257.05 83.3 260.9 + 78.52 260.9 L36.32 260.9 L18.46 270.98 L14.53 260.9 L8.64 260.9 C3.87 260.9 0 257.05 0 252.27 L0 239.33 + L0 239.33 L0 217.76 Z" class="st6"/> + </g> + <g id="shape95-85" v:mID="95" v:groupContext="shape" transform="translate(214.98,-225.215)"> + <title>Sheet.95</title> + <desc>CRC32 (32</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="38.2947" cy="263.792" width="76.59" height="14.3829"/> + <path d="M76.59 256.6 L0 256.6 L0 270.98 L76.59 270.98 L76.59 256.6" class="st3"/> + <text x="8.33" y="267.39" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>CRC32 (32 </text> </g> + <g id="shape96-89" v:mID="96" v:groupContext="shape" transform="translate(222.123,-210.835)"> + <title>Sheet.96</title> + <desc>bit output)</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="32.5584" cy="263.792" width="65.12" height="14.3829"/> + <path d="M65.12 256.6 L0 256.6 L0 270.98 L65.12 270.98 L65.12 256.6" class="st3"/> + <text x="5.91" y="267.39" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>bit output)</text> </g> + <g id="shape97-93" v:mID="97" v:groupContext="shape" transform="translate(305.473,-188.366)"> + <title>Sheet.97</title> + <path d="M0 226.84 C0 223.28 2.9 220.39 6.47 220.39 L21.37 220.39 L21.37 220.39 L53.42 220.39 L121.77 220.39 C125.34 + 220.39 128.22 223.28 128.22 226.84 L128.22 242.97 L128.22 242.97 L128.22 252.65 L128.22 252.65 C128.22 256.21 + 125.34 259.09 121.77 259.09 L53.42 259.09 L38.73 270.98 L21.37 259.09 L6.47 259.09 C2.9 259.09 0 256.21 + 0 252.65 L0 242.97 L0 242.97 L0 226.84 Z" class="st6"/> + </g> + <g id="shape98-95" v:mID="98" v:groupContext="shape" transform="translate(318.48,-217.733)"> + <title>Sheet.98</title> + <desc>Goal: Find a valid</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="57.4478" cy="263.792" width="114.9" height="14.3829"/> + <path d="M114.9 256.6 L0 256.6 L0 270.98 L114.9 270.98 L114.9 256.6" class="st3"/> + <text x="10.82" y="267.39" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Goal: Find a valid </text> </g> + <g id="shape99-99" v:mID="99" v:groupContext="shape" transform="translate(339.077,-203.354)"> + <title>Sheet.99</title> + <desc>hash_index</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="37.1611" cy="263.792" width="74.33" height="14.3829"/> + <path d="M74.32 256.6 L0 256.6 L0 270.98 L74.32 270.98 L74.32 256.6" class="st3"/> + <text x="6.51" y="267.39" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>hash_index</text> </g> + <g id="shape100-103" v:mID="100" v:groupContext="shape" transform="translate(438.135,-185.939)"> + <title>Sheet.100</title> + <path d="M0 217.36 C0 213.8 2.91 210.89 6.48 210.89 L21.37 210.89 L21.37 210.89 L53.42 210.89 L121.77 210.89 C125.34 + 210.89 128.22 213.8 128.22 217.36 L128.22 233.48 L128.22 233.48 L128.22 243.15 L128.22 243.15 C128.22 246.72 + 125.34 249.59 121.77 249.59 L53.42 249.59 L54.75 270.98 L21.37 249.59 L6.48 249.59 C2.91 249.59 0 246.72 + 0 243.15 L0 233.48 L0 233.48 L0 217.36 Z" class="st6"/> + </g> + <g id="shape101-105" v:mID="101" v:groupContext="shape" transform="translate(448.763,-224.802)"> + <title>Sheet.101</title> + <desc>Lookup Table has</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="58.6085" cy="263.792" width="117.22" height="14.3829"/> + <path d="M117.22 256.6 L0 256.6 L0 270.98 L117.22 270.98 L117.22 256.6" class="st3"/> + <text x="10.98" y="267.39" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Lookup Table has </text> </g> + <g id="shape102-109" v:mID="102" v:groupContext="shape" transform="translate(484.549,-210.423)"> + <title>Sheet.102</title> + <desc>16 bits</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="22.2166" cy="263.792" width="44.44" height="14.3829"/> + <path d="M44.43 256.6 L0 256.6 L0 270.98 L44.43 270.98 L44.43 256.6" class="st3"/> + <text x="4.56" y="267.39" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>16 bits</text> </g> + <g id="shape103-113" v:mID="103" v:groupContext="shape" transform="translate(369.583,-90.8555)"> + <title>Sheet.103</title> + <path d="M0 227.76 C0 222.98 3.89 219.1 8.67 219.1 L14.53 219.1 L34.47 205.09 L36.32 219.1 L78.5 219.1 C83.29 219.1 87.16 + 222.98 87.16 227.76 L87.16 227.76 L87.16 240.73 L87.16 262.34 C87.16 267.12 83.29 270.98 78.5 270.98 L36.32 + 270.98 L14.53 270.98 L14.53 270.98 L8.67 270.98 C3.89 270.98 0 267.12 0 262.34 L0 240.73 L0 227.76 L0 227.76 + Z" class="st6"/> + </g> + <g id="shape104-115" v:mID="104" v:groupContext="shape" transform="translate(383.264,-114.932)"> + <title>Sheet.104</title> + <desc>CRC32 (32</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="38.2947" cy="263.792" width="76.59" height="14.3829"/> + <path d="M76.59 256.6 L0 256.6 L0 270.98 L76.59 270.98 L76.59 256.6" class="st3"/> + <text x="8.33" y="267.39" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>CRC32 (32 </text> </g> + <g id="shape105-119" v:mID="105" v:groupContext="shape" transform="translate(386.505,-100.553)"> + <title>Sheet.105</title> + <desc>bit output)</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="32.5584" cy="263.792" width="65.12" height="14.3829"/> + <path d="M65.12 256.6 L0 256.6 L0 270.98 L65.12 270.98 L65.12 256.6" class="st3"/> + <text x="5.91" y="267.39" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>bit output)</text> </g> + <g id="shape106-123" v:mID="106" v:groupContext="shape" transform="translate(313.397,-18)"> + <title>Sheet.106</title> + <path d="M0 226.35 C0 221.43 4.02 217.42 8.94 217.42 L347.02 217.42 C351.97 217.42 355.96 221.43 355.96 226.35 L355.96 + 262.06 C355.96 267 351.97 270.98 347.02 270.98 L8.94 270.98 C4.02 270.98 0 267 0 262.06 L0 226.35 Z" + class="st6"/> + </g> + <g id="shape107-125" v:mID="107" v:groupContext="shape" transform="translate(313.98,-41.963)"> + <title>Sheet.107</title> + <desc>Goal is to find a hash_index that produces</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="177.75" cy="260.197" width="355.5" height="21.5726"/> + <path d="M355.5 249.41 L0 249.41 L0 270.98 L355.5 270.98 L355.5 249.41" class="st3"/> + <text x="9.88" y="265.59" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Goal is to find a hash_index that produces </text> </g> + <g id="shape108-129" v:mID="108" v:groupContext="shape" transform="translate(318.48,-20.3939)"> + <title>Sheet.108</title> + <desc>a lookup_table with no contradictions</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="175.5" cy="260.197" width="351" height="21.5726"/> + <path d="M351 249.41 L0 249.41 L0 270.98 L351 270.98 L351 249.41" class="st3"/> + <text x="28.12" y="265.59" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>a lookup_table with no contradictions</text> </g> + <g id="shape109-133" v:mID="109" v:groupContext="shape" transform="translate(18,-196.244)"> + <title>Sheet.109</title> + <path d="M0 250.22 C0 247.92 1.87 246.06 4.16 246.06 L109.18 246.06 C111.47 246.06 113.33 247.92 113.33 250.22 L113.33 + 266.83 C113.33 269.13 111.47 270.98 109.18 270.98 L4.16 270.98 C1.87 270.98 0 269.13 0 266.83 L0 250.22 + Z" class="st1"/> + </g> + <g id="shape110-135" v:mID="110" v:groupContext="shape" transform="translate(29.8201,-196.244)"> + <title>Sheet.110</title> + <path d="M0 250.22 C-0 247.92 1.67 246.06 3.73 246.06 L97.79 246.06 C99.85 246.06 101.51 247.92 101.51 250.22 L101.51 + 266.83 C101.51 269.13 99.85 270.98 97.79 270.98 L3.73 270.98 C1.67 270.98 0 269.13 0 266.83 L0 250.22 Z" + class="st2"/> + </g> + <g id="shape111-137" v:mID="111" v:groupContext="shape" transform="translate(32.5663,-199.746)"> + <title>Sheet.111</title> + <desc>Key1: Value = 0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="50.7562" cy="263.792" width="101.52" height="14.3829"/> + <path d="M101.51 256.6 L0 256.6 L0 270.98 L101.51 270.98 L101.51 256.6" class="st3"/> + <text x="8.29" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key1: Value = 0</text> </g> + <g id="shape112-141" v:mID="112" v:groupContext="shape" transform="translate(18,-171.44)"> + <title>Sheet.112</title> + <path d="M0 250.22 C0 247.92 1.87 246.06 4.16 246.06 L109.18 246.06 C111.47 246.06 113.33 247.92 113.33 250.22 L113.33 + 266.83 C113.33 269.13 111.47 270.98 109.18 270.98 L4.16 270.98 C1.87 270.98 0 269.13 0 266.83 L0 250.22 + Z" class="st1"/> + </g> + <g id="shape113-143" v:mID="113" v:groupContext="shape" transform="translate(29.8201,-171.44)"> + <title>Sheet.113</title> + <path d="M0 250.22 C0 247.92 1.67 246.06 3.73 246.06 L97.79 246.06 C99.85 246.06 101.51 247.92 101.51 250.22 L101.51 + 266.83 C101.51 269.13 99.85 270.98 97.79 270.98 L3.73 270.98 C1.67 270.98 0 269.13 0 266.83 L0 250.22 Z" + class="st2"/> + </g> + <g id="shape114-145" v:mID="114" v:groupContext="shape" transform="translate(32.5663,-174.923)"> + <title>Sheet.114</title> + <desc>Key3: Value = 1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="50.7562" cy="263.792" width="101.52" height="14.3829"/> + <path d="M101.51 256.6 L0 256.6 L0 270.98 L101.51 270.98 L101.51 256.6" class="st3"/> + <text x="8.29" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key3: Value = 1</text> </g> + <g id="shape115-149" v:mID="115" v:groupContext="shape" transform="translate(18,-146.396)"> + <title>Sheet.115</title> + <path d="M0 250.12 C0 247.81 1.88 245.94 4.19 245.94 L109.15 245.94 C111.46 245.94 113.33 247.81 113.33 250.12 L113.33 + 266.81 C113.33 269.12 111.46 270.98 109.15 270.98 L4.19 270.98 C1.88 270.98 0 269.12 0 266.81 L0 250.12 + Z" class="st1"/> + </g> + <g id="shape116-151" v:mID="116" v:groupContext="shape" transform="translate(29.8201,-146.396)"> + <title>Sheet.116</title> + <path d="M0 250.12 C0 247.81 1.68 245.94 3.75 245.94 L97.77 245.94 C99.84 245.94 101.51 247.81 101.51 250.12 L101.51 + 266.81 C101.51 269.12 99.84 270.98 97.77 270.98 L3.75 270.98 C1.68 270.98 0 269.12 0 266.81 L0 250.12 Z" + class="st2"/> + </g> + <g id="shape117-153" v:mID="117" v:groupContext="shape" transform="translate(32.5663,-149.951)"> + <title>Sheet.117</title> + <desc>Key4: Value = 0</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="50.7562" cy="263.792" width="101.52" height="14.3829"/> + <path d="M101.51 256.6 L0 256.6 L0 270.98 L101.51 270.98 L101.51 256.6" class="st3"/> + <text x="8.29" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key4: Value = 0</text> </g> + <g id="shape118-157" v:mID="118" v:groupContext="shape" transform="translate(18,-121.831)"> + <title>Sheet.118</title> + <path d="M0 250.12 C0 247.81 1.88 245.94 4.19 245.94 L109.15 245.94 C111.46 245.94 113.33 247.81 113.33 250.12 L113.33 + 266.81 C113.33 269.12 111.46 270.98 109.15 270.98 L4.19 270.98 C1.88 270.98 0 269.12 0 266.81 L0 250.12 + Z" class="st1"/> + </g> + <g id="shape119-159" v:mID="119" v:groupContext="shape" transform="translate(29.8201,-121.831)"> + <title>Sheet.119</title> + <path d="M0 250.12 C0 247.81 1.68 245.94 3.75 245.94 L97.77 245.94 C99.84 245.94 101.51 247.81 101.51 250.12 L101.51 + 266.81 C101.51 269.12 99.84 270.98 97.77 270.98 L3.75 270.98 C1.68 270.98 0 269.12 0 266.81 L0 250.12 Z" + class="st2"/> + </g> + <g id="shape120-161" v:mID="120" v:groupContext="shape" transform="translate(32.5663,-125.388)"> + <title>Sheet.120</title> + <desc>Key7: Value = 1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="50.7562" cy="263.792" width="101.52" height="14.3829"/> + <path d="M101.51 256.6 L0 256.6 L0 270.98 L101.51 270.98 L101.51 256.6" class="st3"/> + <text x="8.29" y="267.39" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Key7: Value = 1</text> </g> + <g id="shape121-165" v:mID="121" v:groupContext="shape" transform="translate(140.517,-148.373)"> + <title>Sheet.121</title> + <path d="M0 236.29 L22.75 236.29 L22.75 224.73 L45.5 247.86 L22.75 270.98 L22.75 259.42 L0 259.42 L0 236.29 Z" + class="st6"/> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/eq2_expression.png b/src/spdk/dpdk/doc/guides/prog_guide/img/eq2_expression.png Binary files differnew file mode 100644 index 000000000..6ffe6c2e2 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/eq2_expression.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/eq2_factor.png b/src/spdk/dpdk/doc/guides/prog_guide/img/eq2_factor.png Binary files differnew file mode 100644 index 000000000..ff8c9019e --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/eq2_factor.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/event_crypto_adapter_op_forward.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/event_crypto_adapter_op_forward.svg new file mode 100644 index 000000000..54466f2e4 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/event_crypto_adapter_op_forward.svg @@ -0,0 +1,1078 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="720px" + height="486px" + id="svg13237" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="event_crypto_adapter_enq_deq.svg"> + <defs + id="defs13239"> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Sstart" + style="overflow:visible"> + <path + id="path8416" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(0.2) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Send" + style="overflow:visible;"> + <path + id="path8419" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;" + transform="scale(0.2) rotate(180) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="DiamondL" + orient="auto" + refY="0.0" + refX="0.0" + id="DiamondL" + style="overflow:visible"> + <path + id="path8483" + d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(0.8)" /> + </marker> + <marker + inkscape:stockid="DotL" + orient="auto" + refY="0.0" + refX="0.0" + id="DotL" + style="overflow:visible"> + <path + id="path8465" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(0.8) translate(7.4, 1)" /> + </marker> + <marker + inkscape:stockid="SquareL" + orient="auto" + refY="0.0" + refX="0.0" + id="SquareL" + style="overflow:visible"> + <path + id="path8474" + d="M -5.0,-5.0 L -5.0,5.0 L 5.0,5.0 L 5.0,-5.0 L -5.0,-5.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(0.8)" /> + </marker> + <marker + inkscape:stockid="TriangleOutL" + orient="auto" + refY="0.0" + refX="0.0" + id="TriangleOutL" + style="overflow:visible"> + <path + id="path8546" + d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(0.8)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path8404" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(0.8) translate(12.5,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path8413" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Lend" + style="overflow:visible;"> + <path + id="path8425" + style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(1.1) rotate(180) translate(1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lend" + style="overflow:visible;"> + <path + id="path8407" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;" + transform="scale(0.8) rotate(180) translate(12.5,0)" /> + </marker> + <filter + id="filter_2" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15" /> + </filter> + <filter + id="filter_2-3" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-1" /> + </filter> + <filter + id="filter_2-0" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-7" /> + </filter> + <filter + id="filter_2-0-8" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-7-7" /> + </filter> + <filter + id="filter_2-3-9" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-1-6" /> + </filter> + <filter + id="filter_2-3-6" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-1-63" /> + </filter> + <filter + id="filter_2-3-91" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-1-3" /> + </filter> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-5" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-6" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart-7" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8404-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(0.8,0,0,0.8,10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-51" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-1" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-3" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-62" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-9" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-2" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart-7-9" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8404-0-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(0.8,0,0,0.8,10,0)" /> + </marker> + <filter + id="filter_2-3-6-1" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-1-63-8" /> + </filter> + <filter + id="filter_2-3-92" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-1-2" /> + </filter> + <filter + id="filter_2-3-94" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-1-7" /> + </filter> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart-7-6" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8404-0-1" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(0.8,0,0,0.8,10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-55" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="359.77003" + inkscape:cy="287.74194" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1200" + inkscape:window-height="898" + inkscape:window-x="0" + inkscape:window-y="31" + inkscape:window-maximized="1" + inkscape:snap-nodes="false"> + <inkscape:grid + type="xygrid" + id="grid13454" /> + </sodipodi:namedview> + <metadata + id="metadata13242"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:label="Layer 1" + inkscape:groupmode="layer"> + <g + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible" + id="shape1-1-2-4" + v:mID="1" + v:groupContext="shape" + transform="matrix(2.1604167,0,0,1.5671361,88.874699,-812.39909)"> + <title + id="title22-7-5">Square</title> + <desc + id="desc24-7-8">Atomic Queue #1</desc> + <v:userDefs> + <v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /> + </v:userDefs> + <v:textBlock + v:margins="rect(4,4,4,4)" /> + <v:textRect + cx="30.75" + cy="581.25" + width="61.5" + height="61.5" /> + <g + id="shadow1-2-9-5" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st2" + id="rect27-8-7" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2-3-91)" /> + </g> + <g + id="g13515-33"> + <g + id="g13534-8"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st3" + id="rect29-1-95" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.71226478;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart-7);marker-end:none" + d="m 312.28671,240.74335 -84.28774,0" + id="path17209" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.71898615px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-mid:none;marker-end:url(#Arrow1Lend)" + d="m 221.6484,77.57125 94.28101,0" + id="path17209-8" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <g + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible" + id="shape1-1-2" + v:mID="1" + v:groupContext="shape" + transform="matrix(2.1604167,0,0,1.5671361,314.24227,-811.89589)"> + <title + id="title22-7">Square</title> + <desc + id="desc24-7">Atomic Queue #1</desc> + <v:userDefs> + <v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /> + </v:userDefs> + <v:textBlock + v:margins="rect(4,4,4,4)" /> + <v:textRect + cx="30.75" + cy="581.25" + width="61.5" + height="61.5" /> + <g + id="shadow1-2-9" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st2" + id="rect27-8" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2-3)" /> + </g> + <g + id="g13515"> + <g + id="g13534"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st3" + id="rect29-1" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.72471404;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);marker-end:none" + d="m 89.025329,74.39932 -64.275286,0" + id="path17209-3" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0.73232502,0,0,0.75477602,-4.325033,28.642983)" + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161-3" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" /> + <path + transform="matrix(0.73232502,0,0,0.75477602,-1.93108,192.80833)" + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161-1" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.75141162;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart-7);marker-end:none" + d="m 18.763392,120.7432 68.995153,0" + id="path17209-3-0" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <path + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" + transform="matrix(0.73232502,0,0,0.75477602,-218.16394,72.68276)" /> + <path + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161-2" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" + transform="matrix(0.73232502,0,0,0.75477602,-217.40136,26.716271)" /> + <g + id="g29167-4" + transform="matrix(0.73232502,0,0,0.75477602,-217.31662,28.007562)"> + <text + sodipodi:linespacing="125%" + id="text29163-9" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-9" + sodipodi:role="line">1</tspan></text> + </g> + <g + id="g29167-9" + transform="matrix(0.73232502,0,0,0.75477602,-4.9726112,28.689051)"> + <text + sodipodi:linespacing="125%" + id="text29163-3" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-3" + sodipodi:role="line">2</tspan></text> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.67803264px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart-7);marker-end:none" + d="m 181,214.66098 0,-69.32196" + id="path17211-7-1-6" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <g + id="g29167" + transform="matrix(0.73232502,0,0,0.75477602,-218.07919,73.10621)"> + <text + sodipodi:linespacing="125%" + id="text29163" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165" + sodipodi:role="line">8</tspan></text> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.67803264px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart-7);marker-end:none" + d="m 131,145.8531 0,69.32197" + id="path17211-7-1" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0.73232502,0,0,0.75477602,-140.37076,129.97088)" + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161-8" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" /> + <g + id="g29167-2" + transform="matrix(0.73232502,0,0,0.75477602,-140.28602,131.01695)"> + <text + sodipodi:linespacing="125%" + id="text29163-92" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-8" + sodipodi:role="line">7</tspan></text> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.71898615px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-mid:none;marker-end:url(#Arrow1Lend)" + d="m 317.1405,116 -94.281,0" + id="path17209-8-0" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0.73232502,0,0,0.75477602,-3.4914,66.68745)" + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161-6" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" /> + <g + id="g29167-46" + transform="matrix(0.73232502,0,0,0.75477602,-4.40666,67.48829)"> + <text + sodipodi:linespacing="125%" + id="text29163-1" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-5" + sodipodi:role="line">3</tspan></text> + </g> + <path + transform="matrix(0.73232502,0,0,0.75477602,-90.692582,130.31695)" + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161-8-6" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" /> + <g + id="g29167-6" + transform="matrix(0.73232502,0,0,0.75477602,-90.84634,131.60918)"> + <text + sodipodi:linespacing="125%" + id="text29163-17" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-2" + sodipodi:role="line">4</tspan></text> + </g> + <g + id="g29167-2-0" + transform="matrix(0.73232502,0,0,0.75477602,-2.424397,194.0216)"> + <text + sodipodi:linespacing="125%" + id="text29163-92-6" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-8-2" + sodipodi:role="line">5</tspan></text> + </g> + <g + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible" + id="shape1-1-2-8" + v:mID="1" + v:groupContext="shape" + transform="matrix(2.1604167,0,0,1.5671361,93.82055,-648.98949)"> + <title + id="title22-7-97">Square</title> + <desc + id="desc24-7-3">Atomic Queue #1</desc> + <v:userDefs> + <v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /> + </v:userDefs> + <v:textBlock + v:margins="rect(4,4,4,4)" /> + <v:textRect + cx="30.75" + cy="581.25" + width="61.5" + height="61.5" /> + <g + id="shadow1-2-9-6" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st2" + id="rect27-8-12" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2-3-92)" /> + </g> + <g + id="g13515-9"> + <g + id="g13534-3"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st3" + id="rect29-1-1" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /> + </g> + </g> + </g> + <g + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible" + id="shape1-1-2-84" + v:mID="1" + v:groupContext="shape" + transform="matrix(2.1604167,0,0,1.5671361,314.82055,-648.98949)"> + <title + id="title22-7-50">Square</title> + <desc + id="desc24-7-36">Atomic Queue #1</desc> + <v:userDefs> + <v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /> + </v:userDefs> + <v:textBlock + v:margins="rect(4,4,4,4)" /> + <v:textRect + cx="30.75" + cy="581.25" + width="61.5" + height="61.5" /> + <g + id="shadow1-2-9-1" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st2" + id="rect27-8-0" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2-3-94)" /> + </g> + <g + id="g13515-6"> + <g + id="g13534-32"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st3" + id="rect29-1-0" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.71226478;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Lend)" + d="m 313.14387,285 -84.28774,0" + id="path17209-7" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0.73232502,0,0,0.75477602,-2.692582,236.31695)" + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161-1-6" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" /> + <g + id="g29167-2-0-5" + transform="matrix(0.73232502,0,0,0.75477602,-2.424397,237.0216)"> + <text + sodipodi:linespacing="125%" + id="text29163-92-6-6" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-8-2-9" + sodipodi:role="line">6</tspan></text> + </g> + <g + id="g29167-4-3" + transform="matrix(0.73232502,0,0,0.75477602,-154.60784,51.117791)"> + <text + sodipodi:linespacing="125%" + id="text29163-9-6" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:24.21093369px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-9-7" + sodipodi:role="line">Eventdev</tspan></text> + </g> + <g + id="g29167-4-3-5" + transform="matrix(0.73232502,0,0,0.75477602,-144.65044,201.97821)"> + <text + sodipodi:linespacing="125%" + id="text29163-9-6-3" + y="70" + x="412.93716" + style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:24.21093369px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="412.93716" + id="tspan29165-9-7-5" + sodipodi:role="line">Crypto</tspan><tspan + style="font-size:24.21093369px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + y="100.26366" + x="412.93716" + sodipodi:role="line" + id="tspan3201">Adapter</tspan></text> + </g> + <g + id="g29167-4-3-5-6" + transform="matrix(0.73232502,0,0,0.75477602,79.53518,46.62529)"> + <text + sodipodi:linespacing="125%" + id="text29163-9-6-3-2" + y="48.801659" + x="412.93716" + style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:24.21093369px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + y="48.801659" + x="412.93716" + sodipodi:role="line" + id="tspan3155">Application</tspan><tspan + style="font-size:24.21093369px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + y="79.065323" + x="412.93716" + sodipodi:role="line" + id="tspan3201-1">in ordered</tspan><tspan + style="font-size:24.21093369px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + y="109.32899" + x="412.93716" + sodipodi:role="line" + id="tspan3161">stage</tspan></text> + </g> + <g + id="g29167-4-3-5-2" + transform="matrix(0.73232502,0,0,0.75477602,77.535182,213.62529)"> + <text + sodipodi:linespacing="125%" + id="text29163-9-6-3-7" + y="70" + x="412.93716" + style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:24.21093369px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="412.93716" + sodipodi:role="line" + id="tspan3201-9">Cryptodev</tspan></text> + </g> + <g + id="g29167-4-3-5-3" + transform="matrix(0.73232502,0,0,0.75477602,188.53518,-3.37471)"> + <text + sodipodi:linespacing="125%" + id="text29163-9-6-3-6" + y="70" + x="375.65271" + style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="375.65271" + sodipodi:role="line" + id="tspan3201-6">1. Events from the previous stage.</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="93.538406" + x="375.65271" + sodipodi:role="line" + id="tspan3260" /><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="117.07681" + x="375.65271" + sodipodi:role="line" + id="tspan3262">2. Application in ordered stage</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="140.61522" + x="375.65271" + sodipodi:role="line" + id="tspan3288"> dequeues events from eventdev.</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="164.15363" + x="375.65271" + sodipodi:role="line" + id="tspan3264" /><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="187.69203" + x="375.65271" + sodipodi:role="line" + id="tspan3266">3. Application enqueues crypto</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="211.23044" + x="375.65271" + sodipodi:role="line" + id="tspan3290"> operations as events to eventdev.</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="234.76884" + x="375.65271" + sodipodi:role="line" + id="tspan3268" /><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="258.30725" + x="375.65271" + sodipodi:role="line" + id="tspan3270">4. Crypto adapter dequeues event</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="281.84564" + x="375.65271" + sodipodi:role="line" + id="tspan3292"> from eventdev.</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="305.38406" + x="375.65271" + sodipodi:role="line" + id="tspan3272" /><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="328.92245" + x="375.65271" + sodipodi:role="line" + id="tspan3274">5. Crypto adapter submits crypto</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="352.46088" + x="375.65271" + sodipodi:role="line" + id="tspan3294"> operations to cryptodev (Atomic</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="375.99927" + x="375.65271" + sodipodi:role="line" + id="tspan3296"> stage)</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="399.53769" + x="375.65271" + sodipodi:role="line" + id="tspan3276" /><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="423.07608" + x="375.65271" + sodipodi:role="line" + id="tspan3278">6. Crypto adapter dequeues crypto</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="446.6145" + x="375.65271" + sodipodi:role="line" + id="tspan3298"> completions from cryptodev</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="470.15289" + x="375.65271" + sodipodi:role="line" + id="tspan3280" /><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="493.69131" + x="375.65271" + sodipodi:role="line" + id="tspan3282">7. Crypto adapter enqueues events</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="517.22974" + x="375.65271" + sodipodi:role="line" + id="tspan3300"> to the eventdev</tspan><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="540.76813" + x="375.65271" + sodipodi:role="line" + id="tspan3284" /><tspan + style="font-size:18.83072472px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="564.30652" + x="375.65271" + sodipodi:role="line" + id="tspan3286">8. Events to the next stage</tspan></text> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/event_crypto_adapter_op_new.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/event_crypto_adapter_op_new.svg new file mode 100644 index 000000000..256862edc --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/event_crypto_adapter_op_new.svg @@ -0,0 +1,1061 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="720px" + height="486px" + id="svg13237" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="event_crypto_adapter_deq_only.svg"> + <defs + id="defs13239"> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Sstart" + style="overflow:visible"> + <path + id="path8416" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(0.2) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Send" + style="overflow:visible;"> + <path + id="path8419" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;" + transform="scale(0.2) rotate(180) translate(6,0)" /> + </marker> + <marker + inkscape:stockid="DiamondL" + orient="auto" + refY="0.0" + refX="0.0" + id="DiamondL" + style="overflow:visible"> + <path + id="path8483" + d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(0.8)" /> + </marker> + <marker + inkscape:stockid="DotL" + orient="auto" + refY="0.0" + refX="0.0" + id="DotL" + style="overflow:visible"> + <path + id="path8465" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(0.8) translate(7.4, 1)" /> + </marker> + <marker + inkscape:stockid="SquareL" + orient="auto" + refY="0.0" + refX="0.0" + id="SquareL" + style="overflow:visible"> + <path + id="path8474" + d="M -5.0,-5.0 L -5.0,5.0 L 5.0,5.0 L 5.0,-5.0 L -5.0,-5.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(0.8)" /> + </marker> + <marker + inkscape:stockid="TriangleOutL" + orient="auto" + refY="0.0" + refX="0.0" + id="TriangleOutL" + style="overflow:visible"> + <path + id="path8546" + d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(0.8)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path8404" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(0.8) translate(12.5,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path8413" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;" + transform="scale(0.4) rotate(180) translate(10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Lend" + style="overflow:visible;"> + <path + id="path8425" + style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(1.1) rotate(180) translate(1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lend" + style="overflow:visible;"> + <path + id="path8407" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;" + transform="scale(0.8) rotate(180) translate(12.5,0)" /> + </marker> + <filter + id="filter_2" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15" /> + </filter> + <filter + id="filter_2-3" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-1" /> + </filter> + <filter + id="filter_2-0" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-7" /> + </filter> + <filter + id="filter_2-0-8" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-7-7" /> + </filter> + <filter + id="filter_2-3-9" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-1-6" /> + </filter> + <filter + id="filter_2-3-6" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-1-63" /> + </filter> + <filter + id="filter_2-3-91" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-1-3" /> + </filter> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-5" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-6" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart-7" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8404-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(0.8,0,0,0.8,10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-51" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-1" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-3" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-62" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-9" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-2" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path8407-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" /> + </marker> + <filter + id="filter_2-3-91-3" + color-interpolation-filters="sRGB"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur15-1-3-6" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="511.66308" + inkscape:cy="233.69667" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1200" + inkscape:window-height="898" + inkscape:window-x="0" + inkscape:window-y="31" + inkscape:window-maximized="1" + inkscape:snap-nodes="false"> + <inkscape:grid + type="xygrid" + id="grid13454" /> + </sodipodi:namedview> + <metadata + id="metadata13242"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:label="Layer 1" + inkscape:groupmode="layer"> + <g + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible" + id="shape1-1-2-0" + v:mID="1" + v:groupContext="shape" + transform="matrix(2.1604167,0,0,1.5671361,323.2187,-540.25927)"> + <title + id="title22-7-6">Square</title> + <desc + id="desc24-7-4">Atomic Queue #1</desc> + <v:userDefs> + <v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /> + </v:userDefs> + <v:textBlock + v:margins="rect(4,4,4,4)" /> + <v:textRect + cx="30.75" + cy="581.25" + width="61.5" + height="61.5" /> + <g + id="shadow1-2-9-0" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st2" + id="rect27-8-9" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2-3-9)" /> + </g> + <g + id="g13515-4"> + <g + id="g13534-5"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st3" + id="rect29-1-4" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /> + </g> + </g> + </g> + <g + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible" + id="shape1-1-2-4" + v:mID="1" + v:groupContext="shape" + transform="matrix(2.1604167,0,0,1.165886,88.874699,-447.8809)"> + <title + id="title22-7-5">Square</title> + <desc + id="desc24-7-8">Atomic Queue #1</desc> + <v:userDefs> + <v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /> + </v:userDefs> + <v:textBlock + v:margins="rect(4,4,4,4)" /> + <v:textRect + cx="30.75" + cy="581.25" + width="61.5" + height="61.5" /> + <g + id="shadow1-2-9-5" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st2" + id="rect27-8-7" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2-3-91)" /> + </g> + <g + id="g13515-33"> + <g + id="g13534-8"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st3" + id="rect29-1-95" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /> + </g> + </g> + </g> + <g + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible" + id="shape1-1-2-9" + v:mID="1" + v:groupContext="shape" + transform="matrix(2.1604167,0,0,1.5671361,88.874699,-538.24651)"> + <title + id="title22-7-9">Square</title> + <desc + id="desc24-7-5">Atomic Queue #1</desc> + <v:userDefs> + <v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /> + </v:userDefs> + <v:textBlock + v:margins="rect(4,4,4,4)" /> + <v:textRect + cx="30.75" + cy="581.25" + width="61.5" + height="61.5" /> + <g + id="shadow1-2-9-2" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st2" + id="rect27-8-1" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2-3-6)" /> + </g> + <g + id="g13515-3"> + <g + id="g13534-0"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st3" + id="rect29-1-9" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.74346578px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-mid:none;marker-end:url(#Arrow1Lend)" + d="m 220.66064,98.57125 101.22528,0" + id="path17209-8" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <g + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible" + id="shape1-1-2" + v:mID="1" + v:groupContext="shape" + transform="matrix(2.1604167,0,0,1.5671361,322.24227,-811.89589)"> + <title + id="title22-7">Square</title> + <desc + id="desc24-7">Atomic Queue #1</desc> + <v:userDefs> + <v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /> + </v:userDefs> + <v:textBlock + v:margins="rect(4,4,4,4)" /> + <v:textRect + cx="30.75" + cy="581.25" + width="61.5" + height="61.5" /> + <g + id="shadow1-2-9" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st2" + id="rect27-8" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2-3)" /> + </g> + <g + id="g13515"> + <g + id="g13534"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st3" + id="rect29-1" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /> + </g> + </g> + </g> + <g + id="g13518" + transform="matrix(0.73232502,0,0,0.75477602,25.29268,348.89752)"> + <g + id="g13526"> + <flowRoot + xml:space="preserve" + id="flowRoot13464-9" + style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + transform="translate(-12.00521,-129.65179)"><flowRegion + id="flowRegion13466-1"><rect + id="rect13468-2" + width="195.99997" + height="112.00001" + x="273.33334" + y="175.33333" + style="text-align:center;text-anchor:middle" /></flowRegion><flowPara + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + id="flowPara13511" /></flowRoot> </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.75145501;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);marker-end:none" + d="m 176.26096,124.64833 0,69.24854" + id="path17209-3" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0.73232502,0,0,0.75477602,-4.325033,50.642983)" + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161-3" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.74346578px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-mid:none;marker-end:url(#Arrow1Lend)" + d="m 322.61264,375 -101.22528,0" + id="path17209-8-0" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0.73232502,0,0,0.75477602,0.0689171,324.80833)" + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161-1" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.62908167px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 155,324.19955 0,-59.37092" + id="path17211-7-1" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0.73232502,0,0,0.75477602,-116.37076,245.97088)" + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161-8" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.75058991;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart-7);marker-end:none" + d="m 126.26097,124.99178 0,69.24941" + id="path17209-3-0" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <path + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" + transform="matrix(0.73232502,0,0,0.75477602,-146.16394,110.68276)" /> + <path + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161-2" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" + transform="matrix(0.73232502,0,0,0.75477602,-95.40136,110.71627)" /> + <g + id="g29167-4" + transform="matrix(0.73232502,0,0,0.75477602,-95.31662,112.00756)"> + <text + sodipodi:linespacing="125%" + id="text29163-9" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-9" + sodipodi:role="line">1</tspan></text> + </g> + <g + id="g29167-9" + transform="matrix(0.73232502,0,0,0.75477602,-4.9726112,50.689051)"> + <text + sodipodi:linespacing="125%" + id="text29163-3" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-3" + sodipodi:role="line">2</tspan></text> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1.04032874px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 388.20118,147.93341 0,173.95967" + id="path17211-7" + inkscape:connector-type="orthogonal" + inkscape:connector-curvature="0" /> + <path + transform="matrix(0.73232502,0,0,0.75477602,116.5086,136.68745)" + sodipodi:type="arc" + style="fill:#539de6;fill-opacity:1;stroke:#0000ea;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path29161-6" + sodipodi:cx="371" + sodipodi:cy="64.5" + sodipodi:rx="17" + sodipodi:ry="15.5" + d="m 388,64.5 a 17,15.5 0 1 1 -34,0 17,15.5 0 1 1 34,0 z" /> + <g + id="g29167-46" + transform="matrix(0.73232502,0,0,0.75477602,116.59334,137.48829)"> + <text + sodipodi:linespacing="125%" + id="text29163-1" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-5" + sodipodi:role="line">3</tspan></text> + </g> + <g + id="g29167-6" + transform="matrix(0.73232502,0,0,0.75477602,0.1536639,325.60918)"> + <text + sodipodi:linespacing="125%" + id="text29163-17" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-2" + sodipodi:role="line">4</tspan></text> + </g> + <g + id="g29167" + transform="matrix(0.73232502,0,0,0.75477602,-146.07919,111.10621)"> + <text + sodipodi:linespacing="125%" + id="text29163" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165" + sodipodi:role="line">6</tspan></text> + </g> + <g + id="g29167-4-3" + transform="matrix(0.73232502,0,0,0.75477602,-117.60784,180.11779)"> + <text + sodipodi:linespacing="125%" + id="text29163-9-6" + y="70" + x="321.30356" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:24.21093369px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="321.30356" + id="tspan29165-9-7" + sodipodi:role="line">Eventdev</tspan></text> + </g> + <g + id="g29167-4-3-5" + transform="matrix(0.73232502,0,0,0.75477602,55.34956,26.97821)"> + <text + sodipodi:linespacing="100%" + id="text29163-9-6-3" + y="70" + x="454.74152" + style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="454.74152" + id="tspan29165-9-7-5" + sodipodi:role="line">A<tspan + style="line-height:100%" + id="tspan3374">tomic stage</tspan></tspan><tspan + style="font-size:21.52082825000000099px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + y="96.901031" + x="454.74152" + sodipodi:role="line" + id="tspan3320">+</tspan><tspan + style="font-size:21.52082825000000099px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + y="123.80207" + x="454.74152" + sodipodi:role="line" + id="tspan3322">enqueue to</tspan><tspan + style="font-size:21.52082825000000099px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + y="150.70311" + x="454.74152" + sodipodi:role="line" + id="tspan3324">cryptodev</tspan></text> + </g> + <g + id="g29167-2" + transform="matrix(0.73232502,0,0,0.75477602,-116.28602,248.01695)"> + <text + sodipodi:linespacing="125%" + id="text29163-92" + y="70" + x="365" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="365" + id="tspan29165-8" + sodipodi:role="line">5</tspan></text> + </g> + <flowRoot + xml:space="preserve" + id="flowRoot3376" + style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:18px;line-height:125%;letter-spacing:0px;word-spacing:0px"><flowRegion + id="flowRegion3378"><rect + id="rect3380" + width="100" + height="37" + x="109" + y="259" /></flowRegion><flowPara + id="flowPara3382" /></flowRoot> <g + id="g29167-4-3-1" + transform="matrix(0.73232502,0,0,0.75477602,109.34956,323.97821)"> + <text + sodipodi:linespacing="125%" + id="text29163-9-6-8" + y="70" + x="321.30356" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:24.21093369px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="321.30356" + id="tspan29165-9-7-7" + sodipodi:role="line">Cryptodev</tspan></text> + </g> + <g + id="g29167-4-3-1-9" + transform="matrix(0.73232502,0,0,0.75477602,-114.48565,314.20704)"> + <text + sodipodi:linespacing="125%" + id="text29163-9-6-8-2" + y="70" + x="368.01718" + style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:24.21093369px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="368.01718" + id="tspan29165-9-7-7-0" + sodipodi:role="line">Crypto</tspan><tspan + style="font-size:24.21093369px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" + y="100.26366" + x="368.01718" + sodipodi:role="line" + id="tspan3488">adapter</tspan></text> + </g> + <g + id="g29167-4-3-1-9-2" + transform="matrix(0.73232502,0,0,0.75477602,250.96804,192.62529)"> + <text + sodipodi:linespacing="125%" + id="text29163-9-6-8-2-3" + y="-188.35481" + x="318.61978" + style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="-188.35481" + x="318.61978" + sodipodi:role="line" + id="tspan3543">1. Application dequeues</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="-161.45378" + x="318.61978" + sodipodi:role="line" + id="tspan3196"> events from the previous</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="-134.55275" + x="318.61978" + sodipodi:role="line" + id="tspan3232"> stage</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="-107.65171" + x="318.61978" + sodipodi:role="line" + id="tspan3519" /><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="-80.750671" + x="318.61978" + sodipodi:role="line" + id="tspan3551">2. Application prepares the</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="-53.84964" + x="318.61978" + sodipodi:role="line" + id="tspan3203"> crypto operations.</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="-26.948603" + x="318.61978" + sodipodi:role="line" + id="tspan3523" /><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="-0.047568277" + x="318.61978" + sodipodi:role="line" + id="tspan3541">3. Crypto operations are</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="26.853468" + x="318.61978" + sodipodi:role="line" + id="tspan3207"> submitted to cryptodev</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="53.754501" + x="318.61978" + sodipodi:role="line" + id="tspan3209"> by application..</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="80.65554" + x="318.61978" + sodipodi:role="line" + id="tspan3527" /><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="107.55657" + x="318.61978" + sodipodi:role="line" + id="tspan3547">4. Crypto adapter dequeues</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="134.45761" + x="318.61978" + sodipodi:role="line" + id="tspan3216"> crypto completions from</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="161.35864" + x="318.61978" + sodipodi:role="line" + id="tspan3218"> cryptodev.</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="188.25969" + x="318.61978" + sodipodi:role="line" + id="tspan3531" /><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="215.16072" + x="318.61978" + sodipodi:role="line" + id="tspan3549">5. Crypto adapter enqueues</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="242.06175" + x="318.61978" + sodipodi:role="line" + id="tspan3222"> events to the eventdev.</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="268.96277" + x="318.61978" + sodipodi:role="line" + id="tspan3535" /><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="295.8638" + x="318.61978" + sodipodi:role="line" + id="tspan3537">6. Application dequeues from</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="322.76483" + x="318.61978" + sodipodi:role="line" + id="tspan3224"> eventdev and prepare for</tspan><tspan + style="font-size:21.52082825px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="349.66586" + x="318.61978" + sodipodi:role="line" + id="tspan3226"> further processing</tspan></text> + </g> + <g + style="font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible" + id="shape1-1-2-4-7" + v:mID="1" + v:groupContext="shape" + transform="matrix(2.1604167,0,0,1.165886,90.820551,-587.97129)"> + <title + id="title22-7-5-5">Square</title> + <desc + id="desc24-7-8-3">Atomic Queue #1</desc> + <v:userDefs> + <v:ud + v:nameU="visVersion" + v:val="VT0(15):26" /> + </v:userDefs> + <v:textBlock + v:margins="rect(4,4,4,4)" /> + <v:textRect + cx="30.75" + cy="581.25" + width="61.5" + height="61.5" /> + <g + id="shadow1-2-9-5-5" + v:groupContext="shadow" + v:shadowOffsetX="0.345598" + v:shadowOffsetY="-1.97279" + v:shadowType="1" + transform="translate(0.345598,1.97279)" + class="st1" + style="visibility:visible"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st2" + id="rect27-8-7-6" + style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2-3-91-3)" /> + </g> + <g + id="g13515-33-2"> + <g + id="g13534-8-9"> + <rect + x="0" + y="550.5" + width="61.5" + height="61.5" + class="st3" + id="rect29-1-95-1" + style="fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25" /> + </g> + </g> + </g> + <g + id="g29167-4-3-2" + transform="matrix(0.73232502,0,0,0.75477602,-125.66199,44.027402)"> + <text + sodipodi:linespacing="125%" + id="text29163-9-6-7" + y="70" + x="321.30356" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:24.21093369px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + y="70" + x="321.30356" + id="tspan29165-9-7-0" + sodipodi:role="line">Application</tspan></text> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/eventdev_usage.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/eventdev_usage.svg new file mode 100644 index 000000000..c19818b90 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/eventdev_usage.svg @@ -0,0 +1,549 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export eventdev_usage.svg Page-1 --> +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2018 Arm --> + +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="9.04167in" height="1.84602in" + viewBox="0 0 651 132.913" xml:space="preserve" color-interpolation-filters="sRGB" class="st12"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:#3c63ac;stroke:#30518f;stroke-width:0.75} + .st2 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st3 {fill:none;stroke:#203864;stroke-width:0.25} + .st4 {stroke:#203864;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st5 {fill:#ffd965;stroke:#203864;stroke-width:0.25} + .st6 {fill:#000000;font-family:Calibri;font-size:1.16666em} + .st7 {font-size:1em} + .st8 {fill:none;stroke:none;stroke-width:0.25} + .st9 {fill:#000000;font-family:Calibri;font-size:0.833336em} + .st10 {fill:#000000;font-family:Calibri;font-size:1.00001em} + .st11 {font-size:1.16665em} + .st12 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <v:layer v:name="Connector" v:index="0"/> + <g id="group1068-1" transform="translate(0.75,-0.25)" v:mID="1068" v:groupContext="group"> + <title>Sheet.1068</title> + <g id="shape3-2" v:mID="3" v:groupContext="shape" transform="translate(63,184.827) rotate(180)"> + <title>Simple Arrow</title> + <desc>In Intf</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="ArrowType" v:prompt="" v:val="VT0(2):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="31.5" cy="132.913" width="63.01" height="0" transform="rotate(180)"/> + <path d="M0 132.91 L12 120.92 L12 126.92 L63 126.92 L63 132.91 L63 138.91 L12 138.91 L12 144.91 L0 132.91 Z" + class="st1"/> + <text x="-43.6" y="-129.91" transform="rotate(180)" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>In Intf</text> </g> + <g id="group1010-5" transform="translate(130.5,-73.3167)" v:mID="1010" v:groupContext="group"> + <title>Sheet.1010</title> + <g id="group1000-6" transform="translate(-2.19824E-14,-0.0534178)" v:mID="1000" v:groupContext="group"> + <title>Sheet.1000</title> + <g id="shape1001-7" v:mID="1001" v:groupContext="shape" transform="translate(0,-4.86)"> + <title>Rectangle.38</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <rect x="0" y="123.913" width="22.3966" height="8.99999" class="st3"/> + </g> + <g id="shape1002-9" v:mID="1002" v:groupContext="shape" v:layerMember="0" transform="translate(2.19832,-18.18)"> + <title>Dynamic connector.162</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + <g id="shape1003-12" v:mID="1003" v:groupContext="shape" v:layerMember="0" + transform="translate(7.79747,-18.18)"> + <title>Dynamic connector.163</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + <g id="shape1004-15" v:mID="1004" v:groupContext="shape" v:layerMember="0" transform="translate(-3.40084,-18)"> + <title>Dynamic connector.164</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + </g> + <g id="group1005-18" transform="translate(22.6034,0)" v:mID="1005" v:groupContext="group"> + <title>Sheet.1005</title> + <g id="shape1006-19" v:mID="1006" v:groupContext="shape" transform="translate(0,-4.86)"> + <title>Rectangle.38</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <rect x="0" y="123.913" width="22.3966" height="8.99999" class="st3"/> + </g> + <g id="shape1007-21" v:mID="1007" v:groupContext="shape" v:layerMember="0" + transform="translate(2.19832,-18.18)"> + <title>Dynamic connector.162</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + <g id="shape1008-24" v:mID="1008" v:groupContext="shape" v:layerMember="0" + transform="translate(7.79747,-18.18)"> + <title>Dynamic connector.163</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + <g id="shape1009-27" v:mID="1009" v:groupContext="shape" v:layerMember="0" transform="translate(-3.40084,-18)"> + <title>Dynamic connector.164</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + </g> + </g> + <g id="group1016-30" transform="translate(301.5,-73.3167)" v:mID="1016" v:groupContext="group"> + <title>Sheet.1016</title> + <g id="group1017-31" transform="translate(-2.19824E-14,-0.0534178)" v:mID="1017" v:groupContext="group"> + <title>Sheet.1017</title> + <g id="shape1018-32" v:mID="1018" v:groupContext="shape" transform="translate(0,-4.86)"> + <title>Rectangle.38</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <rect x="0" y="123.913" width="22.3966" height="8.99999" class="st3"/> + </g> + <g id="shape1019-34" v:mID="1019" v:groupContext="shape" v:layerMember="0" + transform="translate(2.19832,-18.18)"> + <title>Dynamic connector.162</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + <g id="shape1020-37" v:mID="1020" v:groupContext="shape" v:layerMember="0" + transform="translate(7.79747,-18.18)"> + <title>Dynamic connector.163</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + <g id="shape1021-40" v:mID="1021" v:groupContext="shape" v:layerMember="0" transform="translate(-3.40084,-18)"> + <title>Dynamic connector.164</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + </g> + <g id="group1022-43" transform="translate(22.6034,0)" v:mID="1022" v:groupContext="group"> + <title>Sheet.1022</title> + <g id="shape1023-44" v:mID="1023" v:groupContext="shape" transform="translate(0,-4.86)"> + <title>Rectangle.38</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <rect x="0" y="123.913" width="22.3966" height="8.99999" class="st3"/> + </g> + <g id="shape1024-46" v:mID="1024" v:groupContext="shape" v:layerMember="0" + transform="translate(2.19832,-18.18)"> + <title>Dynamic connector.162</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + <g id="shape1025-49" v:mID="1025" v:groupContext="shape" v:layerMember="0" + transform="translate(7.79747,-18.18)"> + <title>Dynamic connector.163</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + <g id="shape1026-52" v:mID="1026" v:groupContext="shape" v:layerMember="0" transform="translate(-3.40084,-18)"> + <title>Dynamic connector.164</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + </g> + </g> + <g id="group1032-55" transform="translate(468,-73.2)" v:mID="1032" v:groupContext="group"> + <title>Sheet.1032</title> + <g id="group1033-56" transform="translate(-2.19824E-14,-0.0534178)" v:mID="1033" v:groupContext="group"> + <title>Sheet.1033</title> + <g id="shape1034-57" v:mID="1034" v:groupContext="shape" transform="translate(0,-4.86)"> + <title>Rectangle.38</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <rect x="0" y="123.913" width="22.3966" height="8.99999" class="st3"/> + </g> + <g id="shape1035-59" v:mID="1035" v:groupContext="shape" v:layerMember="0" + transform="translate(2.19832,-18.18)"> + <title>Dynamic connector.162</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + <g id="shape1036-62" v:mID="1036" v:groupContext="shape" v:layerMember="0" + transform="translate(7.79747,-18.18)"> + <title>Dynamic connector.163</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + <g id="shape1037-65" v:mID="1037" v:groupContext="shape" v:layerMember="0" transform="translate(-3.40084,-18)"> + <title>Dynamic connector.164</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + </g> + <g id="group1038-68" transform="translate(22.6034,0)" v:mID="1038" v:groupContext="group"> + <title>Sheet.1038</title> + <g id="shape1039-69" v:mID="1039" v:groupContext="shape" transform="translate(0,-4.86)"> + <title>Rectangle.38</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <rect x="0" y="123.913" width="22.3966" height="8.99999" class="st3"/> + </g> + <g id="shape1040-71" v:mID="1040" v:groupContext="shape" v:layerMember="0" + transform="translate(2.19832,-18.18)"> + <title>Dynamic connector.162</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + <g id="shape1041-74" v:mID="1041" v:groupContext="shape" v:layerMember="0" + transform="translate(7.79747,-18.18)"> + <title>Dynamic connector.163</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + <g id="shape1042-77" v:mID="1042" v:groupContext="shape" v:layerMember="0" transform="translate(-3.40084,-18)"> + <title>Dynamic connector.164</title> + <path d="M9 137.41 L9 146.41" class="st4"/> + </g> + </g> + </g> + <g id="shape1044-80" v:mID="1044" v:groupContext="shape" transform="translate(651.291,179.381) rotate(179.228)"> + <title>Simple Arrow.1044</title> + <desc>Out Intf</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="ArrowType" v:prompt="" v:val="VT0(2):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="30.3028" cy="132.913" width="60.61" height="0" transform="rotate(180)"/> + <path d="M0 132.91 L12 120.92 L12 126.92 L60.61 126.92 L60.61 132.91 L60.61 138.91 L12 138.91 L12 144.91 L0 132.91 + Z" class="st1"/> + <text x="-46.13" y="-129.91" transform="rotate(180)" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Out Intf</text> </g> + <g id="shape1045-83" v:mID="1045" v:groupContext="shape" transform="translate(67.8,-50.9334)"> + <title>Rounded Rectangle.1045</title> + <desc>RX Core</desc> + <v:userDefs> + <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.0703125):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.0703125):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.0703125):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.0703125):1"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="25.3125" cy="101.413" width="50.63" height="63"/> + <path d="M5.06 132.91 L45.56 132.91 A5.06242 5.06242 -180 0 0 50.62 127.85 L50.62 74.98 A5.06242 5.06242 -180 0 0 + 45.56 69.91 L5.06 69.91 A5.06242 5.06242 -180 0 0 0 74.98 L0 127.85 A5.06242 5.06242 -180 0 0 5.06 132.91 + Z" class="st5"/> + <text x="17.88" y="88.81" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>RX<v:newlineChar/><v:newlineChar/><tspan + x="11.97" dy="2.4em" class="st7">Core</tspan></text> </g> + <g id="shape1056-87" v:mID="1056" v:groupContext="shape" transform="translate(532.5,-54)"> + <title>Rounded Rectangle.1056</title> + <desc>TX Core</desc> + <v:userDefs> + <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.0703125):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.0703125):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.0703125):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.0703125):1"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="25.3125" cy="101.413" width="50.63" height="63"/> + <path d="M5.06 132.91 L45.56 132.91 A5.06242 5.06242 -180 0 0 50.62 127.85 L50.62 74.98 A5.06242 5.06242 -180 0 0 + 45.56 69.91 L5.06 69.91 A5.06242 5.06242 -180 0 0 0 74.98 L0 127.85 A5.06242 5.06242 -180 0 0 5.06 132.91 + Z" class="st5"/> + <text x="18.27" y="88.81" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>TX<v:newlineChar/><v:newlineChar/><tspan + x="11.97" dy="2.4em" class="st7">Core</tspan></text> </g> + <g id="shape1057-91" v:mID="1057" v:groupContext="shape" transform="translate(123.188,-59.0334)"> + <title>Rectangle.1057</title> + <desc>Atomic Q 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="29.8125" cy="123.797" width="59.63" height="18.2334"/> + <rect x="0" y="114.68" width="59.625" height="18.2334" class="st8"/> + <text x="7.19" y="126.8" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Atomic Q 1</text> </g> + <g id="shape1058-94" v:mID="1058" v:groupContext="shape" transform="translate(295.5,-59.4)"> + <title>Rectangle.1058</title> + <desc>Atomic Q 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="29.8125" cy="123.797" width="59.63" height="18.2334"/> + <rect x="0" y="114.68" width="59.625" height="18.2334" class="st8"/> + <text x="7.19" y="126.8" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Atomic Q 2</text> </g> + <g id="shape1059-97" v:mID="1059" v:groupContext="shape" transform="translate(460.687,-58.3167)"> + <title>Rectangle.1059</title> + <desc>Single Link</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="29.8125" cy="123.797" width="59.63" height="18.2334"/> + <rect x="0" y="114.68" width="59.625" height="18.2334" class="st8"/> + <text x="8.47" y="126.8" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Single Link</text> </g> + <g id="shape1060-100" v:mID="1060" v:groupContext="shape" transform="translate(198,-1.2)"> + <title>Rectangle.1060</title> + <desc>Stage 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="29.8125" cy="123.797" width="59.63" height="18.2334"/> + <rect x="0" y="114.68" width="59.625" height="18.2334" class="st8"/> + <text x="14.94" y="126.8" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Stage 1</text> </g> + <g id="shape1061-103" v:mID="1061" v:groupContext="shape" transform="translate(366.188,0)"> + <title>Rectangle.1061</title> + <desc>Stage 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="29.8125" cy="123.797" width="59.63" height="18.2334"/> + <rect x="0" y="114.68" width="59.625" height="18.2334" class="st8"/> + <text x="14.94" y="126.8" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Stage 2</text> </g> + <g id="group1062-106" transform="translate(199.2,-18.7134)" v:mID="1062" v:groupContext="group"> + <title>Sheet.1062</title> + <g id="shape1052-107" v:mID="1052" v:groupContext="shape" transform="translate(18.66,-50.7)"> + <title>Rounded Rectangle.1049</title> + <desc>Worker4 Core</desc> + <v:userDefs> + <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.097416666666665):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.097416666666665):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.097416666666665):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.097416666666665):1"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/> + <v:textRect cx="35.07" cy="101.413" width="70.14" height="63"/> + <path d="M7.01 132.91 L63.13 132.91 A7.01389 7.01389 -180 0 0 70.14 125.9 L70.14 76.93 A7.01389 7.01389 -180 + 0 0 63.13 69.91 L7.01 69.91 A7.01389 7.01389 -180 0 0 0 76.93 L0 125.9 A7.01389 7.01389 -180 0 0 + 7.01 132.91 Z" class="st5"/> + <text x="13.63" y="84.71" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Worker4<v:newlineChar/><v:newlineChar/><tspan + x="21.72" dy="2.357em" class="st11">Core</tspan></text> </g> + <g id="shape1053-111" v:mID="1053" v:groupContext="shape" transform="translate(12.9,-33.6)"> + <title>Rounded Rectangle.1048</title> + <desc>Worker3 Core</desc> + <v:userDefs> + <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.099166666666667):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.099166666666667):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.099166666666667):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.099166666666667):1"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/> + <v:textRect cx="35.7" cy="101.413" width="71.4" height="63"/> + <path d="M7.14 132.91 L64.26 132.91 A7.13988 7.13988 -180 0 0 71.4 125.77 L71.4 77.05 A7.13988 7.13988 -180 0 + 0 64.26 69.91 L7.14 69.91 A7.13988 7.13988 -180 0 0 0 77.05 L0 125.77 A7.13988 7.13988 -180 0 0 + 7.14 132.91 Z" class="st5"/> + <text x="14.26" y="84.71" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Worker3<v:newlineChar/><v:newlineChar/><tspan + x="22.35" dy="2.357em" class="st11">Core</tspan></text> </g> + <g id="shape1054-115" v:mID="1054" v:groupContext="shape" transform="translate(5.89875,-16.8)"> + <title>Rounded Rectangle.1047</title> + <desc>Worker2 Core</desc> + <v:userDefs> + <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.097953125):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.097953125):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.097953125):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.097953125):1"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/> + <v:textRect cx="35.2631" cy="101.413" width="70.53" height="63"/> + <path d="M7.05 132.91 L63.47 132.91 A7.05251 7.05251 -180 0 0 70.53 125.86 L70.53 76.97 A7.05251 7.05251 -180 + 0 0 63.47 69.91 L7.05 69.91 A7.05251 7.05251 -180 0 0 0 76.97 L0 125.86 A7.05251 7.05251 -180 0 + 0 7.05 132.91 Z" class="st5"/> + <text x="13.82" y="84.71" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Worker2<v:newlineChar/><v:newlineChar/><tspan + x="21.92" dy="2.357em" class="st11">Core</tspan></text> </g> + <g id="shape1055-119" v:mID="1055" v:groupContext="shape"> + <title>Rounded Rectangle.1046</title> + <desc>Worker1 Core</desc> + <v:userDefs> + <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.098333333333333):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.098333333333333):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.098333333333333):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.098333333333333):1"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/> + <v:textRect cx="35.4" cy="101.413" width="70.8" height="63"/> + <path d="M7.08 132.91 L63.72 132.91 A7.07988 7.07988 -180 0 0 70.8 125.83 L70.8 76.99 A7.07988 7.07988 -180 0 + 0 63.72 69.91 L7.08 69.91 A7.07988 7.07988 -180 0 0 0 76.99 L0 125.83 A7.07988 7.07988 -180 0 0 + 7.08 132.91 Z" class="st5"/> + <text x="13.96" y="84.71" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Worker1<v:newlineChar/><v:newlineChar/><tspan + x="22.05" dy="2.357em" class="st11">Core</tspan></text> </g> + </g> + <g id="group1063-123" transform="translate(369.6,-18.6)" v:mID="1063" v:groupContext="group"> + <title>Sheet.1063</title> + <g id="shape1064-124" v:mID="1064" v:groupContext="shape" transform="translate(18.66,-50.7)"> + <title>Rounded Rectangle.1049</title> + <desc>Worker4 Core</desc> + <v:userDefs> + <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.097416666666665):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.097416666666665):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.097416666666665):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.097416666666665):1"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/> + <v:textRect cx="35.07" cy="101.413" width="70.14" height="63"/> + <path d="M7.01 132.91 L63.13 132.91 A7.01389 7.01389 -180 0 0 70.14 125.9 L70.14 76.93 A7.01389 7.01389 -180 + 0 0 63.13 69.91 L7.01 69.91 A7.01389 7.01389 -180 0 0 0 76.93 L0 125.9 A7.01389 7.01389 -180 0 0 + 7.01 132.91 Z" class="st5"/> + <text x="13.63" y="84.71" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Worker4<v:newlineChar/><v:newlineChar/><tspan + x="21.72" dy="2.357em" class="st11">Core</tspan></text> </g> + <g id="shape1065-128" v:mID="1065" v:groupContext="shape" transform="translate(12.9,-33.6)"> + <title>Rounded Rectangle.1048</title> + <desc>Worker3 Core</desc> + <v:userDefs> + <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.099166666666667):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.099166666666667):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.099166666666667):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.099166666666667):1"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/> + <v:textRect cx="35.7" cy="101.413" width="71.4" height="63"/> + <path d="M7.14 132.91 L64.26 132.91 A7.13988 7.13988 -180 0 0 71.4 125.77 L71.4 77.05 A7.13988 7.13988 -180 0 + 0 64.26 69.91 L7.14 69.91 A7.13988 7.13988 -180 0 0 0 77.05 L0 125.77 A7.13988 7.13988 -180 0 0 + 7.14 132.91 Z" class="st5"/> + <text x="14.26" y="84.71" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Worker3<v:newlineChar/><v:newlineChar/><tspan + x="22.35" dy="2.357em" class="st11">Core</tspan></text> </g> + <g id="shape1066-132" v:mID="1066" v:groupContext="shape" transform="translate(5.89875,-16.8)"> + <title>Rounded Rectangle.1047</title> + <desc>Worker2 Core</desc> + <v:userDefs> + <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.097953125):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.097953125):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.097953125):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.097953125):1"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/> + <v:textRect cx="35.2631" cy="101.413" width="70.53" height="63"/> + <path d="M7.05 132.91 L63.47 132.91 A7.05251 7.05251 -180 0 0 70.53 125.86 L70.53 76.97 A7.05251 7.05251 -180 + 0 0 63.47 69.91 L7.05 69.91 A7.05251 7.05251 -180 0 0 0 76.97 L0 125.86 A7.05251 7.05251 -180 0 + 0 7.05 132.91 Z" class="st5"/> + <text x="13.82" y="84.71" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Worker2<v:newlineChar/><v:newlineChar/><tspan + x="21.92" dy="2.357em" class="st11">Core</tspan></text> </g> + <g id="shape1067-136" v:mID="1067" v:groupContext="shape"> + <title>Rounded Rectangle.1046</title> + <desc>Worker1 Core</desc> + <v:userDefs> + <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/> + <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.098333333333333):1"/> + <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.098333333333333):1"/> + <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.098333333333333):1"/> + <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.098333333333333):1"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/> + <v:textRect cx="35.4" cy="101.413" width="70.8" height="63"/> + <path d="M7.08 132.91 L63.72 132.91 A7.07988 7.07988 -180 0 0 70.8 125.83 L70.8 76.99 A7.07988 7.07988 -180 0 + 0 63.72 69.91 L7.08 69.91 A7.07988 7.07988 -180 0 0 0 76.99 L0 125.83 A7.07988 7.07988 -180 0 0 + 7.08 132.91 Z" class="st5"/> + <text x="13.96" y="84.71" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Worker1<v:newlineChar/><v:newlineChar/><tspan + x="22.05" dy="2.357em" class="st11">Core</tspan></text> </g> + </g> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ewma_filter_eq_1.png b/src/spdk/dpdk/doc/guides/prog_guide/img/ewma_filter_eq_1.png Binary files differnew file mode 100644 index 000000000..de6955bf4 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ewma_filter_eq_1.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ewma_filter_eq_2.png b/src/spdk/dpdk/doc/guides/prog_guide/img/ewma_filter_eq_2.png Binary files differnew file mode 100644 index 000000000..465a6e64c --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ewma_filter_eq_2.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ex_data_flow_tru_dropper.png b/src/spdk/dpdk/doc/guides/prog_guide/img/ex_data_flow_tru_dropper.png Binary files differnew file mode 100644 index 000000000..184bc57e6 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ex_data_flow_tru_dropper.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/figure32.png b/src/spdk/dpdk/doc/guides/prog_guide/img/figure32.png Binary files differnew file mode 100644 index 000000000..5215113fd --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/figure32.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/figure33.png b/src/spdk/dpdk/doc/guides/prog_guide/img/figure33.png Binary files differnew file mode 100644 index 000000000..f0670eb00 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/figure33.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/figure34.png b/src/spdk/dpdk/doc/guides/prog_guide/img/figure34.png Binary files differnew file mode 100644 index 000000000..caa2517a4 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/figure34.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/figure35.png b/src/spdk/dpdk/doc/guides/prog_guide/img/figure35.png Binary files differnew file mode 100644 index 000000000..42053f006 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/figure35.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/figure37.png b/src/spdk/dpdk/doc/guides/prog_guide/img/figure37.png Binary files differnew file mode 100644 index 000000000..20be4aaa6 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/figure37.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/figure38.png b/src/spdk/dpdk/doc/guides/prog_guide/img/figure38.png Binary files differnew file mode 100644 index 000000000..261c561f9 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/figure38.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/figure39.png b/src/spdk/dpdk/doc/guides/prog_guide/img/figure39.png Binary files differnew file mode 100644 index 000000000..d2db6a499 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/figure39.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/flow_tru_droppper.png b/src/spdk/dpdk/doc/guides/prog_guide/img/flow_tru_droppper.png Binary files differnew file mode 100644 index 000000000..5c8fe1cce --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/flow_tru_droppper.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/graph_mem_layout.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/graph_mem_layout.svg new file mode 100644 index 000000000..1d41729c9 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/graph_mem_layout.svg @@ -0,0 +1,702 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(C) 2020 Marvell International Ltd. --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + viewBox="0.0 0.0 960.0 540.0" + fill="none" + stroke="none" + stroke-linecap="square" + stroke-miterlimit="10" + id="svg428" + sodipodi:docname="Graph_mem_layout.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + <metadata + id="metadata434"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs432" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="3840" + inkscape:window-height="2115" + id="namedview430" + showgrid="false" + inkscape:zoom="3.4037037" + inkscape:cx="505.84248" + inkscape:cy="270.46053" + inkscape:window-x="-13" + inkscape:window-y="-13" + inkscape:window-maximized="1" + inkscape:current-layer="g426" /> + <clipPath + id="g81c521b992_0_3.0"> + <path + d="m0 0l960.0 0l0 540.0l-960.0 0l0 -540.0z" + clip-rule="nonzero" + id="path223" /> + </clipPath> + <g + clip-path="url(#g81c521b992_0_3.0)" + id="g426"> + <path + fill="#ffffff" + d="m0 0l960.0 0l0 540.0l-960.0 0z" + fill-rule="evenodd" + id="path226" /> + <path + fill="#ffffff" + d="m72.97638 40.356956l812.126 0l0 426.2362l-812.126 0z" + fill-rule="evenodd" + id="path228" /> + <path + stroke="#741b47" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m72.97638 40.356956l812.126 0l0 426.2362l-812.126 0z" + fill-rule="evenodd" + id="path230" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m143.0105 100.022575l0 345.3753" + fill-rule="nonzero" + id="path232" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m271.45407 100.022575l0 345.3753" + fill-rule="nonzero" + id="path234" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m142.51181 100.52126l129.44095 0" + fill-rule="nonzero" + id="path236" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m142.51181 151.71811l129.44095 0" + fill-rule="nonzero" + id="path238" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m142.51181 204.91496l129.44095 0" + fill-rule="nonzero" + id="path240" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m142.51181 240.11182l129.44095 0" + fill-rule="nonzero" + id="path242" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m142.51181 291.30865l129.44095 0" + fill-rule="nonzero" + id="path244" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m142.51181 342.50552l129.44095 0" + fill-rule="nonzero" + id="path246" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m142.51181 393.70236l129.44095 0" + fill-rule="nonzero" + id="path248" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m142.51181 444.8992l129.44095 0" + fill-rule="nonzero" + id="path250" /> + <path + fill="#000000" + d="m172.35416 118.58688l0 -1.125l4.03125 -0.015625l0 3.546875q-0.921875 0.75 -1.921875 1.125q-0.984375 0.359375 -2.03125 0.359375q-1.40625 0 -2.5625 -0.59375q-1.140625 -0.609375 -1.734375 -1.734375q-0.578125 -1.140625 -0.578125 -2.546875q0 -1.40625 0.578125 -2.609375q0.59375 -1.203125 1.6875 -1.78125q1.09375 -0.59375 2.515625 -0.59375q1.03125 0 1.859375 0.34375q0.84375 0.328125 1.3125 0.9375q0.484375 0.59375 0.734375 1.546875l-1.140625 0.3125q-0.21875 -0.71875 -0.53125 -1.140625q-0.3125 -0.421875 -0.90625 -0.671875q-0.59375 -0.25 -1.3125 -0.25q-0.875 0 -1.515625 0.265625q-0.625 0.265625 -1.015625 0.703125q-0.375 0.421875 -0.59375 0.9375q-0.359375 0.875 -0.359375 1.921875q0 1.265625 0.4375 2.125q0.4375 0.859375 1.265625 1.28125q0.84375 0.421875 1.796875 0.421875q0.8125 0 1.59375 -0.3125q0.78125 -0.328125 1.1875 -0.6875l0 -1.765625l-2.796875 0zm5.726425 3.734375l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.96962 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9906006 6.125l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm6.3499756 3.421875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm11.302963 0l0 -9.546875l1.265625 0l0 3.921875l4.953125 0l0 -3.921875l1.265625 0l0 9.546875l-1.265625 0l0 -4.5l-4.953125 0l0 4.5l-1.265625 0zm14.172028 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm11.037476 3.265625q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm7.4749756 3.46875l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5062256 4.125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0z" + fill-rule="nonzero" + id="path252" /> + <path + fill="#000000" + d="m161.10791 135.96188l1.1875 -0.078125q0 0.515625 0.15625 0.875q0.15625 0.359375 0.578125 0.59375q0.421875 0.21875 0.96875 0.21875q0.78125 0 1.171875 -0.3125q0.390625 -0.3125 0.390625 -0.734375q0 -0.3125 -0.234375 -0.578125q-0.234375 -0.28125 -1.171875 -0.671875q-0.9375 -0.40625 -1.1875 -0.578125q-0.4375 -0.265625 -0.671875 -0.625q-0.21875 -0.359375 -0.21875 -0.828125q0 -0.8125 0.65625 -1.390625q0.65625 -0.59375 1.828125 -0.59375q1.296875 0 1.96875 0.609375q0.6875 0.59375 0.71875 1.578125l-1.15625 0.078125q-0.03125 -0.625 -0.453125 -0.984375q-0.40625 -0.375 -1.171875 -0.375q-0.609375 0 -0.953125 0.28125q-0.328125 0.28125 -0.328125 0.609375q0 0.3125 0.296875 0.5625q0.1875 0.171875 1.0 0.53125q1.359375 0.578125 1.703125 0.921875q0.5625 0.53125 0.5625 1.3125q0 0.515625 -0.3125 1.015625q-0.3125 0.484375 -0.96875 0.78125q-0.640625 0.296875 -1.515625 0.296875q-1.203125 0 -2.046875 -0.59375q-0.84375 -0.59375 -0.796875 -1.921875zm9.3203125 1.40625l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm0.9373627 0.953125l1.453125 -6.90625l1.03125 0l-0.28125 1.40625q0.53125 -0.796875 1.03125 -1.171875q0.515625 -0.390625 1.046875 -0.390625q0.359375 0 0.875 0.25l-0.484375 1.09375q-0.3125 -0.21875 -0.671875 -0.21875q-0.625 0 -1.28125 0.6875q-0.640625 0.6875 -1.015625 2.484375l-0.578125 2.765625l-1.125 0zm9.15712 -1.25q-1.234375 1.40625 -2.546875 1.40625q-0.796875 0 -1.296875 -0.453125q-0.484375 -0.46875 -0.484375 -1.125q0 -0.4375 0.21875 -1.5l0.84375 -3.984375l1.171875 0l-0.921875 4.40625q-0.109375 0.5625 -0.109375 0.859375q0 0.390625 0.234375 0.609375q0.234375 0.21875 0.703125 0.21875q0.484375 0 0.953125 -0.234375q0.484375 -0.234375 0.8125 -0.640625q0.34375 -0.421875 0.5625 -0.984375q0.140625 -0.359375 0.328125 -1.25l0.625 -2.984375l1.1875 0l-1.453125 6.90625l-1.078125 0l0.25 -1.25zm7.4749756 -1.265625l1.171875 0.125q-0.4375 1.296875 -1.265625 1.921875q-0.8125 0.625 -1.84375 0.625q-1.140625 0 -1.84375 -0.71875q-0.6875 -0.734375 -0.6875 -2.046875q0 -1.125 0.4375 -2.21875q0.453125 -1.09375 1.28125 -1.65625q0.84375 -0.578125 1.921875 -0.578125q1.109375 0 1.765625 0.625q0.65625 0.625 0.65625 1.65625l-1.15625 0.078125q-0.015625 -0.65625 -0.390625 -1.015625q-0.375 -0.375 -0.984375 -0.375q-0.703125 0 -1.234375 0.453125q-0.515625 0.4375 -0.8125 1.359375q-0.296875 0.90625 -0.296875 1.75q0 0.890625 0.390625 1.34375q0.390625 0.4375 0.96875 0.4375q0.5625 0 1.078125 -0.4375q0.53125 -0.4375 0.84375 -1.328125zm4.6484375 1.5625l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm4.6403503 0.953125l1.453125 -6.90625l1.03125 0l-0.28125 1.40625q0.53125 -0.796875 1.03125 -1.171875q0.515625 -0.390625 1.046875 -0.390625q0.359375 0 0.875 0.25l-0.484375 1.09375q-0.3125 -0.21875 -0.671875 -0.21875q-0.625 0 -1.28125 0.6875q-0.640625 0.6875 -1.015625 2.484375l-0.578125 2.765625l-1.125 0zm7.2039948 -0.953125l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm6.0154877 -1.390625l1.15625 0.109375q-0.25 0.859375 -1.140625 1.625q-0.890625 0.765625 -2.125 0.765625q-0.765625 0 -1.40625 -0.34375q-0.640625 -0.359375 -0.984375 -1.03125q-0.328125 -0.6875 -0.328125 -1.546875q0 -1.140625 0.515625 -2.203125q0.53125 -1.0625 1.359375 -1.578125q0.84375 -0.515625 1.8125 -0.515625q1.234375 0 1.96875 0.765625q0.75 0.765625 0.75 2.09375q0 0.5 -0.09375 1.046875l-5.09375 0q-0.03125 0.1875 -0.03125 0.359375q0 0.96875 0.4375 1.484375q0.453125 0.5 1.109375 0.5q0.59375 0 1.171875 -0.390625q0.59375 -0.390625 0.921875 -1.140625zm-3.421875 -1.71875l3.875 0q0.015625 -0.1875 0.015625 -0.265625q0 -0.875 -0.453125 -1.34375q-0.4375 -0.484375 -1.125 -0.484375q-0.765625 0 -1.390625 0.53125q-0.609375 0.515625 -0.921875 1.5625zm4.4749756 6.71875l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm8.631226 -2.03125l1.1875 0.109375q0 0.40625 0.109375 0.609375q0.109375 0.203125 0.34375 0.3125q0.328125 0.140625 0.828125 0.140625q1.0625 0 1.53125 -0.546875q0.3125 -0.375 0.578125 -1.625l0.109375 -0.5625q-0.921875 0.9375 -1.953125 0.9375q-1.046875 0 -1.75 -0.765625q-0.703125 -0.78125 -0.703125 -2.1875q0 -1.171875 0.546875 -2.140625q0.5625 -0.984375 1.328125 -1.46875q0.765625 -0.5 1.578125 -0.5q1.359375 0 2.09375 1.28125l0.234375 -1.125l1.078125 0l-1.390625 6.671875q-0.21875 1.09375 -0.59375 1.703125q-0.375 0.625 -1.03125 0.953125q-0.65625 0.34375 -1.53125 0.34375q-0.828125 0 -1.4375 -0.21875q-0.59375 -0.203125 -0.890625 -0.625q-0.296875 -0.40625 -0.296875 -0.953125q0 -0.15625 0.03125 -0.34375zm1.46875 -3.6875q0 0.71875 0.140625 1.078125q0.203125 0.5 0.5625 0.765625q0.359375 0.25 0.796875 0.25q0.578125 0 1.140625 -0.40625q0.578125 -0.40625 0.9375 -1.25q0.359375 -0.859375 0.359375 -1.625q0 -0.859375 -0.484375 -1.359375q-0.46875 -0.515625 -1.15625 -0.515625q-0.4375 0 -0.84375 0.234375q-0.390625 0.234375 -0.75 0.703125q-0.34375 0.46875 -0.53125 1.140625q-0.171875 0.65625 -0.171875 0.984375zm6.0062256 3.0625l1.453125 -6.90625l1.03125 0l-0.28125 1.40625q0.53125 -0.796875 1.03125 -1.171875q0.515625 -0.390625 1.046875 -0.390625q0.359375 0 0.875 0.25l-0.484375 1.09375q-0.3125 -0.21875 -0.671875 -0.21875q-0.625 0 -1.28125 0.6875q-0.640625 0.6875 -1.015625 2.484375l-0.578125 2.765625l-1.125 0zm9.110245 -0.859375q-0.625 0.53125 -1.1875 0.78125q-0.5625 0.234375 -1.203125 0.234375q-0.96875 0 -1.5625 -0.5625q-0.578125 -0.5625 -0.578125 -1.4375q0 -0.578125 0.265625 -1.015625q0.265625 -0.453125 0.703125 -0.71875q0.4375 -0.28125 1.0625 -0.390625q0.40625 -0.078125 1.515625 -0.125q1.109375 -0.046875 1.59375 -0.234375q0.125 -0.484375 0.125 -0.8125q0 -0.40625 -0.296875 -0.640625q-0.40625 -0.328125 -1.1875 -0.328125q-0.75 0 -1.21875 0.328125q-0.46875 0.328125 -0.6875 0.9375l-1.1875 -0.109375q0.359375 -1.015625 1.140625 -1.5625q0.796875 -0.546875 2.0 -0.546875q1.28125 0 2.03125 0.609375q0.578125 0.453125 0.578125 1.1875q0 0.546875 -0.15625 1.28125l-0.390625 1.71875q-0.1875 0.8125 -0.1875 1.328125q0 0.328125 0.15625 0.9375l-1.203125 0q-0.09375 -0.34375 -0.125 -0.859375zm0.421875 -2.640625q-0.234375 0.09375 -0.53125 0.15625q-0.28125 0.046875 -0.9375 0.109375q-1.03125 0.078125 -1.453125 0.21875q-0.421875 0.140625 -0.640625 0.453125q-0.21875 0.296875 -0.21875 0.671875q0 0.5 0.34375 0.828125q0.34375 0.3125 0.984375 0.3125q0.578125 0 1.109375 -0.3125q0.546875 -0.3125 0.859375 -0.859375q0.3125 -0.5625 0.484375 -1.578125zm1.7406006 6.15625l2.0 -9.5625l1.09375 0l-0.203125 0.953125q0.59375 -0.625 1.078125 -0.859375q0.484375 -0.25 1.015625 -0.25q0.984375 0 1.625 0.71875q0.65625 0.71875 0.65625 2.0625q0 1.078125 -0.359375 1.96875q-0.34375 0.875 -0.875 1.421875q-0.515625 0.546875 -1.046875 0.796875q-0.53125 0.25 -1.09375 0.25q-1.25 0 -1.921875 -1.265625l-0.78125 3.765625l-1.1875 0zm2.328125 -5.484375q0 0.78125 0.109375 1.078125q0.171875 0.421875 0.53125 0.6875q0.375 0.25 0.875 0.25q1.015625 0 1.640625 -1.140625q0.625 -1.140625 0.625 -2.328125q0 -0.875 -0.421875 -1.359375q-0.421875 -0.484375 -1.046875 -0.484375q-0.453125 0 -0.84375 0.25q-0.375 0.234375 -0.703125 0.703125q-0.328125 0.46875 -0.546875 1.15625q-0.21875 0.6875 -0.21875 1.1875zm5.6624756 2.828125l2.0 -9.546875l1.171875 0l-0.765625 3.671875q0.65625 -0.640625 1.21875 -0.90625q0.578125 -0.28125 1.171875 -0.28125q0.859375 0 1.328125 0.453125q0.484375 0.453125 0.484375 1.1875q0 0.359375 -0.203125 1.34375l-0.859375 4.078125l-1.171875 0l0.875 -4.1875q0.1875 -0.90625 0.1875 -1.140625q0 -0.34375 -0.234375 -0.546875q-0.234375 -0.21875 -0.671875 -0.21875q-0.640625 0 -1.21875 0.34375q-0.578125 0.328125 -0.90625 0.90625q-0.328125 0.578125 -0.609375 1.875l-0.609375 2.96875l-1.1875 0z" + fill-rule="nonzero" + id="path254" /> + <path + fill="#000000" + d="m189.80461 173.51811l0 -9.546875l6.4375 0l0 1.125l-5.171875 0l0 2.96875l4.46875 0l0 1.125l-4.46875 0l0 4.328125l-1.265625 0zm12.656982 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5218506 4.125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm11.928101 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.8828125 0.3125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375z" + fill-rule="nonzero" + id="path256" /> + <path + fill="#000000" + d="m160.76096 182.86186q0 0.453125 -0.125 0.859375q-0.125 0.390625 -0.390625 0.734375q-0.25 0.34375 -0.640625 0.609375q-0.375 0.25 -0.890625 0.421875q0.34375 0.125 0.546875 0.515625q0.21875 0.390625 0.34375 1.046875l0.34375 1.859375q0.015625 0.125 0.03125 0.234375q0.015625 0.109375 0.015625 0.1875q0 0.0625 -0.03125 0.109375q-0.03125 0.046875 -0.109375 0.078125q-0.0625 0.015625 -0.1875 0.015625q-0.125 0.015625 -0.3125 0.015625q-0.171875 0 -0.28125 -0.015625q-0.09375 0 -0.15625 -0.03125q-0.046875 -0.03125 -0.078125 -0.078125q-0.015625 -0.0625 -0.03125 -0.140625l-0.328125 -1.984375q-0.0625 -0.34375 -0.15625 -0.625q-0.09375 -0.28125 -0.265625 -0.484375q-0.15625 -0.203125 -0.421875 -0.3125q-0.265625 -0.109375 -0.640625 -0.109375l-0.75 0l-0.71875 3.59375q-0.015625 0.046875 -0.046875 0.09375q-0.03125 0.03125 -0.109375 0.046875q-0.078125 0.015625 -0.1875 0.03125q-0.109375 0.015625 -0.265625 0.015625q-0.15625 0 -0.265625 -0.015625q-0.09375 0 -0.15625 -0.015625q-0.0625 -0.03125 -0.09375 -0.0625q-0.015625 -0.046875 0 -0.09375l1.5625 -7.8125q0.046875 -0.25 0.203125 -0.34375q0.15625 -0.109375 0.34375 -0.109375l1.828125 0q0.609375 0 1.0625 0.125q0.453125 0.109375 0.75 0.34375q0.3125 0.21875 0.453125 0.546875q0.15625 0.328125 0.15625 0.75zm-1.203125 0.171875q0 -0.21875 -0.078125 -0.40625q-0.078125 -0.1875 -0.25 -0.328125q-0.15625 -0.140625 -0.4375 -0.203125q-0.265625 -0.078125 -0.640625 -0.078125l-1.15625 0l-0.578125 2.84375l0.984375 0q0.578125 0 0.984375 -0.15625q0.421875 -0.15625 0.671875 -0.40625q0.25 -0.265625 0.375 -0.59375q0.125 -0.328125 0.125 -0.671875zm8.93988 -1.703125q0 0.03125 0 0.109375q0 0.0625 -0.015625 0.140625q-0.015625 0.078125 -0.046875 0.171875q-0.015625 0.078125 -0.0625 0.140625q-0.03125 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.125 0.046875l-2.359375 0l-1.46875 7.296875q-0.015625 0.0625 -0.046875 0.109375q-0.03125 0.03125 -0.109375 0.046875q-0.0625 0.015625 -0.171875 0.03125q-0.109375 0.015625 -0.28125 0.015625q-0.15625 0 -0.265625 -0.015625q-0.09375 -0.015625 -0.15625 -0.03125q-0.0625 -0.015625 -0.078125 -0.046875q-0.015625 -0.046875 -0.015625 -0.109375l1.46875 -7.296875l-2.359375 0q-0.09375 0 -0.125 -0.0625q-0.03125 -0.0625 -0.03125 -0.15625q0 -0.046875 0 -0.109375q0.015625 -0.078125 0.03125 -0.15625q0.015625 -0.09375 0.046875 -0.171875q0.03125 -0.078125 0.0625 -0.140625q0.046875 -0.078125 0.09375 -0.109375q0.046875 -0.046875 0.109375 -0.046875l5.859375 0q0.078125 0 0.109375 0.0625q0.03125 0.0625 0.03125 0.171875zm5.838608 -0.015625q0 0.03125 0 0.109375q0 0.0625 -0.015625 0.140625q-0.015625 0.078125 -0.046875 0.15625q-0.015625 0.078125 -0.0625 0.15625q-0.03125 0.0625 -0.09375 0.109375q-0.046875 0.046875 -0.109375 0.046875l-3.296875 0l-0.53125 2.640625l2.828125 0q0.078125 0 0.109375 0.046875q0.046875 0.046875 0.046875 0.15625q0 0.03125 -0.015625 0.109375q0 0.0625 -0.015625 0.140625q-0.015625 0.078125 -0.046875 0.15625q-0.015625 0.078125 -0.046875 0.140625q-0.03125 0.0625 -0.09375 0.109375q-0.046875 0.046875 -0.109375 0.046875l-2.828125 0l-0.609375 3.0l3.34375 0q0.0625 0 0.109375 0.0625q0.046875 0.046875 0.046875 0.15625q0 0.046875 -0.015625 0.125q0 0.0625 -0.015625 0.140625q-0.015625 0.078125 -0.046875 0.15625q-0.015625 0.078125 -0.0625 0.15625q-0.03125 0.0625 -0.09375 0.109375q-0.046875 0.03125 -0.109375 0.03125l-4.046875 0q-0.078125 0 -0.15625 -0.015625q-0.0625 -0.03125 -0.109375 -0.078125q-0.046875 -0.0625 -0.0625 -0.140625q-0.015625 -0.09375 0.015625 -0.21875l1.5 -7.515625q0.046875 -0.25 0.203125 -0.34375q0.15625 -0.109375 0.296875 -0.109375l4.0 0q0.140625 0 0.140625 0.21875zm5.4453735 9.9375q0 0.046875 0 0.109375q0 0.0625 -0.015625 0.125q-0.015625 0.0625 -0.046875 0.140625q-0.03125 0.078125 -0.078125 0.125q-0.03125 0.0625 -0.078125 0.09375q-0.046875 0.046875 -0.109375 0.046875l-6.265625 0q-0.078125 0 -0.109375 -0.0625q-0.03125 -0.0625 -0.03125 -0.15625q0 -0.03125 0 -0.09375q0 -0.0625 0.015625 -0.140625q0.015625 -0.0625 0.046875 -0.140625q0.015625 -0.0625 0.0625 -0.140625q0.03125 -0.0625 0.078125 -0.09375q0.046875 -0.03125 0.109375 -0.03125l6.265625 0q0.078125 0 0.109375 0.0625q0.046875 0.0625 0.046875 0.15625zm9.278656 -9.234375q0 0.046875 -0.015625 0.109375q-0.015625 0.0625 -0.03125 0.140625q-0.015625 0.078125 -0.046875 0.15625q-0.015625 0.078125 -0.046875 0.140625q-0.03125 0.0625 -0.078125 0.109375q-0.03125 0.03125 -0.078125 0.03125q-0.09375 0 -0.265625 -0.109375q-0.171875 -0.125 -0.453125 -0.265625q-0.265625 -0.15625 -0.671875 -0.265625q-0.390625 -0.125 -0.9375 -0.125q-0.578125 0 -1.09375 0.171875q-0.5 0.171875 -0.921875 0.484375q-0.421875 0.296875 -0.75 0.703125q-0.328125 0.40625 -0.5625 0.90625q-0.234375 0.484375 -0.359375 1.015625q-0.109375 0.53125 -0.109375 1.078125q0 0.5625 0.15625 1.015625q0.171875 0.4375 0.484375 0.734375q0.3125 0.296875 0.75 0.453125q0.4375 0.15625 0.984375 0.15625q0.40625 0 0.84375 -0.09375q0.453125 -0.09375 0.828125 -0.296875l0.484375 -2.4375l-1.953125 0q-0.078125 0 -0.125 -0.046875q-0.03125 -0.0625 -0.03125 -0.171875q0 -0.046875 0 -0.109375q0.015625 -0.078125 0.03125 -0.15625q0.015625 -0.078125 0.046875 -0.15625q0.03125 -0.078125 0.0625 -0.140625q0.046875 -0.0625 0.09375 -0.09375q0.046875 -0.046875 0.109375 -0.046875l2.671875 0q0.1875 0 0.265625 0.125q0.078125 0.125 0.03125 0.328125l-0.640625 3.25q-0.03125 0.125 -0.078125 0.203125q-0.03125 0.0625 -0.09375 0.125q-0.046875 0.0625 -0.296875 0.171875q-0.234375 0.109375 -0.59375 0.234375q-0.359375 0.109375 -0.8125 0.1875q-0.453125 0.09375 -0.953125 0.09375q-0.84375 0 -1.484375 -0.203125q-0.640625 -0.21875 -1.078125 -0.640625q-0.4375 -0.421875 -0.671875 -1.015625q-0.21875 -0.59375 -0.21875 -1.328125q0 -0.703125 0.15625 -1.375q0.15625 -0.671875 0.453125 -1.28125q0.3125 -0.609375 0.75 -1.109375q0.4375 -0.515625 1.0 -0.890625q0.578125 -0.375 1.25 -0.578125q0.6875 -0.21875 1.484375 -0.21875q0.453125 0 0.84375 0.078125q0.40625 0.078125 0.71875 0.203125q0.3125 0.109375 0.515625 0.25q0.21875 0.125 0.296875 0.203125q0.078125 0.0625 0.109375 0.140625q0.03125 0.0625 0.03125 0.15625zm6.9862976 0.84375q0 0.453125 -0.125 0.859375q-0.125 0.390625 -0.390625 0.734375q-0.25 0.34375 -0.640625 0.609375q-0.375 0.25 -0.890625 0.421875q0.34375 0.125 0.546875 0.515625q0.21875 0.390625 0.34375 1.046875l0.34375 1.859375q0.015625 0.125 0.03125 0.234375q0.015625 0.109375 0.015625 0.1875q0 0.0625 -0.03125 0.109375q-0.03125 0.046875 -0.109375 0.078125q-0.0625 0.015625 -0.1875 0.015625q-0.125 0.015625 -0.3125 0.015625q-0.171875 0 -0.28125 -0.015625q-0.09375 0 -0.15625 -0.03125q-0.046875 -0.03125 -0.078125 -0.078125q-0.015625 -0.0625 -0.03125 -0.140625l-0.328125 -1.984375q-0.0625 -0.34375 -0.15625 -0.625q-0.09375 -0.28125 -0.265625 -0.484375q-0.15625 -0.203125 -0.421875 -0.3125q-0.265625 -0.109375 -0.640625 -0.109375l-0.75 0l-0.71875 3.59375q-0.015625 0.046875 -0.046875 0.09375q-0.03125 0.03125 -0.109375 0.046875q-0.078125 0.015625 -0.1875 0.03125q-0.109375 0.015625 -0.265625 0.015625q-0.15625 0 -0.265625 -0.015625q-0.09375 0 -0.15625 -0.015625q-0.0625 -0.03125 -0.09375 -0.0625q-0.015625 -0.046875 0 -0.09375l1.5625 -7.8125q0.046875 -0.25 0.203125 -0.34375q0.15625 -0.109375 0.34375 -0.109375l1.828125 0q0.609375 0 1.0625 0.125q0.453125 0.109375 0.75 0.34375q0.3125 0.21875 0.453125 0.546875q0.15625 0.328125 0.15625 0.75zm-1.203125 0.171875q0 -0.21875 -0.078125 -0.40625q-0.078125 -0.1875 -0.25 -0.328125q-0.15625 -0.140625 -0.4375 -0.203125q-0.265625 -0.078125 -0.640625 -0.078125l-1.15625 0l-0.578125 2.84375l0.984375 0q0.578125 0 0.984375 -0.15625q0.421875 -0.15625 0.671875 -0.40625q0.25 -0.265625 0.375 -0.59375q0.125 -0.328125 0.125 -0.671875zm8.424255 6.09375q0.03125 0.140625 0.015625 0.234375q-0.015625 0.078125 -0.078125 0.125q-0.046875 0.046875 -0.1875 0.046875q-0.125 0.015625 -0.34375 0.015625q-0.140625 0 -0.25 -0.015625q-0.109375 0 -0.171875 -0.015625q-0.046875 -0.03125 -0.078125 -0.0625q-0.015625 -0.046875 -0.03125 -0.09375l-0.3125 -2.0625l-3.5 0l-1.09375 2.03125q-0.046875 0.078125 -0.09375 0.125q-0.03125 0.03125 -0.109375 0.0625q-0.078125 0.015625 -0.203125 0.015625q-0.109375 0.015625 -0.28125 0.015625q-0.203125 0 -0.3125 -0.015625q-0.125 -0.015625 -0.15625 -0.046875q-0.046875 -0.046875 -0.03125 -0.140625q0.015625 -0.09375 0.09375 -0.234375l4.375 -7.8125q0.046875 -0.078125 0.09375 -0.125q0.0625 -0.046875 0.140625 -0.0625q0.09375 -0.03125 0.21875 -0.03125q0.125 -0.015625 0.3125 -0.015625q0.21875 0 0.34375 0.015625q0.140625 0 0.21875 0.03125q0.09375 0.015625 0.125 0.0625q0.03125 0.046875 0.046875 0.125l1.25 7.828125zm-2.1875 -6.90625l0 0l-2.28125 4.1875l2.921875 0l-0.640625 -4.1875zm9.930588 0.859375q0 0.34375 -0.078125 0.71875q-0.078125 0.375 -0.265625 0.734375q-0.171875 0.359375 -0.4375 0.6875q-0.265625 0.328125 -0.65625 0.578125q-0.375 0.234375 -0.875 0.375q-0.5 0.140625 -1.1875 0.140625l-1.15625 0l-0.59375 3.046875q-0.015625 0.046875 -0.046875 0.09375q-0.03125 0.03125 -0.109375 0.046875q-0.078125 0.015625 -0.1875 0.03125q-0.109375 0.015625 -0.265625 0.015625q-0.15625 0 -0.265625 -0.015625q-0.09375 0 -0.15625 -0.015625q-0.0625 -0.03125 -0.09375 -0.0625q-0.015625 -0.046875 0 -0.09375l1.546875 -7.78125q0.046875 -0.265625 0.203125 -0.375q0.171875 -0.109375 0.390625 -0.109375l1.65625 0q0.328125 0 0.578125 0.03125q0.25 0.015625 0.484375 0.0625q0.359375 0.078125 0.640625 0.25q0.28125 0.15625 0.46875 0.40625q0.203125 0.234375 0.296875 0.546875q0.109375 0.3125 0.109375 0.6875zm-1.1875 0.109375q0 -0.40625 -0.203125 -0.6875q-0.1875 -0.296875 -0.609375 -0.40625q-0.15625 -0.046875 -0.34375 -0.0625q-0.1875 -0.015625 -0.40625 -0.015625l-1.046875 0l-0.671875 3.375l1.0625 0q0.46875 0 0.78125 -0.09375q0.328125 -0.109375 0.5625 -0.28125q0.25 -0.171875 0.40625 -0.390625q0.171875 -0.234375 0.265625 -0.46875q0.109375 -0.25 0.15625 -0.5q0.046875 -0.25 0.046875 -0.46875zm7.76033 6.171875q-0.015625 0.046875 -0.046875 0.09375q-0.03125 0.03125 -0.109375 0.046875q-0.0625 0.015625 -0.171875 0.03125q-0.109375 0.015625 -0.28125 0.015625q-0.15625 0 -0.265625 -0.015625q-0.09375 -0.015625 -0.15625 -0.03125q-0.0625 -0.015625 -0.078125 -0.046875q-0.015625 -0.046875 0 -0.09375l0.734375 -3.75l-3.828125 0l-0.734375 3.75q-0.015625 0.046875 -0.046875 0.09375q-0.03125 0.03125 -0.109375 0.046875q-0.078125 0.015625 -0.1875 0.03125q-0.109375 0.015625 -0.265625 0.015625q-0.171875 0 -0.28125 -0.015625q-0.09375 -0.015625 -0.15625 -0.03125q-0.046875 -0.015625 -0.078125 -0.046875q-0.015625 -0.046875 0 -0.09375l1.609375 -8.109375q0.015625 -0.03125 0.046875 -0.0625q0.046875 -0.046875 0.109375 -0.0625q0.078125 -0.03125 0.1875 -0.046875q0.109375 -0.015625 0.265625 -0.015625q0.15625 0 0.265625 0.015625q0.109375 0.015625 0.15625 0.046875q0.0625 0.015625 0.078125 0.0625q0.015625 0.03125 0.015625 0.0625l-0.671875 3.390625l3.828125 0l0.671875 -3.390625q0.015625 -0.03125 0.046875 -0.0625q0.03125 -0.046875 0.09375 -0.0625q0.078125 -0.03125 0.1875 -0.046875q0.109375 -0.015625 0.28125 -0.015625q0.15625 0 0.25 0.015625q0.109375 0.015625 0.171875 0.046875q0.0625 0.015625 0.078125 0.0625q0.015625 0.03125 0 0.0625l-1.609375 8.109375zm7.3821716 1.890625q0 0.046875 0 0.109375q0 0.0625 -0.015625 0.125q-0.015625 0.0625 -0.046875 0.140625q-0.03125 0.078125 -0.078125 0.125q-0.03125 0.0625 -0.078125 0.09375q-0.046875 0.046875 -0.109375 0.046875l-6.265625 0q-0.078125 0 -0.109375 -0.0625q-0.03125 -0.0625 -0.03125 -0.15625q0 -0.03125 0 -0.09375q0 -0.0625 0.015625 -0.140625q0.015625 -0.0625 0.046875 -0.140625q0.015625 -0.0625 0.0625 -0.140625q0.03125 -0.0625 0.078125 -0.09375q0.046875 -0.03125 0.109375 -0.03125l6.265625 0q0.078125 0 0.109375 0.0625q0.046875 0.0625 0.046875 0.15625zm7.497406 -9.9375q0 0.046875 0 0.109375q0 0.0625 -0.015625 0.140625q-0.015625 0.078125 -0.046875 0.171875q-0.03125 0.078125 -0.078125 0.15625q-0.03125 0.0625 -0.078125 0.109375q-0.046875 0.046875 -0.125 0.046875l-3.078125 0l-0.5625 2.859375l2.90625 0q0.078125 0 0.109375 0.0625q0.046875 0.046875 0.046875 0.140625q0 0.0625 -0.015625 0.140625q0 0.0625 -0.015625 0.140625q-0.015625 0.0625 -0.046875 0.15625q-0.015625 0.078125 -0.0625 0.140625q-0.03125 0.0625 -0.09375 0.109375q-0.046875 0.046875 -0.109375 0.046875l-2.90625 0l-0.703125 3.5q-0.015625 0.0625 -0.046875 0.109375q-0.03125 0.03125 -0.109375 0.046875q-0.0625 0.015625 -0.171875 0.03125q-0.109375 0.015625 -0.28125 0.015625q-0.15625 0 -0.265625 -0.015625q-0.109375 -0.015625 -0.171875 -0.03125q-0.046875 -0.015625 -0.078125 -0.046875q-0.015625 -0.046875 0 -0.109375l1.5625 -7.796875q0.046875 -0.25 0.203125 -0.34375q0.15625 -0.109375 0.296875 -0.109375l3.78125 0q0.09375 0 0.125 0.0625q0.03125 0.0625 0.03125 0.15625zm6.3270416 0q0 0.03125 0 0.109375q0 0.0625 -0.015625 0.140625q-0.015625 0.078125 -0.046875 0.15625q-0.015625 0.078125 -0.0625 0.15625q-0.03125 0.0625 -0.09375 0.109375q-0.046875 0.046875 -0.109375 0.046875l-3.296875 0l-0.53125 2.640625l2.828125 0q0.078125 0 0.109375 0.046875q0.046875 0.046875 0.046875 0.15625q0 0.03125 -0.015625 0.109375q0 0.0625 -0.015625 0.140625q-0.015625 0.078125 -0.046875 0.15625q-0.015625 0.078125 -0.046875 0.140625q-0.03125 0.0625 -0.09375 0.109375q-0.046875 0.046875 -0.109375 0.046875l-2.828125 0l-0.609375 3.0l3.34375 0q0.0625 0 0.109375 0.0625q0.046875 0.046875 0.046875 0.15625q0 0.046875 -0.015625 0.125q0 0.0625 -0.015625 0.140625q-0.015625 0.078125 -0.046875 0.15625q-0.015625 0.078125 -0.0625 0.15625q-0.03125 0.0625 -0.09375 0.109375q-0.046875 0.03125 -0.109375 0.03125l-4.046875 0q-0.078125 0 -0.15625 -0.015625q-0.0625 -0.03125 -0.109375 -0.078125q-0.046875 -0.0625 -0.0625 -0.140625q-0.015625 -0.09375 0.015625 -0.21875l1.5 -7.515625q0.046875 -0.25 0.203125 -0.34375q0.15625 -0.109375 0.296875 -0.109375l4.0 0q0.140625 0 0.140625 0.21875zm6.7109985 7.734375q-0.015625 0.140625 -0.078125 0.234375q-0.0625 0.078125 -0.140625 0.140625q-0.0625 0.0625 -0.15625 0.09375q-0.078125 0.015625 -0.171875 0.015625l-0.421875 0q-0.171875 0 -0.296875 -0.03125q-0.109375 -0.046875 -0.203125 -0.140625q-0.078125 -0.09375 -0.15625 -0.234375q-0.0625 -0.15625 -0.140625 -0.390625l-1.578125 -4.484375q-0.15625 -0.484375 -0.328125 -0.953125q-0.15625 -0.484375 -0.296875 -0.96875l-0.015625 0q-0.078125 0.53125 -0.1875 1.0625q-0.09375 0.515625 -0.203125 1.046875l-0.96875 4.90625q-0.015625 0.0625 -0.0625 0.109375q-0.03125 0.03125 -0.09375 0.046875q-0.0625 0.015625 -0.171875 0.03125q-0.109375 0.015625 -0.265625 0.015625q-0.140625 0 -0.25 -0.015625q-0.09375 -0.015625 -0.15625 -0.03125q-0.046875 -0.015625 -0.0625 -0.046875q-0.015625 -0.046875 0 -0.109375l1.546875 -7.765625q0.046875 -0.265625 0.21875 -0.375q0.171875 -0.109375 0.34375 -0.109375l0.5 0q0.15625 0 0.265625 0.03125q0.125 0.03125 0.203125 0.125q0.09375 0.078125 0.15625 0.21875q0.078125 0.125 0.15625 0.328125l1.59375 4.5625q0.140625 0.421875 0.28125 0.84375q0.15625 0.421875 0.296875 0.84375l0.015625 0q0.09375 -0.53125 0.203125 -1.09375q0.109375 -0.578125 0.203125 -1.109375l0.921875 -4.5625q0.015625 -0.0625 0.046875 -0.09375q0.03125 -0.03125 0.09375 -0.0625q0.0625 -0.03125 0.15625 -0.03125q0.109375 -0.015625 0.265625 -0.015625q0.15625 0 0.25 0.015625q0.109375 0 0.15625 0.03125q0.0625 0.03125 0.078125 0.0625q0.015625 0.03125 0.015625 0.09375l-1.5625 7.765625zm9.090393 -7.09375q0 0.140625 -0.046875 0.34375q-0.046875 0.203125 -0.125 0.328125q-0.078125 0.109375 -0.15625 0.109375q-0.09375 0 -0.21875 -0.125q-0.125 -0.125 -0.328125 -0.265625q-0.203125 -0.140625 -0.53125 -0.25q-0.328125 -0.125 -0.828125 -0.125q-0.546875 0 -1.0 0.203125q-0.4375 0.203125 -0.8125 0.5625q-0.359375 0.34375 -0.640625 0.796875q-0.265625 0.453125 -0.453125 0.953125q-0.171875 0.5 -0.265625 1.015625q-0.078125 0.5 -0.078125 0.953125q0 0.515625 0.125 0.921875q0.125 0.40625 0.375 0.6875q0.25 0.28125 0.609375 0.421875q0.359375 0.140625 0.8125 0.140625q0.515625 0 0.875 -0.109375q0.375 -0.109375 0.625 -0.25q0.265625 -0.140625 0.4375 -0.25q0.1875 -0.125 0.296875 -0.125q0.078125 0 0.109375 0.0625q0.03125 0.046875 0.03125 0.15625q0 0.03125 -0.015625 0.09375q-0.015625 0.0625 -0.03125 0.140625q0 0.0625 -0.015625 0.15625q-0.015625 0.078125 -0.046875 0.15625q-0.03125 0.0625 -0.0625 0.125q-0.015625 0.0625 -0.09375 0.125q-0.0625 0.0625 -0.28125 0.203125q-0.21875 0.125 -0.53125 0.234375q-0.3125 0.109375 -0.71875 0.1875q-0.390625 0.09375 -0.828125 0.09375q-0.671875 0 -1.203125 -0.203125q-0.53125 -0.203125 -0.90625 -0.578125q-0.375 -0.390625 -0.578125 -0.96875q-0.203125 -0.578125 -0.203125 -1.328125q0 -0.609375 0.125 -1.265625q0.140625 -0.65625 0.390625 -1.265625q0.25 -0.625 0.625 -1.171875q0.390625 -0.546875 0.890625 -0.953125q0.5 -0.421875 1.125 -0.65625q0.640625 -0.25 1.390625 -0.25q0.484375 0 0.890625 0.109375q0.421875 0.109375 0.703125 0.28125q0.296875 0.15625 0.421875 0.28125q0.140625 0.125 0.140625 0.296875zm6.2602844 -0.640625q0 0.03125 0 0.109375q0 0.0625 -0.015625 0.140625q-0.015625 0.078125 -0.046875 0.15625q-0.015625 0.078125 -0.0625 0.15625q-0.03125 0.0625 -0.09375 0.109375q-0.046875 0.046875 -0.109375 0.046875l-3.296875 0l-0.53125 2.640625l2.828125 0q0.078125 0 0.109375 0.046875q0.046875 0.046875 0.046875 0.15625q0 0.03125 -0.015625 0.109375q0 0.0625 -0.015625 0.140625q-0.015625 0.078125 -0.046875 0.15625q-0.015625 0.078125 -0.046875 0.140625q-0.03125 0.0625 -0.09375 0.109375q-0.046875 0.046875 -0.109375 0.046875l-2.828125 0l-0.60935974 3.0l3.3437347 0q0.0625 0 0.109375 0.0625q0.046875 0.046875 0.046875 0.15625q0 0.046875 -0.015625 0.125q0 0.0625 -0.015625 0.140625q-0.015625 0.078125 -0.046875 0.15625q-0.015625 0.078125 -0.0625 0.15625q-0.03125 0.0625 -0.09375 0.109375q-0.046875 0.03125 -0.109375 0.03125l-4.0468597 0q-0.078125 0 -0.15625 -0.015625q-0.0625 -0.03125 -0.109375 -0.078125q-0.046875 -0.0625 -0.0625 -0.140625q-0.015625 -0.09375 0.015625 -0.21875l1.4999847 -7.515625q0.046875 -0.25 0.203125 -0.34375q0.15625 -0.109375 0.296875 -0.109375l4.0 0q0.140625 0 0.140625 0.21875z" + fill-rule="nonzero" + id="path258" /> + <path + fill="#000000" + d="m172.59329 223.37122l1.265625 0.3125q-0.390625 1.5625 -1.421875 2.375q-1.03125 0.8125 -2.53125 0.8125q-1.53125 0 -2.5 -0.625q-0.96875 -0.625 -1.484375 -1.8125q-0.5 -1.1875 -0.5 -2.5625q0 -1.484375 0.5625 -2.59375q0.578125 -1.109375 1.625 -1.6875q1.0625 -0.578125 2.328125 -0.578125q1.421875 0 2.390625 0.734375q0.984375 0.71875 1.375 2.046875l-1.25 0.296875q-0.328125 -1.046875 -0.96875 -1.515625q-0.625 -0.484375 -1.578125 -0.484375q-1.09375 0 -1.84375 0.53125q-0.734375 0.53125 -1.03125 1.421875q-0.296875 0.875 -0.296875 1.828125q0 1.21875 0.34375 2.125q0.359375 0.90625 1.109375 1.359375q0.75 0.4375 1.625 0.4375q1.0625 0 1.796875 -0.609375q0.734375 -0.609375 0.984375 -1.8125zm2.6876526 -4.84375l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.92984 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.96962 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.6796875 2.53125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.8656006 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.49234 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9749756 3.46875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.250732 0l0 -9.546875l3.59375 0q1.09375 0 1.75 0.296875q0.65625 0.28125 1.03125 0.890625q0.375 0.609375 0.375 1.265625q0 0.609375 -0.34375 1.15625q-0.328125 0.53125 -0.984375 0.859375q0.859375 0.25 1.328125 0.875q0.46875 0.609375 0.46875 1.4375q0 0.671875 -0.296875 1.25q-0.28125 0.578125 -0.703125 0.890625q-0.40625 0.3125 -1.03125 0.46875q-0.625 0.15625 -1.546875 0.15625l-3.640625 0zm1.265625 -5.53125l2.0625 0q0.84375 0 1.203125 -0.109375q0.484375 -0.140625 0.71875 -0.46875q0.25 -0.34375 0.25 -0.84375q0 -0.46875 -0.234375 -0.828125q-0.21875 -0.359375 -0.640625 -0.5q-0.421875 -0.140625 -1.453125 -0.140625l-1.90625 0l0 2.890625zm0 4.40625l2.375 0q0.609375 0 0.859375 -0.046875q0.4375 -0.078125 0.734375 -0.25q0.296875 -0.1875 0.484375 -0.53125q0.1875 -0.359375 0.1875 -0.8125q0 -0.53125 -0.28125 -0.921875q-0.265625 -0.40625 -0.75 -0.5625q-0.484375 -0.15625 -1.40625 -0.15625l-2.203125 0l0 3.28125zm12.06163 1.125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm3.1624756 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.4620972 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm8.156113 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5062256 4.125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0z" + fill-rule="nonzero" + id="path260" /> + <path + fill="#000000" + d="m186.7589 261.9118l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm9.047028 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.896713 -0.578125q0 -1.6875 0.34375 -2.71875q0.359375 -1.03125 1.046875 -1.59375q0.6875 -0.5625 1.71875 -0.5625q0.78125 0 1.359375 0.3125q0.578125 0.296875 0.953125 0.890625q0.375 0.578125 0.59375 1.421875q0.21875 0.828125 0.21875 2.25q0 1.671875 -0.359375 2.703125q-0.34375 1.03125 -1.03125 1.59375q-0.671875 0.5625 -1.734375 0.5625q-1.375 0 -2.15625 -0.984375q-0.953125 -1.1875 -0.953125 -3.875zm1.203125 0q0 2.34375 0.546875 3.125q0.5625 0.78125 1.359375 0.78125q0.8125 0 1.359375 -0.78125q0.5625 -0.78125 0.5625 -3.125q0 -2.359375 -0.5625 -3.125q-0.546875 -0.78125 -1.359375 -0.78125q-0.8125 0 -1.296875 0.6875q-0.609375 0.875 -0.609375 3.21875z" + fill-rule="nonzero" + id="path262" /> + <path + fill="#000000" + d="m163.32709 275.55243l1.1875 -0.078125q0 0.515625 0.15625 0.875q0.15625 0.359375 0.578125 0.59375q0.421875 0.21875 0.96875 0.21875q0.78125 0 1.171875 -0.3125q0.390625 -0.3125 0.390625 -0.734375q0 -0.3125 -0.234375 -0.578125q-0.234375 -0.28125 -1.171875 -0.671875q-0.9375 -0.40625 -1.1875 -0.578125q-0.4375 -0.265625 -0.671875 -0.625q-0.21875 -0.359375 -0.21875 -0.828125q0 -0.8125 0.65625 -1.390625q0.65625 -0.59375 1.828125 -0.59375q1.296875 0 1.96875 0.609375q0.6875 0.59375 0.71875 1.578125l-1.15625 0.078125q-0.03125 -0.625 -0.453125 -0.984375q-0.40625 -0.375 -1.171875 -0.375q-0.609375 0 -0.953125 0.28125q-0.328125 0.28125 -0.328125 0.609375q0 0.3125 0.296875 0.5625q0.1875 0.171875 1.0 0.53125q1.359375 0.578125 1.703125 0.921875q0.5625 0.53125 0.5625 1.3125q0 0.515625 -0.3125 1.015625q-0.3125 0.484375 -0.96875 0.78125q-0.640625 0.296875 -1.515625 0.296875q-1.203125 0 -2.046875 -0.59375q-0.84375 -0.59375 -0.796875 -1.921875zm9.3203125 1.40625l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm0.9373627 0.953125l1.453125 -6.90625l1.03125 0l-0.28125 1.40625q0.53125 -0.796875 1.03125 -1.171875q0.515625 -0.390625 1.046875 -0.390625q0.359375 0 0.875 0.25l-0.484375 1.09375q-0.3125 -0.21875 -0.671875 -0.21875q-0.625 0 -1.28125 0.6875q-0.640625 0.6875 -1.015625 2.484375l-0.578125 2.765625l-1.125 0zm9.15712 -1.25q-1.234375 1.40625 -2.546875 1.40625q-0.796875 0 -1.296875 -0.453125q-0.484375 -0.46875 -0.484375 -1.125q0 -0.4375 0.21875 -1.5l0.84375 -3.984375l1.171875 0l-0.921875 4.40625q-0.109375 0.5625 -0.109375 0.859375q0 0.390625 0.234375 0.609375q0.234375 0.21875 0.703125 0.21875q0.484375 0 0.953125 -0.234375q0.484375 -0.234375 0.8125 -0.640625q0.34375 -0.421875 0.5625 -0.984375q0.140625 -0.359375 0.328125 -1.25l0.625 -2.984375l1.1875 0l-1.453125 6.90625l-1.078125 0l0.25 -1.25zm7.4749756 -1.265625l1.171875 0.125q-0.4375 1.296875 -1.265625 1.921875q-0.8125 0.625 -1.84375 0.625q-1.140625 0 -1.84375 -0.71875q-0.6875 -0.734375 -0.6875 -2.046875q0 -1.125 0.4375 -2.21875q0.453125 -1.09375 1.28125 -1.65625q0.84375 -0.578125 1.921875 -0.578125q1.109375 0 1.765625 0.625q0.65625 0.625 0.65625 1.65625l-1.15625 0.078125q-0.015625 -0.65625 -0.390625 -1.015625q-0.375 -0.375 -0.984375 -0.375q-0.703125 0 -1.234375 0.453125q-0.515625 0.4375 -0.8125 1.359375q-0.296875 0.90625 -0.296875 1.75q0 0.890625 0.390625 1.34375q0.390625 0.4375 0.96875 0.4375q0.5625 0 1.078125 -0.4375q0.53125 -0.4375 0.84375 -1.328125zm4.6484375 1.5625l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm4.6403503 0.953125l1.453125 -6.90625l1.03125 0l-0.28125 1.40625q0.53125 -0.796875 1.03125 -1.171875q0.515625 -0.390625 1.046875 -0.390625q0.359375 0 0.875 0.25l-0.484375 1.09375q-0.3125 -0.21875 -0.671875 -0.21875q-0.625 0 -1.28125 0.6875q-0.640625 0.6875 -1.015625 2.484375l-0.578125 2.765625l-1.125 0zm7.2039948 -0.953125l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm6.0154877 -1.390625l1.15625 0.109375q-0.25 0.859375 -1.140625 1.625q-0.890625 0.765625 -2.125 0.765625q-0.765625 0 -1.40625 -0.34375q-0.640625 -0.359375 -0.984375 -1.03125q-0.328125 -0.6875 -0.328125 -1.546875q0 -1.140625 0.515625 -2.203125q0.53125 -1.0625 1.359375 -1.578125q0.84375 -0.515625 1.8125 -0.515625q1.234375 0 1.96875 0.765625q0.75 0.765625 0.75 2.09375q0 0.5 -0.09375 1.046875l-5.09375 0q-0.03125 0.1875 -0.03125 0.359375q0 0.96875 0.4375 1.484375q0.453125 0.5 1.109375 0.5q0.59375 0 1.171875 -0.390625q0.59375 -0.390625 0.921875 -1.140625zm-3.421875 -1.71875l3.875 0q0.015625 -0.1875 0.015625 -0.265625q0 -0.875 -0.453125 -1.34375q-0.4375 -0.484375 -1.125 -0.484375q-0.765625 0 -1.390625 0.53125q-0.609375 0.515625 -0.921875 1.5625zm4.4749756 6.71875l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm8.693726 -2.65625l1.453125 -6.90625l1.0625 0l-0.25 1.203125q0.6875 -0.71875 1.296875 -1.03125q0.609375 -0.328125 1.234375 -0.328125q0.84375 0 1.3125 0.453125q0.484375 0.453125 0.484375 1.21875q0 0.375 -0.171875 1.203125l-0.875 4.1875l-1.171875 0l0.921875 -4.375q0.125 -0.640625 0.125 -0.953125q0 -0.34375 -0.234375 -0.546875q-0.234375 -0.21875 -0.6875 -0.21875q-0.90625 0 -1.609375 0.65625q-0.703125 0.640625 -1.03125 2.21875l-0.671875 3.21875l-1.1875 0zm7.6312256 -2.625q0 -2.015625 1.1875 -3.34375q0.984375 -1.09375 2.578125 -1.09375q1.25 0 2.015625 0.78125q0.765625 0.78125 0.765625 2.109375q0 1.1875 -0.484375 2.21875q-0.484375 1.015625 -1.375 1.5625q-0.890625 0.546875 -1.875 0.546875q-0.796875 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0 -0.96875q-0.34375 -0.640625 -0.34375 -1.46875zm1.171875 -0.109375q0 0.96875 0.46875 1.484375q0.46875 0.5 1.1875 0.5q0.375 0 0.75 -0.15625q0.375 -0.15625 0.6875 -0.46875q0.328125 -0.3125 0.546875 -0.703125q0.21875 -0.40625 0.359375 -0.875q0.203125 -0.640625 0.203125 -1.234375q0 -0.9375 -0.46875 -1.453125q-0.46875 -0.515625 -1.1875 -0.515625q-0.5625 0 -1.015625 0.265625q-0.453125 0.265625 -0.828125 0.78125q-0.359375 0.5 -0.53125 1.171875q-0.171875 0.671875 -0.171875 1.203125zm10.693726 1.734375q-1.015625 1.15625 -2.109375 1.15625q-0.984375 0 -1.640625 -0.71875q-0.65625 -0.734375 -0.65625 -2.109375q0 -1.265625 0.515625 -2.3125q0.515625 -1.046875 1.296875 -1.5625q0.78125 -0.515625 1.5625 -0.515625q1.28125 0 1.9375 1.234375l0.78125 -3.71875l1.171875 0l-1.984375 9.546875l-1.09375 0l0.21875 -1.0zm-3.234375 -1.890625q0 0.71875 0.140625 1.140625q0.140625 0.40625 0.484375 0.6875q0.34375 0.28125 0.828125 0.28125q0.796875 0 1.453125 -0.84375q0.875 -1.109375 0.875 -2.734375q0 -0.8125 -0.4375 -1.265625q-0.421875 -0.46875 -1.078125 -0.46875q-0.421875 0 -0.765625 0.1875q-0.34375 0.1875 -0.6875 0.640625q-0.34375 0.453125 -0.578125 1.15625q-0.234375 0.6875 -0.234375 1.21875zm11.053101 0.546875l1.15625 0.109375q-0.25 0.859375 -1.140625 1.625q-0.890625 0.765625 -2.125 0.765625q-0.765625 0 -1.40625 -0.34375q-0.640625 -0.359375 -0.984375 -1.03125q-0.328125 -0.6875 -0.328125 -1.546875q0 -1.140625 0.515625 -2.203125q0.53125 -1.0625 1.359375 -1.578125q0.84375 -0.515625 1.8125 -0.515625q1.234375 0 1.96875 0.765625q0.75 0.765625 0.75 2.09375q0 0.5 -0.09375 1.046875l-5.09375 0q-0.03125 0.1875 -0.03125 0.359375q0 0.96875 0.4375 1.484375q0.453125 0.5 1.109375 0.5q0.59375 0 1.171875 -0.390625q0.59375 -0.390625 0.921875 -1.140625zm-3.421875 -1.71875l3.875 0q0.015625 -0.1875 0.015625 -0.265625q0 -0.875 -0.453125 -1.34375q-0.4375 -0.484375 -1.125 -0.484375q-0.765625 0 -1.390625 0.53125q-0.609375 0.515625 -0.921875 1.5625z" + fill-rule="nonzero" + id="path264" /> + <path + fill="#000000" + d="m186.7589 313.10867l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm9.047028 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm14.318588 4.125l-1.171875 0l0 -7.46875q-0.421875 0.40625 -1.109375 0.8125q-0.6875 0.40625 -1.234375 0.609375l0 -1.140625q0.984375 -0.453125 1.71875 -1.109375q0.734375 -0.671875 1.03125 -1.28125l0.765625 0l0 9.578125z" + fill-rule="nonzero" + id="path266" /> + <path + fill="#000000" + d="m163.32709 326.7493l1.1875 -0.078125q0 0.515625 0.15625 0.875q0.15625 0.359375 0.578125 0.59375q0.421875 0.21875 0.96875 0.21875q0.78125 0 1.171875 -0.3125q0.390625 -0.3125 0.390625 -0.734375q0 -0.3125 -0.234375 -0.578125q-0.234375 -0.28125 -1.171875 -0.671875q-0.9375 -0.40625 -1.1875 -0.578125q-0.4375 -0.265625 -0.671875 -0.625q-0.21875 -0.359375 -0.21875 -0.828125q0 -0.8125 0.65625 -1.390625q0.65625 -0.59375 1.828125 -0.59375q1.296875 0 1.96875 0.609375q0.6875 0.59375 0.71875 1.578125l-1.15625 0.078125q-0.03125 -0.625 -0.453125 -0.984375q-0.40625 -0.375 -1.171875 -0.375q-0.609375 0 -0.953125 0.28125q-0.328125 0.28125 -0.328125 0.609375q0 0.3125 0.296875 0.5625q0.1875 0.171875 1.0 0.53125q1.359375 0.578125 1.703125 0.921875q0.5625 0.53125 0.5625 1.3125q0 0.515625 -0.3125 1.015625q-0.3125 0.484375 -0.96875 0.78125q-0.640625 0.296875 -1.515625 0.296875q-1.203125 0 -2.046875 -0.59375q-0.84375 -0.59375 -0.796875 -1.921875zm9.3203125 1.40625l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm0.9373627 0.953125l1.453125 -6.90625l1.03125 0l-0.28125 1.40625q0.53125 -0.796875 1.03125 -1.171875q0.515625 -0.390625 1.046875 -0.390625q0.359375 0 0.875 0.25l-0.484375 1.09375q-0.3125 -0.21875 -0.671875 -0.21875q-0.625 0 -1.28125 0.6875q-0.640625 0.6875 -1.015625 2.484375l-0.578125 2.765625l-1.125 0zm9.15712 -1.25q-1.234375 1.40625 -2.546875 1.40625q-0.796875 0 -1.296875 -0.453125q-0.484375 -0.46875 -0.484375 -1.125q0 -0.4375 0.21875 -1.5l0.84375 -3.984375l1.171875 0l-0.921875 4.40625q-0.109375 0.5625 -0.109375 0.859375q0 0.390625 0.234375 0.609375q0.234375 0.21875 0.703125 0.21875q0.484375 0 0.953125 -0.234375q0.484375 -0.234375 0.8125 -0.640625q0.34375 -0.421875 0.5625 -0.984375q0.140625 -0.359375 0.328125 -1.25l0.625 -2.984375l1.1875 0l-1.453125 6.90625l-1.078125 0l0.25 -1.25zm7.4749756 -1.265625l1.171875 0.125q-0.4375 1.296875 -1.265625 1.921875q-0.8125 0.625 -1.84375 0.625q-1.140625 0 -1.84375 -0.71875q-0.6875 -0.734375 -0.6875 -2.046875q0 -1.125 0.4375 -2.21875q0.453125 -1.09375 1.28125 -1.65625q0.84375 -0.578125 1.921875 -0.578125q1.109375 0 1.765625 0.625q0.65625 0.625 0.65625 1.65625l-1.15625 0.078125q-0.015625 -0.65625 -0.390625 -1.015625q-0.375 -0.375 -0.984375 -0.375q-0.703125 0 -1.234375 0.453125q-0.515625 0.4375 -0.8125 1.359375q-0.296875 0.90625 -0.296875 1.75q0 0.890625 0.390625 1.34375q0.390625 0.4375 0.96875 0.4375q0.5625 0 1.078125 -0.4375q0.53125 -0.4375 0.84375 -1.328125zm4.6484375 1.5625l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm4.6403503 0.953125l1.453125 -6.90625l1.03125 0l-0.28125 1.40625q0.53125 -0.796875 1.03125 -1.171875q0.515625 -0.390625 1.046875 -0.390625q0.359375 0 0.875 0.25l-0.484375 1.09375q-0.3125 -0.21875 -0.671875 -0.21875q-0.625 0 -1.28125 0.6875q-0.640625 0.6875 -1.015625 2.484375l-0.578125 2.765625l-1.125 0zm7.2039948 -0.953125l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm6.0154877 -1.390625l1.15625 0.109375q-0.25 0.859375 -1.140625 1.625q-0.890625 0.765625 -2.125 0.765625q-0.765625 0 -1.40625 -0.34375q-0.640625 -0.359375 -0.984375 -1.03125q-0.328125 -0.6875 -0.328125 -1.546875q0 -1.140625 0.515625 -2.203125q0.53125 -1.0625 1.359375 -1.578125q0.84375 -0.515625 1.8125 -0.515625q1.234375 0 1.96875 0.765625q0.75 0.765625 0.75 2.09375q0 0.5 -0.09375 1.046875l-5.09375 0q-0.03125 0.1875 -0.03125 0.359375q0 0.96875 0.4375 1.484375q0.453125 0.5 1.109375 0.5q0.59375 0 1.171875 -0.390625q0.59375 -0.390625 0.921875 -1.140625zm-3.421875 -1.71875l3.875 0q0.015625 -0.1875 0.015625 -0.265625q0 -0.875 -0.453125 -1.34375q-0.4375 -0.484375 -1.125 -0.484375q-0.765625 0 -1.390625 0.53125q-0.609375 0.515625 -0.921875 1.5625zm4.4749756 6.71875l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm8.693726 -2.65625l1.453125 -6.90625l1.0625 0l-0.25 1.203125q0.6875 -0.71875 1.296875 -1.03125q0.609375 -0.328125 1.234375 -0.328125q0.84375 0 1.3125 0.453125q0.484375 0.453125 0.484375 1.21875q0 0.375 -0.171875 1.203125l-0.875 4.1875l-1.171875 0l0.921875 -4.375q0.125 -0.640625 0.125 -0.953125q0 -0.34375 -0.234375 -0.546875q-0.234375 -0.21875 -0.6875 -0.21875q-0.90625 0 -1.609375 0.65625q-0.703125 0.640625 -1.03125 2.21875l-0.671875 3.21875l-1.1875 0zm7.6312256 -2.625q0 -2.015625 1.1875 -3.34375q0.984375 -1.09375 2.578125 -1.09375q1.25 0 2.015625 0.78125q0.765625 0.78125 0.765625 2.109375q0 1.1875 -0.484375 2.21875q-0.484375 1.015625 -1.375 1.5625q-0.890625 0.546875 -1.875 0.546875q-0.796875 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0 -0.96875q-0.34375 -0.640625 -0.34375 -1.46875zm1.171875 -0.109375q0 0.96875 0.46875 1.484375q0.46875 0.5 1.1875 0.5q0.375 0 0.75 -0.15625q0.375 -0.15625 0.6875 -0.46875q0.328125 -0.3125 0.546875 -0.703125q0.21875 -0.40625 0.359375 -0.875q0.203125 -0.640625 0.203125 -1.234375q0 -0.9375 -0.46875 -1.453125q-0.46875 -0.515625 -1.1875 -0.515625q-0.5625 0 -1.015625 0.265625q-0.453125 0.265625 -0.828125 0.78125q-0.359375 0.5 -0.53125 1.171875q-0.171875 0.671875 -0.171875 1.203125zm10.693726 1.734375q-1.015625 1.15625 -2.109375 1.15625q-0.984375 0 -1.640625 -0.71875q-0.65625 -0.734375 -0.65625 -2.109375q0 -1.265625 0.515625 -2.3125q0.515625 -1.046875 1.296875 -1.5625q0.78125 -0.515625 1.5625 -0.515625q1.28125 0 1.9375 1.234375l0.78125 -3.71875l1.171875 0l-1.984375 9.546875l-1.09375 0l0.21875 -1.0zm-3.234375 -1.890625q0 0.71875 0.140625 1.140625q0.140625 0.40625 0.484375 0.6875q0.34375 0.28125 0.828125 0.28125q0.796875 0 1.453125 -0.84375q0.875 -1.109375 0.875 -2.734375q0 -0.8125 -0.4375 -1.265625q-0.421875 -0.46875 -1.078125 -0.46875q-0.421875 0 -0.765625 0.1875q-0.34375 0.1875 -0.6875 0.640625q-0.34375 0.453125 -0.578125 1.15625q-0.234375 0.6875 -0.234375 1.21875zm11.053101 0.546875l1.15625 0.109375q-0.25 0.859375 -1.140625 1.625q-0.890625 0.765625 -2.125 0.765625q-0.765625 0 -1.40625 -0.34375q-0.640625 -0.359375 -0.984375 -1.03125q-0.328125 -0.6875 -0.328125 -1.546875q0 -1.140625 0.515625 -2.203125q0.53125 -1.0625 1.359375 -1.578125q0.84375 -0.515625 1.8125 -0.515625q1.234375 0 1.96875 0.765625q0.75 0.765625 0.75 2.09375q0 0.5 -0.09375 1.046875l-5.09375 0q-0.03125 0.1875 -0.03125 0.359375q0 0.96875 0.4375 1.484375q0.453125 0.5 1.109375 0.5q0.59375 0 1.171875 -0.390625q0.59375 -0.390625 0.921875 -1.140625zm-3.421875 -1.71875l3.875 0q0.015625 -0.1875 0.015625 -0.265625q0 -0.875 -0.453125 -1.34375q-0.4375 -0.484375 -1.125 -0.484375q-0.765625 0 -1.390625 0.53125q-0.609375 0.515625 -0.921875 1.5625z" + fill-rule="nonzero" + id="path268" /> + <path + fill="#000000" + d="m186.7589 364.3055l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm9.047028 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm16.052963 3.0l0 1.125l-6.296875 0q-0.015625 -0.421875 0.140625 -0.8125q0.234375 -0.640625 0.765625 -1.265625q0.53125 -0.625 1.53125 -1.453125q1.5625 -1.265625 2.109375 -2.015625q0.546875 -0.75 0.546875 -1.40625q0 -0.703125 -0.5 -1.171875q-0.5 -0.484375 -1.296875 -0.484375q-0.859375 0 -1.375 0.515625q-0.5 0.5 -0.5 1.390625l-1.203125 -0.109375q0.125 -1.359375 0.921875 -2.0625q0.8125 -0.703125 2.171875 -0.703125q1.375 0 2.171875 0.765625q0.8125 0.75 0.8125 1.875q0 0.578125 -0.234375 1.140625q-0.234375 0.546875 -0.78125 1.15625q-0.546875 0.609375 -1.8125 1.671875q-1.046875 0.890625 -1.359375 1.21875q-0.296875 0.3125 -0.484375 0.625l4.671875 0z" + fill-rule="nonzero" + id="path270" /> + <path + fill="#000000" + d="m163.32709 377.94614l1.1875 -0.078125q0 0.515625 0.15625 0.875q0.15625 0.359375 0.578125 0.59375q0.421875 0.21875 0.96875 0.21875q0.78125 0 1.171875 -0.3125q0.390625 -0.3125 0.390625 -0.734375q0 -0.3125 -0.234375 -0.578125q-0.234375 -0.28125 -1.171875 -0.671875q-0.9375 -0.40625 -1.1875 -0.578125q-0.4375 -0.265625 -0.671875 -0.625q-0.21875 -0.359375 -0.21875 -0.828125q0 -0.8125 0.65625 -1.390625q0.65625 -0.59375 1.828125 -0.59375q1.296875 0 1.96875 0.609375q0.6875 0.59375 0.71875 1.578125l-1.15625 0.078125q-0.03125 -0.625 -0.453125 -0.984375q-0.40625 -0.375 -1.171875 -0.375q-0.609375 0 -0.953125 0.28125q-0.328125 0.28125 -0.328125 0.609375q0 0.3125 0.296875 0.5625q0.1875 0.171875 1.0 0.53125q1.359375 0.578125 1.703125 0.921875q0.5625 0.53125 0.5625 1.3125q0 0.515625 -0.3125 1.015625q-0.3125 0.484375 -0.96875 0.78125q-0.640625 0.296875 -1.515625 0.296875q-1.203125 0 -2.046875 -0.59375q-0.84375 -0.59375 -0.796875 -1.921875zm9.3203125 1.40625l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm0.9373627 0.953125l1.453125 -6.90625l1.03125 0l-0.28125 1.40625q0.53125 -0.796875 1.03125 -1.171875q0.515625 -0.390625 1.046875 -0.390625q0.359375 0 0.875 0.25l-0.484375 1.09375q-0.3125 -0.21875 -0.671875 -0.21875q-0.625 0 -1.28125 0.6875q-0.640625 0.6875 -1.015625 2.484375l-0.578125 2.765625l-1.125 0zm9.15712 -1.25q-1.234375 1.40625 -2.546875 1.40625q-0.796875 0 -1.296875 -0.453125q-0.484375 -0.46875 -0.484375 -1.125q0 -0.4375 0.21875 -1.5l0.84375 -3.984375l1.171875 0l-0.921875 4.40625q-0.109375 0.5625 -0.109375 0.859375q0 0.390625 0.234375 0.609375q0.234375 0.21875 0.703125 0.21875q0.484375 0 0.953125 -0.234375q0.484375 -0.234375 0.8125 -0.640625q0.34375 -0.421875 0.5625 -0.984375q0.140625 -0.359375 0.328125 -1.25l0.625 -2.984375l1.1875 0l-1.453125 6.90625l-1.078125 0l0.25 -1.25zm7.4749756 -1.265625l1.171875 0.125q-0.4375 1.296875 -1.265625 1.921875q-0.8125 0.625 -1.84375 0.625q-1.140625 0 -1.84375 -0.71875q-0.6875 -0.734375 -0.6875 -2.046875q0 -1.125 0.4375 -2.21875q0.453125 -1.09375 1.28125 -1.65625q0.84375 -0.578125 1.921875 -0.578125q1.109375 0 1.765625 0.625q0.65625 0.625 0.65625 1.65625l-1.15625 0.078125q-0.015625 -0.65625 -0.390625 -1.015625q-0.375 -0.375 -0.984375 -0.375q-0.703125 0 -1.234375 0.453125q-0.515625 0.4375 -0.8125 1.359375q-0.296875 0.90625 -0.296875 1.75q0 0.890625 0.390625 1.34375q0.390625 0.4375 0.96875 0.4375q0.5625 0 1.078125 -0.4375q0.53125 -0.4375 0.84375 -1.328125zm4.6484375 1.5625l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm4.6403503 0.953125l1.453125 -6.90625l1.03125 0l-0.28125 1.40625q0.53125 -0.796875 1.03125 -1.171875q0.515625 -0.390625 1.046875 -0.390625q0.359375 0 0.875 0.25l-0.484375 1.09375q-0.3125 -0.21875 -0.671875 -0.21875q-0.625 0 -1.28125 0.6875q-0.640625 0.6875 -1.015625 2.484375l-0.578125 2.765625l-1.125 0zm7.2039948 -0.953125l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm6.0154877 -1.390625l1.15625 0.109375q-0.25 0.859375 -1.140625 1.625q-0.890625 0.765625 -2.125 0.765625q-0.765625 0 -1.40625 -0.34375q-0.640625 -0.359375 -0.984375 -1.03125q-0.328125 -0.6875 -0.328125 -1.546875q0 -1.140625 0.515625 -2.203125q0.53125 -1.0625 1.359375 -1.578125q0.84375 -0.515625 1.8125 -0.515625q1.234375 0 1.96875 0.765625q0.75 0.765625 0.75 2.09375q0 0.5 -0.09375 1.046875l-5.09375 0q-0.03125 0.1875 -0.03125 0.359375q0 0.96875 0.4375 1.484375q0.453125 0.5 1.109375 0.5q0.59375 0 1.171875 -0.390625q0.59375 -0.390625 0.921875 -1.140625zm-3.421875 -1.71875l3.875 0q0.015625 -0.1875 0.015625 -0.265625q0 -0.875 -0.453125 -1.34375q-0.4375 -0.484375 -1.125 -0.484375q-0.765625 0 -1.390625 0.53125q-0.609375 0.515625 -0.921875 1.5625zm4.4749756 6.71875l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm8.693726 -2.65625l1.453125 -6.90625l1.0625 0l-0.25 1.203125q0.6875 -0.71875 1.296875 -1.03125q0.609375 -0.328125 1.234375 -0.328125q0.84375 0 1.3125 0.453125q0.484375 0.453125 0.484375 1.21875q0 0.375 -0.171875 1.203125l-0.875 4.1875l-1.171875 0l0.921875 -4.375q0.125 -0.640625 0.125 -0.953125q0 -0.34375 -0.234375 -0.546875q-0.234375 -0.21875 -0.6875 -0.21875q-0.90625 0 -1.609375 0.65625q-0.703125 0.640625 -1.03125 2.21875l-0.671875 3.21875l-1.1875 0zm7.6312256 -2.625q0 -2.015625 1.1875 -3.34375q0.984375 -1.09375 2.578125 -1.09375q1.25 0 2.015625 0.78125q0.765625 0.78125 0.765625 2.109375q0 1.1875 -0.484375 2.21875q-0.484375 1.015625 -1.375 1.5625q-0.890625 0.546875 -1.875 0.546875q-0.796875 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0 -0.96875q-0.34375 -0.640625 -0.34375 -1.46875zm1.171875 -0.109375q0 0.96875 0.46875 1.484375q0.46875 0.5 1.1875 0.5q0.375 0 0.75 -0.15625q0.375 -0.15625 0.6875 -0.46875q0.328125 -0.3125 0.546875 -0.703125q0.21875 -0.40625 0.359375 -0.875q0.203125 -0.640625 0.203125 -1.234375q0 -0.9375 -0.46875 -1.453125q-0.46875 -0.515625 -1.1875 -0.515625q-0.5625 0 -1.015625 0.265625q-0.453125 0.265625 -0.828125 0.78125q-0.359375 0.5 -0.53125 1.171875q-0.171875 0.671875 -0.171875 1.203125zm10.693726 1.734375q-1.015625 1.15625 -2.109375 1.15625q-0.984375 0 -1.640625 -0.71875q-0.65625 -0.734375 -0.65625 -2.109375q0 -1.265625 0.515625 -2.3125q0.515625 -1.046875 1.296875 -1.5625q0.78125 -0.515625 1.5625 -0.515625q1.28125 0 1.9375 1.234375l0.78125 -3.71875l1.171875 0l-1.984375 9.546875l-1.09375 0l0.21875 -1.0zm-3.234375 -1.890625q0 0.71875 0.140625 1.140625q0.140625 0.40625 0.484375 0.6875q0.34375 0.28125 0.828125 0.28125q0.796875 0 1.453125 -0.84375q0.875 -1.109375 0.875 -2.734375q0 -0.8125 -0.4375 -1.265625q-0.421875 -0.46875 -1.078125 -0.46875q-0.421875 0 -0.765625 0.1875q-0.34375 0.1875 -0.6875 0.640625q-0.34375 0.453125 -0.578125 1.15625q-0.234375 0.6875 -0.234375 1.21875zm11.053101 0.546875l1.15625 0.109375q-0.25 0.859375 -1.140625 1.625q-0.890625 0.765625 -2.125 0.765625q-0.765625 0 -1.40625 -0.34375q-0.640625 -0.359375 -0.984375 -1.03125q-0.328125 -0.6875 -0.328125 -1.546875q0 -1.140625 0.515625 -2.203125q0.53125 -1.0625 1.359375 -1.578125q0.84375 -0.515625 1.8125 -0.515625q1.234375 0 1.96875 0.765625q0.75 0.765625 0.75 2.09375q0 0.5 -0.09375 1.046875l-5.09375 0q-0.03125 0.1875 -0.03125 0.359375q0 0.96875 0.4375 1.484375q0.453125 0.5 1.109375 0.5q0.59375 0 1.171875 -0.390625q0.59375 -0.390625 0.921875 -1.140625zm-3.421875 -1.71875l3.875 0q0.015625 -0.1875 0.015625 -0.265625q0 -0.875 -0.453125 -1.34375q-0.4375 -0.484375 -1.125 -0.484375q-0.765625 0 -1.390625 0.53125q-0.609375 0.515625 -0.921875 1.5625z" + fill-rule="nonzero" + id="path272" /> + <path + fill="#000000" + d="m185.65256 415.50235l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm9.047028 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm10.365463 4.125l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0z" + fill-rule="nonzero" + id="path274" /> + <path + fill="#000000" + d="m163.32709 429.14297l1.1875 -0.078125q0 0.515625 0.15625 0.875q0.15625 0.359375 0.578125 0.59375q0.421875 0.21875 0.96875 0.21875q0.78125 0 1.171875 -0.3125q0.390625 -0.3125 0.390625 -0.734375q0 -0.3125 -0.234375 -0.578125q-0.234375 -0.28125 -1.171875 -0.671875q-0.9375 -0.40625 -1.1875 -0.578125q-0.4375 -0.265625 -0.671875 -0.625q-0.21875 -0.359375 -0.21875 -0.828125q0 -0.8125 0.65625 -1.390625q0.65625 -0.59375 1.828125 -0.59375q1.296875 0 1.96875 0.609375q0.6875 0.59375 0.71875 1.578125l-1.15625 0.078125q-0.03125 -0.625 -0.453125 -0.984375q-0.40625 -0.375 -1.171875 -0.375q-0.609375 0 -0.953125 0.28125q-0.328125 0.28125 -0.328125 0.609375q0 0.3125 0.296875 0.5625q0.1875 0.171875 1.0 0.53125q1.359375 0.578125 1.703125 0.921875q0.5625 0.53125 0.5625 1.3125q0 0.515625 -0.3125 1.015625q-0.3125 0.484375 -0.96875 0.78125q-0.640625 0.296875 -1.515625 0.296875q-1.203125 0 -2.046875 -0.59375q-0.84375 -0.59375 -0.796875 -1.921875zm9.3203125 1.40625l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm0.9373627 0.953125l1.453125 -6.90625l1.03125 0l-0.28125 1.40625q0.53125 -0.796875 1.03125 -1.171875q0.515625 -0.390625 1.046875 -0.390625q0.359375 0 0.875 0.25l-0.484375 1.09375q-0.3125 -0.21875 -0.671875 -0.21875q-0.625 0 -1.28125 0.6875q-0.640625 0.6875 -1.015625 2.484375l-0.578125 2.765625l-1.125 0zm9.15712 -1.25q-1.234375 1.40625 -2.546875 1.40625q-0.796875 0 -1.296875 -0.453125q-0.484375 -0.46875 -0.484375 -1.125q0 -0.4375 0.21875 -1.5l0.84375 -3.984375l1.171875 0l-0.921875 4.40625q-0.109375 0.5625 -0.109375 0.859375q0 0.390625 0.234375 0.609375q0.234375 0.21875 0.703125 0.21875q0.484375 0 0.953125 -0.234375q0.484375 -0.234375 0.8125 -0.640625q0.34375 -0.421875 0.5625 -0.984375q0.140625 -0.359375 0.328125 -1.25l0.625 -2.984375l1.1875 0l-1.453125 6.90625l-1.078125 0l0.25 -1.25zm7.4749756 -1.265625l1.171875 0.125q-0.4375 1.296875 -1.265625 1.921875q-0.8125 0.625 -1.84375 0.625q-1.140625 0 -1.84375 -0.71875q-0.6875 -0.734375 -0.6875 -2.046875q0 -1.125 0.4375 -2.21875q0.453125 -1.09375 1.28125 -1.65625q0.84375 -0.578125 1.921875 -0.578125q1.109375 0 1.765625 0.625q0.65625 0.625 0.65625 1.65625l-1.15625 0.078125q-0.015625 -0.65625 -0.390625 -1.015625q-0.375 -0.375 -0.984375 -0.375q-0.703125 0 -1.234375 0.453125q-0.515625 0.4375 -0.8125 1.359375q-0.296875 0.90625 -0.296875 1.75q0 0.890625 0.390625 1.34375q0.390625 0.4375 0.96875 0.4375q0.5625 0 1.078125 -0.4375q0.53125 -0.4375 0.84375 -1.328125zm4.6484375 1.5625l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm4.6403503 0.953125l1.453125 -6.90625l1.03125 0l-0.28125 1.40625q0.53125 -0.796875 1.03125 -1.171875q0.515625 -0.390625 1.046875 -0.390625q0.359375 0 0.875 0.25l-0.484375 1.09375q-0.3125 -0.21875 -0.671875 -0.21875q-0.625 0 -1.28125 0.6875q-0.640625 0.6875 -1.015625 2.484375l-0.578125 2.765625l-1.125 0zm7.2039948 -0.953125l-0.203125 0.953125q-0.421875 0.109375 -0.8125 0.109375q-0.703125 0 -1.125 -0.34375q-0.3125 -0.25 -0.3125 -0.703125q0 -0.234375 0.171875 -1.046875l0.828125 -4.015625l-0.921875 0l0.1875 -0.90625l0.9375 0l0.34375 -1.703125l1.359375 -0.8125l-0.53125 2.515625l1.15625 0l-0.1875 0.90625l-1.15625 0l-0.796875 3.8125q-0.15625 0.734375 -0.15625 0.875q0 0.21875 0.109375 0.328125q0.125 0.109375 0.40625 0.109375q0.390625 0 0.703125 -0.078125zm6.0154877 -1.390625l1.15625 0.109375q-0.25 0.859375 -1.140625 1.625q-0.890625 0.765625 -2.125 0.765625q-0.765625 0 -1.40625 -0.34375q-0.640625 -0.359375 -0.984375 -1.03125q-0.328125 -0.6875 -0.328125 -1.546875q0 -1.140625 0.515625 -2.203125q0.53125 -1.0625 1.359375 -1.578125q0.84375 -0.515625 1.8125 -0.515625q1.234375 0 1.96875 0.765625q0.75 0.765625 0.75 2.09375q0 0.5 -0.09375 1.046875l-5.09375 0q-0.03125 0.1875 -0.03125 0.359375q0 0.96875 0.4375 1.484375q0.453125 0.5 1.109375 0.5q0.59375 0 1.171875 -0.390625q0.59375 -0.390625 0.921875 -1.140625zm-3.421875 -1.71875l3.875 0q0.015625 -0.1875 0.015625 -0.265625q0 -0.875 -0.453125 -1.34375q-0.4375 -0.484375 -1.125 -0.484375q-0.765625 0 -1.390625 0.53125q-0.609375 0.515625 -0.921875 1.5625zm4.4749756 6.71875l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm8.693726 -2.65625l1.453125 -6.90625l1.0625 0l-0.25 1.203125q0.6875 -0.71875 1.296875 -1.03125q0.609375 -0.328125 1.234375 -0.328125q0.84375 0 1.3125 0.453125q0.484375 0.453125 0.484375 1.21875q0 0.375 -0.171875 1.203125l-0.875 4.1875l-1.171875 0l0.921875 -4.375q0.125 -0.640625 0.125 -0.953125q0 -0.34375 -0.234375 -0.546875q-0.234375 -0.21875 -0.6875 -0.21875q-0.90625 0 -1.609375 0.65625q-0.703125 0.640625 -1.03125 2.21875l-0.671875 3.21875l-1.1875 0zm7.6312256 -2.625q0 -2.015625 1.1875 -3.34375q0.984375 -1.09375 2.578125 -1.09375q1.25 0 2.015625 0.78125q0.765625 0.78125 0.765625 2.109375q0 1.1875 -0.484375 2.21875q-0.484375 1.015625 -1.375 1.5625q-0.890625 0.546875 -1.875 0.546875q-0.796875 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0 -0.96875q-0.34375 -0.640625 -0.34375 -1.46875zm1.171875 -0.109375q0 0.96875 0.46875 1.484375q0.46875 0.5 1.1875 0.5q0.375 0 0.75 -0.15625q0.375 -0.15625 0.6875 -0.46875q0.328125 -0.3125 0.546875 -0.703125q0.21875 -0.40625 0.359375 -0.875q0.203125 -0.640625 0.203125 -1.234375q0 -0.9375 -0.46875 -1.453125q-0.46875 -0.515625 -1.1875 -0.515625q-0.5625 0 -1.015625 0.265625q-0.453125 0.265625 -0.828125 0.78125q-0.359375 0.5 -0.53125 1.171875q-0.171875 0.671875 -0.171875 1.203125zm10.693726 1.734375q-1.015625 1.15625 -2.109375 1.15625q-0.984375 0 -1.640625 -0.71875q-0.65625 -0.734375 -0.65625 -2.109375q0 -1.265625 0.515625 -2.3125q0.515625 -1.046875 1.296875 -1.5625q0.78125 -0.515625 1.5625 -0.515625q1.28125 0 1.9375 1.234375l0.78125 -3.71875l1.171875 0l-1.984375 9.546875l-1.09375 0l0.21875 -1.0zm-3.234375 -1.890625q0 0.71875 0.140625 1.140625q0.140625 0.40625 0.484375 0.6875q0.34375 0.28125 0.828125 0.28125q0.796875 0 1.453125 -0.84375q0.875 -1.109375 0.875 -2.734375q0 -0.8125 -0.4375 -1.265625q-0.421875 -0.46875 -1.078125 -0.46875q-0.421875 0 -0.765625 0.1875q-0.34375 0.1875 -0.6875 0.640625q-0.34375 0.453125 -0.578125 1.15625q-0.234375 0.6875 -0.234375 1.21875zm11.053101 0.546875l1.15625 0.109375q-0.25 0.859375 -1.140625 1.625q-0.890625 0.765625 -2.125 0.765625q-0.765625 0 -1.40625 -0.34375q-0.640625 -0.359375 -0.984375 -1.03125q-0.328125 -0.6875 -0.328125 -1.546875q0 -1.140625 0.515625 -2.203125q0.53125 -1.0625 1.359375 -1.578125q0.84375 -0.515625 1.8125 -0.515625q1.234375 0 1.96875 0.765625q0.75 0.765625 0.75 2.09375q0 0.5 -0.09375 1.046875l-5.09375 0q-0.03125 0.1875 -0.03125 0.359375q0 0.96875 0.4375 1.484375q0.453125 0.5 1.109375 0.5q0.59375 0 1.171875 -0.390625q0.59375 -0.390625 0.921875 -1.140625zm-3.421875 -1.71875l3.875 0q0.015625 -0.1875 0.015625 -0.265625q0 -0.875 -0.453125 -1.34375q-0.4375 -0.484375 -1.125 -0.484375q-0.765625 0 -1.390625 0.53125q-0.609375 0.515625 -0.921875 1.5625z" + fill-rule="nonzero" + id="path276" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m92.06693 62.29134l230.33072 0l0 27.464565l-230.33072 0z" + fill-rule="evenodd" + id="path278" /> + <path + fill="#000000" + d="m114.3782 84.09134l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm7.0164948 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm5.8748627 -1.171875l1.2031174 0.140625q-0.28125 1.0625 -1.0624924 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.8749924 0.9375 0.8749924 2.65625q0 0.109375 0 0.3125l-5.1562424 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.443718 6.78125l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm8.271851 -2.078125l1.140625 0.15625q0.078125 0.53125 0.40625 0.78125q0.4375 0.3125 1.1875 0.3125q0.8125 0 1.25 -0.328125q0.453125 -0.3125 0.609375 -0.90625q0.09375 -0.359375 0.078125 -1.5q-0.765625 0.90625 -1.90625 0.90625q-1.4375 0 -2.21875 -1.03125q-0.78125 -1.03125 -0.78125 -2.46875q0 -0.984375 0.359375 -1.8125q0.359375 -0.84375 1.03125 -1.296875q0.6875 -0.453125 1.609375 -0.453125q1.21875 0 2.015625 0.984375l0 -0.828125l1.078125 0l0 5.96875q0 1.609375 -0.328125 2.28125q-0.328125 0.6875 -1.046875 1.078125q-0.703125 0.390625 -1.75 0.390625q-1.234375 0 -2.0 -0.5625q-0.75 -0.5625 -0.734375 -1.671875zm0.984375 -4.15625q0 1.359375 0.53125 1.984375q0.546875 0.625 1.359375 0.625q0.796875 0 1.34375 -0.625q0.546875 -0.625 0.546875 -1.953125q0 -1.265625 -0.5625 -1.90625q-0.5625 -0.640625 -1.359375 -0.640625q-0.765625 0 -1.3125 0.640625q-0.546875 0.625 -0.546875 1.875zm6.6312256 3.578125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.96962 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9906006 6.125l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm6.3499756 3.421875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm10.677963 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm7.7249756 3.453125l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.3343506 -4.6875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm-1.484375 10.875l0.21875 -1.0q0.359375 0.09375 0.546875 0.09375q0.359375 0 0.53125 -0.25q0.1875 -0.234375 0.1875 -1.1875l0 -7.25l1.171875 0l0 7.28125q0 1.28125 -0.328125 1.78125q-0.4375 0.65625 -1.40625 0.65625q-0.484375 0 -0.921875 -0.125zm9.17984 -4.90625l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm11.037476 1.59375l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm4.7109375 1.484375l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm4.8434753 1.046875l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836807 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5218506 4.125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.664932 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6312256 3.453125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.4071198 2.65625l-0.125 -1.09375q0.375 0.109375 0.65625 0.109375q0.390625 0 0.625 -0.140625q0.234375 -0.125 0.390625 -0.359375q0.109375 -0.171875 0.359375 -0.875q0.03125 -0.09375 0.109375 -0.28125l-2.625 -6.921875l1.265625 0l1.4375 4.0q0.28125 0.765625 0.5 1.59375q0.203125 -0.796875 0.46875 -1.578125l1.484375 -4.015625l1.171875 0l-2.625 7.015625q-0.421875 1.140625 -0.65625 1.578125q-0.3125 0.578125 -0.71875 0.84375q-0.40625 0.28125 -0.96875 0.28125q-0.328125 0 -0.75 -0.15625zm10.398315 -2.65625l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.49234 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9437256 6.125l-0.125 -1.09375q0.375 0.109375 0.65625 0.109375q0.390625 0 0.625 -0.140625q0.234375 -0.125 0.390625 -0.359375q0.109375 -0.171875 0.359375 -0.875q0.03125 -0.09375 0.109375 -0.28125l-2.625 -6.921875l1.265625 0l1.4375 4.0q0.28125 0.765625 0.5 1.59375q0.203125 -0.796875 0.46875 -1.578125l1.484375 -4.015625l1.171875 0l-2.625 7.015625q-0.421875 1.140625 -0.65625 1.578125q-0.3125 0.578125 -0.71875 0.84375q-0.40625 0.28125 -0.96875 0.28125q-0.328125 0 -0.75 -0.15625zm6.2734375 -6.109375q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.178101 3.453125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm5.4437256 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875z" + fill-rule="nonzero" + id="path280" + style="fill:#c8ab37" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m140.50394 444.9134c-7.1840515 0 -13.007874 -0.9706116 -13.007874 -2.1679077l0 -97.616974c0 -1.1972961 -5.823822 -2.1678772 -13.007874 -2.1678772l0 0c7.1840515 0 13.007874 -0.9706116 13.007874 -2.1679077l0 -97.61696l0 0c0 -1.1972961 5.823822 -2.1678925 13.007874 -2.1678925z" + fill-rule="evenodd" + id="path282" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m140.50394 444.9134c-7.1840515 0 -13.007874 -0.9706116 -13.007874 -2.1679077l0 -97.616974c0 -1.1972961 -5.823822 -2.1678772 -13.007874 -2.1678772l0 0c7.1840515 0 13.007874 -0.9706116 13.007874 -2.1679077l0 -97.61696l0 0c0 -1.1972961 5.823822 -2.1678925 13.007874 -2.1678925" + fill-rule="evenodd" + id="path284" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m140.50394 444.9134c-7.1840515 0 -13.007874 -0.9706116 -13.007874 -2.1679077l0 -97.616974c0 -1.1972961 -5.823822 -2.1678772 -13.007874 -2.1678772l0 0c7.1840515 0 13.007874 -0.9706116 13.007874 -2.1679077l0 -97.61696l0 0c0 -1.1972961 5.823822 -2.1678925 13.007874 -2.1678925" + fill-rule="evenodd" + id="path286" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m64.91338 302.8189l99.40157 0l0 27.46457l-99.40157 0z" + fill-rule="evenodd" + id="path288" /> + <path + fill="#000000" + d="m74.71026 323.3389l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm7.642578 0l-0.984375 0l0 -8.59375l1.0625 0l0 3.0625q0.671875 -0.828125 1.703125 -0.828125q0.578125 0 1.078125 0.234375q0.515625 0.21875 0.84375 0.640625q0.34375 0.421875 0.53125 1.015625q0.1875 0.59375 0.1875 1.265625q0 1.59375 -0.796875 2.46875q-0.796875 0.875 -1.890625 0.875q-1.109375 0 -1.734375 -0.921875l0 0.78125zm-0.015625 -3.15625q0 1.109375 0.3125 1.609375q0.5 0.8125 1.34375 0.8125q0.6875 0 1.1875 -0.59375q0.515625 -0.59375 0.515625 -1.796875q0 -1.21875 -0.484375 -1.796875q-0.484375 -0.578125 -1.171875 -0.578125q-0.6875 0 -1.203125 0.609375q-0.5 0.59375 -0.5 1.734375zm4.736328 5.546875l0 -0.765625l7.0 0l0 0.765625l-7.0 0zm7.658203 -2.390625l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.283203 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm10.017578 3.109375l0 -0.78125q-0.59375 0.921875 -1.734375 0.921875q-0.75 0 -1.375 -0.40625q-0.625 -0.421875 -0.96875 -1.15625q-0.34375 -0.734375 -0.34375 -1.6875q0 -0.921875 0.3125 -1.6875q0.3125 -0.765625 0.9375 -1.15625q0.625 -0.40625 1.390625 -0.40625q0.5625 0 1.0 0.234375q0.4375 0.234375 0.71875 0.609375l0 -3.078125l1.046875 0l0 8.59375l-0.984375 0zm-3.328125 -3.109375q0 1.203125 0.5 1.796875q0.5 0.578125 1.1875 0.578125q0.6875 0 1.171875 -0.5625q0.484375 -0.5625 0.484375 -1.71875q0 -1.28125 -0.5 -1.875q-0.484375 -0.59375 -1.203125 -0.59375q-0.703125 0 -1.171875 0.578125q-0.46875 0.5625 -0.46875 1.796875zm10.220703 1.109375l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.455078 1.84375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5z" + fill-rule="nonzero" + id="path290" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m687.0105 100.022575l0 284.57217" + fill-rule="nonzero" + id="path292" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m815.45404 100.022575l0 284.57217" + fill-rule="nonzero" + id="path294" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m686.51184 100.52126l129.44092 0" + fill-rule="nonzero" + id="path296" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m686.51184 135.71811l129.44092 0" + fill-rule="nonzero" + id="path298" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m686.51184 172.91496l129.44092 0" + fill-rule="nonzero" + id="path300" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m686.51184 208.11182l129.44092 0" + fill-rule="nonzero" + id="path302" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m686.51184 243.30865l129.44092 0" + fill-rule="nonzero" + id="path304" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m686.51184 278.50552l129.44092 0" + fill-rule="nonzero" + id="path306" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m686.51184 313.70236l129.44092 0" + fill-rule="nonzero" + id="path308" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m686.51184 348.8992l129.44092 0" + fill-rule="nonzero" + id="path310" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m686.51184 384.09607l129.44092 0" + fill-rule="nonzero" + id="path312" /> + <path + fill="#000000" + d="m733.8046 122.32126l0 -9.546875l6.4375 0l0 1.125l-5.171875 0l0 2.96875l4.46875 0l0 1.125l-4.46875 0l0 4.328125l-1.265625 0zm12.656982 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5218506 4.125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm11.928101 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.8828125 0.3125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375z" + fill-rule="nonzero" + id="path314" /> + <path + fill="#000000" + d="m709.2222 154.45561l1.203125 -0.109375q0.078125 0.71875 0.390625 1.1875q0.3125 0.453125 0.953125 0.734375q0.65625 0.28125 1.46875 0.28125q0.71875 0 1.265625 -0.21875q0.5625 -0.21875 0.828125 -0.578125q0.265625 -0.375 0.265625 -0.828125q0 -0.453125 -0.265625 -0.78125q-0.25 -0.328125 -0.84375 -0.5625q-0.390625 -0.15625 -1.703125 -0.46875q-1.3125 -0.3125 -1.84375 -0.59375q-0.671875 -0.359375 -1.015625 -0.890625q-0.328125 -0.53125 -0.328125 -1.1875q0 -0.71875 0.40625 -1.34375q0.40625 -0.625 1.1875 -0.953125q0.796875 -0.328125 1.765625 -0.328125q1.046875 0 1.859375 0.34375q0.8125 0.34375 1.25 1.015625q0.4375 0.65625 0.46875 1.484375l-1.203125 0.09375q-0.109375 -0.90625 -0.671875 -1.359375q-0.5625 -0.46875 -1.65625 -0.46875q-1.140625 0 -1.671875 0.421875q-0.515625 0.421875 -0.515625 1.015625q0 0.515625 0.359375 0.84375q0.375 0.328125 1.90625 0.6875q1.546875 0.34375 2.109375 0.59375q0.84375 0.390625 1.234375 0.984375q0.390625 0.578125 0.390625 1.359375q0 0.75 -0.4375 1.4375q-0.421875 0.671875 -1.25 1.046875q-0.8125 0.359375 -1.828125 0.359375q-1.296875 0 -2.171875 -0.375q-0.875 -0.375 -1.375 -1.125q-0.5 -0.765625 -0.53125 -1.71875zm9.155334 3.0625l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.5392456 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm7.9281006 3.453125l-2.125 -6.90625l1.21875 0l1.09375 3.984375l0.421875 1.484375q0.015625 -0.109375 0.359375 -1.421875l1.09375 -4.046875l1.203125 0l1.03125 4.0l0.34375 1.328125l0.40625 -1.34375l1.171875 -3.984375l1.140625 0l-2.15625 6.90625l-1.21875 0l-1.09375 -4.140625l-0.265625 -1.171875l-1.40625 5.3125l-1.21875 0zm8.343872 2.65625l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm10.865601 2.5625q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm5.5531006 2.421875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1405029 1.046875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm15.6311035 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9749756 3.46875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm9.1883545 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm11.037476 3.265625q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875z" + fill-rule="nonzero" + id="path316" /> + <path + fill="#000000" + d="m710.1765 191.37122l1.265625 0.3125q-0.390625 1.5625 -1.421875 2.375q-1.03125 0.8125 -2.53125 0.8125q-1.53125 0 -2.5 -0.625q-0.96875 -0.625 -1.484375 -1.8125q-0.5 -1.1875 -0.5 -2.5625q0 -1.484375 0.5625 -2.59375q0.578125 -1.109375 1.625 -1.6875q1.0625 -0.578125 2.328125 -0.578125q1.421875 0 2.390625 0.734375q0.984375 0.71875 1.375 2.046875l-1.25 0.296875q-0.328125 -1.046875 -0.96875 -1.515625q-0.625 -0.484375 -1.578125 -0.484375q-1.09375 0 -1.84375 0.53125q-0.734375 0.53125 -1.03125 1.421875q-0.296875 0.875 -0.296875 1.828125q0 1.21875 0.34375 2.125q0.359375 0.90625 1.109375 1.359375q0.75 0.4375 1.625 0.4375q1.0625 0 1.796875 -0.609375q0.734375 -0.609375 0.984375 -1.8125zm2.234497 -0.109375q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm9.974976 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm5.874878 -1.171875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.7406006 4.125l2.53125 -3.59375l-2.34375 -3.3125l1.46875 0l1.0625 1.609375q0.296875 0.46875 0.484375 0.78125q0.28125 -0.4375 0.515625 -0.765625l1.171875 -1.625l1.40625 0l-2.390625 3.25l2.5625 3.65625l-1.4375 0l-1.421875 -2.140625l-0.375 -0.59375l-1.8125 2.734375l-1.421875 0zm10.0078125 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm4.843445 1.046875l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836853 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5218506 4.125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.664917 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6312256 3.453125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.4071045 2.65625l-0.125 -1.09375q0.375 0.109375 0.65625 0.109375q0.390625 0 0.625 -0.140625q0.234375 -0.125 0.390625 -0.359375q0.109375 -0.171875 0.359375 -0.875q0.03125 -0.09375 0.109375 -0.28125l-2.625 -6.921875l1.265625 0l1.4375 4.0q0.28125 0.765625 0.5 1.59375q0.203125 -0.796875 0.46875 -1.578125l1.484375 -4.015625l1.171875 0l-2.625 7.015625q-0.421875 1.140625 -0.65625 1.578125q-0.3125 0.578125 -0.71875 0.84375q-0.40625 0.28125 -0.96875 0.28125q-0.328125 0 -0.75 -0.15625z" + fill-rule="nonzero" + id="path318" /> + <path + fill="#000000" + d="m711.206 229.9118l0 -9.546875l6.4375 0l0 1.125l-5.171875 0l0 2.96875l4.46875 0l0 1.125l-4.46875 0l0 4.328125l-1.265625 0zm12.438232 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.5218506 1.40625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm9.6953125 1.015625l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1405029 3.703125l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm10.865601 2.5625q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm5.5531006 2.421875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1405029 1.046875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm15.6310425 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9749756 3.46875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm9.188416 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm11.037476 3.265625q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875z" + fill-rule="nonzero" + id="path320" /> + <path + fill="#000000" + d="m706.683 265.10867l0 -9.54689l1.296875 0l5.015625 7.5000153l0 -7.5000153l1.203125 0l0 9.54689l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm14.218933 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.7406006 4.125l2.53125 -3.59375l-2.34375 -3.3125l1.46875 0l1.0625 1.609375q0.296875 0.46875 0.484375 0.78125q0.28125 -0.4375 0.515625 -0.765625l1.171875 -1.625l1.40625 0l-2.390625 3.25l2.5625 3.65625l-1.4375 0l-1.421875 -2.140625l-0.375 -0.59375l-1.8125 2.734375l-1.421875 0zm10.0078125 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.70314026l0 2.4218903l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm4.843445 1.046875l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm6.9749756 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.4218903l1.171875 0l0 9.54689l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.8967285 -0.578125q0 -1.6875 0.34375 -2.71875q0.359375 -1.03125 1.046875 -1.59375q0.6875 -0.56251526 1.71875 -0.56251526q0.78125 0 1.359375 0.3125q0.578125 0.29689026 0.953125 0.89064026q0.375 0.578125 0.59375 1.421875q0.21875 0.828125 0.21875 2.25q0 1.671875 -0.359375 2.703125q-0.34375 1.03125 -1.03125 1.59375q-0.671875 0.5625 -1.734375 0.5625q-1.375 0 -2.15625 -0.984375q-0.953125 -1.1875 -0.953125 -3.875zm1.203125 0q0 2.34375 0.546875 3.125q0.5625 0.78125 1.359375 0.78125q0.8125 0 1.359375 -0.78125q0.5625 -0.78125 0.5625 -3.125q0 -2.359375 -0.5625 -3.125q-0.546875 -0.78125 -1.359375 -0.78125q-0.8125 0 -1.296875 0.6875q-0.609375 0.875 -0.609375 3.21875zm10.2404785 7.359375l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm8.912476 2.375l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.70314026l0 2.4218903l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1248169 1.046875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0z" + fill-rule="nonzero" + id="path322" /> + <path + fill="#000000" + d="m706.683 300.3055l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm14.218933 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.7406006 4.125l2.53125 -3.59375l-2.34375 -3.3125l1.46875 0l1.0625 1.609375q0.296875 0.46875 0.484375 0.78125q0.28125 -0.4375 0.515625 -0.765625l1.171875 -1.625l1.40625 0l-2.390625 3.25l2.5625 3.65625l-1.4375 0l-1.421875 -2.140625l-0.375 -0.59375l-1.8125 2.734375l-1.421875 0zm10.0078125 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm4.843445 1.046875l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm6.9749756 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm14.3186035 4.125l-1.171875 0l0 -7.46875q-0.421875 0.40625 -1.109375 0.8125q-0.6875 0.40625 -1.234375 0.609375l0 -1.140625q0.984375 -0.453125 1.71875 -1.109375q0.734375 -0.671875 1.03125 -1.28125l0.765625 0l0 9.578125zm7.0217285 2.65625l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm8.912476 2.375l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1248169 1.046875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0z" + fill-rule="nonzero" + id="path324" /> + <path + fill="#000000" + d="m706.683 335.50235l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm14.218933 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.7406006 4.125l2.53125 -3.59375l-2.34375 -3.3125l1.46875 0l1.0625 1.609375q0.296875 0.46875 0.484375 0.78125q0.28125 -0.4375 0.515625 -0.765625l1.171875 -1.625l1.40625 0l-2.390625 3.25l2.5625 3.65625l-1.4375 0l-1.421875 -2.140625l-0.375 -0.59375l-1.8125 2.734375l-1.421875 0zm10.0078125 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm4.843445 1.046875l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm6.9749756 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm16.052979 3.0l0 1.125l-6.296875 0q-0.015625 -0.421875 0.140625 -0.8125q0.234375 -0.640625 0.765625 -1.265625q0.53125 -0.625 1.53125 -1.453125q1.5625 -1.265625 2.109375 -2.015625q0.546875 -0.75 0.546875 -1.40625q0 -0.703125 -0.5 -1.171875q-0.5 -0.484375 -1.296875 -0.484375q-0.859375 0 -1.375 0.515625q-0.5 0.5 -0.5 1.390625l-1.203125 -0.109375q0.125 -1.359375 0.921875 -2.0625q0.8125 -0.703125 2.171875 -0.703125q1.375 0 2.171875 0.765625q0.8125 0.75 0.8125 1.875q0 0.578125 -0.234375 1.140625q-0.234375 0.546875 -0.78125 1.15625q-0.546875 0.609375 -1.8125 1.671875q-1.046875 0.890625 -1.359375 1.21875q-0.296875 0.3125 -0.484375 0.625l4.671875 0zm5.2873535 3.78125l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm8.912476 2.375l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1248169 1.046875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0z" + fill-rule="nonzero" + id="path326" /> + <path + fill="#000000" + d="m705.57666 370.69922l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm14.218872 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.7406006 4.125l2.53125 -3.59375l-2.34375 -3.3125l1.46875 0l1.0625 1.609375q0.296875 0.46875 0.484375 0.78125q0.28125 -0.4375 0.515625 -0.765625l1.171875 -1.625l1.40625 0l-2.390625 3.25l2.5625 3.65625l-1.4375 0l-1.421875 -2.140625l-0.375 -0.59375l-1.8125 2.734375l-1.421875 0zm10.0078125 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm4.843506 1.046875l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm6.9749756 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm10.3654785 4.125l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm13.1875 2.65625l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm8.912476 2.375l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1248779 1.046875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0z" + fill-rule="nonzero" + id="path328" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m636.06696 70.291336l230.33069 0l0 27.46457l-230.33069 0z" + fill-rule="evenodd" + id="path330" /> + <path + fill="#000000" + d="m660.59735 92.09134l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm7.0165405 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm5.874817 -1.171875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.4437256 6.78125l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm8.490601 -2.65625l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm6.9749756 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.7873535 0.671875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm7.7249756 3.453125l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.3343506 -4.6875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm-1.484375 10.875l0.21875 -1.0q0.359375 0.09375 0.546875 0.09375q0.359375 0 0.53125 -0.25q0.1875 -0.234375 0.1875 -1.1875l0 -7.25l1.171875 0l0 7.28125q0 1.28125 -0.328125 1.78125q-0.4375 0.65625 -1.40625 0.65625q-0.484375 0 -0.921875 -0.125zm9.179871 -4.90625l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm11.037476 1.59375l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm4.7109375 1.484375l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm4.843445 1.046875l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836853 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5218506 4.125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.664917 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6312256 3.453125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.4071045 2.65625l-0.125 -1.09375q0.375 0.109375 0.65625 0.109375q0.390625 0 0.625 -0.140625q0.234375 -0.125 0.390625 -0.359375q0.109375 -0.171875 0.359375 -0.875q0.03125 -0.09375 0.109375 -0.28125l-2.625 -6.921875l1.265625 0l1.4375 4.0q0.28125 0.765625 0.5 1.59375q0.203125 -0.796875 0.46875 -1.578125l1.484375 -4.015625l1.171875 0l-2.625 7.015625q-0.421875 1.140625 -0.65625 1.578125q-0.3125 0.578125 -0.71875 0.84375q-0.40625 0.28125 -0.96875 0.28125q-0.328125 0 -0.75 -0.15625zm10.398315 -2.65625l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.4923096 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9437256 6.125l-0.125 -1.09375q0.375 0.109375 0.65625 0.109375q0.390625 0 0.625 -0.140625q0.234375 -0.125 0.390625 -0.359375q0.109375 -0.171875 0.359375 -0.875q0.03125 -0.09375 0.109375 -0.28125l-2.625 -6.921875l1.265625 0l1.4375 4.0q0.28125 0.765625 0.5 1.59375q0.203125 -0.796875 0.46875 -1.578125l1.484375 -4.015625l1.171875 0l-2.625 7.015625q-0.421875 1.140625 -0.65625 1.578125q-0.3125 0.578125 -0.71875 0.84375q-0.40625 0.28125 -0.96875 0.28125q-0.328125 0 -0.75 -0.15625zm6.2734375 -6.109375q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.178101 3.453125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm5.4437256 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875z" + fill-rule="nonzero" + id="path332" + style="fill:#008033" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m815.0184 243.91602c7.184082 0 13.007874 2.830719 13.007874 6.3226013l0 53.98471c0 3.4918823 5.8238525 6.3226013 13.007874 6.3226013l0 0c-7.184021 0 -13.007874 2.830719 -13.007874 6.3226013l0 53.98471l0 0c0 3.4918823 -5.8237915 6.3226013 -13.007874 6.3226013z" + fill-rule="evenodd" + id="path334" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m815.0184 243.91602c7.184082 0 13.007874 2.830719 13.007874 6.3226013l0 53.98471c0 3.4918823 5.8238525 6.3226013 13.007874 6.3226013l0 0c-7.184021 0 -13.007874 2.830719 -13.007874 6.3226013l0 53.98471l0 0c0 3.4918823 -5.8237915 6.3226013 -13.007874 6.3226013" + fill-rule="evenodd" + id="path336" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m815.0184 243.91602c7.184082 0 13.007874 2.830719 13.007874 6.3226013l0 53.98471c0 3.4918823 5.8238525 6.3226013 13.007874 6.3226013l0 0c-7.184021 0 -13.007874 2.830719 -13.007874 6.3226013l0 53.98471l0 0c0 3.4918823 -5.8237915 6.3226013 -13.007874 6.3226013" + fill-rule="evenodd" + id="path338" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m821.979 278.50656l99.40155 0l0 27.46457l-99.40155 0z" + fill-rule="evenodd" + id="path340" /> + <path + fill="#000000" + d="m831.7759 299.02655l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm7.642578 0l-0.984375 0l0 -8.59375l1.0625 0l0 3.0625q0.671875 -0.828125 1.703125 -0.828125q0.578125 0 1.078125 0.234375q0.515625 0.21875 0.84375 0.640625q0.34375 0.421875 0.53125 1.015625q0.1875 0.59375 0.1875 1.265625q0 1.59375 -0.796875 2.46875q-0.796875 0.875 -1.890625 0.875q-1.109375 0 -1.734375 -0.921875l0 0.78125zm-0.015625 -3.15625q0 1.109375 0.3125 1.609375q0.5 0.8125 1.34375 0.8125q0.6875 0 1.1875 -0.59375q0.515625 -0.59375 0.515625 -1.796875q0 -1.21875 -0.484375 -1.796875q-0.484375 -0.578125 -1.171875 -0.578125q-0.6875 0 -1.203125 0.609375q-0.5 0.59375 -0.5 1.734375zm4.736328 5.546875l0 -0.765625l7.0 0l0 0.765625l-7.0 0zm11.908203 -4.390625l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.908203 3.703125l0 -0.78125q-0.59375 0.921875 -1.734375 0.921875q-0.75 0 -1.375 -0.40625q-0.625 -0.421875 -0.96875 -1.15625q-0.34375 -0.734375 -0.34375 -1.6875q0 -0.921875 0.3125 -1.6875q0.3125 -0.765625 0.9375 -1.15625q0.625 -0.40625 1.390625 -0.40625q0.5625 0 1.0 0.234375q0.4375 0.234375 0.71875 0.609375l0 -3.078125l1.046875 0l0 8.59375l-0.984375 0zm-3.328125 -3.109375q0 1.203125 0.5 1.796875q0.5 0.578125 1.1875 0.578125q0.6875 0 1.171875 -0.5625q0.484375 -0.5625 0.484375 -1.71875q0 -1.28125 -0.5 -1.875q-0.484375 -0.59375 -1.203125 -0.59375q-0.703125 0 -1.171875 0.578125q-0.46875 0.5625 -0.46875 1.796875zm5.767578 3.625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm10.251953 1.21875l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.455078 1.84375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5z" + fill-rule="nonzero" + id="path342" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m359.4252 100.022575l0 247.3753" + fill-rule="nonzero" + id="path344" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m520.34906 100.022575l0 247.3753" + fill-rule="nonzero" + id="path346" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m358.9265 100.52126l161.92126 0" + fill-rule="nonzero" + id="path348" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m358.9265 135.71811l161.92126 0" + fill-rule="nonzero" + id="path350" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m358.9265 170.91496l161.92126 0" + fill-rule="nonzero" + id="path352" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m358.9265 206.11182l161.92126 0" + fill-rule="nonzero" + id="path354" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m358.9265 241.30865l161.92126 0" + fill-rule="nonzero" + id="path356" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m358.9265 276.50552l161.92126 0" + fill-rule="nonzero" + id="path358" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m358.9265 311.70236l161.92126 0" + fill-rule="nonzero" + id="path360" /> + <path + stroke="#1155cc" + stroke-width="1.0" + stroke-linecap="butt" + d="m358.9265 346.8992l161.92126 0" + fill-rule="nonzero" + id="path362" /> + <path + fill="#000000" + d="m379.84702 119.25876l1.203125 -0.109375q0.078125 0.71875 0.390625 1.1875q0.3125 0.453125 0.953125 0.734375q0.65625 0.28125 1.46875 0.28125q0.71875 0 1.265625 -0.21875q0.5625 -0.21875 0.828125 -0.578125q0.265625 -0.375 0.265625 -0.828125q0 -0.453125 -0.265625 -0.78125q-0.25 -0.328125 -0.84375 -0.5625q-0.390625 -0.15625 -1.703125 -0.46875q-1.3125 -0.3125 -1.84375 -0.59375q-0.671875 -0.359375 -1.015625 -0.890625q-0.328125 -0.53125 -0.328125 -1.1875q0 -0.71875 0.40625 -1.34375q0.40625 -0.625 1.1875 -0.953125q0.796875 -0.328125 1.765625 -0.328125q1.046875 0 1.859375 0.34375q0.8125 0.34375 1.25 1.015625q0.4375 0.65625 0.46875 1.484375l-1.203125 0.09375q-0.109375 -0.90625 -0.671875 -1.359375q-0.5625 -0.46875 -1.65625 -0.46875q-1.140625 0 -1.671875 0.421875q-0.515625 0.421875 -0.515625 1.015625q0 0.515625 0.359375 0.84375q0.375 0.328125 1.90625 0.6875q1.546875 0.34375 2.109375 0.59375q0.84375 0.390625 1.234375 0.984375q0.390625 0.578125 0.390625 1.359375q0 0.75 -0.4375 1.4375q-0.421875 0.671875 -1.25 1.046875q-0.8125 0.359375 -1.828125 0.359375q-1.296875 0 -2.171875 -0.375q-0.875 -0.375 -1.375 -1.125q-0.5 -0.765625 -0.53125 -1.71875zm8.7335205 -0.390625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.178101 3.453125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.8656006 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.9696045 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.8828125 0.3125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm10.3654785 4.125l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm9.047028 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.1937256 -0.578125q0 -1.6875 0.34375 -2.71875q0.359375 -1.03125 1.046875 -1.59375q0.6875 -0.5625 1.71875 -0.5625q0.78125 0 1.359375 0.3125q0.578125 0.296875 0.953125 0.890625q0.375 0.578125 0.59375 1.421875q0.21875 0.828125 0.21875 2.25q0 1.671875 -0.359375 2.703125q-0.34375 1.03125 -1.03125 1.59375q-0.671875 0.5625 -1.734375 0.5625q-1.375 0 -2.15625 -0.984375q-0.953125 -1.1875 -0.953125 -3.875zm1.203125 0q0 2.34375 0.546875 3.125q0.5625 0.78125 1.359375 0.78125q0.8125 0 1.359375 -0.78125q0.5625 -0.78125 0.5625 -3.125q0 -2.359375 -0.5625 -3.125q-0.546875 -0.78125 -1.359375 -0.78125q-0.8125 0 -1.296875 0.6875q-0.609375 0.875 -0.609375 3.21875zm9.802948 1.25q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.9281006 3.453125l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.4620972 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm2.953003 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm11.8671875 -0.15625l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875z" + fill-rule="nonzero" + id="path364" /> + <path + fill="#000000" + d="m379.84702 154.45561l1.203125 -0.109375q0.078125 0.71875 0.390625 1.1875q0.3125 0.453125 0.953125 0.734375q0.65625 0.28125 1.46875 0.28125q0.71875 0 1.265625 -0.21875q0.5625 -0.21875 0.828125 -0.578125q0.265625 -0.375 0.265625 -0.828125q0 -0.453125 -0.265625 -0.78125q-0.25 -0.328125 -0.84375 -0.5625q-0.390625 -0.15625 -1.703125 -0.46875q-1.3125 -0.3125 -1.84375 -0.59375q-0.671875 -0.359375 -1.015625 -0.890625q-0.328125 -0.53125 -0.328125 -1.1875q0 -0.71875 0.40625 -1.34375q0.40625 -0.625 1.1875 -0.953125q0.796875 -0.328125 1.765625 -0.328125q1.046875 0 1.859375 0.34375q0.8125 0.34375 1.25 1.015625q0.4375 0.65625 0.46875 1.484375l-1.203125 0.09375q-0.109375 -0.90625 -0.671875 -1.359375q-0.5625 -0.46875 -1.65625 -0.46875q-1.140625 0 -1.671875 0.421875q-0.515625 0.421875 -0.515625 1.015625q0 0.515625 0.359375 0.84375q0.375 0.328125 1.90625 0.6875q1.546875 0.34375 2.109375 0.59375q0.84375 0.390625 1.234375 0.984375q0.390625 0.578125 0.390625 1.359375q0 0.75 -0.4375 1.4375q-0.421875 0.671875 -1.25 1.046875q-0.8125 0.359375 -1.828125 0.359375q-1.296875 0 -2.171875 -0.375q-0.875 -0.375 -1.375 -1.125q-0.5 -0.765625 -0.53125 -1.71875zm8.7335205 -0.390625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.178101 3.453125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.8656006 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.9696045 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.8828125 0.3125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm10.3654785 4.125l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm9.047028 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm10.615601 4.125l-1.171875 0l0 -7.46875q-0.421875 0.40625 -1.109375 0.8125q-0.6875 0.40625 -1.234375 0.609375l0 -1.140625q0.984375 -0.453125 1.71875 -1.109375q0.734375 -0.671875 1.03125 -1.28125l0.765625 0l0 9.578125zm6.584198 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.9281006 3.453125l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.4620972 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm2.953003 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm11.8671875 -0.15625l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875z" + fill-rule="nonzero" + id="path366" /> + <path + fill="#000000" + d="m376.8892 189.65247l1.203125 -0.109375q0.078125 0.71875 0.390625 1.1875q0.3125 0.453125 0.953125 0.734375q0.65625 0.28125 1.46875 0.28125q0.71875 0 1.265625 -0.21875q0.5625 -0.21875 0.828125 -0.578125q0.265625 -0.375 0.265625 -0.828125q0 -0.453125 -0.265625 -0.78125q-0.25 -0.328125 -0.84375 -0.5625q-0.390625 -0.15625 -1.703125 -0.46875q-1.3125 -0.3125 -1.84375 -0.59375q-0.671875 -0.359375 -1.015625 -0.890625q-0.328125 -0.53125 -0.328125 -1.1875q0 -0.71875 0.40625 -1.34375q0.40625 -0.625 1.1875 -0.953125q0.796875 -0.328125 1.765625 -0.328125q1.046875 0 1.859375 0.34375q0.8125 0.34375 1.25 1.015625q0.4375 0.65625 0.46875 1.484375l-1.203125 0.09375q-0.109375 -0.90625 -0.671875 -1.359375q-0.5625 -0.46875 -1.65625 -0.46875q-1.140625 0 -1.671875 0.421875q-0.515625 0.421875 -0.515625 1.015625q0 0.515625 0.359375 0.84375q0.375 0.328125 1.90625 0.6875q1.546875 0.34375 2.109375 0.59375q0.84375 0.390625 1.234375 0.984375q0.390625 0.578125 0.390625 1.359375q0 0.75 -0.4375 1.4375q-0.421875 0.671875 -1.25 1.046875q-0.8125 0.359375 -1.828125 0.359375q-1.296875 0 -2.171875 -0.375q-0.875 -0.375 -1.375 -1.125q-0.5 -0.765625 -0.53125 -1.71875zm8.7335205 -0.390625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.178101 3.453125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.8656006 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.9696045 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.8828125 0.3125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm10.3654785 4.125l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm9.047028 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm10.365448 4.125l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm12.7500305 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.9281006 3.453125l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.4620972 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm2.9529724 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm11.8671875 -0.15625l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875z" + fill-rule="nonzero" + id="path368" /> + <path + fill="#000000" + d="m372.88116 227.9118l0 -9.546875l6.90625 0l0 1.125l-5.640625 0l0 2.921875l5.28125 0l0 1.125l-5.28125 0l0 3.25l5.859375 0l0 1.125l-7.125 0zm8.717865 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm11.818726 2.65625l0 -3.390625q-0.265625 0.390625 -0.765625 0.640625q-0.484375 0.25 -1.046875 0.25q-1.21875 0 -2.109375 -0.984375q-0.890625 -0.984375 -0.890625 -2.6875q0 -1.046875 0.359375 -1.875q0.359375 -0.828125 1.046875 -1.25q0.6875 -0.421875 1.515625 -0.421875q1.28125 0 2.015625 1.078125l0 -0.921875l1.046875 0l0 9.5625l-1.171875 0zm-3.609375 -6.125q0 1.328125 0.5625 2.0q0.5625 0.65625 1.34375 0.65625q0.75 0 1.28125 -0.625q0.546875 -0.640625 0.546875 -1.9375q0 -1.375 -0.578125 -2.0625q-0.5625 -0.703125 -1.328125 -0.703125q-0.765625 0 -1.296875 0.65625q-0.53125 0.640625 -0.53125 2.015625zm11.146851 3.46875l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm11.053101 4.125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm10.3654785 4.125l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm9.047028 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.896698 -0.578125q0 -1.6875 0.34375 -2.71875q0.359375 -1.03125 1.046875 -1.59375q0.6875 -0.5625 1.71875 -0.5625q0.78125 0 1.359375 0.3125q0.578125 0.296875 0.953125 0.890625q0.375 0.578125 0.59375 1.421875q0.21875 0.828125 0.21875 2.25q0 1.671875 -0.359375 2.703125q-0.34375 1.03125 -1.03125 1.59375q-0.671875 0.5625 -1.734375 0.5625q-1.375 0 -2.15625 -0.984375q-0.953125 -1.1875 -0.953125 -3.875zm1.203125 0q0 2.34375 0.546875 3.125q0.5625 0.78125 1.359375 0.78125q0.8125 0 1.359375 -0.78125q0.5625 -0.78125 0.5625 -3.125q0 -2.359375 -0.5625 -3.125q-0.546875 -0.78125 -1.359375 -0.78125q-0.8125 0 -1.296875 0.6875q-0.609375 0.875 -0.609375 3.21875zm9.8029785 1.25q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.9281006 3.453125l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.4620972 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm2.9529724 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm11.8671875 -0.15625l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875z" + fill-rule="nonzero" + id="path370" /> + <path + fill="#000000" + d="m372.88116 263.10867l0 -9.54689l6.90625 0l0 1.125l-5.640625 0l0 2.9218903l5.28125 0l0 1.125l-5.28125 0l0 3.25l5.859375 0l0 1.125l-7.125 0zm8.717865 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm11.818726 2.65625l0 -3.390625q-0.265625 0.390625 -0.765625 0.640625q-0.484375 0.25 -1.046875 0.25q-1.21875 0 -2.109375 -0.984375q-0.890625 -0.984375 -0.890625 -2.6875q0 -1.046875 0.359375 -1.875q0.359375 -0.828125 1.046875 -1.25q0.6875 -0.421875 1.515625 -0.421875q1.28125 0 2.015625 1.078125l0 -0.921875l1.046875 0l0 9.5625l-1.171875 0zm-3.609375 -6.125q0 1.328125 0.5625 2.0q0.5625 0.65625 1.34375 0.65625q0.75 0 1.28125 -0.625q0.546875 -0.640625 0.546875 -1.9375q0 -1.375 -0.578125 -2.0625q-0.5625 -0.703125 -1.328125 -0.703125q-0.765625 0 -1.296875 0.65625q-0.53125 0.640625 -0.53125 2.015625zm11.146851 3.46875l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm11.053101 4.125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm10.3654785 4.125l0 -9.54689l1.296875 0l5.015625 7.5000153l0 -7.5000153l1.203125 0l0 9.54689l-1.296875 0l-5.015625 -7.5000153l0 7.5000153l-1.203125 0zm9.047028 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.4218903l1.171875 0l0 9.54689l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm14.318573 4.125l-1.171875 0l0 -7.4687653q-0.421875 0.40626526 -1.109375 0.81251526q-0.6875 0.40625 -1.234375 0.609375l0 -1.1406403q0.984375 -0.453125 1.71875 -1.109375q0.734375 -0.671875 1.03125 -1.28125l0.765625 0l0 9.57814zm6.5842285 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.9281006 3.453125l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.73439026q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.64064026l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.4620972 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.73439026q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.64064026l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm2.9529724 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm11.8671875 -0.15625l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.7187653l1.171875 -0.703125l0 2.4218903l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875z" + fill-rule="nonzero" + id="path372" /> + <path + fill="#000000" + d="m372.88116 298.3055l0 -9.546875l6.90625 0l0 1.125l-5.640625 0l0 2.921875l5.28125 0l0 1.125l-5.28125 0l0 3.25l5.859375 0l0 1.125l-7.125 0zm8.717865 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm11.818726 2.65625l0 -3.390625q-0.265625 0.390625 -0.765625 0.640625q-0.484375 0.25 -1.046875 0.25q-1.21875 0 -2.109375 -0.984375q-0.890625 -0.984375 -0.890625 -2.6875q0 -1.046875 0.359375 -1.875q0.359375 -0.828125 1.046875 -1.25q0.6875 -0.421875 1.515625 -0.421875q1.28125 0 2.015625 1.078125l0 -0.921875l1.046875 0l0 9.5625l-1.171875 0zm-3.609375 -6.125q0 1.328125 0.5625 2.0q0.5625 0.65625 1.34375 0.65625q0.75 0 1.28125 -0.625q0.546875 -0.640625 0.546875 -1.9375q0 -1.375 -0.578125 -2.0625q-0.5625 -0.703125 -1.328125 -0.703125q-0.765625 0 -1.296875 0.65625q-0.53125 0.640625 -0.53125 2.015625zm11.146851 3.46875l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm11.053101 4.125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm10.3654785 4.125l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm9.047028 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm16.052948 3.0l0 1.125l-6.296875 0q-0.015625 -0.421875 0.140625 -0.8125q0.234375 -0.640625 0.765625 -1.265625q0.53125 -0.625 1.53125 -1.453125q1.5625 -1.265625 2.109375 -2.015625q0.546875 -0.75 0.546875 -1.40625q0 -0.703125 -0.5 -1.171875q-0.5 -0.484375 -1.296875 -0.484375q-0.859375 0 -1.375 0.515625q-0.5 0.5 -0.5 1.390625l-1.203125 -0.109375q0.125 -1.359375 0.921875 -2.0625q0.8125 -0.703125 2.171875 -0.703125q1.375 0 2.171875 0.765625q0.8125 0.75 0.8125 1.875q0 0.578125 -0.234375 1.140625q-0.234375 0.546875 -0.78125 1.15625q-0.546875 0.609375 -1.8125 1.671875q-1.046875 0.890625 -1.359375 1.21875q-0.296875 0.3125 -0.484375 0.625l4.671875 0zm4.8498535 -2.328125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.9281006 3.453125l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.4620972 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm2.9529724 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm11.8671875 -0.15625l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875z" + fill-rule="nonzero" + id="path374" /> + <path + fill="#000000" + d="m371.7748 333.50235l0 -9.546875l6.90625 0l0 1.125l-5.640625 0l0 2.921875l5.28125 0l0 1.125l-5.28125 0l0 3.25l5.859375 0l0 1.125l-7.125 0zm8.7178955 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm11.818726 2.65625l0 -3.390625q-0.265625 0.390625 -0.765625 0.640625q-0.484375 0.25 -1.046875 0.25q-1.21875 0 -2.109375 -0.984375q-0.890625 -0.984375 -0.890625 -2.6875q0 -1.046875 0.359375 -1.875q0.359375 -0.828125 1.046875 -1.25q0.6875 -0.421875 1.515625 -0.421875q1.28125 0 2.015625 1.078125l0 -0.921875l1.046875 0l0 9.5625l-1.171875 0zm-3.609375 -6.125q0 1.328125 0.5625 2.0q0.5625 0.65625 1.34375 0.65625q0.75 0 1.28125 -0.625q0.546875 -0.640625 0.546875 -1.9375q0 -1.375 -0.578125 -2.0625q-0.5625 -0.703125 -1.328125 -0.703125q-0.765625 0 -1.296875 0.65625q-0.53125 0.640625 -0.53125 2.015625zm11.146851 3.46875l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm11.053101 4.125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm10.365448 4.125l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm9.047028 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.131226 3.453125l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm10.3654785 4.125l0 -9.546875l1.296875 0l5.015625 7.5l0 -7.5l1.203125 0l0 9.546875l-1.296875 0l-5.015625 -7.5l0 7.5l-1.203125 0zm12.75 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.9281006 3.453125l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.4620972 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm2.953003 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm11.8671875 -0.15625l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875z" + fill-rule="nonzero" + id="path376" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m326.77692 65.05774l280.09448 0l0 27.46457l-280.09448 0z" + fill-rule="evenodd" + id="path378" /> + <path + fill="#000000" + d="m345.39603 83.51399l1.265625 0.3125q-0.390625 1.5625 -1.421875 2.375q-1.03125 0.8125 -2.53125 0.8125q-1.53125 0 -2.5 -0.625q-0.96875 -0.625 -1.484375 -1.8125q-0.5 -1.1875 -0.5 -2.5625q0 -1.484375 0.5625 -2.59375q0.578125 -1.109375 1.625 -1.6875q1.0625 -0.578125 2.328125 -0.578125q1.421875 0 2.390625 0.734375q0.984375 0.71875 1.375 2.046875l-1.25 0.296875q-0.328125 -1.046875 -0.96875 -1.515625q-0.625 -0.484375 -1.578125 -0.484375q-1.09375 0 -1.84375 0.53125q-0.734375 0.53125 -1.03125 1.421875q-0.296875 0.875 -0.296875 1.828125q0 1.21875 0.34375 2.125q0.359375 0.90625 1.109375 1.359375q0.75 0.4375 1.625 0.4375q1.0625 0 1.796875 -0.609375q0.734375 -0.609375 0.984375 -1.8125zm2.6876526 -4.84375l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.92984 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.969635 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.6796875 2.53125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.8656006 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.49234 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9749756 3.46875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.156982 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836792 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5218506 4.125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.6649475 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6312256 3.453125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.4071045 2.65625l-0.125 -1.09375q0.375 0.109375 0.65625 0.109375q0.390625 0 0.625 -0.140625q0.234375 -0.125 0.390625 -0.359375q0.109375 -0.171875 0.359375 -0.875q0.03125 -0.09375 0.109375 -0.28125l-2.625 -6.921875l1.265625 0l1.4375 4.0q0.28125 0.765625 0.5 1.59375q0.203125 -0.796875 0.46875 -1.578125l1.484375 -4.015625l1.171875 0l-2.625 7.015625q-0.421875 1.140625 -0.65625 1.578125q-0.3125 0.578125 -0.71875 0.84375q-0.40625 0.28125 -0.96875 0.28125q-0.328125 0 -0.75 -0.15625zm10.398315 -2.65625l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.49234 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9437256 6.125l-0.125 -1.09375q0.375 0.109375 0.65625 0.109375q0.390625 0 0.625 -0.140625q0.234375 -0.125 0.390625 -0.359375q0.109375 -0.171875 0.359375 -0.875q0.03125 -0.09375 0.109375 -0.28125l-2.625 -6.921875l1.265625 0l1.4375 4.0q0.28125 0.765625 0.5 1.59375q0.203125 -0.796875 0.46875 -1.578125l1.484375 -4.015625l1.171875 0l-2.625 7.015625q-0.421875 1.140625 -0.65625 1.578125q-0.3125 0.578125 -0.71875 0.84375q-0.40625 0.28125 -0.96875 0.28125q-0.328125 0 -0.75 -0.15625zm6.2734375 -6.109375q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.178101 3.453125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm5.4437256 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm5.1247253 1.046875l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm2.9842224 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6312256 3.453125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.156982 2.65625l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm11.084351 1.203125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.521881 4.125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm11.896851 0l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm6.6468506 -4.734375l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.9454346 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm7.1937256 0.578125l1.140625 0.15625q0.078125 0.53125 0.40625 0.78125q0.4375 0.3125 1.1875 0.3125q0.8125 0 1.25 -0.328125q0.453125 -0.3125 0.609375 -0.90625q0.09375 -0.359375 0.078125 -1.5q-0.765625 0.90625 -1.90625 0.90625q-1.4375 0 -2.21875 -1.03125q-0.78125 -1.03125 -0.78125 -2.46875q0 -0.984375 0.359375 -1.8125q0.359375 -0.84375 1.03125 -1.296875q0.6875 -0.453125 1.609375 -0.453125q1.21875 0 2.015625 0.984375l0 -0.828125l1.078125 0l0 5.96875q0 1.609375 -0.328125 2.28125q-0.328125 0.6875 -1.046875 1.078125q-0.703125 0.390625 -1.75 0.390625q-1.234375 0 -2.0 -0.5625q-0.75 -0.5625 -0.734375 -1.671875zm0.984375 -4.15625q0 1.359375 0.53125 1.984375q0.546875 0.625 1.359375 0.625q0.796875 0 1.34375 -0.625q0.546875 -0.625 0.546875 -1.953125q0 -1.265625 -0.5625 -1.90625q-0.5625 -0.640625 -1.359375 -0.640625q-0.765625 0 -1.3125 0.640625q-0.546875 0.625 -0.546875 1.875zm9.8811035 1.515625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm9.6953125 1.015625l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1248779 1.046875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm9.1883545 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm11.037476 3.265625q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9906006 3.46875l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.633667 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625z" + fill-rule="nonzero" + id="path380" + style="fill:#88aa00" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m516.2336 178.6483l115.4646 0l0 27.464554l-115.4646 0z" + fill-rule="evenodd" + id="path382" /> + <path + fill="#000000" + d="m532.2961 196.15266l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.4003906 -4.359375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6503906 0l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm8.074219 -2.28125l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm6.015625 2.28125l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm2.5644531 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm6.7597656 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.6894531 3.125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm8.314453 0l-0.984375 0l0 -8.59375l1.0625 0l0 3.0625q0.671875 -0.828125 1.703125 -0.828125q0.578125 0 1.078125 0.234375q0.515625 0.21875 0.84375 0.640625q0.34375 0.421875 0.53125 1.015625q0.1875 0.59375 0.1875 1.265625q0 1.59375 -0.796875 2.46875q-0.796875 0.875 -1.890625 0.875q-1.109375 0 -1.734375 -0.921875l0 0.78125zm-0.015625 -3.15625q0 1.109375 0.3125 1.609375q0.5 0.8125 1.34375 0.8125q0.6875 0 1.1875 -0.59375q0.515625 -0.59375 0.515625 -1.796875q0 -1.21875 -0.484375 -1.796875q-0.484375 -0.578125 -1.171875 -0.578125q-0.6875 0 -1.203125 0.609375q-0.5 0.59375 -0.5 1.734375zm9.798828 3.15625l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm2.8457031 0l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm5.9960938 -1.859375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm8.71875 0.921875l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm5.0996094 0.171875q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.6894531 3.125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm6.3085938 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125z" + fill-rule="nonzero" + id="path384" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m589.60895 206.11285l-61.259888 0" + fill-rule="evenodd" + id="path386" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m589.60895 206.11285l-55.259888 0" + fill-rule="evenodd" + id="path388" + style="fill:#00ffcc" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m534.34906 204.46114l-4.538086 1.6517181l4.538086 1.6517334z" + fill-rule="evenodd" + id="path390" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m520.7349 322.6483l115.46454 0l0 27.46457l-115.46454 0z" + fill-rule="evenodd" + id="path392" /> + <path + fill="#000000" + d="m536.7974 340.15268l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.4003906 -4.359375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6503906 0l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm8.074219 -2.28125l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm6.015625 2.28125l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm2.5644531 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm6.7597656 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.6894531 3.125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm8.314453 0l-0.984375 0l0 -8.59375l1.0625 0l0 3.0625q0.671875 -0.828125 1.703125 -0.828125q0.578125 0 1.078125 0.234375q0.515625 0.21875 0.84375 0.640625q0.34375 0.421875 0.53125 1.015625q0.1875 0.59375 0.1875 1.265625q0 1.59375 -0.796875 2.46875q-0.796875 0.875 -1.890625 0.875q-1.109375 0 -1.734375 -0.921875l0 0.78125zm-0.015625 -3.15625q0 1.109375 0.3125 1.609375q0.5 0.8125 1.34375 0.8125q0.6875 0 1.1875 -0.59375q0.515625 -0.59375 0.515625 -1.796875q0 -1.21875 -0.484375 -1.796875q-0.484375 -0.578125 -1.171875 -0.578125q-0.6875 0 -1.203125 0.609375q-0.5 0.59375 -0.5 1.734375zm9.798828 3.15625l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm2.8457031 0l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm10.667969 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.876953 3.703125l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.705078 0l0 -0.78125q-0.59375 0.921875 -1.734375 0.921875q-0.75 0 -1.375 -0.40625q-0.625 -0.421875 -0.96875 -1.15625q-0.34375 -0.734375 -0.34375 -1.6875q0 -0.921875 0.3125 -1.6875q0.3125 -0.765625 0.9375 -1.15625q0.625 -0.40625 1.390625 -0.40625q0.5625 0 1.0 0.234375q0.4375 0.234375 0.71875 0.609375l0 -3.078125l1.046875 0l0 8.59375l-0.984375 0zm-3.328125 -3.109375q0 1.203125 0.5 1.796875q0.5 0.578125 1.1875 0.578125q0.6875 0 1.171875 -0.5625q0.484375 -0.5625 0.484375 -1.71875q0 -1.28125 -0.5 -1.875q-0.484375 -0.59375 -1.203125 -0.59375q-0.703125 0 -1.171875 0.578125q-0.46875 0.5625 -0.46875 1.796875z" + fill-rule="nonzero" + id="path394" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m586.3438 346.90027l-61.259827 0" + fill-rule="evenodd" + id="path396" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m586.3438 346.90027l-55.259827 0" + fill-rule="evenodd" + id="path398" + style="fill:#00ffcc" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m531.084 345.24854l-4.538086 1.6517334l4.538086 1.6517334z" + fill-rule="evenodd" + id="path400" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m271.45407 204.69554l85.51181 -102.645676" + fill-rule="evenodd" + id="path402" /> + <path + stroke="#a61c00" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="1.0,3.0" + d="m271.45407 204.69554l81.67139 -98.03577" + fill-rule="evenodd" + id="path404" /> + <path + fill="#a61c00" + stroke="#a61c00" + stroke-width="1.0" + stroke-linecap="butt" + d="m354.39453 107.716995l1.6356201 -4.5439224l-4.1737366 2.4294815z" + fill-rule="evenodd" + id="path406" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m271.0551 240.03412l88.0 105.60629" + fill-rule="evenodd" + id="path408" /> + <path + stroke="#a61c00" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="1.0,3.0" + d="m271.0551 240.03412l84.15903 100.99686" + fill-rule="evenodd" + id="path410" /> + <path + fill="#a61c00" + stroke="#a61c00" + stroke-width="1.0" + stroke-linecap="butt" + d="m353.94522 342.08835l4.1740417 2.4289856l-1.6362 -4.5437317z" + fill-rule="evenodd" + id="path412" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m271.0551 392.81104l411.87402 -290.77167" + fill-rule="evenodd" + id="path414" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="1.0,3.0" + d="m271.0551 392.81104l406.9724 -287.31128" + fill-rule="evenodd" + id="path416" /> + <path + fill="#274e13" + stroke="#274e13" + stroke-width="1.0" + stroke-linecap="butt" + d="m678.98016 106.84912l2.7546997 -3.9666214l-4.659912 1.2679062z" + fill-rule="evenodd" + id="path418" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m271.0551 442.09448l415.9685 -61.102356" + fill-rule="evenodd" + id="path420" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="1.0,3.0" + d="m271.0551 442.09448l410.03223 -60.230347" + fill-rule="evenodd" + id="path422" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m681.3274 383.49832l4.249878 -2.2937317l-4.7299805 -0.9746704z" + fill-rule="evenodd" + id="path424" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/gro-key-algorithm.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/gro-key-algorithm.svg new file mode 100644 index 000000000..94e42f538 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/gro-key-algorithm.svg @@ -0,0 +1,223 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> +<!-- Generated by Microsoft Visio 11.0, SVG Export, v1.0 gro-key-algorithm.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="6.06163in" height="2.66319in" + viewBox="0 0 436.438 191.75" xml:space="preserve" color-interpolation-filters="sRGB" class="st10"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:url(#grad30-4);stroke:#404040;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25} + .st2 {fill:#000000;font-family:Calibri;font-size:1.00001em} + .st3 {font-size:1em;font-weight:bold} + .st4 {fill:#000000;font-family:Calibri;font-size:1.00001em;font-weight:bold} + .st5 {font-size:1em;font-weight:normal} + .st6 {marker-end:url(#mrkr5-38);stroke:#404040;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st7 {fill:#404040;fill-opacity:1;stroke:#404040;stroke-opacity:1;stroke-width:0.28409090909091} + .st8 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25} + .st9 {fill:#000000;font-family:Calibri;font-size:0.833336em} + .st10 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Patterns_And_Gradients"> + <linearGradient id="grad30-4" v:fillPattern="30" v:foreground="#c6d09f" v:background="#d1dab4" x1="0" y1="1" x2="0" y2="0"> + <stop offset="0" style="stop-color:#c6d09f;stop-opacity:1"/> + <stop offset="1" style="stop-color:#d1dab4;stop-opacity:1"/> + </linearGradient> + <linearGradient id="grad30-35" v:fillPattern="30" v:foreground="#f0f0f0" v:background="#ffffff" x1="0" y1="1" x2="0" y2="0"> + <stop offset="0" style="stop-color:#f0f0f0;stop-opacity:1"/> + <stop offset="1" style="stop-color:#ffffff;stop-opacity:1"/> + </linearGradient> + </defs> + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-38" class="st7" v:arrowType="5" v:arrowSize="2" v:setback="6.16" refX="-6.16" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-3.52,-3.52) "/> + </marker> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <v:layer v:name="Connector" v:index="0"/> + <g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(0.25,-117.25)"> + <title>Rounded rectangle</title> + <desc>Categorize into an existed “flow”</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(14):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="90" cy="173.75" width="180" height="36"/> + <path d="M171 191.75 A9.00007 9.00007 -180 0 0 180 182.75 L180 164.75 A9.00007 9.00007 -180 0 0 171 155.75 L9 155.75 + A9.00007 9.00007 -180 0 0 -0 164.75 L0 182.75 A9.00007 9.00007 -180 0 0 9 191.75 L171 191.75 Z" + class="st1"/> + <text x="8.91" y="177.35" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Categorize into an <tspan + class="st3">existed</tspan><tspan class="st3" v:langID="2052"> </tspan>“<tspan class="st3">flow</tspan>”</text> </g> + <g id="shape2-9" v:mID="2" v:groupContext="shape" transform="translate(0.25,-58.75)"> + <title>Rounded rectangle.2</title> + <desc>Search for a “neighbor”</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(14):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="90" cy="173.75" width="180" height="36"/> + <path d="M171 191.75 A9.00007 9.00007 -180 0 0 180 182.75 L180 164.75 A9.00007 9.00007 -180 0 0 171 155.75 L9 155.75 + A9.00007 9.00007 -180 0 0 -0 164.75 L0 182.75 A9.00007 9.00007 -180 0 0 9 191.75 L171 191.75 Z" + class="st1"/> + <text x="32.19" y="177.35" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Search for a “<tspan + class="st3">neighbor</tspan>”</text> </g> + <g id="shape3-14" v:mID="3" v:groupContext="shape" transform="translate(225.813,-117.25)"> + <title>Rounded rectangle.3</title> + <desc>Insert a new “flow” and store the packet</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(14):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="105.188" cy="173.75" width="210.38" height="36"/> + <path d="M201.37 191.75 A9.00007 9.00007 -180 0 0 210.37 182.75 L210.37 164.75 A9.00007 9.00007 -180 0 0 201.37 155.75 + L9 155.75 A9.00007 9.00007 -180 0 0 -0 164.75 L0 182.75 A9.00007 9.00007 -180 0 0 9 191.75 L201.37 191.75 + Z" class="st1"/> + <text x="5.45" y="177.35" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Insert a <tspan + class="st3">new </tspan>“<tspan class="st3">flow</tspan>” and <tspan class="st3">store </tspan>the packet</text> </g> + <g id="shape4-21" v:mID="4" v:groupContext="shape" transform="translate(225.25,-58.75)"> + <title>Rounded rectangle.4</title> + <desc>Store the packet</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(14):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="83.25" cy="173.75" width="166.5" height="36"/> + <path d="M157.5 191.75 A9.00007 9.00007 -180 0 0 166.5 182.75 L166.5 164.75 A9.00007 9.00007 -180 0 0 157.5 155.75 L9 + 155.75 A9.00007 9.00007 -180 0 0 -0 164.75 L0 182.75 A9.00007 9.00007 -180 0 0 9 191.75 L157.5 191.75 Z" + class="st1"/> + <text x="42.81" y="177.35" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Store <tspan + class="st5">the packet</tspan></text> </g> + <g id="shape5-26" v:mID="5" v:groupContext="shape" transform="translate(0.25,-0.25)"> + <title>Rounded rectangle.5</title> + <desc>Merge the packet</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(14):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="90" cy="173.75" width="180" height="36"/> + <path d="M171 191.75 A9.00007 9.00007 -180 0 0 180 182.75 L180 164.75 A9.00007 9.00007 -180 0 0 171 155.75 L9 155.75 + A9.00007 9.00007 -180 0 0 -0 164.75 L0 182.75 A9.00007 9.00007 -180 0 0 9 191.75 L171 191.75 Z" + class="st1"/> + <text x="46.59" y="177.35" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Merge <tspan + class="st5">the packet</tspan></text> </g> + <g id="shape6-31" v:mID="6" v:groupContext="shape" v:layerMember="0" transform="translate(81.25,-175.75)"> + <title>Dynamic connector</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(14):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <path d="M9 191.75 L9 208.09" class="st6"/> + </g> + <g id="shape7-39" v:mID="7" v:groupContext="shape" v:layerMember="0" transform="translate(81.25,-117.25)"> + <title>Dynamic connector.7</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(14):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <path d="M9 191.75 L9 208.09" class="st6"/> + </g> + <g id="shape8-45" v:mID="8" v:groupContext="shape" v:layerMember="0" transform="translate(81.25,-58.75)"> + <title>Dynamic connector.8</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(14):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <path d="M9 191.75 L9 208.09" class="st6"/> + </g> + <g id="shape9-51" v:mID="9" v:groupContext="shape" v:layerMember="0" transform="translate(180.25,-126.25)"> + <title>Dynamic connector.9</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(14):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <path d="M0 182.75 L39.4 182.75" class="st6"/> + </g> + <g id="shape10-57" v:mID="10" v:groupContext="shape" v:layerMember="0" transform="translate(180.25,-67.75)"> + <title>Dynamic connector.10</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(14):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <path d="M0 182.75 L38.84 182.75" class="st6"/> + </g> + <g id="shape11-63" v:mID="11" v:groupContext="shape" transform="translate(65.5,-173.5)"> + <title>Sheet.11</title> + <desc>packet</desc> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="24.75" cy="182.75" width="49.5" height="18"/> + <rect x="0" y="173.75" width="49.5" height="18" class="st8"/> + <text x="8.46" y="186.35" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>packet</text> </g> + <g id="shape14-66" v:mID="14" v:groupContext="shape" transform="translate(98.125,-98.125)"> + <title>Sheet.14</title> + <desc>find a “flow”</desc> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="32.0625" cy="183.875" width="64.13" height="15.75"/> + <rect x="0" y="176" width="64.125" height="15.75" class="st8"/> + <text x="6.41" y="186.88" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>find a “flow”</text> </g> + <g id="shape15-69" v:mID="15" v:groupContext="shape" transform="translate(99.25,-39.625)"> + <title>Sheet.15</title> + <desc>find a “neighbor”</desc> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="40.5" cy="183.875" width="81" height="15.75"/> + <rect x="0" y="176" width="81" height="15.75" class="st8"/> + <text x="5.48" y="186.88" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>find a “neighbor”</text> </g> + <g id="shape13-72" v:mID="13" v:groupContext="shape" transform="translate(181.375,-79)"> + <title>Sheet.13</title> + <desc>not find</desc> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="183.875" width="42.75" height="15.75"/> + <rect x="0" y="176" width="42.75" height="15.75" class="st8"/> + <text x="5.38" y="186.88" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>not find</text> </g> + <g id="shape12-75" v:mID="12" v:groupContext="shape" transform="translate(181.375,-137.5)"> + <title>Sheet.12</title> + <desc>not find</desc> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(36):26"/> + <v:ud v:nameU="msvThemeEffects" v:val="VT0(16):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="21.375" cy="183.875" width="42.75" height="15.75"/> + <rect x="0" y="176" width="42.75" height="15.75" class="st8"/> + <text x="5.38" y="186.88" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>not find</text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/gso-output-segment-format.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/gso-output-segment-format.svg new file mode 100644 index 000000000..bdb5ec332 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/gso-output-segment-format.svg @@ -0,0 +1,313 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export gso-output-segment-format.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="19.3975in" height="8.21796in" + viewBox="0 0 1396.62 591.693" xml:space="preserve" color-interpolation-filters="sRGB" class="st21"> + <v:documentProperties v:langID="1033" v:metric="true" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:#006fc5;stroke:#006fc5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0552552} + .st2 {fill:#ffffff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st3 {stroke:#c3d600;stroke-linecap:round;stroke-linejoin:round;stroke-width:3.68828} + .st4 {fill:#c3d600;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st5 {stroke:#8f9d00;stroke-linecap:round;stroke-linejoin:round;stroke-width:3.75735} + .st6 {fill:#00aeef;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st7 {stroke:#007fb0;stroke-linecap:round;stroke-linejoin:round;stroke-width:3.75735} + .st8 {stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st9 {fill:#ffffff;font-family:Intel Clear;font-size:1.99999em;font-weight:bold} + .st10 {fill:#000000;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0552552} + .st11 {fill:#ffffff;font-family:Intel Clear;font-size:2.44732em;font-weight:bold} + .st12 {fill:none;stroke:#ffffff;stroke-linecap:round;stroke-linejoin:round;stroke-width:5.52552} + .st13 {fill:#000000;font-family:Intel Clear;font-size:2.15291em} + .st14 {fill:#000000;font-family:Intel Clear;font-size:1.8401em} + .st15 {fill:#006fc5;stroke:#006fc5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0276276} + .st16 {fill:#c3d600;font-family:Intel Clear;font-size:2.44732em} + .st17 {fill:#ffc000;font-family:Intel Clear;font-size:2.44732em} + .st18 {fill:#ffc000;stroke:#ffc000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0276276} + .st19 {fill:#0070c0;font-family:Intel Clear;font-size:1.8401em} + .st20 {fill:#006fc5;font-family:Intel Clear;font-size:1.61927em} + .st21 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394" + v:shadowOffsetY="-8.50394"/> + <g id="shape3-1" v:mID="3" v:groupContext="shape" transform="translate(577.244,-560.42)"> + <title>Sheet.3</title> + <path d="M9.24 585.29 L16.32 585.29 L16.32 587.06 L9.24 587.06 L9.24 585.29 L9.24 585.29 ZM21.63 585.29 L23.4 585.29 + L23.4 587.06 L21.63 587.06 L21.63 585.29 L21.63 585.29 ZM28.7 585.29 L35.78 585.29 L35.78 587.06 L28.7 587.06 + L28.7 585.29 L28.7 585.29 ZM41.09 585.29 L42.86 585.29 L42.86 587.06 L41.09 587.06 L41.09 585.29 L41.09 + 585.29 ZM48.17 585.29 L55.25 585.29 L55.25 587.06 L48.17 587.06 L48.17 585.29 L48.17 585.29 ZM60.56 585.29 + L62.33 585.29 L62.33 587.06 L60.56 587.06 L60.56 585.29 L60.56 585.29 ZM67.64 585.29 L74.72 585.29 L74.72 + 587.06 L67.64 587.06 L67.64 585.29 L67.64 585.29 ZM80.03 585.29 L81.8 585.29 L81.8 587.06 L80.03 587.06 + L80.03 585.29 L80.03 585.29 ZM87.11 585.29 L94.19 585.29 L94.19 587.06 L87.11 587.06 L87.11 585.29 L87.11 + 585.29 ZM99.5 585.29 L101.27 585.29 L101.27 587.06 L99.5 587.06 L99.5 585.29 L99.5 585.29 ZM106.58 585.29 + L113.66 585.29 L113.66 587.06 L106.58 587.06 L106.58 585.29 L106.58 585.29 ZM118.97 585.29 L120.74 585.29 + L120.74 587.06 L118.97 587.06 L118.97 585.29 L118.97 585.29 ZM126.05 585.29 L133.13 585.29 L133.13 587.06 + L126.05 587.06 L126.05 585.29 L126.05 585.29 ZM138.43 585.29 L140.2 585.29 L140.2 587.06 L138.43 587.06 + L138.43 585.29 L138.43 585.29 ZM145.51 585.29 L152.59 585.29 L152.59 587.06 L145.51 587.06 L145.51 585.29 + L145.51 585.29 ZM157.9 585.29 L159.67 585.29 L159.67 587.06 L157.9 587.06 L157.9 585.29 L157.9 585.29 ZM164.98 + 585.29 L172.06 585.29 L172.06 587.06 L164.98 587.06 L164.98 585.29 L164.98 585.29 ZM177.37 585.29 L179.14 + 585.29 L179.14 587.06 L177.37 587.06 L177.37 585.29 L177.37 585.29 ZM184.45 585.29 L191.53 585.29 L191.53 + 587.06 L184.45 587.06 L184.45 585.29 L184.45 585.29 ZM196.84 585.29 L198.61 585.29 L198.61 587.06 L196.84 + 587.06 L196.84 585.29 L196.84 585.29 ZM203.92 585.29 L211 585.29 L211 587.06 L203.92 587.06 L203.92 585.29 + L203.92 585.29 ZM216.31 585.29 L218.08 585.29 L218.08 587.06 L216.31 587.06 L216.31 585.29 L216.31 585.29 + ZM223.39 585.29 L230.47 585.29 L230.47 587.06 L223.39 587.06 L223.39 585.29 L223.39 585.29 ZM235.78 585.29 + L237.55 585.29 L237.55 587.06 L235.78 587.06 L235.78 585.29 L235.78 585.29 ZM242.86 585.29 L249.93 585.29 + L249.93 587.06 L242.86 587.06 L242.86 585.29 L242.86 585.29 ZM255.24 585.29 L257.01 585.29 L257.01 587.06 + L255.24 587.06 L255.24 585.29 L255.24 585.29 ZM262.32 585.29 L269.4 585.29 L269.4 587.06 L262.32 587.06 + L262.32 585.29 L262.32 585.29 ZM274.71 585.29 L276.48 585.29 L276.48 587.06 L274.71 587.06 L274.71 585.29 + L274.71 585.29 ZM281.79 585.29 L288.87 585.29 L288.87 587.06 L281.79 587.06 L281.79 585.29 L281.79 585.29 + ZM294.18 585.29 L295.95 585.29 L295.95 587.06 L294.18 587.06 L294.18 585.29 L294.18 585.29 ZM301.26 585.29 + L308.34 585.29 L308.34 587.06 L301.26 587.06 L301.26 585.29 L301.26 585.29 ZM313.65 585.29 L315.42 585.29 + L315.42 587.06 L313.65 587.06 L313.65 585.29 L313.65 585.29 ZM320.73 585.29 L324.99 585.29 L324.99 587.06 + L320.73 587.06 L320.73 585.29 L320.73 585.29 ZM11.06 591.69 L0 586.17 L11.06 580.65 L11.06 591.69 L11.06 + 591.69 ZM323.16 580.65 L334.22 586.17 L323.16 591.69 L323.16 580.65 L323.16 580.65 Z" class="st1"/> + </g> + <g id="shape4-3" v:mID="4" v:groupContext="shape" transform="translate(184.298,-201.906)"> + <title>Sheet.4</title> + <path d="M94.04 570.43 L117.87 557.26 L0 344.58 L47.68 318.26 L165.55 530.94 L189.39 517.79 L168.08 591.69 L94.04 570.43 + Z" class="st2"/> + </g> + <g id="shape5-5" v:mID="5" v:groupContext="shape" transform="translate(184.298,-201.906)"> + <title>Sheet.5</title> + <path d="M94.04 570.43 L117.87 557.26 L0 344.58 L47.68 318.26 L165.55 530.94 L189.39 517.79 L168.08 591.69 L94.04 570.43" + class="st3"/> + </g> + <g id="shape6-8" v:mID="6" v:groupContext="shape" transform="translate(119.408,-447.917)"> + <title>Sheet.6</title> + <path d="M0 510.21 L0 591.69 L129.86 591.69 L129.86 510.21 L0 510.21 L0 510.21 Z" class="st4"/> + </g> + <g id="shape7-10" v:mID="7" v:groupContext="shape" transform="translate(119.408,-447.917)"> + <title>Sheet.7</title> + <path d="M0 510.21 L129.86 510.21 L129.86 591.69 L0 591.69 L0 510.21" class="st5"/> + </g> + <g id="shape10-13" v:mID="10" v:groupContext="shape" transform="translate(250.819,-447.917)"> + <title>Sheet.10</title> + <path d="M0 510.21 L0 591.69 L822.53 591.69 L822.53 510.21 L0 510.21 L0 510.21 Z" class="st6"/> + </g> + <g id="shape11-15" v:mID="11" v:groupContext="shape" transform="translate(250.819,-447.917)"> + <title>Sheet.11</title> + <path d="M0 510.21 L822.53 510.21 L822.53 591.69 L0 591.69 L0 510.21" class="st7"/> + </g> + <g id="shape12-18" v:mID="12" v:groupContext="shape" transform="translate(255.478,-470.123)"> + <title>Sheet.12</title> + <desc>Payload 0</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="157.315" cy="574.07" width="314.63" height="35.245"/> + <path d="M314.63 556.45 L0 556.45 L0 591.69 L314.63 591.69 L314.63 556.45" class="st8"/> + <text x="102.08" y="581.27" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Payload 0</text> </g> + <g id="shape13-22" v:mID="13" v:groupContext="shape" transform="translate(577.354,-470.123)"> + <title>Sheet.13</title> + <desc>Payload 1</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="167.112" cy="574.07" width="334.23" height="35.245"/> + <path d="M334.22 556.45 L0 556.45 L0 591.69 L334.22 591.69 L334.22 556.45" class="st8"/> + <text x="111.88" y="581.27" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Payload 1</text> </g> + <g id="shape14-26" v:mID="14" v:groupContext="shape" transform="translate(910.635,-470.956)"> + <title>Sheet.14</title> + <desc>Payload 2</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="81.8509" cy="574.07" width="163.71" height="35.245"/> + <path d="M163.7 556.45 L0 556.45 L0 591.69 L163.7 591.69 L163.7 556.45" class="st8"/> + <text x="26.61" y="581.27" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Payload 2</text> </g> + <g id="shape15-30" v:mID="15" v:groupContext="shape" transform="translate(909.144,-453.824)"> + <title>Sheet.15</title> + <path d="M1.16 453.85 L1.05 465.33 L3.93 465.39 L4.04 453.91 L1.16 453.85 L1.16 453.85 ZM1 473.95 L0.94 476.82 L3.82 + 476.87 L3.87 474 L1 473.95 L1 473.95 ZM0.88 485.43 L0.77 496.91 L3.65 496.96 L3.76 485.48 L0.88 485.43 L0.88 + 485.43 ZM0.72 505.52 L0.72 508.39 L3.59 508.45 L3.59 505.58 L0.72 505.52 L0.72 505.52 ZM0.61 517 L0.55 528.49 + L3.43 528.54 L3.48 517.06 L0.61 517 L0.61 517 ZM0.44 537.1 L0.44 539.97 L3.32 540.02 L3.32 537.15 L0.44 + 537.1 L0.44 537.1 ZM0.39 548.58 L0.28 560.06 L3.15 560.12 L3.26 548.63 L0.39 548.58 L0.39 548.58 ZM0.22 + 568.67 L0.17 571.54 L3.04 571.6 L3.1 568.73 L0.22 568.67 L0.22 568.67 ZM0.11 580.16 L0 591.64 L2.88 591.69 + L2.99 580.21 L0.11 580.16 L0.11 580.16 Z" class="st10"/> + </g> + <g id="shape16-32" v:mID="16" v:groupContext="shape" transform="translate(119.187,-447.917)"> + <title>Sheet.16</title> + <path d="M0 510.21 L0 591.69 L129.86 591.69 L129.86 510.21 L0 510.21 L0 510.21 Z" class="st4"/> + </g> + <g id="shape17-34" v:mID="17" v:groupContext="shape" transform="translate(119.187,-447.917)"> + <title>Sheet.17</title> + <path d="M0 510.21 L129.86 510.21 L129.86 591.69 L0 591.69 L0 510.21" class="st5"/> + </g> + <g id="shape18-37" v:mID="18" v:groupContext="shape" transform="translate(121.944,-471.034)"> + <title>Sheet.18</title> + <desc>Header</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="61.0973" cy="574.07" width="122.2" height="35.245"/> + <path d="M122.19 556.45 L0 556.45 L0 591.69 L122.19 591.69 L122.19 556.45" class="st8"/> + <text x="20.61" y="581.27" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Header</text> </g> + <g id="shape19-41" v:mID="19" v:groupContext="shape" transform="translate(329.798,-1.87868)"> + <title>Sheet.19</title> + <path d="M0 510.43 L0 591.69 L289.81 591.69 L289.81 510.43 L0 510.43 L0 510.43 Z" class="st4"/> + </g> + <g id="shape20-43" v:mID="20" v:groupContext="shape" transform="translate(329.798,-1.87868)"> + <title>Sheet.20</title> + <path d="M0 510.43 L289.81 510.43 L289.81 591.69 L0 591.69 L0 510.43" class="st5"/> + </g> + <g id="shape21-46" v:mID="21" v:groupContext="shape" transform="translate(424.908,-21.567)"> + <title>Sheet.21</title> + <desc>Header</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="61.0973" cy="574.07" width="122.2" height="35.245"/> + <path d="M122.19 556.45 L0 556.45 L0 591.69 L122.19 591.69 L122.19 556.45" class="st8"/> + <text x="11.55" y="582.88" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Header</text> </g> + <g id="shape22-50" v:mID="22" v:groupContext="shape" transform="translate(619.609,-1.87868)"> + <title>Sheet.22</title> + <path d="M0 510.43 L0 591.69 L453.74 591.69 L453.74 510.43 L0 510.43 L0 510.43 Z" class="st6"/> + </g> + <g id="shape23-52" v:mID="23" v:groupContext="shape" transform="translate(619.609,-1.87868)"> + <title>Sheet.23</title> + <path d="M0 510.43 L453.74 510.43 L453.74 591.69 L0 591.69 L0 510.43" class="st7"/> + </g> + <g id="shape24-55" v:mID="24" v:groupContext="shape" transform="translate(778.624,-21.5672)"> + <title>Sheet.24</title> + <desc>Payload 1</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="81.8509" cy="574.07" width="163.71" height="35.245"/> + <path d="M163.7 556.45 L0 556.45 L0 591.69 L163.7 591.69 L163.7 556.45" class="st8"/> + <text x="14.26" y="582.88" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Payload 1</text> </g> + <g id="shape25-59" v:mID="25" v:groupContext="shape" transform="translate(710.092,-113.83)"> + <title>Sheet.25</title> + <path d="M0 522.69 C0 515.07 6.19 508.89 13.83 508.89 L349.43 508.89 C357.12 508.89 363.26 515.07 363.26 522.69 L363.26 + 577.89 C363.26 585.57 357.12 591.69 349.43 591.69 L13.83 591.69 C6.19 591.69 0 585.57 0 577.89 L0 522.69 + Z" class="st6"/> + </g> + <g id="shape26-61" v:mID="26" v:groupContext="shape" transform="translate(710.092,-113.83)"> + <title>Sheet.26</title> + <path d="M0 522.69 C0 515.07 6.19 508.89 13.83 508.89 L349.43 508.89 C357.12 508.89 363.26 515.07 363.26 522.69 L363.26 + 577.89 C363.26 585.57 357.12 591.69 349.43 591.69 L13.83 591.69 C6.19 591.69 0 585.57 0 577.89 L0 522.69 + Z" class="st12"/> + </g> + <g id="shape27-63" v:mID="27" v:groupContext="shape" transform="translate(813.057,-150.108)"> + <title>Sheet.27</title> + <desc>Indirect mbuf</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="94.1386" cy="576.19" width="188.28" height="31.0055"/> + <path d="M188.28 560.69 L0 560.69 L0 591.69 L188.28 591.69 L188.28 560.69" class="st8"/> + <text x="15.43" y="583.94" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Indirect mbuf</text> </g> + <g id="shape28-67" v:mID="28" v:groupContext="shape" transform="translate(810.845,-123.854)"> + <title>Sheet.28</title> + <desc>(pointer to data)</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="95.5065" cy="578.442" width="191.02" height="26.501"/> + <path d="M191.01 565.19 L0 565.19 L0 591.69 L191.01 591.69 L191.01 565.19" class="st8"/> + <text x="15.15" y="585.07" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(pointer to data)</text> </g> + <g id="shape29-71" v:mID="29" v:groupContext="shape" transform="translate(573.151,-149.601)"> + <title>Sheet.29</title> + <path d="M0 584.74 L127.76 584.74 L127.76 587.61 L0 587.61 L0 584.74 L0 584.74 ZM125.91 580.65 L136.97 586.17 L125.91 + 591.69 L125.91 580.65 L125.91 580.65 Z" class="st15"/> + </g> + <g id="shape30-73" v:mID="30" v:groupContext="shape" transform="translate(0,-309.671)"> + <title>Sheet.30</title> + <desc>Memory copy</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="108.076" cy="574.07" width="216.16" height="35.245"/> + <path d="M216.15 556.45 L0 556.45 L0 591.69 L216.15 591.69 L216.15 556.45" class="st8"/> + <text x="17.68" y="582.88" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Memory copy</text> </g> + <g id="shape31-77" v:mID="31" v:groupContext="shape" transform="translate(680.77,-305.707)"> + <title>Sheet.31</title> + <desc>No Memory Copy</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="136.547" cy="574.07" width="273.1" height="35.245"/> + <path d="M273.09 556.45 L0 556.45 L0 591.69 L273.09 591.69 L273.09 556.45" class="st8"/> + <text x="21.4" y="582.88" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>No Memory Copy</text> </g> + <g id="shape32-81" v:mID="32" v:groupContext="shape" transform="translate(1102.72,-26.7532)"> + <title>Sheet.32</title> + <desc>Logical output segment</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="138.243" cy="578.442" width="276.49" height="26.501"/> + <path d="M276.49 565.19 L0 565.19 L0 591.69 L276.49 591.69 L276.49 565.19" class="st8"/> + <text x="20.73" y="585.07" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Logical output segment</text> </g> + <g id="shape36-85" v:mID="36" v:groupContext="shape" transform="translate(1106.81,-138.647)"> + <title>Sheet.36</title> + <desc>Two-part output segment</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="144.906" cy="578.442" width="289.82" height="26.501"/> + <path d="M289.81 565.19 L0 565.19 L0 591.69 L289.81 591.69 L289.81 565.19" class="st8"/> + <text x="16.56" y="585.07" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Two-part output segment</text> </g> + <g id="shape37-89" v:mID="37" v:groupContext="shape" transform="translate(575.916,-453.879)"> + <title>Sheet.37</title> + <path d="M2.88 453.91 L2.9 465.39 L0.03 465.39 L0 453.91 L2.88 453.91 L2.88 453.91 ZM2.9 474 L2.9 476.87 L0.03 476.87 + L0.03 474 L2.9 474 L2.9 474 ZM2.9 485.48 L2.9 496.96 L0.03 496.96 L0.03 485.48 L2.9 485.48 L2.9 485.48 ZM2.9 + 505.58 L2.9 508.45 L0.03 508.45 L0.03 505.58 L2.9 505.58 L2.9 505.58 ZM2.9 517.06 L2.9 528.54 L0.03 528.54 + L0.03 517.06 L2.9 517.06 L2.9 517.06 ZM2.9 537.15 L2.9 540.02 L0.03 540.02 L0.03 537.15 L2.9 537.15 L2.9 + 537.15 ZM2.9 548.63 L2.9 560.12 L0.03 560.12 L0.03 548.63 L2.9 548.63 L2.9 548.63 ZM2.9 568.73 L2.9 571.6 + L0.03 571.6 L0.03 568.73 L2.9 568.73 L2.9 568.73 ZM2.9 580.21 L2.9 591.69 L0.03 591.69 L0.03 580.21 L2.9 + 580.21 L2.9 580.21 Z" class="st18"/> + </g> + <g id="shape38-91" v:mID="38" v:groupContext="shape" transform="translate(577.354,-193.764)"> + <title>Sheet.38</title> + <path d="M5.59 347.01 L10.92 357.16 L8.38 358.52 L3.04 348.36 L5.59 347.01 L5.59 347.01 ZM14.96 364.78 L16.29 367.32 + L13.74 368.67 L12.42 366.13 L14.96 364.78 L14.96 364.78 ZM20.33 374.97 L25.66 385.12 L23.12 386.45 L17.78 + 376.29 L20.33 374.97 L20.33 374.97 ZM29.7 392.74 L31.03 395.28 L28.48 396.61 L27.16 394.07 L29.7 392.74 + L29.7 392.74 ZM35.04 402.9 L40.4 413.06 L37.86 414.38 L32.49 404.22 L35.04 402.9 L35.04 402.9 ZM44.41 420.67 + L45.77 423.21 L43.22 424.57 L41.87 422.03 L44.41 420.67 L44.41 420.67 ZM49.78 430.83 L55.14 440.99 L52.6 + 442.34 L47.23 432.18 L49.78 430.83 L49.78 430.83 ZM59.15 448.61 L60.51 451.15 L57.96 452.5 L56.61 449.96 + L59.15 448.61 L59.15 448.61 ZM64.52 458.79 L69.88 468.95 L67.34 470.27 L61.97 460.12 L64.52 458.79 L64.52 + 458.79 ZM73.89 476.57 L75.25 479.11 L72.7 480.43 L71.35 477.89 L73.89 476.57 L73.89 476.57 ZM79.26 486.72 + L84.62 496.88 L82.08 498.21 L76.71 488.05 L79.26 486.72 L79.26 486.72 ZM88.63 504.5 L89.96 507.04 L87.41 + 508.39 L86.09 505.85 L88.63 504.5 L88.63 504.5 ZM94 514.66 L99.33 524.81 L96.79 526.17 L91.45 516.01 L94 + 514.66 L94 514.66 ZM103.37 532.43 L104.7 534.97 L102.15 536.32 L100.83 533.79 L103.37 532.43 L103.37 532.43 + ZM108.73 542.62 L114.07 552.77 L111.53 554.1 L106.19 543.94 L108.73 542.62 L108.73 542.62 ZM118.11 560.39 + L119.44 562.93 L116.89 564.26 L115.57 561.72 L118.11 560.39 L118.11 560.39 ZM123.45 570.55 L128.81 580.71 + L126.27 582.03 L120.9 571.87 L123.45 570.55 L123.45 570.55 ZM132.82 588.33 L133.9 590.37 L131.36 591.69 + L130.28 589.68 L132.82 588.33 L132.82 588.33 ZM0.28 351.89 L0 339.53 L10.07 346.73 L0.28 351.89 L0.28 351.89 + Z" class="st18"/> + </g> + <g id="shape39-93" v:mID="39" v:groupContext="shape" transform="translate(329.798,-113.83)"> + <title>Sheet.39</title> + <path d="M0 522.69 C0 515.07 6.19 508.89 13.83 508.89 L229.53 508.89 C237.19 508.89 243.35 515.07 243.35 522.69 L243.35 + 577.89 C243.35 585.54 237.19 591.69 229.53 591.69 L13.83 591.69 C6.19 591.69 0 585.54 0 577.89 L0 522.69 + Z" class="st4"/> + </g> + <g id="shape40-95" v:mID="40" v:groupContext="shape" transform="translate(329.798,-113.83)"> + <title>Sheet.40</title> + <path d="M0 522.69 C0 515.07 6.19 508.89 13.83 508.89 L229.53 508.89 C237.19 508.89 243.35 515.07 243.35 522.69 L243.35 + 577.89 C243.35 585.54 237.19 591.69 229.53 591.69 L13.83 591.69 C6.19 591.69 0 585.54 0 577.89 L0 522.69 + Z" class="st12"/> + </g> + <g id="shape41-97" v:mID="41" v:groupContext="shape" transform="translate(368.774,-150.453)"> + <title>Sheet.41</title> + <desc>Direct mbuf</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="82.7002" cy="576.19" width="165.41" height="31.0055"/> + <path d="M165.4 560.69 L0 560.69 L0 591.69 L165.4 591.69 L165.4 560.69" class="st8"/> + <text x="13.94" y="583.94" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Direct mbuf</text> </g> + <g id="shape42-101" v:mID="42" v:groupContext="shape" transform="translate(351.856,-123.854)"> + <title>Sheet.42</title> + <desc>(copy of headers)</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="102.121" cy="578.442" width="204.25" height="26.501"/> + <path d="M204.24 565.19 L0 565.19 L0 591.69 L204.24 591.69 L204.24 565.19" class="st8"/> + <text x="16.02" y="585.07" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(copy of headers)</text> </g> + <g id="shape43-105" v:mID="43" v:groupContext="shape" transform="translate(619.797,-155.563)"> + <title>Sheet.43</title> + <desc>next</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="28.011" cy="578.442" width="56.03" height="26.501"/> + <path d="M56.02 565.19 L0 565.19 L0 591.69 L56.02 591.69 L56.02 565.19" class="st8"/> + <text x="6.35" y="585.07" class="st19" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>next</text> </g> + <g id="shape44-109" v:mID="44" v:groupContext="shape" transform="translate(700.911,-551.367)"> + <title>Sheet.44</title> + <path d="M0 559.23 L0 591.69 L84.29 591.69 L84.29 559.23 L0 559.23 L0 559.23 Z" class="st2"/> + </g> + <g id="shape45-111" v:mID="45" v:groupContext="shape" transform="translate(709.883,-555.163)"> + <title>Sheet.45</title> + <desc>segsz</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="30.7501" cy="580.032" width="61.51" height="23.3211"/> + <path d="M61.5 568.37 L0 568.37 L0 591.69 L61.5 591.69 L61.5 568.37" class="st8"/> + <text x="6.38" y="585.86" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>segsz</text> </g> + <g id="shape46-115" v:mID="46" v:groupContext="shape" transform="translate(1111.54,-477.36)"> + <title>Sheet.46</title> + <desc>Input packet</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="74.9" cy="578.442" width="149.8" height="26.501"/> + <path d="M149.8 565.19 L0 565.19 L0 591.69 L149.8 591.69 L149.8 565.19" class="st8"/> + <text x="12.47" y="585.07" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Input packet</text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/gso-three-seg-mbuf.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/gso-three-seg-mbuf.svg new file mode 100644 index 000000000..0431012de --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/gso-three-seg-mbuf.svg @@ -0,0 +1,477 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export gso-three-seg-mbuf_new.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="25.5895in" height="9.63966in" + viewBox="0 0 1842.44 694.055" xml:space="preserve" color-interpolation-filters="sRGB" class="st23"> + <title>GSO three-part output segment</title> + <v:documentProperties v:langID="1033" v:metric="true" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:#ffc000;stroke:#ffc000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0329073} + .st2 {fill:#006fc5;stroke:#006fc5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0329073} + .st3 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:3.42236} + .st4 {fill:#c3d600;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st5 {stroke:#8f9d00;stroke-linecap:round;stroke-linejoin:round;stroke-width:4.47539} + .st6 {fill:#00aeef;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st7 {stroke:#007fb0;stroke-linecap:round;stroke-linejoin:round;stroke-width:4.47539} + .st8 {stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st9 {fill:#ffffff;font-family:Calibri;font-size:2.08333em;font-weight:bold} + .st10 {fill:#ffffff;font-family:Intel Clear;font-size:2.91502em;font-weight:bold} + .st11 {fill:#000000;font-family:Intel Clear;font-size:2.19175em} + .st12 {fill:none;stroke:#ffffff;stroke-linecap:round;stroke-linejoin:round;stroke-width:6.58146} + .st13 {fill:#000000;font-family:Intel Clear;font-size:2.50001em} + .st14 {fill:#000000;font-family:Intel Clear;font-size:1.99999em} + .st15 {fill:#0070c0;font-family:Intel Clear;font-size:2.19175em} + .st16 {fill:#ffffff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st17 {fill:#006fc5;font-family:Intel Clear;font-size:1.92874em} + .st18 {fill:#000000;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0329073} + .st19 {fill:#0070c0;font-family:Intel Clear;font-size:1.5em} + .st20 {fill:#000000;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0658146} + .st21 {fill:#000000;font-family:Intel Clear;font-size:1.81915em} + .st22 {fill:#000000;font-family:Intel Clear;font-size:1.49785em} + .st23 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394" + v:shadowOffsetY="-8.50394"/> + <v:layer v:name="top" v:index="0"/> + <v:layer v:name="middle" v:index="1"/> + <g id="shape111-1" v:mID="111" v:groupContext="shape" v:layerMember="0" transform="translate(787.208,-220.973)"> + <title>Sheet.111</title> + <path d="M6.65 402.61 L13.01 414.71 L9.98 416.32 L3.62 404.22 L6.65 402.61 L6.65 402.61 ZM17.82 423.78 L19.4 426.81 L16.37 + 428.42 L14.79 425.39 L17.82 423.78 L17.82 423.78 ZM24.21 435.91 L30.57 448.01 L27.54 449.59 L21.18 437.49 + L24.21 435.91 L24.21 435.91 ZM35.38 457.08 L36.96 460.11 L33.93 461.69 L32.35 458.66 L35.38 457.08 L35.38 + 457.08 ZM41.73 469.18 L48.12 481.28 L45.09 482.86 L38.7 470.76 L41.73 469.18 L41.73 469.18 ZM52.9 490.36 + L54.51 493.38 L51.48 494.99 L49.87 491.97 L52.9 490.36 L52.9 490.36 ZM59.29 502.45 L65.68 514.55 L62.65 + 516.16 L56.26 504.06 L59.29 502.45 L59.29 502.45 ZM70.46 523.63 L72.07 526.65 L69.04 528.26 L67.43 525.24 + L70.46 523.63 L70.46 523.63 ZM76.85 535.76 L83.24 547.86 L80.21 549.43 L73.82 537.34 L76.85 535.76 L76.85 + 535.76 ZM88.01 556.93 L89.63 559.95 L86.6 561.53 L84.98 558.51 L88.01 556.93 L88.01 556.93 ZM94.4 569.03 + L100.79 581.13 L97.76 582.7 L91.37 570.61 L94.4 569.03 L94.4 569.03 ZM105.57 590.2 L107.15 593.22 L104.12 + 594.84 L102.54 591.81 L105.57 590.2 L105.57 590.2 ZM111.96 602.3 L118.32 614.4 L115.28 616.01 L108.93 603.91 + L111.96 602.3 L111.96 602.3 ZM123.12 623.47 L124.71 626.5 L121.67 628.11 L120.09 625.08 L123.12 623.47 L123.12 + 623.47 ZM129.51 635.6 L135.87 647.7 L132.84 649.28 L126.48 637.18 L129.51 635.6 L129.51 635.6 ZM140.68 656.77 + L142.26 659.8 L139.23 661.38 L137.65 658.35 L140.68 656.77 L140.68 656.77 ZM147.04 668.87 L153.43 680.97 + L150.4 682.55 L144.01 670.45 L147.04 668.87 L147.04 668.87 ZM158.2 690.04 L159.49 692.48 L156.46 694.06 + L155.17 691.66 L158.2 690.04 L158.2 690.04 ZM0.33 408.43 L0 393.7 L11.99 402.28 L0.33 408.43 L0.33 408.43 + Z" class="st1"/> + </g> + <g id="shape110-3" v:mID="110" v:groupContext="shape" v:layerMember="0" transform="translate(685.078,-560.166)"> + <title>Sheet.110</title> + <path d="M0 685.77 L90.67 685.77 L90.67 689.19 L0 689.19 L0 685.77 L0 685.77 ZM89.36 680.9 L97.21 687.48 L89.36 694.06 + L89.36 680.9 L89.36 680.9 Z" class="st2"/> + </g> + <g id="shape4-5" v:mID="4" v:groupContext="shape" transform="translate(718.715,-469.955)"> + <title>Sheet.4</title> + <path d="M0 655.13 L0 678.22 C0 686.97 11.69 694.06 26.05 694.06 C40.45 694.06 52.11 686.97 52.11 678.22 L52.11 673.91 + L59.55 673.91 L44.66 664.86 L29.78 673.91 L37.22 673.91 L37.22 678.22 C37.22 681.98 32.25 685 26.05 685 + C19.89 685 14.89 681.98 14.89 678.22 L14.89 655.13 L0 655.13 Z" class="st3"/> + </g> + <g id="shape5-7" v:mID="5" v:groupContext="shape" transform="translate(547.831,-656.823)"> + <title>Sheet.5</title> + <path d="M11 686.43 L19.43 686.43 L19.43 688.53 L11 688.53 L11 686.43 L11 686.43 ZM25.76 686.43 L27.87 686.43 L27.87 + 688.53 L25.76 688.53 L25.76 686.43 L25.76 686.43 ZM34.19 686.43 L42.62 686.43 L42.62 688.53 L34.19 688.53 + L34.19 686.43 L34.19 686.43 ZM48.95 686.43 L51.05 686.43 L51.05 688.53 L48.95 688.53 L48.95 686.43 L48.95 + 686.43 ZM57.38 686.43 L65.81 686.43 L65.81 688.53 L57.38 688.53 L57.38 686.43 L57.38 686.43 ZM72.14 686.43 + L74.24 686.43 L74.24 688.53 L72.14 688.53 L72.14 686.43 L72.14 686.43 ZM80.57 686.43 L89 686.43 L89 688.53 + L80.57 688.53 L80.57 686.43 L80.57 686.43 ZM95.32 686.43 L97.43 686.43 L97.43 688.53 L95.32 688.53 L95.32 + 686.43 L95.32 686.43 ZM103.76 686.43 L112.19 686.43 L112.19 688.53 L103.76 688.53 L103.76 686.43 L103.76 + 686.43 ZM118.51 686.43 L120.62 686.43 L120.62 688.53 L118.51 688.53 L118.51 686.43 L118.51 686.43 ZM126.94 + 686.43 L135.38 686.43 L135.38 688.53 L126.94 688.53 L126.94 686.43 L126.94 686.43 ZM141.7 686.43 L143.81 + 686.43 L143.81 688.53 L141.7 688.53 L141.7 686.43 L141.7 686.43 ZM150.13 686.43 L158.57 686.43 L158.57 688.53 + L150.13 688.53 L150.13 686.43 L150.13 686.43 ZM164.89 686.43 L167 686.43 L167 688.53 L164.89 688.53 L164.89 + 686.43 L164.89 686.43 ZM173.32 686.43 L181.75 686.43 L181.75 688.53 L173.32 688.53 L173.32 686.43 L173.32 + 686.43 ZM188.08 686.43 L190.19 686.43 L190.19 688.53 L188.08 688.53 L188.08 686.43 L188.08 686.43 ZM196.51 + 686.43 L204.94 686.43 L204.94 688.53 L196.51 688.53 L196.51 686.43 L196.51 686.43 ZM211.27 686.43 L213.38 + 686.43 L213.38 688.53 L211.27 688.53 L211.27 686.43 L211.27 686.43 ZM219.7 686.43 L228.13 686.43 L228.13 + 688.53 L219.7 688.53 L219.7 686.43 L219.7 686.43 ZM234.46 686.43 L236.56 686.43 L236.56 688.53 L234.46 688.53 + L234.46 686.43 L234.46 686.43 ZM242.89 686.43 L251.32 686.43 L251.32 688.53 L242.89 688.53 L242.89 686.43 + L242.89 686.43 ZM257.64 686.43 L259.75 686.43 L259.75 688.53 L257.64 688.53 L257.64 686.43 L257.64 686.43 + ZM266.08 686.43 L274.51 686.43 L274.51 688.53 L266.08 688.53 L266.08 686.43 L266.08 686.43 ZM280.83 686.43 + L282.94 686.43 L282.94 688.53 L280.83 688.53 L280.83 686.43 L280.83 686.43 ZM289.27 686.43 L297.7 686.43 + L297.7 688.53 L289.27 688.53 L289.27 686.43 L289.27 686.43 ZM304.02 686.43 L306.13 686.43 L306.13 688.53 + L304.02 688.53 L304.02 686.43 L304.02 686.43 ZM312.45 686.43 L320.89 686.43 L320.89 688.53 L312.45 688.53 + L312.45 686.43 L312.45 686.43 ZM327.21 686.43 L329.32 686.43 L329.32 688.53 L327.21 688.53 L327.21 686.43 + L327.21 686.43 ZM335.64 686.43 L344.08 686.43 L344.08 688.53 L335.64 688.53 L335.64 686.43 L335.64 686.43 + ZM350.4 686.43 L352.51 686.43 L352.51 688.53 L350.4 688.53 L350.4 686.43 L350.4 686.43 ZM358.83 686.43 L367.26 + 686.43 L367.26 688.53 L358.83 688.53 L358.83 686.43 L358.83 686.43 ZM373.59 686.43 L375.7 686.43 L375.7 + 688.53 L373.59 688.53 L373.59 686.43 L373.59 686.43 ZM382.02 686.43 L387.06 686.43 L387.06 688.53 L382.02 + 688.53 L382.02 686.43 L382.02 686.43 ZM13.18 694.06 L0 687.48 L13.18 680.9 L13.18 694.06 L13.18 694.06 ZM384.89 + 680.9 L398.06 687.48 L384.89 694.06 L384.89 680.9 L384.89 680.9 Z" class="st2"/> + </g> + <g id="shape6-9" v:mID="6" v:groupContext="shape" transform="translate(2.5012,-522.82)"> + <title>Sheet.6</title> + <path d="M0 597.01 L0 694.06 L154.68 694.06 L154.68 597.01 L0 597.01 L0 597.01 Z" class="st4"/> + </g> + <g id="shape7-11" v:mID="7" v:groupContext="shape" transform="translate(2.5012,-522.82)"> + <title>Sheet.7</title> + <path d="M0 597.01 L154.68 597.01 L154.68 694.06 L0 694.06 L0 597.01" class="st5"/> + </g> + <g id="shape10-14" v:mID="10" v:groupContext="shape" transform="translate(159.025,-522.82)"> + <title>Sheet.10</title> + <path d="M0 597.01 L0 694.06 L563.73 694.06 L563.73 597.01 L0 597.01 L0 597.01 Z" class="st6"/> + </g> + <g id="shape11-16" v:mID="11" v:groupContext="shape" transform="translate(159.025,-522.82)"> + <title>Sheet.11</title> + <path d="M0 597.01 L563.73 597.01 L563.73 694.06 L0 694.06 L0 597.01" class="st7"/> + </g> + <g id="shape12-19" v:mID="12" v:groupContext="shape" transform="translate(262.039,-549.269)"> + <title>Sheet.12</title> + <desc>Payload 0</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="97.4929" cy="673.065" width="194.99" height="41.9798"/> + <path d="M194.99 652.08 L0 652.08 L0 694.06 L194.99 694.06 L194.99 652.08" class="st8"/> + <text x="46.92" y="680.57" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Payload 0</text> </g> + <g id="shape13-23" v:mID="13" v:groupContext="shape" transform="translate(547.615,-549.269)"> + <title>Sheet.13</title> + <desc>Payload 1</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="87.5716" cy="673.065" width="175.15" height="41.9798"/> + <path d="M175.14 652.08 L0 652.08 L0 694.06 L175.14 694.06 L175.14 652.08" class="st8"/> + <text x="22.61" y="680.57" class="st9" v:langID="1033"><v:paragraph/><v:tabList/>Payload 1</text> </g> + <g id="shape15-27" v:mID="15" v:groupContext="shape" transform="translate(2.2377,-522.82)"> + <title>Sheet.15</title> + <path d="M0 597.01 L0 694.06 L154.68 694.06 L154.68 597.01 L0 597.01 L0 597.01 Z" class="st4"/> + </g> + <g id="shape16-29" v:mID="16" v:groupContext="shape" transform="translate(2.2377,-522.82)"> + <title>Sheet.16</title> + <path d="M0 597.01 L154.68 597.01 L154.68 694.06 L0 694.06 L0 597.01" class="st5"/> + </g> + <g id="shape17-32" v:mID="17" v:groupContext="shape" transform="translate(6.52106,-546.331)"> + <title>Sheet.17</title> + <desc>Header</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="72.773" cy="673.065" width="145.55" height="41.9798"/> + <path d="M145.55 652.08 L0 652.08 L0 694.06 L145.55 694.06 L145.55 652.08" class="st8"/> + <text x="34.98" y="680.57" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Header</text> </g> + <g id="shape23-36" v:mID="23" v:groupContext="shape" transform="translate(286.548,-2.2377)"> + <title>Sheet.23</title> + <path d="M0 597.27 L0 694.06 L345.2 694.06 L345.2 597.27 L0 597.27 L0 597.27 Z" class="st4"/> + </g> + <g id="shape24-38" v:mID="24" v:groupContext="shape" transform="translate(286.548,-2.2377)"> + <title>Sheet.24</title> + <path d="M0 597.27 L345.2 597.27 L345.2 694.06 L0 694.06 L0 597.27" class="st5"/> + </g> + <g id="shape25-41" v:mID="25" v:groupContext="shape" transform="translate(399.834,-25.6887)"> + <title>Sheet.25</title> + <desc>Header</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="72.773" cy="673.065" width="145.55" height="41.9798"/> + <path d="M145.55 652.08 L0 652.08 L0 694.06 L145.55 694.06 L145.55 652.08" class="st8"/> + <text x="13.76" y="683.56" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Header</text> </g> + <g id="shape31-45" v:mID="31" v:groupContext="shape" transform="translate(631.744,-2.2377)"> + <title>Sheet.31</title> + <path d="M0 597.27 L0 694.06 L516.21 694.06 L516.21 597.27 L0 597.27 L0 597.27 Z" class="st6"/> + </g> + <g id="shape32-47" v:mID="32" v:groupContext="shape" transform="translate(631.744,-2.2377)"> + <title>Sheet.32</title> + <path d="M0 597.27 L516.21 597.27 L516.21 694.06 L0 694.06 L0 597.27" class="st7"/> + </g> + <g id="shape33-50" v:mID="33" v:groupContext="shape" transform="translate(809.035,-25.6889)"> + <title>Sheet.33</title> + <desc>Payload 1</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="97.4929" cy="673.065" width="194.99" height="41.9798"/> + <path d="M194.99 652.08 L0 652.08 L0 694.06 L194.99 694.06 L194.99 652.08" class="st8"/> + <text x="16.99" y="683.56" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Payload 1</text> </g> + <g id="shape35-54" v:mID="35" v:groupContext="shape" transform="translate(1190.48,-32.2189)"> + <title>Sheet.35</title> + <desc>Logical output segment</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="164.662" cy="678.273" width="329.33" height="31.5648"/> + <path d="M329.32 662.49 L0 662.49 L0 694.06 L329.32 694.06 L329.32 662.49" class="st8"/> + <text x="0" y="686.16" class="st11" v:langID="1033"><v:paragraph/><v:tabList/>Logical output segment</text> </g> + <g id="shape39-58" v:mID="39" v:groupContext="shape" transform="translate(546.25,-529.921)"> + <title>Sheet.39</title> + <path d="M3.43 529.94 L3.46 543.61 L0.03 543.61 L0 529.94 L3.43 529.94 L3.43 529.94 ZM3.46 553.87 L3.46 557.29 L0.03 + 557.29 L0.03 553.87 L3.46 553.87 L3.46 553.87 ZM3.46 567.55 L3.46 581.22 L0.03 581.22 L0.03 567.55 L3.46 + 567.55 L3.46 567.55 ZM3.46 591.48 L3.46 594.9 L0.03 594.9 L0.03 591.48 L3.46 591.48 L3.46 591.48 ZM3.46 + 605.16 L3.46 618.83 L0.03 618.83 L0.03 605.16 L3.46 605.16 L3.46 605.16 ZM3.46 629.09 L3.46 632.51 L0.03 + 632.51 L0.03 629.09 L3.46 629.09 L3.46 629.09 ZM3.46 642.77 L3.46 656.45 L0.03 656.45 L0.03 642.77 L3.46 + 642.77 L3.46 642.77 ZM3.46 666.7 L3.46 670.12 L0.03 670.12 L0.03 666.7 L3.46 666.7 L3.46 666.7 ZM3.46 680.38 + L3.46 694.06 L0.03 694.06 L0.03 680.38 L3.46 680.38 L3.46 680.38 Z" class="st1"/> + </g> + <g id="shape40-60" v:mID="40" v:groupContext="shape" transform="translate(549.097,-223.749)"> + <title>Sheet.40</title> + <path d="M6.65 402.61 L13.01 414.71 L9.98 416.32 L3.62 404.22 L6.65 402.61 L6.65 402.61 ZM17.82 423.78 L19.4 426.81 L16.37 + 428.42 L14.79 425.39 L17.82 423.78 L17.82 423.78 ZM24.21 435.91 L30.57 448.01 L27.54 449.59 L21.18 437.49 + L24.21 435.91 L24.21 435.91 ZM35.38 457.08 L36.96 460.11 L33.93 461.69 L32.35 458.66 L35.38 457.08 L35.38 + 457.08 ZM41.73 469.18 L48.12 481.28 L45.09 482.86 L38.7 470.76 L41.73 469.18 L41.73 469.18 ZM52.9 490.36 + L54.51 493.38 L51.48 494.99 L49.87 491.97 L52.9 490.36 L52.9 490.36 ZM59.29 502.45 L65.68 514.55 L62.65 + 516.16 L56.26 504.06 L59.29 502.45 L59.29 502.45 ZM70.46 523.63 L72.07 526.65 L69.04 528.26 L67.43 525.24 + L70.46 523.63 L70.46 523.63 ZM76.85 535.76 L83.24 547.86 L80.21 549.43 L73.82 537.34 L76.85 535.76 L76.85 + 535.76 ZM88.01 556.93 L89.63 559.95 L86.6 561.53 L84.98 558.51 L88.01 556.93 L88.01 556.93 ZM94.4 569.03 + L100.79 581.13 L97.76 582.7 L91.37 570.61 L94.4 569.03 L94.4 569.03 ZM105.57 590.2 L107.15 593.22 L104.12 + 594.84 L102.54 591.81 L105.57 590.2 L105.57 590.2 ZM111.96 602.3 L118.32 614.4 L115.28 616.01 L108.93 603.91 + L111.96 602.3 L111.96 602.3 ZM123.12 623.47 L124.71 626.5 L121.67 628.11 L120.09 625.08 L123.12 623.47 L123.12 + 623.47 ZM129.51 635.6 L135.87 647.7 L132.84 649.28 L126.48 637.18 L129.51 635.6 L129.51 635.6 ZM140.68 656.77 + L142.26 659.8 L139.23 661.38 L137.65 658.35 L140.68 656.77 L140.68 656.77 ZM147.04 668.87 L153.43 680.97 + L150.4 682.55 L144.01 670.45 L147.04 668.87 L147.04 668.87 ZM158.2 690.04 L159.49 692.48 L156.46 694.06 + L155.17 691.66 L158.2 690.04 L158.2 690.04 ZM0.33 408.43 L0 393.7 L11.99 402.28 L0.33 408.43 L0.33 408.43 + Z" class="st1"/> + </g> + <g id="shape46-62" v:mID="46" v:groupContext="shape" transform="translate(66.8445,-221.499)"> + <title>Sheet.46</title> + <path d="M0 611.87 C0 602.79 7.38 595.43 16.47 595.43 L273.39 595.43 C282.51 595.43 289.86 602.79 289.86 611.87 L289.86 + 677.62 C289.86 686.72 282.51 694.06 273.39 694.06 L16.47 694.06 C7.38 694.06 -0 686.72 0 677.62 L0 611.87 + Z" class="st4"/> + </g> + <g id="shape47-64" v:mID="47" v:groupContext="shape" transform="translate(66.8445,-221.499)"> + <title>Sheet.47</title> + <path d="M0 611.87 C0 602.79 7.38 595.43 16.47 595.43 L273.39 595.43 C282.51 595.43 289.86 602.79 289.86 611.87 L289.86 + 677.62 C289.86 686.72 282.51 694.06 273.39 694.06 L16.47 694.06 C7.38 694.06 -0 686.72 0 677.62 L0 611.87 + Z" class="st12"/> + </g> + <g id="shape48-66" v:mID="48" v:groupContext="shape" transform="translate(113.27,-263.667)"> + <title>Sheet.48</title> + <desc>Direct mbuf</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="98.5041" cy="675.59" width="197.01" height="36.9302"/> + <path d="M197.01 657.13 L0 657.13 L0 694.06 L197.01 694.06 L197.01 657.13" class="st8"/> + <text x="18.66" y="684.59" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Direct mbuf</text> </g> + <g id="shape51-70" v:mID="51" v:groupContext="shape" transform="translate(85.817,-233.439)"> + <title>Sheet.51</title> + <desc>(copy of headers)</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="127.916" cy="678.273" width="255.84" height="31.5648"/> + <path d="M255.83 662.49 L0 662.49 L0 694.06 L255.83 694.06 L255.83 662.49" class="st8"/> + <text x="34.33" y="685.47" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(copy of headers)</text> </g> + <g id="shape53-74" v:mID="53" v:groupContext="shape" transform="translate(371.944,-275.998)"> + <title>Sheet.53</title> + <desc>next</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="33.3635" cy="678.273" width="66.73" height="31.5648"/> + <path d="M66.73 662.49 L0 662.49 L0 694.06 L66.73 694.06 L66.73 662.49" class="st8"/> + <text x="7.56" y="686.16" class="st15" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>next</text> </g> + <g id="shape54-78" v:mID="54" v:groupContext="shape" transform="translate(695.132,-646.04)"> + <title>Sheet.54</title> + <path d="M0 655.39 L0 694.06 L100.4 694.06 L100.4 655.39 L0 655.39 L0 655.39 Z" class="st16"/> + </g> + <g id="shape55-80" v:mID="55" v:groupContext="shape" transform="translate(709.033,-648.946)"> + <title>Sheet.55</title> + <desc>segsz</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="36.6265" cy="680.167" width="73.26" height="27.7775"/> + <path d="M73.25 666.28 L0 666.28 L0 694.06 L73.25 694.06 L73.25 666.28" class="st8"/> + <text x="7.6" y="687.11" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>segsz</text> </g> + <g id="shape56-84" v:mID="56" v:groupContext="shape" transform="translate(785.874,-521.182)"> + <title>Sheet.56</title> + <path d="M0 597.27 L0 694.06 L363.41 694.06 L363.41 597.27 L0 597.27 L0 597.27 Z" class="st6"/> + </g> + <g id="shape57-86" v:mID="57" v:groupContext="shape" transform="translate(785.874,-521.182)"> + <title>Sheet.57</title> + <path d="M0 597.27 L363.41 597.27 L363.41 694.06 L0 694.06 L0 597.27" class="st7"/> + </g> + <g id="shape58-89" v:mID="58" v:groupContext="shape" v:layerMember="0" transform="translate(943.158,-529.889)"> + <title>Sheet.58</title> + <path d="M1.35 529.91 L1.25 543.58 L4.68 543.61 L4.78 529.94 L1.35 529.91 L1.35 529.91 ZM1.15 553.84 L1.12 557.26 L4.55 + 557.29 L4.58 553.87 L1.15 553.84 L1.15 553.84 ZM1.05 567.52 L0.92 581.19 L4.35 581.22 L4.48 567.55 L1.05 + 567.52 L1.05 567.52 ZM0.86 591.45 L0.82 594.87 L4.25 594.9 L4.28 591.48 L0.86 591.45 L0.86 591.45 ZM0.72 + 605.13 L0.63 618.8 L4.05 618.83 L4.15 605.16 L0.72 605.13 L0.72 605.13 ZM0.53 629.06 L0.53 632.48 L3.95 + 632.51 L3.95 629.09 L0.53 629.06 L0.53 629.06 ZM0.43 642.74 L0.33 656.41 L3.75 656.45 L3.85 642.77 L0.43 + 642.74 L0.43 642.74 ZM0.23 666.67 L0.2 670.09 L3.62 670.12 L3.66 666.7 L0.23 666.67 L0.23 666.67 ZM0.13 + 680.35 L0 694.02 L3.43 694.06 L3.56 680.38 L0.13 680.35 L0.13 680.35 Z" class="st18"/> + </g> + <g id="shape59-91" v:mID="59" v:groupContext="shape" transform="translate(785.874,-549.473)"> + <title>Sheet.59</title> + <desc>Payload 1</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="77.3395" cy="673.065" width="154.68" height="41.9798"/> + <path d="M154.68 652.08 L0 652.08 L0 694.06 L154.68 694.06 L154.68 652.08" class="st8"/> + <text x="16.96" y="680.57" class="st9" v:langID="1033"><v:paragraph/><v:tabList/>Payload 1</text> </g> + <g id="shape60-95" v:mID="60" v:groupContext="shape" transform="translate(952.97,-548.822)"> + <title>Sheet.60</title> + <desc>Payload 2</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="97.4929" cy="673.065" width="194.99" height="41.9798"/> + <path d="M194.99 652.08 L0 652.08 L0 694.06 L194.99 694.06 L194.99 652.08" class="st8"/> + <text x="46.92" y="680.57" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Payload 2</text> </g> + <g id="shape63-99" v:mID="63" v:groupContext="shape" transform="translate(1190.48,-552.568)"> + <title>Sheet.63</title> + <desc>Multi-segment input packet</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="181.707" cy="678.273" width="363.42" height="31.5648"/> + <path d="M363.41 662.49 L0 662.49 L0 694.06 L363.41 694.06 L363.41 662.49" class="st8"/> + <text x="0" y="686.16" class="st11" v:langID="1033"><v:paragraph/><v:tabList/>Multi-segment input packet</text> </g> + <g id="shape70-103" v:mID="70" v:groupContext="shape" v:layerMember="1" transform="translate(455.049,-221.499)"> + <title>Sheet.70</title> + <path d="M0 611.87 C0 602.79 5.33 595.43 11.89 595.43 L282.92 595.43 C289.53 595.43 294.8 602.79 294.8 611.87 L294.8 + 677.62 C294.8 686.76 289.53 694.06 282.92 694.06 L11.89 694.06 C5.33 694.06 0 686.76 0 677.62 L0 611.87 + Z" class="st6"/> + </g> + <g id="shape71-105" v:mID="71" v:groupContext="shape" transform="translate(455.049,-221.499)"> + <title>Sheet.71</title> + <path d="M0 611.87 C0 602.79 5.33 595.43 11.89 595.43 L282.92 595.43 C289.53 595.43 294.8 602.79 294.8 611.87 L294.8 + 677.62 C294.8 686.76 289.53 694.06 282.92 694.06 L11.89 694.06 C5.33 694.06 0 686.76 0 677.62 L0 611.87 + Z" class="st12"/> + </g> + <g id="shape72-107" v:mID="72" v:groupContext="shape" transform="translate(489.065,-263.434)"> + <title>Sheet.72</title> + <desc>Indirect mbuf</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="112.128" cy="675.59" width="224.26" height="36.9302"/> + <path d="M224.26 657.13 L0 657.13 L0 694.06 L224.26 694.06 L224.26 657.13" class="st8"/> + <text x="20.73" y="684.59" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Indirect mbuf</text> </g> + <g id="shape75-111" v:mID="75" v:groupContext="shape" transform="translate(849.065,-281.435)"> + <title>Sheet.75</title> + <desc>(pointer to data)</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="100.199" cy="678.273" width="200.4" height="31.5648"/> + <path d="M200.4 662.49 L0 662.49 L0 694.06 L200.4 694.06 L200.4 662.49" class="st8"/> + <text x="4.49" y="686.16" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(pointer to data)</text> </g> + <g id="shape77-115" v:mID="77" v:groupContext="shape" transform="translate(717.742,-563.523)"> + <title>Sheet.77</title> + <desc>next</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="33.3635" cy="678.273" width="66.73" height="31.5648"/> + <path d="M66.73 662.49 L0 662.49 L0 694.06 L66.73 694.06 L66.73 662.49" class="st8"/> + <text x="15.71" y="683.67" class="st19" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>next</text> </g> + <g id="shape78-119" v:mID="78" v:groupContext="shape" transform="translate(1148.17,-529.067)"> + <title>Sheet.78</title> + <path d="M1.38 529.87 L1.25 543.55 L4.68 543.61 L4.81 529.94 L1.38 529.87 L1.38 529.87 ZM1.19 553.81 L1.12 557.23 L4.55 + 557.29 L4.61 553.87 L1.19 553.81 L1.19 553.81 ZM1.05 567.48 L0.92 581.16 L4.35 581.22 L4.48 567.55 L1.05 + 567.48 L1.05 567.48 ZM0.86 591.42 L0.86 594.84 L4.28 594.9 L4.28 591.48 L0.86 591.42 L0.86 591.42 ZM0.72 + 605.09 L0.66 618.77 L4.08 618.83 L4.15 605.16 L0.72 605.09 L0.72 605.09 ZM0.53 629.03 L0.53 632.45 L3.95 + 632.51 L3.95 629.09 L0.53 629.03 L0.53 629.03 ZM0.46 642.7 L0.33 656.38 L3.75 656.45 L3.89 642.77 L0.46 + 642.7 L0.46 642.7 ZM0.26 666.64 L0.2 670.06 L3.62 670.12 L3.69 666.7 L0.26 666.64 L0.26 666.64 ZM0.13 680.31 + L0 693.99 L3.43 694.06 L3.56 680.38 L0.13 680.31 L0.13 680.31 Z" class="st20"/> + </g> + <g id="shape79-121" v:mID="79" v:groupContext="shape" transform="translate(946.254,-657.81)"> + <title>Sheet.79</title> + <path d="M11 686.69 L17.33 686.69 L17.33 688.27 L11 688.27 L11 686.69 L11 686.69 ZM22.07 686.69 L23.65 686.69 L23.65 + 688.27 L22.07 688.27 L22.07 686.69 L22.07 686.69 ZM28.39 686.69 L34.72 686.69 L34.72 688.27 L28.39 688.27 + L28.39 686.69 L28.39 686.69 ZM39.46 686.69 L41.04 686.69 L41.04 688.27 L39.46 688.27 L39.46 686.69 L39.46 + 686.69 ZM45.78 686.69 L52.11 686.69 L52.11 688.27 L45.78 688.27 L45.78 686.69 L45.78 686.69 ZM56.85 686.69 + L58.43 686.69 L58.43 688.27 L56.85 688.27 L56.85 686.69 L56.85 686.69 ZM63.18 686.69 L69.5 686.69 L69.5 + 688.27 L63.18 688.27 L63.18 686.69 L63.18 686.69 ZM74.24 686.69 L75.82 686.69 L75.82 688.27 L74.24 688.27 + L74.24 686.69 L74.24 686.69 ZM80.57 686.69 L86.89 686.69 L86.89 688.27 L80.57 688.27 L80.57 686.69 L80.57 + 686.69 ZM91.63 686.69 L93.22 686.69 L93.22 688.27 L91.63 688.27 L91.63 686.69 L91.63 686.69 ZM97.96 686.69 + L104.28 686.69 L104.28 688.27 L97.96 688.27 L97.96 686.69 L97.96 686.69 ZM109.03 686.69 L110.61 686.69 L110.61 + 688.27 L109.03 688.27 L109.03 686.69 L109.03 686.69 ZM115.35 686.69 L121.67 686.69 L121.67 688.27 L115.35 + 688.27 L115.35 686.69 L115.35 686.69 ZM126.42 686.69 L128 686.69 L128 688.27 L126.42 688.27 L126.42 686.69 + L126.42 686.69 ZM132.74 686.69 L139.07 686.69 L139.07 688.27 L132.74 688.27 L132.74 686.69 L132.74 686.69 + ZM143.81 686.69 L145.39 686.69 L145.39 688.27 L143.81 688.27 L143.81 686.69 L143.81 686.69 ZM150.13 686.69 + L156.46 686.69 L156.46 688.27 L150.13 688.27 L150.13 686.69 L150.13 686.69 ZM161.2 686.69 L162.78 686.69 + L162.78 688.27 L161.2 688.27 L161.2 686.69 L161.2 686.69 ZM167.53 686.69 L173.85 686.69 L173.85 688.27 L167.53 + 688.27 L167.53 686.69 L167.53 686.69 ZM178.59 686.69 L180.17 686.69 L180.17 688.27 L178.59 688.27 L178.59 + 686.69 L178.59 686.69 ZM184.92 686.69 L189.4 686.69 L189.4 688.27 L184.92 688.27 L184.92 686.69 L184.92 + 686.69 ZM13.18 694.06 L0 687.41 L13.18 680.9 L13.18 694.06 L13.18 694.06 ZM187.22 680.9 L200.4 687.48 L187.22 + 694.06 L187.22 680.9 L187.22 680.9 Z" class="st20"/> + </g> + <g id="shape80-123" v:mID="80" v:groupContext="shape" transform="translate(982.882,-643.673)"> + <title>Sheet.80</title> + <path d="M0 655.13 L0 694.06 L127.01 694.06 L127.01 655.13 L0 655.13 L0 655.13 Z" class="st16"/> + </g> + <g id="shape81-125" v:mID="81" v:groupContext="shape" transform="translate(1003.39,-660.621)"> + <title>Sheet.81</title> + <desc>pkt_len</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="48.6041" cy="680.956" width="97.21" height="26.1994"/> + <path d="M97.21 667.86 L0 667.86 L0 694.06 L97.21 694.06 L97.21 667.86" class="st8"/> + <text x="11.67" y="687.5" class="st21" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>pkt_len </text> </g> + <g id="shape82-129" v:mID="82" v:groupContext="shape" transform="translate(1001.18,-634.321)"> + <title>Sheet.82</title> + <desc>% segsz</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="49.2945" cy="680.956" width="98.59" height="26.1994"/> + <path d="M98.59 667.86 L0 667.86 L0 694.06 L98.59 694.06 L98.59 667.86" class="st8"/> + <text x="9.09" y="687.5" class="st21" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>% segsz</text> </g> + <g id="shape34-133" v:mID="34" v:groupContext="shape" v:layerMember="0" transform="translate(356.703,-264.106)"> + <title>Sheet.34</title> + <path d="M0 685.77 L90.67 685.77 L90.67 689.19 L0 689.19 L0 685.77 L0 685.77 ZM89.36 680.9 L97.21 687.48 L89.36 694.06 + L89.36 680.9 L89.36 680.9 Z" class="st2"/> + </g> + <g id="shape85-135" v:mID="85" v:groupContext="shape" v:layerMember="0" transform="translate(78.5359,-282.66)"> + <title>Sheet.85</title> + <path d="M0 680.87 C-0 673.59 6.88 667.69 15.37 667.69 C23.86 667.69 30.73 673.59 30.73 680.87 C30.73 688.15 23.86 694.06 + 15.37 694.06 C6.88 694.06 0 688.15 0 680.87 Z" class="st16"/> + </g> + <g id="shape87-137" v:mID="87" v:groupContext="shape" v:layerMember="0" transform="translate(85.4791,-284.062)"> + <title>Sheet.87</title> + <desc>1</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="8.66303" cy="683.269" width="17.33" height="21.5726"/> + <path d="M17.33 672.48 L0 672.48 L0 694.06 L17.33 694.06 L17.33 672.48" class="st8"/> + <text x="3.32" y="688.66" class="st22" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>1</text> </g> + <g id="shape88-141" v:mID="88" v:groupContext="shape" v:layerMember="0" transform="translate(468.906,-282.66)"> + <title>Sheet.88</title> + <path d="M0 680.87 C-0 673.59 6.89 667.69 15.37 667.69 C23.86 667.69 30.73 673.59 30.73 680.87 C30.73 688.15 23.86 694.06 + 15.37 694.06 C6.89 694.06 -0 688.15 0 680.87 Z" class="st16"/> + </g> + <g id="shape90-143" v:mID="90" v:groupContext="shape" v:layerMember="0" transform="translate(474.575,-284.062)"> + <title>Sheet.90</title> + <desc>2</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="8.66303" cy="683.269" width="17.33" height="21.5726"/> + <path d="M17.33 672.48 L0 672.48 L0 694.06 L17.33 694.06 L17.33 672.48" class="st8"/> + <text x="3.32" y="688.66" class="st22" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>2</text> </g> + <g id="shape95-147" v:mID="95" v:groupContext="shape" v:layerMember="0" transform="translate(764.026,-275.998)"> + <title>Sheet.95</title> + <desc>next</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="33.3635" cy="678.273" width="66.73" height="31.5648"/> + <path d="M66.73 662.49 L0 662.49 L0 694.06 L66.73 694.06 L66.73 662.49" class="st8"/> + <text x="7.56" y="686.16" class="st15" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>next</text> </g> + <g id="shape97-151" v:mID="97" v:groupContext="shape" v:layerMember="0" transform="translate(844.524,-219.79)"> + <title>Sheet.97</title> + <path d="M0 611.87 C0 602.79 5.45 595.43 12.17 595.43 L289.54 595.43 C296.31 595.43 301.71 602.79 301.71 611.87 L301.71 + 677.62 C301.71 686.76 296.31 694.06 289.54 694.06 L12.17 694.06 C5.45 694.06 0 686.76 0 677.62 L0 611.87 + Z" class="st12"/> + </g> + <g id="shape100-153" v:mID="100" v:groupContext="shape" v:layerMember="0" transform="translate(751.857,-262.528)"> + <title>Sheet.100</title> + <path d="M0 685.77 L90.67 685.77 L90.67 689.19 L0 689.19 L0 685.77 L0 685.77 ZM89.36 680.9 L97.21 687.48 L89.36 694.06 + L89.36 680.9 L89.36 680.9 Z" class="st2"/> + </g> + <g id="shape104-155" v:mID="104" v:groupContext="shape" v:layerMember="1" transform="translate(851.429,-218.08)"> + <title>Sheet.104</title> + <path d="M0 611.87 C0 602.79 5.33 595.43 11.89 595.43 L282.92 595.43 C289.53 595.43 294.8 602.79 294.8 611.87 L294.8 + 677.62 C294.8 686.76 289.53 694.06 282.92 694.06 L11.89 694.06 C5.33 694.06 0 686.76 0 677.62 L0 611.87 + Z" class="st6"/> + </g> + <g id="shape105-157" v:mID="105" v:groupContext="shape" v:layerMember="0" transform="translate(885.444,-260.015)"> + <title>Sheet.105</title> + <desc>Indirect mbuf</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="112.128" cy="675.59" width="224.26" height="36.9302"/> + <path d="M224.26 657.13 L0 657.13 L0 694.06 L224.26 694.06 L224.26 657.13" class="st8"/> + <text x="20.73" y="684.59" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Indirect mbuf</text> </g> + <g id="shape106-161" v:mID="106" v:groupContext="shape" v:layerMember="0" transform="translate(895.672,-229.419)"> + <title>Sheet.106</title> + <desc>(pointer to data)</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="100.199" cy="678.273" width="200.4" height="31.5648"/> + <path d="M200.4 662.49 L0 662.49 L0 694.06 L200.4 694.06 L200.4 662.49" class="st8"/> + <text x="12.86" y="685.47" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(pointer to data)</text> </g> + <g id="shape107-165" v:mID="107" v:groupContext="shape" v:layerMember="0" transform="translate(863.297,-280.442)"> + <title>Sheet.107</title> + <path d="M0 680.87 C-0 673.59 6.89 667.69 15.37 667.69 C23.86 667.69 30.73 673.59 30.73 680.87 C30.73 688.15 23.86 694.06 + 15.37 694.06 C6.89 694.06 -0 688.15 0 680.87 Z" class="st16"/> + </g> + <g id="shape108-167" v:mID="108" v:groupContext="shape" v:layerMember="0" transform="translate(870.001,-281.547)"> + <title>Sheet.108</title> + <desc>3</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="8.66303" cy="683.269" width="17.33" height="21.5726"/> + <path d="M17.33 672.48 L0 672.48 L0 694.06 L17.33 694.06 L17.33 672.48" class="st8"/> + <text x="3.32" y="688.66" class="st22" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>3</text> </g> + <g id="shape109-171" v:mID="109" v:groupContext="shape" v:layerMember="0" transform="translate(500.959,-231.87)"> + <title>Sheet.109</title> + <desc>(pointer to data)</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="100.199" cy="678.273" width="200.4" height="31.5648"/> + <path d="M200.4 662.49 L0 662.49 L0 694.06 L200.4 694.06 L200.4 662.49" class="st8"/> + <text x="12.86" y="685.47" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(pointer to data)</text> </g> + <g id="shape113-175" v:mID="113" v:groupContext="shape" v:layerMember="0" transform="translate(1187.64,-251.712)"> + <title>Sheet.113</title> + <desc>Three-part output segment</desc> + <v:textBlock v:margins="rect(0,0,0,0)" v:tabSpace="42.5197"/> + <v:textRect cx="327.402" cy="678.273" width="654.81" height="31.5648"/> + <path d="M654.8 662.49 L0 662.49 L0 694.06 L654.8 694.06 L654.8 662.49" class="st8"/> + <text x="0" y="686.16" class="st11" v:langID="1033"><v:paragraph/><v:tabList/>Three-part output segment</text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/hier_sched_blk.png b/src/spdk/dpdk/doc/guides/prog_guide/img/hier_sched_blk.png Binary files differnew file mode 100644 index 000000000..876d072cc --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/hier_sched_blk.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/kernel_nic_intf.png b/src/spdk/dpdk/doc/guides/prog_guide/img/kernel_nic_intf.png Binary files differnew file mode 100644 index 000000000..2408cc31f --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/kernel_nic_intf.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/kni_traffic_flow.png b/src/spdk/dpdk/doc/guides/prog_guide/img/kni_traffic_flow.png Binary files differnew file mode 100644 index 000000000..a7e749661 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/kni_traffic_flow.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/link_the_nodes.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/link_the_nodes.svg new file mode 100644 index 000000000..4a127e67c --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/link_the_nodes.svg @@ -0,0 +1,3330 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(C) 2020 Marvell International Ltd. --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + viewBox="0.0 0.0 960.0 540.0" + fill="none" + stroke="none" + stroke-linecap="square" + stroke-miterlimit="10" + id="svg1003" + sodipodi:docname="Link_the_nodes.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> + <metadata + id="metadata1009"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs1007" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="3840" + inkscape:window-height="2115" + id="namedview1005" + showgrid="false" + inkscape:zoom="1.2361274" + inkscape:cx="1097.0658" + inkscape:cy="171.4074" + inkscape:window-x="-13" + inkscape:window-y="-13" + inkscape:window-maximized="1" + inkscape:current-layer="svg1003" /> + <clipPath + id="g7c2ed6c54d_0_300.0"> + <path + d="m0 0l960.0 0l0 540.0l-960.0 0l0 -540.0z" + clip-rule="nonzero" + id="path2" /> + </clipPath> + <g + clip-path="url(#g7c2ed6c54d_0_300.0)" + id="g1001"> + <path + fill="#ffffff" + d="m0 0l960.0 0l0 540.0l-960.0 0z" + fill-rule="evenodd" + id="path5" /> + <path + fill="#ffffff" + d="m144.01245 272.68896l0 0c0 -22.062683 18.40387 -39.948013 41.1062 -39.948013l0 0c10.902039 0 21.357574 4.2088013 29.066483 11.7005005c7.708908 7.491699 12.039719 17.652634 12.039719 28.247513l0 0c0 22.062653 -18.40387 39.947998 -41.1062 39.947998l0 0c-22.702332 0 -41.1062 -17.885345 -41.1062 -39.947998z" + fill-rule="evenodd" + id="path7" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m144.01245 272.68896l0 0c0 -22.062683 18.40387 -39.948013 41.1062 -39.948013l0 0c10.902039 0 21.357574 4.2088013 29.066483 11.7005005c7.708908 7.491699 12.039719 17.652634 12.039719 28.247513l0 0c0 22.062653 -18.40387 39.947998 -41.1062 39.947998l0 0c-22.702332 0 -41.1062 -17.885345 -41.1062 -39.947998z" + fill-rule="evenodd" + id="path9" /> + <path + fill="#ffffff" + d="m159.53279 253.34254l51.164215 0l0 44.016678l-51.164215 0z" + fill-rule="evenodd" + id="path11" /> + <path + stroke="#cc0000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m159.53279 253.34254l51.164215 0l0 44.016678l-51.164215 0z" + fill-rule="evenodd" + id="path13" /> + <path + fill="#fdf8f8" + d="m201.07115 257.6069l7.535965 0l0 4.266388l-7.535965 0z" + fill-rule="evenodd" + id="path15" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m201.07115 257.6069l7.535965 0l0 4.266388l-7.535965 0z" + fill-rule="evenodd" + id="path17" /> + <path + fill="#d9ead3" + d="m166.92793 260.58737l9.485275 0l0 30.94696l-9.485275 0z" + fill-rule="evenodd" + id="path19" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m166.92793 260.58737l9.485275 0l0 30.94696l-9.485275 0z" + fill-rule="evenodd" + id="path21" /> + <path + fill="#cfe2f3" + d="m179.53246 260.58737l14.127426 0l0 17.148834l-14.127426 0z" + fill-rule="evenodd" + id="path23" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m179.53246 260.58737l14.127426 0l0 17.148834l-14.127426 0z" + fill-rule="evenodd" + id="path25" /> + <path + fill="#f4cccc" + d="m179.53246 281.622l6.511078 0l0 9.802277l-6.511078 0z" + fill-rule="evenodd" + id="path27" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m179.53246 281.622l6.511078 0l0 9.802277l-6.511078 0z" + fill-rule="evenodd" + id="path29" /> + <path + fill="#f4cccc" + d="m187.15067 281.622l6.511078 0l0 9.802277l-6.511078 0z" + fill-rule="evenodd" + id="path31" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m187.15067 281.622l6.511078 0l0 9.802277l-6.511078 0z" + fill-rule="evenodd" + id="path33" /> + <path + fill="#eeeeee" + d="m176.41716 270.24356l0.7700348 -0.77001953l0 0.38500977l1.5948944 0l0 -0.38500977l0.7700348 0.77001953l-0.7700348 0.77005005l0 -0.38500977l-1.5948944 0l0 0.38500977z" + fill-rule="evenodd" + id="path35" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m176.41716 270.24356l0.7700348 -0.77001953l0 0.38500977l1.5948944 0l0 -0.38500977l0.7700348 0.77001953l-0.7700348 0.77005005l0 -0.38500977l-1.5948944 0l0 0.38500977z" + fill-rule="evenodd" + id="path37" /> + <path + fill="#eeeeee" + d="m182.73688 278.3624l0.28134155 -0.28134155l0.28134155 0.28134155l-0.14067078 0l0 2.496643l0.14067078 0l-0.28134155 0.28134155l-0.28134155 -0.28134155l0.14067078 0l0 -2.496643z" + fill-rule="evenodd" + id="path39" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m182.73688 278.3624l0.28134155 -0.28134155l0.28134155 0.28134155l-0.14067078 0l0 2.496643l0.14067078 0l-0.28134155 0.28134155l-0.28134155 -0.28134155l0.14067078 0l0 -2.496643z" + fill-rule="evenodd" + id="path41" /> + <path + fill="#eeeeee" + d="m189.7394 278.3624l0.28134155 -0.28134155l0.28134155 0.28134155l-0.14067078 0l0 2.496643l0.14067078 0l-0.28134155 0.28134155l-0.28134155 -0.28134155l0.14067078 0l0 -2.496643z" + fill-rule="evenodd" + id="path43" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m189.7394 278.3624l0.28134155 -0.28134155l0.28134155 0.28134155l-0.14067078 0l0 2.496643l0.14067078 0l-0.28134155 0.28134155l-0.28134155 -0.28134155l0.14067078 0l0 -2.496643z" + fill-rule="evenodd" + id="path45" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m199.20312 266.6246l8.701538 0l0 3.3298645l-8.701538 0z" + fill-rule="evenodd" + id="path47" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m198.64803 291.42285c-0.6270752 0 -1.1354218 -0.56329346 -1.1354218 -1.2581482l0 -8.336975c0 -0.69485474 -0.5083313 -1.2581787 -1.1354065 -1.2581787l0 0c0.6270752 0 1.1354065 -0.56329346 1.1354065 -1.2581482l0 -8.336975l0 0c0 -0.69485474 0.50834656 -1.2581482 1.1354218 -1.2581482z" + fill-rule="evenodd" + id="path49" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m198.64803 291.42285c-0.6270752 0 -1.1354218 -0.56329346 -1.1354218 -1.2581482l0 -8.336975c0 -0.69485474 -0.5083313 -1.2581787 -1.1354065 -1.2581787l0 0c0.6270752 0 1.1354065 -0.56329346 1.1354065 -1.2581482l0 -8.336975l0 0c0 -0.69485474 0.50834656 -1.2581482 1.1354218 -1.2581482" + fill-rule="evenodd" + id="path51" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m198.64803 291.42285c-0.6270752 0 -1.1354218 -0.56329346 -1.1354218 -1.2581482l0 -8.336975c0 -0.69485474 -0.5083313 -1.2581787 -1.1354065 -1.2581787l0 0c0.6270752 0 1.1354065 -0.56329346 1.1354065 -1.2581482l0 -8.336975l0 0c0 -0.69485474 0.50834656 -1.2581482 1.1354218 -1.2581482" + fill-rule="evenodd" + id="path53" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m191.56721 277.2064l8.701538 0l0 3.3298645l-8.701538 0z" + fill-rule="evenodd" + id="path55" /> + <path + fill="#ffffff" + d="m202.08557 271.31995l4.7107086 0l0 4.264282l-4.7107086 0z" + fill-rule="evenodd" + id="path57" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m202.08557 271.31995l4.7107086 0l0 4.264282l-4.7107086 0z" + fill-rule="evenodd" + id="path59" /> + <path + fill="#ffffff" + d="m202.08557 274.8712l4.7107086 0l0 4.264282l-4.7107086 0z" + fill-rule="evenodd" + id="path61" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m202.08557 274.8712l4.7107086 0l0 4.264282l-4.7107086 0z" + fill-rule="evenodd" + id="path63" /> + <path + fill="#ffffff" + d="m202.08557 278.42242l4.7107086 0l0 4.264282l-4.7107086 0z" + fill-rule="evenodd" + id="path65" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m202.08557 278.42242l4.7107086 0l0 4.264282l-4.7107086 0z" + fill-rule="evenodd" + id="path67" /> + <path + fill="#ffffff" + d="m202.08557 281.97366l4.7107086 0l0 4.264282l-4.7107086 0z" + fill-rule="evenodd" + id="path69" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m202.08557 281.97366l4.7107086 0l0 4.264282l-4.7107086 0z" + fill-rule="evenodd" + id="path71" /> + <path + fill="#ffffff" + d="m202.08557 285.5249l4.7107086 0l0 4.2643127l-4.7107086 0z" + fill-rule="evenodd" + id="path73" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m202.08557 285.5249l4.7107086 0l0 4.2643127l-4.7107086 0z" + fill-rule="evenodd" + id="path75" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m145.16678 229.68527l73.13281 0l0 16.320053l-73.13281 0z" + fill-rule="evenodd" + id="path77" /> + <path + fill="#000000" + d="m164.66463 247.24533l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5827484 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.895233 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.54685974 -0.375 -0.85935974 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.82810974 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.9531097 -2.75q0 1.046875 0.43748474 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.42185974 0.5 -0.42185974 1.609375zm9.082733 0.96875l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm8.184021 3.296875l0 -5.53125l0.84375 0l0 0.78125q0.25 -0.40625 0.6875 -0.65625q0.4375 -0.25 0.984375 -0.25q0.609375 0 1.0 0.265625q0.390625 0.25 0.5625 0.703125q0.65625 -0.96875 1.703125 -0.96875q0.828125 0 1.265625 0.46875q0.4375 0.453125 0.4375 1.390625l0 3.796875l-0.921875 0l0 -3.484375q0 -0.5625 -0.09375 -0.796875q-0.09375 -0.25 -0.34375 -0.40625q-0.234375 -0.15625 -0.546875 -0.15625q-0.59375 0 -0.984375 0.390625q-0.375 0.390625 -0.375 1.25l0 3.203125l-0.9375 0l0 -3.59375q0 -0.625 -0.234375 -0.9375q-0.21875 -0.3125 -0.75 -0.3125q-0.390625 0 -0.734375 0.21875q-0.328125 0.203125 -0.484375 0.609375q-0.140625 0.390625 -0.140625 1.15625l0 2.859375l-0.9375 0z" + fill-rule="nonzero" + id="path79" /> + <path + fill="#ffffff" + d="m264.01245 192.69371l0 0c0 -22.065292 18.40216 -39.95276 41.102356 -39.95276l0 0c10.9010315 0 21.35559 4.209305 29.063751 11.701889c7.708191 7.4925995 12.038605 17.65474 12.038605 28.25087l0 0c0 22.065292 -18.40213 39.95276 -41.102356 39.95276l0 0c-22.700195 0 -41.102356 -17.887466 -41.102356 -39.95276z" + fill-rule="evenodd" + id="path81" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m264.01245 192.69371l0 0c0 -22.065292 18.40216 -39.95276 41.102356 -39.95276l0 0c10.9010315 0 21.35559 4.209305 29.063751 11.701889c7.708191 7.4925995 12.038605 17.65474 12.038605 28.25087l0 0c0 22.065292 -18.40213 39.95276 -41.102356 39.95276l0 0c-22.700195 0 -41.102356 -17.887466 -41.102356 -39.95276z" + fill-rule="evenodd" + id="path83" /> + <path + fill="#ffffff" + d="m279.49722 173.34494l51.160553 0l0 44.018646l-51.160553 0z" + fill-rule="evenodd" + id="path85" /> + <path + stroke="#cc0000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m279.49722 173.34494l51.160553 0l0 44.018646l-51.160553 0z" + fill-rule="evenodd" + id="path87" /> + <path + fill="#fdf8f8" + d="m321.03262 177.6095l7.535431 0l0 4.2665863l-7.535431 0z" + fill-rule="evenodd" + id="path89" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m321.03262 177.6095l7.535431 0l0 4.2665863l-7.535431 0z" + fill-rule="evenodd" + id="path91" /> + <path + fill="#d9ead3" + d="m286.89185 180.5901l9.484589 0l0 30.948334l-9.484589 0z" + fill-rule="evenodd" + id="path93" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m286.89185 180.5901l9.484589 0l0 30.948334l-9.484589 0z" + fill-rule="evenodd" + id="path95" /> + <path + fill="#cfe2f3" + d="m299.49545 180.5901l14.126434 0l0 17.149582l-14.126434 0z" + fill-rule="evenodd" + id="path97" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m299.49545 180.5901l14.126434 0l0 17.149582l-14.126434 0z" + fill-rule="evenodd" + id="path99" /> + <path + fill="#f4cccc" + d="m299.49545 201.62566l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path101" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m299.49545 201.62566l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path103" /> + <path + fill="#f4cccc" + d="m307.11313 201.62566l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path105" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m307.11313 201.62566l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path107" /> + <path + fill="#eeeeee" + d="m296.3804 190.24673l0.77005005 -0.7700653l0 0.38502502l1.5946045 0l0 -0.38502502l0.77008057 0.7700653l-0.77008057 0.7700653l0 -0.38504028l-1.5946045 0l0 0.38504028z" + fill-rule="evenodd" + id="path109" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m296.3804 190.24673l0.77005005 -0.7700653l0 0.38502502l1.5946045 0l0 -0.38502502l0.77008057 0.7700653l-0.77008057 0.7700653l0 -0.38504028l-1.5946045 0l0 0.38504028z" + fill-rule="evenodd" + id="path111" /> + <path + fill="#eeeeee" + d="m302.69965 198.36589l0.28134155 -0.2813263l0.28131104 0.2813263l-0.14065552 0l0 2.496811l0.14065552 0l-0.28131104 0.2813263l-0.28134155 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path113" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m302.69965 198.36589l0.28134155 -0.2813263l0.28131104 0.2813263l-0.14065552 0l0 2.496811l0.14065552 0l-0.28131104 0.2813263l-0.28134155 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path115" /> + <path + fill="#eeeeee" + d="m309.70166 198.36589l0.28134155 -0.2813263l0.28131104 0.2813263l-0.14065552 0l0 2.496811l0.14065552 0l-0.28131104 0.2813263l-0.28134155 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path117" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m309.70166 198.36589l0.28134155 -0.2813263l0.28131104 0.2813263l-0.14065552 0l0 2.496811l0.14065552 0l-0.28131104 0.2813263l-0.28134155 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path119" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m319.16473 186.6276l8.700897 0l0 3.330017l-8.700897 0z" + fill-rule="evenodd" + id="path121" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m318.60968 211.42694c-0.6270447 0 -1.1353455 -0.5632477 -1.1353455 -1.2580566l0 -8.337631c0 -0.6948242 -0.5083008 -1.2580719 -1.1353455 -1.2580719l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580719l0 -8.337631l0 0c0 -0.69480896 0.5083008 -1.2580719 1.1353455 -1.2580719z" + fill-rule="evenodd" + id="path123" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m318.60968 211.42694c-0.6270447 0 -1.1353455 -0.5632477 -1.1353455 -1.2580566l0 -8.337631c0 -0.6948242 -0.5083008 -1.2580719 -1.1353455 -1.2580719l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580719l0 -8.337631l0 0c0 -0.69480896 0.5083008 -1.2580719 1.1353455 -1.2580719" + fill-rule="evenodd" + id="path125" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m318.60968 211.42694c-0.6270447 0 -1.1353455 -0.5632477 -1.1353455 -1.2580566l0 -8.337631c0 -0.6948242 -0.5083008 -1.2580719 -1.1353455 -1.2580719l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580719l0 -8.337631l0 0c0 -0.69480896 0.5083008 -1.2580719 1.1353455 -1.2580719" + fill-rule="evenodd" + id="path127" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m311.52936 197.20987l8.700928 0l0 3.3300018l-8.700928 0z" + fill-rule="evenodd" + id="path129" /> + <path + fill="#ffffff" + d="m322.04697 191.32314l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path131" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m322.04697 191.32314l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path133" /> + <path + fill="#ffffff" + d="m322.04697 194.87454l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path135" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m322.04697 194.87454l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path137" /> + <path + fill="#ffffff" + d="m322.04697 198.42595l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path139" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m322.04697 198.42595l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path141" /> + <path + fill="#ffffff" + d="m322.04697 201.97734l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path143" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m322.04697 201.97734l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path145" /> + <path + fill="#ffffff" + d="m322.04697 205.52875l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path147" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m322.04697 205.52875l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path149" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m265.16678 149.68527l73.13385 0l0 16.314972l-73.13385 0z" + fill-rule="evenodd" + id="path151" /> + <path + fill="#000000" + d="m286.14026 167.24023l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5827637 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.895233 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.546875 -0.375 -0.859375 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.828125 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.953125 -2.75q0 1.046875 0.4375 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.421875 0.5 -0.421875 1.609375zm9.082764 0.96875l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm8.184021 3.296875l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0z" + fill-rule="nonzero" + id="path153" /> + <path + fill="#ffffff" + d="m264.01245 352.69373l0 0c0 -22.065308 18.40216 -39.95276 41.102356 -39.95276l0 0c10.9010315 0 21.35559 4.2092896 29.063751 11.701874c7.708191 7.4926147 12.038605 17.654755 12.038605 28.250885l0 0c0 22.065277 -18.40213 39.95273 -41.102356 39.95273l0 0c-22.700195 0 -41.102356 -17.887451 -41.102356 -39.95273z" + fill-rule="evenodd" + id="path155" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m264.01245 352.69373l0 0c0 -22.065308 18.40216 -39.95276 41.102356 -39.95276l0 0c10.9010315 0 21.35559 4.2092896 29.063751 11.701874c7.708191 7.4926147 12.038605 17.654755 12.038605 28.250885l0 0c0 22.065277 -18.40213 39.95273 -41.102356 39.95273l0 0c-22.700195 0 -41.102356 -17.887451 -41.102356 -39.95273z" + fill-rule="evenodd" + id="path157" /> + <path + fill="#ffffff" + d="m279.49722 333.34494l51.160553 0l0 44.018646l-51.160553 0z" + fill-rule="evenodd" + id="path159" /> + <path + stroke="#cc0000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m279.49722 333.34494l51.160553 0l0 44.018646l-51.160553 0z" + fill-rule="evenodd" + id="path161" /> + <path + fill="#fdf8f8" + d="m321.03262 337.6095l7.535431 0l0 4.266571l-7.535431 0z" + fill-rule="evenodd" + id="path163" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m321.03262 337.6095l7.535431 0l0 4.266571l-7.535431 0z" + fill-rule="evenodd" + id="path165" /> + <path + fill="#d9ead3" + d="m286.89185 340.59012l9.484589 0l0 30.948334l-9.484589 0z" + fill-rule="evenodd" + id="path167" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m286.89185 340.59012l9.484589 0l0 30.948334l-9.484589 0z" + fill-rule="evenodd" + id="path169" /> + <path + fill="#cfe2f3" + d="m299.49545 340.59012l14.126434 0l0 17.149567l-14.126434 0z" + fill-rule="evenodd" + id="path171" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m299.49545 340.59012l14.126434 0l0 17.149567l-14.126434 0z" + fill-rule="evenodd" + id="path173" /> + <path + fill="#f4cccc" + d="m299.49545 361.62564l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path175" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m299.49545 361.62564l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path177" /> + <path + fill="#f4cccc" + d="m307.11313 361.62564l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path179" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m307.11313 361.62564l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path181" /> + <path + fill="#eeeeee" + d="m296.3804 350.24673l0.77005005 -0.77008057l0 0.38504028l1.5946045 0l0 -0.38504028l0.77008057 0.77008057l-0.77008057 0.77005005l0 -0.38500977l-1.5946045 0l0 0.38500977z" + fill-rule="evenodd" + id="path183" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m296.3804 350.24673l0.77005005 -0.77008057l0 0.38504028l1.5946045 0l0 -0.38504028l0.77008057 0.77008057l-0.77008057 0.77005005l0 -0.38500977l-1.5946045 0l0 0.38500977z" + fill-rule="evenodd" + id="path185" /> + <path + fill="#eeeeee" + d="m302.69965 358.3659l0.28134155 -0.28134155l0.28131104 0.28134155l-0.14065552 0l0 2.4967957l0.14065552 0l-0.28131104 0.28131104l-0.28134155 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path187" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m302.69965 358.3659l0.28134155 -0.28134155l0.28131104 0.28134155l-0.14065552 0l0 2.4967957l0.14065552 0l-0.28131104 0.28131104l-0.28134155 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path189" /> + <path + fill="#eeeeee" + d="m309.70166 358.3659l0.28134155 -0.28134155l0.28131104 0.28134155l-0.14065552 0l0 2.4967957l0.14065552 0l-0.28131104 0.28131104l-0.28134155 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path191" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m309.70166 358.3659l0.28134155 -0.28134155l0.28131104 0.28134155l-0.14065552 0l0 2.4967957l0.14065552 0l-0.28131104 0.28131104l-0.28134155 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path193" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m319.16473 346.6276l8.700897 0l0 3.330017l-8.700897 0z" + fill-rule="evenodd" + id="path195" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m318.60968 371.42694c-0.6270447 0 -1.1353455 -0.56326294 -1.1353455 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.1353455 -1.2580566l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083008 -1.2580566 1.1353455 -1.2580566z" + fill-rule="evenodd" + id="path197" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m318.60968 371.42694c-0.6270447 0 -1.1353455 -0.56326294 -1.1353455 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.1353455 -1.2580566l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083008 -1.2580566 1.1353455 -1.2580566" + fill-rule="evenodd" + id="path199" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m318.60968 371.42694c-0.6270447 0 -1.1353455 -0.56326294 -1.1353455 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.1353455 -1.2580566l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083008 -1.2580566 1.1353455 -1.2580566" + fill-rule="evenodd" + id="path201" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m311.52936 357.20987l8.700928 0l0 3.330017l-8.700928 0z" + fill-rule="evenodd" + id="path203" /> + <path + fill="#ffffff" + d="m322.04697 351.32315l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path205" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m322.04697 351.32315l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path207" /> + <path + fill="#ffffff" + d="m322.04697 354.87454l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path209" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m322.04697 354.87454l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path211" /> + <path + fill="#ffffff" + d="m322.04697 358.42593l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path213" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m322.04697 358.42593l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path215" /> + <path + fill="#ffffff" + d="m322.04697 361.97736l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path217" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m322.04697 361.97736l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path219" /> + <path + fill="#ffffff" + d="m322.04697 365.52875l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path221" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m322.04697 365.52875l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path223" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m265.16678 309.68527l73.13385 0l0 16.314972l-73.13385 0z" + fill-rule="evenodd" + id="path225" /> + <path + fill="#000000" + d="m286.14026 327.24023l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5827637 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.895233 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.546875 -0.375 -0.859375 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.828125 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.953125 -2.75q0 1.046875 0.4375 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.421875 0.5 -0.421875 1.609375zm9.082764 0.96875l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm7.840271 0.53125q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125z" + fill-rule="nonzero" + id="path227" /> + <path + fill="#ffffff" + d="m384.01245 448.69373l0 0c0 -22.065308 18.40216 -39.95276 41.102356 -39.95276l0 0c10.9010315 0 21.35559 4.2092896 29.063751 11.701874c7.708191 7.4926147 12.038605 17.654755 12.038605 28.250885l0 0c0 22.065277 -18.40213 39.95273 -41.102356 39.95273l0 0c-22.700195 0 -41.102356 -17.887451 -41.102356 -39.95273z" + fill-rule="evenodd" + id="path229" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m384.01245 448.69373l0 0c0 -22.065308 18.40216 -39.95276 41.102356 -39.95276l0 0c10.9010315 0 21.35559 4.2092896 29.063751 11.701874c7.708191 7.4926147 12.038605 17.654755 12.038605 28.250885l0 0c0 22.065277 -18.40213 39.95273 -41.102356 39.95273l0 0c-22.700195 0 -41.102356 -17.887451 -41.102356 -39.95273z" + fill-rule="evenodd" + id="path231" /> + <path + fill="#ffffff" + d="m399.49722 429.34494l51.160553 0l0 44.018646l-51.160553 0z" + fill-rule="evenodd" + id="path233" /> + <path + stroke="#cc0000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m399.49722 429.34494l51.160553 0l0 44.018646l-51.160553 0z" + fill-rule="evenodd" + id="path235" /> + <path + fill="#fdf8f8" + d="m441.03262 433.6095l7.535431 0l0 4.266571l-7.535431 0z" + fill-rule="evenodd" + id="path237" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m441.03262 433.6095l7.535431 0l0 4.266571l-7.535431 0z" + fill-rule="evenodd" + id="path239" /> + <path + fill="#d9ead3" + d="m406.89185 436.59012l9.484589 0l0 30.948334l-9.484589 0z" + fill-rule="evenodd" + id="path241" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m406.89185 436.59012l9.484589 0l0 30.948334l-9.484589 0z" + fill-rule="evenodd" + id="path243" /> + <path + fill="#cfe2f3" + d="m419.49545 436.59012l14.126434 0l0 17.149567l-14.126434 0z" + fill-rule="evenodd" + id="path245" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m419.49545 436.59012l14.126434 0l0 17.149567l-14.126434 0z" + fill-rule="evenodd" + id="path247" /> + <path + fill="#f4cccc" + d="m419.49545 457.62564l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path249" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m419.49545 457.62564l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path251" /> + <path + fill="#f4cccc" + d="m427.11313 457.62564l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path253" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m427.11313 457.62564l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path255" /> + <path + fill="#eeeeee" + d="m416.3804 446.24673l0.77005005 -0.77008057l0 0.38504028l1.5946045 0l0 -0.38504028l0.77008057 0.77008057l-0.77008057 0.77005005l0 -0.38500977l-1.5946045 0l0 0.38500977z" + fill-rule="evenodd" + id="path257" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m416.3804 446.24673l0.77005005 -0.77008057l0 0.38504028l1.5946045 0l0 -0.38504028l0.77008057 0.77008057l-0.77008057 0.77005005l0 -0.38500977l-1.5946045 0l0 0.38500977z" + fill-rule="evenodd" + id="path259" /> + <path + fill="#eeeeee" + d="m422.69965 454.3659l0.28134155 -0.28134155l0.28131104 0.28134155l-0.14065552 0l0 2.4967957l0.14065552 0l-0.28131104 0.28131104l-0.28134155 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path261" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m422.69965 454.3659l0.28134155 -0.28134155l0.28131104 0.28134155l-0.14065552 0l0 2.4967957l0.14065552 0l-0.28131104 0.28131104l-0.28134155 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path263" /> + <path + fill="#eeeeee" + d="m429.70166 454.3659l0.28134155 -0.28134155l0.28131104 0.28134155l-0.14065552 0l0 2.4967957l0.14065552 0l-0.28131104 0.28131104l-0.28134155 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path265" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m429.70166 454.3659l0.28134155 -0.28134155l0.28131104 0.28134155l-0.14065552 0l0 2.4967957l0.14065552 0l-0.28131104 0.28131104l-0.28134155 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path267" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m439.16473 442.6276l8.700897 0l0 3.330017l-8.700897 0z" + fill-rule="evenodd" + id="path269" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m438.60968 467.42694c-0.6270447 0 -1.1353455 -0.56326294 -1.1353455 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.1353455 -1.2580566l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083008 -1.2580566 1.1353455 -1.2580566z" + fill-rule="evenodd" + id="path271" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m438.60968 467.42694c-0.6270447 0 -1.1353455 -0.56326294 -1.1353455 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.1353455 -1.2580566l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083008 -1.2580566 1.1353455 -1.2580566" + fill-rule="evenodd" + id="path273" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m438.60968 467.42694c-0.6270447 0 -1.1353455 -0.56326294 -1.1353455 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.1353455 -1.2580566l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083008 -1.2580566 1.1353455 -1.2580566" + fill-rule="evenodd" + id="path275" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m431.52936 453.20987l8.700928 0l0 3.330017l-8.700928 0z" + fill-rule="evenodd" + id="path277" /> + <path + fill="#ffffff" + d="m442.04697 447.32315l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path279" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m442.04697 447.32315l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path281" /> + <path + fill="#ffffff" + d="m442.04697 450.87454l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path283" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m442.04697 450.87454l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path285" /> + <path + fill="#ffffff" + d="m442.04697 454.42593l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path287" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m442.04697 454.42593l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path289" /> + <path + fill="#ffffff" + d="m442.04697 457.97736l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path291" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m442.04697 457.97736l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path293" /> + <path + fill="#ffffff" + d="m442.04697 461.52875l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path295" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m442.04697 461.52875l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path297" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m385.16678 405.68527l73.13385 0l0 16.314972l-73.13385 0z" + fill-rule="evenodd" + id="path299" /> + <path + fill="#000000" + d="m406.43945 423.24023l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5827637 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.895233 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.546875 -0.375 -0.859375 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.828125 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.953125 -2.75q0 1.046875 0.4375 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.421875 0.5 -0.421875 1.609375zm9.082764 0.96875l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm7.809021 1.640625l0.921875 -0.140625q0.078125 0.5625 0.4375 0.859375q0.359375 0.296875 1.0 0.296875q0.640625 0 0.953125 -0.265625q0.3125 -0.265625 0.3125 -0.625q0 -0.3125 -0.28125 -0.5q-0.1875 -0.125 -0.953125 -0.3125q-1.03125 -0.265625 -1.4375 -0.453125q-0.390625 -0.1875 -0.59375 -0.515625q-0.203125 -0.34375 -0.203125 -0.75q0 -0.359375 0.171875 -0.671875q0.171875 -0.328125 0.453125 -0.53125q0.21875 -0.15625 0.59375 -0.265625q0.390625 -0.125 0.8125 -0.125q0.65625 0 1.140625 0.1875q0.5 0.1875 0.734375 0.515625q0.234375 0.3125 0.3125 0.859375l-0.90625 0.125q-0.0625 -0.4375 -0.375 -0.671875q-0.296875 -0.234375 -0.828125 -0.234375q-0.65625 0 -0.9375 0.21875q-0.265625 0.203125 -0.265625 0.484375q0 0.1875 0.109375 0.328125q0.125 0.15625 0.359375 0.25q0.140625 0.0625 0.828125 0.25q1.0 0.265625 1.390625 0.4375q0.390625 0.15625 0.609375 0.484375q0.234375 0.3125 0.234375 0.796875q0 0.46875 -0.28125 0.890625q-0.265625 0.40625 -0.78125 0.640625q-0.515625 0.21875 -1.171875 0.21875q-1.078125 0 -1.640625 -0.4375q-0.5625 -0.453125 -0.71875 -1.34375z" + fill-rule="nonzero" + id="path301" /> + <path + fill="#ffffff" + d="m384.01245 320.69373l0 0c0 -22.065308 18.40216 -39.95276 41.102356 -39.95276l0 0c10.9010315 0 21.35559 4.2092896 29.063751 11.701874c7.708191 7.4926147 12.038605 17.654755 12.038605 28.250885l0 0c0 22.065277 -18.40213 39.95273 -41.102356 39.95273l0 0c-22.700195 0 -41.102356 -17.887451 -41.102356 -39.95273z" + fill-rule="evenodd" + id="path303" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m384.01245 320.69373l0 0c0 -22.065308 18.40216 -39.95276 41.102356 -39.95276l0 0c10.9010315 0 21.35559 4.2092896 29.063751 11.701874c7.708191 7.4926147 12.038605 17.654755 12.038605 28.250885l0 0c0 22.065277 -18.40213 39.95273 -41.102356 39.95273l0 0c-22.700195 0 -41.102356 -17.887451 -41.102356 -39.95273z" + fill-rule="evenodd" + id="path305" /> + <path + fill="#ffffff" + d="m399.49722 301.34494l51.160553 0l0 44.018646l-51.160553 0z" + fill-rule="evenodd" + id="path307" /> + <path + stroke="#cc0000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m399.49722 301.34494l51.160553 0l0 44.018646l-51.160553 0z" + fill-rule="evenodd" + id="path309" /> + <path + fill="#fdf8f8" + d="m441.03262 305.6095l7.535431 0l0 4.266571l-7.535431 0z" + fill-rule="evenodd" + id="path311" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m441.03262 305.6095l7.535431 0l0 4.266571l-7.535431 0z" + fill-rule="evenodd" + id="path313" /> + <path + fill="#d9ead3" + d="m406.89185 308.59012l9.484589 0l0 30.948334l-9.484589 0z" + fill-rule="evenodd" + id="path315" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m406.89185 308.59012l9.484589 0l0 30.948334l-9.484589 0z" + fill-rule="evenodd" + id="path317" /> + <path + fill="#cfe2f3" + d="m419.49545 308.59012l14.126434 0l0 17.149567l-14.126434 0z" + fill-rule="evenodd" + id="path319" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m419.49545 308.59012l14.126434 0l0 17.149567l-14.126434 0z" + fill-rule="evenodd" + id="path321" /> + <path + fill="#f4cccc" + d="m419.49545 329.62564l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path323" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m419.49545 329.62564l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path325" /> + <path + fill="#f4cccc" + d="m427.11313 329.62564l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path327" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m427.11313 329.62564l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path329" /> + <path + fill="#eeeeee" + d="m416.3804 318.24673l0.77005005 -0.77008057l0 0.38504028l1.5946045 0l0 -0.38504028l0.77008057 0.77008057l-0.77008057 0.77005005l0 -0.38500977l-1.5946045 0l0 0.38500977z" + fill-rule="evenodd" + id="path331" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m416.3804 318.24673l0.77005005 -0.77008057l0 0.38504028l1.5946045 0l0 -0.38504028l0.77008057 0.77008057l-0.77008057 0.77005005l0 -0.38500977l-1.5946045 0l0 0.38500977z" + fill-rule="evenodd" + id="path333" /> + <path + fill="#eeeeee" + d="m422.69965 326.3659l0.28134155 -0.28134155l0.28131104 0.28134155l-0.14065552 0l0 2.4967957l0.14065552 0l-0.28131104 0.28131104l-0.28134155 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path335" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m422.69965 326.3659l0.28134155 -0.28134155l0.28131104 0.28134155l-0.14065552 0l0 2.4967957l0.14065552 0l-0.28131104 0.28131104l-0.28134155 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path337" /> + <path + fill="#eeeeee" + d="m429.70166 326.3659l0.28134155 -0.28134155l0.28131104 0.28134155l-0.14065552 0l0 2.4967957l0.14065552 0l-0.28131104 0.28131104l-0.28134155 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path339" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m429.70166 326.3659l0.28134155 -0.28134155l0.28131104 0.28134155l-0.14065552 0l0 2.4967957l0.14065552 0l-0.28131104 0.28131104l-0.28134155 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path341" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m439.16473 314.6276l8.700897 0l0 3.330017l-8.700897 0z" + fill-rule="evenodd" + id="path343" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m438.60968 339.42694c-0.6270447 0 -1.1353455 -0.56326294 -1.1353455 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.1353455 -1.2580566l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083008 -1.2580566 1.1353455 -1.2580566z" + fill-rule="evenodd" + id="path345" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m438.60968 339.42694c-0.6270447 0 -1.1353455 -0.56326294 -1.1353455 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.1353455 -1.2580566l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083008 -1.2580566 1.1353455 -1.2580566" + fill-rule="evenodd" + id="path347" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m438.60968 339.42694c-0.6270447 0 -1.1353455 -0.56326294 -1.1353455 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.1353455 -1.2580566l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083008 -1.2580566 1.1353455 -1.2580566" + fill-rule="evenodd" + id="path349" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m431.52936 325.20987l8.700928 0l0 3.330017l-8.700928 0z" + fill-rule="evenodd" + id="path351" /> + <path + fill="#ffffff" + d="m442.04697 319.32315l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path353" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m442.04697 319.32315l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path355" /> + <path + fill="#ffffff" + d="m442.04697 322.87454l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path357" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m442.04697 322.87454l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path359" /> + <path + fill="#ffffff" + d="m442.04697 326.42593l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path361" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m442.04697 326.42593l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path363" /> + <path + fill="#ffffff" + d="m442.04697 329.97736l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path365" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m442.04697 329.97736l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path367" /> + <path + fill="#ffffff" + d="m442.04697 333.52875l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path369" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m442.04697 333.52875l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path371" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m385.16678 277.68527l73.13385 0l0 16.314972l-73.13385 0z" + fill-rule="evenodd" + id="path373" /> + <path + fill="#000000" + d="m407.32922 295.24023l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.582733 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.895264 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.546875 -0.375 -0.859375 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.828125 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.953125 -2.75q0 1.046875 0.4375 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.421875 0.5 -0.421875 1.609375zm9.082733 0.96875l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm8.168396 3.296875l0 -5.53125l0.84375 0l0 0.84375q0.328125 -0.59375 0.59375 -0.78125q0.28125 -0.1875 0.609375 -0.1875q0.46875 0 0.953125 0.3125l-0.3125 0.859375q-0.34375 -0.203125 -0.6875 -0.203125q-0.3125 0 -0.5625 0.1875q-0.234375 0.1875 -0.34375 0.515625q-0.15625 0.5 -0.15625 1.09375l0 2.890625l-0.9375 0z" + fill-rule="nonzero" + id="path375" /> + <path + fill="#ffffff" + d="m392.01245 216.69371l0 0c0 -22.065292 18.40216 -39.95276 41.102356 -39.95276l0 0c10.9010315 0 21.35559 4.209305 29.063751 11.701889c7.708191 7.4925995 12.038605 17.65474 12.038605 28.25087l0 0c0 22.065292 -18.40213 39.952744 -41.102356 39.952744l0 0c-22.700195 0 -41.102356 -17.887451 -41.102356 -39.952744z" + fill-rule="evenodd" + id="path377" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m392.01245 216.69371l0 0c0 -22.065292 18.40216 -39.95276 41.102356 -39.95276l0 0c10.9010315 0 21.35559 4.209305 29.063751 11.701889c7.708191 7.4925995 12.038605 17.65474 12.038605 28.25087l0 0c0 22.065292 -18.40213 39.952744 -41.102356 39.952744l0 0c-22.700195 0 -41.102356 -17.887451 -41.102356 -39.952744z" + fill-rule="evenodd" + id="path379" /> + <path + fill="#ffffff" + d="m407.49722 197.34494l51.160553 0l0 44.018646l-51.160553 0z" + fill-rule="evenodd" + id="path381" /> + <path + stroke="#cc0000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m407.49722 197.34494l51.160553 0l0 44.018646l-51.160553 0z" + fill-rule="evenodd" + id="path383" /> + <path + fill="#fdf8f8" + d="m449.03262 201.6095l7.535431 0l0 4.2665863l-7.535431 0z" + fill-rule="evenodd" + id="path385" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m449.03262 201.6095l7.535431 0l0 4.2665863l-7.535431 0z" + fill-rule="evenodd" + id="path387" /> + <path + fill="#d9ead3" + d="m414.89185 204.5901l9.484589 0l0 30.948334l-9.484589 0z" + fill-rule="evenodd" + id="path389" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m414.89185 204.5901l9.484589 0l0 30.948334l-9.484589 0z" + fill-rule="evenodd" + id="path391" /> + <path + fill="#cfe2f3" + d="m427.49545 204.5901l14.126434 0l0 17.149582l-14.126434 0z" + fill-rule="evenodd" + id="path393" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m427.49545 204.5901l14.126434 0l0 17.149582l-14.126434 0z" + fill-rule="evenodd" + id="path395" /> + <path + fill="#f4cccc" + d="m427.49545 225.62566l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path397" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m427.49545 225.62566l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path399" /> + <path + fill="#f4cccc" + d="m435.11313 225.62566l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path401" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m435.11313 225.62566l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path403" /> + <path + fill="#eeeeee" + d="m424.3804 214.24673l0.77005005 -0.7700653l0 0.38502502l1.5946045 0l0 -0.38502502l0.77008057 0.7700653l-0.77008057 0.7700653l0 -0.38504028l-1.5946045 0l0 0.38504028z" + fill-rule="evenodd" + id="path405" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m424.3804 214.24673l0.77005005 -0.7700653l0 0.38502502l1.5946045 0l0 -0.38502502l0.77008057 0.7700653l-0.77008057 0.7700653l0 -0.38504028l-1.5946045 0l0 0.38504028z" + fill-rule="evenodd" + id="path407" /> + <path + fill="#eeeeee" + d="m430.69965 222.36589l0.28134155 -0.2813263l0.28131104 0.2813263l-0.14065552 0l0 2.496811l0.14065552 0l-0.28131104 0.2813263l-0.28134155 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path409" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m430.69965 222.36589l0.28134155 -0.2813263l0.28131104 0.2813263l-0.14065552 0l0 2.496811l0.14065552 0l-0.28131104 0.2813263l-0.28134155 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path411" /> + <path + fill="#eeeeee" + d="m437.70166 222.36589l0.28134155 -0.2813263l0.28131104 0.2813263l-0.14065552 0l0 2.496811l0.14065552 0l-0.28131104 0.2813263l-0.28134155 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path413" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m437.70166 222.36589l0.28134155 -0.2813263l0.28131104 0.2813263l-0.14065552 0l0 2.496811l0.14065552 0l-0.28131104 0.2813263l-0.28134155 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path415" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m447.16473 210.6276l8.700897 0l0 3.330017l-8.700897 0z" + fill-rule="evenodd" + id="path417" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m446.60968 235.42694c-0.6270447 0 -1.1353455 -0.5632477 -1.1353455 -1.2580566l0 -8.337631c0 -0.6948242 -0.5083008 -1.2580719 -1.1353455 -1.2580719l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580719l0 -8.337631l0 0c0 -0.69480896 0.5083008 -1.2580719 1.1353455 -1.2580719z" + fill-rule="evenodd" + id="path419" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m446.60968 235.42694c-0.6270447 0 -1.1353455 -0.5632477 -1.1353455 -1.2580566l0 -8.337631c0 -0.6948242 -0.5083008 -1.2580719 -1.1353455 -1.2580719l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580719l0 -8.337631l0 0c0 -0.69480896 0.5083008 -1.2580719 1.1353455 -1.2580719" + fill-rule="evenodd" + id="path421" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m446.60968 235.42694c-0.6270447 0 -1.1353455 -0.5632477 -1.1353455 -1.2580566l0 -8.337631c0 -0.6948242 -0.5083008 -1.2580719 -1.1353455 -1.2580719l0 0c0.6270447 0 1.1353455 -0.56326294 1.1353455 -1.2580719l0 -8.337631l0 0c0 -0.69480896 0.5083008 -1.2580719 1.1353455 -1.2580719" + fill-rule="evenodd" + id="path423" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m439.52936 221.20987l8.700928 0l0 3.3300018l-8.700928 0z" + fill-rule="evenodd" + id="path425" /> + <path + fill="#ffffff" + d="m450.04697 215.32314l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path427" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m450.04697 215.32314l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path429" /> + <path + fill="#ffffff" + d="m450.04697 218.87454l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path431" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m450.04697 218.87454l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path433" /> + <path + fill="#ffffff" + d="m450.04697 222.42595l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path435" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m450.04697 222.42595l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path437" /> + <path + fill="#ffffff" + d="m450.04697 225.97734l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path439" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m450.04697 225.97734l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path441" /> + <path + fill="#ffffff" + d="m450.04697 229.52875l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path443" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m450.04697 229.52875l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path445" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m393.16678 173.68527l73.13385 0l0 16.314972l-73.13385 0z" + fill-rule="evenodd" + id="path447" /> + <path + fill="#000000" + d="m414.14026 191.24023l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5827637 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.895233 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.546875 -0.375 -0.859375 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.828125 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.953125 -2.75q0 1.046875 0.4375 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.421875 0.5 -0.421875 1.609375zm9.082764 0.96875l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm11.699646 5.421875l0 -2.71875q-0.21875 0.3125 -0.609375 0.515625q-0.390625 0.203125 -0.828125 0.203125q-0.984375 0 -1.703125 -0.78125q-0.703125 -0.796875 -0.703125 -2.15625q0 -0.828125 0.28125 -1.484375q0.296875 -0.671875 0.84375 -1.015625q0.546875 -0.34375 1.203125 -0.34375q1.03125 0 1.609375 0.875l0 -0.75l0.84375 0l0 7.65625l-0.9375 0zm-2.875 -4.90625q0 1.0625 0.4375 1.609375q0.453125 0.53125 1.078125 0.53125q0.59375 0 1.015625 -0.5q0.4375 -0.515625 0.4375 -1.546875q0 -1.109375 -0.453125 -1.65625q-0.453125 -0.5625 -1.0625 -0.5625q-0.609375 0 -1.03125 0.515625q-0.421875 0.515625 -0.421875 1.609375z" + fill-rule="nonzero" + id="path449" /> + <path + fill="#ffffff" + d="m392.01245 112.69371l0 0c0 -22.0653 18.40216 -39.95276 41.102356 -39.95276l0 0c10.9010315 0 21.35559 4.209297 29.063751 11.701897c7.708191 7.492592 12.038605 17.654732 12.038605 28.250862l0 0c0 22.065292 -18.40213 39.95276 -41.102356 39.95276l0 0c-22.700195 0 -41.102356 -17.887466 -41.102356 -39.95276z" + fill-rule="evenodd" + id="path451" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m392.01245 112.69371l0 0c0 -22.0653 18.40216 -39.95276 41.102356 -39.95276l0 0c10.9010315 0 21.35559 4.209297 29.063751 11.701897c7.708191 7.492592 12.038605 17.654732 12.038605 28.250862l0 0c0 22.065292 -18.40213 39.95276 -41.102356 39.95276l0 0c-22.700195 0 -41.102356 -17.887466 -41.102356 -39.95276z" + fill-rule="evenodd" + id="path453" /> + <path + fill="#ffffff" + d="m407.49722 93.34494l51.160553 0l0 44.018646l-51.160553 0z" + fill-rule="evenodd" + id="path455" /> + <path + stroke="#cc0000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m407.49722 93.34494l51.160553 0l0 44.018646l-51.160553 0z" + fill-rule="evenodd" + id="path457" /> + <path + fill="#fdf8f8" + d="m449.03262 97.6095l7.535431 0l0 4.2665787l-7.535431 0z" + fill-rule="evenodd" + id="path459" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m449.03262 97.6095l7.535431 0l0 4.2665787l-7.535431 0z" + fill-rule="evenodd" + id="path461" /> + <path + fill="#d9ead3" + d="m414.89185 100.59011l9.484589 0l0 30.948326l-9.484589 0z" + fill-rule="evenodd" + id="path463" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m414.89185 100.59011l9.484589 0l0 30.948326l-9.484589 0z" + fill-rule="evenodd" + id="path465" /> + <path + fill="#cfe2f3" + d="m427.49545 100.59011l14.126434 0l0 17.149574l-14.126434 0z" + fill-rule="evenodd" + id="path467" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m427.49545 100.59011l14.126434 0l0 17.149574l-14.126434 0z" + fill-rule="evenodd" + id="path469" /> + <path + fill="#f4cccc" + d="m427.49545 121.625656l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path471" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m427.49545 121.625656l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path473" /> + <path + fill="#f4cccc" + d="m435.11313 121.625656l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path475" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m435.11313 121.625656l6.51062 0l0 9.802734l-6.51062 0z" + fill-rule="evenodd" + id="path477" /> + <path + fill="#eeeeee" + d="m424.3804 110.24673l0.77005005 -0.7700653l0 0.38503265l1.5946045 0l0 -0.38503265l0.77008057 0.7700653l-0.77008057 0.7700653l0 -0.38503265l-1.5946045 0l0 0.38503265z" + fill-rule="evenodd" + id="path479" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m424.3804 110.24673l0.77005005 -0.7700653l0 0.38503265l1.5946045 0l0 -0.38503265l0.77008057 0.7700653l-0.77008057 0.7700653l0 -0.38503265l-1.5946045 0l0 0.38503265z" + fill-rule="evenodd" + id="path481" /> + <path + fill="#eeeeee" + d="m430.69965 118.36589l0.28134155 -0.28131866l0.28131104 0.28131866l-0.14065552 0l0 2.496811l0.14065552 0l-0.28131104 0.28131866l-0.28134155 -0.28131866l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path483" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m430.69965 118.36589l0.28134155 -0.28131866l0.28131104 0.28131866l-0.14065552 0l0 2.496811l0.14065552 0l-0.28131104 0.28131866l-0.28134155 -0.28131866l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path485" /> + <path + fill="#eeeeee" + d="m437.70166 118.36589l0.28134155 -0.28131866l0.28131104 0.28131866l-0.14065552 0l0 2.496811l0.14065552 0l-0.28131104 0.28131866l-0.28134155 -0.28131866l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path487" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m437.70166 118.36589l0.28134155 -0.28131866l0.28131104 0.28131866l-0.14065552 0l0 2.496811l0.14065552 0l-0.28131104 0.28131866l-0.28134155 -0.28131866l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path489" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m447.16473 106.62759l8.700897 0l0 3.330017l-8.700897 0z" + fill-rule="evenodd" + id="path491" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m446.60968 131.42694c-0.6270447 0 -1.1353455 -0.5632477 -1.1353455 -1.2580566l0 -8.337639c0 -0.69480896 -0.5083008 -1.2580719 -1.1353455 -1.2580719l0 0c0.6270447 0 1.1353455 -0.5632553 1.1353455 -1.2580643l0 -8.337631l0 0c0 -0.6948166 0.5083008 -1.2580719 1.1353455 -1.2580719z" + fill-rule="evenodd" + id="path493" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m446.60968 131.42694c-0.6270447 0 -1.1353455 -0.5632477 -1.1353455 -1.2580566l0 -8.337639c0 -0.69480896 -0.5083008 -1.2580719 -1.1353455 -1.2580719l0 0c0.6270447 0 1.1353455 -0.5632553 1.1353455 -1.2580643l0 -8.337631l0 0c0 -0.6948166 0.5083008 -1.2580719 1.1353455 -1.2580719" + fill-rule="evenodd" + id="path495" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m446.60968 131.42694c-0.6270447 0 -1.1353455 -0.5632477 -1.1353455 -1.2580566l0 -8.337639c0 -0.69480896 -0.5083008 -1.2580719 -1.1353455 -1.2580719l0 0c0.6270447 0 1.1353455 -0.5632553 1.1353455 -1.2580643l0 -8.337631l0 0c0 -0.6948166 0.5083008 -1.2580719 1.1353455 -1.2580719" + fill-rule="evenodd" + id="path497" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m439.52936 117.20986l8.700928 0l0 3.330017l-8.700928 0z" + fill-rule="evenodd" + id="path499" /> + <path + fill="#ffffff" + d="m450.04697 111.323135l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path501" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m450.04697 111.323135l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path503" /> + <path + fill="#ffffff" + d="m450.04697 114.87454l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path505" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m450.04697 114.87454l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path507" /> + <path + fill="#ffffff" + d="m450.04697 118.42594l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path509" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m450.04697 118.42594l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path511" /> + <path + fill="#ffffff" + d="m450.04697 121.97735l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path513" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m450.04697 121.97735l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path515" /> + <path + fill="#ffffff" + d="m450.04697 125.52875l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path517" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m450.04697 125.52875l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path519" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m393.16678 69.68528l73.13385 0l0 16.314957l-73.13385 0z" + fill-rule="evenodd" + id="path521" /> + <path + fill="#000000" + d="m414.14026 87.24024l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5827637 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.895233 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.546875 -0.375 -0.859375 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.828125 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.953125 -2.75q0 1.046875 0.4375 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.421875 0.5 -0.421875 1.609375zm9.082764 0.96875l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm8.184021 5.421875l0 -7.65625l0.859375 0l0 0.71875q0.296875 -0.421875 0.671875 -0.625q0.390625 -0.21875 0.921875 -0.21875q0.703125 0 1.25 0.375q0.546875 0.359375 0.8125 1.03125q0.28125 0.65625 0.28125 1.453125q0 0.84375 -0.3125 1.53125q-0.296875 0.671875 -0.875 1.03125q-0.578125 0.359375 -1.21875 0.359375q-0.46875 0 -0.84375 -0.1875q-0.375 -0.203125 -0.609375 -0.515625l0 2.703125l-0.9375 0zm0.84375 -4.859375q0 1.0625 0.4375 1.578125q0.4375 0.515625 1.046875 0.515625q0.625 0 1.0625 -0.53125q0.453125 -0.53125 0.453125 -1.640625q0 -1.046875 -0.4375 -1.578125q-0.4375 -0.53125 -1.046875 -0.53125q-0.59375 0 -1.0625 0.5625q-0.453125 0.5625 -0.453125 1.625z" + fill-rule="nonzero" + id="path523" /> + <path + fill="#ffffff" + d="m544.01245 208.69371l0 0c0 -22.065292 18.40216 -39.95276 41.102356 -39.95276l0 0c10.901001 0 21.35559 4.209305 29.063782 11.701889c7.708191 7.4925995 12.038574 17.65474 12.038574 28.25087l0 0c0 22.065292 -18.40216 39.95276 -41.102356 39.95276l0 0c-22.700195 0 -41.102356 -17.887466 -41.102356 -39.95276z" + fill-rule="evenodd" + id="path525" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m544.01245 208.69371l0 0c0 -22.065292 18.40216 -39.95276 41.102356 -39.95276l0 0c10.901001 0 21.35559 4.209305 29.063782 11.701889c7.708191 7.4925995 12.038574 17.65474 12.038574 28.25087l0 0c0 22.065292 -18.40216 39.95276 -41.102356 39.95276l0 0c-22.700195 0 -41.102356 -17.887466 -41.102356 -39.95276z" + fill-rule="evenodd" + id="path527" /> + <path + fill="#ffffff" + d="m559.4972 189.34494l51.160583 0l0 44.018646l-51.160583 0z" + fill-rule="evenodd" + id="path529" /> + <path + stroke="#cc0000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m559.4972 189.34494l51.160583 0l0 44.018646l-51.160583 0z" + fill-rule="evenodd" + id="path531" /> + <path + fill="#fdf8f8" + d="m601.0326 193.6095l7.5354614 0l0 4.2665863l-7.5354614 0z" + fill-rule="evenodd" + id="path533" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m601.0326 193.6095l7.5354614 0l0 4.2665863l-7.5354614 0z" + fill-rule="evenodd" + id="path535" /> + <path + fill="#d9ead3" + d="m566.89185 196.5901l9.484558 0l0 30.948334l-9.484558 0z" + fill-rule="evenodd" + id="path537" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m566.89185 196.5901l9.484558 0l0 30.948334l-9.484558 0z" + fill-rule="evenodd" + id="path539" /> + <path + fill="#cfe2f3" + d="m579.4955 196.5901l14.126404 0l0 17.149582l-14.126404 0z" + fill-rule="evenodd" + id="path541" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m579.4955 196.5901l14.126404 0l0 17.149582l-14.126404 0z" + fill-rule="evenodd" + id="path543" /> + <path + fill="#f4cccc" + d="m579.4955 217.62566l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path545" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m579.4955 217.62566l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path547" /> + <path + fill="#f4cccc" + d="m587.11316 217.62566l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path549" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m587.11316 217.62566l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path551" /> + <path + fill="#eeeeee" + d="m576.3804 206.24673l0.77008057 -0.7700653l0 0.38502502l1.5946045 0l0 -0.38502502l0.77008057 0.7700653l-0.77008057 0.7700653l0 -0.38504028l-1.5946045 0l0 0.38504028z" + fill-rule="evenodd" + id="path553" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m576.3804 206.24673l0.77008057 -0.7700653l0 0.38502502l1.5946045 0l0 -0.38502502l0.77008057 0.7700653l-0.77008057 0.7700653l0 -0.38504028l-1.5946045 0l0 0.38504028z" + fill-rule="evenodd" + id="path555" /> + <path + fill="#eeeeee" + d="m582.69965 214.36589l0.28131104 -0.2813263l0.28137207 0.2813263l-0.14068604 0l0 2.496811l0.14068604 0l-0.28137207 0.2813263l-0.28131104 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path557" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m582.69965 214.36589l0.28131104 -0.2813263l0.28137207 0.2813263l-0.14068604 0l0 2.496811l0.14068604 0l-0.28137207 0.2813263l-0.28131104 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path559" /> + <path + fill="#eeeeee" + d="m589.70166 214.36589l0.28131104 -0.2813263l0.28137207 0.2813263l-0.14068604 0l0 2.496811l0.14068604 0l-0.28137207 0.2813263l-0.28131104 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path561" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m589.70166 214.36589l0.28131104 -0.2813263l0.28137207 0.2813263l-0.14068604 0l0 2.496811l0.14068604 0l-0.28137207 0.2813263l-0.28131104 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path563" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m599.16473 202.6276l8.700928 0l0 3.330017l-8.700928 0z" + fill-rule="evenodd" + id="path565" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m598.6097 227.42694c-0.62701416 0 -1.135376 -0.5632477 -1.135376 -1.2580566l0 -8.337631c0 -0.6948242 -0.5083008 -1.2580719 -1.135315 -1.2580719l0 0c0.62701416 0 1.135315 -0.56326294 1.135315 -1.2580719l0 -8.337631l0 0c0 -0.69480896 0.5083618 -1.2580719 1.135376 -1.2580719z" + fill-rule="evenodd" + id="path567" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m598.6097 227.42694c-0.62701416 0 -1.135376 -0.5632477 -1.135376 -1.2580566l0 -8.337631c0 -0.6948242 -0.5083008 -1.2580719 -1.135315 -1.2580719l0 0c0.62701416 0 1.135315 -0.56326294 1.135315 -1.2580719l0 -8.337631l0 0c0 -0.69480896 0.5083618 -1.2580719 1.135376 -1.2580719" + fill-rule="evenodd" + id="path569" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m598.6097 227.42694c-0.62701416 0 -1.135376 -0.5632477 -1.135376 -1.2580566l0 -8.337631c0 -0.6948242 -0.5083008 -1.2580719 -1.135315 -1.2580719l0 0c0.62701416 0 1.135315 -0.56326294 1.135315 -1.2580719l0 -8.337631l0 0c0 -0.69480896 0.5083618 -1.2580719 1.135376 -1.2580719" + fill-rule="evenodd" + id="path571" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m591.52936 213.20987l8.700928 0l0 3.3300018l-8.700928 0z" + fill-rule="evenodd" + id="path573" /> + <path + fill="#ffffff" + d="m602.04694 207.32314l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path575" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 207.32314l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path577" /> + <path + fill="#ffffff" + d="m602.04694 210.87454l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path579" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 210.87454l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path581" /> + <path + fill="#ffffff" + d="m602.04694 214.42595l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path583" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 214.42595l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path585" /> + <path + fill="#ffffff" + d="m602.04694 217.97734l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path587" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 217.97734l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path589" /> + <path + fill="#ffffff" + d="m602.04694 221.52875l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path591" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 221.52875l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path593" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m545.1668 165.68527l73.13385 0l0 16.314972l-73.13385 0z" + fill-rule="evenodd" + id="path595" /> + <path + fill="#000000" + d="m566.14026 183.24023l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5827637 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.895264 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.546875 -0.375 -0.859375 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.828125 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.953125 -2.75q0 1.046875 0.4375 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.421875 0.5 -0.421875 1.609375zm9.082703 0.96875l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm11.809021 3.296875l0 -0.8125q-0.65625 0.9375 -1.75 0.9375q-0.5 0 -0.921875 -0.1875q-0.421875 -0.1875 -0.625 -0.46875q-0.203125 -0.28125 -0.296875 -0.703125q-0.046875 -0.265625 -0.046875 -0.875l0 -3.421875l0.9375 0l0 3.0625q0 0.734375 0.046875 1.0q0.09375 0.359375 0.375 0.578125q0.296875 0.203125 0.703125 0.203125q0.421875 0 0.796875 -0.203125q0.375 -0.21875 0.515625 -0.59375q0.15625 -0.375 0.15625 -1.078125l0 -2.96875l0.9375 0l0 5.53125l-0.828125 0z" + fill-rule="nonzero" + id="path597" /> + <path + fill="#ffffff" + d="m544.01245 304.69373l0 0c0 -22.065308 18.40216 -39.95276 41.102356 -39.95276l0 0c10.901001 0 21.35559 4.2092896 29.063782 11.701874c7.708191 7.4926147 12.038574 17.654755 12.038574 28.250885l0 0c0 22.065277 -18.40216 39.95273 -41.102356 39.95273l0 0c-22.700195 0 -41.102356 -17.887451 -41.102356 -39.95273z" + fill-rule="evenodd" + id="path599" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m544.01245 304.69373l0 0c0 -22.065308 18.40216 -39.95276 41.102356 -39.95276l0 0c10.901001 0 21.35559 4.2092896 29.063782 11.701874c7.708191 7.4926147 12.038574 17.654755 12.038574 28.250885l0 0c0 22.065277 -18.40216 39.95273 -41.102356 39.95273l0 0c-22.700195 0 -41.102356 -17.887451 -41.102356 -39.95273z" + fill-rule="evenodd" + id="path601" /> + <path + fill="#ffffff" + d="m559.4972 285.34494l51.160583 0l0 44.018646l-51.160583 0z" + fill-rule="evenodd" + id="path603" /> + <path + stroke="#cc0000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m559.4972 285.34494l51.160583 0l0 44.018646l-51.160583 0z" + fill-rule="evenodd" + id="path605" /> + <path + fill="#fdf8f8" + d="m601.0326 289.6095l7.5354614 0l0 4.266571l-7.5354614 0z" + fill-rule="evenodd" + id="path607" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m601.0326 289.6095l7.5354614 0l0 4.266571l-7.5354614 0z" + fill-rule="evenodd" + id="path609" /> + <path + fill="#d9ead3" + d="m566.89185 292.59012l9.484558 0l0 30.948334l-9.484558 0z" + fill-rule="evenodd" + id="path611" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m566.89185 292.59012l9.484558 0l0 30.948334l-9.484558 0z" + fill-rule="evenodd" + id="path613" /> + <path + fill="#cfe2f3" + d="m579.4955 292.59012l14.126404 0l0 17.149567l-14.126404 0z" + fill-rule="evenodd" + id="path615" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m579.4955 292.59012l14.126404 0l0 17.149567l-14.126404 0z" + fill-rule="evenodd" + id="path617" /> + <path + fill="#f4cccc" + d="m579.4955 313.62564l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path619" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m579.4955 313.62564l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path621" /> + <path + fill="#f4cccc" + d="m587.11316 313.62564l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path623" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m587.11316 313.62564l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path625" /> + <path + fill="#eeeeee" + d="m576.3804 302.24673l0.77008057 -0.77008057l0 0.38504028l1.5946045 0l0 -0.38504028l0.77008057 0.77008057l-0.77008057 0.77005005l0 -0.38500977l-1.5946045 0l0 0.38500977z" + fill-rule="evenodd" + id="path627" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m576.3804 302.24673l0.77008057 -0.77008057l0 0.38504028l1.5946045 0l0 -0.38504028l0.77008057 0.77008057l-0.77008057 0.77005005l0 -0.38500977l-1.5946045 0l0 0.38500977z" + fill-rule="evenodd" + id="path629" /> + <path + fill="#eeeeee" + d="m582.69965 310.3659l0.28131104 -0.28134155l0.28137207 0.28134155l-0.14068604 0l0 2.4967957l0.14068604 0l-0.28137207 0.28131104l-0.28131104 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path631" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m582.69965 310.3659l0.28131104 -0.28134155l0.28137207 0.28134155l-0.14068604 0l0 2.4967957l0.14068604 0l-0.28137207 0.28131104l-0.28131104 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path633" /> + <path + fill="#eeeeee" + d="m589.70166 310.3659l0.28131104 -0.28134155l0.28137207 0.28134155l-0.14068604 0l0 2.4967957l0.14068604 0l-0.28137207 0.28131104l-0.28131104 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path635" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m589.70166 310.3659l0.28131104 -0.28134155l0.28137207 0.28134155l-0.14068604 0l0 2.4967957l0.14068604 0l-0.28137207 0.28131104l-0.28131104 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path637" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m599.16473 298.6276l8.700928 0l0 3.330017l-8.700928 0z" + fill-rule="evenodd" + id="path639" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m598.6097 323.42694c-0.62701416 0 -1.135376 -0.56326294 -1.135376 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.135315 -1.2580566l0 0c0.62701416 0 1.135315 -0.56326294 1.135315 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083618 -1.2580566 1.135376 -1.2580566z" + fill-rule="evenodd" + id="path641" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m598.6097 323.42694c-0.62701416 0 -1.135376 -0.56326294 -1.135376 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.135315 -1.2580566l0 0c0.62701416 0 1.135315 -0.56326294 1.135315 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083618 -1.2580566 1.135376 -1.2580566" + fill-rule="evenodd" + id="path643" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m598.6097 323.42694c-0.62701416 0 -1.135376 -0.56326294 -1.135376 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.135315 -1.2580566l0 0c0.62701416 0 1.135315 -0.56326294 1.135315 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083618 -1.2580566 1.135376 -1.2580566" + fill-rule="evenodd" + id="path645" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m591.52936 309.20987l8.700928 0l0 3.330017l-8.700928 0z" + fill-rule="evenodd" + id="path647" /> + <path + fill="#ffffff" + d="m602.04694 303.32315l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path649" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 303.32315l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path651" /> + <path + fill="#ffffff" + d="m602.04694 306.87454l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path653" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 306.87454l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path655" /> + <path + fill="#ffffff" + d="m602.04694 310.42593l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path657" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 310.42593l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path659" /> + <path + fill="#ffffff" + d="m602.04694 313.97736l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path661" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 313.97736l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path663" /> + <path + fill="#ffffff" + d="m602.04694 317.52875l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path665" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 317.52875l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path667" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m545.1668 261.68527l73.13385 0l0 16.314972l-73.13385 0z" + fill-rule="evenodd" + id="path669" /> + <path + fill="#000000" + d="m566.43945 279.24023l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5827637 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.895264 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.546875 -0.375 -0.859375 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.828125 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.953125 -2.75q0 1.046875 0.4375 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.421875 0.5 -0.421875 1.609375zm9.082703 0.96875l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm9.715271 3.296875l-2.09375 -5.53125l0.984375 0l1.1875 3.3125q0.1875 0.53125 0.359375 1.109375q0.109375 -0.4375 0.34375 -1.046875l1.21875 -3.375l0.96875 0l-2.09375 5.53125l-0.875 0z" + fill-rule="nonzero" + id="path671" /> + <path + fill="#ffffff" + d="m544.01245 440.69373l0 0c0 -22.065308 18.40216 -39.95276 41.102356 -39.95276l0 0c10.901001 0 21.35559 4.2092896 29.063782 11.701874c7.708191 7.4926147 12.038574 17.654755 12.038574 28.250885l0 0c0 22.065277 -18.40216 39.95273 -41.102356 39.95273l0 0c-22.700195 0 -41.102356 -17.887451 -41.102356 -39.95273z" + fill-rule="evenodd" + id="path673" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m544.01245 440.69373l0 0c0 -22.065308 18.40216 -39.95276 41.102356 -39.95276l0 0c10.901001 0 21.35559 4.2092896 29.063782 11.701874c7.708191 7.4926147 12.038574 17.654755 12.038574 28.250885l0 0c0 22.065277 -18.40216 39.95273 -41.102356 39.95273l0 0c-22.700195 0 -41.102356 -17.887451 -41.102356 -39.95273z" + fill-rule="evenodd" + id="path675" /> + <path + fill="#ffffff" + d="m559.4972 421.34494l51.160583 0l0 44.018646l-51.160583 0z" + fill-rule="evenodd" + id="path677" /> + <path + stroke="#cc0000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m559.4972 421.34494l51.160583 0l0 44.018646l-51.160583 0z" + fill-rule="evenodd" + id="path679" /> + <path + fill="#fdf8f8" + d="m601.0326 425.6095l7.5354614 0l0 4.266571l-7.5354614 0z" + fill-rule="evenodd" + id="path681" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m601.0326 425.6095l7.5354614 0l0 4.266571l-7.5354614 0z" + fill-rule="evenodd" + id="path683" /> + <path + fill="#d9ead3" + d="m566.89185 428.59012l9.484558 0l0 30.948334l-9.484558 0z" + fill-rule="evenodd" + id="path685" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m566.89185 428.59012l9.484558 0l0 30.948334l-9.484558 0z" + fill-rule="evenodd" + id="path687" /> + <path + fill="#cfe2f3" + d="m579.4955 428.59012l14.126404 0l0 17.149567l-14.126404 0z" + fill-rule="evenodd" + id="path689" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m579.4955 428.59012l14.126404 0l0 17.149567l-14.126404 0z" + fill-rule="evenodd" + id="path691" /> + <path + fill="#f4cccc" + d="m579.4955 449.62564l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path693" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m579.4955 449.62564l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path695" /> + <path + fill="#f4cccc" + d="m587.11316 449.62564l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path697" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m587.11316 449.62564l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path699" /> + <path + fill="#eeeeee" + d="m576.3804 438.24673l0.77008057 -0.77008057l0 0.38504028l1.5946045 0l0 -0.38504028l0.77008057 0.77008057l-0.77008057 0.77005005l0 -0.38500977l-1.5946045 0l0 0.38500977z" + fill-rule="evenodd" + id="path701" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m576.3804 438.24673l0.77008057 -0.77008057l0 0.38504028l1.5946045 0l0 -0.38504028l0.77008057 0.77008057l-0.77008057 0.77005005l0 -0.38500977l-1.5946045 0l0 0.38500977z" + fill-rule="evenodd" + id="path703" /> + <path + fill="#eeeeee" + d="m582.69965 446.3659l0.28131104 -0.28134155l0.28137207 0.28134155l-0.14068604 0l0 2.4967957l0.14068604 0l-0.28137207 0.28131104l-0.28131104 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path705" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m582.69965 446.3659l0.28131104 -0.28134155l0.28137207 0.28134155l-0.14068604 0l0 2.4967957l0.14068604 0l-0.28137207 0.28131104l-0.28131104 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path707" /> + <path + fill="#eeeeee" + d="m589.70166 446.3659l0.28131104 -0.28134155l0.28137207 0.28134155l-0.14068604 0l0 2.4967957l0.14068604 0l-0.28137207 0.28131104l-0.28131104 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path709" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m589.70166 446.3659l0.28131104 -0.28134155l0.28137207 0.28134155l-0.14068604 0l0 2.4967957l0.14068604 0l-0.28137207 0.28131104l-0.28131104 -0.28131104l0.14068604 0l0 -2.4967957z" + fill-rule="evenodd" + id="path711" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m599.16473 434.6276l8.700928 0l0 3.330017l-8.700928 0z" + fill-rule="evenodd" + id="path713" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m598.6097 459.42694c-0.62701416 0 -1.135376 -0.56326294 -1.135376 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.135315 -1.2580566l0 0c0.62701416 0 1.135315 -0.56326294 1.135315 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083618 -1.2580566 1.135376 -1.2580566z" + fill-rule="evenodd" + id="path715" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m598.6097 459.42694c-0.62701416 0 -1.135376 -0.56326294 -1.135376 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.135315 -1.2580566l0 0c0.62701416 0 1.135315 -0.56326294 1.135315 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083618 -1.2580566 1.135376 -1.2580566" + fill-rule="evenodd" + id="path717" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m598.6097 459.42694c-0.62701416 0 -1.135376 -0.56326294 -1.135376 -1.2580566l0 -8.3376465c0 -0.6947937 -0.5083008 -1.2580566 -1.135315 -1.2580566l0 0c0.62701416 0 1.135315 -0.56326294 1.135315 -1.2580872l0 -8.337616l0 0c0 -0.6948242 0.5083618 -1.2580566 1.135376 -1.2580566" + fill-rule="evenodd" + id="path719" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m591.52936 445.20987l8.700928 0l0 3.330017l-8.700928 0z" + fill-rule="evenodd" + id="path721" /> + <path + fill="#ffffff" + d="m602.04694 439.32315l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path723" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 439.32315l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path725" /> + <path + fill="#ffffff" + d="m602.04694 442.87454l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path727" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 442.87454l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path729" /> + <path + fill="#ffffff" + d="m602.04694 446.42593l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path731" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 446.42593l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path733" /> + <path + fill="#ffffff" + d="m602.04694 449.97736l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path735" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 449.97736l4.710388 0l0 4.2644653l-4.710388 0z" + fill-rule="evenodd" + id="path737" /> + <path + fill="#ffffff" + d="m602.04694 453.52875l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path739" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m602.04694 453.52875l4.710388 0l0 4.264496l-4.710388 0z" + fill-rule="evenodd" + id="path741" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m545.1668 397.68527l73.13385 0l0 16.314972l-73.13385 0z" + fill-rule="evenodd" + id="path743" /> + <path + fill="#000000" + d="m566.43945 415.24023l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5827637 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.895264 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.546875 -0.375 -0.859375 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.828125 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.953125 -2.75q0 1.046875 0.4375 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.421875 0.5 -0.421875 1.609375zm9.082703 0.96875l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm7.559021 3.296875l2.015625 -2.875l-1.859375 -2.65625l1.171875 0l0.84375 1.296875q0.234375 0.375 0.390625 0.625q0.21875 -0.34375 0.40625 -0.609375l0.9375 -1.3125l1.125 0l-1.921875 2.609375l2.0625 2.921875l-1.15625 0l-1.125 -1.71875l-0.296875 -0.46875l-1.453125 2.1875l-1.140625 0z" + fill-rule="nonzero" + id="path745" /> + <path + fill="#ffffff" + d="m536.01245 112.69371l0 0c0 -22.0653 18.40216 -39.95276 41.102356 -39.95276l0 0c10.901001 0 21.35559 4.209297 29.063782 11.701897c7.708191 7.492592 12.038574 17.654732 12.038574 28.250862l0 0c0 22.065292 -18.40216 39.95276 -41.102356 39.95276l0 0c-22.700195 0 -41.102356 -17.887466 -41.102356 -39.95276z" + fill-rule="evenodd" + id="path747" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m536.01245 112.69371l0 0c0 -22.0653 18.40216 -39.95276 41.102356 -39.95276l0 0c10.901001 0 21.35559 4.209297 29.063782 11.701897c7.708191 7.492592 12.038574 17.654732 12.038574 28.250862l0 0c0 22.065292 -18.40216 39.95276 -41.102356 39.95276l0 0c-22.700195 0 -41.102356 -17.887466 -41.102356 -39.95276z" + fill-rule="evenodd" + id="path749" /> + <path + fill="#ffffff" + d="m551.4972 93.34494l51.160583 0l0 44.018646l-51.160583 0z" + fill-rule="evenodd" + id="path751" /> + <path + stroke="#cc0000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m551.4972 93.34494l51.160583 0l0 44.018646l-51.160583 0z" + fill-rule="evenodd" + id="path753" /> + <path + fill="#fdf8f8" + d="m593.0326 97.6095l7.5354614 0l0 4.2665787l-7.5354614 0z" + fill-rule="evenodd" + id="path755" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m593.0326 97.6095l7.5354614 0l0 4.2665787l-7.5354614 0z" + fill-rule="evenodd" + id="path757" /> + <path + fill="#d9ead3" + d="m558.89185 100.59011l9.484558 0l0 30.948326l-9.484558 0z" + fill-rule="evenodd" + id="path759" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m558.89185 100.59011l9.484558 0l0 30.948326l-9.484558 0z" + fill-rule="evenodd" + id="path761" /> + <path + fill="#cfe2f3" + d="m571.4955 100.59011l14.126404 0l0 17.149574l-14.126404 0z" + fill-rule="evenodd" + id="path763" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m571.4955 100.59011l14.126404 0l0 17.149574l-14.126404 0z" + fill-rule="evenodd" + id="path765" /> + <path + fill="#f4cccc" + d="m571.4955 121.625656l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path767" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m571.4955 121.625656l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path769" /> + <path + fill="#f4cccc" + d="m579.11316 121.625656l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path771" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m579.11316 121.625656l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path773" /> + <path + fill="#eeeeee" + d="m568.3804 110.24673l0.77008057 -0.7700653l0 0.38503265l1.5946045 0l0 -0.38503265l0.77008057 0.7700653l-0.77008057 0.7700653l0 -0.38503265l-1.5946045 0l0 0.38503265z" + fill-rule="evenodd" + id="path775" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m568.3804 110.24673l0.77008057 -0.7700653l0 0.38503265l1.5946045 0l0 -0.38503265l0.77008057 0.7700653l-0.77008057 0.7700653l0 -0.38503265l-1.5946045 0l0 0.38503265z" + fill-rule="evenodd" + id="path777" /> + <path + fill="#eeeeee" + d="m574.69965 118.36589l0.28131104 -0.28131866l0.28137207 0.28131866l-0.14068604 0l0 2.496811l0.14068604 0l-0.28137207 0.28131866l-0.28131104 -0.28131866l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path779" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m574.69965 118.36589l0.28131104 -0.28131866l0.28137207 0.28131866l-0.14068604 0l0 2.496811l0.14068604 0l-0.28137207 0.28131866l-0.28131104 -0.28131866l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path781" /> + <path + fill="#eeeeee" + d="m581.70166 118.36589l0.28131104 -0.28131866l0.28137207 0.28131866l-0.14068604 0l0 2.496811l0.14068604 0l-0.28137207 0.28131866l-0.28131104 -0.28131866l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path783" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m581.70166 118.36589l0.28131104 -0.28131866l0.28137207 0.28131866l-0.14068604 0l0 2.496811l0.14068604 0l-0.28137207 0.28131866l-0.28131104 -0.28131866l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path785" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m591.16473 106.62759l8.700928 0l0 3.330017l-8.700928 0z" + fill-rule="evenodd" + id="path787" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m590.6097 131.42694c-0.62701416 0 -1.135376 -0.5632477 -1.135376 -1.2580566l0 -8.337639c0 -0.69480896 -0.5083008 -1.2580719 -1.135315 -1.2580719l0 0c0.62701416 0 1.135315 -0.5632553 1.135315 -1.2580643l0 -8.337631l0 0c0 -0.6948166 0.5083618 -1.2580719 1.135376 -1.2580719z" + fill-rule="evenodd" + id="path789" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m590.6097 131.42694c-0.62701416 0 -1.135376 -0.5632477 -1.135376 -1.2580566l0 -8.337639c0 -0.69480896 -0.5083008 -1.2580719 -1.135315 -1.2580719l0 0c0.62701416 0 1.135315 -0.5632553 1.135315 -1.2580643l0 -8.337631l0 0c0 -0.6948166 0.5083618 -1.2580719 1.135376 -1.2580719" + fill-rule="evenodd" + id="path791" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m590.6097 131.42694c-0.62701416 0 -1.135376 -0.5632477 -1.135376 -1.2580566l0 -8.337639c0 -0.69480896 -0.5083008 -1.2580719 -1.135315 -1.2580719l0 0c0.62701416 0 1.135315 -0.5632553 1.135315 -1.2580643l0 -8.337631l0 0c0 -0.6948166 0.5083618 -1.2580719 1.135376 -1.2580719" + fill-rule="evenodd" + id="path793" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m583.52936 117.20986l8.700928 0l0 3.330017l-8.700928 0z" + fill-rule="evenodd" + id="path795" /> + <path + fill="#ffffff" + d="m594.04694 111.323135l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path797" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m594.04694 111.323135l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path799" /> + <path + fill="#ffffff" + d="m594.04694 114.87454l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path801" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m594.04694 114.87454l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path803" /> + <path + fill="#ffffff" + d="m594.04694 118.42594l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path805" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m594.04694 118.42594l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path807" /> + <path + fill="#ffffff" + d="m594.04694 121.97735l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path809" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m594.04694 121.97735l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path811" /> + <path + fill="#ffffff" + d="m594.04694 125.52875l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path813" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m594.04694 125.52875l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path815" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m537.1668 69.68528l73.13385 0l0 16.314957l-73.13385 0z" + fill-rule="evenodd" + id="path817" /> + <path + fill="#000000" + d="m559.62317 87.24024l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5827637 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.895264 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.546875 -0.375 -0.859375 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.828125 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.953125 -2.75q0 1.046875 0.4375 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.421875 0.5 -0.421875 1.609375zm9.082764 0.96875l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm10.230896 2.453125l0.125 0.828125q-0.390625 0.09375 -0.703125 0.09375q-0.5 0 -0.78125 -0.15625q-0.28125 -0.171875 -0.40625 -0.4375q-0.109375 -0.265625 -0.109375 -1.109375l0 -3.171875l-0.6875 0l0 -0.734375l0.6875 0l0 -1.359375l0.9375 -0.5625l0 1.921875l0.9375 0l0 0.734375l-0.9375 0l0 3.234375q0 0.390625 0.046875 0.515625q0.046875 0.109375 0.15625 0.1875q0.109375 0.0625 0.328125 0.0625q0.15625 0 0.40625 -0.046875z" + fill-rule="nonzero" + id="path819" /> + <path + fill="#ffffff" + d="m728.01245 208.69371l0 0c0 -22.065292 18.40216 -39.95276 41.102356 -39.95276l0 0c10.901001 0 21.35559 4.209305 29.063782 11.701889c7.708191 7.4925995 12.038574 17.65474 12.038574 28.25087l0 0c0 22.065292 -18.40216 39.95276 -41.102356 39.95276l0 0c-22.700195 0 -41.102356 -17.887466 -41.102356 -39.95276z" + fill-rule="evenodd" + id="path821" /> + <path + stroke="#274e13" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m728.01245 208.69371l0 0c0 -22.065292 18.40216 -39.95276 41.102356 -39.95276l0 0c10.901001 0 21.35559 4.209305 29.063782 11.701889c7.708191 7.4925995 12.038574 17.65474 12.038574 28.25087l0 0c0 22.065292 -18.40216 39.95276 -41.102356 39.95276l0 0c-22.700195 0 -41.102356 -17.887466 -41.102356 -39.95276z" + fill-rule="evenodd" + id="path823" /> + <path + fill="#ffffff" + d="m743.4972 189.34494l51.160583 0l0 44.018646l-51.160583 0z" + fill-rule="evenodd" + id="path825" /> + <path + stroke="#cc0000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m743.4972 189.34494l51.160583 0l0 44.018646l-51.160583 0z" + fill-rule="evenodd" + id="path827" /> + <path + fill="#fdf8f8" + d="m785.0326 193.6095l7.5354614 0l0 4.2665863l-7.5354614 0z" + fill-rule="evenodd" + id="path829" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m785.0326 193.6095l7.5354614 0l0 4.2665863l-7.5354614 0z" + fill-rule="evenodd" + id="path831" /> + <path + fill="#d9ead3" + d="m750.89185 196.5901l9.484558 0l0 30.948334l-9.484558 0z" + fill-rule="evenodd" + id="path833" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m750.89185 196.5901l9.484558 0l0 30.948334l-9.484558 0z" + fill-rule="evenodd" + id="path835" /> + <path + fill="#cfe2f3" + d="m763.4955 196.5901l14.126404 0l0 17.149582l-14.126404 0z" + fill-rule="evenodd" + id="path837" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m763.4955 196.5901l14.126404 0l0 17.149582l-14.126404 0z" + fill-rule="evenodd" + id="path839" /> + <path + fill="#f4cccc" + d="m763.4955 217.62566l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path841" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m763.4955 217.62566l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path843" /> + <path + fill="#f4cccc" + d="m771.11316 217.62566l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path845" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m771.11316 217.62566l6.510559 0l0 9.802734l-6.510559 0z" + fill-rule="evenodd" + id="path847" /> + <path + fill="#eeeeee" + d="m760.3804 206.24673l0.77008057 -0.7700653l0 0.38502502l1.5946045 0l0 -0.38502502l0.77008057 0.7700653l-0.77008057 0.7700653l0 -0.38504028l-1.5946045 0l0 0.38504028z" + fill-rule="evenodd" + id="path849" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m760.3804 206.24673l0.77008057 -0.7700653l0 0.38502502l1.5946045 0l0 -0.38502502l0.77008057 0.7700653l-0.77008057 0.7700653l0 -0.38504028l-1.5946045 0l0 0.38504028z" + fill-rule="evenodd" + id="path851" /> + <path + fill="#eeeeee" + d="m766.69965 214.36589l0.28131104 -0.2813263l0.28137207 0.2813263l-0.14068604 0l0 2.496811l0.14068604 0l-0.28137207 0.2813263l-0.28131104 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path853" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m766.69965 214.36589l0.28131104 -0.2813263l0.28137207 0.2813263l-0.14068604 0l0 2.496811l0.14068604 0l-0.28137207 0.2813263l-0.28131104 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path855" /> + <path + fill="#eeeeee" + d="m773.70166 214.36589l0.28131104 -0.2813263l0.28137207 0.2813263l-0.14068604 0l0 2.496811l0.14068604 0l-0.28137207 0.2813263l-0.28131104 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path857" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m773.70166 214.36589l0.28131104 -0.2813263l0.28137207 0.2813263l-0.14068604 0l0 2.496811l0.14068604 0l-0.28137207 0.2813263l-0.28131104 -0.2813263l0.14068604 0l0 -2.496811z" + fill-rule="evenodd" + id="path859" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m783.16473 202.6276l8.700928 0l0 3.330017l-8.700928 0z" + fill-rule="evenodd" + id="path861" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m782.6097 227.42694c-0.62701416 0 -1.135376 -0.5632477 -1.135376 -1.2580566l0 -8.337631c0 -0.6948242 -0.5083008 -1.2580719 -1.135315 -1.2580719l0 0c0.62701416 0 1.135315 -0.56326294 1.135315 -1.2580719l0 -8.337631l0 0c0 -0.69480896 0.5083618 -1.2580719 1.135376 -1.2580719z" + fill-rule="evenodd" + id="path863" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m782.6097 227.42694c-0.62701416 0 -1.135376 -0.5632477 -1.135376 -1.2580566l0 -8.337631c0 -0.6948242 -0.5083008 -1.2580719 -1.135315 -1.2580719l0 0c0.62701416 0 1.135315 -0.56326294 1.135315 -1.2580719l0 -8.337631l0 0c0 -0.69480896 0.5083618 -1.2580719 1.135376 -1.2580719" + fill-rule="evenodd" + id="path865" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m782.6097 227.42694c-0.62701416 0 -1.135376 -0.5632477 -1.135376 -1.2580566l0 -8.337631c0 -0.6948242 -0.5083008 -1.2580719 -1.135315 -1.2580719l0 0c0.62701416 0 1.135315 -0.56326294 1.135315 -1.2580719l0 -8.337631l0 0c0 -0.69480896 0.5083618 -1.2580719 1.135376 -1.2580719" + fill-rule="evenodd" + id="path867" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m775.52936 213.20987l8.700928 0l0 3.3300018l-8.700928 0z" + fill-rule="evenodd" + id="path869" /> + <path + fill="#ffffff" + d="m786.04694 207.32314l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path871" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m786.04694 207.32314l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path873" /> + <path + fill="#ffffff" + d="m786.04694 210.87454l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path875" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m786.04694 210.87454l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path877" /> + <path + fill="#ffffff" + d="m786.04694 214.42595l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path879" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m786.04694 214.42595l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path881" /> + <path + fill="#ffffff" + d="m786.04694 217.97734l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path883" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m786.04694 217.97734l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path885" /> + <path + fill="#ffffff" + d="m786.04694 221.52875l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path887" /> + <path + stroke="#4a86e8" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + d="m786.04694 221.52875l4.710388 0l0 4.2644806l-4.710388 0z" + fill-rule="evenodd" + id="path889" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m729.1668 165.68527l73.13385 0l0 16.314972l-73.13385 0z" + fill-rule="evenodd" + id="path891" /> + <path + fill="#000000" + d="m750.43945 183.24023l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5827637 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.895264 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.546875 -0.375 -0.859375 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.828125 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.953125 -2.75q0 1.046875 0.4375 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.421875 0.5 -0.421875 1.609375zm9.082703 0.96875l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm8.137146 5.421875l-0.09375 -0.875q0.296875 0.078125 0.53125 0.078125q0.3125 0 0.5 -0.109375q0.1875 -0.09375 0.3125 -0.28125q0.078125 -0.140625 0.28125 -0.703125q0.03125 -0.078125 0.078125 -0.21875l-2.09375 -5.546875l1.015625 0l1.140625 3.203125q0.234375 0.609375 0.40625 1.28125q0.15625 -0.640625 0.375 -1.265625l1.1875 -3.21875l0.9375 0l-2.109375 5.625q-0.328125 0.90625 -0.515625 1.25q-0.25 0.46875 -0.578125 0.6875q-0.3125 0.21875 -0.765625 0.21875q-0.265625 0 -0.609375 -0.125z" + fill-rule="nonzero" + id="path893" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m211.71075 275.29062c16.11023 0 24.165344 -13.937012 32.220474 -27.874023c8.055115 -13.937012 16.110214 -27.874008 32.220474 -27.874008" + fill-rule="evenodd" + id="path895" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m211.71075 275.29062c16.11023 0 24.16536 -13.937012 32.220474 -27.874008c4.0275574 -6.968506 8.055115 -13.937012 13.089554 -19.163391c2.5172424 -2.6131897 5.286194 -4.790848 8.432709 -6.315201c1.5732727 -0.7621918 3.2409363 -1.3610382 5.018738 -1.7693481c0.4444275 -0.10209656 0.89575195 -0.19224548 1.3542175 -0.27009583c0.22921753 -0.038909912 0.4602356 -0.07473755 0.6930847 -0.107437134l0.2121582 -0.028259277" + fill-rule="evenodd" + id="path897" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m272.7317 219.76288l-1.0499573 1.1945496l3.011078 -1.3208618l-3.1556702 -0.923645z" + fill-rule="evenodd" + id="path899" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m206.79628 284.1058c0 19.13388 14.29921 28.700806 28.598434 38.26773c14.29921 9.566925 28.59842 19.13385 28.59842 38.2677" + fill-rule="evenodd" + id="path901" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m206.79628 284.1058c0 19.13385 14.29921 28.700775 28.59842 38.26773c7.1496124 4.7834473 14.299225 9.566925 19.661423 15.546234c2.6810913 2.989685 4.915344 6.2783203 6.4793396 10.015381c0.7819824 1.8685608 1.3963928 3.8492126 1.8153076 5.9606323c0.20947266 1.0557556 0.37008667 2.144165 0.47827148 3.2676392l0.00491333 0.05441284" + fill-rule="evenodd" + id="path903" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m263.83395 357.21786l-1.1755981 -1.0711365l1.2668762 3.0341797l0.9798584 -3.1386719z" + fill-rule="evenodd" + id="path905" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m324.40216 194.87454c0 -41.086624 33.811005 -82.17323 67.62204 -82.17323" + fill-rule="evenodd" + id="path907" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m324.40216 194.87454c0 -20.543304 8.452759 -41.086624 21.131866 -56.494095c6.339569 -7.7037506 13.735748 -14.123528 21.660187 -18.617378c3.9622498 -2.2469177 8.056519 -4.0123596 12.216888 -5.216072c2.0801697 -0.6018524 4.17688 -1.0632782 6.281769 -1.3742294c0.5262451 -0.07774353 1.0529785 -0.14608002 1.5801392 -0.20485687c0.26358032 -0.029388428 0.5272217 -0.056381226 0.7909546 -0.080963135l0.53601074 -0.045051575" + fill-rule="evenodd" + id="path909" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m388.6 112.841896l-1.0775146 1.1697693l3.0410461 -1.2503891l-3.1333008 -0.9968872z" + fill-rule="evenodd" + id="path911" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m326.75735 207.661c36.834625 0 73.66928 40.34645 73.66928 80.69292" + fill-rule="evenodd" + id="path913" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m326.75735 207.66098c18.417297 0 36.834625 10.086624 50.647614 25.216537c6.906494 7.564972 12.661926 16.390747 16.690704 25.84694c2.0144043 4.728119 3.597168 9.613831 4.6762695 14.578339c0.5395813 2.4822388 0.9532471 4.984192 1.2320251 7.4959717c0.1394043 1.2559204 0.24505615 2.5142822 0.31588745 3.7738953l0.017486572 0.35531616" + fill-rule="evenodd" + id="path915" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m400.33734 284.92798l-1.1535034 -1.0949097l1.2047119 3.0594177l1.0437012 -3.1180115z" + fill-rule="evenodd" + id="path917" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m331.69748 203.27638c15.078735 0 22.618134 3.3543396 30.157501 6.708664c7.5393677 3.3543396 15.078735 6.708664 30.15747 6.708664" + fill-rule="evenodd" + id="path919" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m331.69748 203.2764c15.078766 0 22.618134 3.3543243 30.157501 6.7086487c3.7696838 1.6771698 7.5393677 3.3543396 12.251495 4.612213c2.3560486 0.62893677 4.947693 1.1530457 7.8927917 1.519928c1.4725037 0.18344116 3.0333862 0.32757568 4.6973267 0.42582703c0.41601562 0.024597168 0.83847046 0.046279907 1.2675476 0.06503296l0.62176514 0.024765015" + fill-rule="evenodd" + id="path921" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m388.5859 216.63281l-1.1443787 1.1044312l3.109253 -1.0695038l-3.069275 -1.179306z" + fill-rule="evenodd" + id="path923" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m323.7046 355.2753c36.17325 0 72.346466 -3.1653748 72.346466 -6.330719" + fill-rule="evenodd" + id="path925" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m323.7046 355.2753c18.08664 0 36.17325 -0.7913208 49.73819 -1.9783325c6.782501 -0.59350586 12.43457 -1.2859497 16.390991 -2.0278015c0.98913574 -0.18551636 1.8722534 -0.37402344 2.6405945 -0.5649414l0.5545349 -0.14355469" + fill-rule="evenodd" + id="path927" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m393.02893 350.56067l-0.46139526 1.5220032l2.1943665 -2.4487l-3.2549744 0.4653015z" + fill-rule="evenodd" + id="path929" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m326.78412 359.65433c0 44.519684 28.614166 89.0394 57.228333 89.0394" + fill-rule="evenodd" + id="path931" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m326.7841 359.65433c0 22.259827 7.1535645 44.519684 17.88388 61.21457c5.3651733 8.347443 11.624512 15.30365 18.330963 20.172974c3.3532104 2.4346619 6.818207 4.3476562 10.339111 5.6519165c1.760437 0.6521301 3.534851 1.1521301 5.316223 1.4890747c0.44540405 0.084228516 0.8911743 0.15826416 1.3372803 0.22195435l0.60028076 0.0786438" + fill-rule="evenodd" + id="path933" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m380.59183 448.4835l-1.1914368 1.0534973l3.1529236 -0.9329529l-3.0149841 -1.3119812z" + fill-rule="evenodd" + id="path935" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m452.3904 229.5441c22.905518 0 34.358246 -5.2125854 45.811005 -10.425186c11.452759 -5.2126007 22.905518 -10.425201 45.811035 -10.425201" + fill-rule="evenodd" + id="path937" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m452.3904 229.54411c22.905518 0 34.358276 -5.2126007 45.811035 -10.425201c5.7263794 -2.606308 11.452759 -5.2126007 18.610748 -7.167328c3.5789795 -0.97735596 7.515869 -1.7918243 11.989563 -2.3619537c2.2368774 -0.2850647 4.607971 -0.50904846 7.13562 -0.6617737c1.263794 -0.07633972 2.5668335 -0.13487244 3.9116821 -0.17433167l0.73657227 -0.018814087" + fill-rule="evenodd" + id="path939" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m540.58563 208.7347l-1.111084 1.1379547l3.0761108 -1.1614532l-3.1029663 -1.0875549z" + fill-rule="evenodd" + id="path941" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m452.40216 225.97734c0 -26.283463 20.905518 -39.425186 41.811005 -52.566925c20.905548 -13.141724 41.811066 -26.283463 41.811066 -52.566925" + fill-rule="evenodd" + id="path943" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m452.40216 225.97734c0 -26.283463 20.905487 -39.4252 41.811005 -52.566925c10.452759 -6.570862 20.905548 -13.141739 28.745087 -21.355316c3.9197998 -4.1067963 7.1862793 -8.624268 9.472839 -13.757751c1.1432495 -2.566742 2.041504 -5.287491 2.6539917 -8.187912c0.30621338 -1.4502106 0.5410156 -2.945343 0.69921875 -4.4886017c0.03955078 -0.38581085 0.07434082 -0.7746353 0.10424805 -1.1665115l0.013000488 -0.18595123" + fill-rule="evenodd" + id="path945" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m535.90155 124.26837l1.0835571 1.1641159l-1.0132446 -3.1280365l-1.234436 3.0475311z" + fill-rule="evenodd" + id="path947" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m454.75735 231.661c22.314941 0 33.472443 20.960617 44.629913 41.92125c11.157471 20.960632 22.314941 41.921265 44.629944 41.921265" + fill-rule="evenodd" + id="path949" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m454.75735 231.66098c22.314941 0 33.472412 20.960632 44.629913 41.921265c5.5787354 10.480316 11.157471 20.960632 18.13092 28.820862c3.4866943 3.9301147 7.3220825 7.2052307 11.680481 9.497803c2.1791992 1.1462708 4.4891357 2.046936 6.95166 2.6610107c1.2312012 0.30703735 2.5006104 0.54241943 3.810852 0.7010803c0.16375732 0.019836426 0.32818604 0.03845215 0.49328613 0.055877686l0.13989258 0.013671875" + fill-rule="evenodd" + id="path951" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m540.59436 315.33255l-1.1792603 1.0671082l3.1420288 -0.9690857l-3.0298462 -1.2772827z" + fill-rule="evenodd" + id="path953" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m446.78412 455.65433c24.307068 0 36.4606 -3.7401428 48.614166 -7.480316c12.153534 -3.7401428 24.307098 -7.4802856 48.614166 -7.4802856" + fill-rule="evenodd" + id="path955" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m446.78412 455.65433c24.307098 0 36.460632 -3.7401733 48.614166 -7.480316c6.076782 -1.8700867 12.153564 -3.7401733 19.749542 -5.1427307c3.7979736 -0.7012634 7.975708 -1.285675 12.723206 -1.6947632c2.3737793 -0.20455933 4.8898926 -0.36523438 7.5722656 -0.47479248c1.3411255 -0.05480957 2.723816 -0.09680176 4.151062 -0.12512207l0.99108887 -0.017120361" + fill-rule="evenodd" + id="path957" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m540.58545 440.71948l-1.1160889 1.1329956l3.0812378 -1.1477966l-3.0981445 -1.1012878z" + fill-rule="evenodd" + id="path959" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m573.7337 69.68528c0 -12.5 -68.0 -35.0 -136.0 -25.0c-68.0 10.0 -136.0 52.5 -136.0 104.99999" + fill-rule="evenodd" + id="path961" /> + <path + stroke="#980000" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m573.7337 69.68528c0 -12.5 -68.0 -35.0 -136.0 -25.0c-34.0 5.0 -68.0 18.125 -93.5 36.562492c-12.75 9.21875 -23.375 19.765625 -30.8125 31.289062c-3.71875 5.7617188 -6.640625 11.767586 -8.6328125 17.973633c-0.99606323 3.1030273 -1.7597351 6.2561035 -2.274414 9.453735c-0.25732422 1.5988159 -0.45239258 3.2087708 -0.5831299 4.829178c-0.032684326 0.4051056 -0.061340332 0.81085205 -0.0859375 1.2172546l-0.013824463 0.24894714" + fill-rule="evenodd" + id="path963" /> + <path + fill="#980000" + stroke="#980000" + stroke-width="1.0" + stroke-linecap="butt" + d="m301.8311 146.25957l-1.0921936 -1.1560669l1.0363464 3.1204681l1.2119141 -3.0565796z" + fill-rule="evenodd" + id="path965" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m628.3904 213.5441c24.905518 0 37.358276 -1.2125854 49.811035 -2.4251862c12.452759 -1.2126007 24.905518 -2.4252014 49.811035 -2.4252014" + fill-rule="evenodd" + id="path967" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m628.39044 213.54411c24.905518 0 37.358215 -1.2126007 49.810974 -2.4252014c6.2263794 -0.606308 12.452759 -1.2126007 20.235779 -1.6673279c3.8914795 -0.22735596 8.172058 -0.41682434 13.036499 -0.54945374c2.432129 -0.0663147 5.010254 -0.11842346 7.758606 -0.15393066c1.3741455 -0.01777649 2.7908936 -0.031402588 4.253235 -0.04055786l1.0998535 -0.0051574707" + fill-rule="evenodd" + id="path969" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m724.5854 208.7025l-1.1217041 1.1274567l3.086914 -1.1324921l-3.0926514 -1.1166687z" + fill-rule="evenodd" + id="path971" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m622.7841 431.67007c0 -45.75589 36.58264 -68.63385 73.165344 -91.51181c36.582703 -22.87793 73.165344 -45.75589 73.165344 -91.511795" + fill-rule="evenodd" + id="path973" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m622.7841 431.67007c0 -45.75592 36.582703 -68.63385 73.165344 -91.51178c18.29132 -11.438995 36.582703 -22.87796 50.30121 -37.176697c6.859253 -7.149353 12.575256 -15.013641 16.576538 -23.950348c2.0005493 -4.4683533 3.5724487 -9.204803 4.644226 -14.254028c0.5359497 -2.5246277 0.94677734 -5.1274414 1.2236328 -7.814026c0.13842773 -1.3433075 0.24334717 -2.70755 0.3137207 -4.093445l0.035339355 -0.7969208" + fill-rule="evenodd" + id="path975" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m769.04407 252.07283l1.1011353 1.1475525l-1.0605469 -3.11232l-1.1881104 3.0658875z" + fill-rule="evenodd" + id="path977" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m598.7573 117.00678c36.88977 0 55.334656 13.614174 73.77954 27.22834c18.444885 13.6141815 36.88977 27.228348 73.77954 27.228348" + fill-rule="evenodd" + id="path979" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m598.7573 117.006775c36.88977 0 55.334656 13.6141815 73.77954 27.228348c9.222473 6.807083 18.444946 13.6141815 29.972961 18.719482c5.764038 2.552658 12.104431 4.679886 19.30951 6.16893c3.602478 0.7445221 7.4211426 1.3295135 11.492004 1.728363c2.0354614 0.19943237 4.13385 0.35231018 6.2998657 0.45535278c0.5415039 0.025772095 1.0872803 0.04840088 1.6373291 0.06788635c0.2750244 0.009719849 0.5510864 0.018676758 0.8282471 0.026824951l0.8128052 0.021453857" + fill-rule="evenodd" + id="path981" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m742.8896 171.42342l-1.1376343 1.1113739l3.1026611 -1.0884094l-3.076416 -1.160614z" + fill-rule="evenodd" + id="path983" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m451.69748 115.27639c21.078735 0 31.618134 -0.645668 42.1575 -1.2913437c10.539368 -0.645668 21.078735 -1.291336 42.15747 -1.291336" + fill-rule="evenodd" + id="path985" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m451.6975 115.27639c21.078735 0 31.618103 -0.645668 42.15747 -1.291336c5.269684 -0.32283783 10.539368 -0.645668 17.126495 -0.8877945c3.2935486 -0.12106323 6.9164734 -0.22195435 11.033356 -0.29257202c2.0584717 -0.035308838 4.2404785 -0.063056946 6.5665894 -0.081970215c1.1630249 -0.009460449 2.3620605 -0.016708374 3.5997314 -0.021591187l0.40423584 -7.9345703E-4" + fill-rule="evenodd" + id="path987" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m532.5854 112.70034l-1.1224365 1.1267548l3.0876465 -1.1305542l-3.09198 -1.1186066z" + fill-rule="evenodd" + id="path989" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m604.3975 309.543c67.82678 0 135.6535 -36.299225 135.6535 -72.59842" + fill-rule="evenodd" + id="path991" /> + <path + stroke="#595959" + stroke-width="1.0" + stroke-linejoin="round" + stroke-linecap="butt" + stroke-dasharray="8.0,3.0" + d="m604.3975 309.543c33.91339 0 67.82678 -9.074799 93.26178 -22.687012c12.717529 -6.8060913 23.31543 -14.7465515 30.734009 -23.25418c3.7092896 -4.2538147 6.623657 -8.649414 8.610779 -13.115921c0.9935913 -2.233261 1.7553711 -4.4842224 2.2686157 -6.7440643c0.12835693 -0.56495667 0.2411499 -1.1304779 0.3381958 -1.6963959c0.04852295 -0.28297424 0.09307861 -0.5660553 0.13366699 -0.84921265c0.020263672 -0.14157104 0.039611816 -0.28315735 0.057922363 -0.42478943l0.049560547 -0.4055481" + fill-rule="evenodd" + id="path993" /> + <path + fill="#595959" + stroke="#595959" + stroke-width="1.0" + stroke-linecap="butt" + d="m739.852 240.36588l1.0574341 1.1879883l-0.94329834 -3.1498566l-1.302124 3.0192566z" + fill-rule="evenodd" + id="path995" /> + <path + fill="#000000" + fill-opacity="0.0" + d="m49.937008 5.086614l504.22046 0l0 27.464567l-504.22046 0z" + fill-rule="evenodd" + id="path997" /> + <path + fill="#000000" + d="m60.296383 32.00661l0 -13.359373l1.78125 0l0 11.78125l6.562496 0l0 1.5781231l-8.343746 0zm10.250713 -11.468748l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.468748l0 -9.671873l1.640625 0l0 9.671873l-1.640625 0zm4.144821 0l0 -9.671873l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953123l-1.640625 0l0 -5.890623q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.281248l-1.640625 0zm10.375717 0l0 -13.359373l1.640625 0l0 7.625l3.890625 -3.9375l2.109375 0l-3.6875 3.59375l4.0625 6.078123l-2.015625 0l-3.203125 -4.953123l-1.15625 1.125l0 3.828123l-1.640625 0zm18.089554 -1.4687481l0.234375 1.453125q-0.6875 0.1406231 -1.234375 0.1406231q-0.890625 0 -1.390625 -0.2812481q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051788 1.4687481l0 -13.359373l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.124998l-1.640625 0l0 -6.124998q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296873l-1.640625 0zm17.000717 -3.109373l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8124981 -2.765625 0.8124981q-2.125 0 -3.375 -1.2968731q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm14.324654 5.765623l0 -9.671873l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953123l-1.640625 0l0 -5.890623q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.281248l-1.640625 0zm9.766342 -4.843748q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.5937481 -2.328125 0.5937481q-2.03125 0 -3.28125 -1.2968731q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.563217 4.843748l0 -1.2187481q-0.90625 1.4374981 -2.703125 1.4374981q-1.15625 0 -2.125 -0.6406231q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359373l-1.53125 0zm-5.171875 -4.828123q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906967 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8124981 -2.765625 0.8124981q-2.125 0 -3.375 -1.2968731q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm8.485092 2.875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.3906231 -2.046875 0.3906231q-1.875 0 -2.875 -0.7812481q-0.984375 -0.78125 -1.25 -2.328125zm18.745804 1.421875l0.234375 1.453125q-0.6875 0.1406231 -1.234375 0.1406231q-0.890625 0 -1.390625 -0.2812481q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.99580383 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.5937481 -2.328125 0.5937481q-2.03125 0 -3.28125 -1.2968731q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm20.793396 1.296875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9374981 -2.671875 0.9374981q-1.984375 0 -3.1875 -1.2968731q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm3.0 3.546873l0 -9.671873l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.062498l-1.625 0zm12.853302 -3.109373l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8124981 -2.765625 0.8124981q-2.125 0 -3.375 -1.2968731q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.453842 4.578125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3124981 -1.796875 0.3124981q-1.59375 0 -2.453125 -0.7812481q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.1562481l-1.703125 0q-0.265625 -0.5156231 -0.328125 -1.1874981zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781967 3.390625l0.234375 1.453125q-0.6875 0.1406231 -1.234375 0.1406231q-0.890625 0 -1.390625 -0.2812481q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230179 -1.640625l1.6874847 0.203125q-0.40625 1.484375 -1.4843597 2.3125q-1.078125 0.8124981 -2.765625 0.8124981q-2.125 0 -3.375 -1.2968731q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.1562347 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.2187347 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm17.902756 4.296875l0.234375 1.453125q-0.6875 0.1406231 -1.234375 0.1406231q-0.890625 0 -1.390625 -0.2812481q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051941 1.4687481l0 -13.359373l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.124998l-1.640625 0l0 -6.124998q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296873l-1.640625 0zm17.000702 -3.109373l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8124981 -2.765625 0.8124981q-2.125 0 -3.375 -1.2968731q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm14.324646 9.468748l0 -13.374998l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.6249981 -2.140625 0.6249981q-0.8125 0 -1.46875 -0.3437481q-0.65625 -0.34375 -1.0625 -0.875l0 4.703123l-1.640625 0zm1.484375 -8.484373q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.203857 3.59375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3124981 -1.796875 0.3124981q-1.59375 0 -2.453125 -0.7812481q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.1562481l-1.703125 0q-0.265625 -0.5156231 -0.328125 -1.1874981zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm10.516357 1.3125l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9374981 -2.671875 0.9374981q-1.984375 0 -3.1875 -1.2968731q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm3.015625 3.546873l0 -13.359373l1.640625 0l0 7.625l3.890625 -3.9375l2.109375 0l-3.6875 3.59375l4.0625 6.078123l-2.015625 0l-3.203125 -4.953123l-1.15625 1.125l0 3.828123l-1.640625 0zm15.953125 -3.109373l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8124981 -2.765625 0.8124981q-2.125 0 -3.375 -1.2968731q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.1406231 -1.234375 0.1406231q-0.890625 0 -1.390625 -0.2812481q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.179077 1.4687481l0 -8.406248l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.406248l-1.625 0zm4.7457886 0l0 -13.359373l1.640625 0l0 13.359373l-1.640625 0zm3.5823364 -4.843748q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.5937481 -2.328125 0.5937481q-2.03125 0 -3.28125 -1.2968731q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm11.078857 4.843748l-2.96875 -9.671873l1.703125 0l1.53125 5.578125l0.578125 2.078125q0.046875 -0.15625 0.5 -2.0l1.546875 -5.65625l1.6875 0l1.4375 5.609375l0.484375 1.84375l0.5625 -1.859375l1.65625 -5.59375l1.59375 0l-3.03125 9.671873l-1.703125 0l-1.53125 -5.796873l-0.375 -1.640625l-1.953125 7.437498l-1.71875 0z" + fill-rule="nonzero" + id="path999" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/linuxapp_launch.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/linuxapp_launch.svg new file mode 100644 index 000000000..835ed774e --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/linuxapp_launch.svg @@ -0,0 +1,731 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="715.39966" + height="974.03418" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.48.4 r9939" + sodipodi:docname="linux_launch.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/linux_launch.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + version="1.1"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path3253" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path3256" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective10" /> + <inkscape:perspective + id="perspective4899" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective6015" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective6043" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.89337592" + inkscape:cx="400.16263" + inkscape:cy="614.41381" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1258" + inkscape:window-height="1059" + inkscape:window-x="470" + inkscape:window-y="13" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-maximized="0" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1"> + <inkscape:grid + type="xygrid" + id="grid11504" + originx="-22.363911px" + originy="-49.872292px" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-22.363911,-28.455727)"> + <rect + style="fill:#604d92;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect2383" + width="306.92932" + height="972.64362" + x="22.963911" + y="29.183212" + ry="43.684753" /> + <rect + style="fill:#b4acca;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect2391" + width="191.47" + height="972.83417" + x="545.69354" + y="29.055731" + ry="43.693989" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 277.14286,395.62831 280,-2.85714" + id="path4074" + inkscape:connector-curvature="0" /> + <rect + style="fill:#8979b4;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect2389" + width="191.47" + height="972.81195" + x="344.11838" + y="29.055727" + ry="43.692989" /> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="114.71806" + y="46.6479" + id="text3163"><tspan + sodipodi:role="line" + id="tspan3165" + x="114.71806" + y="46.6479">Master lcore</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="397.4306" + y="48.213886" + id="text3167"><tspan + sodipodi:role="line" + id="tspan3169" + x="397.4306" + y="48.213886">lcore 1</tspan></text> + <text + xml:space="preserve" + style="font-size:20px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="601.32257" + y="48.213886" + id="text3171"><tspan + sodipodi:role="line" + id="tspan3173" + x="601.32257" + y="48.213886">lcore 2</tspan></text> + <rect + style="fill:#87838b;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect3168" + width="220" + height="52.857143" + x="66.428574" + y="65.219322" + ry="26.428572" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="151.26277" + y="97.927193" + id="text3170"><tspan + sodipodi:role="line" + id="tspan3172" + x="151.26277" + y="97.927193">main()</tspan></text> + <rect + style="fill:#87838b;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect3174" + width="218.91513" + height="413.35095" + x="66.971016" + y="142.19034" + ry="22.480219" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="124.07087" + y="165.26439" + id="text3176"><tspan + sodipodi:role="line" + id="tspan3178" + x="124.07087" + y="165.26439">rte_eal_init()</tspan></text> + <rect + style="fill:#a09a9a;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect3180" + width="203.60904" + height="107.7429" + x="74.624046" + y="183.37459" + ry="26.447386" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="98.615913" + y="204.89751" + id="text3182" + transform="scale(0.96168464,1.0398419)"><tspan + sodipodi:role="line" + id="tspan3184" + x="98.615913" + y="204.89751">rte_eal_memory_init()</tspan><tspan + sodipodi:role="line" + x="98.615913" + y="224.89751" + id="tspan5208">rte_eal_logs_init()</tspan><tspan + sodipodi:role="line" + x="98.615913" + y="244.89751" + id="tspan5212">rte_eal_pci_init()</tspan><tspan + sodipodi:role="line" + x="98.615913" + y="264.89752" + id="tspan5210">...</tspan></text> + <rect + style="fill:#a09a9a;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect3186" + width="203.60905" + height="52.894772" + x="74.624046" + y="302.60443" + ry="26.447386" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="104.23375" + y="333.24323" + id="text3188"><tspan + sodipodi:role="line" + id="tspan3190" + x="104.23375" + y="333.24323">pthread_create(1)</tspan></text> + <rect + style="fill:#a09a9a;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect3192" + width="203.60905" + height="52.894772" + x="74.624046" + y="363.83432" + ry="26.447386" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="103.1144" + y="394.47311" + id="text3194"><tspan + sodipodi:role="line" + id="tspan3196" + x="103.1144" + y="394.47311">pthread_create(2)</tspan></text> + <rect + style="fill:#a09a9a;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect3210" + width="167.98228" + height="52.982288" + x="355.86224" + y="303.42288" + ry="26.491144" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="420.80188" + y="265.99127" + id="text3212" + transform="scale(0.9075576,1.1018584)"><tspan + sodipodi:role="line" + id="tspan3214" + x="420.80188" + y="265.99127" /></text> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="375.75665" + y="334.62936" + id="text3216"><tspan + sodipodi:role="line" + id="tspan3218" + x="375.75665" + y="334.62936">per-thread init</tspan></text> + <rect + style="fill:#a09a9a;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect3220" + width="167.98228" + height="52.982288" + x="355.86224" + y="371.99429" + ry="26.491144" /> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="419.4346" + y="403.76044" + id="text3222"><tspan + sodipodi:role="line" + id="tspan3224" + x="419.4346" + y="403.76044">wait</tspan></text> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="377.87292" + y="555.20081" + id="text3240"><tspan + sodipodi:role="line" + id="tspan3242" + x="377.87292" + y="555.20081" /></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 278.57143,327.05689 78.57143,0" + id="path3248" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 439.85338,355.62831 0,15.71429" + id="path4028" + inkscape:connector-curvature="0" /> + <rect + style="fill:#a09a9a;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4036" + width="167.98228" + height="52.982288" + x="557.43738" + y="365.56577" + ry="26.491144" /> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="577.33179" + y="396.77225" + id="text4038"><tspan + sodipodi:role="line" + id="tspan4040" + x="577.33179" + y="396.77225">per-thread init</tspan></text> + <rect + style="fill:#a09a9a;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4042" + width="167.98228" + height="52.982288" + x="557.43738" + y="434.13718" + ry="26.491144" /> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="623.0097" + y="465.90332" + id="text4044"><tspan + sodipodi:role="line" + id="tspan4046" + x="623.0097" + y="465.90332">wait</tspan></text> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="579.44806" + y="617.34363" + id="text4062"><tspan + sodipodi:role="line" + id="tspan4064" + x="579.44806" + y="617.34363" /></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 641.42854,417.77117 0,15.71429" + id="path4066" + inkscape:connector-curvature="0" /> + <rect + style="fill:#a09a9a;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect6679" + width="203.60905" + height="52.894772" + x="74.624046" + y="491.46262" + ry="26.447386" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="123.98553" + y="504.03085" + id="text6681" + transform="scale(0.96168465,1.0398419)"><tspan + sodipodi:role="line" + id="tspan6683" + x="123.98553" + y="504.03085">wait all threads</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 164.14979,669.48699 0,19.22028 477.29708,4.04061 0,38.38579" + id="path7745" + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 439.85338,691.73772 0,34.34519" + id="path7747" + inkscape:connector-curvature="0" /> + <rect + style="fill:#a09a9a;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect8791" + width="167.98228" + height="52.982288" + x="355.86224" + y="728.88623" + ry="26.491144" /> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="389.93277" + y="749.95862" + id="text8793"><tspan + sodipodi:role="line" + id="tspan8795" + x="389.93277" + y="749.95862">per_lcore_</tspan><tspan + sodipodi:role="line" + x="389.93277" + y="772.45862" + id="tspan5168"> app_init()</tspan></text> + <rect + style="fill:#a09a9a;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect8797" + width="167.98228" + height="52.982288" + x="557.43738" + y="732.92682" + ry="26.491144" /> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="590.38855" + y="753.99927" + id="text8799"><tspan + sodipodi:role="line" + x="590.38855" + y="753.99927" + id="tspan8833">per_lcore_</tspan><tspan + sodipodi:role="line" + x="590.38855" + y="776.49927" + id="tspan5170"> app_init()</tspan></text> + <rect + style="fill:#87838b;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect8803" + width="220.00066" + height="52.788116" + x="66.428246" + y="697.25879" + ry="15.788192" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="78.448273" + y="727.84424" + id="text8805"><tspan + sodipodi:role="line" + id="tspan8807" + x="78.448273" + y="727.84424">rte_eal_mp_wait_lcore()</tspan></text> + <rect + style="fill:#d3a3a3;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect8815" + width="219.87608" + height="66.805687" + x="66.490532" + y="906.68427" + ry="14.994844" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="176.6356" + y="936.16522" + id="text8817"><tspan + sodipodi:role="line" + id="tspan8819" + x="176.6356" + y="936.16522">application</tspan><tspan + sodipodi:role="line" + x="176.6356" + y="956.16522" + id="tspan10929">...</tspan></text> + <rect + style="fill:#a09a9a;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect8821" + width="167.98228" + height="52.982288" + x="355.86224" + y="805.65778" + ry="26.491144" /> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="417.3515" + y="837.36407" + id="text8823"><tspan + sodipodi:role="line" + id="tspan8825" + x="417.3515" + y="837.36407">wait</tspan></text> + <rect + style="fill:#a09a9a;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect8827" + width="167.98228" + height="52.982288" + x="557.43738" + y="808.68823" + ry="26.491144" /> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="618.36694" + y="838.71545" + id="text8829"><tspan + sodipodi:role="line" + id="tspan8831" + x="618.36694" + y="838.71545">wait</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 439.85338,781.6413 0,24.24366" + id="path8837" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 641.42854,785.93445 0,21.97082" + id="path9360" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 439.6689,858.91797 0.25253,19.69797 -125.76399,0.50508 0.50508,-142.43151 -27.7792,0" + id="path10404" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 440.17397,878.36341 201.02036,-0.75762 0,-15.9099" + id="path10927" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 176.42857,117.466 0,25.25382" + id="path10931" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 176.42857,235.65385 0,8.5863" + id="path10933" + inkscape:connector-curvature="0" /> + <rect + style="fill:#d3a3a3;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect10949" + width="167.16183" + height="66.948586" + x="356.27246" + y="906.61279" + ry="15.026918" /> + <rect + style="fill:#d3a3a3;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect10957" + width="167.16183" + height="66.948586" + x="557.84766" + y="906.61279" + ry="15.026918" /> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="641.66144" + y="935.67499" + id="text10965"><tspan + sodipodi:role="line" + id="tspan10967" + x="641.66144" + y="935.67499">application</tspan><tspan + sodipodi:role="line" + x="641.66144" + y="958.17499" + id="tspan10969">...</tspan></text> + <text + xml:space="preserve" + style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="440.0863" + y="935.67499" + id="text10971"><tspan + sodipodi:role="line" + id="tspan10973" + x="440.0863" + y="935.67499">application</tspan><tspan + sodipodi:role="line" + x="440.0863" + y="958.17499" + id="tspan10975">...</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 176.42857,750.13065 0,145.7957" + id="path11526" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <rect + style="fill:#87838b;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect11518" + width="220.00066" + height="52.788116" + x="66.428246" + y="827.83875" + ry="15.788192" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="69.303398" + y="858.42419" + id="text11520"><tspan + sodipodi:role="line" + id="tspan11522" + x="69.303398" + y="858.42419">rte_eal_remote_launch(app)</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 176.30173,890.61234 0,15.67127" + id="path11530" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 176.58157,899.28751 464.54106,0 0,6.9961" + id="path11532" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 439.85338,899.28751 0,7.55579" + id="path11534" + inkscape:connector-curvature="0" /> + <rect + style="fill:#87838b;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect11518-9" + width="220.00066" + height="52.788116" + x="67.976265" + y="623.56195" + ry="15.788192" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="87.641663" + y="644.07324" + id="text11520-3"><tspan + sodipodi:role="line" + id="tspan11522-1" + x="87.641663" + y="644.07324">rte_eal_remote_launch(</tspan><tspan + sodipodi:role="line" + x="87.641663" + y="664.07324" + id="tspan5214"> per_lcore_app_init)</tspan></text> + <rect + style="fill:#87838b;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect8803-9-8" + width="220.00066" + height="52.788116" + x="67.976265" + y="563.67676" + ry="15.788192" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="85.033371" + y="594.26215" + id="text8805-4-4"><tspan + sodipodi:role="line" + id="tspan8807-7-5" + x="85.033371" + y="594.26215">other inits (libs, drivers)</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 641.94701,486.88444 0,44.21431 -355.11367,-0.55968" + id="path6065" + sodipodi:nodetypes="ccc" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 439.76448,424.90046 0,106.33822" + id="path6253" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/m_definition.png b/src/spdk/dpdk/doc/guides/prog_guide/img/m_definition.png Binary files differnew file mode 100644 index 000000000..d05e8812c --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/m_definition.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/malloc_heap.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/malloc_heap.svg new file mode 100644 index 000000000..f70bd6667 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/malloc_heap.svg @@ -0,0 +1,333 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export malloc_heap.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + width="11in" height="8.5in" viewBox="0 0 792 612" xml:space="preserve" color-interpolation-filters="sRGB" class="st34"> + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st3 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st4 {fill:#deebf6;stroke:#c7c8c8;stroke-width:0.25} + .st5 {fill:#ed7d31;stroke:#c7c8c8;stroke-width:0.25} + .st6 {fill:#fbe5d5;stroke:#c7c8c8;stroke-width:0.25} + .st7 {fill:#e2efd9;stroke:#c7c8c8;stroke-width:0.25} + .st8 {fill:#a8d08d;stroke:#c7c8c8;stroke-width:0.25} + .st9 {fill:url(#ptrn2-71);shape-rendering:crispEdges;stroke:#c7c8c8;stroke-width:0.25} + .st10 {fill:#5b9bd5;stroke:#2e75b5;stroke-width:0.25} + .st11 {fill:none;stroke:none;stroke-width:0.25} + .st12 {fill:#000000;font-family:Calibri;font-size:1.00001em} + .st13 {fill:#ed7d31;stroke:#2e75b5;stroke-width:0.25} + .st14 {fill:#deebf6;stroke:#2e75b5;stroke-width:0.25} + .st15 {fill:#fbe5d5;stroke:#2e75b5;stroke-width:0.25} + .st16 {fill:#a8d08d;stroke:#2e75b5;stroke-width:0.25} + .st17 {fill:#e2efd9;stroke:#2e75b5;stroke-width:0.25} + .st18 {fill:url(#ptrn2-71);shape-rendering:crispEdges;stroke:#2e75b5;stroke-width:0.25} + .st19 {fill:#f4b183;stroke:#4f87bb;stroke-width:0.75} + .st20 {fill:#305497;font-family:Calibri;font-size:0.833336em} + .st21 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25} + .st22 {fill:#538135;stroke:#40709c;stroke-width:0.75} + .st23 {fill:#e2efd9;font-family:Calibri;font-size:0.833336em} + .st24 {marker-end:url(#mrkr10-146);marker-start:url(#mrkr10-144);stroke:#70ad47;stroke-width:0.75} + .st25 {fill:#70ad47;fill-opacity:1;stroke:#70ad47;stroke-opacity:1;stroke-width:0.22935779816514} + .st26 {fill:#ffffff;stroke:none;stroke-linecap:butt;stroke-width:7.2} + .st27 {fill:#538135;font-family:Calibri;font-size:1.00001em} + .st28 {fill:#ffffff;stroke:none;stroke-linecap:butt} + .st29 {fill:#bdd7ee;stroke:#40709c;stroke-width:0.75} + .st30 {fill:#1e4e79;font-family:Calibri;font-size:0.833336em} + .st31 {marker-end:url(#mrkr5-171);stroke:#4f87bb;stroke-dasharray:11.25,6.75;stroke-width:0.75} + .st32 {fill:#4f87bb;fill-opacity:1;stroke:#4f87bb;stroke-opacity:1;stroke-width:0.22935779816514} + .st33 {fill:#1e4e79;font-family:Calibri;font-size:1.00001em} + .st34 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Patterns_And_Gradients"> + <pattern id="ptrn2-71" patternUnits="userSpaceOnUse" width="6" height="6" viewBox="0 0 64 64"> + <image x="0" y="0" width="64" height="64" image-rendering="optimizeSpeed" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA7SURBVChTY/i3f7/Pv3//MDFIXETEhwGfJIjGVIAkCeKjKkCTRFWARRKhAIckRAEeSYgCPJL/9u/3AQC1aLsBz7wFUwAAAABJRU5ErkJggg=="/> + </pattern> + <linearGradient id="grad0-168" x1="0" y1="0" x2="1" y2="0" gradientTransform="rotate(60 0.5 0.5)"> + <stop offset="0" stop-color="#e9eff7" stop-opacity="1"/> + <stop offset="0.24" stop-color="#f4f7fb" stop-opacity="1"/> + <stop offset="0.54" stop-color="#feffff" stop-opacity="1"/> + </linearGradient> + </defs> + <defs id="Markers"> + <g id="lend10"> + <path + d="M 0 0.75 C -0.414214 0.75 -0.75 0.414214 -0.75 0 -0.75 -0.414214 -0.414214 -0.75 0 -0.75 0.414214 -0.75 0.75 -0.414214 0.75 0 0.75 0.414214 0.414214 0.75 0 0.75 Z " + style="stroke:none"/> + </g> + <marker id="mrkr10-144" class="st25" refX="2.79" orient="auto" markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend10" transform="scale(4.36) "/> + </marker> + <marker id="mrkr10-146" class="st25" refX="-2.79" orient="auto" markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend10" transform="scale(-4.36,-4.36) "/> + </marker> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-171" class="st32" refX="-7.15" orient="auto" markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-4.36,-4.36) "/> + </marker> + </defs> + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g> + <title>Page-1</title> + <g id="group14-1" transform="translate(45,-360)"> + <title>Sheet.14</title> + <g id="shape3-2"> + <title>Sheet.3</title> + <g id="shadow3-3" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="18" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="18" height="81" class="st3"/> + </g> + <g id="shape4-7" transform="translate(18,0)"> + <title>Sheet.4</title> + <g id="shadow4-8" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="117" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="117" height="81" class="st4"/> + </g> + </g> + <g id="group15-12" transform="translate(180,-360)"> + <title>Sheet.15</title> + <g id="shape5-13"> + <title>Sheet.5</title> + <g id="shadow5-14" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="18" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="18" height="81" class="st5"/> + </g> + <g id="shape6-18" transform="translate(18,0)"> + <title>Sheet.6</title> + <g id="shadow6-19" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="117" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="117" height="81" class="st6"/> + </g> + </g> + <g id="shape7-23" transform="translate(612,-360)"> + <title>Sheet.7</title> + <g id="shadow7-24" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="18" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="18" height="81" class="st5"/> + </g> + <g id="shape10-28" transform="translate(630,-360)"> + <title>Sheet.10</title> + <g id="shadow10-29" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="51.75" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="51.75" height="81" class="st7"/> + </g> + <g id="shape12-33" transform="translate(681.75,-360)"> + <title>Sheet.12</title> + <g id="shadow12-34" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="18" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="18" height="81" class="st8"/> + </g> + <g id="shape13-38" transform="translate(699.75,-360)"> + <title>Sheet.13</title> + <g id="shadow13-39" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="47.25" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="47.25" height="81" class="st6"/> + </g> + <g id="group29-43" transform="translate(315,-360)"> + <title>Sheet.29</title> + <g id="shape23-44"> + <title>Sheet.23</title> + <g id="shadow23-45" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="18" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="18" height="81" class="st3"/> + </g> + <g id="shape24-49" transform="translate(18,0)"> + <title>Sheet.24</title> + <g id="shadow24-50" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="36" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="36" height="81" class="st4"/> + </g> + </g> + <g id="group30-54" transform="translate(477,-360)"> + <title>Sheet.30</title> + <g id="shape27-55"> + <title>Sheet.27</title> + <g id="shadow27-56" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="18" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="18" height="81" class="st3"/> + </g> + <g id="shape28-60" transform="translate(18,0)"> + <title>Sheet.28</title> + <g id="shadow28-61" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="117" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="117" height="81" class="st4"/> + </g> + </g> + <g id="shape31-65" transform="translate(369,-360)"> + <title>Sheet.31</title> + <g id="shadow31-66" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="531" width="108" height="81" class="st2"/> + </g> + <rect x="0" y="531" width="108" height="81" class="st9"/> + </g> + <g id="shape32-72" transform="translate(184.5,-260)"> + <title>Sheet.32</title> + <g id="shadow32-73" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="594" width="63" height="18" class="st2"/> + </g> + <rect x="0" y="594" width="63" height="18" class="st10"/> + </g> + <g id="shape39-77" transform="translate(252,-259)"> + <title>Sheet.39</title> + <desc>Free element header</desc> + <rect x="0" y="592" width="135" height="20" class="st11"/> + <text x="4" y="605.6" class="st12">Free element header</text> </g> + <g id="shape43-80" transform="translate(184.5,-232)"> + <title>Sheet.43</title> + <g id="shadow43-81" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="594" width="63" height="18" class="st2"/> + </g> + <rect x="0" y="594" width="63" height="18" class="st13"/> + </g> + <g id="shape44-85" transform="translate(252,-231)"> + <title>Sheet.44</title> + <desc>Used element header</desc> + <rect x="0" y="592" width="135" height="20" class="st11"/> + <text x="4" y="605.6" class="st12">Used element header</text> </g> + <g id="shape46-88" transform="translate(409.5,-260)"> + <title>Sheet.46</title> + <g id="shadow46-89" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="594" width="63" height="18" class="st2"/> + </g> + <rect x="0" y="594" width="63" height="18" class="st14"/> + </g> + <g id="shape47-93" transform="translate(477,-259)"> + <title>Sheet.47</title> + <desc>Free space</desc> + <rect x="0" y="592" width="135" height="20" class="st11"/> + <text x="4" y="605.6" class="st12">Free space</text> </g> + <g id="shape49-96" transform="translate(409.5,-232)"> + <title>Sheet.49</title> + <g id="shadow49-97" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="594" width="63" height="18" class="st2"/> + </g> + <rect x="0" y="594" width="63" height="18" class="st15"/> + </g> + <g id="shape50-101" transform="translate(477,-231)"> + <title>Sheet.50</title> + <desc>Allocated data</desc> + <rect x="0" y="592" width="135" height="20" class="st11"/> + <text x="4" y="605.6" class="st12">Allocated data</text> </g> + <g id="shape52-104" transform="translate(184.5,-204)"> + <title>Sheet.52</title> + <g id="shadow52-105" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="594" width="63" height="18" class="st2"/> + </g> + <rect x="0" y="594" width="63" height="18" class="st16"/> + </g> + <g id="shape53-109" transform="translate(252,-203)"> + <title>Sheet.53</title> + <desc>Pad element header</desc> + <rect x="0" y="592" width="135" height="20" class="st11"/> + <text x="4" y="605.6" class="st12">Pad element header</text> </g> + <g id="shape62-112" transform="translate(409.5,-204)"> + <title>Sheet.62</title> + <g id="shadow62-113" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="594" width="63" height="18" class="st2"/> + </g> + <rect x="0" y="594" width="63" height="18" class="st17"/> + </g> + <g id="shape63-117" transform="translate(477,-203)"> + <title>Sheet.63</title> + <desc>Padding</desc> + <rect x="0" y="592" width="135" height="20" class="st11"/> + <text x="4" y="605.6" class="st12">Padding</text> </g> + <g id="shape65-120" transform="translate(184.5,-176)"> + <title>Sheet.65</title> + <g id="shadow65-121" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="594" width="63" height="18" class="st2"/> + </g> + <rect x="0" y="594" width="63" height="18" class="st18"/> + </g> + <g id="shape66-126" transform="translate(252,-175)"> + <title>Sheet.66</title> + <desc>Unavailable space</desc> + <rect x="0" y="592" width="135" height="20" class="st11"/> + <text x="4" y="605.6" class="st12">Unavailable space</text> </g> + <g id="shape97-129" transform="translate(612,-375.75)"> + <title>Simple Double Arrow</title> + <desc>size</desc> + <path d="M0 612 L18 598.5 L18 605.25 L117 605.25 L117 598.5 L135 612 L117 625.5 L117 618.75 L18 618.75 L18 625.5 L0 612 + Z" class="st19"/> + <text x="59.93" y="615" class="st20">size</text> </g> + <g id="shape99-132" transform="translate(630,-400.5)"> + <title>Simple Double Arrow.99</title> + <desc>pad</desc> + <g id="shadow99-133" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 612 L12 600 L12 606 L57.75 606 L57.75 600 L69.75 612 L57.75 624 L57.75 618 L12 618 L12 624 L0 612 Z" + class="st21"/> + </g> + <path d="M0 612 L12 600 L12 606 L57.75 606 L57.75 600 L69.75 612 L57.75 624 L57.75 618 L12 618 L12 624 L0 612 Z" + class="st22"/> + <text x="27.23" y="615" class="st23">pad</text> </g> + <g id="shape113-138" transform="translate(54,-337.5)"> + <title>Sheet.113</title> + <desc>prev/next</desc> + <path d="M134.64 591.56 L134.58 591.92 A72 22.5 0 0 1 63 612 A63 22.5 0 0 1 0.37 591.92 L0.31 591.57" class="st24"/> + <rect x="43.4968" y="593.55" width="48.0064" height="14.4001" class="st26"/> + <text x="43.5" y="604.35" class="st27">prev/next</text> </g> + <g id="shape115-149" transform="translate(324,-337.5)"> + <title>Sheet.115</title> + <desc>prev/next</desc> + <path d="M0.44 591.55 L0.51 591.9 A90 22.5 -180 0 0 90 612 A72 22.5 -180 0 0 161.58 591.92 L161.64 591.56" class="st24"/> + <rect x="56.9968" y="593.55" width="48.0064" height="14.4001" class="st28"/> + <text x="57" y="604.35" class="st27">prev/next</text> </g> + <g id="shape118-158" transform="translate(315,-390.375)"> + <title>Simple Double Arrow.118</title> + <desc>size</desc> + <g id="shadow118-159" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 612 L12 600 L12 606 L42 606 L42 600 L54 612 L42 624 L42 618 L12 618 L12 624 L0 612 Z" class="st21"/> + </g> + <path d="M0 612 L12 600 L12 606 L42 606 L42 600 L54 612 L42 624 L42 618 L12 618 L12 624 L0 612 Z" class="st29"/> + <text x="19.43" y="615" class="st30">size</text> </g> + <g id="shape119-164" transform="translate(54,-441)"> + <title>Sheet.119</title> + <desc>next free</desc> + <path d="M-0 612 A135 22.5 0 0 1 135 589.5 A134.606 21.534 0 0 1 266.35 606.33 L266.56 606.62" class="st31"/> + <rect x="112.807" y="593.55" width="43.9926" height="14.4001" class="st26"/> + <text x="112.81" y="604.35" class="st33">next free</text> </g> + <g id="shape120-174" transform="translate(323.739,-441.34)"> + <title>Sheet.120</title> + <desc>next free</desc> + <path d="M0.24 612 A78.4445 18.5592 178.15 0 1 72.26 589.84 A81.2523 26.5101 179.07 0 1 159.23 607.01 L159.43 607.31" + class="st31"/> + <rect x="59.193" y="593.55" width="43.9926" height="14.4001" class="st28"/> + <text x="59.19" y="604.35" class="st33">next free</text> </g> + <g id="shape122-182" transform="translate(189,-337.5)"> + <title>Sheet.122</title> + <desc>prev/next</desc> + <path d="M0.33 591.57 L0.39 591.92 A67.5 22.5 -180 0 0 67.5 612 A69.1875 22.5 -180 0 0 136.29 591.92 L136.35 591.56" + class="st24"/> + <rect x="44.3405" y="593.55" width="48.0064" height="14.4001" class="st26"/> + <text x="44.34" y="604.35" class="st27">prev/next</text> </g> + <g id="shape123-191" transform="translate(486.563,-337.5)"> + <title>Sheet.123</title> + <desc>prev/next</desc> + <path d="M0.35 591.56 L0.41 591.92 A71.4375 22.5 -180 0 0 71.44 612 A63 22.5 -180 0 0 134.07 591.92 L134.12 591.57" + class="st24"/> + <rect x="43.2155" y="593.55" width="48.0064" height="14.4001" class="st26"/> + <text x="43.22" y="604.35" class="st27">prev/next</text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/mbuf1.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/mbuf1.svg new file mode 100644 index 000000000..a08bf3b6c --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/mbuf1.svg @@ -0,0 +1,549 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010-2014 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="631.91431" + height="288.34286" + id="svg3868" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="mbuf1.svg" + sodipodi:version="0.32" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs3870"> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path4530" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + id="path4533" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <linearGradient + id="linearGradient4513"> + <stop + style="stop-color:#fdffdb;stop-opacity:1;" + offset="0" + id="stop4515" /> + <stop + style="stop-color:#dfe2d8;stop-opacity:0;" + offset="1" + id="stop4517" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3876" /> + <inkscape:perspective + id="perspective3886" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path3211" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3892" + style="overflow:visible"> + <path + id="path3894" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3896" + style="overflow:visible"> + <path + id="path3898" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path3208" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3902" + style="overflow:visible"> + <path + id="path3904" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="marker3906" + style="overflow:visible"> + <path + id="path3908" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3910" + style="overflow:visible"> + <path + id="path3912" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4086" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4113" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4513" + id="linearGradient4519" + x1="47.142857" + y1="244.50504" + x2="677.85718" + y2="244.50504" + gradientUnits="userSpaceOnUse" /> + <inkscape:perspective + id="perspective5195" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-4" + style="overflow:visible"> + <path + id="path4533-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5272" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-4" + style="overflow:visible"> + <path + id="path4530-5" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-0" + style="overflow:visible"> + <path + id="path4533-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5317" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-3" + style="overflow:visible"> + <path + id="path4530-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-06" + style="overflow:visible"> + <path + id="path4533-1" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.8231676" + inkscape:cx="315.95715" + inkscape:cy="144.17143" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1910" + inkscape:window-height="1170" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1" /> + <metadata + id="metadata3873"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-46.542857,-100.33361)"> + <rect + style="fill:url(#linearGradient4519);fill-opacity:1;stroke:#000000;stroke-opacity:1" + id="rect3697" + width="630.71429" + height="287.14285" + x="47.142857" + y="100.93361" + rx="6.757" + ry="6.757" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.26876688;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect2896" + width="308.0022" + height="58.000771" + x="253.55229" + y="197.48174" + ry="11.60514" + rx="11.60514" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" /> + <rect + style="fill:#b93a3a;fill-opacity:1;fill-rule:evenodd;stroke:none" + id="rect2898" + width="174.71004" + height="58.000679" + x="349.47122" + y="197.48174" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + rx="8.5874939" + ry="8.5874939" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" + d="m 357.26687,268.98771 c 141.42583,0 105.6555,0 164.91182,0" + id="path2904" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.26876688;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect2910" + width="60.59267" + height="51.656937" + x="255.93231" + y="200.90929" + ry="8.5874939" + rx="8.5874939" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" /> + <text + xml:space="preserve" + style="font-size:15.22520161px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="468.47687" + y="376.4664" + id="text2912" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112"><tspan + sodipodi:role="line" + x="468.47687" + y="376.4664" + id="tspan2916" + style="font-weight:bold">struct rte_mbuf </tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)" + d="M 270.40246,239.43649 C 273.9494,287.74619 176.1143,278.684 176.1143,278.684" + id="path2974" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)" + d="m 339.73824,127.0486 c 18.96656,9.93299 12.80457,67.17793 12.80457,67.17793" + id="path2976" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:15.22520161px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="99.327995" + y="317.25745" + id="text2978" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112"><tspan + sodipodi:role="line" + x="99.327995" + y="317.25745" + id="tspan3006" /></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)" + d="m 263.28446,331.99662 c 39.26122,1.88113 54.28327,-61.82392 54.28327,-61.82392" + id="path2974-8" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="187.85715" + y="335.2193" + id="text5215"><tspan + sodipodi:role="line" + id="tspan5217" + x="187.85715" + y="335.2193">m->buf_addr</tspan><tspan + sodipodi:role="line" + x="187.85715" + y="347.7193" + id="tspan5240">(m->buf_iova is the</tspan><tspan + sodipodi:role="line" + x="187.85715" + y="360.2193" + id="tspan5242">corresponding physical address)</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="249.28572" + y="119.50503" + id="text5219"><tspan + sodipodi:role="line" + x="249.28572" + y="119.50503" + id="tspan5223">rte_pktmbuf_mtod(m)</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="271.42859" + y="210.93361" + id="text5248"><tspan + sodipodi:role="line" + id="tspan5250" + x="271.42859" + y="210.93361">mbuf</tspan><tspan + sodipodi:role="line" + x="271.42859" + y="223.43361" + id="tspan5252">struct</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="59.842155" + y="282.37683" + id="text5254"><tspan + sodipodi:role="line" + id="tspan5256" + x="59.842155" + y="282.37683">m->pkt.next = NULL</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="372.14285" + y="282.64789" + id="text5258"><tspan + sodipodi:role="line" + id="tspan5260" + x="372.14285" + y="282.64789">rte_pktmbuf_pktlen(m)</tspan><tspan + sodipodi:role="line" + x="372.14285" + y="295.14789" + id="tspan5262">or rte_pktmbuf_datalen(m)</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" + d="m 323.25837,215.46035 c 141.42583,0 -35.05878,0 24.19754,0" + id="path2904-6" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="319.56296" + y="231.04784" + id="text5258-1"><tspan + sodipodi:role="line" + x="319.56296" + y="231.04784" + id="tspan5262-6">headroom</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" + d="m 526.20982,215.46035 c 141.42583,0 -25.77306,0 33.48326,0" + id="path2904-6-5" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="525.0144" + y="231.04784" + id="text5258-1-5"><tspan + sodipodi:role="line" + x="525.0144" + y="231.04784" + id="tspan5262-6-4">tailroom</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0" + d="m 318.57143,197.71932 0,69.28572" + id="path7127" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/mbuf2.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/mbuf2.svg new file mode 100644 index 000000000..f6fdb5400 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/mbuf2.svg @@ -0,0 +1,1229 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010-2014 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="631.91431" + height="288.34286" + id="svg3868" + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="mbuf2.svg" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf2.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + sodipodi:version="0.32" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs3870"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3876" /> + <inkscape:perspective + id="perspective3886" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path3211" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3892" + style="overflow:visible"> + <path + id="path3894" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3896" + style="overflow:visible"> + <path + id="path3898" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path3208" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3902" + style="overflow:visible"> + <path + id="path3904" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="marker3906" + style="overflow:visible"> + <path + id="path3908" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3910" + style="overflow:visible"> + <path + id="path3912" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4086" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4113" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4304" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-6" + style="overflow:visible"> + <path + id="path3211-5" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart-6" + style="overflow:visible"> + <path + id="path3208-9" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4312" + style="overflow:visible"> + <path + id="path4314" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="marker4316" + style="overflow:visible"> + <path + id="path4318" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4320" + style="overflow:visible"> + <path + id="path4322" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4304-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-8" + style="overflow:visible"> + <path + id="path3211-8" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart-4" + style="overflow:visible"> + <path + id="path3208-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4312-1" + style="overflow:visible"> + <path + id="path4314-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="marker4316-9" + style="overflow:visible"> + <path + id="path4318-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4320-0" + style="overflow:visible"> + <path + id="path4322-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4456" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-2" + style="overflow:visible"> + <path + id="path3211-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4484" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4509" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-61" + style="overflow:visible"> + <path + id="path3211-59" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4558" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3279" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart-9" + style="overflow:visible"> + <path + id="path3208-31" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path3211-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3313" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3338" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5616" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path4530" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + id="path4533" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="marker5624" + style="overflow:visible"> + <path + id="path5626" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker5628" + style="overflow:visible"> + <path + id="path5630" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker5632" + style="overflow:visible"> + <path + id="path5634" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker5636" + style="overflow:visible"> + <path + id="path5638" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker5640" + style="overflow:visible"> + <path + id="path5642" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="marker5644" + style="overflow:visible"> + <path + id="path5646" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker5648" + style="overflow:visible"> + <path + id="path5650" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4513" + id="linearGradient4519" + x1="47.142857" + y1="244.50504" + x2="677.85718" + y2="244.50504" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient4513"> + <stop + style="stop-color:#fdffdb;stop-opacity:1;" + offset="0" + id="stop4515" /> + <stop + style="stop-color:#dfe2d8;stop-opacity:0;" + offset="1" + id="stop4517" /> + </linearGradient> + <linearGradient + gradientTransform="translate(17.806842,326.00779)" + y2="244.50504" + x2="677.85718" + y1="244.50504" + x1="47.142857" + gradientUnits="userSpaceOnUse" + id="linearGradient5687" + xlink:href="#linearGradient4513" + inkscape:collect="always" /> + <inkscape:perspective + id="perspective6744" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-4" + style="overflow:visible"> + <path + id="path4533-5" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective6772" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-5" + style="overflow:visible"> + <path + id="path4533-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective6802" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-44" + style="overflow:visible"> + <path + id="path4533-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective6830" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-7" + style="overflow:visible"> + <path + id="path4533-8" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective6864" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective6889" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective6926" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-9" + style="overflow:visible"> + <path + id="path4533-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective6963" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective6995" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-9" + style="overflow:visible"> + <path + id="path4530-5" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-0" + style="overflow:visible"> + <path + id="path4533-48" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective7029" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-1" + style="overflow:visible"> + <path + id="path4530-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-2" + style="overflow:visible"> + <path + id="path4533-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective7074" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-6" + style="overflow:visible"> + <path + id="path4530-1" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-59" + style="overflow:visible"> + <path + id="path4533-49" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective7074-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-7" + style="overflow:visible"> + <path + id="path4530-11" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597" + style="overflow:visible"> + <path + id="path4533-76" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.979899" + inkscape:cx="335.62533" + inkscape:cy="102.43492" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="1017" + inkscape:window-x="1592" + inkscape:window-y="285" + inkscape:window-maximized="1" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1" /> + <metadata + id="metadata3873"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-64.349699,-426.34141)"> + <rect + style="fill:url(#linearGradient5687);fill-opacity:1;stroke:#000000;stroke-opacity:1" + id="rect3697" + width="630.71429" + height="287.14285" + x="64.949699" + y="426.94141" + rx="6.757" + ry="6.757" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.73872942;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect2896" + width="179.33183" + height="33.770489" + x="111.0281" + y="537.48676" + ry="6.7570004" + rx="6.7570004" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" /> + <rect + style="fill:#b93a3a;fill-opacity:1;fill-rule:evenodd;stroke:none" + id="rect2898" + width="119.42986" + height="33.770508" + x="169.26131" + y="537.48676" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + rx="4.3271284" + ry="5" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.73872942;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect2910" + width="35.279602" + height="30.076841" + x="113.57833" + y="539.33356" + ry="5" + rx="5" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" /> + <path + style="fill:none;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker5648)" + d="m 125.12469,563.52674 c 2.06519,75.98508 108.79908,120.50695 185.10147,9.9944" + id="path2974" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + inkscape:connector-curvature="0" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.73872942;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect2896-3" + width="179.33183" + height="33.770489" + x="304.61978" + y="537.48676" + ry="6.7570004" + rx="6.7570004" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" /> + <rect + style="fill:#b93a3a;fill-opacity:1;fill-rule:evenodd;stroke:none" + id="rect2898-7" + width="137.28705" + height="33.770508" + x="344.99582" + y="537.48676" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + rx="5" + ry="5" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.73872942;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect2910-7" + width="35.279602" + height="30.076841" + x="307.17001" + y="539.33356" + ry="5" + rx="5" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.73872942;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect2896-8" + width="179.33183" + height="33.770489" + x="496.04834" + y="537.48676" + ry="6.7570004" + rx="6.7570004" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" /> + <rect + style="fill:#b93a3a;fill-opacity:1;fill-rule:evenodd;stroke:none" + id="rect2898-9" + width="101.5728" + height="33.770508" + x="534.99585" + y="537.48676" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + rx="5" + ry="5" /> + <rect + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.73872942;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect2910-5" + width="35.279602" + height="30.076841" + x="498.59857" + y="539.33356" + ry="5" + rx="5" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" /> + <path + style="fill:none;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker5648)" + d="m 323.19397,564.19918 c 2.06519,75.98508 173.08478,89.07838 185.10146,9.9944" + id="path2974-6" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker5648)" + d="m 519.12036,562.95397 c 4.39975,33.26738 10.7052,43.94422 27.24434,62.13727" + id="path2976-1-4" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:15.22520161px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="424.78918" + y="702.44879" + id="text2912" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112"><tspan + sodipodi:role="line" + x="424.78918" + y="702.44879" + id="tspan2916" + style="font-weight:bold">multi-segmented rte_mbuf</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)" + d="m 119.23004,564.01527 c 101.10943,109.21871 189.23315,8.60651 189.23315,8.60651" + id="path2976-3-7" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)" + d="m 312.98114,565.49459 c 101.10943,109.21871 189.23315,8.60651 189.23315,8.60651" + id="path2976-3-7-0" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)" + d="m 509.59959,565.53369 c -3.54694,48.3097 82.1453,49.9618 82.1453,49.9618" + id="path2974-9-6" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="527.19458" + y="628.45935" + id="text5254-8"><tspan + sodipodi:role="line" + id="tspan5256-8" + x="527.19458" + y="628.45935">m->pkt.next = NULL</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="330.50363" + y="628.45935" + id="text5254-8-4"><tspan + sodipodi:role="line" + id="tspan5256-8-3" + x="330.50363" + y="628.45935">m->pkt.next = mseg3</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="144.79388" + y="628.45935" + id="text5254-8-4-1"><tspan + sodipodi:role="line" + id="tspan5256-8-3-4" + x="144.79388" + y="628.45935">m->pkt.next = mseg2</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="113.85714" + y="529.92017" + id="text6906"><tspan + sodipodi:role="line" + id="tspan6908" + x="113.85714" + y="529.92017">m</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="310.42856" + y="529.79077" + id="text6910"><tspan + sodipodi:role="line" + id="tspan6912" + x="310.42856" + y="529.79077">mseg2</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="501.85715" + y="529.79077" + id="text6914"><tspan + sodipodi:role="line" + id="tspan6916" + x="501.85715" + y="529.79077">mseg3</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)" + d="m 158.74072,504.12577 c 12.53799,12.07585 14.94743,31.46365 14.94743,31.46365" + id="path2976-3-0" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="78.793297" + y="498.27075" + id="text5219-6"><tspan + sodipodi:role="line" + x="78.793297" + y="498.27075" + id="tspan5223-9">rte_pktmbuf_mtod(m)</tspan></text> + <text + xml:space="preserve" + style="font-size:10.48159599px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="233.53358" + y="470.28363" + id="text5258-2" + transform="scale(1.0481596,0.95405318)"><tspan + sodipodi:role="line" + x="233.53358" + y="470.28363" + id="tspan5262-64">rte_pktmbuf_pktlen(m) = rte_pktmbuf_datalen(m) +</tspan><tspan + sodipodi:role="line" + x="233.53358" + y="483.38562" + id="tspan6985"> rte_pktmbuf_datalen(mseg2) + rte_pktmbuf_datalen(mseg3)</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" + d="m 173.97266,470.21933 c 141.42583,0 391.36979,0 450.62611,0" + id="path2904-5-7" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" + d="m 175.25836,577.20906 c 141.42583,0 49.22693,0 108.48325,0" + id="path2904-5-2" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="153.42009" + y="590.86926" + id="text5258-26"><tspan + sodipodi:role="line" + x="153.42009" + y="590.86926" + id="tspan5262-0">rte_pktmbuf_datalen(m)</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" + d="m 348.97266,577.20906 c 141.42583,0 69.22693,0 128.48325,0" + id="path2904-5-2-0" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="345.56296" + y="590.86926" + id="text5258-26-9"><tspan + sodipodi:role="line" + x="345.56296" + y="590.86926" + id="tspan5262-0-1">rte_pktmbuf_datalen(m)</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.26900005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" + d="m 539.68695,577.20906 c 141.42582,0 33.51263,0 92.76895,0" + id="path2904-5-2-7" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="537.1344" + y="590.86926" + id="text5258-26-3"><tspan + sodipodi:role="line" + x="537.1344" + y="590.86926" + id="tspan5262-0-6">rte_pktmbuf_datalen(m)</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/member_i1.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i1.svg new file mode 100644 index 000000000..fc5f56ac5 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i1.svg @@ -0,0 +1,1613 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> +<!-- Generated by Microsoft Visio 11.0, SVG Export, v1.0 memship_i1.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="7.18709in" height="4.75757in" + viewBox="0 0 517.471 342.545" xml:space="preserve" color-interpolation-filters="sRGB" class="st61"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:none;stroke:#5b9bd5;stroke-opacity:0.22;stroke-width:3} + .st3 {fill:#5b9bd5;font-family:Calibri;font-size:0.666664em;opacity:0.219608} + .st4 {font-size:1em} + .st5 {fill:none;stroke:#41719c;stroke-width:3} + .st6 {fill:#5b9bd5;font-family:Calibri;font-size:0.666664em} + .st7 {fill:#5b9bd5;font-family:Calibri;font-size:0.75em;opacity:0.219608} + .st8 {fill:#5b9bd5;font-family:Calibri;font-size:0.75em} + .st9 {fill:#5b9bd5;fill-opacity:0.22;stroke:#5b9bd5;stroke-opacity:0.22;stroke-width:0.25} + .st10 {fill:#5b9bd5;stroke:#c8c8c8;stroke-width:0.25} + .st11 {fill:none;stroke:none;stroke-width:0.25} + .st12 {fill:#ffffff;font-family:Calibri;font-size:0.499992em;font-weight:bold} + .st13 {fill:#ffffff;font-family:Calibri;font-size:0.75em;font-weight:bold} + .st14 {marker-end:url(#mrkr5-63);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st15 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.28409090909091} + .st16 {fill:#5b9bd5;font-family:Calibri;font-size:0.499992em;font-weight:bold} + .st17 {stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st18 {fill:#feffff;font-family:Calibri;font-size:0.499992em} + .st19 {fill:#deebf6;stroke:#c8c8c8;stroke-width:0.25} + .st20 {fill:#000000;font-family:Calibri;font-size:0.499992em} + .st21 {marker-end:url(#mrkr5-178);stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st22 {fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1;stroke-width:0.28409090909091} + .st23 {fill:#ff0000;font-family:Calibri;font-size:0.666664em} + .st24 {fill:#5b9bd5;fill-opacity:0.22} + .st25 {stroke:#5b9bd5;stroke-opacity:0.22;stroke-width:0.25} + .st26 {fill:#ffffff} + .st27 {stroke:#0070c0;stroke-width:0.25} + .st28 {fill:#5b9bd5;stroke:#0070c0;stroke-width:0.25} + .st29 {fill:#5b9bd5;stroke:#ffffff;stroke-width:0.25} + .st30 {fill:#5b9bd5} + .st31 {stroke:#c8c8c8;stroke-width:0.25} + .st32 {fill:#acccea;stroke:#c8c8c8;stroke-width:0.25} + .st33 {fill:#5b9bd5;fill-opacity:0.22;stroke:none;stroke-linecap:butt;stroke-width:0.75} + .st34 {fill:#000000;fill-opacity:0;stroke:none;stroke-linecap:butt;stroke-width:0.75} + .st35 {fill:url(#grad30-309);stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st36 {fill:url(#grad25-313);stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st37 {fill:url(#grad35-317);stroke:#308dda;stroke-linecap:butt;stroke-width:0.130208} + .st38 {fill:url(#grad36-325);stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st39 {fill:url(#grad40-335);stroke:#000000;stroke-linecap:butt;stroke-width:0.130208} + .st40 {fill:url(#grad39-342);stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st41 {fill:url(#grad40-355);stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st42 {fill:none} + .st43 {stroke:#308dda;stroke-linecap:butt;stroke-width:0.130208} + .st44 {stroke:#ffffff;stroke-linecap:butt;stroke-width:0.130208} + .st45 {fill:url(#grad30-383);stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st46 {fill:url(#grad36-396);stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st47 {fill:none;stroke:#c8c8c8;stroke-width:0.75} + .st48 {fill:#9a9a9a;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0833333} + .st49 {fill:url(#grad40-415);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0833333} + .st50 {fill:url(#grad40-419);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0833333} + .st51 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25} + .st52 {fill:url(#grad35-430);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.0833333} + .st53 {stroke:#c8c8c8;stroke-width:0.75} + .st54 {stroke:#4f88bb;stroke-width:0.75} + .st55 {fill:#feffff;font-family:Calibri;font-size:0.416656em} + .st56 {fill:#5b9bd5;fill-opacity:0.25;stroke:#5b9bd5;stroke-opacity:0.25;stroke-width:0.75} + .st57 {fill:#4f88bb;stroke:#41719c;stroke-width:0.75} + .st58 {fill:none;stroke:#5b9bd5;stroke-opacity:0.22;stroke-width:2.25} + .st59 {fill:none;stroke:#0070c0;stroke-width:2.25} + .st60 {fill:#595959;font-family:Arial;font-size:0.666664em} + .st61 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Patterns_And_Gradients"> + <linearGradient id="grad30-309" v:fillPattern="30" v:foreground="#97c2e6" v:background="#4274a2" x1="0" y1="1" x2="0" + y2="0"> + <stop offset="0" style="stop-color:#97c2e6;stop-opacity:1"/> + <stop offset="1" style="stop-color:#4274a2;stop-opacity:1"/> + </linearGradient> + <linearGradient id="grad25-313" v:fillPattern="25" v:foreground="#5491d3" v:background="#246ba6" x1="0" y1="0" x2="1" + y2="0"> + <stop offset="0" style="stop-color:#5491d3;stop-opacity:1"/> + <stop offset="1" style="stop-color:#246ba6;stop-opacity:1"/> + </linearGradient> + <pattern id="grad35-317" v:fillPattern="35" v:foreground="#569bd3" v:background="#aed0ec" x="0" y="0" width="1" height="1" + patternContentUnits="objectBoundingBox"> + <path d="M 0.5 0.5 L 0 0 L 0 1 z" style="fill:url(#grad27-318)"/> + <path d="M 0.5 0.5 L 1 0 L 1 1 z" style="fill:url(#grad25-319)"/> + <path d="M 0.5 0.5 L 0 0 L 1 0 z" style="fill:url(#grad30-320)"/> + <path d="M 0.5 0.5 L 0 1 L 1 1 z" style="fill:url(#grad28-321)"/> + </pattern> + <linearGradient id="grad27-318" v:fillPattern="35" v:foreground="#569bd3" v:background="#aed0ec" x1="1" y1="0" x2="0" + y2="0"> + <stop offset="0" style="stop-color:#569bd3;stop-opacity:1"/> + <stop offset="1" style="stop-color:#aed0ec;stop-opacity:1"/> + </linearGradient> + <linearGradient id="grad25-319" v:fillPattern="35" v:foreground="#569bd3" v:background="#aed0ec" x1="0" y1="0" x2="1" + y2="0"> + <stop offset="0" style="stop-color:#569bd3;stop-opacity:1"/> + <stop offset="1" style="stop-color:#aed0ec;stop-opacity:1"/> + </linearGradient> + <linearGradient id="grad30-320" v:fillPattern="35" v:foreground="#569bd3" v:background="#aed0ec" x1="0" y1="1" x2="0" + y2="0"> + <stop offset="0" style="stop-color:#569bd3;stop-opacity:1"/> + <stop offset="1" style="stop-color:#aed0ec;stop-opacity:1"/> + </linearGradient> + <linearGradient id="grad28-321" v:fillPattern="35" v:foreground="#569bd3" v:background="#aed0ec" x1="0" y1="0" x2="0" + y2="1"> + <stop offset="0" style="stop-color:#569bd3;stop-opacity:1"/> + <stop offset="1" style="stop-color:#aed0ec;stop-opacity:1"/> + </linearGradient> + <radialGradient id="grad36-325" v:fillPattern="36" v:foreground="#c0dff1" v:background="#246ba6" cx="0" cy="0" r="1"> + <stop offset="0" style="stop-color:#c0dff1;stop-opacity:1"/> + <stop offset="1" style="stop-color:#246ba6;stop-opacity:1"/> + </radialGradient> + <radialGradient id="grad40-335" v:fillPattern="40" v:foreground="#c8e5c8" v:background="#19bf19" cx="0.5" cy="0.5" r="0.5"> + <stop offset="0" style="stop-color:#c8e5c8;stop-opacity:1"/> + <stop offset="1" style="stop-color:#19bf19;stop-opacity:1"/> + </radialGradient> + <radialGradient id="grad39-342" v:fillPattern="39" v:foreground="#5599d7" v:background="#b9daf2" cx="1" cy="1" r="1"> + <stop offset="0" style="stop-color:#5599d7;stop-opacity:1"/> + <stop offset="1" style="stop-color:#b9daf2;stop-opacity:1"/> + </radialGradient> + <radialGradient id="grad40-355" v:fillPattern="40" v:foreground="#5599d7" v:background="#214383" cx="0.5" cy="0.5" r="0.5"> + <stop offset="0" style="stop-color:#5599d7;stop-opacity:1"/> + <stop offset="1" style="stop-color:#214383;stop-opacity:1"/> + </radialGradient> + <linearGradient id="grad30-383" v:fillPattern="30" v:foreground="#97c2e6" v:background="#6ba4dc" x1="0" y1="1" x2="0" + y2="0"> + <stop offset="0" style="stop-color:#97c2e6;stop-opacity:1"/> + <stop offset="1" style="stop-color:#6ba4dc;stop-opacity:1"/> + </linearGradient> + <radialGradient id="grad36-396" v:fillPattern="36" v:foreground="#89bee9" v:background="#b9daf2" cx="0" cy="0" r="1"> + <stop offset="0" style="stop-color:#89bee9;stop-opacity:1"/> + <stop offset="1" style="stop-color:#b9daf2;stop-opacity:1"/> + </radialGradient> + <radialGradient id="grad40-415" v:fillPattern="40" v:foreground="#000000" v:background="#ffffff" cx="0.5" cy="0.5" r="0.5"> + <stop offset="0" style="stop-color:#000000;stop-opacity:1"/> + <stop offset="1" style="stop-color:#ffffff;stop-opacity:1"/> + </radialGradient> + <radialGradient id="grad40-419" v:fillPattern="40" v:foreground="#ffffff" v:background="#9a9a9a" cx="0.5" cy="0.5" r="0.5"> + <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/> + <stop offset="1" style="stop-color:#9a9a9a;stop-opacity:1"/> + </radialGradient> + <pattern id="grad35-430" v:fillPattern="35" v:foreground="#ffffff" v:background="#ffcc00" x="0" y="0" width="1" height="1" + patternContentUnits="objectBoundingBox"> + <path d="M 0.5 0.5 L 0 0 L 0 1 z" style="fill:url(#grad27-431)"/> + <path d="M 0.5 0.5 L 1 0 L 1 1 z" style="fill:url(#grad25-432)"/> + <path d="M 0.5 0.5 L 0 0 L 1 0 z" style="fill:url(#grad30-433)"/> + <path d="M 0.5 0.5 L 0 1 L 1 1 z" style="fill:url(#grad28-434)"/> + </pattern> + <linearGradient id="grad27-431" v:fillPattern="35" v:foreground="#ffffff" v:background="#ffcc00" x1="1" y1="0" x2="0" + y2="0"> + <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/> + <stop offset="1" style="stop-color:#ffcc00;stop-opacity:1"/> + </linearGradient> + <linearGradient id="grad25-432" v:fillPattern="35" v:foreground="#ffffff" v:background="#ffcc00" x1="0" y1="0" x2="1" + y2="0"> + <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/> + <stop offset="1" style="stop-color:#ffcc00;stop-opacity:1"/> + </linearGradient> + <linearGradient id="grad30-433" v:fillPattern="35" v:foreground="#ffffff" v:background="#ffcc00" x1="0" y1="1" x2="0" + y2="0"> + <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/> + <stop offset="1" style="stop-color:#ffcc00;stop-opacity:1"/> + </linearGradient> + <linearGradient id="grad28-434" v:fillPattern="35" v:foreground="#ffffff" v:background="#ffcc00" x1="0" y1="0" x2="0" + y2="1"> + <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/> + <stop offset="1" style="stop-color:#ffcc00;stop-opacity:1"/> + </linearGradient> + </defs> + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-63" class="st15" v:arrowType="5" v:arrowSize="2" v:setback="6.16" refX="-6.16" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-3.52,-3.52) "/> + </marker> + <marker id="mrkr5-178" class="st22" v:arrowType="5" v:arrowSize="2" v:setback="5.8" refX="-5.8" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-3.52,-3.52) "/> + </marker> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <v:layer v:name="Flowchart" v:index="0"/> + <g id="group165-1" transform="translate(21.7794,-24.0978)" v:mID="165" v:groupContext="group"> + <title>Sheet.165</title> + <g id="group1-2" transform="translate(308.647,-25.7109)" v:mID="1" v:groupContext="group"> + <title>Sheet.1</title> + <g id="shape2-3" v:mID="2" v:groupContext="shape" transform="translate(11.5732,-58.1913)"> + <title>Circle</title> + <desc>List 1 matching Criteria 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="27.2233" cy="315.322" width="47.65" height="40.835"/> + <g id="shadow2-4" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M0 315.32 A27.2233 27.2233 0 1 1 54.45 315.32 A27.2233 27.2233 0 1 1 0 315.32 Z" class="st2"/> + <text x="18.79" y="308.12" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>List 1 <tspan + x="12.08" dy="1.2em" class="st4">matching </tspan><tspan x="12.29" dy="1.2em" class="st4">Criteria </tspan>1</text> </g> + <path d="M0 315.32 A27.2233 27.2233 0 1 1 54.45 315.32 A27.2233 27.2233 0 1 1 0 315.32 Z" class="st5"/> + <text x="18.79" y="308.12" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>List 1 <tspan + x="12.08" dy="1.2em" class="st4">matching </tspan><tspan x="12.29" dy="1.2em" class="st4">Criteria </tspan>1</text> </g> + <g id="shape3-13" v:mID="3" v:groupContext="shape" transform="translate(58.9839,-58.9839)"> + <title>Circle.23</title> + <desc>List 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="27.2233" cy="315.322" width="47.65" height="40.835"/> + <g id="shadow3-14" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M0 315.32 A27.2233 27.2233 0 1 1 54.45 315.32 A27.2233 27.2233 0 1 1 0 315.32 Z" class="st2"/> + <text x="17.73" y="318.02" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>List 2</text> </g> + <path d="M0 315.32 A27.2233 27.2233 0 1 1 54.45 315.32 A27.2233 27.2233 0 1 1 0 315.32 Z" class="st5"/> + <text x="17.73" y="318.02" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>List 2</text> </g> + <g id="shape4-19" v:mID="4" v:groupContext="shape"> + <title>Circle.24</title> + <desc>List 1 matching Criteria 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="27.2233" cy="315.322" width="47.65" height="40.835"/> + <g id="shadow4-20" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M0 315.32 A27.2233 27.2233 0 1 1 54.45 315.32 A27.2233 27.2233 0 1 1 0 315.32 Z" class="st2"/> + <text x="18.79" y="308.12" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>List 1 <tspan + x="12.08" dy="1.2em" class="st4">matching </tspan><tspan x="12.29" dy="1.2em" class="st4">Criteria </tspan>1</text> </g> + <path d="M0 315.32 A27.2233 27.2233 0 1 1 54.45 315.32 A27.2233 27.2233 0 1 1 0 315.32 Z" class="st5"/> + <text x="18.79" y="308.12" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>List 1 <tspan + x="12.08" dy="1.2em" class="st4">matching </tspan><tspan x="12.29" dy="1.2em" class="st4">Criteria </tspan>1</text> </g> + <g id="group5-29" transform="translate(50.7413,-4.53722)" v:mID="5" v:groupContext="group"> + <title>Sheet.5</title> + <g id="shape6-30" v:mID="6" v:groupContext="shape" transform="translate(344.2,300.5) rotate(90)"> + <title>Triangle</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow6-31" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,1.9728,-0.3456)" class="st1"> + <path d="M42.04 342.55 L21.02 318.64 L0 342.55 L42.04 342.55 Z" class="st9"/> + </g> + <path d="M42.04 342.55 L21.02 318.64 L0 342.55 L42.04 342.55 Z" class="st10"/> + </g> + <g id="shape7-34" v:mID="7" v:groupContext="shape" transform="translate(-0.884982,-14.7157)"> + <title>Sheet.7</title> + <desc>setsum</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="12.9268" cy="336.238" width="25.86" height="12.6135"/> + <rect x="0" y="329.932" width="25.8535" height="12.6135" class="st11"/> + <text x="6.37" y="334.44" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>setsu<tspan + x="10.49" dy="1.2em" class="st4">m</tspan></text> </g> + </g> + <g id="shape8-38" v:mID="8" v:groupContext="shape" transform="translate(72.5955,0)"> + <title>Circle.29</title> + <desc>List 2 matching Criteria 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="27.2233" cy="315.322" width="47.65" height="40.835"/> + <g id="shadow8-39" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M0 315.32 A27.2233 27.2233 0 1 1 54.45 315.32 A27.2233 27.2233 0 1 1 0 315.32 Z" class="st2"/> + <text x="18.79" y="308.12" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>List 2 <tspan + x="12.08" dy="1.2em" class="st4">matching </tspan><tspan x="12.29" dy="1.2em" class="st4">Criteria </tspan>2</text> </g> + <path d="M0 315.32 A27.2233 27.2233 0 1 1 54.45 315.32 A27.2233 27.2233 0 1 1 0 315.32 Z" class="st5"/> + <text x="18.79" y="308.12" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>List 2 <tspan + x="12.08" dy="1.2em" class="st4">matching </tspan><tspan x="12.29" dy="1.2em" class="st4">Criteria </tspan>2</text> </g> + </g> + <g id="group9-48" transform="translate(31.6515,-49.9094)" v:mID="9" v:groupContext="group"> + <title>Sheet.9</title> + <g id="group10-49" transform="translate(99.5691,0)" v:mID="10" v:groupContext="group"> + <title>Sheet.10</title> + <g id="shape11-50" v:mID="11" v:groupContext="shape" transform="translate(346.175,275.999) rotate(90)"> + <title>Triangle</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow11-51" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,1.9728,-0.3456)" class="st1"> + <path d="M66.55 342.55 L33.27 290.12 L0 342.55 L66.55 342.55 Z" class="st9"/> + </g> + <path d="M66.55 342.55 L33.27 290.12 L0 342.55 L66.55 342.55 Z" class="st10"/> + </g> + <g id="shape12-54" v:mID="12" v:groupContext="shape" transform="translate(355.063,285.074) rotate(90)"> + <title>Sheet.12</title> + <desc>Set Summary</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="24.1985" cy="332.563" width="48.4" height="19.9638"/> + <rect x="0" y="322.581" width="48.397" height="19.9638" class="st11"/> + <text x="18.25" y="329.86" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Set <tspan + x="6.38" dy="1.2em" class="st4">Summary</tspan></text> </g> + </g> + <g id="shape13-58" v:mID="13" v:groupContext="shape" transform="translate(57.5835,-54.4467)"> + <title>Sheet.13</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L38.9 342.55" class="st14"/> + </g> + <g id="shape14-64" v:mID="14" v:groupContext="shape" transform="translate(20.2363,-51.8439)"> + <title>Sheet.14</title> + <desc>Flow Key</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="25.3328" cy="333.471" width="50.67" height="18.1489"/> + <rect x="0" y="324.396" width="50.6656" height="18.1489" class="st11"/> + <text x="14.12" y="335.27" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Flow Key</text> </g> + <g id="shape15-67" v:mID="15" v:groupContext="shape" transform="translate(5.02911,1.60865) rotate(-26.0815)"> + <title>Sheet.15</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L39.25 342.55" class="st14"/> + </g> + <g id="shape16-72" v:mID="16" v:groupContext="shape" transform="translate(155.629,-33.273)"> + <title>Sheet.16</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L38.34 342.55" class="st14"/> + </g> + <g id="shape17-77" v:mID="17" v:groupContext="shape" transform="translate(304.141,0.595416) rotate(25.6934)"> + <title>Sheet.17</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L42.68 342.55" class="st14"/> + </g> + <g id="shape18-82" v:mID="18" v:groupContext="shape" transform="translate(102.642,654.842) rotate(180)"> + <title>Sheet.18</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L30.14 342.55" class="st14"/> + </g> + <g id="shape19-87" v:mID="19" v:groupContext="shape" transform="translate(-15.1809,-33.9928)"> + <title>Sheet.19</title> + <desc>New Flow => New Assignment</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="42.75" cy="338.045" width="85.5" height="9"/> + <rect x="0" y="333.545" width="85.5" height="9" class="st11"/> + <text x="5.06" y="339.85" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>New Flow => New Assignment</text> </g> + <g id="shape20-90" v:mID="20" v:groupContext="shape" transform="translate(102.844,679.041) rotate(180)"> + <title>Sheet.20</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L30.14 342.55" class="st14"/> + </g> + <g id="shape21-95" v:mID="21" v:groupContext="shape" transform="translate(-35.4309,-11.4928)"> + <title>Sheet.21</title> + <desc>Old Flow => forward to specific thread</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="337.971" width="108" height="9.14889"/> + <rect x="0" y="333.396" width="108" height="9.14889" class="st11"/> + <text x="6.36" y="339.77" class="st16" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Old Flow => forward to specific thread</text> </g> + <g id="shape22-98" v:mID="22" v:groupContext="shape" transform="translate(541.496,275.999) rotate(90)"> + <title>Sheet.22</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 335.81 C2.14 344.21 5.09 343.6 7.56 340.31 C10.62 336.25 12.94 328.1 18.15 335.81" class="st17"/> + </g> + <g id="shape23-101" v:mID="23" v:groupContext="shape" transform="translate(541.496,300.198) rotate(90)"> + <title>Sheet.23</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 335.81 C2.14 344.21 5.09 343.6 7.56 340.31 C10.62 336.25 12.94 328.1 18.15 335.81" class="st17"/> + </g> + <g id="shape24-104" v:mID="24" v:groupContext="shape" transform="translate(541.496,324.396) rotate(90)"> + <title>Sheet.24</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 335.81 C2.14 344.21 5.09 343.6 7.56 340.31 C10.62 336.25 12.94 328.1 18.15 335.81" class="st17"/> + </g> + </g> + <g id="group25-107" transform="translate(285.961,-178.628)" v:mID="25" v:groupContext="group"> + <title>Sheet.25</title> + <g id="shape26-108" v:mID="26" v:groupContext="shape" transform="translate(51.2583,-51.2583)"> + <title>Circle</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow26-109" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M0 333.23 A9.3197 9.3197 0 0 1 18.64 333.23 A9.3197 9.3197 0 0 1 0 333.23 Z" class="st9"/> + </g> + <path d="M0 333.23 A9.3197 9.3197 0 0 1 18.64 333.23 A9.3197 9.3197 0 0 1 0 333.23 Z" class="st10"/> + </g> + <g id="shape27-112" v:mID="27" v:groupContext="shape" transform="translate(107.177,-55.9182)"> + <title>Circle.156</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow27-113" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M0 333.23 A9.3197 9.3197 0 0 1 18.64 333.23 A9.3197 9.3197 0 0 1 0 333.23 Z" class="st9"/> + </g> + <path d="M0 333.23 A9.3197 9.3197 0 0 1 18.64 333.23 A9.3197 9.3197 0 0 1 0 333.23 Z" class="st10"/> + </g> + <g id="shape28-116" v:mID="28" v:groupContext="shape" transform="translate(79.2174,-83.8773)"> + <title>Circle.157</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow28-117" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M0 333.23 A9.3197 9.3197 0 0 1 18.64 333.23 A9.3197 9.3197 0 0 1 0 333.23 Z" class="st9"/> + </g> + <path d="M0 333.23 A9.3197 9.3197 0 0 1 18.64 333.23 A9.3197 9.3197 0 0 1 0 333.23 Z" class="st10"/> + </g> + <g id="shape29-120" v:mID="29" v:groupContext="shape" transform="translate(153.775,-51.2583)"> + <title>Circle.158</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow29-121" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M0 333.23 A9.3197 9.3197 0 0 1 18.64 333.23 A9.3197 9.3197 0 0 1 0 333.23 Z" class="st9"/> + </g> + <path d="M0 333.23 A9.3197 9.3197 0 0 1 18.64 333.23 A9.3197 9.3197 0 0 1 0 333.23 Z" class="st10"/> + </g> + <g id="shape30-124" v:mID="30" v:groupContext="shape" transform="translate(93.197,-18.6394)"> + <title>Circle.159</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow30-125" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M0 333.23 A9.3197 9.3197 0 0 1 18.64 333.23 A9.3197 9.3197 0 0 1 0 333.23 Z" class="st9"/> + </g> + <path d="M0 333.23 A9.3197 9.3197 0 0 1 18.64 333.23 A9.3197 9.3197 0 0 1 0 333.23 Z" class="st10"/> + </g> + <g id="shape31-128" v:mID="31" v:groupContext="shape" transform="translate(27.4102,-57.9329) rotate(-7.12502)"> + <title>Sheet.31</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L31.41 342.55" class="st14"/> + </g> + <g id="shape32-133" v:mID="32" v:groupContext="shape" transform="translate(182.13,-60.5772) rotate(9.46232)"> + <title>Sheet.32</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L22.18 342.55" class="st14"/> + </g> + <g id="shape33-138" v:mID="33" v:groupContext="shape" transform="translate(47.8843,595.237) rotate(-160.346)"> + <title>Sheet.33</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L63.11 342.55" class="st14"/> + </g> + <g id="shape34-143" v:mID="34" v:groupContext="shape" transform="translate(292.945,525.785) rotate(141.977)"> + <title>Sheet.34</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L20.97 342.55" class="st14"/> + </g> + <g id="shape35-148" v:mID="35" v:groupContext="shape" transform="translate(-95.8971,591.793) rotate(-145.945)"> + <title>Sheet.35</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L28.55 342.55" class="st14"/> + </g> + <g id="shape36-153" v:mID="36" v:groupContext="shape" transform="translate(37.2788,2.27374E-013)"> + <title>Rectangle.167</title> + <desc>SUM</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="10.8652" cy="335.555" width="21.74" height="13.9795"/> + <g id="shadow36-154" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="328.566" width="21.7305" height="13.9795" class="st9"/> + </g> + <rect x="0" y="328.566" width="21.7305" height="13.9795" class="st10"/> + <text x="5" y="337.36" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>SUM</text> </g> + <g id="shape37-158" v:mID="37" v:groupContext="shape" transform="translate(55.9182,2.27374E-013)"> + <title>Rectangle.168</title> + <desc>Packet</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="23.2992" cy="335.555" width="46.6" height="13.9795"/> + <g id="shadow37-159" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="328.566" width="46.5985" height="13.9795" class="st9"/> + </g> + <rect x="0" y="328.566" width="46.5985" height="13.9795" class="st19"/> + <text x="15.18" y="337.36" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Packet</text> </g> + <g id="shape38-163" v:mID="38" v:groupContext="shape" transform="translate(-1.65867E-013,-32.6189)"> + <title>Rectangle.169</title> + <desc>SUM</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="10.3796" cy="335.555" width="20.76" height="13.9795"/> + <g id="shadow38-164" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="328.566" width="20.7593" height="13.9795" class="st9"/> + </g> + <rect x="0" y="328.566" width="20.7593" height="13.9795" class="st10"/> + <text x="4.51" y="337.36" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>SUM</text> </g> + <g id="shape39-168" v:mID="39" v:groupContext="shape" transform="translate(18.6394,-32.6189)"> + <title>Rectangle.170</title> + <desc>Packet</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="23.2992" cy="335.555" width="46.6" height="13.9795"/> + <g id="shadow39-169" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="328.566" width="46.5985" height="13.9795" class="st9"/> + </g> + <rect x="0" y="328.566" width="46.5985" height="13.9795" class="st19"/> + <text x="15.18" y="337.36" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Packet</text> </g> + <g id="shape40-173" v:mID="40" v:groupContext="shape" transform="translate(197.019,626.053) rotate(161.565)"> + <title>Sheet.40</title> + <path d="M0 328.31 A55.7483 27.2427 -124.2 0 0 42.37 334.19 L42.47 333.85" class="st21"/> + </g> + <g id="shape41-179" v:mID="41" v:groupContext="shape" transform="translate(154.607,584.177) rotate(161.121)"> + <title>Sheet.41</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 319.39 A80.5593 29.9756 -101.99 0 0 41.7 325.37 L41.79 325.02" class="st21"/> + </g> + <g id="shape42-184" v:mID="42" v:groupContext="shape" transform="translate(3.02481,-66.7025)"> + <title>Sheet.42</title> + <desc>Encode ID</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="19.4569" cy="335.555" width="38.92" height="13.9795"/> + <rect x="0" y="328.566" width="38.9138" height="13.9795" class="st11"/> + <text x="7.51" y="333.16" class="st23" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Encode <tspan + x="15.99" dy="1.2em" class="st4">ID</tspan></text> </g> + </g> + <g id="group43-188" transform="translate(12.0993,-165.858)" v:mID="43" v:groupContext="group"> + <title>Sheet.43</title> + <g id="group44-189" transform="translate(7.21495,-75.757)" v:mID="44" v:groupContext="group" v:layerMember="0"> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="ConnGap" v:prompt="" v:val="VT0(0.083333333333333):0"/> + </v:userDefs> + <title>User</title> + <g id="shape45-190" v:mID="45" v:groupContext="shape" v:layerMember="0" + transform="translate(13.3353,-1.13687E-013)"> + <title>Sheet.45</title> + <g id="shadow45-191" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M20.77 325.42 A2.63551 2.63601 -180 1 0 15.5 325.42 A2.63551 2.63601 -180 1 0 20.77 325.42 ZM20.96 + 328.77 L15.25 328.77 C14.84 328.77 14.46 328.91 14.16 329.14 C13.95 329.31 13.78 329.52 + 13.66 329.76 C13.54 330 13.47 330.27 13.47 330.55 L13.47 337.32 L15.03 337.32 L15.03 342.55 + L21.12 342.55 L21.12 337.32 L22.74 337.32 L22.74 330.55 C22.74 330.14 22.6 329.76 22.36 + 329.46 C22.2 329.25 21.99 329.08 21.75 328.96 C21.51 328.84 21.24 328.77 20.96 328.77 Z" + class="st24"/> + <path d="M20.77 325.42 A2.63551 2.63601 -180 1 0 15.5 325.42 A2.63551 2.63601 -180 1 0 20.77 325.42" + class="st25"/> + <path d="M20.96 328.77 L15.25 328.77 C14.84 328.77 14.46 328.91 14.16 329.14 C13.95 329.31 13.78 329.52 + 13.66 329.76 C13.54 330 13.47 330.27 13.47 330.55 L13.47 337.32 L15.03 337.32 L15.03 342.55 + L21.12 342.55 L21.12 337.32 L22.74 337.32 L22.74 330.55 C22.74 330.14 22.6 329.76 22.36 + 329.46 C22.2 329.25 21.99 329.08 21.75 328.96 C21.51 328.84 21.24 328.77 20.96 328.77" + class="st25"/> + <path d="M18.1 342.55 L18.1 338.37" class="st25"/> + <path d="M15.03 337.32 L15.03 333.71" class="st25"/> + <path d="M21.12 337.32 L21.12 333.71" class="st25"/> + <path d="M0 337.32 L13.47 337.32" class="st25"/> + </g> + <path d="M20.77 325.42 A2.63551 2.63601 -180 1 0 15.5 325.42 A2.63551 2.63601 -180 1 0 20.77 325.42 ZM20.96 + 328.77 L15.25 328.77 C14.84 328.77 14.46 328.91 14.16 329.14 C13.95 329.31 13.78 329.52 13.66 + 329.76 C13.54 330 13.47 330.27 13.47 330.55 L13.47 337.32 L15.03 337.32 L15.03 342.55 L21.12 + 342.55 L21.12 337.32 L22.74 337.32 L22.74 330.55 C22.74 330.14 22.6 329.76 22.36 329.46 C22.2 + 329.25 21.99 329.08 21.75 328.96 C21.51 328.84 21.24 328.77 20.96 328.77 Z" class="st26"/> + <path d="M20.77 325.42 A2.63551 2.63601 -180 1 0 15.5 325.42 A2.63551 2.63601 -180 1 0 20.77 325.42" + class="st27"/> + <path d="M20.96 328.77 L15.25 328.77 C14.84 328.77 14.46 328.91 14.16 329.14 C13.95 329.31 13.78 329.52 13.66 + 329.76 C13.54 330 13.47 330.27 13.47 330.55 L13.47 337.32 L15.03 337.32 L15.03 342.55 L21.12 + 342.55 L21.12 337.32 L22.74 337.32 L22.74 330.55 C22.74 330.14 22.6 329.76 22.36 329.46 C22.2 + 329.25 21.99 329.08 21.75 328.96 C21.51 328.84 21.24 328.77 20.96 328.77" class="st27"/> + <path d="M18.1 342.55 L18.1 338.37" class="st27"/> + <path d="M15.03 337.32 L15.03 333.71" class="st27"/> + <path d="M21.12 337.32 L21.12 333.71" class="st27"/> + <path d="M0 337.32 L13.47 337.32" class="st27"/> + </g> + <g id="shape46-206" v:mID="46" v:groupContext="shape" v:layerMember="0" transform="translate(0,-8.39743)"> + <title>Sheet.46</title> + <g id="shadow46-207" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M21.09 325.52 C21.09 325.13 20.96 324.79 20.74 324.51 C20.59 324.32 20.4 324.16 20.19 324.06 + C19.97 323.95 19.72 323.89 19.46 323.89 L3.55 323.89 C3.16 323.89 2.82 324.02 2.54 324.23 + C2.35 324.38 2.19 324.57 2.09 324.79 C1.98 325.01 1.92 325.25 1.92 325.52 L1.92 336.04 L21.09 + 336.04 L21.09 325.52 ZM21.18 337.33 L1.77 337.33 L0 340.51 L0 342.55 L23.06 342.55 L23.06 + 340.51 L21.18 337.33 Z" class="st9"/> + </g> + <path d="M21.09 325.52 C21.09 325.13 20.96 324.79 20.74 324.51 C20.59 324.32 20.4 324.16 20.19 324.06 C19.97 + 323.95 19.72 323.89 19.46 323.89 L3.55 323.89 C3.16 323.89 2.82 324.02 2.54 324.23 C2.35 324.38 + 2.19 324.57 2.09 324.79 C1.98 325.01 1.92 325.25 1.92 325.52 L1.92 336.04 L21.09 336.04 L21.09 + 325.52 ZM21.18 337.33 L1.77 337.33 L0 340.51 L0 342.55 L23.06 342.55 L23.06 340.51 L21.18 337.33 + Z" class="st28"/> + </g> + <g id="shape47-210" v:mID="47" v:groupContext="shape" v:layerMember="0" transform="translate(3.19243,-16.175)"> + <title>Sheet.47</title> + <v:userDefs> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(#5b9bd5)"/> + </v:userDefs> + <path d="M16.62 342.55 L16.62 333.29 C16.62 333.23 16.61 333.18 16.58 333.13 C16.55 333.07 16.5 333.02 16.44 + 332.98 C16.39 332.95 16.33 332.94 16.27 332.94 L0.35 332.94 C0.29 332.94 0.24 332.95 0.19 332.98 + C0.13 333.01 0.08 333.07 0.04 333.12 C0.02 333.17 0 333.23 0 333.29 L0 342.55 L16.62 342.55 + Z" class="st29"/> + </g> + <g id="shape48-212" v:mID="48" v:groupContext="shape" v:layerMember="0" transform="translate(1.97942,-10.81)"> + <title>Sheet.48</title> + <v:userDefs> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(#5b9bd5)"/> + </v:userDefs> + <path d="M0.96 340.83 L0 342.55 L19.06 342.55 L18.1 340.83 L0.96 340.83 Z" class="st26"/> + </g> + </g> + <g id="group49-215" transform="translate(7.21495,-47.1858)" v:mID="49" v:groupContext="group" v:layerMember="0"> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="ConnGap" v:prompt="" v:val="VT0(0.083333333333333):0"/> + </v:userDefs> + <title>User.7</title> + <g id="shape50-216" v:mID="50" v:groupContext="shape" v:layerMember="0" + transform="translate(13.3353,-1.13687E-013)"> + <title>Sheet.50</title> + <g id="shadow50-217" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M20.77 325.42 A2.63551 2.63601 -180 1 0 15.5 325.42 A2.63551 2.63601 -180 1 0 20.77 325.42 ZM20.96 + 328.77 L15.25 328.77 C14.84 328.77 14.46 328.91 14.16 329.14 C13.95 329.31 13.78 329.52 + 13.66 329.76 C13.54 330 13.47 330.27 13.47 330.55 L13.47 337.32 L15.03 337.32 L15.03 342.55 + L21.12 342.55 L21.12 337.32 L22.74 337.32 L22.74 330.55 C22.74 330.14 22.6 329.76 22.36 + 329.46 C22.2 329.25 21.99 329.08 21.75 328.96 C21.51 328.84 21.24 328.77 20.96 328.77 Z" + class="st24"/> + <path d="M20.77 325.42 A2.63551 2.63601 -180 1 0 15.5 325.42 A2.63551 2.63601 -180 1 0 20.77 325.42" + class="st25"/> + <path d="M20.96 328.77 L15.25 328.77 C14.84 328.77 14.46 328.91 14.16 329.14 C13.95 329.31 13.78 329.52 + 13.66 329.76 C13.54 330 13.47 330.27 13.47 330.55 L13.47 337.32 L15.03 337.32 L15.03 342.55 + L21.12 342.55 L21.12 337.32 L22.74 337.32 L22.74 330.55 C22.74 330.14 22.6 329.76 22.36 + 329.46 C22.2 329.25 21.99 329.08 21.75 328.96 C21.51 328.84 21.24 328.77 20.96 328.77" + class="st25"/> + <path d="M18.1 342.55 L18.1 338.37" class="st25"/> + <path d="M15.03 337.32 L15.03 333.71" class="st25"/> + <path d="M21.12 337.32 L21.12 333.71" class="st25"/> + <path d="M0 337.32 L13.47 337.32" class="st25"/> + </g> + <path d="M20.77 325.42 A2.63551 2.63601 -180 1 0 15.5 325.42 A2.63551 2.63601 -180 1 0 20.77 325.42 ZM20.96 + 328.77 L15.25 328.77 C14.84 328.77 14.46 328.91 14.16 329.14 C13.95 329.31 13.78 329.52 13.66 + 329.76 C13.54 330 13.47 330.27 13.47 330.55 L13.47 337.32 L15.03 337.32 L15.03 342.55 L21.12 + 342.55 L21.12 337.32 L22.74 337.32 L22.74 330.55 C22.74 330.14 22.6 329.76 22.36 329.46 C22.2 + 329.25 21.99 329.08 21.75 328.96 C21.51 328.84 21.24 328.77 20.96 328.77 Z" class="st26"/> + <path d="M20.77 325.42 A2.63551 2.63601 -180 1 0 15.5 325.42 A2.63551 2.63601 -180 1 0 20.77 325.42" + class="st27"/> + <path d="M20.96 328.77 L15.25 328.77 C14.84 328.77 14.46 328.91 14.16 329.14 C13.95 329.31 13.78 329.52 13.66 + 329.76 C13.54 330 13.47 330.27 13.47 330.55 L13.47 337.32 L15.03 337.32 L15.03 342.55 L21.12 + 342.55 L21.12 337.32 L22.74 337.32 L22.74 330.55 C22.74 330.14 22.6 329.76 22.36 329.46 C22.2 + 329.25 21.99 329.08 21.75 328.96 C21.51 328.84 21.24 328.77 20.96 328.77" class="st27"/> + <path d="M18.1 342.55 L18.1 338.37" class="st27"/> + <path d="M15.03 337.32 L15.03 333.71" class="st27"/> + <path d="M21.12 337.32 L21.12 333.71" class="st27"/> + <path d="M0 337.32 L13.47 337.32" class="st27"/> + </g> + <g id="shape51-232" v:mID="51" v:groupContext="shape" v:layerMember="0" transform="translate(0,-8.39743)"> + <title>Sheet.51</title> + <g id="shadow51-233" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M21.09 325.52 C21.09 325.13 20.96 324.79 20.74 324.51 C20.59 324.32 20.4 324.16 20.19 324.06 + C19.97 323.95 19.72 323.89 19.46 323.89 L3.55 323.89 C3.16 323.89 2.82 324.02 2.54 324.23 + C2.35 324.38 2.19 324.57 2.09 324.79 C1.98 325.01 1.92 325.25 1.92 325.52 L1.92 336.04 L21.09 + 336.04 L21.09 325.52 ZM21.18 337.33 L1.77 337.33 L0 340.51 L0 342.55 L23.06 342.55 L23.06 + 340.51 L21.18 337.33 Z" class="st9"/> + </g> + <path d="M21.09 325.52 C21.09 325.13 20.96 324.79 20.74 324.51 C20.59 324.32 20.4 324.16 20.19 324.06 C19.97 + 323.95 19.72 323.89 19.46 323.89 L3.55 323.89 C3.16 323.89 2.82 324.02 2.54 324.23 C2.35 324.38 + 2.19 324.57 2.09 324.79 C1.98 325.01 1.92 325.25 1.92 325.52 L1.92 336.04 L21.09 336.04 L21.09 + 325.52 ZM21.18 337.33 L1.77 337.33 L0 340.51 L0 342.55 L23.06 342.55 L23.06 340.51 L21.18 337.33 + Z" class="st28"/> + </g> + <g id="shape52-236" v:mID="52" v:groupContext="shape" v:layerMember="0" transform="translate(3.19243,-16.175)"> + <title>Sheet.52</title> + <v:userDefs> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(#5b9bd5)"/> + </v:userDefs> + <path d="M16.62 342.55 L16.62 333.29 C16.62 333.23 16.61 333.18 16.58 333.13 C16.55 333.07 16.5 333.02 16.44 + 332.98 C16.39 332.95 16.33 332.94 16.27 332.94 L0.35 332.94 C0.29 332.94 0.24 332.95 0.19 332.98 + C0.13 333.01 0.08 333.07 0.04 333.12 C0.02 333.17 0 333.23 0 333.29 L0 342.55 L16.62 342.55 + Z" class="st29"/> + </g> + <g id="shape53-238" v:mID="53" v:groupContext="shape" v:layerMember="0" transform="translate(1.97942,-10.81)"> + <title>Sheet.53</title> + <v:userDefs> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(#5b9bd5)"/> + </v:userDefs> + <path d="M0.96 340.83 L0 342.55 L19.06 342.55 L18.1 340.83 L0.96 340.83 Z" class="st26"/> + </g> + </g> + <g id="group54-241" transform="translate(7.21495,-18.6146)" v:mID="54" v:groupContext="group" v:layerMember="0"> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="ConnGap" v:prompt="" v:val="VT0(0.083333333333333):0"/> + </v:userDefs> + <title>User.12</title> + <g id="shape55-242" v:mID="55" v:groupContext="shape" v:layerMember="0" + transform="translate(13.3353,-1.13687E-013)"> + <title>Sheet.55</title> + <g id="shadow55-243" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M20.77 325.42 A2.63551 2.63601 -180 1 0 15.5 325.42 A2.63551 2.63601 -180 1 0 20.77 325.42 ZM20.96 + 328.77 L15.25 328.77 C14.84 328.77 14.46 328.91 14.16 329.14 C13.95 329.31 13.78 329.52 + 13.66 329.76 C13.54 330 13.47 330.27 13.47 330.55 L13.47 337.32 L15.03 337.32 L15.03 342.55 + L21.12 342.55 L21.12 337.32 L22.74 337.32 L22.74 330.55 C22.74 330.14 22.6 329.76 22.36 + 329.46 C22.2 329.25 21.99 329.08 21.75 328.96 C21.51 328.84 21.24 328.77 20.96 328.77 Z" + class="st24"/> + <path d="M20.77 325.42 A2.63551 2.63601 -180 1 0 15.5 325.42 A2.63551 2.63601 -180 1 0 20.77 325.42" + class="st25"/> + <path d="M20.96 328.77 L15.25 328.77 C14.84 328.77 14.46 328.91 14.16 329.14 C13.95 329.31 13.78 329.52 + 13.66 329.76 C13.54 330 13.47 330.27 13.47 330.55 L13.47 337.32 L15.03 337.32 L15.03 342.55 + L21.12 342.55 L21.12 337.32 L22.74 337.32 L22.74 330.55 C22.74 330.14 22.6 329.76 22.36 + 329.46 C22.2 329.25 21.99 329.08 21.75 328.96 C21.51 328.84 21.24 328.77 20.96 328.77" + class="st25"/> + <path d="M18.1 342.55 L18.1 338.37" class="st25"/> + <path d="M15.03 337.32 L15.03 333.71" class="st25"/> + <path d="M21.12 337.32 L21.12 333.71" class="st25"/> + <path d="M0 337.32 L13.47 337.32" class="st25"/> + </g> + <path d="M20.77 325.42 A2.63551 2.63601 -180 1 0 15.5 325.42 A2.63551 2.63601 -180 1 0 20.77 325.42 ZM20.96 + 328.77 L15.25 328.77 C14.84 328.77 14.46 328.91 14.16 329.14 C13.95 329.31 13.78 329.52 13.66 + 329.76 C13.54 330 13.47 330.27 13.47 330.55 L13.47 337.32 L15.03 337.32 L15.03 342.55 L21.12 + 342.55 L21.12 337.32 L22.74 337.32 L22.74 330.55 C22.74 330.14 22.6 329.76 22.36 329.46 C22.2 + 329.25 21.99 329.08 21.75 328.96 C21.51 328.84 21.24 328.77 20.96 328.77 Z" class="st26"/> + <path d="M20.77 325.42 A2.63551 2.63601 -180 1 0 15.5 325.42 A2.63551 2.63601 -180 1 0 20.77 325.42" + class="st27"/> + <path d="M20.96 328.77 L15.25 328.77 C14.84 328.77 14.46 328.91 14.16 329.14 C13.95 329.31 13.78 329.52 13.66 + 329.76 C13.54 330 13.47 330.27 13.47 330.55 L13.47 337.32 L15.03 337.32 L15.03 342.55 L21.12 + 342.55 L21.12 337.32 L22.74 337.32 L22.74 330.55 C22.74 330.14 22.6 329.76 22.36 329.46 C22.2 + 329.25 21.99 329.08 21.75 328.96 C21.51 328.84 21.24 328.77 20.96 328.77" class="st27"/> + <path d="M18.1 342.55 L18.1 338.37" class="st27"/> + <path d="M15.03 337.32 L15.03 333.71" class="st27"/> + <path d="M21.12 337.32 L21.12 333.71" class="st27"/> + <path d="M0 337.32 L13.47 337.32" class="st27"/> + </g> + <g id="shape56-258" v:mID="56" v:groupContext="shape" v:layerMember="0" transform="translate(0,-8.39743)"> + <title>Sheet.56</title> + <g id="shadow56-259" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M21.09 325.52 C21.09 325.13 20.96 324.79 20.74 324.51 C20.59 324.32 20.4 324.16 20.19 324.06 + C19.97 323.95 19.72 323.89 19.46 323.89 L3.55 323.89 C3.16 323.89 2.82 324.02 2.54 324.23 + C2.35 324.38 2.19 324.57 2.09 324.79 C1.98 325.01 1.92 325.25 1.92 325.52 L1.92 336.04 L21.09 + 336.04 L21.09 325.52 ZM21.18 337.33 L1.77 337.33 L0 340.51 L0 342.55 L23.06 342.55 L23.06 + 340.51 L21.18 337.33 Z" class="st9"/> + </g> + <path d="M21.09 325.52 C21.09 325.13 20.96 324.79 20.74 324.51 C20.59 324.32 20.4 324.16 20.19 324.06 C19.97 + 323.95 19.72 323.89 19.46 323.89 L3.55 323.89 C3.16 323.89 2.82 324.02 2.54 324.23 C2.35 324.38 + 2.19 324.57 2.09 324.79 C1.98 325.01 1.92 325.25 1.92 325.52 L1.92 336.04 L21.09 336.04 L21.09 + 325.52 ZM21.18 337.33 L1.77 337.33 L0 340.51 L0 342.55 L23.06 342.55 L23.06 340.51 L21.18 337.33 + Z" class="st28"/> + </g> + <g id="shape57-262" v:mID="57" v:groupContext="shape" v:layerMember="0" transform="translate(3.19243,-16.175)"> + <title>Sheet.57</title> + <v:userDefs> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(#5b9bd5)"/> + </v:userDefs> + <path d="M16.62 342.55 L16.62 333.29 C16.62 333.23 16.61 333.18 16.58 333.13 C16.55 333.07 16.5 333.02 16.44 + 332.98 C16.39 332.95 16.33 332.94 16.27 332.94 L0.35 332.94 C0.29 332.94 0.24 332.95 0.19 332.98 + C0.13 333.01 0.08 333.07 0.04 333.12 C0.02 333.17 0 333.23 0 333.29 L0 342.55 L16.62 342.55 + Z" class="st29"/> + </g> + <g id="shape58-264" v:mID="58" v:groupContext="shape" v:layerMember="0" transform="translate(1.97942,-10.81)"> + <title>Sheet.58</title> + <v:userDefs> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(#5b9bd5)"/> + </v:userDefs> + <path d="M0.96 340.83 L0 342.55 L19.06 342.55 L18.1 340.83 L0.96 340.83 Z" class="st26"/> + </g> + </g> + <g id="group59-267" transform="translate(171.161,-45.6707)" v:mID="59" v:groupContext="group" v:layerMember="0"> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="ConnGap" v:prompt="" v:val="VT0(0.083333333333333):0"/> + </v:userDefs> + <title>Data Center</title> + <g id="shape60-268" v:mID="60" v:groupContext="shape" v:layerMember="0"> + <title>Sheet.60</title> + <g id="shadow60-269" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <ellipse cx="37.8785" cy="331.299" rx="37.8785" ry="11.246" class="st9"/> + </g> + <ellipse cx="37.8785" cy="331.299" rx="37.8785" ry="11.246" class="st10"/> + </g> + <g id="shape61-272" v:mID="61" v:groupContext="shape" v:layerMember="0" transform="translate(6.86487,-7.30475)"> + <title>Sheet.61</title> + <g id="shadow61-273" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M54.1 311.79 L43.28 311.79 L43.28 342.55 L62.03 342.55 L62.03 311.79 L54.1 311.79 ZM43.28 332.44 + L43.28 311.79 L51.21 311.79 L51.21 301.69 L32.33 301.69 L32.33 311.79 L40.39 311.79 L40.39 + 332.44 L43.28 332.44 ZM40.39 301.69 L40.39 293.03 L21.64 293.03 L21.64 301.69 L29.57 301.69 + L29.57 311.79 L32.46 311.79 L32.46 301.69 L40.39 301.69 ZM32.46 311.79 L21.64 311.79 L21.64 + 342.55 L40.39 342.55 L40.39 311.79 L32.46 311.79 ZM10.82 311.79 L0 311.79 L0 342.55 L18.75 + 342.55 L18.75 311.79 L10.82 311.79 ZM21.64 311.79 L29.57 311.79 L29.57 301.69 L10.82 301.69 + L10.82 311.79 L18.75 311.79 L18.75 332.44 L21.64 332.44 L21.64 311.79 Z" class="st9"/> + </g> + <path d="M54.1 311.79 L43.28 311.79 L43.28 342.55 L62.03 342.55 L62.03 311.79 L54.1 311.79 ZM43.28 332.44 + L43.28 311.79 L51.21 311.79 L51.21 301.69 L32.33 301.69 L32.33 311.79 L40.39 311.79 L40.39 332.44 + L43.28 332.44 ZM40.39 301.69 L40.39 293.03 L21.64 293.03 L21.64 301.69 L29.57 301.69 L29.57 + 311.79 L32.46 311.79 L32.46 301.69 L40.39 301.69 ZM32.46 311.79 L21.64 311.79 L21.64 342.55 + L40.39 342.55 L40.39 311.79 L32.46 311.79 ZM10.82 311.79 L0 311.79 L0 342.55 L18.75 342.55 L18.75 + 311.79 L10.82 311.79 ZM21.64 311.79 L29.57 311.79 L29.57 301.69 L10.82 301.69 L10.82 311.79 + L18.75 311.79 L18.75 332.44 L21.64 332.44 L21.64 311.79 Z" class="st10"/> + </g> + <g id="shape62-276" v:mID="62" v:groupContext="shape" v:layerMember="0" transform="translate(20.0835,-20.5174)"> + <title>Sheet.62</title> + <g id="shadow62-277" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M45.36 341.36 A1.13296 1.18615 -180 1 0 43.09 341.36 A1.13296 1.18615 -180 1 0 45.36 341.36 + ZM23.46 341.36 A1.13296 1.18615 -180 1 0 21.2 341.36 A1.13296 1.18615 -180 1 0 23.46 341.36 + ZM2.27 341.36 A1.13296 1.18615 -180 1 0 0 341.36 A1.13296 1.18615 -180 1 0 2.27 341.36 Z" + class="st24"/> + </g> + <path d="M45.36 341.36 A1.13296 1.18615 -180 1 0 43.09 341.36 A1.13296 1.18615 -180 1 0 45.36 341.36 ZM23.46 + 341.36 A1.13296 1.18615 -180 1 0 21.2 341.36 A1.13296 1.18615 -180 1 0 23.46 341.36 ZM2.27 341.36 + A1.13296 1.18615 -180 1 0 0 341.36 A1.13296 1.18615 -180 1 0 2.27 341.36 Z" class="st30"/> + </g> + <g id="shape63-282" v:mID="63" v:groupContext="shape" v:layerMember="0" transform="translate(14.2717,-12.5134)"> + <title>Sheet.63</title> + <v:userDefs> + <v:ud v:nameU="SurroundingRegionColor" v:prompt="" v:val="VT5(#5b9bd5)"/> + </v:userDefs> + <g id="shadow63-283" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M43.09 342.55 L51.17 342.55 L51.17 341.74 L43.09 341.74 L43.09 342.55 ZM43.09 340.12 L51.17 + 340.12 L51.17 339.32 L43.09 339.32 L43.09 340.12 ZM43.09 337.69 L51.17 337.69 L51.17 336.89 + L43.09 336.89 L43.09 337.69 ZM21.2 342.55 L29.27 342.55 L29.27 341.74 L21.2 341.74 L21.2 + 342.55 ZM21.2 340.12 L29.27 340.12 L29.27 339.32 L21.2 339.32 L21.2 340.12 ZM21.2 337.69 + L29.27 337.69 L29.27 336.89 L21.2 336.89 L21.2 337.69 ZM-0 342.55 L8.08 342.55 L8.08 341.74 + L-0 341.74 L-0 342.55 ZM-0 340.12 L8.08 340.12 L8.08 339.32 L-0 339.32 L-0 340.12 ZM-0 337.69 + L8.08 337.69 L8.08 336.89 L-0 336.89 L-0 337.69 Z" class="st24"/> + </g> + <path d="M43.09 342.55 L51.17 342.55 L51.17 341.74 L43.09 341.74 L43.09 342.55 ZM43.09 340.12 L51.17 340.12 + L51.17 339.32 L43.09 339.32 L43.09 340.12 ZM43.09 337.69 L51.17 337.69 L51.17 336.89 L43.09 + 336.89 L43.09 337.69 ZM21.2 342.55 L29.27 342.55 L29.27 341.74 L21.2 341.74 L21.2 342.55 ZM21.2 + 340.12 L29.27 340.12 L29.27 339.32 L21.2 339.32 L21.2 340.12 ZM21.2 337.69 L29.27 337.69 L29.27 + 336.89 L21.2 336.89 L21.2 337.69 ZM-0 342.55 L8.08 342.55 L8.08 341.74 L-0 341.74 L-0 342.55 + ZM-0 340.12 L8.08 340.12 L8.08 339.32 L-0 339.32 L-0 340.12 ZM-0 337.69 L8.08 337.69 L8.08 336.89 + L-0 336.89 L-0 337.69 Z" class="st26"/> + </g> + </g> + <g id="group64-288" transform="translate(59.5234,-47.1858)" v:mID="64" v:groupContext="group"> + <v:custProps> + <v:cp v:nameU="AssetNumber" v:lbl="Asset Number" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="SerialNumber" v:lbl="Serial Number" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Location" v:lbl="Location" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Building" v:lbl="Building" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Room" v:lbl="Room" v:prompt="" v:type="0" v:format="" v:sortKey="Asset" v:invis="false" + v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="Manufacturer" v:lbl="Manufacturer" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ProductNumber" v:lbl="Product Number" v:prompt="" v:type="0" v:format="" + v:sortKey="Equipment" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="PartNumber" v:lbl="Part Number" v:prompt="" v:type="0" v:format="" v:sortKey="Equipment" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ProductDescription" v:lbl="Product Description" v:prompt="" v:type="0" v:format="" + v:sortKey="Equipment" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NetworkName" v:lbl="Network Name" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="IPAddress" v:lbl="IP Address" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="SubnetMask" v:lbl="Subnet Mask" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="AdminInterface" v:lbl="Administrative Interface" v:prompt="" v:type="0" v:format="" + v:sortKey="Network" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NumberofPorts" v:lbl="Number of Ports" v:prompt="" v:type="0" v:format="" + v:sortKey="Network" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="CommunityString" v:lbl="Community String" v:prompt="" v:type="0" v:format="" + v:sortKey="Network" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="NetworkDescription" v:lbl="Network Description" v:prompt="" v:type="0" v:format="" + v:sortKey="Network" v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="MACAddress" v:lbl="MAC Address" v:prompt="" v:type="0" v:format="" v:sortKey="Network" + v:invis="false" v:ask="false" v:langID="1033" v:cal="0"/> + <v:cp v:nameU="ShapeClass" v:lbl="ShapeClass" v:prompt="" v:type="0" v:format="" v:sortKey="" + v:invis="true" v:ask="false" v:langID="1033" v:cal="0" v:val="VT4(Equipment)"/> + <v:cp v:nameU="ShapeType" v:lbl="ShapeType" v:prompt="" v:type="0" v:format="" v:sortKey="" v:invis="true" + v:ask="false" v:langID="1033" v:cal="0" v:val="VT4(Device)"/> + <v:cp v:nameU="SubShapeType" v:lbl="SubShapeType" v:prompt="" v:type="0" v:format="" v:sortKey="" + v:invis="true" v:ask="false" v:langID="1033" v:cal="0" v:val="VT4(Load balancer)"/> + </v:custProps> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + <v:ud v:nameU="ShapeClass" v:prompt="" v:val="VT0(5):26"/> + <v:ud v:nameU="SolSH" v:prompt="" v:val="VT14({BF0433D9-CD73-4EB5-8390-8653BE590246}):41"/> + <v:ud v:nameU="visLegendShape" v:prompt="" v:val="VT0(2):26"/> + </v:userDefs> + <title>Load balancer</title> + <g id="shape65-289" v:mID="65" v:groupContext="shape" transform="translate(0,-1.653)"> + <title>Sheet.65</title> + <g id="shadow65-290" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M12.18 329.62 L4.06 329.62 L0 332.02 L0 342.55 L16.23 342.55 L16.23 332.02 L12.18 329.62 Z" + class="st24"/> + <path d="M0 332.02 L16.23 332.02" class="st25"/> + <path d="M12.18 329.62 L4.06 329.62 L0 332.02 L0 342.55 L16.23 342.55 L16.23 332.02 L12.18 329.62" + class="st25"/> + </g> + <path d="M12.18 329.62 L4.06 329.62 L0 332.02 L0 342.55 L16.23 342.55 L16.23 332.02 L12.18 329.62 Z" + class="st30"/> + <path d="M0 332.02 L16.23 332.02" class="st31"/> + <path d="M12.18 329.62 L4.06 329.62 L0 332.02 L0 342.55 L16.23 342.55 L16.23 332.02 L12.18 329.62" + class="st31"/> + </g> + <g id="shape66-297" v:mID="66" v:groupContext="shape" transform="translate(1.81062,-2.91583)"> + <title>Sheet.66</title> + <g id="shadow66-298" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M10.22 341.92 L9.29 342.12 L9.95 342.55 L11.2 342.23 L10.99 340.96 L10.33 340.52 L10.53 341.44 + L8.34 340.01 L8.03 340.49 L10.22 341.92 ZM11.46 338.22 L8.84 338.22 L8.84 338.78 L11.45 + 338.78 L10.78 339.45 L11.57 339.45 L12.45 338.5 L11.57 337.55 L10.78 337.55 L11.46 338.22 + ZM10.48 335.2 L8.29 336.64 L8.6 337.12 L10.79 335.68 L10.59 336.61 L11.25 336.17 L11.46 + 334.9 L10.21 334.58 L9.55 335.01 L10.48 335.2 ZM6.25 336.37 C5.11 336.37 4.19 337.29 4.19 + 338.43 C4.19 339.56 5.11 340.48 6.25 340.48 C7.38 340.48 8.31 339.56 8.31 338.43 C8.31 337.29 + 7.38 336.37 6.25 336.37 ZM6.25 337.02 C7.02 337.02 7.66 337.65 7.66 338.43 C7.66 339.2 7.02 + 339.83 6.25 339.83 C5.47 339.83 4.84 339.2 4.84 338.43 C4.84 337.65 5.47 337.02 6.25 337.02 + ZM2.62 338.14 L0 338.14 L0 338.71 L2.62 338.71 L1.94 339.38 L2.74 339.38 L3.61 338.43 L2.73 + 337.47 L1.95 337.47 L2.62 338.14 Z" class="st9"/> + </g> + <path d="M10.22 341.92 L9.29 342.12 L9.95 342.55 L11.2 342.23 L10.99 340.96 L10.33 340.52 L10.53 341.44 L8.34 + 340.01 L8.03 340.49 L10.22 341.92 ZM11.46 338.22 L8.84 338.22 L8.84 338.78 L11.45 338.78 L10.78 + 339.45 L11.57 339.45 L12.45 338.5 L11.57 337.55 L10.78 337.55 L11.46 338.22 ZM10.48 335.2 L8.29 + 336.64 L8.6 337.12 L10.79 335.68 L10.59 336.61 L11.25 336.17 L11.46 334.9 L10.21 334.58 L9.55 + 335.01 L10.48 335.2 ZM6.25 336.37 C5.11 336.37 4.19 337.29 4.19 338.43 C4.19 339.56 5.11 340.48 + 6.25 340.48 C7.38 340.48 8.31 339.56 8.31 338.43 C8.31 337.29 7.38 336.37 6.25 336.37 ZM6.25 + 337.02 C7.02 337.02 7.66 337.65 7.66 338.43 C7.66 339.2 7.02 339.83 6.25 339.83 C5.47 339.83 + 4.84 339.2 4.84 338.43 C4.84 337.65 5.47 337.02 6.25 337.02 ZM2.62 338.14 L0 338.14 L0 338.71 + L2.62 338.71 L1.94 339.38 L2.74 339.38 L3.61 338.43 L2.73 337.47 L1.95 337.47 L2.62 338.14 Z" + class="st32"/> + </g> + </g> + <g id="group67-301" transform="translate(104.617,-86.5795)" v:mID="67" v:groupContext="group"> + <v:userDefs> + <v:ud v:nameU="SkinColor" v:prompt="" v:val="VT5(#da8c36)"/> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + </v:userDefs> + <title>Directory server</title> + <g id="shape68-302" v:mID="68" v:groupContext="shape" transform="translate(0,-0.451005)"> + <title>Sheet.68</title> + <g id="shadow68-303" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M0.47 329.86 L0.47 331.94 L1.46 332.57 L3.33 331.52 L15.43 338.57 L15.43 340.61 L16.42 341.24 + L18.24 340.22 L22.24 342.55 L22.24 339.27 L36.07 331.28 L36.07 321.27 L19.64 311.85 L3.16 + 321.13 L3.16 321.5 L0 319.68 L0 329.58 L0.47 329.86 Z" class="st33"/> + </g> + <path d="M0.47 329.86 L0.47 331.94 L1.46 332.57 L3.33 331.52 L15.43 338.57 L15.43 340.61 L16.42 341.24 L18.24 + 340.22 L22.24 342.55 L22.24 339.27 L36.07 331.28 L36.07 321.27 L19.64 311.85 L3.16 321.13 L3.16 + 321.5 L0 319.68 L0 329.58 L0.47 329.86 Z" class="st34"/> + </g> + <g id="shape69-306" v:mID="69" v:groupContext="shape" transform="translate(3.1636,-11.8063)"> + <title>Sheet.69</title> + <path d="M16.48 323.24 L32.91 332.66 L16.31 342.55 L0 333.26 L0 332.52 L16.48 323.24 Z" class="st35"/> + </g> + <g id="shape70-310" v:mID="70" v:groupContext="shape" transform="translate(19.06,-3.68954)"> + <title>Sheet.70</title> + <path d="M17.01 324.55 L0 334.19 L3.18 342.55 L17.01 334.56 L17.01 324.55 Z" class="st36"/> + </g> + <g id="shape71-314" v:mID="71" v:groupContext="shape" transform="translate(0,-0.415652)"> + <title>Sheet.71</title> + <path d="M22.24 342.55 L0 329.58 L0 319.68 L22.24 332.43 L22.24 342.55 Z" class="st37"/> + </g> + <g id="shape72-322" v:mID="72" v:groupContext="shape" transform="translate(0.82443,-19.8334)"> + <title>Sheet.72</title> + <path d="M1.13 341.58 a0.653986 0.653986 -180 0 0 -0.73971 -0.492434 a0.656072 0.656072 -180 0 0 -0.253101 + 0.865731 a0.653066 0.653066 -180 0 0 0.740769 0.491375 a0.655459 0.655459 -180 0 0 0.252042 + -0.864672 Z" class="st38"/> + </g> + <g id="shape73-326" v:mID="73" v:groupContext="shape" transform="translate(3.62283,-15.1638)"> + <title>Sheet.73</title> + <path d="M3.22 339.78 A1.86495 1.86495 -180 0 0 1.11 338.38 A1.8709 1.8709 -180 0 0 0.38 340.85 A1.86532 + 1.86532 -180 0 0 2.5 342.25 A1.87264 1.87264 -180 0 0 3.22 339.78 Z" class="st38"/> + </g> + <g id="shape74-329" v:mID="74" v:groupContext="shape" transform="translate(3.62283,-10.4867)"> + <title>Sheet.74</title> + <path d="M3.22 339.78 A1.86495 1.86495 -180 0 0 1.11 338.38 A1.8709 1.8709 -180 0 0 0.38 340.85 A1.86532 + 1.86532 -180 0 0 2.5 342.25 A1.87264 1.87264 -180 0 0 3.22 339.78 Z" class="st38"/> + </g> + <g id="shape75-332" v:mID="75" v:groupContext="shape" transform="translate(4.52404,-16.3668)"> + <title>Sheet.75</title> + <path d="M1.61 341.16 a0.931952 0.931952 -180 0 0 -1.05741 -0.702645 a0.935408 0.935408 -180 0 0 -0.361118 + 1.23585 a0.932139 0.932139 -180 0 0 1.05794 0.702645 a0.935822 0.935822 -180 0 0 0.360589 -1.23585 + Z" class="st39"/> + </g> + <g id="shape76-336" v:mID="76" v:groupContext="shape" transform="translate(4.52404,-11.6897)"> + <title>Sheet.76</title> + <path d="M1.61 341.16 a0.931952 0.931952 -180 0 0 -1.05741 -0.702645 a0.935875 0.935875 -180 0 0 -0.361118 + 1.23585 a0.932139 0.932139 -180 0 0 1.05794 0.702645 a0.935822 0.935822 -180 0 0 0.360589 -1.23585 + Z" class="st39"/> + </g> + <g id="shape77-339" v:mID="77" v:groupContext="shape" transform="translate(7.78787,-8.83469)"> + <title>Sheet.77</title> + <path d="M0 341.57 L0.05 333.6 L1.83 334.57 L1.78 342.55 L0 341.57 Z" class="st40"/> + </g> + <g id="shape78-343" v:mID="78" v:groupContext="shape" transform="translate(10.204,-7.4008)"> + <title>Sheet.78</title> + <path d="M0 341.57 L0.05 333.6 L1.83 334.57 L1.78 342.55 L0 341.57 Z" class="st40"/> + </g> + <g id="shape79-346" v:mID="79" v:groupContext="shape" transform="translate(12.6196,-5.96639)"> + <title>Sheet.79</title> + <path d="M0 341.57 L0.05 333.6 L1.83 334.57 L1.78 342.55 L0 341.57 Z" class="st40"/> + </g> + <g id="shape80-349" v:mID="80" v:groupContext="shape" transform="translate(15.0357,-4.53251)"> + <title>Sheet.80</title> + <path d="M0 341.57 L0.05 333.6 L1.83 334.57 L1.78 342.55 L0 341.57 Z" class="st40"/> + </g> + <g id="shape81-352" v:mID="81" v:groupContext="shape" transform="translate(8.24006,-10.0631)"> + <title>Sheet.81</title> + <path d="M0.85 342.24 a0.388199 0.388199 0 0 1 -0.425188 0.308698 a0.638045 0.638045 0 0 1 -0.424658 -0.573447 + L0 336.5 a0.387575 0.387575 0 0 1 0.424658 -0.308698 a0.637725 0.637725 0 0 1 0.425188 0.573447 + L0.85 342.24 Z" class="st41"/> + </g> + <g id="shape82-356" v:mID="82" v:groupContext="shape" transform="translate(10.6556,-8.62924)"> + <title>Sheet.82</title> + <path d="M0.85 342.24 a0.388199 0.388199 0 0 1 -0.425188 0.308698 a0.638045 0.638045 0 0 1 -0.424658 -0.573447 + L0 336.5 a0.387575 0.387575 0 0 1 0.424658 -0.308698 a0.637725 0.637725 0 0 1 0.425188 0.573447 + L0.85 342.24 Z" class="st41"/> + </g> + <g id="shape83-359" v:mID="83" v:groupContext="shape" transform="translate(13.0717,-7.19483)"> + <title>Sheet.83</title> + <path d="M0.85 342.24 a0.388199 0.388199 0 0 1 -0.425188 0.308698 a0.638045 0.638045 0 0 1 -0.424658 -0.573447 + L0 336.5 a0.387575 0.387575 0 0 1 0.424658 -0.308698 a0.637725 0.637725 0 0 1 0.425188 0.573447 + L0.85 342.24 Z" class="st41"/> + </g> + <g id="shape84-362" v:mID="84" v:groupContext="shape" transform="translate(15.4873,-5.76095)"> + <title>Sheet.84</title> + <path d="M0.85 342.24 a0.388502 0.388502 0 0 1 -0.425717 0.308698 a0.638367 0.638367 0 0 1 -0.424129 -0.573447 + L0 336.5 a0.387272 0.387272 0 0 1 0.424129 -0.308698 a0.638235 0.638235 0 0 1 0.425717 0.573447 + L0.85 342.24 Z" class="st41"/> + </g> + <g id="shape85-365" v:mID="85" v:groupContext="shape" transform="translate(7.78787,-9.81214)"> + <title>Sheet.85</title> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55 L0 342.55 Z" class="st42"/> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55" class="st43"/> + </g> + <g id="shape86-368" v:mID="86" v:groupContext="shape" transform="translate(10.204,-8.37826)"> + <title>Sheet.86</title> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55 L0 342.55 Z" class="st42"/> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55" class="st43"/> + </g> + <g id="shape87-371" v:mID="87" v:groupContext="shape" transform="translate(12.6196,-6.94385)"> + <title>Sheet.87</title> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55 L0 342.55 Z" class="st42"/> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55" class="st43"/> + </g> + <g id="shape88-374" v:mID="88" v:groupContext="shape" transform="translate(15.0357,-5.50996)"> + <title>Sheet.88</title> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55 L0 342.55 Z" class="st42"/> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55" class="st43"/> + </g> + <g id="shape89-377" v:mID="89" v:groupContext="shape" transform="translate(7.78787,-4.53251)"> + <title>Sheet.89</title> + <path d="M9.08 334.57 L9.03 342.55 L7.25 341.57 L9.08 334.57 ZM6.66 333.14 L6.61 341.11 L4.83 340.13 L6.66 + 333.14 ZM4.25 331.7 L4.2 339.68 L2.42 338.7 L4.25 331.7 ZM1.83 330.27 L1.78 338.24 L0 337.27 + L1.83 330.27 Z" class="st42"/> + <path d="M9.08 334.57 L9.03 342.55 L7.25 341.57M6.66 333.14 L6.61 341.11 L4.83 340.13M4.25 331.7 L4.2 339.68 + L2.42 338.7M1.83 330.27 L1.78 338.24 L0 337.27" class="st44"/> + </g> + <g id="shape90-380" v:mID="90" v:groupContext="shape" transform="translate(2.22125,-11.8454)"> + <title>Sheet.90</title> + <path d="M0 341.85 L0.63 341.42 L1.42 341.78 L0.03 342.55 L0 341.85 Z" class="st45"/> + </g> + <g id="shape91-384" v:mID="91" v:groupContext="shape" transform="translate(17.1796,-3.17487)"> + <title>Sheet.91</title> + <path d="M0 341.85 L0.63 341.42 L1.42 341.78 L0.03 342.55 L0 341.85 Z" class="st45"/> + </g> + <g id="shape92-387" v:mID="92" v:groupContext="shape" transform="translate(1.46036,-10.3893)"> + <title>Sheet.92</title> + <path d="M2.12 341.35 L0 342.55 L0 333.54 L2.12 332.29 L2.12 333.41 L0.79 334.15 L0.79 341.09 L2.18 340.33 + L2.12 341.35 Z" class="st36"/> + </g> + <g id="shape93-390" v:mID="93" v:groupContext="shape" transform="translate(16.4187,-1.71875)"> + <title>Sheet.93</title> + <path d="M2.12 341.35 L0 342.55 L0 333.54 L2.12 332.29 L2.12 333.41 L0.79 334.15 L0.79 341.09 L2.18 340.33 + L2.12 341.35 Z" class="st36"/> + </g> + <g id="shape94-393" v:mID="94" v:groupContext="shape" transform="translate(0.467548,-10.3893)"> + <title>Sheet.94</title> + <path d="M0.99 333.54 L3.11 332.29 L2.12 331.66 L0 332.91 L0 341.92 L0.99 342.55 L0.99 333.54 Z" + class="st46"/> + </g> + <g id="shape95-397" v:mID="95" v:groupContext="shape" transform="translate(15.4259,-1.71875)"> + <title>Sheet.95</title> + <path d="M0.99 333.54 L3.11 332.29 L2.12 331.66 L0 332.91 L0 341.92 L0.99 342.55 L0.99 333.54 Z" + class="st46"/> + </g> + <g id="shape96-400" v:mID="96" v:groupContext="shape" transform="translate(0.467548,-1.71928)"> + <title>Sheet.96</title> + <path d="M17.34 339.96 L16.75 340.37 L16.75 334.15 L18.07 333.41 L18.07 332.29 L17.08 331.66 L14.96 332.91 + L14.96 341.92 L15.95 342.55 L18.07 341.35 L18.14 340.33 L17.34 339.96 ZM2.38 331.29 L1.79 331.7 + L1.79 325.48 L3.11 324.74 L3.11 323.62 L2.12 322.99 L0 324.24 L0 333.25 L0.99 333.87 L3.11 332.68 + L3.18 331.66 L2.38 331.29 Z" class="st47"/> + </g> + <g id="shape97-402" v:mID="97" v:groupContext="shape" transform="translate(19.9526,-8.71396)"> + <title>Sheet.97</title> + <path d="M1.13 341.58 a0.653986 0.653986 -180 0 0 -0.73971 -0.492434 a0.656072 0.656072 -180 0 0 -0.253101 + 0.865731 a0.653066 0.653066 -180 0 0 0.740769 0.491375 a0.655459 0.655459 -180 0 0 0.252042 + -0.864672 Z" class="st38"/> + </g> + <g id="shape98-405" v:mID="98" v:groupContext="shape" transform="translate(19.9526,-2.35997)"> + <title>Sheet.98</title> + <path d="M1.13 341.58 a0.653986 0.653986 -180 0 0 -0.73971 -0.492434 a0.656072 0.656072 -180 0 0 -0.253101 + 0.865731 a0.653066 0.653066 -180 0 0 0.740769 0.491375 a0.655459 0.655459 -180 0 0 0.252042 + -0.864672 Z" class="st38"/> + </g> + <g id="shape99-408" v:mID="99" v:groupContext="shape" transform="translate(0,-0.415652)"> + <title>Sheet.99</title> + <path d="M36.07 331.28 L36.07 321.27 L19.64 311.85 L3.16 321.13 L3.16 321.52 L0 319.68 L0 329.58 L0.47 329.86 + L0.47 331.94 L1.46 332.57 L3.33 331.52 L15.43 338.57 L15.43 340.61 L16.42 341.24 L18.24 340.22 + L22.24 342.55 L22.24 339.27 L36.07 331.28 Z" class="st47"/> + </g> + <g id="shape100-410" v:mID="100" v:groupContext="shape" transform="translate(27.8077,-2.86477)"> + <title>Sheet.100</title> + <path d="M0.29 342.55 L6.62 338.89 A1.82805 1.82805 0 0 1 6.62 336.9 L0.29 340.55 A1.82805 1.82805 -180 0 + 0 0.29 342.55 Z" class="st48"/> + </g> + <g id="shape101-412" v:mID="101" v:groupContext="shape" transform="translate(23.5035,-4.85627)"> + <title>Sheet.101</title> + <path d="M4.6 342.55 L10.92 338.89 L6.32 336.24 L0 339.89 L4.6 342.55 Z" class="st49"/> + </g> + <g id="shape102-416" v:mID="102" v:groupContext="shape" transform="translate(23.3588,-2.86477)"> + <title>Sheet.102</title> + <path d="M0.14 339.89 L4.74 342.55 A1.82805 1.82805 0 0 1 4.74 340.55 L0.14 337.9 A3.49826 3.49826 -180 0 + 0 0.14 339.89 Z" class="st50"/> + </g> + <g id="shape103-420" v:mID="103" v:groupContext="shape" transform="translate(25.8933,-5.98478)"> + <title>Sheet.103</title> + <path d="M2.87 342.55 L0 340.89" class="st51"/> + <path d="M0.94 340.34 L3.82 342" class="st51"/> + <path d="M1.88 339.8 L4.76 341.46" class="st51"/> + <path d="M2.82 339.26 L5.7 340.92" class="st51"/> + <path d="M3.76 338.71 L6.64 340.37" class="st51"/> + </g> + <g id="shape104-427" v:mID="104" v:groupContext="shape" transform="translate(23.5035,-7.51159)"> + <title>Sheet.104</title> + <path d="M5.13 341.17 L11.45 337.52 A11.9345 11.9345 0 0 1 6.32 338.89 L0 342.55 A11.9345 11.9345 -180 0 + 0 5.13 341.17 Z" class="st52"/> + </g> + <g id="shape105-435" v:mID="105" v:groupContext="shape" transform="translate(30.2106,-4.74563)"> + <title>Sheet.105</title> + <path d="M0.98 341.98 L0 342.55" class="st51"/> + <path d="M1.26 341.48 L2.24 340.92" class="st51"/> + <path d="M2.53 340.42 L3.51 339.86" class="st51"/> + </g> + <g id="shape106-440" v:mID="106" v:groupContext="shape" transform="translate(23.3588,-2.86477)"> + <title>Sheet.106</title> + <path d="M0.14 339.89 L4.74 342.55 L11.07 338.89 A1.82805 1.82805 0 0 1 11.07 336.9 L7.85 335.04 L11.6 332.87 + A11.9345 11.9345 0 0 1 6.47 334.25 L0.14 337.9 A3.49826 3.49826 -180 0 0 0.14 339.89" + class="st53"/> + </g> + </g> + <g id="group107-443" transform="translate(104.617,-33.8201)" v:mID="107" v:groupContext="group"> + <v:userDefs> + <v:ud v:nameU="SkinColor" v:prompt="" v:val="VT5(#da8c36)"/> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + </v:userDefs> + <title>Directory server.104</title> + <g id="shape108-444" v:mID="108" v:groupContext="shape" transform="translate(0,-0.451005)"> + <title>Sheet.108</title> + <g id="shadow108-445" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M0.47 329.86 L0.47 331.94 L1.46 332.57 L3.33 331.52 L15.43 338.57 L15.43 340.61 L16.42 341.24 + L18.24 340.22 L22.24 342.55 L22.24 339.27 L36.07 331.28 L36.07 321.27 L19.64 311.85 L3.16 + 321.13 L3.16 321.5 L0 319.68 L0 329.58 L0.47 329.86 Z" class="st33"/> + </g> + <path d="M0.47 329.86 L0.47 331.94 L1.46 332.57 L3.33 331.52 L15.43 338.57 L15.43 340.61 L16.42 341.24 L18.24 + 340.22 L22.24 342.55 L22.24 339.27 L36.07 331.28 L36.07 321.27 L19.64 311.85 L3.16 321.13 L3.16 + 321.5 L0 319.68 L0 329.58 L0.47 329.86 Z" class="st34"/> + </g> + <g id="shape109-448" v:mID="109" v:groupContext="shape" transform="translate(3.1636,-11.8063)"> + <title>Sheet.109</title> + <path d="M16.48 323.24 L32.91 332.66 L16.31 342.55 L0 333.26 L0 332.52 L16.48 323.24 Z" class="st35"/> + </g> + <g id="shape110-451" v:mID="110" v:groupContext="shape" transform="translate(19.06,-3.68954)"> + <title>Sheet.110</title> + <path d="M17.01 324.55 L0 334.19 L3.18 342.55 L17.01 334.56 L17.01 324.55 Z" class="st36"/> + </g> + <g id="shape111-454" v:mID="111" v:groupContext="shape" transform="translate(0,-0.415652)"> + <title>Sheet.111</title> + <path d="M22.24 342.55 L0 329.58 L0 319.68 L22.24 332.43 L22.24 342.55 Z" class="st37"/> + </g> + <g id="shape112-457" v:mID="112" v:groupContext="shape" transform="translate(0.82443,-19.8334)"> + <title>Sheet.112</title> + <path d="M1.13 341.58 a0.653986 0.653986 -180 0 0 -0.73971 -0.492434 a0.656072 0.656072 -180 0 0 -0.253101 + 0.865731 a0.653066 0.653066 -180 0 0 0.740769 0.491375 a0.655459 0.655459 -180 0 0 0.252042 + -0.864672 Z" class="st38"/> + </g> + <g id="shape113-460" v:mID="113" v:groupContext="shape" transform="translate(3.62283,-15.1638)"> + <title>Sheet.113</title> + <path d="M3.22 339.78 A1.86495 1.86495 -180 0 0 1.11 338.38 A1.8709 1.8709 -180 0 0 0.38 340.85 A1.86532 + 1.86532 -180 0 0 2.5 342.25 A1.87264 1.87264 -180 0 0 3.22 339.78 Z" class="st38"/> + </g> + <g id="shape114-463" v:mID="114" v:groupContext="shape" transform="translate(3.62283,-10.4867)"> + <title>Sheet.114</title> + <path d="M3.22 339.78 A1.86495 1.86495 -180 0 0 1.11 338.38 A1.8709 1.8709 -180 0 0 0.38 340.85 A1.86532 + 1.86532 -180 0 0 2.5 342.25 A1.87264 1.87264 -180 0 0 3.22 339.78 Z" class="st38"/> + </g> + <g id="shape115-466" v:mID="115" v:groupContext="shape" transform="translate(4.52404,-16.3668)"> + <title>Sheet.115</title> + <path d="M1.61 341.16 a0.931952 0.931952 -180 0 0 -1.05741 -0.702645 a0.935408 0.935408 -180 0 0 -0.361118 + 1.23585 a0.932139 0.932139 -180 0 0 1.05794 0.702645 a0.935822 0.935822 -180 0 0 0.360589 -1.23585 + Z" class="st39"/> + </g> + <g id="shape116-469" v:mID="116" v:groupContext="shape" transform="translate(4.52404,-11.6897)"> + <title>Sheet.116</title> + <path d="M1.61 341.16 a0.931952 0.931952 -180 0 0 -1.05741 -0.702645 a0.935875 0.935875 -180 0 0 -0.361118 + 1.23585 a0.932139 0.932139 -180 0 0 1.05794 0.702645 a0.935822 0.935822 -180 0 0 0.360589 -1.23585 + Z" class="st39"/> + </g> + <g id="shape117-472" v:mID="117" v:groupContext="shape" transform="translate(7.78787,-8.83469)"> + <title>Sheet.117</title> + <path d="M0 341.57 L0.05 333.6 L1.83 334.57 L1.78 342.55 L0 341.57 Z" class="st40"/> + </g> + <g id="shape118-475" v:mID="118" v:groupContext="shape" transform="translate(10.204,-7.4008)"> + <title>Sheet.118</title> + <path d="M0 341.57 L0.05 333.6 L1.83 334.57 L1.78 342.55 L0 341.57 Z" class="st40"/> + </g> + <g id="shape119-478" v:mID="119" v:groupContext="shape" transform="translate(12.6196,-5.96639)"> + <title>Sheet.119</title> + <path d="M0 341.57 L0.05 333.6 L1.83 334.57 L1.78 342.55 L0 341.57 Z" class="st40"/> + </g> + <g id="shape120-481" v:mID="120" v:groupContext="shape" transform="translate(15.0357,-4.53251)"> + <title>Sheet.120</title> + <path d="M0 341.57 L0.05 333.6 L1.83 334.57 L1.78 342.55 L0 341.57 Z" class="st40"/> + </g> + <g id="shape121-484" v:mID="121" v:groupContext="shape" transform="translate(8.24006,-10.0631)"> + <title>Sheet.121</title> + <path d="M0.85 342.24 a0.388199 0.388199 0 0 1 -0.425188 0.308698 a0.638045 0.638045 0 0 1 -0.424658 -0.573447 + L0 336.5 a0.387575 0.387575 0 0 1 0.424658 -0.308698 a0.637725 0.637725 0 0 1 0.425188 0.573447 + L0.85 342.24 Z" class="st41"/> + </g> + <g id="shape122-487" v:mID="122" v:groupContext="shape" transform="translate(10.6556,-8.62924)"> + <title>Sheet.122</title> + <path d="M0.85 342.24 a0.388199 0.388199 0 0 1 -0.425188 0.308698 a0.638045 0.638045 0 0 1 -0.424658 -0.573447 + L0 336.5 a0.387575 0.387575 0 0 1 0.424658 -0.308698 a0.637725 0.637725 0 0 1 0.425188 0.573447 + L0.85 342.24 Z" class="st41"/> + </g> + <g id="shape123-490" v:mID="123" v:groupContext="shape" transform="translate(13.0717,-7.19483)"> + <title>Sheet.123</title> + <path d="M0.85 342.24 a0.388199 0.388199 0 0 1 -0.425188 0.308698 a0.638045 0.638045 0 0 1 -0.424658 -0.573447 + L0 336.5 a0.387575 0.387575 0 0 1 0.424658 -0.308698 a0.637725 0.637725 0 0 1 0.425188 0.573447 + L0.85 342.24 Z" class="st41"/> + </g> + <g id="shape124-493" v:mID="124" v:groupContext="shape" transform="translate(15.4873,-5.76095)"> + <title>Sheet.124</title> + <path d="M0.85 342.24 a0.388502 0.388502 0 0 1 -0.425717 0.308698 a0.638367 0.638367 0 0 1 -0.424129 -0.573447 + L0 336.5 a0.387272 0.387272 0 0 1 0.424129 -0.308698 a0.638235 0.638235 0 0 1 0.425717 0.573447 + L0.85 342.24 Z" class="st41"/> + </g> + <g id="shape125-496" v:mID="125" v:groupContext="shape" transform="translate(7.78787,-9.81214)"> + <title>Sheet.125</title> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55 L0 342.55 Z" class="st42"/> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55" class="st43"/> + </g> + <g id="shape126-499" v:mID="126" v:groupContext="shape" transform="translate(10.204,-8.37826)"> + <title>Sheet.126</title> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55 L0 342.55 Z" class="st42"/> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55" class="st43"/> + </g> + <g id="shape127-502" v:mID="127" v:groupContext="shape" transform="translate(12.6196,-6.94385)"> + <title>Sheet.127</title> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55 L0 342.55 Z" class="st42"/> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55" class="st43"/> + </g> + <g id="shape128-505" v:mID="128" v:groupContext="shape" transform="translate(15.0357,-5.50996)"> + <title>Sheet.128</title> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55 L0 342.55 Z" class="st42"/> + <path d="M0 342.55 L0.05 334.57 L1.83 335.55" class="st43"/> + </g> + <g id="shape129-508" v:mID="129" v:groupContext="shape" transform="translate(7.78787,-4.53251)"> + <title>Sheet.129</title> + <path d="M9.08 334.57 L9.03 342.55 L7.25 341.57 L9.08 334.57 ZM6.66 333.14 L6.61 341.11 L4.83 340.13 L6.66 + 333.14 ZM4.25 331.7 L4.2 339.68 L2.42 338.7 L4.25 331.7 ZM1.83 330.27 L1.78 338.24 L0 337.27 + L1.83 330.27 Z" class="st42"/> + <path d="M9.08 334.57 L9.03 342.55 L7.25 341.57M6.66 333.14 L6.61 341.11 L4.83 340.13M4.25 331.7 L4.2 339.68 + L2.42 338.7M1.83 330.27 L1.78 338.24 L0 337.27" class="st44"/> + </g> + <g id="shape130-511" v:mID="130" v:groupContext="shape" transform="translate(2.22125,-11.8454)"> + <title>Sheet.130</title> + <path d="M0 341.85 L0.63 341.42 L1.42 341.78 L0.03 342.55 L0 341.85 Z" class="st45"/> + </g> + <g id="shape131-514" v:mID="131" v:groupContext="shape" transform="translate(17.1796,-3.17487)"> + <title>Sheet.131</title> + <path d="M0 341.85 L0.63 341.42 L1.42 341.78 L0.03 342.55 L0 341.85 Z" class="st45"/> + </g> + <g id="shape132-517" v:mID="132" v:groupContext="shape" transform="translate(1.46036,-10.3893)"> + <title>Sheet.132</title> + <path d="M2.12 341.35 L0 342.55 L0 333.54 L2.12 332.29 L2.12 333.41 L0.79 334.15 L0.79 341.09 L2.18 340.33 + L2.12 341.35 Z" class="st36"/> + </g> + <g id="shape133-520" v:mID="133" v:groupContext="shape" transform="translate(16.4187,-1.71875)"> + <title>Sheet.133</title> + <path d="M2.12 341.35 L0 342.55 L0 333.54 L2.12 332.29 L2.12 333.41 L0.79 334.15 L0.79 341.09 L2.18 340.33 + L2.12 341.35 Z" class="st36"/> + </g> + <g id="shape134-523" v:mID="134" v:groupContext="shape" transform="translate(0.467548,-10.3893)"> + <title>Sheet.134</title> + <path d="M0.99 333.54 L3.11 332.29 L2.12 331.66 L0 332.91 L0 341.92 L0.99 342.55 L0.99 333.54 Z" + class="st46"/> + </g> + <g id="shape135-526" v:mID="135" v:groupContext="shape" transform="translate(15.4259,-1.71875)"> + <title>Sheet.135</title> + <path d="M0.99 333.54 L3.11 332.29 L2.12 331.66 L0 332.91 L0 341.92 L0.99 342.55 L0.99 333.54 Z" + class="st46"/> + </g> + <g id="shape136-529" v:mID="136" v:groupContext="shape" transform="translate(0.467548,-1.71928)"> + <title>Sheet.136</title> + <path d="M17.34 339.96 L16.75 340.37 L16.75 334.15 L18.07 333.41 L18.07 332.29 L17.08 331.66 L14.96 332.91 + L14.96 341.92 L15.95 342.55 L18.07 341.35 L18.14 340.33 L17.34 339.96 ZM2.38 331.29 L1.79 331.7 + L1.79 325.48 L3.11 324.74 L3.11 323.62 L2.12 322.99 L0 324.24 L0 333.25 L0.99 333.87 L3.11 332.68 + L3.18 331.66 L2.38 331.29 Z" class="st47"/> + </g> + <g id="shape137-531" v:mID="137" v:groupContext="shape" transform="translate(19.9526,-8.71396)"> + <title>Sheet.137</title> + <path d="M1.13 341.58 a0.653986 0.653986 -180 0 0 -0.73971 -0.492434 a0.656072 0.656072 -180 0 0 -0.253101 + 0.865731 a0.653066 0.653066 -180 0 0 0.740769 0.491375 a0.655459 0.655459 -180 0 0 0.252042 + -0.864672 Z" class="st38"/> + </g> + <g id="shape138-534" v:mID="138" v:groupContext="shape" transform="translate(19.9526,-2.35997)"> + <title>Sheet.138</title> + <path d="M1.13 341.58 a0.653986 0.653986 -180 0 0 -0.73971 -0.492434 a0.656072 0.656072 -180 0 0 -0.253101 + 0.865731 a0.653066 0.653066 -180 0 0 0.740769 0.491375 a0.655459 0.655459 -180 0 0 0.252042 + -0.864672 Z" class="st38"/> + </g> + <g id="shape139-537" v:mID="139" v:groupContext="shape" transform="translate(0,-0.415652)"> + <title>Sheet.139</title> + <path d="M36.07 331.28 L36.07 321.27 L19.64 311.85 L3.16 321.13 L3.16 321.52 L0 319.68 L0 329.58 L0.47 329.86 + L0.47 331.94 L1.46 332.57 L3.33 331.52 L15.43 338.57 L15.43 340.61 L16.42 341.24 L18.24 340.22 + L22.24 342.55 L22.24 339.27 L36.07 331.28 Z" class="st47"/> + </g> + <g id="shape140-539" v:mID="140" v:groupContext="shape" transform="translate(27.8077,-2.86477)"> + <title>Sheet.140</title> + <path d="M0.29 342.55 L6.62 338.89 A1.82805 1.82805 0 0 1 6.62 336.9 L0.29 340.55 A1.82805 1.82805 -180 0 + 0 0.29 342.55 Z" class="st48"/> + </g> + <g id="shape141-541" v:mID="141" v:groupContext="shape" transform="translate(23.5035,-4.85627)"> + <title>Sheet.141</title> + <path d="M4.6 342.55 L10.92 338.89 L6.32 336.24 L0 339.89 L4.6 342.55 Z" class="st49"/> + </g> + <g id="shape142-544" v:mID="142" v:groupContext="shape" transform="translate(23.3588,-2.86477)"> + <title>Sheet.142</title> + <path d="M0.14 339.89 L4.74 342.55 A1.82805 1.82805 0 0 1 4.74 340.55 L0.14 337.9 A3.49826 3.49826 -180 0 + 0 0.14 339.89 Z" class="st50"/> + </g> + <g id="shape143-547" v:mID="143" v:groupContext="shape" transform="translate(25.8933,-5.98478)"> + <title>Sheet.143</title> + <path d="M2.87 342.55 L0 340.89" class="st51"/> + <path d="M0.94 340.34 L3.82 342" class="st51"/> + <path d="M1.88 339.8 L4.76 341.46" class="st51"/> + <path d="M2.82 339.26 L5.7 340.92" class="st51"/> + <path d="M3.76 338.71 L6.64 340.37" class="st51"/> + </g> + <g id="shape144-554" v:mID="144" v:groupContext="shape" transform="translate(23.5035,-7.51159)"> + <title>Sheet.144</title> + <path d="M5.13 341.17 L11.45 337.52 A11.9345 11.9345 0 0 1 6.32 338.89 L0 342.55 A11.9345 11.9345 -180 0 + 0 5.13 341.17 Z" class="st52"/> + </g> + <g id="shape145-557" v:mID="145" v:groupContext="shape" transform="translate(30.2106,-4.74563)"> + <title>Sheet.145</title> + <path d="M0.98 341.98 L0 342.55" class="st51"/> + <path d="M1.26 341.48 L2.24 340.92" class="st51"/> + <path d="M2.53 340.42 L3.51 339.86" class="st51"/> + </g> + <g id="shape146-562" v:mID="146" v:groupContext="shape" transform="translate(23.3588,-2.86477)"> + <title>Sheet.146</title> + <path d="M0.14 339.89 L4.74 342.55 L11.07 338.89 A1.82805 1.82805 0 0 1 11.07 336.9 L7.85 335.04 L11.6 332.87 + A11.9345 11.9345 0 0 1 6.47 334.25 L0.14 337.9 A3.49826 3.49826 -180 0 0 0.14 339.89" + class="st53"/> + </g> + </g> + <g id="shape147-565" v:mID="147" v:groupContext="shape" transform="translate(427.321,214.49) rotate(90)"> + <title>Cloud</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + </v:userDefs> + <path d="M5.37 311.54 A8.61618 10.0654 0 0 1 9.5 292.2 A17.4727 20.4114 0 0 1 34.86 275.89 A20.0634 23.4379 0 + 0 1 56.58 272.26 A12.5816 14.6977 0 0 1 75.21 271.05 A14.3244 16.7336 0 0 1 97.98 277.09 A10.2423 + 11.9646 0 0 1 106.25 294.02 A12.6864 14.8197 0 0 1 95.9 318.19 A16.0049 18.6962 0 0 1 73.14 330.27 + A18.8712 22.0444 0 0 1 42.1 335.11 A23.9217 27.9441 0 0 1 15.2 330.27 A9.43759 11.0249 0 0 1 5.37 + 311.54 Z" class="st42"/> + <path d="M5.37 311.54 A8.61618 10.0654 0 0 1 9.5 292.2 A17.4727 20.4114 0 0 1 34.86 275.89 A20.0634 23.4379 0 + 0 1 56.58 272.26 A12.5816 14.6977 0 0 1 75.21 271.05 A14.3244 16.7336 0 0 1 97.98 277.09 A10.2423 + 11.9646 0 0 1 106.25 294.02 A12.6864 14.8197 0 0 1 95.9 318.19 A16.0049 18.6962 0 0 1 73.14 330.27 + A18.8712 22.0444 0 0 1 42.1 335.11 A23.9217 27.9441 0 0 1 15.2 330.27 A9.43759 11.0249 0 0 1 5.37 + 311.54" class="st54"/> + <path d="M11.05 312.14 A8.59237 10.0375 0 0 1 5.37 311.54" class="st54"/> + <path d="M40.54 332.09 A8.62978 10.0812 -180 0 0 42.1 335.11" class="st54"/> + <path d="M73.92 326.65 A6.96633 8.13801 0 0 1 73.14 330.27" class="st54"/> + <path d="M89.7 308.52 A7.30994 8.5394 0 0 1 95.9 318.19" class="st54"/> + <path d="M103.15 297.64 A6.67364 7.79609 -180 0 0 106.25 294.02" class="st54"/> + <path d="M37.96 278.3 A10.2914 12.0219 -180 0 0 34.86 275.89" class="st54"/> + </g> + <g id="shape148-574" v:mID="148" v:groupContext="shape" transform="translate(110.222,-64.9346)"> + <title>Triangle</title> + <desc>setsum</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="15.6995" cy="336.449" width="31.4" height="12.1933"/> + <g id="shadow148-575" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <path d="M31.4 342.55 L14.67 324.26 L0 342.55 L31.4 342.55 Z" class="st9"/> + </g> + <path d="M31.4 342.55 L14.67 324.26 L0 342.55 L31.4 342.55 Z" class="st10"/> + <text x="8.35" y="337.95" class="st55" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>setsum</text> </g> + <g id="shape149-579" v:mID="149" v:groupContext="shape" transform="translate(292.639,20.8827) rotate(45)"> + <title>Sheet.149</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L14.71 342.55" class="st14"/> + </g> + <g id="shape150-584" v:mID="150" v:groupContext="shape" transform="translate(43.2897,-54.1122)"> + <title>Sheet.150</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L10.07 342.55" class="st14"/> + </g> + <g id="shape151-589" v:mID="151" v:groupContext="shape" transform="translate(-112.261,8.34531) rotate(-28.1394)"> + <title>Sheet.151</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 342.55 L18 342.55" class="st14"/> + </g> + <g id="shape152-594" v:mID="152" v:groupContext="shape"> + <title>Sheet.152</title> + <desc>Clients</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="32.4673" cy="337.134" width="64.94" height="10.8224"/> + <rect x="0" y="331.723" width="64.9346" height="10.8224" class="st11"/> + <text x="21.5" y="339.53" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Clients</text> </g> + <g id="shape153-597" v:mID="153" v:groupContext="shape" transform="translate(83.578,-9.58078)"> + <title>Sheet.153</title> + <desc>Distributed Cache</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="42.0677" cy="337.134" width="84.14" height="10.8224"/> + <rect x="0" y="331.723" width="84.1355" height="10.8224" class="st11"/> + <text x="13.1" y="339.53" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Distributed Cache</text> </g> + <g id="shape154-600" v:mID="154" v:groupContext="shape" transform="translate(181.983,-18.6146)"> + <title>Sheet.154</title> + <desc>Web Servers</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="32.4673" cy="337.134" width="64.94" height="10.8224"/> + <rect x="0" y="331.723" width="64.9346" height="10.8224" class="st11"/> + <text x="11.93" y="339.53" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Web Servers</text> </g> + <g id="shape155-603" v:mID="155" v:groupContext="shape" transform="translate(96.6068,630.978) rotate(180)"> + <title>Simple Arrow</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="ArrowType" v:prompt="" v:val="VT0(2):26"/> + </v:userDefs> + <g id="shadow155-604" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,-0.3456,-1.9728)" class="st1"> + <path d="M0 342.55 L12 330.55 L12 336.55 L16.23 336.55 L16.23 342.55 L16.23 348.54 L12 348.54 L12 354.54 + L0 342.55 Z" class="st56"/> + </g> + <path d="M0 342.55 L12 330.55 L12 336.55 L16.23 336.55 L16.23 342.55 L16.23 348.54 L12 348.54 L12 354.54 L0 342.55 + Z" class="st57"/> + </g> + <g id="shape156-607" v:mID="156" v:groupContext="shape" transform="translate(173.159,625.567) rotate(180)"> + <title>Simple Arrow.153</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="ArrowType" v:prompt="" v:val="VT0(2):26"/> + </v:userDefs> + <g id="shadow156-608" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,-0.3456,-1.9728)" class="st1"> + <path d="M0 342.55 L12 330.55 L12 336.55 L16.23 336.55 L16.23 342.55 L16.23 348.54 L12 348.54 L12 354.54 + L0 342.55 Z" class="st56"/> + </g> + <path d="M0 342.55 L12 330.55 L12 336.55 L16.23 336.55 L16.23 342.55 L16.23 348.54 L12 348.54 L12 354.54 L0 342.55 + Z" class="st57"/> + </g> + </g> + <g id="shape157-611" v:mID="157" v:groupContext="shape" transform="translate(0,-149.475)"> + <title>Rectangle</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow157-612" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="193.823" width="271.116" height="148.722" class="st58"/> + </g> + <rect x="0" y="193.823" width="271.116" height="148.722" class="st59"/> + </g> + <g id="shape158-615" v:mID="158" v:groupContext="shape" transform="translate(271.116,-149.475)"> + <title>Rectangle.158</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow158-616" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="193.823" width="202.104" height="148.722" class="st58"/> + </g> + <rect x="0" y="193.823" width="202.104" height="148.722" class="st59"/> + </g> + <g id="shape159-619" v:mID="159" v:groupContext="shape"> + <title>Rectangle.159</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow159-620" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="193.823" width="271.116" height="148.722" class="st58"/> + </g> + <rect x="0" y="193.823" width="271.116" height="148.722" class="st59"/> + </g> + <g id="shape160-623" v:mID="160" v:groupContext="shape" transform="translate(271.116,0)"> + <title>Rectangle.160</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow160-624" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="193.823" width="202.104" height="148.722" class="st58"/> + </g> + <rect x="0" y="193.823" width="202.104" height="148.722" class="st59"/> + </g> + <g id="shape161-627" v:mID="161" v:groupContext="shape" transform="translate(83.578,-151.241)"> + <title>Sheet.161</title> + <desc>(a) Distributed Web Cache</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54.3546" cy="333.806" width="108.71" height="17.4792"/> + <g id="shadow161-628" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="325.066" width="108.709" height="17.4792" class="st9"/> + </g> + <rect x="0" y="325.066" width="108.709" height="17.4792" class="st10"/> + <text x="4" y="336.81" class="st60" v:langID="1033"><v:paragraph v:spLine="-1.5" v:spBefore="8" v:spAfter="16" + v:bulletSize="0.166667"/><v:tabList/>(a) Distributed Web Cache</text> </g> + <g id="shape162-632" v:mID="162" v:groupContext="shape" transform="translate(319.513,-151.241)"> + <title>Sheet.162</title> + <desc>(b) Detecting Routing Loops</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54.3546" cy="333.806" width="108.71" height="17.4792"/> + <g id="shadow162-633" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="325.066" width="108.709" height="17.4792" class="st9"/> + </g> + <rect x="0" y="325.066" width="108.709" height="17.4792" class="st10"/> + <text x="4" y="336.81" class="st60" v:langID="1033"><v:paragraph v:spLine="-1.5" v:spBefore="8" v:spAfter="16" + v:bulletSize="0.166667"/><v:tabList/>(b) Detecting Routing Loops</text> </g> + <g id="shape163-637" v:mID="163" v:groupContext="shape" transform="translate(77.5283,-3.35965)"> + <title>Sheet.163</title> + <desc>(c) In-order Workload Scheduler</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="63.5211" cy="333.806" width="127.05" height="17.4792"/> + <g id="shadow163-638" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="325.066" width="127.042" height="17.4792" class="st9"/> + </g> + <rect x="0" y="325.066" width="127.042" height="17.4792" class="st10"/> + <text x="4" y="336.81" class="st60" v:langID="1033"><v:paragraph v:spLine="-1.5" v:spBefore="8" v:spAfter="16" + v:bulletSize="0.166667"/><v:tabList/>(c) In-order Workload Scheduler</text> </g> + <g id="shape164-642" v:mID="164" v:groupContext="shape" transform="translate(307.414,-3.35965)"> + <title>Sheet.164</title> + <desc>(d) Database Semi-join Operations</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="66.2253" cy="333.806" width="132.46" height="17.4792"/> + <g id="shadow164-643" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="325.066" width="132.451" height="17.4792" class="st9"/> + </g> + <rect x="0" y="325.066" width="132.451" height="17.4792" class="st10"/> + <text x="4" y="336.81" class="st60" v:langID="1033"><v:paragraph v:spLine="-1.5" v:spBefore="8" v:spAfter="16" + v:bulletSize="0.166667"/><v:tabList/>(d) Database Semi-join Operations</text> </g> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/member_i2.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i2.svg new file mode 100644 index 000000000..759c6545a --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i2.svg @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export memship_i2.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="4.38194in" height="1.25694in" + viewBox="0 0 315.5 90.5" xml:space="preserve" color-interpolation-filters="sRGB" class="st6"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:none;stroke:none;stroke-width:0.25} + .st2 {fill:#5b9bd5;font-family:Calibri;font-size:1.16666em} + .st3 {baseline-shift:32.4943%;font-size:0.649886em} + .st4 {font-size:1em} + .st5 {font-family:Cambria Math;font-size:1em} + .st6 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="shape3-1" v:mID="3" v:groupContext="shape" transform="translate(0.25,-0.25)"> + <title>Sheet.3</title> + <desc>False Positive Probability = (1-(1-1/m)kn)k ≃ (1-ekn/m)k</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="157.5" cy="45.5" width="315" height="90"/> + <rect x="0" y="0.5" width="315" height="90" class="st1"/> + <text x="8.28" y="49.82" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>False Positive Probability = (1-(1-1/m)<tspan + dy="-0.234em" class="st3" v:baseFontSize="14">kn</tspan><tspan dy="0.152em" class="st4">)</tspan><tspan + dy="-0.234em" class="st3" v:baseFontSize="14">k</tspan><tspan dy="0.152em" class="st4"> </tspan><tspan + class="st5">≃</tspan> (1-e<tspan dy="-0.234em" class="st3" v:baseFontSize="14">kn</tspan><tspan class="st3" + v:baseFontSize="14">/</tspan><tspan class="st3" v:baseFontSize="14">m</tspan><tspan dy="0.152em" + class="st4">)</tspan><tspan dy="-0.234em" class="st3" v:baseFontSize="14">k</tspan></text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/member_i3.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i3.svg new file mode 100644 index 000000000..41e92cb8d --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i3.svg @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export memship_i3.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + width="4.71875in" height="2.84375in" viewBox="0 0 339.75 204.75" xml:space="preserve" color-interpolation-filters="sRGB" + class="st14"> + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st3 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st4 {marker-end:url(#mrkr5-32);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st5 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.28409090909091} + .st6 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st7 {font-size:1em} + .st8 {fill:#deebf6;stroke:#c7c8c8;stroke-width:0.25} + .st9 {fill:#000000;font-family:Calibri;font-size:0.833336em} + .st10 {marker-end:url(#mrkr5-84);stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st11 {fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1;stroke-width:0.28409090909091} + .st12 {fill:none;stroke:none;stroke-width:0.25} + .st13 {fill:#ff0000;font-family:Calibri;font-size:1.00001em} + .st14 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-32" class="st5" refX="-6.16" orient="auto" markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-3.52,-3.52) "/> + </marker> + <marker id="mrkr5-84" class="st11" refX="-5.8" orient="auto" markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-3.52,-3.52) "/> + </marker> + </defs> + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g> + <title>Page-1</title> + <g id="group174-1" transform="translate(3.0294,-5.3478)"> + <title>Sheet.174</title> + <g id="shape155-2" transform="translate(99,-99)"> + <title>Circle</title> + <g id="shadow155-3" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 186.75 A18 18 0 0 1 36 186.75 A18 18 0 1 1 0 186.75 Z" class="st2"/> + </g> + <path d="M0 186.75 A18 18 0 0 1 36 186.75 A18 18 0 1 1 0 186.75 Z" class="st3"/> + </g> + <g id="shape156-7" transform="translate(207,-108)"> + <title>Circle.156</title> + <g id="shadow156-8" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 186.75 A18 18 0 0 1 36 186.75 A18 18 0 1 1 0 186.75 Z" class="st2"/> + </g> + <path d="M0 186.75 A18 18 0 0 1 36 186.75 A18 18 0 1 1 0 186.75 Z" class="st3"/> + </g> + <g id="shape157-12" transform="translate(153,-162)"> + <title>Circle.157</title> + <g id="shadow157-13" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 186.75 A18 18 0 0 1 36 186.75 A18 18 0 1 1 0 186.75 Z" class="st2"/> + </g> + <path d="M0 186.75 A18 18 0 0 1 36 186.75 A18 18 0 1 1 0 186.75 Z" class="st3"/> + </g> + <g id="shape158-17" transform="translate(297,-99)"> + <title>Circle.158</title> + <g id="shadow158-18" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 186.75 A18 18 0 0 1 36 186.75 A18 18 0 1 1 0 186.75 Z" class="st2"/> + </g> + <path d="M0 186.75 A18 18 0 0 1 36 186.75 A18 18 0 1 1 0 186.75 Z" class="st3"/> + </g> + <g id="shape159-22" transform="translate(180,-36)"> + <title>Circle.159</title> + <g id="shadow159-23" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 186.75 A18 18 0 0 1 36 186.75 A18 18 0 1 1 0 186.75 Z" class="st2"/> + </g> + <path d="M0 186.75 A18 18 0 0 1 36 186.75 A18 18 0 1 1 0 186.75 Z" class="st3"/> + </g> + <g id="shape160-27" transform="translate(109.604,-115.419) rotate(-7.12502)"> + <title>Sheet.160</title> + <path d="M0 204.75 L66.4 204.75" class="st4"/> + </g> + <g id="shape161-33" transform="translate(276.661,-123.214) rotate(9.46232)"> + <title>Sheet.161</title> + <path d="M0 204.75 L48.58 204.75" class="st4"/> + </g> + <g id="shape162-38" transform="translate(246.135,262.572) rotate(-160.346)"> + <title>Sheet.162</title> + <path d="M0 204.75 L127.63 204.75" class="st4"/> + </g> + <g id="shape163-43" transform="translate(284.391,198.775) rotate(141.977)"> + <title>Sheet.163</title> + <path d="M0 204.75 L46.23 204.75" class="st4"/> + </g> + <g id="shape164-48" transform="translate(70.6118,307.655) rotate(-145.945)"> + <title>Sheet.164</title> + <path d="M0 204.75 L60.88 204.75" class="st4"/> + </g> + <g id="shape167-53" transform="translate(72,0)"> + <title>Rectangle.167</title> + <desc>BF of IDs</desc> + <g id="shadow167-54" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="177.75" width="36" height="27" class="st2"/> + </g> + <rect x="0" y="177.75" width="36" height="27" class="st3"/> + <text x="7.69" y="188.25" class="st6">BF of <tspan x="11.71" dy="1.2em" class="st7">IDs</tspan></text> </g> + <g id="shape168-60" transform="translate(108,0)"> + <title>Rectangle.168</title> + <desc>Packet</desc> + <g id="shadow168-61" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="177.75" width="90" height="27" class="st2"/> + </g> + <rect x="0" y="177.75" width="90" height="27" class="st8"/> + <text x="31.47" y="194.25" class="st9">Packet</text> </g> + <g id="shape169-66" transform="translate(0,-63)"> + <title>Rectangle.169</title> + <desc>BF of IDs</desc> + <g id="shadow169-67" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="177.75" width="36" height="27" class="st2"/> + </g> + <rect x="0" y="177.75" width="36" height="27" class="st3"/> + <text x="7.69" y="188.25" class="st6">BF of <tspan x="11.71" dy="1.2em" class="st7">IDs</tspan></text> </g> + <g id="shape170-73" transform="translate(36,-63)"> + <title>Rectangle.170</title> + <desc>Packet</desc> + <g id="shadow170-74" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <rect x="0" y="177.75" width="90" height="27" class="st2"/> + </g> + <rect x="0" y="177.75" width="90" height="27" class="st8"/> + <text x="31.47" y="194.25" class="st9">Packet</text> </g> + <g id="shape171-79" transform="translate(240.248,331.493) rotate(161.565)"> + <title>Sheet.171</title> + <path d="M-0 190.52 A81.3416 36.0611 -153.48 0 0 82.31 195.86 L82.49 195.55" class="st10"/> + </g> + <g id="shape172-85" transform="translate(156.426,260.029) rotate(161.565)"> + <title>Sheet.172</title> + <path d="M-0 181.6 A88.1422 54.1439 -124.1 0 0 82.68 187.13 L82.83 186.81" class="st10"/> + </g> + <g id="shape173-90" transform="translate(18,-121.5)"> + <title>Sheet.173</title> + <desc>Encode ID</desc> + <rect x="0" y="177.75" width="63" height="27" class="st12"/> + <text x="7.02" y="194.85" class="st13">Encode ID</text> </g> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/member_i4.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i4.svg new file mode 100644 index 000000000..a2b6f2f56 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i4.svg @@ -0,0 +1,450 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> +<!-- Generated by Microsoft Visio 11.0, SVG Export, v1.0 memship_i4.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="7.625in" height="3.125in" viewBox="0 0 549 225" + xml:space="preserve" color-interpolation-filters="sRGB" class="st18"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:none;stroke:#ff0000;stroke-width:0.25} + .st2 {fill:#5b9bd5;font-family:Calibri;font-size:1.00001em} + .st3 {marker-end:url(#mrkr5-10);stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.25} + .st4 {fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1;stroke-width:0.47169811320755} + .st5 {visibility:visible} + .st6 {fill:#5b9bd5;fill-opacity:0.22;stroke:#5b9bd5;stroke-opacity:0.22;stroke-width:0.25} + .st7 {fill:#5b9bd5;stroke:#c8c8c8;stroke-width:0.25} + .st8 {fill:none;stroke:none;stroke-width:0.25} + .st9 {fill:#5b9bd5;font-family:Calibri;font-size:1.16666em} + .st10 {stroke:#5b9bd5;stroke-dasharray:1.5,3;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5} + .st11 {fill:#5b9bd5;fill-opacity:0.25;stroke:#5b9bd5;stroke-opacity:0.25;stroke-width:0.75} + .st12 {fill:#4f88bb;stroke:#41719c;stroke-width:0.75} + .st13 {fill:#ffffff;font-family:Calibri;font-size:1.00001em;font-weight:bold} + .st14 {fill:#000000;font-family:Calibri;font-size:1.00001em} + .st15 {font-size:1em} + .st16 {marker-end:url(#mrkr5-162);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st17 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.28409090909091} + .st18 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-10" class="st4" v:arrowType="5" v:arrowSize="2" v:setback="3.71" refX="-3.71" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-2.12,-2.12) "/> + </marker> + <marker id="mrkr5-162" class="st17" v:arrowType="5" v:arrowSize="2" v:setback="5.8" refX="-5.8" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-3.52,-3.52) "/> + </marker> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="group47-1" transform="translate(3.0294,-0.25)" v:mID="47" v:groupContext="group"> + <title>Sheet.47</title> + <g id="shape1-2" v:mID="1" v:groupContext="shape" transform="translate(177.75,-191.922)"> + <title>Sheet.1</title> + <desc>Element</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="216" width="108" height="18"/> + <rect x="0" y="207" width="108" height="18" class="st1"/> + <text x="33.77" y="219.6" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Element</text> </g> + <g id="shape2-5" v:mID="2" v:groupContext="shape" transform="translate(456.75,33.0781) rotate(90)"> + <title>Sheet.2</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 225 L18.65 225" class="st3"/> + </g> + <g id="shape3-11" v:mID="3" v:groupContext="shape" transform="translate(0,-67.0469)"> + <title>Rectangle.54</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow3-12" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape4-15" v:mID="4" v:groupContext="shape" transform="translate(27,-67.0469)"> + <title>Rectangle.55</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow4-16" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape5-19" v:mID="5" v:groupContext="shape" transform="translate(54,-67.0469)"> + <title>Rectangle.56</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow5-20" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape6-23" v:mID="6" v:groupContext="shape" transform="translate(0,-53.5469)"> + <title>Rectangle.57</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow6-24" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape7-27" v:mID="7" v:groupContext="shape" transform="translate(27,-53.5469)"> + <title>Rectangle.58</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow7-28" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape8-31" v:mID="8" v:groupContext="shape" transform="translate(54,-53.5469)"> + <title>Rectangle.59</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow8-32" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape9-35" v:mID="9" v:groupContext="shape" transform="translate(5.625,-72.6719)"> + <title>Sheet.9</title> + <desc>BF-1</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="36" cy="211.5" width="72" height="27"/> + <rect x="0" y="198" width="72" height="27" class="st8"/> + <text x="23.29" y="215.7" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>BF-1</text> </g> + <g id="shape10-38" v:mID="10" v:groupContext="shape" transform="translate(128.25,-65.0781)"> + <title>Rectangle.74</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow10-39" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape11-42" v:mID="11" v:groupContext="shape" transform="translate(155.25,-65.0781)"> + <title>Rectangle.75</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow11-43" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape12-46" v:mID="12" v:groupContext="shape" transform="translate(182.25,-65.0781)"> + <title>Rectangle.76</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow12-47" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape13-50" v:mID="13" v:groupContext="shape" transform="translate(128.25,-51.5781)"> + <title>Rectangle.77</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow13-51" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape14-54" v:mID="14" v:groupContext="shape" transform="translate(155.25,-51.5781)"> + <title>Rectangle.78</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow14-55" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape15-58" v:mID="15" v:groupContext="shape" transform="translate(182.25,-51.5781)"> + <title>Rectangle.79</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow15-59" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape16-62" v:mID="16" v:groupContext="shape" transform="translate(301.5,-65.0781)"> + <title>Rectangle.81</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow16-63" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape17-66" v:mID="17" v:groupContext="shape" transform="translate(328.5,-65.0781)"> + <title>Rectangle.82</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow17-67" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape18-70" v:mID="18" v:groupContext="shape" transform="translate(355.5,-65.0781)"> + <title>Rectangle.83</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow18-71" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape19-74" v:mID="19" v:groupContext="shape" transform="translate(301.5,-51.5781)"> + <title>Rectangle.84</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow19-75" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape20-78" v:mID="20" v:groupContext="shape" transform="translate(328.5,-51.5781)"> + <title>Rectangle.85</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow20-79" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape21-82" v:mID="21" v:groupContext="shape" transform="translate(355.5,-51.5781)"> + <title>Rectangle.86</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow21-83" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape22-86" v:mID="22" v:groupContext="shape" transform="translate(447.75,-65.6406)"> + <title>Rectangle.88</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow22-87" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape23-90" v:mID="23" v:groupContext="shape" transform="translate(474.75,-65.6406)"> + <title>Rectangle.89</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow23-91" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape24-94" v:mID="24" v:groupContext="shape" transform="translate(501.75,-65.6406)"> + <title>Rectangle.90</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow24-95" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape25-98" v:mID="25" v:groupContext="shape" transform="translate(447.75,-52.1406)"> + <title>Rectangle.91</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow25-99" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape26-102" v:mID="26" v:groupContext="shape" transform="translate(474.75,-52.1406)"> + <title>Rectangle.92</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow26-103" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape27-106" v:mID="27" v:groupContext="shape" transform="translate(501.75,-52.1406)"> + <title>Rectangle.93</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow27-107" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st5"> + <rect x="0" y="211.5" width="27" height="13.5" class="st6"/> + </g> + <rect x="0" y="211.5" width="27" height="13.5" class="st7"/> + </g> + <g id="shape28-110" v:mID="28" v:groupContext="shape" transform="translate(213.75,-63.9531)"> + <title>Sheet.28</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 225 L83.25 225" class="st10"/> + </g> + <g id="shape29-113" v:mID="29" v:groupContext="shape" transform="translate(387,-63.9531)"> + <title>Sheet.29</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 225 L54 225" class="st10"/> + </g> + <g id="group31-116" transform="translate(184.5,-113.172)" v:mID="31" v:groupContext="group"> + <title>Sheet.31</title> + <g id="shape32-117" v:mID="32" v:groupContext="shape" transform="translate(225,173.25) rotate(90)"> + <title>Block Arrow</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow32-118" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,1.9728,-0.3456)" class="st5"> + <path d="M0 225 L25.87 225 L51.75 177.75 L25.87 130.5 L0 130.5 L0 225 Z" class="st11"/> + </g> + <path d="M0 225 L25.87 225 L51.75 177.75 L25.87 130.5 L0 130.5 L0 225 Z" class="st12"/> + </g> + <g id="shape33-121" v:mID="33" v:groupContext="shape" transform="translate(2.25,-24.3529)"> + <title>Sheet.33</title> + <desc>h1, h2 .. hk</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="45" cy="215.868" width="90" height="18.2647"/> + <rect x="0" y="206.735" width="90" height="18.2647" class="st8"/> + <text x="17.56" y="219.47" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>h1, h2 .. hk</text> </g> + </g> + <g id="shape34-124" v:mID="34" v:groupContext="shape" transform="translate(307.011,286.73) rotate(152.323)"> + <title>Sheet.34</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 225 L128.85 225" class="st3"/> + </g> + <g id="shape35-129" v:mID="35" v:groupContext="shape" transform="translate(433.272,125.452) rotate(99.7172)"> + <title>Sheet.35</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 225 L58.31 225" class="st3"/> + </g> + <g id="shape36-134" v:mID="36" v:groupContext="shape" transform="translate(407.724,-64.1459) rotate(45)"> + <title>Sheet.36</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 225 L79.16 225" class="st3"/> + </g> + <g id="shape37-139" v:mID="37" v:groupContext="shape" transform="translate(320.441,-127.12) rotate(15.6155)"> + <title>Sheet.37</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 225 L200.75 225" class="st3"/> + </g> + <g id="shape38-144" v:mID="38" v:groupContext="shape" transform="translate(132.75,-75.2588)"> + <title>Sheet.38</title> + <desc>BF-2</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="36" cy="211.5" width="72" height="27"/> + <rect x="0" y="198" width="72" height="27" class="st8"/> + <text x="23.29" y="215.7" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>BF-2</text> </g> + <g id="shape39-147" v:mID="39" v:groupContext="shape" transform="translate(303.75,-70.7588)"> + <title>Sheet.39</title> + <desc>BF-X</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="36" cy="211.5" width="72" height="27"/> + <rect x="0" y="198" width="72" height="27" class="st8"/> + <text x="23.2" y="215.7" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>BF-X</text> </g> + <g id="shape40-150" v:mID="40" v:groupContext="shape" transform="translate(447.75,-75.2588)"> + <title>Sheet.40</title> + <desc>BF-L</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="36" cy="211.5" width="72" height="27"/> + <rect x="0" y="198" width="72" height="27" class="st8"/> + <text x="23.89" y="215.7" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>BF-L</text> </g> + <g id="shape41-153" v:mID="41" v:groupContext="shape" transform="translate(300.375,-117)"> + <title>Sheet.41</title> + <desc>Hashing for lookup/Insertion into a vector of BFs happens once</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="90" cy="202.5" width="180" height="45"/> + <rect x="0" y="180" width="180" height="45" class="st8"/> + <text x="4.6" y="198.9" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Hashing for lookup/Insertion into a <tspan + x="23.06" dy="1.2em" class="st15">vector of BFs happens once</tspan></text> </g> + <g id="shape44-157" v:mID="44" v:groupContext="shape" transform="translate(249.698,-151.505) rotate(-3.74012)"> + <title>Sheet.44</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M-0 225 A93.4958 45.6256 42.23 0 1 79.38 221.66 L79.68 221.85" class="st16"/> + </g> + <g id="shape45-163" v:mID="45" v:groupContext="shape" transform="translate(30.375,0.25)"> + <title>Sheet.45</title> + <desc>Lookup/Insertion is done in the series of BFs, one by one or ...</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="233.048" cy="202.5" width="466.1" height="45"/> + <rect x="0" y="180" width="466.096" height="45" class="st8"/> + <text x="4.34" y="206.1" class="st14" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Lookup/Insertion is done in the series of BFs, one by one or can be optimized to do in parallel. </text> </g> + <g id="shape46-166" v:mID="46" v:groupContext="shape" transform="translate(123.252,-43.6868) rotate(17.0249)"> + <title>Sheet.46</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M-0 225 A88.2185 43.0621 47.63 0 1 70.31 221.39 L70.6 221.6" class="st16"/> + </g> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/member_i5.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i5.svg new file mode 100644 index 000000000..c1728cf24 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i5.svg @@ -0,0 +1,163 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> +<!-- Generated by Microsoft Visio 11.0, SVG Export, v1.0 memship_i5.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="5.30481in" height="1.96146in" + viewBox="0 0 381.946 141.225" xml:space="preserve" color-interpolation-filters="sRGB" class="st15"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;stroke:#5b9bd5;stroke-opacity:0.22;stroke-width:0.25} + .st3 {fill:#5b9bd5;stroke:#c8c8c8;stroke-width:0.25} + .st4 {fill:none;stroke:none;stroke-width:0.25} + .st5 {fill:#ffffff;font-family:Calibri;font-size:1.16666em;font-weight:bold} + .st6 {marker-end:url(#mrkr5-14);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st7 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.28409090909091} + .st8 {fill:#5b9bd5;font-family:Calibri;font-size:0.833336em} + .st9 {fill:#5b9bd5;font-family:Calibri;font-size:0.75em} + .st10 {stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st11 {marker-end:url(#mrkr5-63);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st12 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.22935779816514} + .st13 {fill:#000000;font-family:Calibri;font-size:1.00001em} + .st14 {font-size:1em} + .st15 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-14" class="st7" v:arrowType="5" v:arrowSize="2" v:setback="6.16" refX="-6.16" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-3.52,-3.52) "/> + </marker> + <marker id="mrkr5-63" class="st12" v:arrowType="5" v:arrowSize="2" v:setback="7.15" refX="-7.15" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-4.36,-4.36) "/> + </marker> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="group1-1" transform="translate(191.995,-19.4751)" v:mID="1" v:groupContext="group"> + <title>Sheet.1</title> + <g id="shape2-2" v:mID="2" v:groupContext="shape" transform="translate(146.944,42.2251) rotate(90)"> + <title>Triangle</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow2-3" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,1.9728,-0.3456)" class="st1"> + <path d="M99 141.23 L49.5 58.62 L0 141.23 L99 141.23 Z" class="st2"/> + </g> + <path d="M99 141.23 L49.5 58.62 L0 141.23 L99 141.23 Z" class="st3"/> + </g> + <g id="shape3-6" v:mID="3" v:groupContext="shape" transform="translate(0,-34.65)"> + <title>Sheet.3</title> + <desc>vBF</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="38.1251" cy="126.375" width="76.26" height="29.7"/> + <rect x="0" y="111.525" width="76.2502" height="29.7" class="st4"/> + <text x="27.68" y="130.58" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>vBF </text> </g> + </g> + <g id="shape4-9" v:mID="4" v:groupContext="shape" transform="translate(126.724,-100.475)"> + <title>Sheet.4</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 141.23 L64.83 141.23" class="st6"/> + </g> + <g id="shape5-15" v:mID="5" v:groupContext="shape" transform="translate(103.5,-101.775)"> + <title>Sheet.5</title> + <desc>Flow Key</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="39.9122" cy="135.863" width="79.83" height="10.7251"/> + <rect x="0" y="130.5" width="79.8244" height="10.7251" class="st4"/> + <text x="21.78" y="138.86" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Flow Key</text> </g> + <g id="shape6-18" v:mID="6" v:groupContext="shape" transform="translate(221.726,-56.2468) rotate(-24.5123)"> + <title>Sheet.6</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 141.23 L65.42 141.23" class="st6"/> + </g> + <g id="shape7-23" v:mID="7" v:groupContext="shape" transform="translate(280.318,-68.9751)"> + <title>Sheet.7</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 141.23 L64.83 141.23" class="st6"/> + </g> + <g id="shape8-28" v:mID="8" v:groupContext="shape" transform="translate(338.125,-56.6022) rotate(24.1625)"> + <title>Sheet.8</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 141.23 L70.8 141.23" class="st6"/> + </g> + <g id="shape9-33" v:mID="9" v:groupContext="shape" transform="translate(197.714,217.975) rotate(180)"> + <title>Sheet.9</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 141.23 L51.03 141.23" class="st6"/> + </g> + <g id="shape10-38" v:mID="10" v:groupContext="shape" transform="translate(18,-67.5)"> + <title>Sheet.10</title> + <desc>New Flow => New Assignment</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="80.4201" cy="134.475" width="160.85" height="13.5"/> + <rect x="0" y="127.725" width="160.84" height="13.5" class="st4"/> + <text x="25.11" y="137.18" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>New Flow => New Assignment</text> </g> + <g id="shape11-41" v:mID="11" v:groupContext="shape" transform="translate(198.032,253.975) rotate(180)"> + <title>Sheet.11</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 141.23 L51.03 141.23" class="st6"/> + </g> + <g id="shape12-46" v:mID="12" v:groupContext="shape" transform="translate(0,-31.5)"> + <title>Sheet.12</title> + <desc>Old Flow => forward to specific thread</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="81" cy="136.725" width="162.01" height="9"/> + <rect x="0" y="132.225" width="162" height="9" class="st4"/> + <text x="11.04" y="139.43" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Old Flow => forward to specific thread</text> </g> + <g id="shape13-49" v:mID="13" v:groupContext="shape" transform="translate(494.552,22.75) rotate(90)"> + <title>Sheet.13</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 134.49 C3.18 142.89 7.57 142.28 11.25 138.99 C15.79 134.93 19.26 126.78 27 134.49" class="st10"/> + </g> + <g id="shape14-52" v:mID="14" v:groupContext="shape" transform="translate(494.552,58.75) rotate(90)"> + <title>Sheet.14</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 134.49 C3.18 142.89 7.57 142.28 11.25 138.99 C15.79 134.93 19.26 126.78 27 134.49" class="st10"/> + </g> + <g id="shape15-55" v:mID="15" v:groupContext="shape" transform="translate(494.552,94.75) rotate(90)"> + <title>Sheet.15</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 134.49 C3.18 142.89 7.57 142.28 11.25 138.99 C15.79 134.93 19.26 126.78 27 134.49" class="st10"/> + </g> + <g id="shape17-58" v:mID="17" v:groupContext="shape" transform="translate(348.769,-25.0593) rotate(44.5185)"> + <title>Sheet.17</title> + <path d="M-0 141.23 A35.1884 19.2595 167.75 0 1 42.43 138.27 L42.74 138.46" class="st11"/> + </g> + <g id="shape18-64" v:mID="18" v:groupContext="shape" transform="translate(222.188,-5.40005)"> + <title>Sheet.18</title> + <desc>A BF corresponding to each worker thread</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="59.0625" cy="127.725" width="118.13" height="27"/> + <rect x="0" y="114.225" width="118.125" height="27" class="st4"/> + <text x="5.14" y="124.13" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>A BF corresponding to <tspan + x="11.19" dy="1.2em" class="st14">each worker thread</tspan></text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/member_i6.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i6.svg new file mode 100644 index 000000000..265179f62 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i6.svg @@ -0,0 +1,332 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> +<!-- Generated by Microsoft Visio 11.0, SVG Export, v1.0 memship_i6.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="8in" height="3.625in" viewBox="0 0 576 261" + xml:space="preserve" color-interpolation-filters="sRGB" class="st16"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;stroke:#5b9bd5;stroke-opacity:0.22;stroke-width:0.25} + .st3 {fill:#5b9bd5;stroke:#c8c8c8;stroke-width:0.25} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.666664em;font-weight:bold} + .st5 {font-size:1em} + .st6 {fill:#70ad47;fill-opacity:0.5;stroke:#00b050;stroke-width:1.5} + .st7 {fill:none;stroke:none;stroke-width:0.25} + .st8 {fill:#00b050;font-family:Calibri;font-size:1.00001em} + .st9 {fill:none;stroke:#ff0000;stroke-width:0.25} + .st10 {fill:#5b9bd5;font-family:Calibri;font-size:0.833336em} + .st11 {marker-end:url(#mrkr5-29);stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.25} + .st12 {fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1;stroke-width:0.47169811320755} + .st13 {fill:#5b9bd5;font-family:Calibri;font-size:0.75em} + .st14 {fill:#92d050;stroke:#c8c8c8;stroke-width:0.25} + .st15 {fill:#5b9bd5;font-family:Calibri;font-size:1.00001em;font-weight:bold} + .st16 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-29" class="st12" v:arrowType="5" v:arrowSize="2" v:setback="3.71" refX="-3.71" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-2.12,-2.12) "/> + </marker> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="group121-1" transform="translate(21.0294,-9.8478)" v:mID="121" v:groupContext="group"> + <title>Sheet.121</title> + <g id="shape49-2" v:mID="49" v:groupContext="shape" transform="translate(396.989,-54.9268)"> + <title>Rectangle.2</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow49-3" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="219.549" width="99.4817" height="41.4507" class="st2"/> + </g> + <rect x="0" y="219.549" width="99.4817" height="41.4507" class="st3"/> + </g> + <g id="shape50-6" v:mID="50" v:groupContext="shape" transform="translate(248.261,-12.1936)"> + <title>Rectangle.4</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow50-7" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="178.099" width="99.4817" height="82.9014" class="st2"/> + </g> + <rect x="0" y="178.099" width="99.4817" height="82.9014" class="st3"/> + </g> + <g id="shape52-10" v:mID="52" v:groupContext="shape" transform="translate(6.07514E-013,-29.0155)"> + <title>Rectangle.10</title> + <desc>Signatures for target 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="49.7409" cy="225.767" width="99.49" height="70.4662"/> + <g id="shadow52-11" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="190.534" width="99.4817" height="70.4662" class="st2"/> + </g> + <rect x="0" y="190.534" width="99.4817" height="70.4662" class="st3"/> + <text x="26.54" y="223.37" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Signatures for<v:newlineChar/><tspan + x="36.73" dy="1.2em" class="st5">target </tspan>1</text> </g> + <g id="shape53-16" v:mID="53" v:groupContext="shape" transform="translate(239.971,-20.4837)"> + <title>Sheet.53</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <rect x="0" y="248.565" width="116.062" height="12.4352" class="st6"/> + </g> + <g id="shape54-18" v:mID="54" v:groupContext="shape" transform="translate(353.649,-19.9346)"> + <title>Sheet.54</title> + <desc>Match 1</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="33.1606" cy="254.782" width="66.33" height="12.4352"/> + <rect x="0" y="248.565" width="66.3211" height="12.4352" class="st7"/> + <text x="13.06" y="258.38" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Match 1</text> </g> + <g id="shape55-21" v:mID="55" v:groupContext="shape" transform="translate(216.989,-210.652)"> + <title>Sheet.55</title> + <desc>Packet Payload</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="49.7409" cy="252.71" width="99.49" height="16.5803"/> + <rect x="0" y="244.42" width="99.4817" height="16.5803" class="st9"/> + <text x="19.04" y="255.71" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Packet Payload</text> </g> + <g id="shape56-24" v:mID="56" v:groupContext="shape" transform="translate(526.665,52.2365) rotate(90)"> + <title>Sheet.56</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 261 L16.52 261" class="st11"/> + </g> + <g id="shape96-30" v:mID="96" v:groupContext="shape" transform="translate(-3.0294,-95.7818)"> + <title>Sheet.96</title> + <desc>Attack Signature Length 1</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="51.75" cy="248.565" width="103.5" height="24.8704"/> + <rect x="0" y="236.13" width="103.5" height="24.8704" class="st7"/> + <text x="4.79" y="251.26" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Attack Signature Length 1</text> </g> + <g id="group114-33" transform="translate(228.359,-134.152)" v:mID="114" v:groupContext="group"> + <title>Sheet.114</title> + <g id="group106-34" transform="translate(0,-24.8704)" v:mID="106" v:groupContext="group"> + <title>Sheet.106</title> + <g id="shape100-35" v:mID="100" v:groupContext="shape" transform="translate(3.65707E-013,-12.4352)"> + <title>Rectangle.100</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow100-36" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st2"/> + </g> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st3"/> + </g> + <g id="shape101-39" v:mID="101" v:groupContext="shape" transform="translate(24.8704,-12.4352)"> + <title>Rectangle.101</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow101-40" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st2"/> + </g> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st3"/> + </g> + <g id="shape102-43" v:mID="102" v:groupContext="shape" transform="translate(49.7409,-12.4352)"> + <title>Rectangle.102</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow102-44" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st2"/> + </g> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st3"/> + </g> + <g id="shape103-47" v:mID="103" v:groupContext="shape"> + <title>Rectangle.103</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow103-48" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st2"/> + </g> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st3"/> + </g> + <g id="shape104-51" v:mID="104" v:groupContext="shape" transform="translate(24.8704,1.13687E-013)"> + <title>Rectangle.104</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow104-52" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st2"/> + </g> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st3"/> + </g> + <g id="shape105-55" v:mID="105" v:groupContext="shape" transform="translate(49.7409,1.13687E-013)"> + <title>Rectangle.105</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow105-56" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st2"/> + </g> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st3"/> + </g> + </g> + <g id="group107-59" v:mID="107" v:groupContext="group"> + <title>Sheet.107</title> + <g id="shape108-60" v:mID="108" v:groupContext="shape" transform="translate(3.65707E-013,-12.4352)"> + <title>Rectangle.100</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow108-61" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st2"/> + </g> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st3"/> + </g> + <g id="shape109-64" v:mID="109" v:groupContext="shape" transform="translate(24.8704,-12.4352)"> + <title>Rectangle.101</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow109-65" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st2"/> + </g> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st3"/> + </g> + <g id="shape110-68" v:mID="110" v:groupContext="shape" transform="translate(49.7409,-12.4352)"> + <title>Rectangle.102</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow110-69" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st2"/> + </g> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st3"/> + </g> + <g id="shape111-72" v:mID="111" v:groupContext="shape"> + <title>Rectangle.103</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <g id="shadow111-73" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st2"/> + </g> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st14"/> + </g> + <g id="shape112-76" v:mID="112" v:groupContext="shape" transform="translate(24.8704,1.13687E-013)"> + <title>Rectangle.104</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow112-77" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st2"/> + </g> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st3"/> + </g> + <g id="shape113-80" v:mID="113" v:groupContext="shape" transform="translate(49.7409,1.13687E-013)"> + <title>Rectangle.105</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <g id="shadow113-81" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st2"/> + </g> + <rect x="0" y="248.565" width="24.8704" height="12.4352" class="st14"/> + </g> + </g> + </g> + <g id="shape89-84" v:mID="89" v:groupContext="shape" transform="translate(398.644,-116.927) rotate(24.4696)"> + <title>Sheet.89</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 261 L143.75 261" class="st11"/> + </g> + <g id="shape115-89" v:mID="115" v:groupContext="shape" transform="translate(116.062,-1.19371E-012)"> + <title>Rectangle.115</title> + <desc>Signatures for target 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="49.7409" cy="211.259" width="99.49" height="99.4817"/> + <g id="shadow115-90" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="161.518" width="99.4817" height="99.4817" class="st2"/> + </g> + <rect x="0" y="161.518" width="99.4817" height="99.4817" class="st3"/> + <text x="26.54" y="208.86" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Signatures for<v:newlineChar/><tspan + x="36.73" dy="1.2em" class="st5">target </tspan>2</text> </g> + <g id="shape116-95" v:mID="116" v:groupContext="shape" transform="translate(117.989,-95.7818)"> + <title>Sheet.116</title> + <desc>Attack Signature Length 2</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="51.9909" cy="248.565" width="103.99" height="24.8704"/> + <rect x="0" y="236.13" width="103.982" height="24.8704" class="st7"/> + <text x="5.03" y="251.26" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Attack Signature Length 2</text> </g> + <g id="shape118-98" v:mID="118" v:groupContext="shape" transform="translate(392.971,-90.217)"> + <title>Sheet.118</title> + <desc>Attack Signature Length L</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="248.565" width="108" height="24.8704"/> + <rect x="0" y="236.13" width="108" height="24.8704" class="st7"/> + <text x="7.43" y="251.26" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Attack Signature Length L</text> </g> + <g id="shape119-101" v:mID="119" v:groupContext="shape" transform="translate(384.909,-64.9346)"> + <title>Sheet.119</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <rect x="0" y="248.565" width="116.062" height="12.4352" class="st6"/> + </g> + <g id="shape120-103" v:mID="120" v:groupContext="shape" transform="translate(491.971,-64.9346)"> + <title>Sheet.120</title> + <desc>Match 2</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="33.1606" cy="254.782" width="66.33" height="12.4352"/> + <rect x="0" y="248.565" width="66.3211" height="12.4352" class="st7"/> + <text x="13.06" y="258.38" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Match 2</text> </g> + <g id="shape85-106" v:mID="85" v:groupContext="shape" transform="translate(478.538,12.9307) rotate(65.6291)"> + <title>Sheet.85</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 261 L109.61 261" class="st11"/> + </g> + <g id="shape117-111" v:mID="117" v:groupContext="shape" transform="translate(247.054,-91.2818)"> + <title>Sheet.117</title> + <desc>Attack Signature Length X</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="52.7082" cy="248.565" width="105.42" height="24.8704"/> + <rect x="0" y="236.13" width="105.416" height="24.8704" class="st7"/> + <text x="5.7" y="251.26" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Attack Signature Length X</text> </g> + </g> + <g id="shape122-114" v:mID="122" v:groupContext="shape" transform="translate(315.114,-164.13)"> + <title>Sheet.122</title> + <desc>HTSS</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="26.943" cy="248.565" width="53.89" height="24.8704"/> + <rect x="0" y="236.13" width="53.8859" height="24.8704" class="st7"/> + <text x="14.52" y="252.16" class="st15" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>HTSS</text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/member_i7.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i7.svg new file mode 100644 index 000000000..e23ae26cb --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/member_i7.svg @@ -0,0 +1,399 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> +<!-- Generated by Microsoft Visio 11.0, SVG Export, v1.0 memship_i7.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="8.5in" height="4.5in" viewBox="0 0 612 324" + xml:space="preserve" color-interpolation-filters="sRGB" class="st23"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;stroke:#5b9bd5;stroke-opacity:0.22;stroke-width:0.25} + .st3 {fill:#5b9bd5;stroke:#c8c8c8;stroke-width:0.25} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em;font-weight:bold} + .st5 {font-size:1em} + .st6 {fill:#70ad47;fill-opacity:0.5;stroke:#00b050;stroke-width:1.5} + .st7 {fill:none;stroke:none;stroke-width:0.25} + .st8 {fill:#00b050;font-family:Calibri;font-size:1.16666em} + .st9 {fill:none;stroke:#00b050;stroke-width:2.25} + .st10 {fill:#5b9bd5;font-family:Calibri;font-size:0.833336em} + .st11 {fill:#5b9bd5;font-family:Calibri;font-size:1.16666em} + .st12 {fill:#a8d08d;stroke:#c8c8c8;stroke-width:0.25} + .st13 {marker-end:url(#mrkr5-83);stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.25} + .st14 {fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1;stroke-width:0.47169811320755} + .st15 {marker-end:url(#mrkr5-95);stroke:#92d050;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.25} + .st16 {fill:#92d050;fill-opacity:1;stroke:#92d050;stroke-opacity:1;stroke-width:0.47169811320755} + .st17 {fill:#00b050;font-family:Calibri;font-size:1.00001em;font-weight:bold} + .st18 {fill:#5b9bd5;font-family:Calibri;font-size:1.00001em} + .st19 {fill:none;stroke:#ff0000;stroke-width:2.25} + .st20 {fill:#ff0000;font-family:Calibri;font-size:1.00001em;font-weight:bold} + .st21 {marker-end:url(#mrkr5-123);stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st22 {fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1;stroke-width:0.28409090909091} + .st23 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-83" class="st14" v:arrowType="5" v:arrowSize="2" v:setback="3.71" refX="-3.71" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-2.12,-2.12) "/> + </marker> + <marker id="mrkr5-95" class="st16" v:arrowType="5" v:arrowSize="2" v:setback="3.71" refX="-3.71" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-2.12,-2.12) "/> + </marker> + <marker id="mrkr5-123" class="st22" v:arrowType="5" v:arrowSize="2" v:setback="5.8" refX="-5.8" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-3.52,-3.52) "/> + </marker> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <g id="group121-1" transform="translate(21.0294,-32.2733)" v:mID="121" v:groupContext="group"> + <title>Sheet.121</title> + <g id="shape49-2" v:mID="49" v:groupContext="shape" transform="translate(460.471,-62.2267)"> + <title>Rectangle.2</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow49-3" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="279" width="108" height="45" class="st2"/> + </g> + <rect x="0" y="279" width="108" height="45" class="st3"/> + </g> + <g id="shape50-6" v:mID="50" v:groupContext="shape" transform="translate(320.452,-18.123)"> + <title>Rectangle.4</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow50-7" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="234" width="108" height="90" class="st2"/> + </g> + <rect x="0" y="234" width="108" height="90" class="st3"/> + </g> + <g id="shape52-10" v:mID="52" v:groupContext="shape" transform="translate(0,-31.5)"> + <title>Rectangle.10</title> + <desc>Flow Keys Matching Mask 1</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="285.75" width="108" height="76.5"/> + <g id="shadow52-11" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="247.5" width="108" height="76.5" class="st2"/> + </g> + <rect x="0" y="247.5" width="108" height="76.5" class="st3"/> + <text x="12.56" y="282.75" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Flow Keys Matching <tspan + x="39.1" dy="1.2em" class="st5">Mask </tspan>1</text> </g> + <g id="shape53-16" v:mID="53" v:groupContext="shape" transform="translate(311.452,-27.123)"> + <title>Sheet.53</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <rect x="0" y="310.5" width="126" height="13.5" class="st6"/> + </g> + <g id="shape54-18" v:mID="54" v:groupContext="shape" transform="translate(424.471,-26.2267)"> + <title>Sheet.54</title> + <desc>Match</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="36" cy="317.25" width="72" height="13.5"/> + <rect x="0" y="310.5" width="72" height="13.5" class="st7"/> + <text x="17.68" y="321.45" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Match</text> </g> + <g id="shape55-21" v:mID="55" v:groupContext="shape" transform="translate(261,-247.163)"> + <title>Sheet.55</title> + <desc>Flow ID1</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="27.1728" cy="315" width="54.35" height="18"/> + <rect x="0" y="306" width="54.3456" height="18" class="st9"/> + <text x="9.52" y="318" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Flow ID1</text> </g> + <g id="shape96-24" v:mID="96" v:groupContext="shape" transform="translate(0,-109.783)"> + <title>Sheet.96</title> + <desc>Flow Mask 1</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="319.5" width="108" height="9"/> + <rect x="0" y="315" width="108" height="9" class="st7"/> + <text x="18.51" y="323.7" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Flow Mask 1</text> </g> + <g id="group114-27" transform="translate(247.5,-163.783)" v:mID="114" v:groupContext="group"> + <title>Sheet.114</title> + <g id="group106-28" transform="translate(0,-27)" v:mID="106" v:groupContext="group"> + <title>Sheet.106</title> + <g id="shape100-29" v:mID="100" v:groupContext="shape" transform="translate(0,-13.5)"> + <title>Rectangle.100</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow100-30" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="310.5" width="27" height="13.5" class="st2"/> + </g> + <rect x="0" y="310.5" width="27" height="13.5" class="st3"/> + </g> + <g id="shape101-33" v:mID="101" v:groupContext="shape" transform="translate(27,-13.5)"> + <title>Rectangle.101</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow101-34" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="310.5" width="27" height="13.5" class="st2"/> + </g> + <rect x="0" y="310.5" width="27" height="13.5" class="st3"/> + </g> + <g id="shape102-37" v:mID="102" v:groupContext="shape" transform="translate(54,-13.5)"> + <title>Rectangle.102</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow102-38" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="310.5" width="27" height="13.5" class="st2"/> + </g> + <rect x="0" y="310.5" width="27" height="13.5" class="st3"/> + </g> + <g id="shape103-41" v:mID="103" v:groupContext="shape"> + <title>Rectangle.103</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow103-42" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="310.5" width="27" height="13.5" class="st2"/> + </g> + <rect x="0" y="310.5" width="27" height="13.5" class="st3"/> + </g> + <g id="shape104-45" v:mID="104" v:groupContext="shape" transform="translate(27,0)"> + <title>Rectangle.104</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow104-46" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="310.5" width="27" height="13.5" class="st2"/> + </g> + <rect x="0" y="310.5" width="27" height="13.5" class="st3"/> + </g> + <g id="shape105-49" v:mID="105" v:groupContext="shape" transform="translate(54,0)"> + <title>Rectangle.105</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow105-50" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="310.5" width="27" height="13.5" class="st2"/> + </g> + <rect x="0" y="310.5" width="27" height="13.5" class="st3"/> + </g> + </g> + <g id="group107-53" v:mID="107" v:groupContext="group"> + <title>Sheet.107</title> + <g id="shape108-54" v:mID="108" v:groupContext="shape" transform="translate(0,-13.5)"> + <title>Rectangle.100</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow108-55" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="310.5" width="27" height="13.5" class="st2"/> + </g> + <rect x="0" y="310.5" width="27" height="13.5" class="st3"/> + </g> + <g id="shape109-58" v:mID="109" v:groupContext="shape" transform="translate(27,-13.5)"> + <title>Rectangle.101</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow109-59" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="310.5" width="27" height="13.5" class="st2"/> + </g> + <rect x="0" y="310.5" width="27" height="13.5" class="st3"/> + </g> + <g id="shape110-62" v:mID="110" v:groupContext="shape" transform="translate(54,-13.5)"> + <title>Rectangle.102</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <g id="shadow110-63" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="310.5" width="27" height="13.5" class="st2"/> + </g> + <rect x="0" y="310.5" width="27" height="13.5" class="st12"/> + </g> + <g id="shape111-66" v:mID="111" v:groupContext="shape"> + <title>Rectangle.103</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <g id="shadow111-67" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="310.5" width="27" height="13.5" class="st2"/> + </g> + <rect x="0" y="310.5" width="27" height="13.5" class="st3"/> + </g> + <g id="shape112-70" v:mID="112" v:groupContext="shape" transform="translate(27,0)"> + <title>Rectangle.104</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <g id="shadow112-71" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="310.5" width="27" height="13.5" class="st2"/> + </g> + <rect x="0" y="310.5" width="27" height="13.5" class="st3"/> + </g> + <g id="shape113-74" v:mID="113" v:groupContext="shape" transform="translate(54,0)"> + <title>Rectangle.105</title> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <g id="shadow113-75" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" + v:shadowType="1" transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="310.5" width="27" height="13.5" class="st2"/> + </g> + <rect x="0" y="310.5" width="27" height="13.5" class="st3"/> + </g> + </g> + </g> + <g id="shape89-78" v:mID="89" v:groupContext="shape" transform="translate(413.723,393.802) rotate(146.31)"> + <title>Sheet.89</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 324 L153.9 324" class="st13"/> + </g> + <g id="shape115-84" v:mID="115" v:groupContext="shape" transform="translate(126,0)"> + <title>Rectangle.115</title> + <desc>Flow Keys Matching Mask 2</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="270" width="108" height="108"/> + <g id="shadow115-85" v:groupContext="shadow" v:shadowOffsetX="0.3456" v:shadowOffsetY="-1.9728" v:shadowType="1" + transform="matrix(1,0,0,1,0.3456,1.9728)" class="st1"> + <rect x="0" y="216" width="108" height="108" class="st2"/> + </g> + <rect x="0" y="216" width="108" height="108" class="st3"/> + <text x="12.56" y="267" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Flow Keys Matching <tspan + x="39.1" dy="1.2em" class="st5">Mask </tspan>2</text> </g> + <g id="shape85-90" v:mID="85" v:groupContext="shape" transform="translate(635.321,91.2793) rotate(81.3573)"> + <title>Sheet.85</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 324 L143.93 324" class="st15"/> + </g> + <g id="shape56-96" v:mID="56" v:groupContext="shape" transform="translate(579.175,-64.556) rotate(64.1257)"> + <title>Sheet.56</title> + <path d="M0 324 L54.31 324" class="st15"/> + </g> + </g> + <g id="shape122-101" v:mID="122" v:groupContext="shape" transform="translate(351,-213.444)"> + <title>Sheet.122</title> + <desc>HTSS with False Negative (Cache)</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="45" cy="304.722" width="90" height="38.556"/> + <rect x="0" y="285.444" width="90" height="38.556" class="st7"/> + <text x="13.29" y="301.72" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>HTSS with False <tspan + x="10.52" dy="1.2em" class="st5">Negative </tspan>(Cache)</text> </g> + <g id="shape123-105" v:mID="123" v:groupContext="shape" transform="translate(287.654,-290.556)"> + <title>Sheet.123</title> + <desc>Active</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="24.1875" cy="310.5" width="48.38" height="27"/> + <rect x="0" y="297" width="48.375" height="27" class="st7"/> + <text x="8.63" y="314.1" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Active</text> </g> + <g id="shape124-108" v:mID="124" v:groupContext="shape" transform="translate(278.827,-153)"> + <title>Sheet.124</title> + <desc>Target for Flow ID 1</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="36.0864" cy="310.5" width="72.18" height="27"/> + <rect x="0" y="297" width="72.1728" height="27" class="st9"/> + <text x="11.93" y="306.9" class="st18" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Target for <tspan + x="13.54" dy="1.2em" class="st5">Flow ID </tspan>1</text> </g> + <g id="shape125-112" v:mID="125" v:groupContext="shape" transform="translate(155.857,-254.556)"> + <title>Sheet.125</title> + <desc>Flow ID2</desc> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="27.1728" cy="315" width="54.35" height="18"/> + <rect x="0" y="306" width="54.3456" height="18" class="st19"/> + <text x="9.52" y="318" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Flow ID2</text> </g> + <g id="shape126-115" v:mID="126" v:groupContext="shape" transform="translate(153,-270)"> + <title>Sheet.126</title> + <desc>New/Inactive</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="40.5" cy="310.5" width="81" height="27"/> + <rect x="0" y="297" width="81" height="27" class="st7"/> + <text x="6.77" y="314.1" class="st20" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>New/Inactive</text> </g> + <g id="shape127-118" v:mID="127" v:groupContext="shape" transform="translate(251.739,-239.709) rotate(14.0795)"> + <title>Sheet.127</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 318.73 A39.2404 18 -180 0 0 49.73 320.91 L50.07 320.78" class="st21"/> + </g> + <g id="shape128-124" v:mID="128" v:groupContext="shape" transform="translate(219.24,-229.5)"> + <title>Sheet.128</title> + <desc>Miss</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="20.88" cy="310.5" width="41.76" height="27"/> + <rect x="0" y="297" width="41.76" height="27" class="st7"/> + <text x="7.81" y="314.7" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Miss</text> </g> + <g id="shape129-127" v:mID="129" v:groupContext="shape" transform="translate(147.029,-142.056)"> + <title>Sheet.129</title> + <desc>Flow Mask 2</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="319.5" width="108" height="9"/> + <rect x="0" y="315" width="108" height="9" class="st7"/> + <text x="18.51" y="323.7" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Flow Mask 2</text> </g> + <g id="shape130-130" v:mID="130" v:groupContext="shape" transform="translate(166.845,-18.5004) rotate(18.2325)"> + <title>Sheet.130</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 293.46 A71.1913 104.269 -180 0 0 97.04 298.43 L97.25 298.14" class="st21"/> + </g> + <g id="shape131-135" v:mID="131" v:groupContext="shape" transform="translate(184.406,-3.04505) rotate(-3.24734)"> + <title>Sheet.131</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 293.46 A112.345 104.269 -180 0 0 154.25 297.52 L154.52 297.28" class="st21"/> + </g> + <g id="shape132-140" v:mID="132" v:groupContext="shape" transform="translate(301.368,16.888) rotate(-25.868)"> + <title>Sheet.132</title> + <v:userDefs> + <v:ud v:nameU="msvThemeColors" v:val="VT0(254):26"/> + </v:userDefs> + <path d="M0 293.46 A83.375 104.269 -180 0 0 113.91 298.14 L114.14 297.87" class="st21"/> + </g> + <g id="shape133-145" v:mID="133" v:groupContext="shape" transform="translate(345.029,-142.056)"> + <title>Sheet.133</title> + <desc>Flow Mask X</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="319.5" width="108" height="9"/> + <rect x="0" y="315" width="108" height="9" class="st7"/> + <text x="18.43" y="323.7" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Flow Mask X</text> </g> + <g id="shape134-148" v:mID="134" v:groupContext="shape" transform="translate(481.5,-139.5)"> + <title>Sheet.134</title> + <desc>Flow Mask L</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="54" cy="319.5" width="108" height="9"/> + <rect x="0" y="315" width="108" height="9" class="st7"/> + <text x="19.12" y="323.7" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Flow Mask L</text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/memory-management.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/memory-management.svg new file mode 100644 index 000000000..f2ad310fb --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/memory-management.svg @@ -0,0 +1,2133 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="717.5954" + height="165.08948" + id="svg2" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="memory-management.svg" + inkscape:export-filename="/home/matz/rapports/doc/intel/memory-management.png" + inkscape:export-xdpi="112.90476" + inkscape:export-ydpi="112.90476"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path4669" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + id="path4672" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4666" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective10" /> + <inkscape:perspective + id="perspective3600" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-10" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-76" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-45" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-47" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-43" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-78" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-14" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-068" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-50" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-71" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3824-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4093" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4288" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4288-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4344" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4369" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4394" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4394-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4394-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4441" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4441-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4441-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4441-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4441-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4441-80" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4521" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4521-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4521-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4568" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4568-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4568-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4615" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4615-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4615-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5304" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-1" + style="overflow:visible"> + <path + id="path4672-1" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5338" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-0" + style="overflow:visible"> + <path + id="path4672-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5366" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5391" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-6" + style="overflow:visible"> + <path + id="path4672-9" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5711" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5800" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5970" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.49497475" + inkscape:cx="302.43951" + inkscape:cy="258.00849" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1059" + inkscape:window-x="672" + inkscape:window-y="41" + inkscape:window-maximized="0" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-9.3094651,-454.23034)"> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590" + width="28.148262" + height="14.074131" + x="79.394798" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-9" + width="28.148262" + height="14.074131" + x="107.54305" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-3" + width="28.148262" + height="14.074131" + x="135.6913" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-94" + width="28.148262" + height="14.074131" + x="163.83957" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-8" + width="28.148262" + height="14.074131" + x="191.98785" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-5" + width="28.148262" + height="14.074131" + x="220.13611" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-36" + width="28.148262" + height="14.074131" + x="248.28436" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-6" + width="28.148262" + height="14.074131" + x="276.43262" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-2" + width="28.148262" + height="14.074131" + x="304.5809" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-1" + width="28.148262" + height="14.074131" + x="332.72913" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-54" + width="28.148262" + height="14.074131" + x="360.87741" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-56" + width="28.148262" + height="14.074131" + x="389.02563" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-37" + width="28.148262" + height="14.074131" + x="417.17392" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-25" + width="28.148262" + height="14.074131" + x="445.32217" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-4" + width="28.148262" + height="14.074131" + x="473.47043" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-0" + width="28.148262" + height="14.074131" + x="501.61871" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-68" + width="28.148262" + height="14.074131" + x="529.76697" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-43" + width="28.148262" + height="14.074131" + x="557.91522" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-92" + width="28.148262" + height="14.074131" + x="586.06348" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-926" + width="28.148262" + height="14.074131" + x="614.21173" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-49" + width="28.148262" + height="14.074131" + x="642.35999" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-48" + width="28.148262" + height="14.074131" + x="670.50824" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-7" + width="28.148262" + height="14.074131" + x="698.65656" + y="499.4122" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-67" + width="28.148262" + height="14.074131" + x="79.394798" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-9-3" + width="28.148262" + height="14.074131" + x="107.54305" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-3-6" + width="28.148262" + height="14.074131" + x="135.6913" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-94-5" + width="28.148262" + height="14.074131" + x="163.83957" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-8-6" + width="28.148262" + height="14.074131" + x="191.98785" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-5-3" + width="28.148262" + height="14.074131" + x="220.13611" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-36-9" + width="28.148262" + height="14.074131" + x="248.28438" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-6-4" + width="28.148262" + height="14.074131" + x="276.43262" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-2-8" + width="28.148262" + height="14.074131" + x="304.58087" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-1-1" + width="28.148262" + height="14.074131" + x="332.72913" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-54-2" + width="28.148262" + height="14.074131" + x="360.87741" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-56-9" + width="28.148262" + height="14.074131" + x="389.02563" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-37-3" + width="28.148262" + height="14.074131" + x="417.17392" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-25-9" + width="28.148262" + height="14.074131" + x="445.32217" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-4-0" + width="28.148262" + height="14.074131" + x="473.47043" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-0-8" + width="28.148262" + height="14.074131" + x="501.61871" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-68-8" + width="28.148262" + height="14.074131" + x="529.76697" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-43-5" + width="28.148262" + height="14.074131" + x="557.91522" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-92-0" + width="28.148262" + height="14.074131" + x="586.06348" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-926-9" + width="28.148262" + height="14.074131" + x="614.21173" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-49-6" + width="28.148262" + height="14.074131" + x="642.36005" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-48-3" + width="28.148262" + height="14.074131" + x="670.50824" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-7-8" + width="28.148262" + height="14.074131" + x="698.65656" + y="527.56073" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-61" + width="28.148262" + height="14.074131" + x="79.394798" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-9-1" + width="28.148262" + height="14.074131" + x="107.54305" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-3-5" + width="28.148262" + height="14.074131" + x="135.6913" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-94-9" + width="28.148262" + height="14.074131" + x="163.83955" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-8-8" + width="28.148262" + height="14.074131" + x="191.98784" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-5-4" + width="28.148262" + height="14.074131" + x="220.13609" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-36-8" + width="28.148262" + height="14.074131" + x="248.28436" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-6-1" + width="28.148262" + height="14.074131" + x="276.43262" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-2-0" + width="28.148262" + height="14.074131" + x="304.58087" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-1-3" + width="28.148262" + height="14.074131" + x="332.72916" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-54-0" + width="28.148262" + height="14.074131" + x="360.87744" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-56-4" + width="28.148262" + height="14.074131" + x="389.0257" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-37-4" + width="28.148262" + height="14.074131" + x="417.17395" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-25-4" + width="28.148262" + height="14.074131" + x="445.3222" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-4-4" + width="28.148262" + height="14.074131" + x="473.47046" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-0-7" + width="28.148262" + height="14.074131" + x="501.61874" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#460080;fill-opacity:1;stroke:none" + id="rect3590-68-6" + width="28.148262" + height="14.074131" + x="529.76697" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#460080;fill-opacity:1;stroke:none" + id="rect3590-43-3" + width="28.148262" + height="14.074131" + x="557.91528" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#460080;fill-opacity:1;stroke:none" + id="rect3590-92-1" + width="28.148262" + height="14.074131" + x="586.06354" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-926-7" + width="28.148262" + height="14.074131" + x="614.21173" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-49-5" + width="28.148262" + height="14.074131" + x="642.36005" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-48-9" + width="28.148262" + height="14.074131" + x="670.5083" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-7-6" + width="28.148262" + height="14.074131" + x="698.65662" + y="541.63495" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-17" + width="28.148262" + height="14.074131" + x="79.394798" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-9-8" + width="28.148262" + height="14.074131" + x="107.54305" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-3-57" + width="28.148262" + height="14.074131" + x="135.6913" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-94-4" + width="28.148262" + height="14.074131" + x="163.83957" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#ff6600;fill-opacity:1;stroke:none" + id="rect3590-8-1" + width="28.148262" + height="14.074131" + x="191.98785" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#ff6600;fill-opacity:1;stroke:none" + id="rect3590-5-8" + width="28.148262" + height="14.074131" + x="220.13611" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#ff7f2a;fill-opacity:1;stroke:none" + id="rect3590-36-5" + width="28.148262" + height="14.074131" + x="248.28436" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#ff7f2a;fill-opacity:1;stroke:none" + id="rect3590-6-9" + width="28.148262" + height="14.074131" + x="276.43262" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-2-7" + width="28.148262" + height="14.074131" + x="304.5809" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-1-5" + width="28.148262" + height="14.074131" + x="332.72913" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-54-3" + width="28.148262" + height="14.074131" + x="360.87741" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-56-8" + width="28.148262" + height="14.074131" + x="389.02563" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#ff6600;fill-opacity:1;stroke:none" + id="rect3590-37-8" + width="28.148262" + height="14.074131" + x="417.17392" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#ff6600;fill-opacity:1;stroke:none" + id="rect3590-25-3" + width="28.148262" + height="14.074131" + x="445.32217" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#ff7f2a;fill-opacity:1;stroke:none" + id="rect3590-4-1" + width="28.148262" + height="14.074131" + x="473.47043" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#ff7f2a;fill-opacity:1;stroke:none" + id="rect3590-0-89" + width="28.148262" + height="14.074131" + x="501.61871" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-68-64" + width="28.148262" + height="14.074131" + x="529.76697" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-43-33" + width="28.148262" + height="14.074131" + x="557.91522" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-92-3" + width="28.148262" + height="14.074131" + x="586.06348" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-926-8" + width="28.148262" + height="14.074131" + x="614.21173" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#ff6600;fill-opacity:1;stroke:none" + id="rect3590-49-60" + width="28.148262" + height="14.074131" + x="642.35999" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#ff6600;fill-opacity:1;stroke:none" + id="rect3590-48-4" + width="28.148262" + height="14.074131" + x="670.50824" + y="513.48645" + rx="0" + ry="0" /> + <rect + style="fill:#ff7f2a;fill-opacity:1;stroke:none" + id="rect3590-7-88" + width="28.148262" + height="14.074131" + x="698.65656" + y="513.48645" + rx="0" + ry="0" /> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="21.874378" + y="510.65295" + id="text4268"><tspan + sodipodi:role="line" + id="tspan4270" + x="21.874378" + y="510.65295">Channel</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="32.888912" + y="524.72711" + id="text4272"><tspan + sodipodi:role="line" + id="tspan4274" + x="32.888912" + y="524.72711">Rank</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="259.91074" + y="571.51569" + id="text4276"><tspan + sodipodi:role="line" + id="tspan4278" + x="259.91074" + y="571.51569">packet 1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="652.99866" + y="571.51569" + id="text4276-8"><tspan + sodipodi:role="line" + id="tspan4278-9" + x="652.99866" + y="571.51569">packet 2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="547.13672" + y="571.51569" + id="text4276-7"><tspan + sodipodi:role="line" + id="tspan4278-6" + x="547.13672" + y="571.51569">padding</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="89.185432" + y="510.95889" + id="text4316"><tspan + sodipodi:role="line" + x="89.185432" + y="510.95889" + id="tspan4320">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="117.94563" + y="510.96481" + id="text4324"><tspan + sodipodi:role="line" + id="tspan4326" + x="117.94563" + y="510.96481">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="144.69043" + y="510.95889" + id="text4316-4-0"><tspan + sodipodi:role="line" + x="144.69043" + y="510.95889" + id="tspan4320-3-9">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="539.98993" + y="510.95889" + id="text4316-4-5"><tspan + sodipodi:role="line" + x="539.98993" + y="510.95889" + id="tspan4320-3-4">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="596.89832" + y="510.95889" + id="text4316-4-59"><tspan + sodipodi:role="line" + x="596.89832" + y="510.95889" + id="tspan4320-3-46">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="176.40076" + y="510.96481" + id="text4324-0-9"><tspan + sodipodi:role="line" + id="tspan4326-3-2" + x="176.40076" + y="510.96481">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="569.27716" + y="510.96481" + id="text4324-0-4"><tspan + sodipodi:role="line" + id="tspan4326-3-7" + x="569.27716" + y="510.96481">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="623.10138" + y="510.96481" + id="text4324-0-5"><tspan + sodipodi:role="line" + id="tspan4326-3-4" + x="623.10138" + y="510.96481">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="157.73969" + y="524.70508" + id="text4324-0-1"><tspan + sodipodi:role="line" + id="tspan4326-3-28" + x="157.73969" + y="524.70508">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="384.15945" + y="524.70508" + id="text4324-0-3"><tspan + sodipodi:role="line" + id="tspan4326-3-6" + x="384.15945" + y="524.70508">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="610.57916" + y="524.70508" + id="text4324-0-2"><tspan + sodipodi:role="line" + id="tspan4326-3-1" + x="610.57916" + y="524.70508">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="101.2442" + y="524.69916" + id="text4316-4-05"><tspan + sodipodi:role="line" + x="101.2442" + y="524.69916" + id="tspan4320-3-1">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="327.66391" + y="524.69916" + id="text4316-4-08"><tspan + sodipodi:role="line" + x="327.66391" + y="524.69916" + id="tspan4320-3-5">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="554.08368" + y="524.69916" + id="text4316-4-6"><tspan + sodipodi:role="line" + x="554.08368" + y="524.69916" + id="tspan4320-3-462">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="214.6138" + y="524.78491" + id="text4328-5"><tspan + sodipodi:role="line" + id="tspan4330-8" + x="214.6138" + y="524.78491">2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="441.03354" + y="524.78491" + id="text4328-2"><tspan + sodipodi:role="line" + id="tspan4330-84" + x="441.03354" + y="524.78491">2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="667.45331" + y="524.78491" + id="text4328-24"><tspan + sodipodi:role="line" + id="tspan4330-0" + x="667.45331" + y="524.78491">2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="271.07971" + y="524.69916" + id="text4332-6"><tspan + sodipodi:role="line" + id="tspan4334-2" + x="271.07971" + y="524.69916">3</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="497.49942" + y="524.69916" + id="text4332-9"><tspan + sodipodi:role="line" + id="tspan4334-0" + x="497.49942" + y="524.69916">3</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="68.380196" + y="464.14713" + id="text4654"><tspan + sodipodi:role="line" + id="tspan4656" + x="68.380196" + y="464.14713">memory addresses</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.21153724px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="m 156.49649,467.20671 45.28198,0" + id="path4658" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="89.101906" + y="597.41931" + id="text4654-0"><tspan + sodipodi:role="line" + id="tspan4656-3" + x="89.101906" + y="597.41931">pkt1 starts at</tspan><tspan + sodipodi:role="line" + x="89.101906" + y="612.56354" + id="tspan5744">channel 0, rank 0</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.21153724px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="m 82.213202,605.82856 0,-45.28198" + id="path4658-4" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.21153724px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="m 617.27129,605.34276 0,-45.28198" + id="path4658-4-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="620.95221" + y="602.66766" + id="text4654-0-1"><tspan + sodipodi:role="line" + id="tspan4656-3-9" + x="620.95221" + y="602.66766">pkt2 starts at</tspan><tspan + sodipodi:role="line" + x="620.95221" + y="617.81189" + id="tspan5746">channel 1, rank 1</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.21153724px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" + d="m 419.80374,471.49015 23.86482,0" + id="path4658-3" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="392.08521" + y="463.53519" + id="text5607"><tspan + sodipodi:role="line" + id="tspan5609" + x="392.08521" + y="463.53519">64 bytes wide</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="87.961594" + y="493.51923" + id="text5611"><tspan + sodipodi:role="line" + id="tspan5613" + x="87.961594" + y="493.51923">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="116.77591" + y="493.52515" + id="text5615"><tspan + sodipodi:role="line" + id="tspan5617" + x="116.77591" + y="493.52515">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="145.37135" + y="493.60501" + id="text5619"><tspan + sodipodi:role="line" + id="tspan5621" + x="145.37135" + y="493.60501">2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="173.62958" + y="493.51923" + id="text5623"><tspan + sodipodi:role="line" + id="tspan5625" + x="173.62958" + y="493.51923">3</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="201.8405" + y="493.52515" + id="text5627"><tspan + sodipodi:role="line" + id="tspan5629" + x="201.8405" + y="493.52515">4</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="230.71991" + y="493.43936" + id="text5631"><tspan + sodipodi:role="line" + id="tspan5633" + x="230.71991" + y="493.43936">5</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="258.9249" + y="493.51923" + id="text5635"><tspan + sodipodi:role="line" + id="tspan5637" + x="258.9249" + y="493.51923">6</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="287.69778" + y="493.52515" + id="text5639"><tspan + sodipodi:role="line" + id="tspan5641" + x="287.69778" + y="493.52515">7</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="315.99152" + y="493.51923" + id="text5643"><tspan + sodipodi:role="line" + id="tspan5645" + x="315.99152" + y="493.51923">8</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="344.51596" + y="493.51923" + id="text5647"><tspan + sodipodi:role="line" + id="tspan5649" + x="344.51596" + y="493.51923">9</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="371.68573" + y="493.52515" + id="text5651"><tspan + sodipodi:role="line" + id="tspan5653" + x="371.68573" + y="493.52515">A</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="400.92007" + y="493.52515" + id="text5655"><tspan + sodipodi:role="line" + id="tspan5657" + x="400.92007" + y="493.52515">B</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="429.07181" + y="493.51923" + id="text5659"><tspan + sodipodi:role="line" + id="tspan5661" + x="429.07181" + y="493.51923">C</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="456.76215" + y="493.52515" + id="text5663"><tspan + sodipodi:role="line" + id="tspan5665" + x="456.76215" + y="493.52515">D</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="486.99628" + y="493.52515" + id="text5667"><tspan + sodipodi:role="line" + id="tspan5669" + x="486.99628" + y="493.52515">E</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="516.11224" + y="493.52515" + id="text5671"><tspan + sodipodi:role="line" + id="tspan5673" + x="516.11224" + y="493.52515">F</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="536.26007" + y="493.51923" + id="text5675"><tspan + sodipodi:role="line" + id="tspan5677" + x="536.26007" + y="493.51923">10</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="565.0744" + y="493.52515" + id="text5679"><tspan + sodipodi:role="line" + id="tspan5681" + x="565.0744" + y="493.52515">11</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="593.6698" + y="493.60501" + id="text5683"><tspan + sodipodi:role="line" + id="tspan5685" + x="593.6698" + y="493.60501">12</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="621.9281" + y="493.51923" + id="text5687"><tspan + sodipodi:role="line" + id="tspan5689" + x="621.9281" + y="493.51923">13</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="650.13898" + y="493.52515" + id="text5691"><tspan + sodipodi:role="line" + id="tspan5693" + x="650.13898" + y="493.52515">14</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="679.01837" + y="493.43936" + id="text5695"><tspan + sodipodi:role="line" + id="tspan5697" + x="679.01837" + y="493.43936">15</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="707.22339" + y="493.51923" + id="text5699"><tspan + sodipodi:role="line" + id="tspan5701" + x="707.22339" + y="493.51923">...</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="8.2204075" + y="492.55319" + id="text4268-3"><tspan + sodipodi:role="line" + id="tspan4270-8" + x="8.2204075" + y="492.55319">Block num</tspan></text> + <flowRoot + xml:space="preserve" + id="flowRoot5728" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"><flowRegion + id="flowRegion5730"><rect + id="rect5732" + width="110.6117" + height="25.253813" + x="314.66251" + y="435.66406" /></flowRegion><flowPara + id="flowPara5734" /></flowRoot> <flowRoot + xml:space="preserve" + id="flowRoot5736" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"><flowRegion + id="flowRegion5738"><rect + id="rect5740" + width="32.829956" + height="11.616755" + x="356.58386" + y="428.08792" /></flowRegion><flowPara + id="flowPara5742" /></flowRoot> <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="88.197639" + y="553.00208" + id="text5611-0"><tspan + sodipodi:role="line" + id="tspan5613-5" + x="88.197639" + y="553.00208">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="117.01196" + y="553.008" + id="text5615-6"><tspan + sodipodi:role="line" + id="tspan5617-6" + x="117.01196" + y="553.008">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="145.60741" + y="553.08783" + id="text5619-4"><tspan + sodipodi:role="line" + id="tspan5621-0" + x="145.60741" + y="553.08783">2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="173.86563" + y="553.00208" + id="text5623-0"><tspan + sodipodi:role="line" + id="tspan5625-4" + x="173.86563" + y="553.00208">3</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="202.07655" + y="553.008" + id="text5627-6"><tspan + sodipodi:role="line" + id="tspan5629-2" + x="202.07655" + y="553.008">4</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="230.95596" + y="552.92218" + id="text5631-6"><tspan + sodipodi:role="line" + id="tspan5633-7" + x="230.95596" + y="552.92218">5</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="259.16092" + y="553.00208" + id="text5635-5"><tspan + sodipodi:role="line" + id="tspan5637-6" + x="259.16092" + y="553.00208">6</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="287.93384" + y="553.008" + id="text5639-9"><tspan + sodipodi:role="line" + id="tspan5641-8" + x="287.93384" + y="553.008">7</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="316.22757" + y="553.00208" + id="text5643-7"><tspan + sodipodi:role="line" + id="tspan5645-2" + x="316.22757" + y="553.00208">8</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="344.75201" + y="553.00208" + id="text5647-8"><tspan + sodipodi:role="line" + id="tspan5649-2" + x="344.75201" + y="553.00208">9</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="371.92178" + y="553.008" + id="text5651-9"><tspan + sodipodi:role="line" + id="tspan5653-9" + x="371.92178" + y="553.008">A</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="401.1561" + y="553.008" + id="text5655-6"><tspan + sodipodi:role="line" + id="tspan5657-0" + x="401.1561" + y="553.008">B</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="429.30786" + y="553.00208" + id="text5659-2"><tspan + sodipodi:role="line" + id="tspan5661-7" + x="429.30786" + y="553.00208">C</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="456.99817" + y="553.008" + id="text5663-6"><tspan + sodipodi:role="line" + id="tspan5665-1" + x="456.99817" + y="553.008">D</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="487.2323" + y="553.008" + id="text5667-3"><tspan + sodipodi:role="line" + id="tspan5669-2" + x="487.2323" + y="553.008">E</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="516.34833" + y="553.008" + id="text5671-1"><tspan + sodipodi:role="line" + id="tspan5673-5" + x="516.34833" + y="553.008">F</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="625.12976" + y="553.00208" + id="text5611-0-4"><tspan + sodipodi:role="line" + id="tspan5613-5-8" + x="625.12976" + y="553.00208">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="653.94403" + y="553.008" + id="text5615-6-0"><tspan + sodipodi:role="line" + id="tspan5617-6-4" + x="653.94403" + y="553.008">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="682.53949" + y="553.08783" + id="text5619-4-2"><tspan + sodipodi:role="line" + id="tspan5621-0-9" + x="682.53949" + y="553.08783">2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.11537266px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="710.79773" + y="553.00208" + id="text5623-0-6"><tspan + sodipodi:role="line" + id="tspan5625-4-1" + x="710.79773" + y="553.00208">3</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/memory-management2.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/memory-management2.svg new file mode 100644 index 000000000..34f58a9a1 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/memory-management2.svg @@ -0,0 +1,2270 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="721.63605" + height="182.36613" + id="svg2" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="memory-management2.svg" + inkscape:export-filename="/home/matz/rapports/doc/intel/memory-management2.png" + inkscape:export-xdpi="113.16409" + inkscape:export-ydpi="113.16409"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path4669" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + id="path4672" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4666" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective10" /> + <inkscape:perspective + id="perspective3600" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-10" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-76" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-45" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-47" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-43" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-78" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-14" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-068" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-50" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3622-71" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3824-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4093" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4288" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4288-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4344" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4369" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4394" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4394-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4394-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4441" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4441-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4441-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4441-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4441-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4441-80" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4521" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4521-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4521-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4568" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4568-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4568-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4615" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4615-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4615-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5304" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-1" + style="overflow:visible"> + <path + id="path4672-1" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5338" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-0" + style="overflow:visible"> + <path + id="path4672-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5366" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5391" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-6" + style="overflow:visible"> + <path + id="path4672-9" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5711" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5800" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5970" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7639" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8210" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8571" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8596" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8596-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8596-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8643" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8643-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8643-43" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.49497475" + inkscape:cx="413.62889" + inkscape:cy="368.76449" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1059" + inkscape:window-x="627" + inkscape:window-y="26" + inkscape:window-maximized="0" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-9.3094645,-454.23035)"> + <rect + style="fill:#aeda00;fill-opacity:1;stroke:none" + id="rect3590" + width="28.306801" + height="14.1534" + x="79.788979" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-9" + width="28.306801" + height="14.1534" + x="108.09577" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-3" + width="28.306801" + height="14.1534" + x="136.40256" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#aeda00;fill-opacity:1;stroke:none" + id="rect3590-94" + width="28.306801" + height="14.1534" + x="164.70938" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-8" + width="28.306801" + height="14.1534" + x="193.01619" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-5" + width="28.306801" + height="14.1534" + x="221.323" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#aeda00;fill-opacity:1;stroke:none" + id="rect3590-36" + width="28.306801" + height="14.1534" + x="249.62979" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-6" + width="28.306801" + height="14.1534" + x="277.93658" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-2" + width="28.306801" + height="14.1534" + x="306.24341" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#aeda00;fill-opacity:1;stroke:none" + id="rect3590-1" + width="28.306801" + height="14.1534" + x="334.55017" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-54" + width="28.306801" + height="14.1534" + x="362.85699" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-56" + width="28.306801" + height="14.1534" + x="391.16379" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#aeda00;fill-opacity:1;stroke:none" + id="rect3590-37" + width="28.306801" + height="14.1534" + x="419.47058" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-25" + width="28.306801" + height="14.1534" + x="447.77737" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-4" + width="28.306801" + height="14.1534" + x="476.0842" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#aeda00;fill-opacity:1;stroke:none" + id="rect3590-0" + width="28.306801" + height="14.1534" + x="504.39099" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-68" + width="28.306801" + height="14.1534" + x="532.69775" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-43" + width="28.306801" + height="14.1534" + x="561.00458" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#aeda00;fill-opacity:1;stroke:none" + id="rect3590-92" + width="28.306801" + height="14.1534" + x="589.3114" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-926" + width="28.306801" + height="14.1534" + x="617.61816" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#668000;fill-opacity:1;stroke:none" + id="rect3590-49" + width="28.306801" + height="14.1534" + x="645.92499" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#aeda00;fill-opacity:1;stroke:none" + id="rect3590-48" + width="28.306801" + height="14.1534" + x="674.23175" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#88aa00;fill-opacity:1;stroke:none" + id="rect3590-7" + width="28.306801" + height="14.1534" + x="702.53857" + y="499.66611" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-67" + width="28.306801" + height="14.1534" + x="79.788979" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-9-3" + width="28.306801" + height="14.1534" + x="108.09577" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-3-6" + width="28.306801" + height="14.1534" + x="136.40256" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-94-5" + width="28.306801" + height="14.1534" + x="164.70938" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#808080;fill-opacity:1;stroke:none" + id="rect3590-8-6" + width="28.306801" + height="14.1534" + x="193.01619" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#808080;fill-opacity:1;stroke:none" + id="rect3590-5-3" + width="28.306801" + height="14.1534" + x="221.323" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#808080;fill-opacity:1;stroke:none" + id="rect3590-36-9" + width="28.306801" + height="14.1534" + x="249.62981" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#808080;fill-opacity:1;stroke:none" + id="rect3590-6-4" + width="28.306801" + height="14.1534" + x="277.93658" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-2-8" + width="28.306801" + height="14.1534" + x="306.24338" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-1-1" + width="28.306801" + height="14.1534" + x="334.55017" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-54-2" + width="28.306801" + height="14.1534" + x="362.85699" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-56-9" + width="28.306801" + height="14.1534" + x="391.16379" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#808080;fill-opacity:1;stroke:none" + id="rect3590-37-3" + width="28.306801" + height="14.1534" + x="419.47058" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#808080;fill-opacity:1;stroke:none" + id="rect3590-25-9" + width="28.306801" + height="14.1534" + x="447.77737" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#808080;fill-opacity:1;stroke:none" + id="rect3590-4-0" + width="28.306801" + height="14.1534" + x="476.0842" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#808080;fill-opacity:1;stroke:none" + id="rect3590-0-8" + width="28.306801" + height="14.1534" + x="504.39099" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-68-8" + width="28.306801" + height="14.1534" + x="532.69775" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-43-5" + width="28.306801" + height="14.1534" + x="561.00458" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-92-0" + width="28.306801" + height="14.1534" + x="589.3114" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#c8b7b7;fill-opacity:1;stroke:none" + id="rect3590-926-9" + width="28.306801" + height="14.1534" + x="617.61816" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#808080;fill-opacity:1;stroke:none" + id="rect3590-49-6" + width="28.306801" + height="14.1534" + x="645.92505" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#808080;fill-opacity:1;stroke:none" + id="rect3590-48-3" + width="28.306801" + height="14.1534" + x="674.23175" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#808080;fill-opacity:1;stroke:none" + id="rect3590-7-8" + width="28.306801" + height="14.1534" + x="702.53857" + y="527.97321" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-61" + width="28.306801" + height="14.1534" + x="79.788979" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-9-1" + width="28.306801" + height="14.1534" + x="108.09577" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-3-5" + width="28.306801" + height="14.1534" + x="136.40256" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-94-9" + width="28.306801" + height="14.1534" + x="164.70937" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-8-8" + width="28.306801" + height="14.1534" + x="193.01617" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-5-4" + width="28.306801" + height="14.1534" + x="221.32297" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-36-8" + width="28.306801" + height="14.1534" + x="249.62979" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-6-1" + width="28.306801" + height="14.1534" + x="277.93655" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-2-0" + width="28.306801" + height="14.1534" + x="306.24338" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-1-3" + width="28.306801" + height="14.1534" + x="334.5502" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-54-0" + width="28.306801" + height="14.1534" + x="362.85703" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-56-4" + width="28.306801" + height="14.1534" + x="391.16382" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-37-4" + width="28.306801" + height="14.1534" + x="419.47061" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-25-4" + width="28.306801" + height="14.1534" + x="447.7774" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-4-4" + width="28.306801" + height="14.1534" + x="476.08423" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-0-7" + width="28.306801" + height="14.1534" + x="504.39102" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-68-6" + width="28.306801" + height="14.1534" + x="532.69781" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-43-3" + width="28.306801" + height="14.1534" + x="561.00464" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-92-1" + width="28.306801" + height="14.1534" + x="589.31146" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-926-7" + width="28.306801" + height="14.1534" + x="617.61816" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-49-5" + width="28.306801" + height="14.1534" + x="645.92505" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-48-9" + width="28.306801" + height="14.1534" + x="674.23187" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#008fff;fill-opacity:1;stroke:none" + id="rect3590-7-6" + width="28.306801" + height="14.1534" + x="702.5387" + y="542.12665" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-17" + width="28.306801" + height="14.1534" + x="79.788979" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-9-8" + width="28.306801" + height="14.1534" + x="108.09577" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-3-57" + width="28.306801" + height="14.1534" + x="136.40256" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-94-4" + width="28.306801" + height="14.1534" + x="164.70938" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-8-1" + width="28.306801" + height="14.1534" + x="193.01619" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-5-8" + width="28.306801" + height="14.1534" + x="221.323" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-36-5" + width="28.306801" + height="14.1534" + x="249.62979" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-6-9" + width="28.306801" + height="14.1534" + x="277.93658" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-2-7" + width="28.306801" + height="14.1534" + x="306.24341" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-1-5" + width="28.306801" + height="14.1534" + x="334.55017" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-54-3" + width="28.306801" + height="14.1534" + x="362.85699" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-56-8" + width="28.306801" + height="14.1534" + x="391.16379" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-37-8" + width="28.306801" + height="14.1534" + x="419.47058" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-25-3" + width="28.306801" + height="14.1534" + x="447.77737" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-4-1" + width="28.306801" + height="14.1534" + x="476.0842" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-0-89" + width="28.306801" + height="14.1534" + x="504.39099" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-68-64" + width="28.306801" + height="14.1534" + x="532.69775" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-43-33" + width="28.306801" + height="14.1534" + x="561.00458" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-92-3" + width="28.306801" + height="14.1534" + x="589.3114" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-926-8" + width="28.306801" + height="14.1534" + x="617.61816" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-49-60" + width="28.306801" + height="14.1534" + x="645.92499" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#aa4400;fill-opacity:1;stroke:none" + id="rect3590-48-4" + width="28.306801" + height="14.1534" + x="674.23175" + y="513.81964" + rx="0" + ry="0" /> + <rect + style="fill:#d45500;fill-opacity:1;stroke:none" + id="rect3590-7-88" + width="28.306801" + height="14.1534" + x="702.53857" + y="513.81964" + rx="0" + ry="0" /> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="21.944584" + y="510.97018" + id="text4268"><tspan + sodipodi:role="line" + id="tspan4270" + x="21.944584" + y="510.97018">Channel</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="33.021156" + y="525.1236" + id="text4272"><tspan + sodipodi:role="line" + id="tspan4274" + x="33.021156" + y="525.1236">Rank</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="261.32166" + y="572.17572" + id="text4276"><tspan + sodipodi:role="line" + id="tspan4278" + x="261.32166" + y="572.17572">packet 1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="579.70288" + y="572.17572" + id="text4276-8"><tspan + sodipodi:role="line" + id="tspan4278-9" + x="579.70288" + y="572.17572">packet 2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="89.634758" + y="511.27783" + id="text4316"><tspan + sodipodi:role="line" + x="89.634758" + y="511.27783" + id="tspan4320">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="118.55694" + y="511.28378" + id="text4324"><tspan + sodipodi:role="line" + id="tspan4326" + x="118.55694" + y="511.28378">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="175.04115" + y="511.27783" + id="text4316-4-0"><tspan + sodipodi:role="line" + x="175.04115" + y="511.27783" + id="tspan4320-3-9">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="206.93008" + y="511.28378" + id="text4324-0-9"><tspan + sodipodi:role="line" + id="tspan4326-3-2" + x="206.93008" + y="511.28378">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="626.55792" + y="511.28378" + id="text4324-0-5"><tspan + sodipodi:role="line" + id="tspan4326-3-4" + x="626.55792" + y="511.28378">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="158.57513" + y="525.10144" + id="text4324-0-1"><tspan + sodipodi:role="line" + id="tspan4326-3-28" + x="158.57513" + y="525.10144">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="386.27017" + y="525.10144" + id="text4324-0-3"><tspan + sodipodi:role="line" + id="tspan4326-3-6" + x="386.27017" + y="525.10144">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="613.96515" + y="525.10144" + id="text4324-0-2"><tspan + sodipodi:role="line" + id="tspan4326-3-1" + x="613.96515" + y="525.10144">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="101.76144" + y="525.09552" + id="text4316-4-05"><tspan + sodipodi:role="line" + x="101.76144" + y="525.09552" + id="tspan4320-3-1">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="329.45642" + y="525.09552" + id="text4316-4-08"><tspan + sodipodi:role="line" + x="329.45642" + y="525.09552" + id="tspan4320-3-5">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="557.15149" + y="525.09552" + id="text4316-4-6"><tspan + sodipodi:role="line" + x="557.15149" + y="525.09552" + id="tspan4320-3-462">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="215.76958" + y="525.18176" + id="text4328-5"><tspan + sodipodi:role="line" + id="tspan4330-8" + x="215.76958" + y="525.18176">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="443.46457" + y="525.18176" + id="text4328-2"><tspan + sodipodi:role="line" + id="tspan4330-84" + x="443.46457" + y="525.18176">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="671.15961" + y="525.18176" + id="text4328-24"><tspan + sodipodi:role="line" + id="tspan4330-0" + x="671.15961" + y="525.18176">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="272.55353" + y="525.09552" + id="text4332-6"><tspan + sodipodi:role="line" + id="tspan4334-2" + x="272.55353" + y="525.09552">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="500.2485" + y="525.09552" + id="text4332-9"><tspan + sodipodi:role="line" + id="tspan4334-0" + x="500.2485" + y="525.09552">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="68.712341" + y="464.20242" + id="text4654"><tspan + sodipodi:role="line" + id="tspan4656" + x="68.712341" + y="464.20242">memory addresses</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.21836102px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="m 157.32493,467.27924 45.53702,0" + id="path4658" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="89.550758" + y="598.22528" + id="text4654-0"><tspan + sodipodi:role="line" + id="tspan4656-3" + x="89.550758" + y="598.22528">pkt0 starts at</tspan><tspan + sodipodi:role="line" + x="89.550758" + y="613.45477" + id="tspan5744">channel 0, rank 1</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.21836102px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="m 82.623257,606.68185 0,-45.53702" + id="path4658-4" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.21836102px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="m 543.77432,606.19331 0,-45.53702" + id="path4658-4-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="547.47595" + y="603.50317" + id="text4654-0-1"><tspan + sodipodi:role="line" + id="tspan4656-3-9" + x="547.47595" + y="603.50317">pkt2 starts at</tspan><tspan + sodipodi:role="line" + x="547.47595" + y="618.73267" + id="tspan5746">channel 1, rank 0</tspan><tspan + sodipodi:role="line" + x="547.47595" + y="633.96222" + id="tspan8239">(no padding needed)</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.21836102px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" + d="m 422.11522,471.5868 23.99924,0" + id="path4658-3" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="394.24057" + y="463.58704" + id="text5607"><tspan + sodipodi:role="line" + id="tspan5609" + x="394.24057" + y="463.58704">64 bytes wide</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="88.404022" + y="493.73996" + id="text5611"><tspan + sodipodi:role="line" + id="tspan5613" + x="88.404022" + y="493.73996">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="117.38064" + y="493.74591" + id="text5615"><tspan + sodipodi:role="line" + id="tspan5617" + x="117.38064" + y="493.74591">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="146.13713" + y="493.8262" + id="text5619"><tspan + sodipodi:role="line" + id="tspan5621" + x="146.13713" + y="493.8262">2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="174.55452" + y="493.73996" + id="text5623"><tspan + sodipodi:role="line" + id="tspan5625" + x="174.55452" + y="493.73996">3</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="202.92433" + y="493.74591" + id="text5627"><tspan + sodipodi:role="line" + id="tspan5629" + x="202.92433" + y="493.74591">4</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="231.9664" + y="493.65964" + id="text5631"><tspan + sodipodi:role="line" + id="tspan5633" + x="231.9664" + y="493.65964">5</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="260.33026" + y="493.73996" + id="text5635"><tspan + sodipodi:role="line" + id="tspan5637" + x="260.33026" + y="493.73996">6</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="289.2652" + y="493.74591" + id="text5639"><tspan + sodipodi:role="line" + id="tspan5641" + x="289.2652" + y="493.74591">7</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="317.71829" + y="493.73996" + id="text5643"><tspan + sodipodi:role="line" + id="tspan5645" + x="317.71829" + y="493.73996">8</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="346.40338" + y="493.73996" + id="text5647"><tspan + sodipodi:role="line" + id="tspan5649" + x="346.40338" + y="493.73996">9</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="373.7262" + y="493.74591" + id="text5651"><tspan + sodipodi:role="line" + id="tspan5653" + x="373.7262" + y="493.74591">A</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="403.12518" + y="493.74591" + id="text5655"><tspan + sodipodi:role="line" + id="tspan5657" + x="403.12518" + y="493.74591">B</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="431.43549" + y="493.73996" + id="text5659"><tspan + sodipodi:role="line" + id="tspan5661" + x="431.43549" + y="493.73996">C</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="459.2818" + y="493.74591" + id="text5663"><tspan + sodipodi:role="line" + id="tspan5665" + x="459.2818" + y="493.74591">D</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="489.68619" + y="493.74591" + id="text5667"><tspan + sodipodi:role="line" + id="tspan5669" + x="489.68619" + y="493.74591">E</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="518.96619" + y="493.74591" + id="text5671"><tspan + sodipodi:role="line" + id="tspan5673" + x="518.96619" + y="493.74591">F</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="539.22748" + y="493.73996" + id="text5675"><tspan + sodipodi:role="line" + id="tspan5677" + x="539.22748" + y="493.73996">10</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="568.20404" + y="493.74591" + id="text5679"><tspan + sodipodi:role="line" + id="tspan5681" + x="568.20404" + y="493.74591">11</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="596.96057" + y="493.8262" + id="text5683"><tspan + sodipodi:role="line" + id="tspan5685" + x="596.96057" + y="493.8262">12</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="625.37799" + y="493.73996" + id="text5687"><tspan + sodipodi:role="line" + id="tspan5689" + x="625.37799" + y="493.73996">13</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="653.7478" + y="493.74591" + id="text5691"><tspan + sodipodi:role="line" + id="tspan5693" + x="653.7478" + y="493.74591">14</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="682.78986" + y="493.65964" + id="text5695"><tspan + sodipodi:role="line" + id="tspan5697" + x="682.78986" + y="493.65964">15</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="711.15369" + y="493.73996" + id="text5699"><tspan + sodipodi:role="line" + id="tspan5701" + x="711.15369" + y="493.73996">...</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="8.2137098" + y="492.76846" + id="text4268-3"><tspan + sodipodi:role="line" + id="tspan4270-8" + x="8.2137098" + y="492.76846">Block num</tspan></text> + <flowRoot + xml:space="preserve" + id="flowRoot5728" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"><flowRegion + id="flowRegion5730"><rect + id="rect5732" + width="110.6117" + height="25.253813" + x="314.66251" + y="435.66406" /></flowRegion><flowPara + id="flowPara5734" /></flowRoot> <flowRoot + xml:space="preserve" + id="flowRoot5736" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"><flowRegion + id="flowRegion5738"><rect + id="rect5740" + width="32.829956" + height="11.616755" + x="356.58386" + y="428.08792" /></flowRegion><flowPara + id="flowPara5742" /></flowRoot> <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="88.641403" + y="553.5578" + id="text5611-0"><tspan + sodipodi:role="line" + id="tspan5613-5" + x="88.641403" + y="553.5578">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="117.61801" + y="553.56378" + id="text5615-6"><tspan + sodipodi:role="line" + id="tspan5617-6" + x="117.61801" + y="553.56378">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="146.37451" + y="553.64404" + id="text5619-4"><tspan + sodipodi:role="line" + id="tspan5621-0" + x="146.37451" + y="553.64404">2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="174.7919" + y="553.5578" + id="text5623-0"><tspan + sodipodi:role="line" + id="tspan5625-4" + x="174.7919" + y="553.5578">3</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="203.16173" + y="553.56378" + id="text5627-6"><tspan + sodipodi:role="line" + id="tspan5629-2" + x="203.16173" + y="553.56378">4</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="232.20378" + y="553.47748" + id="text5631-6"><tspan + sodipodi:role="line" + id="tspan5633-7" + x="232.20378" + y="553.47748">5</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="260.56763" + y="553.5578" + id="text5635-5"><tspan + sodipodi:role="line" + id="tspan5637-6" + x="260.56763" + y="553.5578">6</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="289.50256" + y="553.56378" + id="text5639-9"><tspan + sodipodi:role="line" + id="tspan5641-8" + x="289.50256" + y="553.56378">7</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="317.95566" + y="553.5578" + id="text5643-7"><tspan + sodipodi:role="line" + id="tspan5645-2" + x="317.95566" + y="553.5578">8</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="346.64075" + y="553.5578" + id="text5647-8"><tspan + sodipodi:role="line" + id="tspan5649-2" + x="346.64075" + y="553.5578">9</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="373.96356" + y="553.56378" + id="text5651-9"><tspan + sodipodi:role="line" + id="tspan5653-9" + x="373.96356" + y="553.56378">A</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="403.36255" + y="553.56378" + id="text5655-6"><tspan + sodipodi:role="line" + id="tspan5657-0" + x="403.36255" + y="553.56378">B</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="431.67285" + y="553.5578" + id="text5659-2"><tspan + sodipodi:role="line" + id="tspan5661-7" + x="431.67285" + y="553.5578">C</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="459.51917" + y="553.56378" + id="text5663-6"><tspan + sodipodi:role="line" + id="tspan5665-1" + x="459.51917" + y="553.56378">D</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="489.92355" + y="553.56378" + id="text5667-3"><tspan + sodipodi:role="line" + id="tspan5669-2" + x="489.92355" + y="553.56378">E</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="519.20355" + y="553.56378" + id="text5671-1"><tspan + sodipodi:role="line" + id="tspan5673-5" + x="519.20355" + y="553.56378">F</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="541.68066" + y="553.5578" + id="text5611-0-4"><tspan + sodipodi:role="line" + id="tspan5613-5-8" + x="541.68066" + y="553.5578">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="570.65729" + y="553.56378" + id="text5615-6-0"><tspan + sodipodi:role="line" + id="tspan5617-6-4" + x="570.65729" + y="553.56378">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="599.41376" + y="553.64404" + id="text5619-4-2"><tspan + sodipodi:role="line" + id="tspan5621-0-9" + x="599.41376" + y="553.64404">2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="627.83112" + y="553.5578" + id="text5623-0-6"><tspan + sodipodi:role="line" + id="tspan5625-4-1" + x="627.83112" + y="553.5578">3</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="146.52826" + y="511.4975" + id="text4328-5-0"><tspan + sodipodi:role="line" + id="tspan4330-8-6" + x="146.52826" + y="511.4975">2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="543.39069" + y="510.77237" + id="text4324-3"><tspan + sodipodi:role="line" + id="tspan4326-2" + x="543.39069" + y="510.77237">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="599.87488" + y="510.76642" + id="text4316-4-0-0"><tspan + sodipodi:role="line" + x="599.87488" + y="510.76642" + id="tspan4320-3-9-6">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="571.362" + y="510.98608" + id="text4328-5-0-1"><tspan + sodipodi:role="line" + id="tspan4330-8-6-5" + x="571.362" + y="510.98608">2</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="33.475063" + y="540.45441" + id="text4272-5"><tspan + sodipodi:role="line" + id="tspan4274-4" + x="33.475063" + y="540.45441">DIMM</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="133.7489" + y="538.91449" + id="text4328-5-7"><tspan + sodipodi:role="line" + id="tspan4330-8-65" + x="133.7489" + y="538.91449">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="359.58084" + y="538.91449" + id="text4328-5-9"><tspan + sodipodi:role="line" + id="tspan4330-8-3" + x="359.58084" + y="538.91449">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="585.41272" + y="538.91449" + id="text4328-5-4"><tspan + sodipodi:role="line" + id="tspan4330-8-5" + x="585.41272" + y="538.91449">0</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="471.73404" + y="538.92047" + id="text4332-9-2"><tspan + sodipodi:role="line" + id="tspan4334-0-5" + x="471.73404" + y="538.92047">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="245.467" + y="538.92047" + id="text4332-9-7"><tspan + sodipodi:role="line" + id="tspan4334-0-4" + x="245.467" + y="538.92047">1</tspan></text> + <text + xml:space="preserve" + style="font-size:12.18360996px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="699.74158" + y="538.92047" + id="text4332-9-0"><tspan + sodipodi:role="line" + id="tspan4334-0-7" + x="699.74158" + y="538.92047">1</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/mempool.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/mempool.svg new file mode 100644 index 000000000..472c13795 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/mempool.svg @@ -0,0 +1,2403 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="524.67041" + height="224.77138" + id="svg3868" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="mempool.svg" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/mbuf2.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + sodipodi:version="0.32" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs3870"> + <marker + inkscape:stockid="TriangleInL" + orient="auto" + refY="0" + refX="0" + id="TriangleInL" + style="overflow:visible"> + <path + id="path5477" + d="m 5.77,0 -8.65,5 0,-10 8.65,5 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="scale(-0.8,-0.8)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3876" /> + <inkscape:perspective + id="perspective3886" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path3211" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3892" + style="overflow:visible"> + <path + id="path3894" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3896" + style="overflow:visible"> + <path + id="path3898" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path3208" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3902" + style="overflow:visible"> + <path + id="path3904" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="marker3906" + style="overflow:visible"> + <path + id="path3908" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3910" + style="overflow:visible"> + <path + id="path3912" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4086" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4113" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4304" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-6" + style="overflow:visible"> + <path + id="path3211-5" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart-6" + style="overflow:visible"> + <path + id="path3208-9" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4312" + style="overflow:visible"> + <path + id="path4314" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="marker4316" + style="overflow:visible"> + <path + id="path4318" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4320" + style="overflow:visible"> + <path + id="path4322" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4304-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-8" + style="overflow:visible"> + <path + id="path3211-8" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart-4" + style="overflow:visible"> + <path + id="path3208-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4312-1" + style="overflow:visible"> + <path + id="path4314-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="marker4316-9" + style="overflow:visible"> + <path + id="path4318-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4320-0" + style="overflow:visible"> + <path + id="path4322-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4456" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-2" + style="overflow:visible"> + <path + id="path3211-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4484" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4509" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-61" + style="overflow:visible"> + <path + id="path3211-59" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4558" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3279" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart-9" + style="overflow:visible"> + <path + id="path3208-31" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path3211-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3313" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3338" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5616" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path4530" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + id="path4533" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="marker5624" + style="overflow:visible"> + <path + id="path5626" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker5628" + style="overflow:visible"> + <path + id="path5630" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker5632" + style="overflow:visible"> + <path + id="path5634" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker5636" + style="overflow:visible"> + <path + id="path5638" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker5640" + style="overflow:visible"> + <path + id="path5642" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="marker5644" + style="overflow:visible"> + <path + id="path5646" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker5648" + style="overflow:visible"> + <path + id="path5650" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4513" + id="linearGradient4519" + x1="47.142857" + y1="244.50504" + x2="677.85718" + y2="244.50504" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient4513"> + <stop + style="stop-color:#fdffdb;stop-opacity:1;" + offset="0" + id="stop4515" /> + <stop + style="stop-color:#dfe2d8;stop-opacity:0;" + offset="1" + id="stop4517" /> + </linearGradient> + <inkscape:perspective + id="perspective6744" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-4" + style="overflow:visible"> + <path + id="path4533-5" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective6772" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-5" + style="overflow:visible"> + <path + id="path4533-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective6802" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-44" + style="overflow:visible"> + <path + id="path4533-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective6830" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-7" + style="overflow:visible"> + <path + id="path4533-8" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective6864" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective6889" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective6926" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-9" + style="overflow:visible"> + <path + id="path4533-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective6963" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective6995" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-9" + style="overflow:visible"> + <path + id="path4530-5" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-0" + style="overflow:visible"> + <path + id="path4533-48" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective7029" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-1" + style="overflow:visible"> + <path + id="path4530-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-2" + style="overflow:visible"> + <path + id="path4533-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective7074" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-6" + style="overflow:visible"> + <path + id="path4530-1" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-59" + style="overflow:visible"> + <path + id="path4533-49" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective7074-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-7" + style="overflow:visible"> + <path + id="path4530-11" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597" + style="overflow:visible"> + <path + id="path4533-76" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective7151" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7173" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7195" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7195-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7195-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7195-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7195-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7195-09" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7195-80" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7195-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7280" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7302" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7333" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7364" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7364-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7364-31" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7682" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597-0" + style="overflow:visible"> + <path + id="path4533-76-5" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective7682-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597-1" + style="overflow:visible"> + <path + id="path4533-76-8" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective7682-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597-9" + style="overflow:visible"> + <path + id="path4533-76-1" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective7752" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7780" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7780-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7780-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7834" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597-94" + style="overflow:visible"> + <path + id="path4533-76-9" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective7889" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7920" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7920-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7971" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7971-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective7971-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8586" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-7-4" + style="overflow:visible"> + <path + id="path4530-11-9" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597-94-9" + style="overflow:visible"> + <path + id="path4533-76-9-3" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective8628" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-7-3" + style="overflow:visible"> + <path + id="path4530-11-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597-94-95" + style="overflow:visible"> + <path + id="path4533-76-9-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective8672" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8672-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8672-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8672-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective8672-72" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3119" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-7-1" + style="overflow:visible"> + <path + id="path4530-11-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597-94-4" + style="overflow:visible"> + <path + id="path4533-76-9-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3153" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-7-48" + style="overflow:visible"> + <path + id="path4530-11-8" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597-94-2" + style="overflow:visible"> + <path + id="path4533-76-9-45" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3187" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-7-17" + style="overflow:visible"> + <path + id="path4530-11-1" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597-94-1" + style="overflow:visible"> + <path + id="path4533-76-9-5" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3223" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3223-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3254" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3276" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3298" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3320" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-7-2" + style="overflow:visible"> + <path + id="path4530-11-21" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597-94-6" + style="overflow:visible"> + <path + id="path4533-76-9-8" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="marker3328" + style="overflow:visible"> + <path + id="path3330" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker3332" + style="overflow:visible"> + <path + id="path3334" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="marker3336" + style="overflow:visible"> + <path + id="path3338" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="marker3340" + style="overflow:visible"> + <path + id="path3342" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3454" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3454-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3515" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3539" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3573" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3616" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3638" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3663" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3688" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597-8" + style="overflow:visible"> + <path + id="path4533-76-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3716" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3751" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3837" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4513" + id="linearGradient3854" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.73452793,0,0,1.0006382,166.39991,320.95026)" + x1="47.142857" + y1="244.50504" + x2="677.85718" + y2="244.50504" /> + <inkscape:perspective + id="perspective3886-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3928" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3960" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4007" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4042" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4084" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4162" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective9350" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="marker3336-8" + style="overflow:visible"> + <path + id="path3338-1" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-597-8-5" + style="overflow:visible"> + <path + id="path4533-76-4-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective6185" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective6185-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.0467057" + inkscape:cx="302.77072" + inkscape:cy="28.903136" + inkscape:document-units="px" + inkscape:current-layer="g4029" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1059" + inkscape:window-x="955" + inkscape:window-y="-6" + inkscape:window-maximized="0" + inkscape:snap-to-guides="false" + inkscape:snap-grids="false" + inkscape:snap-global="false" + inkscape:snap-midpoints="true" + inkscape:snap-bbox="true" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1"> + <inkscape:grid + type="xygrid" + id="grid3213" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + originx="-94.382468px" + originy="-342.55912px" /> + </sodipodi:namedview> + <metadata + id="metadata3873"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-94.382468,-485.03167)"> + <rect + style="fill:url(#linearGradient3854);fill-opacity:1;stroke:#000000;stroke-width:0.85731947;stroke-opacity:1" + id="rect3697" + width="413.29926" + height="223.71407" + x="205.22496" + y="485.56033" + rx="4.9632053" + ry="6.7613125" /> + <text + xml:space="preserve" + style="font-size:15.22520161px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="533.11731" + y="704.97418" + id="text2912" + inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png" + inkscape:export-xdpi="112" + inkscape:export-ydpi="112"><tspan + sodipodi:role="line" + x="533.11731" + y="704.97418" + id="tspan2916" + style="font-weight:bold">mempool</tspan></text> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.71188605;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-2" + width="202.62376" + height="49.551369" + x="219.42996" + y="628.4303" + rx="4.9559956" + ry="7.5408955" /> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.73036075;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-35" + width="20.112448" + height="38.173069" + x="340.3158" + y="634.04816" + rx="7.8000541" + ry="5.0432453" /> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.73036075;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-5" + width="20.112448" + height="38.173069" + x="319.96204" + y="634.04816" + rx="7.8000541" + ry="5.0432453" /> + <rect + style="fill:#cadae7;fill-opacity:1;stroke:#000000;stroke-width:0.73036075;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-9" + width="20.112448" + height="38.173069" + x="259.60825" + y="634.04816" + rx="7.8000541" + ry="5.0432453" /> + <rect + style="fill:#cadae7;fill-opacity:1;stroke:#000000;stroke-width:0.73036075;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-2" + width="20.112448" + height="38.173069" + x="239.25446" + y="634.04816" + rx="7.8000541" + ry="5.0432453" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="221.08591" + y="689.99701" + id="text7396"><tspan + sodipodi:role="line" + id="tspan7398" + x="221.08591" + y="689.99701">rte_ring: stores memory pool's free objects</tspan></text> + <g + id="g3556" + transform="translate(148.33068,-16.839839)"> + <rect + ry="4.7672176" + rx="1.4663186" + y="520.37323" + x="115.01109" + height="31.325468" + width="89.278099" + id="rect7129-7" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.30787912;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + ry="3.2512298" + rx="4.1153607" + y="524.04962" + x="134.92958" + height="24.609037" + width="10.611463" + id="rect7129-7-6-59" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.42595267;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + ry="3.2512298" + rx="4.1153607" + y="524.04962" + x="146.02029" + height="24.609037" + width="10.611463" + id="rect7129-7-6-3-4" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.42595267;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + ry="3.2512298" + rx="4.1153607" + y="524.04962" + x="123.83889" + height="24.609037" + width="10.611463" + id="rect7129-7-6-4-8" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.42595267;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + ry="3.2512298" + rx="4.1153607" + y="524.04962" + x="172.97792" + height="24.609037" + width="10.611463" + id="rect7129-7-6-59-9" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.42595267;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + ry="3.2512298" + rx="4.1153607" + y="524.04962" + x="184.06863" + height="24.609037" + width="10.611463" + id="rect7129-7-6-3-4-0" + style="fill:#cadae7;fill-opacity:1;stroke:#000000;stroke-width:0.42595267;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + ry="3.2512298" + rx="4.1153607" + y="524.04962" + x="161.88724" + height="24.609037" + width="10.611463" + id="rect7129-7-6-4-8-3" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.42595267;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-597)" + d="m 340.47599,509.43082 c 92.81925,-30.53703 166.95829,13.12827 166.95829,13.12827" + id="path7404-03-9" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="266.32944" + y="498.09778" + id="text7854"><tspan + sodipodi:role="line" + x="266.32944" + y="498.09778" + id="tspan3741">Object caches for </tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:0.96962595px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-597)" + d="m 271.07042,635.43299 c 12.54991,-45.75051 236.78634,-23.96595 236.78634,-23.96595" + id="path7404-01" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.12415373px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-597)" + d="m 250.87163,635.89898 c 2.04819,-29.55761 44.90861,-47.82096 95.60619,-50.5881 79.74975,-4.35282 159.95437,-3.19032 159.95437,-3.19032" + id="path7404-0" + sodipodi:nodetypes="csc" + inkscape:connector-curvature="0" /> + <g + id="g3438" + transform="matrix(1.000443,0,0,0.89465497,-30.439438,249.77294)"> + <g + id="g7958-9" + transform="matrix(0.78732502,0,0,0.61113587,448.75651,177.243)"> + <rect + style="fill:#f4d5d3;fill-opacity:1;stroke:#000000;stroke-width:0.8069638;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-90-0-1-56" + width="19.690214" + height="46.621613" + x="114.32729" + y="406.50797" /> + <rect + style="fill:#dcf4d3;fill-opacity:1;stroke:#000000;stroke-width:0.8069638;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-90-0-1-0-1" + width="70.421326" + height="46.621613" + x="132.82446" + y="406.50797" /> + <rect + style="fill:#d3e5f4;fill-opacity:1;stroke:#000000;stroke-width:0.8069638;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-90-0-1-5-1" + width="19.690214" + height="46.621613" + x="192.63127" + y="406.50797" /> + </g> + <text + sodipodi:linespacing="125%" + transform="scale(1.0074647,0.9925906)" + id="text7732" + y="447.68558" + x="564.28278" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + xml:space="preserve"><tspan + y="447.68558" + x="564.28278" + id="tspan7734" + sodipodi:role="line">obj n</tspan></text> + </g> + <g + transform="matrix(0.78732502,0,0,0.52069781,418.57285,302.82991)" + id="g7958-9-5"> + <rect + y="406.50797" + x="114.32729" + height="46.621613" + width="19.690214" + id="rect7129-7-6-90-0-1-56-7" + style="fill:#f4d5d3;fill-opacity:1;stroke:#000000;stroke-width:0.8069638;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + y="406.50797" + x="132.82446" + height="46.621613" + width="70.421326" + id="rect7129-7-6-90-0-1-0-1-6" + style="fill:#dcf4d3;fill-opacity:1;stroke:#000000;stroke-width:0.8069638;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + y="406.50797" + x="192.63127" + height="46.621613" + width="19.690214" + id="rect7129-7-6-90-0-1-5-1-1" + style="fill:#d3e5f4;fill-opacity:1;stroke:#000000;stroke-width:0.8069638;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + </g> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="533.6839" + y="533.18359" + id="text7732-8" + transform="scale(1.0074647,0.9925906)" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan7734-9" + x="533.6839" + y="533.18359">obj 0</tspan></text> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="502.64444" + y="500.12582" + id="text8612-2" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan8614-7" + x="502.64444" + y="500.12582">header</tspan></text> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="566.88733" + y="500.12582" + id="text8616-95" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan8618-43" + x="566.88733" + y="500.12582">trailer</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:0.86462426px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart-7);marker-end:url(#Arrow1Mend-597-94)" + d="m 526.19603,547.89632 40.68597,0" + id="path8024-8-3-1" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="545.97205" + y="542.58704" + id="text8616-9-2" + transform="scale(0.96857892,1.0324404)" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan8618-4-3" + x="545.97205" + y="542.58704">elt_size</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:0.59905624;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.59905608, 1.1981122;stroke-dashoffset:0" + d="m 569.57224,530.53402 0,22.6942" + id="path8660-7-3" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.70777601px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart-7);marker-end:url(#Arrow1Mend-597-94)" + d="m 571.28305,508.02829 12.97818,0" + id="path8024-8-3-5-4" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.70777601px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart-7);marker-end:url(#Arrow1Mend-597-94)" + d="m 507.94714,508.02829 12.97818,0" + id="path8024-8-3-5-2-1" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.63320398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.6332038, 1.26640764;stroke-dashoffset:0" + d="m 585.08147,497.83723 0,25.36643" + id="path8660-7-7-1" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.63320398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.6332038, 1.26640764;stroke-dashoffset:0" + d="m 569.55432,497.83723 0,25.36643" + id="path8660-7-1-3" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.63320398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.6332038, 1.26640764;stroke-dashoffset:0" + d="m 522.51589,497.83723 0,25.36643" + id="path8660-7-1-4-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.63320398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.6332038, 1.26640764;stroke-dashoffset:0" + d="m 507.96116,497.83723 0,25.36643" + id="path8660-7-1-4-2-7" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.63320398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.6332038, 1.26640764;stroke-dashoffset:0" + d="m 522.51589,530.55109 0,25.36643" + id="path8660-7-1-4-2-3-4" + inkscape:connector-curvature="0" /> + <g + transform="matrix(1.000443,0,0,0.89465497,-30.439438,229.94403)" + id="g3438-2"> + <g + id="g7958-9-7" + transform="matrix(0.78732502,0,0,0.61113587,448.75651,159.243)"> + <rect + style="fill:#f4d5d3;fill-opacity:1;stroke:#000000;stroke-width:0.8069638;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-90-0-1-56-79" + width="19.690214" + height="46.621613" + x="114.32729" + y="406.50797" /> + <rect + style="fill:#dcf4d3;fill-opacity:1;stroke:#000000;stroke-width:0.8069638;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-90-0-1-0-1-3" + width="70.421326" + height="46.621613" + x="132.82446" + y="406.50797" /> + <rect + style="fill:#d3e5f4;fill-opacity:1;stroke:#000000;stroke-width:0.8069638;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-90-0-1-5-1-19" + width="19.690214" + height="46.621613" + x="192.63127" + y="406.50797" /> + </g> + <text + sodipodi:linespacing="125%" + transform="scale(1.0074647,0.9925906)" + id="text7732-86" + y="429.55127" + x="564.28278" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + xml:space="preserve"><tspan + y="429.55127" + x="564.28278" + id="tspan7734-5" + sodipodi:role="line">obj 2</tspan></text> + </g> + <g + transform="matrix(1.000443,0,0,0.89465497,-30.439438,201.89749)" + id="g3438-28"> + <g + id="g7958-9-6" + transform="matrix(0.78732502,0,0,0.61113587,448.75651,159.243)"> + <rect + style="fill:#f4d5d3;fill-opacity:1;stroke:#000000;stroke-width:0.8069638;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-90-0-1-56-0" + width="19.690214" + height="46.621613" + x="114.32729" + y="406.50797" /> + <rect + style="fill:#dcf4d3;fill-opacity:1;stroke:#000000;stroke-width:0.8069638;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-90-0-1-0-1-2" + width="70.421326" + height="46.621613" + x="132.82446" + y="406.50797" /> + <rect + style="fill:#d3e5f4;fill-opacity:1;stroke:#000000;stroke-width:0.8069638;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-90-0-1-5-1-4" + width="19.690214" + height="46.621613" + x="192.63127" + y="406.50797" /> + </g> + <text + sodipodi:linespacing="125%" + transform="scale(1.0074647,0.9925906)" + id="text7732-865" + y="429.55127" + x="564.28278" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + xml:space="preserve"><tspan + y="429.55127" + x="564.28278" + id="tspan7734-0" + sodipodi:role="line">obj 1</tspan></text> + </g> + <g + transform="translate(149.18412,20.841779)" + id="g3556-6"> + <rect + ry="4.7672176" + rx="1.4663186" + y="520.37323" + x="115.01109" + height="31.325468" + width="89.278099" + id="rect7129-7-1" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.30787912;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + ry="3.2512298" + rx="4.1153607" + y="524.04962" + x="134.92958" + height="24.609037" + width="10.611463" + id="rect7129-7-6-59-3" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.42595267;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + ry="3.2512298" + rx="4.1153607" + y="524.04962" + x="146.02029" + height="24.609037" + width="10.611463" + id="rect7129-7-6-3-4-8" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.42595267;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + ry="3.2512298" + rx="4.1153607" + y="524.04962" + x="123.83889" + height="24.609037" + width="10.611463" + id="rect7129-7-6-4-8-9" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.42595267;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + ry="3.2512298" + rx="4.1153607" + y="524.04962" + x="172.97792" + height="24.609037" + width="10.611463" + id="rect7129-7-6-59-9-3" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.42595267;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + ry="3.2512298" + rx="4.1153607" + y="524.04962" + x="184.06863" + height="24.609037" + width="10.611463" + id="rect7129-7-6-3-4-0-4" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.42595267;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + <rect + ry="3.2512298" + rx="4.1153607" + y="524.04962" + x="161.88724" + height="24.609037" + width="10.611463" + id="rect7129-7-6-4-8-3-4" + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.42595267;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> + </g> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.73036075;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-35-0" + width="20.112448" + height="38.173069" + x="380.38757" + y="634.04816" + rx="7.8000541" + ry="5.0432453" /> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.73036075;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-5-6" + width="20.112448" + height="38.173069" + x="360.03381" + y="634.04816" + rx="7.8000541" + ry="5.0432453" /> + <rect + style="fill:#cadae7;fill-opacity:1;stroke:#000000;stroke-width:0.73036075;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-9-6" + width="20.112448" + height="38.173069" + x="300.46088" + y="634.04816" + rx="7.8000541" + ry="5.0432453" /> + <rect + style="fill:#cadae7;fill-opacity:1;stroke:#000000;stroke-width:0.73036075;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect7129-7-6-2-1" + width="20.112448" + height="38.173069" + x="280.10709" + y="634.04816" + rx="7.8000541" + ry="5.0432453" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.96962595px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-597)" + d="m 309.03989,635.58347 c 54.10887,-39.54055 199.04889,6.60616 199.04889,6.60616" + id="path7404-01-9" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="226.20416" + y="527.87885" + id="text7854-7"><tspan + sodipodi:role="line" + x="226.20416" + y="527.87885" + id="tspan3741-3">core 0 </tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="226.20416" + y="561.84998" + id="text7854-7-8"><tspan + sodipodi:role="line" + x="226.20416" + y="561.84998" + id="tspan3741-3-4">core 1 </tspan></text> + <rect + style="fill:#fdd99b" + id="rect3876" + width="72.608757" + height="34.871315" + x="95.060158" + y="494.42117" + rx="0" + ry="6.9517722" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="100.74176" + y="503.22147" + id="text7854-76"><tspan + sodipodi:role="line" + x="100.74176" + y="503.22147" + id="tspan3903">Core 0</tspan></text> + <g + id="g4029" + transform="translate(-53.501193,101.7478)"> + <rect + rx="0.47768921" + ry="6.9264936" + y="406.16937" + x="153.81593" + height="13.852987" + width="54.934261" + id="rect4027" + style="fill:#b3defd" /> + <text + id="text7854-76-1" + y="415.91406" + x="157.29335" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:9px" + id="tspan3903-4" + y="415.91406" + x="157.29335" + sodipodi:role="line">App A - ring</tspan></text> + </g> + <rect + style="fill:#fdd99b" + id="rect3876-2" + width="72.608757" + height="46.813545" + x="94.482468" + y="540.22198" + rx="0" + ry="9.3325157" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="100.16406" + y="549.02228" + id="text7854-76-0"><tspan + sodipodi:role="line" + x="100.16406" + y="549.02228" + id="tspan3903-0">Core 1</tspan></text> + <g + id="g4029-1" + transform="translate(-54.078888,147.54861)"> + <rect + rx="0.47768921" + ry="6.9264936" + y="406.16937" + x="153.81593" + height="13.852987" + width="54.934261" + id="rect4027-4" + style="fill:#b3defd" /> + <text + id="text7854-76-1-6" + y="415.91406" + x="157.29335" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:9px" + id="tspan3903-4-0" + y="415.91406" + x="157.29335" + sodipodi:role="line">App B - ring</tspan></text> + </g> + <g + transform="translate(-0.5777,45.80081)" + id="g4065-7"> + <g + transform="translate(140.67947,34.989454)" + id="g4029-7-1"> + <g + id="g4071-7" + transform="translate(-194.18066,82.162546)"> + <rect + rx="0.47768921" + ry="6.9264936" + y="406.16937" + x="153.81593" + height="13.852987" + width="54.934261" + id="rect4027-5-7" + style="fill:#b3defd" /> + <text + id="text7854-76-1-4-7" + y="415.91406" + x="157.29335" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + style="font-size:9px" + id="tspan3903-4-1-7" + y="415.91406" + x="157.29335" + sodipodi:role="line">App C - ring</tspan></text> + </g> + </g> + </g> + <path + style="fill:none;stroke:#00c800;stroke-width:1.32761669;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3.4000001;stroke-opacity:1;stroke-dasharray:1.32761664, 1.32761664;stroke-dashoffset:0;marker-start:url(#marker3336);marker-mid:none;marker-end:url(#Arrow1Mend-597-8)" + d="m 168.54117,516.87256 c 94.74872,0 94.74872,0 94.74872,0" + id="path4182" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#00c800;stroke-width:1.32761669;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3.4000001;stroke-opacity:1;stroke-dasharray:1.32761664, 1.32761664;stroke-dashoffset:0;marker-start:url(#marker3336);marker-mid:none;marker-end:url(#Arrow1Mend-597-8)" + d="m 169.01886,550.31081 c 94.74872,0 94.74872,0 94.74872,0" + id="path4182-3" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#00ed00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.91891892;stroke-dasharray:6, 1;stroke-dashoffset:0;marker-start:url(#marker3336-8);marker-mid:none;marker-end:url(#Arrow1Mend-597-8-5)" + d="m 390.74978,523.08253 62.0996,0 0.95537,134.23068 -24.83983,0" + id="path3159" + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="371.70807" + y="551.9433" + id="text7396-0"><tspan + sodipodi:role="line" + id="tspan7398-9" + x="371.70807" + y="551.9433">If cache empty get from ring</tspan><tspan + sodipodi:role="line" + x="371.70807" + y="564.4433" + id="tspan6215">if cache full move to ring</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/multi_process_memory.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/multi_process_memory.svg new file mode 100644 index 000000000..f97750930 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/multi_process_memory.svg @@ -0,0 +1,494 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2011 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="964.6286" + height="712.48572" + id="svg2" + version="1.1" + inkscape:version="0.91 r13725" + sodipodi:docname="multi_process_memory.svg"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend" + style="overflow:visible"> + <path + id="path4444" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-9" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4444-5" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-3" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4444-1" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-33" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4444-4" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-1" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4444-3" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-7" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4444-42" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-79" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4444-31" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.49497475" + inkscape:cx="423.04622" + inkscape:cy="21.821827" + inkscape:document-units="px" + inkscape:current-layer="layer2" + showgrid="false" + inkscape:window-width="833" + inkscape:window-height="1860" + inkscape:window-x="0" + inkscape:window-y="19" + inkscape:window-maximized="0" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="Boxes" + style="display:inline" + transform="translate(-6.971426,-3.4491554)"> + <rect + style="fill:#000000;fill-opacity:0;stroke:#4f81bd;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect3766" + width="651.46539" + height="675.75104" + x="8.5530262" + y="5.0307555" /> + <rect + style="fill:none;stroke:#9bbb59;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect3766-1" + width="689.95074" + height="675.66498" + x="276.897" + y="35.160461" /> + <rect + style="fill:#4f81bd;fill-opacity:1;stroke:#385d8a;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect3766-7" + width="291.5658" + height="353.70859" + x="305.64566" + y="302.12341" /> + <rect + style="fill:#4f81bd;fill-opacity:1;stroke:#385d8a;stroke-width:1.15872633;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect3766-7-4" + width="291.97849" + height="52.692719" + x="306.15363" + y="154.41705" /> + <rect + style="fill:#4f81bd;fill-opacity:1;stroke:#385d8a;stroke-width:1.15872633;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect3766-7-4-0" + width="291.97849" + height="52.692719" + x="306.86792" + y="82.988503" /> + <rect + style="display:inline;fill:#f79646;fill-opacity:1;stroke:#b66d31;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect3766-7-4-0-9" + width="204.64998" + height="98.971535" + x="721.32574" + y="222.98723" + inkscape:transform-center-x="43.055764" + inkscape:transform-center-y="-77.814359" /> + <rect + style="display:inline;fill:#f79646;fill-opacity:1;stroke:#b66d31;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect3766-7-4-0-9-4" + width="204.64998" + height="98.971535" + x="721.24646" + y="434.84909" + inkscape:transform-center-x="43.055764" + inkscape:transform-center-y="-77.814359" /> + <rect + style="display:inline;fill:#f79646;fill-opacity:1;stroke:#b66d31;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect3766-7-4-0-9-4-8" + width="204.64998" + height="98.971535" + x="47.675011" + y="416.99194" + inkscape:transform-center-x="43.055764" + inkscape:transform-center-y="-77.814359" /> + <rect + style="display:inline;fill:#f79646;fill-opacity:1;stroke:#b66d31;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect3766-7-4-0-9-4-82" + width="204.64998" + height="98.971535" + x="49.10358" + y="231.27766" + inkscape:transform-center-x="43.055764" + inkscape:transform-center-y="-77.814359" /> + </g> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="greenBox" + style="display:inline" + transform="translate(-6.971426,-3.4491554)" /> + <g + inkscape:groupmode="layer" + id="layer4" + inkscape:label="text" + style="display:inline" + transform="translate(-6.971426,-3.4491554)"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" + x="21.428572" + y="40.763428" + id="text4017" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4019" + x="21.428572" + y="40.763428" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;writing-mode:lr;text-anchor:start">Primary Process</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" + x="721.35742" + y="74.058273" + id="text4017-1" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="721.35742" + y="74.058273" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start" + id="tspan4042">Secondary Process</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none" + x="345.56345" + y="118.94552" + id="text4017-1-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="345.56345" + y="118.94552" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" + id="tspan4042-2">struct rte_config</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none" + x="329.29858" + y="190.7099" + id="text4017-1-5-7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="329.29858" + y="190.7099" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" + id="tspan4042-2-6">struct hugepage[]</tspan></text> + <g + id="g3397" + transform="translate(-7.9908447,0)"> + <rect + inkscape:transform-center-y="-28.646778" + inkscape:transform-center-x="45.999213" + y="315.75287" + x="350.09912" + height="36.435623" + width="218.64056" + id="rect3766-7-4-0-9-4-82-4" + style="display:inline;fill:#9bbb59;fill-opacity:1;stroke:#71893f;stroke-width:1.88143289;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text4017-1-5-7-1" + y="343.07202" + x="385.94675" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none" + xml:space="preserve"><tspan + id="tspan4042-2-6-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" + y="343.07202" + x="385.94675" + sodipodi:role="line">IPC Queue</tspan></text> + </g> + <g + id="g3403" + transform="translate(-8.3046417,0)"> + <rect + inkscape:transform-center-y="-27.55431" + inkscape:transform-center-x="45.857146" + y="361.35611" + x="350.75052" + height="35.046124" + width="217.96536" + id="rect3766-7-4-0-9-4-82-4-5" + style="display:inline;fill:#9bbb59;fill-opacity:1;stroke:#71893f;stroke-width:1.84235787;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text4017-1-5-7-1-2" + y="387.84317" + x="386.26056" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none" + xml:space="preserve"><tspan + id="tspan4042-2-6-4-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" + y="387.84317" + x="386.26056" + sodipodi:role="line">IPC Queue</tspan></text> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none" + x="450.79965" + y="453.50308" + id="text4017-1-5-7-1-22" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="450.79965" + y="453.50308" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1" + id="tspan4042-2-6-4-1">Hugepage</tspan><tspan + sodipodi:role="line" + x="450.79965" + y="488.50308" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1" + id="tspan4139">DPDK</tspan><tspan + sodipodi:role="line" + x="450.79965" + y="523.50305" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1" + id="tspan4141">Memory</tspan></text> + <g + id="g3409" + transform="translate(2.9908447,0)"> + <rect + inkscape:transform-center-y="-50.045247" + inkscape:transform-center-x="44.976048" + y="558.2616" + x="341.54904" + height="63.65218" + width="213.77734" + id="rect3766-7-4-0-9-4-82-4-51" + style="display:inline;fill:#9bbb59;fill-opacity:1;stroke:#71893f;stroke-width:2.45893884;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text4017-1-5-7-1-2-6" + y="599.97522" + x="380.17404" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none" + xml:space="preserve"><tspan + id="tspan4042-2-6-4-3-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" + y="599.97522" + x="380.17404" + sodipodi:role="line">Mbuf Pool</tspan></text> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none" + x="725.76013" + y="282.91147" + id="text4017-1-5-7-1-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="725.76013" + y="282.91147" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" + id="tspan4042-2-6-4-7">Local Pointers</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none" + x="64.02623" + y="290.0835" + id="text4017-1-5-7-1-5-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="64.02623" + y="290.0835" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" + id="tspan4042-2-6-4-7-1">Local Pointers</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none" + x="75.720703" + y="476.9162" + id="text4017-1-5-7-1-5-8" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="75.720703" + y="476.9162" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" + id="tspan4042-2-6-4-7-9">Local Data</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none" + x="749.29218" + y="494.77335" + id="text4017-1-5-7-1-5-8-2" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="749.29218" + y="494.77335" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" + id="tspan4042-2-6-4-7-9-7">Local Data</tspan></text> + </g> + <g + inkscape:groupmode="layer" + id="layer5" + inkscape:label="arrows" + transform="translate(-6.971426,-3.4491554)" + sodipodi:insensitive="true"> + <path + style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow2Lend)" + d="m 722.25907,271.34707 c -80.8122,1.01015 -80.8122,0 -80.8122,0 l 0.25253,31.31473 -42.67894,1.01015" + id="path4237" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow2Lend)" + d="m 724.5894,294.4895 c -41.17107,0.51464 -73.99367,0 -73.99367,0 l 0.25253,31.31473 -49.49747,1.01015" + id="path4237-4" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow2Lend)" + d="m 725.10676,318.89425 c -39.40874,0.49261 -55.05332,0 -55.05332,0 l 0.25253,31.31473 -68.43783,1.01015" + id="path4237-4-2" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow2Lend)" + d="m 255.32974,281.15007 c 33.82,0.72002 33.82,0 33.82,0 l -0.10568,22.32053 17.8612,0.72002" + id="path4237-1" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow2Lend)" + d="m 255.32862,311.71187 c 32.37024,0.72064 32.37024,0 32.37024,0 l -0.10115,22.33983 17.09555,0.72065" + id="path4237-1-8" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow2Lend)" + d="m 255.19261,329.94717 c 4.60017,0 9.64181,0 9.64181,0 l -0.10115,22.33983 40.32906,0.21557" + id="path4237-1-8-7" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow2Lend)" + d="m 597.90147,108.2578 27.11283,0.22299 0.34379,138.10881 -173.59785,0.93728 -1.42451,53.57716" + id="path4237-1-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 599.273,179.67573 25.25381,0" + id="path5371" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/packet_distributor1.png b/src/spdk/dpdk/doc/guides/prog_guide/img/packet_distributor1.png Binary files differnew file mode 100644 index 000000000..da8d4447e --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/packet_distributor1.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/packet_distributor2.png b/src/spdk/dpdk/doc/guides/prog_guide/img/packet_distributor2.png Binary files differnew file mode 100644 index 000000000..6ab58a4e6 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/packet_distributor2.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/pipe_prefetch_sm.png b/src/spdk/dpdk/doc/guides/prog_guide/img/pipe_prefetch_sm.png Binary files differnew file mode 100644 index 000000000..983c7effa --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/pipe_prefetch_sm.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/pkt_drop_probability.png b/src/spdk/dpdk/doc/guides/prog_guide/img/pkt_drop_probability.png Binary files differnew file mode 100644 index 000000000..a3a9e99fd --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/pkt_drop_probability.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/pkt_flow_kni.png b/src/spdk/dpdk/doc/guides/prog_guide/img/pkt_flow_kni.png Binary files differnew file mode 100644 index 000000000..ab730bb4c --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/pkt_flow_kni.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/pkt_proc_pipeline_qos.png b/src/spdk/dpdk/doc/guides/prog_guide/img/pkt_proc_pipeline_qos.png Binary files differnew file mode 100644 index 000000000..3bc2e7bf2 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/pkt_proc_pipeline_qos.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/prefetch_pipeline.png b/src/spdk/dpdk/doc/guides/prog_guide/img/prefetch_pipeline.png Binary files differnew file mode 100644 index 000000000..dc4843c47 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/prefetch_pipeline.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/rcu_general_info.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/rcu_general_info.svg new file mode 100644 index 000000000..e7ca1dacb --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/rcu_general_info.svg @@ -0,0 +1,509 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export rcu_general_info.svg Page-1 --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2019 Arm Limited --> + +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="21.5in" height="16.5in" viewBox="0 0 1548 1188" + xml:space="preserve" color-interpolation-filters="sRGB" class="st21"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"> + <v:userDefs> + <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/> + <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/> + </v:userDefs> + </v:documentProperties> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:#92d050;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st2 {fill:#ff0000;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st3 {stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st4 {fill:#ffffff;font-family:Calibri;font-size:1.81435em;font-weight:bold} + .st5 {fill:#333e48;font-family:Century Gothic;font-size:1.81435em} + .st6 {fill:#000000;font-family:Calibri;font-size:1.99578em;font-weight:bold} + .st7 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.45071} + .st8 {fill:#000000;font-family:Century Gothic;font-size:1.75001em} + .st9 {font-size:1em} + .st10 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.90143} + .st11 {fill:#333e48;font-family:Calibri;font-size:2.11672em;font-weight:bold} + .st12 {stroke:#651beb;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.90143} + .st13 {stroke:#b31166;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.725356} + .st14 {fill:#000000;font-family:Century Gothic;font-size:1.99999em} + .st15 {fill:#feffff;font-family:Calibri;font-size:1.99999em;font-weight:bold} + .st16 {marker-end:url(#mrkr5-239);marker-start:url(#mrkr5-237);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:3} + .st17 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.54347826086957} + .st18 {marker-end:url(#mrkr5-248);marker-start:url(#mrkr5-246);stroke:#651beb;stroke-linecap:round;stroke-linejoin:round;stroke-width:3} + .st19 {fill:#651beb;fill-opacity:1;stroke:#651beb;stroke-opacity:1;stroke-width:0.67567567567568} + .st20 {marker-end:url(#mrkr5-239);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:3} + .st21 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend5"> + <path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/> + </g> + <marker id="mrkr5-237" class="st17" v:arrowType="5" v:arrowSize="2" v:setback="3.1" refX="3.1" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(1.84) "/> + </marker> + <marker id="mrkr5-239" class="st17" v:arrowType="5" v:arrowSize="2" v:setback="3.22" refX="-3.22" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-1.84,-1.84) "/> + </marker> + <marker id="mrkr5-246" class="st19" v:arrowType="5" v:arrowSize="0" v:setback="2.47" refX="2.47" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(1.48) "/> + </marker> + <marker id="mrkr5-248" class="st19" v:arrowType="5" v:arrowSize="0" v:setback="2.59" refX="-2.59" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend5" transform="scale(-1.48,-1.48) "/> + </marker> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <v:userDefs> + <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/> + </v:userDefs> + <title>Page-1</title> + <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/> + <v:layer v:name="Connector" v:index="0"/> + <g id="shape3-1" v:mID="3" v:groupContext="shape" transform="translate(327.227,-946.908)"> + <title>Sheet.3</title> + <path d="M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L124.27 1132.94 C129.36 1132.94 133.44 1137.08 133.44 1142.11 + L133.44 1178.82 C133.44 1183.92 129.36 1188 124.27 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11 + Z" class="st1"/> + </g> + <g id="shape4-3" v:mID="4" v:groupContext="shape" transform="translate(460.665,-944.869)"> + <title>Sheet.4</title> + <path d="M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L141.59 1132.94 C146.68 1132.94 150.75 1137.08 150.75 1142.11 + L150.75 1178.82 C150.75 1183.92 146.68 1188 141.59 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11 + Z" class="st2"/> + </g> + <g id="shape5-5" v:mID="5" v:groupContext="shape" transform="translate(519.302,-950.79)"> + <title>Sheet.5</title> + <desc>D1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="23.7162" cy="1169.64" width="47.44" height="36.7141"/> + <path d="M47.43 1151.29 L0 1151.29 L0 1188 L47.43 1188 L47.43 1151.29" class="st3"/> + <text x="11.34" y="1176.17" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>D1</text> </g> + <g id="shape6-9" v:mID="6" v:groupContext="shape" transform="translate(612.438,-944.869)"> + <title>Sheet.6</title> + <path d="M0 1141.6 C0 1136.82 3.88 1132.94 8.66 1132.94 L43.29 1132.94 C48.13 1132.94 51.95 1136.82 51.95 1141.6 L51.95 + 1179.33 C51.95 1184.18 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1184.18 0 1179.33 L0 1141.6 Z" + class="st1"/> + </g> + <g id="shape7-11" v:mID="7" v:groupContext="shape" transform="translate(664.388,-945.889)"> + <title>Sheet.7</title> + <path d="M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L141.59 1132.94 C146.68 1132.94 150.75 1137.08 150.75 1142.11 + L150.75 1178.82 C150.75 1183.92 146.68 1188 141.59 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11 + Z" class="st2"/> + </g> + <g id="shape8-13" v:mID="8" v:groupContext="shape" transform="translate(723.025,-951.494)"> + <title>Sheet.8</title> + <desc>D2</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="23.7162" cy="1169.64" width="47.44" height="36.7141"/> + <path d="M47.43 1151.29 L0 1151.29 L0 1188 L47.43 1188 L47.43 1151.29" class="st3"/> + <text x="11.34" y="1176.17" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>D2</text> </g> + <g id="shape9-17" v:mID="9" v:groupContext="shape" transform="translate(814.123,-945.889)"> + <title>Sheet.9</title> + <path d="M0 1141.6 C0 1136.82 3.88 1132.94 8.66 1132.94 L43.29 1132.94 C48.13 1132.94 51.95 1136.82 51.95 1141.6 L51.95 + 1179.33 C51.95 1184.18 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1184.18 0 1179.33 L0 1141.6 Z" + class="st1"/> + </g> + <g id="shape10-19" v:mID="10" v:groupContext="shape" transform="translate(27,-952.759)"> + <title>Sheet.10</title> + <desc>Reader Thread 1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="146.259" cy="1169.64" width="292.52" height="36.7136"/> + <path d="M292.52 1151.29 L0 1151.29 L0 1188 L292.52 1188 L292.52 1151.29" class="st3"/> + <text x="58.76" y="1176.17" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Reader Thread 1</text> </g> + <g id="shape11-23" v:mID="11" v:groupContext="shape" transform="translate(379.176,-863.295)"> + <title>Sheet.11</title> + <path d="M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L124.27 1132.94 C129.36 1132.94 133.44 1137.08 133.44 1142.11 + L133.44 1178.82 C133.44 1183.92 129.36 1188 124.27 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11 + Z" class="st1"/> + </g> + <g id="shape12-25" v:mID="12" v:groupContext="shape" transform="translate(512.614,-861.255)"> + <title>Sheet.12</title> + <path d="M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L141.59 1132.94 C146.68 1132.94 150.75 1137.08 150.75 1142.11 + L150.75 1178.82 C150.75 1183.92 146.68 1188 141.59 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11 + Z" class="st2"/> + </g> + <g id="shape13-27" v:mID="13" v:groupContext="shape" transform="translate(561.284,-867.106)"> + <title>Sheet.13</title> + <desc>D1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="23.7162" cy="1169.64" width="47.44" height="36.7141"/> + <path d="M47.43 1151.29 L0 1151.29 L0 1188 L47.43 1188 L47.43 1151.29" class="st3"/> + <text x="11.34" y="1176.17" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>D1</text> </g> + <g id="shape14-31" v:mID="14" v:groupContext="shape" transform="translate(664.388,-861.255)"> + <title>Sheet.14</title> + <path d="M0 1141.6 C0 1136.82 3.88 1132.94 8.66 1132.94 L43.29 1132.94 C48.13 1132.94 51.95 1136.82 51.95 1141.6 L51.95 + 1179.33 C51.95 1184.18 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1184.18 0 1179.33 L0 1141.6 Z" + class="st1"/> + </g> + <g id="shape15-33" v:mID="15" v:groupContext="shape" transform="translate(716.337,-862.275)"> + <title>Sheet.15</title> + <path d="M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L141.59 1132.94 C146.68 1132.94 150.75 1137.08 150.75 1142.11 + L150.75 1178.82 C150.75 1183.92 146.68 1188 141.59 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11 + Z" class="st2"/> + </g> + <g id="shape16-35" v:mID="16" v:groupContext="shape" transform="translate(775.009,-867.81)"> + <title>Sheet.16</title> + <desc>D2</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="23.7162" cy="1169.64" width="47.44" height="36.7141"/> + <path d="M47.43 1151.29 L0 1151.29 L0 1188 L47.43 1188 L47.43 1151.29" class="st3"/> + <text x="11.34" y="1176.17" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>D2</text> </g> + <g id="shape17-39" v:mID="17" v:groupContext="shape" transform="translate(866.073,-862.275)"> + <title>Sheet.17</title> + <path d="M0 1141.6 C0 1136.82 3.88 1132.94 8.66 1132.94 L43.29 1132.94 C48.13 1132.94 51.95 1136.82 51.95 1141.6 L51.95 + 1179.33 C51.95 1184.18 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1184.18 0 1179.33 L0 1141.6 Z" + class="st1"/> + </g> + <g id="shape18-41" v:mID="18" v:groupContext="shape" transform="translate(143.348,-873.294)"> + <title>Sheet.18</title> + <desc>T 2</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="26.9796" cy="1169.64" width="53.96" height="36.7136"/> + <path d="M53.96 1151.29 L0 1151.29 L0 1188 L53.96 1188 L53.96 1151.29" class="st3"/> + <text x="13.3" y="1176.17" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T 2</text> </g> + <g id="shape19-45" v:mID="19" v:groupContext="shape" transform="translate(474.188,-777.642)"> + <title>Sheet.19</title> + <path d="M0 1143.01 C0 1138.04 4.07 1133.96 9.04 1133.96 L124.46 1133.96 C129.43 1133.96 133.44 1138.04 133.44 1143.01 + L133.44 1179.01 C133.44 1183.99 129.43 1188 124.46 1188 L9.04 1188 C4.07 1188 0 1183.99 0 1179.01 L0 1143.01 + Z" class="st1"/> + </g> + <g id="shape20-47" v:mID="20" v:groupContext="shape" transform="translate(608.645,-775.602)"> + <title>Sheet.20</title> + <path d="M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L141.59 1132.94 C146.68 1132.94 150.75 1137.08 150.75 1142.11 + L150.75 1178.82 C150.75 1183.92 146.68 1188 141.59 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11 + Z" class="st2"/> + </g> + <g id="shape21-49" v:mID="21" v:groupContext="shape" transform="translate(666.862,-781.311)"> + <title>Sheet.21</title> + <desc>D1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="23.7162" cy="1169.64" width="47.44" height="36.7141"/> + <path d="M47.43 1151.29 L0 1151.29 L0 1188 L47.43 1188 L47.43 1151.29" class="st3"/> + <text x="11.34" y="1176.17" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>D1</text> </g> + <g id="shape22-53" v:mID="22" v:groupContext="shape" transform="translate(760.418,-775.602)"> + <title>Sheet.22</title> + <path d="M0 1141.6 C0 1136.82 3.88 1132.94 8.66 1132.94 L43.29 1132.94 C48.13 1132.94 51.95 1136.82 51.95 1141.6 L51.95 + 1179.33 C51.95 1184.18 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1184.18 0 1179.33 L0 1141.6 Z" + class="st1"/> + </g> + <g id="shape23-55" v:mID="23" v:groupContext="shape" transform="translate(812.367,-776.622)"> + <title>Sheet.23</title> + <path d="M0 1142.11 C0 1137.08 4.14 1132.94 9.17 1132.94 L141.59 1132.94 C146.68 1132.94 150.75 1137.08 150.75 1142.11 + L150.75 1178.82 C150.75 1183.92 146.68 1188 141.59 1188 L9.17 1188 C4.14 1188 0 1183.92 0 1178.82 L0 1142.11 + Z" class="st2"/> + </g> + <g id="shape24-57" v:mID="24" v:groupContext="shape" transform="translate(870.584,-782.015)"> + <title>Sheet.24</title> + <desc>D2</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="23.7162" cy="1169.64" width="47.44" height="36.7141"/> + <path d="M47.43 1151.29 L0 1151.29 L0 1188 L47.43 1188 L47.43 1151.29" class="st3"/> + <text x="11.34" y="1176.17" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>D2</text> </g> + <g id="shape25-61" v:mID="25" v:groupContext="shape" transform="translate(962.103,-776.622)"> + <title>Sheet.25</title> + <path d="M0 1141.6 C0 1136.82 3.88 1132.94 8.66 1132.94 L43.29 1132.94 C48.13 1132.94 51.95 1136.82 51.95 1141.6 L51.95 + 1179.33 C51.95 1184.18 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1184.18 0 1179.33 L0 1141.6 Z" + class="st1"/> + </g> + <g id="shape26-63" v:mID="26" v:groupContext="shape" transform="translate(142.645,-787.5)"> + <title>Sheet.26</title> + <desc>T 3</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="26.9796" cy="1169.64" width="53.96" height="36.7136"/> + <path d="M53.96 1151.29 L0 1151.29 L0 1188 L53.96 1188 L53.96 1151.29" class="st3"/> + <text x="13.3" y="1176.17" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T 3</text> </g> + <g id="shape28-67" v:mID="28" v:groupContext="shape" transform="translate(882.826,-574.263)"> + <title>Sheet.28</title> + <desc>Time</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="45.9546" cy="1166.58" width="91.91" height="42.8314"/> + <path d="M91.91 1145.17 L0 1145.17 L0 1188 L91.91 1188 L91.91 1145.17" class="st3"/> + <text x="21.32" y="1173.77" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Time</text> </g> + <g id="shape29-71" v:mID="29" v:groupContext="shape" transform="translate(419.545,-660.119)"> + <title>Sheet.29</title> + <path d="M0 1145.17 L0 1188 L0 1145.17" class="st7"/> + </g> + <g id="shape30-74" v:mID="30" v:groupContext="shape" transform="translate(419.545,-684.783)"> + <title>Sheet.30</title> + <path d="M0 1188 L82.7 1187.36 L151.2 1172.07" class="st7"/> + </g> + <g id="shape31-77" v:mID="31" v:groupContext="shape" transform="translate(214.454,-663.095)"> + <title>Sheet.31</title> + <desc>Remove reference to entry1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="96.7728" cy="1169.45" width="193.55" height="37.1049"/> + <path d="M193.55 1150.9 L0 1150.9 L0 1188 L193.55 1188 L193.55 1150.9" class="st3"/> + <text x="2.39" y="1163.15" class="st8" v:langID="1033"><v:paragraph v:horizAlign="2"/><v:tabList/>Remove reference <tspan + x="104.08" dy="1.2em" class="st9">to entry1</tspan></text> </g> + <g id="shape33-82" v:mID="33" v:groupContext="shape" transform="translate(571.287,-681.326)"> + <title>Sheet.33</title> + <path d="M0 738.67 L0 1188" class="st10"/> + </g> + <g id="shape34-85" v:mID="34" v:groupContext="shape" transform="translate(515.013,-1130.65)"> + <title>Sheet.34</title> + <desc>Delete</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="60.7243" cy="1166.58" width="121.45" height="42.8314"/> + <path d="M121.45 1145.17 L0 1145.17 L0 1188 L121.45 1188 L121.45 1145.17" class="st3"/> + <text x="26.02" y="1174.2" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Delete</text> </g> + <g id="shape35-89" v:mID="35" v:groupContext="shape" transform="translate(434.372,-1096.8)"> + <title>Sheet.35</title> + <path d="M0 1154.35 L0 1188 L0 1154.35" class="st7"/> + </g> + <g id="shape36-92" v:mID="36" v:groupContext="shape" transform="translate(434.372,-1100.37)"> + <title>Sheet.36</title> + <path d="M0 1171.88 L84.54 1171.24 L136.43 1188" class="st7"/> + </g> + <g id="shape37-95" v:mID="37" v:groupContext="shape" transform="translate(193.5,-1103.76)"> + <title>Sheet.37</title> + <desc>Delete entry1 from D1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="114.75" cy="1175.76" width="229.5" height="24.4771"/> + <path d="M229.5 1163.52 L0 1163.52 L0 1188 L229.5 1188 L229.5 1163.52" class="st3"/> + <text x="3.88" y="1182.06" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Delete entry1 from D1</text> </g> + <g id="shape38-99" v:mID="38" v:groupContext="shape" transform="translate(714.3,-675.425)"> + <title>Sheet.38</title> + <path d="M0 732.77 L0 1188" class="st10"/> + </g> + <g id="shape39-102" v:mID="39" v:groupContext="shape" transform="translate(795.979,-637.904)"> + <title>Sheet.39</title> + <path d="M0 1112.54 L0 1188 L0 1112.54" class="st7"/> + </g> + <g id="shape40-105" v:mID="40" v:groupContext="shape" transform="translate(716.782,-675.425)"> + <title>Sheet.40</title> + <path d="M79.2 1188 L52.71 1187.94 L0 1147.21" class="st7"/> + </g> + <g id="shape41-108" v:mID="41" v:groupContext="shape" transform="translate(803.572,-639.285)"> + <title>Sheet.41</title> + <desc>Free memory for entries1 and 2 after every reader has gone th...</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="172.421" cy="1152.51" width="344.85" height="70.9752"/> + <path d="M344.84 1117.02 L0 1117.02 L0 1188 L344.84 1188 L344.84 1117.02" class="st3"/> + <text x="0" y="1133.61" class="st8" v:langID="1033"><v:paragraph/><v:tabList/>Free memory for entries1 and 2 <tspan + x="0" dy="1.2em" class="st9">after every reader has gone </tspan><tspan x="0" dy="1.2em" class="st9">through at least 1 quiescent state </tspan> </text> </g> + <g id="shape46-114" v:mID="46" v:groupContext="shape" transform="translate(680.801,-1130.65)"> + <title>Sheet.46</title> + <desc>Free</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="42.0169" cy="1166.58" width="84.04" height="42.8314"/> + <path d="M84.03 1145.17 L0 1145.17 L0 1188 L84.03 1188 L84.03 1145.17" class="st3"/> + <text x="18.89" y="1174.2" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Free</text> </g> + <g id="shape48-118" v:mID="48" v:groupContext="shape" transform="translate(811.005,-1110.05)"> + <title>Sheet.48</title> + <path d="M0 1145.17 L0 1188 L0 1145.17" class="st7"/> + </g> + <g id="shape49-121" v:mID="49" v:groupContext="shape" transform="translate(658.61,-1083.99)"> + <title>Sheet.49</title> + <path d="M153.05 1149.63 L113.7 1149.57 L0 1188" class="st7"/> + </g> + <g id="shape50-124" v:mID="50" v:groupContext="shape" transform="translate(798.359,-1110.46)"> + <title>Sheet.50</title> + <desc>Grace Period</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="107.799" cy="1167.81" width="215.6" height="40.3845"/> + <path d="M215.6 1147.62 L0 1147.62 L0 1188 L215.6 1188 L215.6 1147.62" class="st3"/> + <text x="43.79" y="1174.99" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Grace Period</text> </g> + <g id="shape51-128" v:mID="51" v:groupContext="shape" transform="translate(599.196,-662.779)"> + <title>Sheet.51</title> + <path d="M0 732.77 L0 1188" class="st12"/> + </g> + <g id="shape52-131" v:mID="52" v:groupContext="shape" transform="translate(464.931,-1052.95)"> + <title>Sheet.52</title> + <path d="M0 1154.35 L0 1188 L0 1154.35" class="st7"/> + </g> + <g id="shape53-134" v:mID="53" v:groupContext="shape" transform="translate(464.931,-1056.52)"> + <title>Sheet.53</title> + <path d="M0 1171.88 L84.54 1171.24 L136.43 1188" class="st7"/> + </g> + <g id="shape54-137" v:mID="54" v:groupContext="shape" transform="translate(225,-1058.76)"> + <title>Sheet.54</title> + <desc>Delete entry2 from D1</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="114.75" cy="1175.76" width="229.5" height="24.4771"/> + <path d="M229.5 1163.52 L0 1163.52 L0 1188 L229.5 1188 L229.5 1163.52" class="st3"/> + <text x="3.88" y="1182.06" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Delete entry2 from D1</text> </g> + <g id="shape56-141" v:mID="56" v:groupContext="shape" transform="translate(711.244,-662.779)"> + <title>Sheet.56</title> + <path d="M0 732.77 L0 1188" class="st12"/> + </g> + <g id="shape57-144" v:mID="57" v:groupContext="shape" transform="translate(664.897,-1045.31)"> + <title>Sheet.57</title> + <path d="M-0 1188 L146.76 1112.94" class="st13"/> + </g> + <g id="shape58-147" v:mID="58" v:groupContext="shape" transform="translate(619.059,-848.701)"> + <title>Sheet.58</title> + <path d="M432.2 1184.24 L-0 1188" class="st7"/> + </g> + <g id="shape59-150" v:mID="59" v:groupContext="shape" transform="translate(1038.62,-837.364)"> + <title>Sheet.59</title> + <desc>Critical sections</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="130" cy="1167.81" width="260.01" height="40.3845"/> + <path d="M260 1147.62 L0 1147.62 L0 1188 L260 1188 L260 1147.62" class="st3"/> + <text x="52.25" y="1174.99" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Critical sections</text> </g> + <g id="shape60-154" v:mID="60" v:groupContext="shape" transform="translate(621.606,-848.828)"> + <title>Sheet.60</title> + <path d="M0 1173.53 L0 1188" class="st7"/> + </g> + <g id="shape61-157" v:mID="61" v:groupContext="shape" transform="translate(824.31,-849.848)"> + <title>Sheet.61</title> + <path d="M0 1173.53 L0 1188" class="st7"/> + </g> + <g id="shape62-160" v:mID="62" v:groupContext="shape" transform="translate(345.944,-933.143)"> + <title>Sheet.62</title> + <path d="M705.32 1188 L0 1187.43" class="st7"/> + </g> + <g id="shape63-163" v:mID="63" v:groupContext="shape" transform="translate(1038.62,-915.684)"> + <title>Sheet.63</title> + <desc>Quiescent states</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="137.691" cy="1167.81" width="275.39" height="40.3845"/> + <path d="M275.38 1147.62 L0 1147.62 L0 1188 L275.38 1188 L275.38 1147.62" class="st3"/> + <text x="55.18" y="1174.99" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Quiescent states</text> </g> + <g id="shape64-167" v:mID="64" v:groupContext="shape" transform="translate(346.581,-932.442)"> + <title>Sheet.64</title> + <path d="M0 1173.53 L0 1188" class="st7"/> + </g> + <g id="shape65-170" v:mID="65" v:groupContext="shape" transform="translate(621.606,-933.461)"> + <title>Sheet.65</title> + <path d="M0 1173.53 L0 1188" class="st7"/> + </g> + <g id="shape66-173" v:mID="66" v:groupContext="shape" transform="translate(856.905,-934.481)"> + <title>Sheet.66</title> + <path d="M0 1173.53 L0 1188" class="st7"/> + </g> + <g id="shape67-176" v:mID="67" v:groupContext="shape" transform="translate(472.82,-756.389)"> + <title>Sheet.67</title> + <path d="M578.44 1188 L0 1187.43" class="st7"/> + </g> + <g id="shape68-179" v:mID="68" v:groupContext="shape" transform="translate(473.456,-755.688)"> + <title>Sheet.68</title> + <path d="M0 1173.53 L0 1188" class="st7"/> + </g> + <g id="shape69-182" v:mID="69" v:groupContext="shape" transform="translate(1016.87,-757.728)"> + <title>Sheet.69</title> + <path d="M0 1173.53 L0 1188" class="st7"/> + </g> + <g id="shape70-185" v:mID="70" v:groupContext="shape" transform="translate(1060.04,-738.651)"> + <title>Sheet.70</title> + <desc>while(1) loop</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="96.7728" cy="1167.81" width="193.55" height="40.3845"/> + <path d="M193.55 1147.62 L0 1147.62 L0 1188 L193.55 1188 L193.55 1147.62" class="st3"/> + <text x="31.03" y="1174.99" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>while(1) loop</text> </g> + <g id="shape71-189" v:mID="71" v:groupContext="shape" transform="translate(190.02,-464.886)"> + <title>Sheet.71</title> + <path d="M0 1151.91 C0 1148.19 3.88 1145.17 8.66 1145.17 L43.29 1145.17 C48.13 1145.17 51.95 1148.19 51.95 1151.91 L51.95 + 1181.26 C51.95 1185.03 48.13 1188 43.29 1188 L8.66 1188 C3.88 1188 0 1185.03 0 1181.26 L0 1151.91 Z" + class="st1"/> + </g> + <g id="shape72-191" v:mID="72" v:groupContext="shape" transform="translate(259.003,-466.895)"> + <title>Sheet.72</title> + <desc>Reader thread is not accessing any shared data structure. i.e...</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="344.967" cy="1169.45" width="689.94" height="37.1049"/> + <path d="M689.93 1150.9 L0 1150.9 L0 1188 L689.93 1188 L689.93 1150.9" class="st3"/> + <text x="0" y="1162.25" class="st14" v:langID="1033"><v:paragraph/><v:tabList/>Reader thread is not accessing any shared data structure.<v:newlineChar/><tspan + x="0" dy="1.2em" class="st9">i.e. non critical section or quiescent state.</tspan></text> </g> + <g id="shape73-196" v:mID="73" v:groupContext="shape" transform="translate(190.02,-389.169)"> + <title>Sheet.73</title> + <desc>Dx</desc> + <v:textBlock v:margins="rect(4,4,4,4)"/> + <v:textRect cx="25.9746" cy="1166.58" width="51.95" height="42.8314"/> + <path d="M0 1152.31 C0 1148.39 1.43 1145.17 3.16 1145.17 L48.79 1145.17 C50.55 1145.17 51.95 1148.39 51.95 1152.31 L51.95 + 1180.86 C51.95 1184.83 50.55 1188 48.79 1188 L3.16 1188 C1.43 1188 0 1184.83 0 1180.86 L0 1152.31 Z" + class="st2"/> + <text x="12.9" y="1173.78" class="st15" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Dx</text> </g> + <g id="shape74-199" v:mID="74" v:groupContext="shape" transform="translate(259.003,-388.777)"> + <title>Sheet.74</title> + <desc>Reader thread is accessing the shared data structure Dx. i.e....</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="344.967" cy="1169.45" width="689.94" height="37.1049"/> + <path d="M689.93 1150.9 L0 1150.9 L0 1188 L689.93 1188 L689.93 1150.9" class="st3"/> + <text x="0" y="1162.25" class="st14" v:langID="1033"><v:paragraph/><v:tabList/>Reader thread is accessing the shared data structure Dx.<v:newlineChar/><tspan + x="0" dy="1.2em" class="st9">i.e. critical section.</tspan></text> </g> + <g id="shape75-204" v:mID="75" v:groupContext="shape" transform="translate(289.017,-301.151)"> + <title>Sheet.75</title> + <desc>Point in time when the reference to the entry is removed usin...</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="332.491" cy="1160.47" width="664.99" height="55.0626"/> + <path d="M664.98 1132.94 L0 1132.94 L0 1188 L664.98 1188 L664.98 1132.94" class="st3"/> + <text x="0" y="1153.27" class="st14" v:langID="1033"><v:paragraph/><v:tabList/>Point in time when the reference to the entry is removed <tspan + x="0" dy="1.2em" class="st9">using an atomic operation.</tspan></text> </g> + <g id="shape76-209" v:mID="76" v:groupContext="shape" transform="translate(177.543,-315.596)"> + <title>Sheet.76</title> + <desc>Delete</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="45.9546" cy="1166.58" width="91.91" height="42.8314"/> + <path d="M91.91 1145.17 L0 1145.17 L0 1188 L91.91 1188 L91.91 1145.17" class="st3"/> + <text x="11.25" y="1174.2" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Delete</text> </g> + <g id="shape77-213" v:mID="77" v:groupContext="shape" transform="translate(288,-239.327)"> + <title>Sheet.77</title> + <desc>Point in time when the writer can free the deleted entry.</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="328.5" cy="1167.81" width="657" height="40.3845"/> + <path d="M657 1147.62 L0 1147.62 L0 1188 L657 1188 L657 1147.62" class="st3"/> + <text x="0" y="1175.01" class="st14" v:langID="1033"><v:paragraph/><v:tabList/>Point in time when the writer can free the deleted entry.</text> </g> + <g id="shape78-217" v:mID="78" v:groupContext="shape" transform="translate(177.543,-240.744)"> + <title>Sheet.78</title> + <desc>Free</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="34.3786" cy="1166.58" width="68.76" height="42.8314"/> + <path d="M68.76 1145.17 L0 1145.17 L0 1188 L68.76 1188 L68.76 1145.17" class="st3"/> + <text x="11.25" y="1174.2" class="st11" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Free</text> </g> + <g id="shape79-221" v:mID="79" v:groupContext="shape" transform="translate(289.228,-163.612)"> + <title>Sheet.79</title> + <desc>Time duration between Delete and Free, during which memory ca...</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="328.5" cy="1167.81" width="657" height="40.3845"/> + <path d="M657 1147.62 L0 1147.62 L0 1188 L657 1188 L657 1147.62" class="st3"/> + <text x="0" y="1160.61" class="st14" v:langID="1033"><v:paragraph/><v:tabList/>Time duration between Delete and Free, during which <tspan + x="0" dy="1.2em" class="st9">memory cannot be freed.</tspan></text> </g> + <g id="shape80-226" v:mID="80" v:groupContext="shape" transform="translate(187.999,-162)"> + <title>Sheet.80</title> + <desc>Grace Period</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="39.5985" cy="1166.58" width="79.2" height="42.8314"/> + <path d="M79.2 1145.17 L0 1145.17 L0 1188 L79.2 1188 L79.2 1145.17" class="st3"/> + <text x="0" y="1158.96" class="st11" v:langID="1033"><v:paragraph/><v:tabList/>Grace <tspan x="0" dy="1.2em" + class="st9">Period</tspan></text> </g> + <g id="shape83-231" v:mID="83" v:groupContext="shape" transform="translate(572.146,-1080.07)"> + <title>Sheet.83</title> + <path d="M9.3 1188 L9.66 1188 L132.49 1188" class="st16"/> + </g> + <g id="shape84-240" v:mID="84" v:groupContext="shape" transform="translate(599.196,-1042.14)"> + <title>Sheet.84</title> + <path d="M7.41 1188 L7.77 1188 L104.28 1188" class="st18"/> + </g> + <g id="shape85-249" v:mID="85" v:groupContext="shape" transform="translate(980.637,-595.338)"> + <title>Sheet.85</title> + <path d="M0 1188 L92.16 1188" class="st20"/> + </g> + <g id="shape86-254" v:mID="86" v:groupContext="shape" transform="translate(444.835,-603.428)"> + <title>Sheet.86</title> + <path d="M0 1145.17 L0 1188 L0 1145.17" class="st7"/> + </g> + <g id="shape87-257" v:mID="87" v:groupContext="shape" transform="translate(444.835,-637.489)"> + <title>Sheet.87</title> + <path d="M0 1188 L84.43 1186.61 L154.36 1153.31" class="st7"/> + </g> + <g id="shape88-260" v:mID="88" v:groupContext="shape" transform="translate(241.369,-607.028)"> + <title>Sheet.88</title> + <desc>Remove reference to entry2</desc> + <v:textBlock v:margins="rect(0,0,0,0)"/> + <v:textRect cx="96.7728" cy="1169.45" width="193.55" height="37.1049"/> + <path d="M193.55 1150.9 L0 1150.9 L0 1188 L193.55 1188 L193.55 1150.9" class="st3"/> + <text x="2.39" y="1163.15" class="st8" v:langID="1033"><v:paragraph v:horizAlign="2"/><v:tabList/>Remove reference <tspan + x="104.08" dy="1.2em" class="st9">to entry2</tspan></text> </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-dequeue1.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-dequeue1.svg new file mode 100644 index 000000000..6b4caf00e --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-dequeue1.svg @@ -0,0 +1,659 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="483.85715" + height="379.43784" + id="svg3388" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring-dequeue1.svg" + inkscape:export-filename="/home/matz/rapports/doc/intel/architecture_docs/ring-dequeue1.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200"> + <defs + id="defs3390"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4317" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3396" /> + <inkscape:perspective + id="perspective4180" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-69" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4767" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-7" + style="overflow:visible"> + <path + id="path4317-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4799" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4915" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4937" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4962" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4993" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-0" + style="overflow:visible"> + <path + id="path4317-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4999" + style="overflow:visible"> + <path + id="path5001" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5091" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path4317-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5121" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5710" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-6" + style="overflow:visible"> + <path + id="path4317-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5738" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3256" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-4" + style="overflow:visible"> + <path + id="path4317-78" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3262" + style="overflow:visible"> + <path + id="path3264" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3266" + style="overflow:visible"> + <path + id="path3268" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="227.73116" + inkscape:cy="153.16458" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1059" + inkscape:window-x="955" + inkscape:window-y="-6" + inkscape:window-maximized="0" + inkscape:snap-grids="false" + inkscape:snap-to-guides="true" + showguides="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0"> + <inkscape:grid + type="xygrid" + id="grid5162" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + originx="-163.07143px" + originy="-372.13525px" /> + </sodipodi:namedview> + <metadata + id="metadata3393"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-163.07143,-300.78909)"> + <rect + style="fill:#ffd080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4257" + width="439.41635" + height="58.588848" + x="186.87822" + y="463.44324" + rx="11.631636" + ry="11.631636" /> + <g + id="g4259" + transform="translate(108.51492,3.9469318)"> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="83.143028" + height="49.999996" + width="52.857113" + id="rect3398" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="137.00014" + height="49.999996" + width="52.857113" + id="rect3398-3" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="190.85725" + height="49.999996" + width="52.857113" + id="rect3398-1" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="244.71437" + height="49.999996" + width="52.857113" + id="rect3398-6" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="298.57147" + height="49.999996" + width="52.857113" + id="rect3398-2" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="352.42859" + height="49.999996" + width="52.857113" + id="rect3398-15" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="406.28571" + height="49.999996" + width="52.857113" + id="rect3398-4" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="460.14282" + height="49.999996" + width="52.857113" + id="rect3398-65" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="313.90488" + y="495.49646" + id="text4269" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271" + x="313.90488" + y="495.49646">obj1</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="368.95203" + y="495.49646" + id="text4269-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-5" + x="368.95203" + y="495.49646">obj2</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="422.99518" + y="495.49646" + id="text4269-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4" + x="422.99518" + y="495.49646">obj3</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 323.57143,578.07647 0,-42.14286" + id="path4309" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="289.85715" + y="589.505" + id="text4787" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789" + x="289.85715" + y="589.505">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="293.45334" + y="601.41034" + id="text4787-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0" + x="293.45334" + y="601.41034">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="507.2981" + y="600.81482" + id="text4787-7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8" + x="507.2981" + y="600.81482">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="508.75146" + y="587.72028" + id="text4787-3-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8" + x="508.75146" + y="587.72028">prod_tail</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889" + width="482.85715" + height="138.57147" + x="163.57143" + y="315.21933" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="174.28571" + y="310.93362" + id="text4891" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893" + x="174.28571" + y="310.93362">local variables</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889-8" + width="482.85715" + height="138.57147" + x="163.57143" + y="529.93365" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="170.89287" + y="680.09021" + id="text4891-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-3" + x="170.89287" + y="680.09021">structure state</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 540,575.57647 0,-42.14286" + id="path4309-4-3" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="476.46902" + y="495.12097" + id="text4269-5-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4-5" + x="476.46902" + y="495.12097">obj4</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 322.81905,406.5281 0,42.14286" + id="path4309-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 539.9619,406.5281 0,42.14286" + id="path4309-4-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="269.70093" + y="398.57574" + id="text4787-3-64" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9" + x="269.70093" + y="398.57574">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="509.25998" + y="398.57574" + id="text4787-7-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0" + x="509.25998" + y="398.57574">prod_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="361.71335" + y="398.57574" + id="text4787-3-6-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8" + x="361.71335" + y="398.57574">cons_next</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 378.28037,406.5281 0,42.14286" + id="path4309-4-9-9" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-dequeue2.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-dequeue2.svg new file mode 100644 index 000000000..54d860c1d --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-dequeue2.svg @@ -0,0 +1,622 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="484.05716" + height="383.1066" + id="svg3388" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring-dequeue2.svg"> + <defs + id="defs3390"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4317" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3396" /> + <inkscape:perspective + id="perspective4180" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-69" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4767" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-7" + style="overflow:visible"> + <path + id="path4317-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4799" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4915" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4937" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4962" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4993" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-0" + style="overflow:visible"> + <path + id="path4317-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4999" + style="overflow:visible"> + <path + id="path5001" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5091" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path4317-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5121" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5710" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-6" + style="overflow:visible"> + <path + id="path4317-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5738" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5826" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-63" + style="overflow:visible"> + <path + id="path4317-9" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="227.83116" + inkscape:cy="155.28411" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1002" + inkscape:window-x="376" + inkscape:window-y="19" + inkscape:window-maximized="0" + inkscape:snap-grids="false" + inkscape:snap-to-guides="true" + showguides="false" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1"> + <inkscape:grid + type="xygrid" + id="grid5162" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + originx="-162.97143px" + originy="-370.01572px" /> + </sodipodi:namedview> + <metadata + id="metadata3393"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-162.97143,-299.23987)"> + <rect + style="fill:#ffd080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4257" + width="439.41635" + height="58.588848" + x="186.87822" + y="463.44324" + rx="11.631636" + ry="11.631636" /> + <g + id="g4259" + transform="translate(108.51492,3.9469318)"> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="83.143028" + height="49.999996" + width="52.857113" + id="rect3398" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="137.00014" + height="49.999996" + width="52.857113" + id="rect3398-3" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="190.85725" + height="49.999996" + width="52.857113" + id="rect3398-1" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="244.71437" + height="49.999996" + width="52.857113" + id="rect3398-6" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="298.57147" + height="49.999996" + width="52.857113" + id="rect3398-2" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="352.42859" + height="49.999996" + width="52.857113" + id="rect3398-15" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="406.28571" + height="49.999996" + width="52.857113" + id="rect3398-4" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="460.14282" + height="49.999996" + width="52.857113" + id="rect3398-65" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="368.95203" + y="495.49646" + id="text4269-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-5" + x="368.95203" + y="495.49646">obj2</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="422.99518" + y="495.49646" + id="text4269-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4" + x="422.99518" + y="495.49646">obj3</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 323.57143,578.07647 0,-42.14286" + id="path4309" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="355.71429" + y="591.505" + id="text4787" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789" + x="355.71429" + y="591.505">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="276.16763" + y="591.41034" + id="text4787-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0" + x="276.16763" + y="591.41034">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="503.2981" + y="606.81482" + id="text4787-7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8" + x="503.2981" + y="606.81482">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="510.75146" + y="589.72028" + id="text4787-3-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8" + x="510.75146" + y="589.72028">prod_tail</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889" + width="482.85715" + height="138.57147" + x="163.57143" + y="315.21933" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="174.28571" + y="310.93362" + id="text4891" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893" + x="174.28571" + y="310.93362">local variables</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889-8" + width="482.85715" + height="138.57147" + x="163.57143" + y="529.93365" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="170.89287" + y="682.09021" + id="text4891-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-3" + x="170.89287" + y="682.09021">structure state</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 325.25296,407.43361 0,42.14286" + id="path4309-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 542.39581,407.43361 0,42.14286" + id="path4309-4-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="272.13486" + y="399.48123" + id="text4787-3-64" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9" + x="272.13486" + y="399.48123">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="511.69391" + y="399.48123" + id="text4787-7-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0" + x="511.69391" + y="399.48123">prod_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="364.14728" + y="399.48123" + id="text4787-3-6-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8" + x="364.14728" + y="399.48123">cons_next</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 380.71428,407.43361 0,42.14286" + id="path4309-4-9-9" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 540,575.57647 0,-42.14286" + id="path4309-4-3" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="476.46902" + y="495.12097" + id="text4269-5-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4-5" + x="476.46902" + y="495.12097">obj4</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 380.71429,577.71932 0,-42.14286" + id="path4309-4" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-dequeue3.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-dequeue3.svg new file mode 100644 index 000000000..e69775cb1 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-dequeue3.svg @@ -0,0 +1,617 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="484.05716" + height="383.63785" + id="svg3388" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring-dequeue3.svg"> + <defs + id="defs3390"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4317" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3396" /> + <inkscape:perspective + id="perspective4180" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-69" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4767" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-7" + style="overflow:visible"> + <path + id="path4317-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4799" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4915" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4937" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4962" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4993" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-0" + style="overflow:visible"> + <path + id="path4317-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4999" + style="overflow:visible"> + <path + id="path5001" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5091" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path4317-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5121" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5710" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-6" + style="overflow:visible"> + <path + id="path4317-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5738" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5826" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-63" + style="overflow:visible"> + <path + id="path4317-9" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="227.83116" + inkscape:cy="155.26458" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1002" + inkscape:window-x="433" + inkscape:window-y="26" + inkscape:window-maximized="0" + inkscape:snap-grids="false" + inkscape:snap-to-guides="true" + showguides="false" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1"> + <inkscape:grid + type="xygrid" + id="grid5162" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + originx="-162.97143px" + originy="-370.03525px" /> + </sodipodi:namedview> + <metadata + id="metadata3393"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-162.97143,-298.68909)"> + <rect + style="fill:#ffd080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4257" + width="439.41635" + height="58.588848" + x="186.87822" + y="463.44324" + rx="11.631636" + ry="11.631636" /> + <g + id="g4259" + transform="translate(108.51492,3.9469318)"> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="83.143028" + height="49.999996" + width="52.857113" + id="rect3398" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="137.00014" + height="49.999996" + width="52.857113" + id="rect3398-3" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="190.85725" + height="49.999996" + width="52.857113" + id="rect3398-1" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="244.71437" + height="49.999996" + width="52.857113" + id="rect3398-6" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="298.57147" + height="49.999996" + width="52.857113" + id="rect3398-2" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="352.42859" + height="49.999996" + width="52.857113" + id="rect3398-15" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="406.28571" + height="49.999996" + width="52.857113" + id="rect3398-4" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="460.14282" + height="49.999996" + width="52.857113" + id="rect3398-65" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="368.95203" + y="495.49646" + id="text4269-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-5" + x="368.95203" + y="495.49646">obj2</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="422.99518" + y="495.49646" + id="text4269-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4" + x="422.99518" + y="495.49646">obj3</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="345.71429" + y="589.505" + id="text4787" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789" + x="345.71429" + y="589.505">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="345.73907" + y="601.41034" + id="text4787-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0" + x="345.73907" + y="601.41034">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="505.2981" + y="600.81482" + id="text4787-7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8" + x="505.2981" + y="600.81482">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="506.75146" + y="587.72028" + id="text4787-3-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8" + x="506.75146" + y="587.72028">prod_tail</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889" + width="482.85715" + height="138.57147" + x="163.57143" + y="315.21933" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="174.28571" + y="308.93362" + id="text4891" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893" + x="174.28571" + y="308.93362">local variables</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889-8" + width="482.85715" + height="138.57147" + x="163.57143" + y="529.93365" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="170.89287" + y="682.09021" + id="text4891-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-3" + x="170.89287" + y="682.09021">structure state</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 325.25296,407.43361 0,42.14286" + id="path4309-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 542.39581,407.43361 0,42.14286" + id="path4309-4-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="284.13486" + y="399.48123" + id="text4787-3-64" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9" + x="284.13486" + y="399.48123">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="513.69391" + y="399.48123" + id="text4787-7-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0" + x="513.69391" + y="399.48123">prod_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="370.14728" + y="399.48123" + id="text4787-3-6-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8" + x="370.14728" + y="399.48123">cons_next</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 380.71428,407.43361 0,42.14286" + id="path4309-4-9-9" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 540,575.57647 0,-42.14286" + id="path4309-4-3" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="476.46902" + y="495.12097" + id="text4269-5-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4-5" + x="476.46902" + y="495.12097">obj4</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 380.71429,577.71932 0,-42.14286" + id="path4309-4" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-enqueue1.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-enqueue1.svg new file mode 100644 index 000000000..ba8e6be40 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-enqueue1.svg @@ -0,0 +1,568 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="484.05716" + height="383.63785" + id="svg3388" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring-enqueue1.svg"> + <defs + id="defs3390"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4317" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3396" /> + <inkscape:perspective + id="perspective4180" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-69" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4767" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-7" + style="overflow:visible"> + <path + id="path4317-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4799" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4915" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4937" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4962" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4993" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-0" + style="overflow:visible"> + <path + id="path4317-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4999" + style="overflow:visible"> + <path + id="path5001" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5091" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path4317-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5121" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="227.83116" + inkscape:cy="155.26458" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1002" + inkscape:window-x="441" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:snap-grids="false" + inkscape:snap-to-guides="true" + showguides="false" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1"> + <inkscape:grid + type="xygrid" + id="grid5162" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + originx="-162.97143px" + originy="-370.03525px" /> + </sodipodi:namedview> + <metadata + id="metadata3393"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-162.97143,-298.68909)"> + <rect + style="fill:#ffd080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4257" + width="439.41635" + height="58.588848" + x="186.87822" + y="463.44324" + rx="11.631636" + ry="11.631636" /> + <g + id="g4259" + transform="translate(108.51492,3.9469318)"> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="83.143028" + height="49.999996" + width="52.857113" + id="rect3398" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="137.00014" + height="49.999996" + width="52.857113" + id="rect3398-3" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="190.85725" + height="49.999996" + width="52.857113" + id="rect3398-1" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="244.71437" + height="49.999996" + width="52.857113" + id="rect3398-6" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="298.57147" + height="49.999996" + width="52.857113" + id="rect3398-2" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="352.42859" + height="49.999996" + width="52.857113" + id="rect3398-15" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="406.28571" + height="49.999996" + width="52.857113" + id="rect3398-4" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="460.14282" + height="49.999996" + width="52.857113" + id="rect3398-65" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="313.90488" + y="495.49646" + id="text4269" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271" + x="313.90488" + y="495.49646">obj1</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="368.95203" + y="495.49646" + id="text4269-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-5" + x="368.95203" + y="495.49646">obj2</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="422.99518" + y="495.49646" + id="text4269-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4" + x="422.99518" + y="495.49646">obj3</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 323.57143,578.07647 0,-42.14286" + id="path4309" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 487.14286,575.21933 0,-42.14286" + id="path4309-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="289.85715" + y="589.505" + id="text4787" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789" + x="289.85715" + y="589.505">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="293.45334" + y="603.41034" + id="text4787-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0" + x="293.45334" + y="603.41034">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="453.5838" + y="587.9577" + id="text4787-7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8" + x="453.5838" + y="587.9577">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="455.03714" + y="602.57739" + id="text4787-3-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8" + x="455.03714" + y="602.57739">prod_tail</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889" + width="482.85715" + height="138.57147" + x="163.57143" + y="315.21933" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="168.28571" + y="308.93362" + id="text4891" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893" + x="168.28571" + y="308.93362">local variables</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889-8" + width="482.85715" + height="138.57147" + x="163.57143" + y="529.93365" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="170.89287" + y="682.09021" + id="text4891-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-3" + x="170.89287" + y="682.09021">structure state</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 325.25296,407.43361 0,42.14286" + id="path4309-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 486.68152,407.43361 0,42.14286" + id="path4309-4-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="296.992" + y="399.48123" + id="text4787-3-64" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9" + x="296.992" + y="399.48123">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="438.26532" + y="399.48123" + id="text4787-7-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0" + x="438.26532" + y="399.48123">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="520.43298" + y="399.48123" + id="text4787-3-6-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8" + x="520.43298" + y="399.48123">prod_next</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 537.14285,407.43361 0,42.14286" + id="path4309-4-9-9" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-enqueue2.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-enqueue2.svg new file mode 100644 index 000000000..12367ec58 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-enqueue2.svg @@ -0,0 +1,612 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="484.05716" + height="383.63785" + id="svg3388" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring-enqueue2.svg"> + <defs + id="defs3390"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4317" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3396" /> + <inkscape:perspective + id="perspective4180" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-69" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4767" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-7" + style="overflow:visible"> + <path + id="path4317-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4799" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4915" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4937" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4962" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4993" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-0" + style="overflow:visible"> + <path + id="path4317-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4999" + style="overflow:visible"> + <path + id="path5001" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5091" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path4317-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5121" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5710" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-6" + style="overflow:visible"> + <path + id="path4317-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5738" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="227.83116" + inkscape:cy="155.26458" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1002" + inkscape:window-x="514" + inkscape:window-y="28" + inkscape:window-maximized="0" + inkscape:snap-grids="false" + inkscape:snap-to-guides="true" + showguides="false" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1"> + <inkscape:grid + type="xygrid" + id="grid5162" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + originx="-162.97143px" + originy="-370.03525px" /> + </sodipodi:namedview> + <metadata + id="metadata3393"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-162.97143,-298.68909)"> + <rect + style="fill:#ffd080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4257" + width="439.41635" + height="58.588848" + x="186.87822" + y="463.44324" + rx="11.631636" + ry="11.631636" /> + <g + id="g4259" + transform="translate(108.51492,3.9469318)"> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="83.143028" + height="49.999996" + width="52.857113" + id="rect3398" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="137.00014" + height="49.999996" + width="52.857113" + id="rect3398-3" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="190.85725" + height="49.999996" + width="52.857113" + id="rect3398-1" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="244.71437" + height="49.999996" + width="52.857113" + id="rect3398-6" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="298.57147" + height="49.999996" + width="52.857113" + id="rect3398-2" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="352.42859" + height="49.999996" + width="52.857113" + id="rect3398-15" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="406.28571" + height="49.999996" + width="52.857113" + id="rect3398-4" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="460.14282" + height="49.999996" + width="52.857113" + id="rect3398-65" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="313.90488" + y="495.49646" + id="text4269" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271" + x="313.90488" + y="495.49646">obj1</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="368.95203" + y="495.49646" + id="text4269-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-5" + x="368.95203" + y="495.49646">obj2</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="422.99518" + y="495.49646" + id="text4269-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4" + x="422.99518" + y="495.49646">obj3</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 323.57143,578.07647 0,-42.14286" + id="path4309" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 487.14286,575.21933 0,-42.14286" + id="path4309-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="289.85715" + y="589.505" + id="text4787" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789" + x="289.85715" + y="589.505">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="293.45334" + y="603.41034" + id="text4787-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0" + x="293.45334" + y="603.41034">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="521.01233" + y="587.9577" + id="text4787-7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8" + x="521.01233" + y="587.9577">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="449.75146" + y="587.72028" + id="text4787-3-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8" + x="449.75146" + y="587.72028">prod_tail</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889" + width="482.85715" + height="138.57147" + x="163.57143" + y="315.21933" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="170.28571" + y="308.93362" + id="text4891" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893" + x="170.28571" + y="308.93362">local variables</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889-8" + width="482.85715" + height="138.57147" + x="163.57143" + y="529.93365" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="170.89287" + y="682.09021" + id="text4891-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-3" + x="170.89287" + y="682.09021">structure state</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 325.25296,407.43361 0,42.14286" + id="path4309-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 486.68152,407.43361 0,42.14286" + id="path4309-4-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="296.992" + y="399.48123" + id="text4787-3-64" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9" + x="296.992" + y="399.48123">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="438.26532" + y="399.48123" + id="text4787-7-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0" + x="438.26532" + y="399.48123">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="520.43298" + y="399.48123" + id="text4787-3-6-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8" + x="520.43298" + y="399.48123">prod_next</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 537.14285,407.43361 0,42.14286" + id="path4309-4-9-9" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 540,575.57647 0,-42.14286" + id="path4309-4-3" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="476.46902" + y="495.12097" + id="text4269-5-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4-5" + x="476.46902" + y="495.12097">obj4</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-enqueue3.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-enqueue3.svg new file mode 100644 index 000000000..40c9ca8b1 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-enqueue3.svg @@ -0,0 +1,607 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="484.05716" + height="385.63785" + id="svg3388" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring-enqueue3.svg"> + <defs + id="defs3390"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4317" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3396" /> + <inkscape:perspective + id="perspective4180" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-69" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4767" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-7" + style="overflow:visible"> + <path + id="path4317-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4799" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4915" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4937" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4962" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4993" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-0" + style="overflow:visible"> + <path + id="path4317-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4999" + style="overflow:visible"> + <path + id="path5001" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5091" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path4317-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5121" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5710" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-6" + style="overflow:visible"> + <path + id="path4317-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5738" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="227.83116" + inkscape:cy="157.26458" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1002" + inkscape:window-x="293" + inkscape:window-y="16" + inkscape:window-maximized="0" + inkscape:snap-grids="false" + inkscape:snap-to-guides="true" + showguides="false" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1"> + <inkscape:grid + type="xygrid" + id="grid5162" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + originx="-162.97143px" + originy="-368.03525px" /> + </sodipodi:namedview> + <metadata + id="metadata3393"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-162.97143,-298.68909)"> + <rect + style="fill:#ffd080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4257" + width="439.41635" + height="58.588848" + x="186.87822" + y="463.44324" + rx="11.631636" + ry="11.631636" /> + <g + id="g4259" + transform="translate(108.51492,3.9469318)"> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="83.143028" + height="49.999996" + width="52.857113" + id="rect3398" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="137.00014" + height="49.999996" + width="52.857113" + id="rect3398-3" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="190.85725" + height="49.999996" + width="52.857113" + id="rect3398-1" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="244.71437" + height="49.999996" + width="52.857113" + id="rect3398-6" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="298.57147" + height="49.999996" + width="52.857113" + id="rect3398-2" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="352.42859" + height="49.999996" + width="52.857113" + id="rect3398-15" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="406.28571" + height="49.999996" + width="52.857113" + id="rect3398-4" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="460.14282" + height="49.999996" + width="52.857113" + id="rect3398-65" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="313.90488" + y="495.49646" + id="text4269" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271" + x="313.90488" + y="495.49646">obj1</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="368.95203" + y="495.49646" + id="text4269-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-5" + x="368.95203" + y="495.49646">obj2</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="422.99518" + y="495.49646" + id="text4269-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4" + x="422.99518" + y="495.49646">obj3</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 323.57143,578.07647 0,-42.14286" + id="path4309" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="289.85715" + y="589.505" + id="text4787" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789" + x="289.85715" + y="589.505">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="293.45334" + y="603.41034" + id="text4787-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0" + x="293.45334" + y="603.41034">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="507.2981" + y="602.81482" + id="text4787-7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8" + x="507.2981" + y="602.81482">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="512.75146" + y="587.72028" + id="text4787-3-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8" + x="512.75146" + y="587.72028">prod_tail</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889" + width="482.85715" + height="138.57147" + x="163.57143" + y="315.21933" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="172.28571" + y="308.93362" + id="text4891" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893" + x="172.28571" + y="308.93362">local variables</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889-8" + width="482.85715" + height="138.57147" + x="163.57143" + y="529.93365" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="170.89287" + y="684.09021" + id="text4891-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-3" + x="170.89287" + y="684.09021">structure state</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 325.25296,407.43361 0,42.14286" + id="path4309-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 486.68152,407.43361 0,42.14286" + id="path4309-4-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="296.992" + y="399.48123" + id="text4787-3-64" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9" + x="296.992" + y="399.48123">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="440.26532" + y="399.48123" + id="text4787-7-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0" + x="440.26532" + y="399.48123">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="522.43298" + y="399.48123" + id="text4787-3-6-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8" + x="522.43298" + y="399.48123">prod_next</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 537.14285,407.43361 0,42.14286" + id="path4309-4-9-9" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 540,575.57647 0,-42.14286" + id="path4309-4-3" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="476.46902" + y="495.12097" + id="text4269-5-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4-5" + x="476.46902" + y="495.12097">obj4</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-modulo1.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-modulo1.svg new file mode 100644 index 000000000..1166b078a --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-modulo1.svg @@ -0,0 +1,775 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010-2014 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="576.07806" + height="152.68279" + id="svg2" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring-modulo1.svg"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path3599" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path3593" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend" + style="overflow:visible"> + <path + id="path3614" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective10" /> + <inkscape:perspective + id="perspective4048" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4048-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4048-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4048-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4048-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4048-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4115" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4115-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4115-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-74" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-17" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-26" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4373" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4373-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4409" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4434" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4459" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4490" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5102" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5974" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart-3" + style="overflow:visible"> + <path + id="path3599-9" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + id="path3602" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="3.959798" + inkscape:cx="393.92211" + inkscape:cy="95.26088" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1424" + inkscape:window-height="1059" + inkscape:window-x="271" + inkscape:window-y="29" + inkscape:window-maximized="0" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-78.921385,-378.7493)"> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" + d="m 98.571429,407.3798 c 555.000001,0 555.000001,0 555.000001,0" + id="path2816" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.57143,401.6479 0,11.42857" + id="path4038" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 162.61904,401.6479 0,11.42857" + id="path4038-4" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 211.66667,401.6479 0,11.42857" + id="path4038-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 260.71427,401.6479 0,11.42857" + id="path4038-5" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 309.76191,401.6479 0,11.42857" + id="path4038-3" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 358.80952,401.6479 0,11.42857" + id="path4038-1" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 407.85712,401.6479 0,11.42857" + id="path4038-32" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 456.90477,401.6479 0,11.42857" + id="path4038-32-0" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 505.95238,401.6479 0,11.42857" + id="path4038-32-1" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 555,401.6479 0,11.42857" + id="path4038-32-5" + inkscape:connector-curvature="0" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147" + width="47.098743" + height="14.773863" + x="113.51569" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-4" + width="47.098743" + height="14.773863" + x="162.81586" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-6" + width="47.098743" + height="14.773863" + x="212.11604" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-69" + width="47.098743" + height="14.773863" + x="261.41623" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-7" + width="47.098743" + height="14.773863" + x="310.7164" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-5" + width="47.098743" + height="14.773863" + x="360.01657" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-54" + width="47.098743" + height="14.773863" + x="409.31677" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-43" + width="47.098743" + height="14.773863" + x="458.61694" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-78" + width="47.098743" + height="14.773863" + x="507.91714" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="110.10663" + y="397.88794" + id="text4234"><tspan + sodipodi:role="line" + id="tspan4236" + x="110.10663" + y="397.88794">0</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="146.47003" + y="397.88794" + id="text4234-6"><tspan + sodipodi:role="line" + id="tspan4236-8" + x="146.47003" + y="397.88794">16384</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="196.06828" + y="397.88794" + id="text4234-4"><tspan + sodipodi:role="line" + id="tspan4236-3" + x="196.06828" + y="397.88794">32768</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="245.73245" + y="397.88794" + id="text4234-49"><tspan + sodipodi:role="line" + id="tspan4236-2" + x="245.73245" + y="397.88794">49152</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="294.8107" + y="397.88794" + id="text4234-68"><tspan + sodipodi:role="line" + id="tspan4236-9" + x="294.8107" + y="397.88794">65536</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="306.93814" + y="386.27118" + id="text4234-66"><tspan + sodipodi:role="line" + id="tspan4236-4" + x="306.93814" + y="386.27118">0</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="503.41278" + y="386.27118" + id="text4234-2"><tspan + sodipodi:role="line" + id="tspan4236-72" + x="503.41278" + y="386.27118">0</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="343.9451" + y="397.88794" + id="text4234-6-1"><tspan + sodipodi:role="line" + id="tspan4236-8-5" + x="343.9451" + y="397.88794">16384</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="541.42017" + y="397.88794" + id="text4234-6-4"><tspan + sodipodi:role="line" + id="tspan4236-8-9" + x="541.42017" + y="397.88794">16384</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="393.54333" + y="397.88794" + id="text4234-4-0"><tspan + sodipodi:role="line" + id="tspan4236-3-9" + x="393.54333" + y="397.88794">32768</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="443.20752" + y="397.88794" + id="text4234-49-1"><tspan + sodipodi:role="line" + id="tspan4236-2-7" + x="443.20752" + y="397.88794">49152</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="492.28577" + y="397.88794" + id="text4234-68-7"><tspan + sodipodi:role="line" + id="tspan4236-9-1" + x="492.28577" + y="397.88794">65536</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="125.76399" + y="434.6539" + id="text4476"><tspan + sodipodi:role="line" + id="tspan4478" + x="125.76399" + y="434.6539">ring</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart)" + d="m 322.23865,441.72497 0,21.21321" + id="path4480" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart)" + d="m 346.9874,441.72497 0,21.21321" + id="path4480-1" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="315.1676" + y="473.50385" + id="text5070"><tspan + sodipodi:role="line" + id="tspan5072" + x="315.1676" + y="473.50385">ch</tspan><tspan + sodipodi:role="line" + x="315.1676" + y="486.00385" + id="tspan5074">ct</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="341.41125" + y="472.53461" + id="text5076"><tspan + sodipodi:role="line" + id="tspan5078" + x="341.41125" + y="472.53461">ph</tspan><tspan + sodipodi:role="line" + x="341.41125" + y="485.03461" + id="tspan5080">pt</tspan></text> + <rect + style="fill:#5a750a;fill-opacity:1;stroke:none" + id="rect5082" + width="24.95269" + height="13.550571" + x="322.15198" + y="424.93753" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="582.85803" + y="421.52191" + id="text5084"><tspan + sodipodi:role="line" + id="tspan5086" + x="582.85803" + y="421.52191">value for</tspan><tspan + sodipodi:role="line" + x="582.85803" + y="434.02191" + id="tspan5088">indexes</tspan><tspan + sodipodi:role="line" + x="582.85803" + y="446.52191" + id="tspan5090">(prod_head,</tspan><tspan + sodipodi:role="line" + x="582.85803" + y="459.02191" + id="tspan5092">prod_tail, ...)</tspan></text> + <rect + style="fill:#5a750a;fill-opacity:1;stroke:none" + id="rect5082-5" + width="24.95269" + height="13.550571" + x="404.71667" + y="492.80005" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="434.3656" + y="502.33414" + id="text5116"><tspan + sodipodi:role="line" + x="434.3656" + y="502.33414" + id="tspan5293">used entries in ring</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="78.791893" + y="466.47369" + id="text5261"><tspan + sodipodi:role="line" + id="tspan5263" + x="78.791893" + y="466.47369">size = 16384</tspan><tspan + sodipodi:role="line" + x="78.791893" + y="478.97369" + id="tspan5291">mask = 16383</tspan><tspan + sodipodi:role="line" + x="78.791893" + y="491.47369" + id="tspan5289">ph = pt = 14000</tspan><tspan + sodipodi:role="line" + x="78.791893" + y="503.97369" + id="tspan5265">ct = ch = 3000</tspan><tspan + sodipodi:role="line" + x="78.791893" + y="516.47369" + id="tspan5267">used_entries = (pt - ch) % 65536 = 11000</tspan><tspan + sodipodi:role="line" + x="78.791893" + y="528.97369" + id="tspan5287">free_entries = (mask + ct - ph) % 65536 = 5383</tspan></text> + <path + style="fill:#5a750a;fill-opacity:1;stroke:#fd0004;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" + d="m 324.78109,452.09355 20.16896,0" + id="path5384" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:4.97793007px;font-style:normal;font-weight:normal;fill:#ff0000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="323.23074" + y="458.94891" + id="text5962"><tspan + sodipodi:role="line" + id="tspan5964" + x="323.23074" + y="458.94891">used_entries</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-modulo2.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-modulo2.svg new file mode 100644 index 000000000..83cd41968 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-modulo2.svg @@ -0,0 +1,820 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="576.07806" + height="152.68279" + id="svg2" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring-modulo2.svg"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible"> + <path + id="path3602" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Sstart" + style="overflow:visible"> + <path + id="path3605" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.2,0,0,0.2,1.2,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path3599" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path3593" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend" + style="overflow:visible"> + <path + id="path3614" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective10" /> + <inkscape:perspective + id="perspective4048" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4048-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4048-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4048-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4048-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4048-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4115" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4115-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4115-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-74" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4157-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-8" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-17" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4246-26" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4373" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4373-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4409" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4434" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4459" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4490" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5102" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5326" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5361" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5361-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective6129" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.979899" + inkscape:cx="108.52304" + inkscape:cy="76.1401" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1424" + inkscape:window-height="1059" + inkscape:window-x="117" + inkscape:window-y="26" + inkscape:window-maximized="0" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-78.921385,-378.7493)"> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" + d="m 98.571429,407.3798 c 555.000001,0 555.000001,0 555.000001,0" + id="path2816" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 113.57143,401.6479 0,11.42857" + id="path4038" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 162.61904,401.6479 0,11.42857" + id="path4038-4" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 211.66667,401.6479 0,11.42857" + id="path4038-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 260.71427,401.6479 0,11.42857" + id="path4038-5" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 309.76191,401.6479 0,11.42857" + id="path4038-3" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 358.80952,401.6479 0,11.42857" + id="path4038-1" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 407.85712,401.6479 0,11.42857" + id="path4038-32" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 456.90477,401.6479 0,11.42857" + id="path4038-32-0" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 505.95238,401.6479 0,11.42857" + id="path4038-32-1" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 555,401.6479 0,11.42857" + id="path4038-32-5" + inkscape:connector-curvature="0" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147" + width="47.098743" + height="14.773863" + x="113.51569" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-4" + width="47.098743" + height="14.773863" + x="162.81586" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-6" + width="47.098743" + height="14.773863" + x="212.11604" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-69" + width="47.098743" + height="14.773863" + x="261.41623" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-7" + width="47.098743" + height="14.773863" + x="310.7164" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-5" + width="47.098743" + height="14.773863" + x="360.01657" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-54" + width="47.098743" + height="14.773863" + x="409.31677" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-43" + width="47.098743" + height="14.773863" + x="458.61694" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <rect + style="fill:#ffae0a;fill-opacity:1;stroke:#000000;stroke-width:1.14199996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4147-78" + width="47.098743" + height="14.773863" + x="507.91714" + y="424.23651" + rx="4.7096338" + ry="4.3015814" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="110.10663" + y="397.88794" + id="text4234"><tspan + sodipodi:role="line" + id="tspan4236" + x="110.10663" + y="397.88794">0</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="146.47003" + y="397.88794" + id="text4234-6"><tspan + sodipodi:role="line" + id="tspan4236-8" + x="146.47003" + y="397.88794">16384</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="196.06828" + y="397.88794" + id="text4234-4"><tspan + sodipodi:role="line" + id="tspan4236-3" + x="196.06828" + y="397.88794">32768</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="245.73245" + y="397.88794" + id="text4234-49"><tspan + sodipodi:role="line" + id="tspan4236-2" + x="245.73245" + y="397.88794">49152</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="294.8107" + y="397.88794" + id="text4234-68"><tspan + sodipodi:role="line" + id="tspan4236-9" + x="294.8107" + y="397.88794">65536</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="306.93814" + y="386.27118" + id="text4234-66"><tspan + sodipodi:role="line" + id="tspan4236-4" + x="306.93814" + y="386.27118">0</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="503.41278" + y="386.27118" + id="text4234-2"><tspan + sodipodi:role="line" + id="tspan4236-72" + x="503.41278" + y="386.27118">0</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="343.9451" + y="397.88794" + id="text4234-6-1"><tspan + sodipodi:role="line" + id="tspan4236-8-5" + x="343.9451" + y="397.88794">16384</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="541.42017" + y="397.88794" + id="text4234-6-4"><tspan + sodipodi:role="line" + id="tspan4236-8-9" + x="541.42017" + y="397.88794">16384</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="393.54333" + y="397.88794" + id="text4234-4-0"><tspan + sodipodi:role="line" + id="tspan4236-3-9" + x="393.54333" + y="397.88794">32768</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="443.20752" + y="397.88794" + id="text4234-49-1"><tspan + sodipodi:role="line" + id="tspan4236-2-7" + x="443.20752" + y="397.88794">49152</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="492.28577" + y="397.88794" + id="text4234-68-7"><tspan + sodipodi:role="line" + id="tspan4236-9-1" + x="492.28577" + y="397.88794">65536</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="125.76399" + y="434.6539" + id="text4476"><tspan + sodipodi:role="line" + id="tspan4478" + x="125.76399" + y="434.6539">ring</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart)" + d="m 291.64075,441.72497 0,21.21321" + id="path4480" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart)" + d="m 328.76387,441.72497 0,21.21321" + id="path4480-1" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="284.56973" + y="473.50385" + id="text5070"><tspan + sodipodi:role="line" + id="tspan5072" + x="284.56973" + y="473.50385">ch</tspan><tspan + sodipodi:role="line" + x="284.56973" + y="486.00385" + id="tspan5074">ct</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="323.18771" + y="472.53461" + id="text5076"><tspan + sodipodi:role="line" + id="tspan5078" + x="323.18771" + y="472.53461">ph</tspan><tspan + sodipodi:role="line" + x="323.18771" + y="485.03461" + id="tspan5080">pt</tspan></text> + <rect + style="fill:#5a750a;fill-opacity:1;stroke:none" + id="rect5082" + width="10.859776" + height="13.550571" + x="291.42346" + y="424.93753" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="582.85803" + y="421.52191" + id="text5084"><tspan + sodipodi:role="line" + id="tspan5086" + x="582.85803" + y="421.52191">value for</tspan><tspan + sodipodi:role="line" + x="582.85803" + y="434.02191" + id="tspan5088">indexes</tspan><tspan + sodipodi:role="line" + x="582.85803" + y="446.52191" + id="tspan5090">(prod_head,</tspan><tspan + sodipodi:role="line" + x="582.85803" + y="459.02191" + id="tspan5092">prod_tail, ...)</tspan></text> + <rect + style="fill:#5a750a;fill-opacity:1;stroke:none" + id="rect5082-5" + width="24.95269" + height="13.550571" + x="404.71667" + y="492.80005" /> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="434.3656" + y="502.33414" + id="text5116"><tspan + sodipodi:role="line" + x="434.3656" + y="502.33414" + id="tspan5293">used entries in ring</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="78.791893" + y="466.47369" + id="text5261"><tspan + sodipodi:role="line" + id="tspan5263" + x="78.791893" + y="466.47369">size = 16384</tspan><tspan + sodipodi:role="line" + x="78.791893" + y="478.97369" + id="tspan5291">mask = 16383</tspan><tspan + sodipodi:role="line" + x="78.791893" + y="491.47369" + id="tspan5289">ph = pt = 6000</tspan><tspan + sodipodi:role="line" + x="78.791893" + y="503.97369" + id="tspan5265">ct = ch = 59000</tspan><tspan + sodipodi:role="line" + x="78.791893" + y="516.47369" + id="tspan5267">used_entries = (pt - ch) % 65536 = 12536</tspan><tspan + sodipodi:role="line" + x="78.791893" + y="528.97369" + id="tspan5287">free_entries = (mask + ct - ph) % 65536 = 3847</tspan></text> + <rect + style="fill:#5a750a;fill-opacity:1;stroke:none" + id="rect5082-7" + width="15.608779" + height="13.550571" + x="310.98422" + y="424.93753" + rx="2.5021396" + ry="4" /> + <rect + style="fill:#5a750a;fill-opacity:1;stroke:none" + id="rect5082-3" + width="14.649387" + height="13.550571" + x="293.27341" + y="424.93753" + rx="2.2558498" + ry="2.2" /> + <rect + style="fill:#5a750a;fill-opacity:1;stroke:none" + id="rect5082-56" + width="13.128264" + height="13.550571" + x="315.93643" + y="424.93753" /> + <path + style="fill:#5a750a;fill-opacity:1;stroke:#fd0004;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)" + d="m 294.64286,452.71932 31.78571,0" + id="path5384" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:4.97793007px;font-style:normal;font-weight:normal;fill:#ff0000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="294.35522" + y="460.33231" + id="text5962"><tspan + sodipodi:role="line" + id="tspan5964" + x="294.35522" + y="460.33231">used_entries</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue1.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue1.svg new file mode 100644 index 000000000..3ba5abb62 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue1.svg @@ -0,0 +1,707 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="485.48575" + height="369.70761" + id="svg3388" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring-mp-enqueue1.svg"> + <defs + id="defs3390"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4317" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3396" /> + <inkscape:perspective + id="perspective4180" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-69" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4767" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-7" + style="overflow:visible"> + <path + id="path4317-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4799" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4915" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4937" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4962" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4993" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-0" + style="overflow:visible"> + <path + id="path4317-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4999" + style="overflow:visible"> + <path + id="path5001" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5091" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path4317-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5121" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3157" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3193" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3218" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-94" + style="overflow:visible"> + <path + id="path4317-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3224" + style="overflow:visible"> + <path + id="path3226" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3228" + style="overflow:visible"> + <path + id="path3230" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="227.83116" + inkscape:cy="157.26458" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1002" + inkscape:window-x="464" + inkscape:window-y="18" + inkscape:window-maximized="0" + inkscape:snap-grids="false" + inkscape:snap-to-guides="true" + showguides="false" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1"> + <inkscape:grid + type="xygrid" + id="grid5162" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + originx="-162.97143px" + originy="-368.03525px" /> + </sodipodi:namedview> + <metadata + id="metadata3393"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-162.97143,-314.61933)"> + <rect + style="fill:#ffd080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4257" + width="439.41635" + height="58.588848" + x="186.87822" + y="463.44324" + rx="11.631636" + ry="11.631636" /> + <g + id="g4259" + transform="translate(108.51492,3.9469318)"> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="83.143028" + height="49.999996" + width="52.857113" + id="rect3398" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="137.00014" + height="49.999996" + width="52.857113" + id="rect3398-3" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="190.85725" + height="49.999996" + width="52.857113" + id="rect3398-1" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="244.71437" + height="49.999996" + width="52.857113" + id="rect3398-6" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="298.57147" + height="49.999996" + width="52.857113" + id="rect3398-2" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="352.42859" + height="49.999996" + width="52.857113" + id="rect3398-15" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="406.28571" + height="49.999996" + width="52.857113" + id="rect3398-4" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="460.14282" + height="49.999996" + width="52.857113" + id="rect3398-65" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="313.90488" + y="495.49646" + id="text4269" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271" + x="313.90488" + y="495.49646">obj1</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="368.95203" + y="495.49646" + id="text4269-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-5" + x="368.95203" + y="495.49646">obj2</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="422.99518" + y="495.49646" + id="text4269-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4" + x="422.99518" + y="495.49646">obj3</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 323.57143,578.07647 0,-42.14286" + id="path4309" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 487.14286,575.21933 0,-42.14286" + id="path4309-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="289.85715" + y="589.505" + id="text4787" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789" + x="289.85715" + y="589.505">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="293.45334" + y="603.41034" + id="text4787-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0" + x="293.45334" + y="603.41034">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="453.5838" + y="587.9577" + id="text4787-7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8" + x="453.5838" + y="587.9577">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="455.03714" + y="602.57739" + id="text4787-3-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8" + x="455.03714" + y="602.57739">prod_tail</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889" + width="482.85718" + height="67.857185" + x="163.57143" + y="315.21933" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="174.28571" + y="326.93362" + id="text4891" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893" + x="174.28571" + y="326.93362">local variables </tspan><tspan + sodipodi:role="line" + x="174.28571" + y="344.43362" + id="tspan3698">core 2</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889-8" + width="482.85715" + height="138.57147" + x="163.57143" + y="529.93365" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="170.89287" + y="684.09021" + id="text4891-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-3" + x="170.89287" + y="684.09021">structure state</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 325.25296,407.43361 0,42.14286" + id="path4309-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 486.68152,407.43361 0,42.14286" + id="path4309-4-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="296.992" + y="399.48123" + id="text4787-3-64" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9" + x="296.992" + y="399.48123">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="438.26532" + y="399.48123" + id="text4787-7-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0" + x="438.26532" + y="399.48123">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="518.43298" + y="399.48123" + id="text4787-3-6-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8" + x="518.43298" + y="399.48123">prod_next</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 537.14285,407.43361 0,42.14286" + id="path4309-4-9-9" + inkscape:connector-curvature="0" /> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889-9" + width="482.85718" + height="69.285774" + x="165" + y="385.93359" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="174.65646" + y="398.23306" + id="text4891-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-1" + x="174.65646" + y="398.23306">local variables</tspan><tspan + sodipodi:role="line" + x="174.65646" + y="415.73306" + id="tspan3700">core 1</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 326.73097,334.53006 0,42.14286" + id="path4309-8-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 488.15953,334.53006 0,42.14286" + id="path4309-4-9-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="298.47" + y="326.57767" + id="text4787-3-64-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9-0" + x="298.47" + y="326.57767">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="439.74335" + y="326.57767" + id="text4787-7-5-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0-6" + x="439.74335" + y="326.57767">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="519.91101" + y="326.57767" + id="text4787-3-6-4-1" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8-0" + x="519.91101" + y="326.57767">prod_next</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 538.62086,334.53006 0,42.14286" + id="path4309-4-9-9-6" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue2.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue2.svg new file mode 100644 index 000000000..adc988378 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue2.svg @@ -0,0 +1,748 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="485.48575" + height="403.06647" + id="svg3388" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring-mp-enqueue2.svg"> + <defs + id="defs3390"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4317" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3396" /> + <inkscape:perspective + id="perspective4180" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-69" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4767" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-7" + style="overflow:visible"> + <path + id="path4317-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4799" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4915" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4937" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4962" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4993" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-0" + style="overflow:visible"> + <path + id="path4317-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4999" + style="overflow:visible"> + <path + id="path5001" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5091" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path4317-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5121" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3157" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3193" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3218" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-94" + style="overflow:visible"> + <path + id="path4317-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3224" + style="overflow:visible"> + <path + id="path3226" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3228" + style="overflow:visible"> + <path + id="path3230" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3334" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-3" + style="overflow:visible"> + <path + id="path4317-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="227.83116" + inkscape:cy="155.26458" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1002" + inkscape:window-x="336" + inkscape:window-y="21" + inkscape:window-maximized="0" + inkscape:snap-grids="false" + inkscape:snap-to-guides="true" + showguides="false" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1"> + <inkscape:grid + type="xygrid" + id="grid5162" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + originx="-162.97143px" + originy="-370.03525px" /> + </sodipodi:namedview> + <metadata + id="metadata3393"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-162.97143,-279.26047)"> + <rect + style="fill:#ffd080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4257" + width="439.41635" + height="58.588848" + x="186.87822" + y="463.44324" + rx="11.631636" + ry="11.631636" /> + <g + id="g4259" + transform="translate(108.51492,3.9469318)"> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="83.143028" + height="49.999996" + width="52.857113" + id="rect3398" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="137.00014" + height="49.999996" + width="52.857113" + id="rect3398-3" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="190.85725" + height="49.999996" + width="52.857113" + id="rect3398-1" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="244.71437" + height="49.999996" + width="52.857113" + id="rect3398-6" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="298.57147" + height="49.999996" + width="52.857113" + id="rect3398-2" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="352.42859" + height="49.999996" + width="52.857113" + id="rect3398-15" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="406.28571" + height="49.999996" + width="52.857113" + id="rect3398-4" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="460.14282" + height="49.999996" + width="52.857113" + id="rect3398-65" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="313.90488" + y="495.49646" + id="text4269" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271" + x="313.90488" + y="495.49646">obj1</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="368.95203" + y="495.49646" + id="text4269-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-5" + x="368.95203" + y="495.49646">obj2</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="422.99518" + y="495.49646" + id="text4269-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4" + x="422.99518" + y="495.49646">obj3</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 323.57143,578.07647 0,-42.14286" + id="path4309" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 487.14286,575.21933 0,-42.14286" + id="path4309-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="289.85715" + y="589.505" + id="text4787" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789" + x="289.85715" + y="589.505">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="293.45334" + y="603.41034" + id="text4787-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0" + x="293.45334" + y="603.41034">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="527.01239" + y="587.9577" + id="text4787-7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8" + x="527.01239" + y="587.9577">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="460.7514" + y="602.57739" + id="text4787-3-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8" + x="460.7514" + y="602.57739">prod_tail</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889" + width="482.85718" + height="67.857185" + x="163.57143" + y="315.21933" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="174.28571" + y="328.93362" + id="text4891" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893" + x="174.28571" + y="328.93362">local variables</tspan><tspan + sodipodi:role="line" + x="174.28571" + y="346.43362" + id="tspan3918">core 2</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889-8" + width="482.85715" + height="138.57147" + x="163.57143" + y="529.93365" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="170.89287" + y="682.09021" + id="text4891-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-3" + x="170.89287" + y="682.09021">structure state</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 325.25296,407.43361 0,42.14286" + id="path4309-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 486.68152,407.43361 0,42.14286" + id="path4309-4-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="296.992" + y="401.48123" + id="text4787-3-64" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9" + x="296.992" + y="401.48123">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="440.26532" + y="401.48123" + id="text4787-7-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0" + x="440.26532" + y="401.48123">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="522.43298" + y="401.48123" + id="text4787-3-6-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8" + x="522.43298" + y="401.48123">prod_next</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 537.14285,407.43361 0,42.14286" + id="path4309-4-9-9" + inkscape:connector-curvature="0" /> + <rect + style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0" + id="rect4889-9" + width="482.85718" + height="69.285774" + x="165" + y="385.93359" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="174.65646" + y="400.23306" + id="text4891-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-1" + x="174.65646" + y="400.23306">local variables</tspan><tspan + sodipodi:role="line" + x="174.65646" + y="417.73306" + id="tspan3920">core 1</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 326.73097,334.53006 0,42.14286" + id="path4309-8-8" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 537.44524,334.53006 0,42.14286" + id="path4309-4-9-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="298.47" + y="328.57767" + id="text4787-3-64-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9-0" + x="298.47" + y="328.57767">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="489.02905" + y="328.57767" + id="text4787-7-5-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0-6" + x="489.02905" + y="328.57767">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="571.19672" + y="328.57767" + id="text4787-3-6-4-1" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8-0" + x="571.19672" + y="328.57767">prod_next</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 587.90657,334.53006 0,42.14286" + id="path4309-4-9-9-6" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="447.85715" + y="289.505" + id="text3320" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3322" + x="447.85715" + y="289.505">compare and swap succeeds</tspan><tspan + sodipodi:role="line" + x="447.85715" + y="307.005" + id="tspan3324">on core 1 and fails on core 2</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 542.85715,575.57647 0,-42.14286" + id="path4309-4-0" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue3.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue3.svg new file mode 100644 index 000000000..83ef7dba1 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue3.svg @@ -0,0 +1,790 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="485.48575" + height="403.06647" + id="svg3388" + version="1.1" + inkscape:version="0.92.4 (f8dce91, 2019-08-02)" + sodipodi:docname="ring-mp-enqueue3.svg"> + <defs + id="defs3390"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4317" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3396" /> + <inkscape:perspective + id="perspective4180" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-69" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4767" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-7" + style="overflow:visible"> + <path + id="path4317-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4799" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4915" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4937" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4962" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4993" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-0" + style="overflow:visible"> + <path + id="path4317-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4999" + style="overflow:visible"> + <path + id="path5001" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5091" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path4317-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5121" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3157" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3193" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3218" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-94" + style="overflow:visible"> + <path + id="path4317-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3224" + style="overflow:visible"> + <path + id="path3226" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3228" + style="overflow:visible"> + <path + id="path3230" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3334" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-3" + style="overflow:visible"> + <path + id="path4317-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4027" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4027-4" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="201.35119" + inkscape:cy="107.5124" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1313" + inkscape:window-height="713" + inkscape:window-x="53" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:snap-grids="false" + inkscape:snap-to-guides="true" + showguides="false" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1"> + <inkscape:grid + type="xygrid" + id="grid5162" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + originx="-162.97143" + originy="-370.03525" + spacingx="1" + spacingy="1" /> + </sodipodi:namedview> + <metadata + id="metadata3393"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-162.97143,-279.26047)"> + <rect + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffd080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial" + id="rect4257" + width="439.41635" + height="58.588848" + x="186.87822" + y="463.44324" + rx="11.631636" + ry="11.631636" /> + <g + id="g4259" + transform="translate(108.51492,3.9469318)" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Arial;-inkscape-font-specification:Arial"> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="83.143028" + height="49.999996" + width="52.857113" + id="rect3398" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="137.00014" + height="49.999996" + width="52.857113" + id="rect3398-3" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="190.85725" + height="49.999996" + width="52.857113" + id="rect3398-1" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="244.71437" + height="49.999996" + width="52.857113" + id="rect3398-6" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="298.57147" + height="49.999996" + width="52.857113" + id="rect3398-2" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="352.42859" + height="49.999996" + width="52.857113" + id="rect3398-15" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="406.28571" + height="49.999996" + width="52.857113" + id="rect3398-4" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="460.14282" + height="49.999996" + width="52.857113" + id="rect3398-65" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="313.90488" + y="495.49646" + id="text4269"><tspan + sodipodi:role="line" + id="tspan4271" + x="313.90488" + y="495.49646" + style="font-size:14px;line-height:1.25">obj1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="368.95203" + y="495.49646" + id="text4269-4"><tspan + sodipodi:role="line" + id="tspan4271-5" + x="368.95203" + y="495.49646" + style="font-size:14px;line-height:1.25">obj2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="422.99518" + y="495.49646" + id="text4269-5"><tspan + sodipodi:role="line" + id="tspan4271-4" + x="422.99518" + y="495.49646" + style="font-size:14px;line-height:1.25">obj3</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 323.57143,578.07647 0,-42.14286" + id="path4309" + inkscape:connector-curvature="0" /> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 487.14286,575.21933 0,-42.14286" + id="path4309-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="289.85715" + y="589.505" + id="text4787"><tspan + sodipodi:role="line" + id="tspan4789" + x="289.85715" + y="589.505" + style="font-size:14px;line-height:1.25">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="293.45334" + y="603.41034" + id="text4787-3"><tspan + sodipodi:role="line" + id="tspan4789-0" + x="293.45334" + y="603.41034" + style="font-size:14px;line-height:1.25">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="567.01239" + y="587.9577" + id="text4787-7"><tspan + sodipodi:role="line" + id="tspan4789-8" + x="567.01239" + y="587.9577" + style="font-size:14px;line-height:1.25">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="460.7514" + y="602.57739" + id="text4787-3-6"><tspan + sodipodi:role="line" + id="tspan4789-0-8" + x="460.7514" + y="602.57739" + style="font-size:14px;line-height:1.25">prod_tail</tspan></text> + <rect + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial" + id="rect4889" + width="482.85718" + height="67.857185" + x="163.57143" + y="315.21933" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="174.28571" + y="328.93362" + id="text4891"><tspan + sodipodi:role="line" + id="tspan4893" + x="174.28571" + y="328.93362" + style="font-size:14px;line-height:1.25">local variables</tspan><tspan + sodipodi:role="line" + x="174.28571" + y="346.43362" + id="tspan4150" + style="font-size:14px;line-height:1.25">core 2</tspan></text> + <rect + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial" + id="rect4889-8" + width="482.85715" + height="138.57147" + x="163.57143" + y="529.93365" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="170.89287" + y="664.09021" + id="text4891-4"><tspan + sodipodi:role="line" + id="tspan4893-3" + x="170.89287" + y="664.09021" + style="font-size:14px;line-height:1.25">structure state</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 325.25296,407.43361 0,42.14286" + id="path4309-8" + inkscape:connector-curvature="0" /> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 486.68152,407.43361 0,42.14286" + id="path4309-4-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="296.992" + y="401.48123" + id="text4787-3-64"><tspan + sodipodi:role="line" + id="tspan4789-0-9" + x="296.992" + y="401.48123" + style="font-size:14px;line-height:1.25">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="440.26532" + y="401.48123" + id="text4787-7-5"><tspan + sodipodi:role="line" + id="tspan4789-8-0" + x="440.26532" + y="401.48123" + style="font-size:14px;line-height:1.25">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="522.43298" + y="401.48123" + id="text4787-3-6-4"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8" + x="522.43298" + y="401.48123" + style="font-size:14px;line-height:1.25">prod_next</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 537.14285,407.43361 0,42.14286" + id="path4309-4-9-9" + inkscape:connector-curvature="0" /> + <rect + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial" + id="rect4889-9" + width="482.85718" + height="69.285774" + x="165" + y="385.93359" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="174.65646" + y="398.23306" + id="text4891-3"><tspan + sodipodi:role="line" + id="tspan4893-1" + x="174.65646" + y="398.23306" + style="font-size:14px;line-height:1.25">local variables</tspan><tspan + sodipodi:role="line" + x="174.65646" + y="415.73306" + id="tspan4152" + style="font-size:14px;line-height:1.25">core 1</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 326.73097,334.53006 0,42.14286" + id="path4309-8-8" + inkscape:connector-curvature="0" /> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 537.44524,334.53006 0,42.14286" + id="path4309-4-9-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="298.47" + y="328.57767" + id="text4787-3-64-5"><tspan + sodipodi:role="line" + id="tspan4789-0-9-0" + x="298.47" + y="328.57767" + style="font-size:14px;line-height:1.25">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="489.02905" + y="328.57767" + id="text4787-7-5-3"><tspan + sodipodi:role="line" + id="tspan4789-8-0-6" + x="489.02905" + y="328.57767" + style="font-size:14px;line-height:1.25">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="571.19672" + y="328.57767" + id="text4787-3-6-4-1"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8-0" + x="571.19672" + y="328.57767" + style="font-size:14px;line-height:1.25">prod_next</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 587.90657,334.53006 0,42.14286" + id="path4309-4-9-9-6" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="447.85715" + y="289.505" + id="text3320"><tspan + sodipodi:role="line" + id="tspan3322" + x="447.85715" + y="289.505" + style="font-size:14px;line-height:1.25">compare and swap succeeds</tspan><tspan + sodipodi:role="line" + x="447.85715" + y="307.005" + id="tspan3324" + style="font-size:14px;line-height:1.25">on core 2</tspan></text> + <path + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14px;line-height:125%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 602.85715,575.57647 V 533.43361" + id="path4309-4-0" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="477.22983" + y="495.49646" + id="text4269-5-5"><tspan + sodipodi:role="line" + id="tspan4271-4-5" + x="477.22983" + y="495.49646" + style="font-size:14px;line-height:1.25">obj4</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + x="531.27301" + y="496.00156" + id="text4269-5-7"><tspan + sodipodi:role="line" + id="tspan4271-4-6" + x="531.27301" + y="496.00156" + style="font-size:14px;line-height:1.25">obj5</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue4.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue4.svg new file mode 100644 index 000000000..151e8bee3 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue4.svg @@ -0,0 +1,785 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="485.48575" + height="403.06647" + id="svg3388" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring-mp-enqueue4.svg"> + <defs + id="defs3390"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4317" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3396" /> + <inkscape:perspective + id="perspective4180" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-69" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4767" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-7" + style="overflow:visible"> + <path + id="path4317-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4799" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4915" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4937" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4962" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4993" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-0" + style="overflow:visible"> + <path + id="path4317-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4999" + style="overflow:visible"> + <path + id="path5001" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5091" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path4317-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5121" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3157" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3193" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3218" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-94" + style="overflow:visible"> + <path + id="path4317-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3224" + style="overflow:visible"> + <path + id="path3226" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3228" + style="overflow:visible"> + <path + id="path3230" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3334" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-3" + style="overflow:visible"> + <path + id="path4317-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3603" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4184" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="227.83116" + inkscape:cy="155.26458" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1002" + inkscape:window-x="173" + inkscape:window-y="21" + inkscape:window-maximized="0" + inkscape:snap-grids="false" + inkscape:snap-to-guides="true" + showguides="false" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1"> + <inkscape:grid + type="xygrid" + id="grid5162" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + originx="-162.97143px" + originy="-370.03525px" /> + </sodipodi:namedview> + <metadata + id="metadata3393"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-162.97143,-279.26047)"> + <rect + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffd080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial" + id="rect4257" + width="439.41635" + height="58.588848" + x="186.87822" + y="463.44324" + rx="11.631636" + ry="11.631636" /> + <g + id="g4259" + transform="translate(108.51492,3.9469318)" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Arial;-inkscape-font-specification:Arial"> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="83.143028" + height="49.999996" + width="52.857113" + id="rect3398" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="137.00014" + height="49.999996" + width="52.857113" + id="rect3398-3" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="190.85725" + height="49.999996" + width="52.857113" + id="rect3398-1" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="244.71437" + height="49.999996" + width="52.857113" + id="rect3398-6" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="298.57147" + height="49.999996" + width="52.857113" + id="rect3398-2" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="352.42859" + height="49.999996" + width="52.857113" + id="rect3398-15" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="406.28571" + height="49.999996" + width="52.857113" + id="rect3398-4" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="460.14282" + height="49.999996" + width="52.857113" + id="rect3398-65" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + </g> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="313.90488" + y="495.49646" + id="text4269" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271" + x="313.90488" + y="495.49646">obj1</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="368.95203" + y="495.49646" + id="text4269-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-5" + x="368.95203" + y="495.49646">obj2</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="422.99518" + y="495.49646" + id="text4269-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4" + x="422.99518" + y="495.49646">obj3</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 323.57143,578.07647 0,-42.14286" + id="path4309" + inkscape:connector-curvature="0" /> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 540.71429,575.21933 0,-42.14286" + id="path4309-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="289.85715" + y="589.505" + id="text4787" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789" + x="289.85715" + y="589.505">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="293.45334" + y="603.41034" + id="text4787-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0" + x="293.45334" + y="603.41034">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="572.15527" + y="587.9577" + id="text4787-7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8" + x="572.15527" + y="587.9577">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="501.03711" + y="600.57739" + id="text4787-3-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8" + x="501.03711" + y="600.57739">prod_tail</tspan></text> + <rect + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial" + id="rect4889" + width="482.85718" + height="67.857185" + x="163.57143" + y="315.21933" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="174.28571" + y="328.93362" + id="text4891" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893" + x="174.28571" + y="328.93362">local variables</tspan><tspan + sodipodi:role="line" + x="174.28571" + y="346.43362" + id="tspan4382">core 2</tspan></text> + <rect + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial" + id="rect4889-8" + width="482.85715" + height="138.57147" + x="163.57143" + y="529.93365" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="170.89287" + y="682.09021" + id="text4891-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-3" + x="170.89287" + y="682.09021">structure state</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 325.25296,407.43361 0,42.14286" + id="path4309-8" + inkscape:connector-curvature="0" /> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 486.68152,407.43361 0,42.14286" + id="path4309-4-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="296.992" + y="401.48123" + id="text4787-3-64" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9" + x="296.992" + y="401.48123">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="438.26532" + y="401.48123" + id="text4787-7-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0" + x="438.26532" + y="401.48123">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="520.43298" + y="401.48123" + id="text4787-3-6-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8" + x="520.43298" + y="401.48123">prod_next</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 537.14285,407.43361 0,42.14286" + id="path4309-4-9-9" + inkscape:connector-curvature="0" /> + <rect + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial" + id="rect4889-9" + width="482.85718" + height="69.285774" + x="165" + y="385.93359" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="174.65646" + y="400.23306" + id="text4891-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-1" + x="174.65646" + y="400.23306">local variables</tspan><tspan + sodipodi:role="line" + x="174.65646" + y="417.73306" + id="tspan4384">core 1</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 326.73097,334.53006 0,42.14286" + id="path4309-8-8" + inkscape:connector-curvature="0" /> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 537.44524,334.53006 0,42.14286" + id="path4309-4-9-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="298.47" + y="328.57767" + id="text4787-3-64-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9-0" + x="298.47" + y="328.57767">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="491.02905" + y="328.57767" + id="text4787-7-5-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0-6" + x="491.02905" + y="328.57767">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="571.19672" + y="328.57767" + id="text4787-3-6-4-1" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8-0" + x="571.19672" + y="328.57767">prod_next</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 587.90657,334.53006 0,42.14286" + id="path4309-4-9-9-6" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="447.85715" + y="289.505" + id="text3320" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="447.85715" + y="289.505" + id="tspan4172">core 2 is waiting for</tspan><tspan + sodipodi:role="line" + x="447.85715" + y="307.005" + id="tspan4170">r->prod_tail == prod_head</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 590.00001,575.57647 0,-42.14286" + id="path4309-4-0" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="476.46906" + y="495.12097" + id="text4269-5-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4-1" + x="476.46906" + y="495.12097">obj4</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="532.06372" + y="495.12097" + id="text4269-5-6-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4-1-6" + x="532.06372" + y="495.12097">obj5</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue5.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue5.svg new file mode 100644 index 000000000..1671478db --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring-mp-enqueue5.svg @@ -0,0 +1,693 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="484.05719" + height="367.70761" + id="svg3388" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring-mp-enqueue5.svg"> + <defs + id="defs3390"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4317" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3396" /> + <inkscape:perspective + id="perspective4180" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-69" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4767" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-7" + style="overflow:visible"> + <path + id="path4317-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4799" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4915" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4937" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4962" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4993" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-0" + style="overflow:visible"> + <path + id="path4317-6" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker4999" + style="overflow:visible"> + <path + id="path5001" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5091" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-9" + style="overflow:visible"> + <path + id="path4317-0" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective5121" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-1" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective5121-9" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3157" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3193" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective3218" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-94" + style="overflow:visible"> + <path + id="path4317-7" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3224" + style="overflow:visible"> + <path + id="path3226" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker3228" + style="overflow:visible"> + <path + id="path3230" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3334" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-3" + style="overflow:visible"> + <path + id="path4317-2" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective3603" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4184" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="227.83116" + inkscape:cy="155.26458" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1280" + inkscape:window-height="1002" + inkscape:window-x="105" + inkscape:window-y="150" + inkscape:window-maximized="0" + inkscape:snap-grids="false" + inkscape:snap-to-guides="true" + showguides="false" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1"> + <inkscape:grid + type="xygrid" + id="grid5162" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + originx="-162.97143px" + originy="-370.03525px" /> + </sodipodi:namedview> + <metadata + id="metadata3393"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-162.97143,-314.61933)"> + <rect + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffd080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial" + id="rect4257" + width="439.41635" + height="58.588848" + x="186.87822" + y="463.44324" + rx="11.631636" + ry="11.631636" /> + <g + id="g4259" + transform="translate(108.51492,3.9469318)" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Arial;-inkscape-font-specification:Arial"> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="83.143028" + height="49.999996" + width="52.857113" + id="rect3398" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="137.00014" + height="49.999996" + width="52.857113" + id="rect3398-3" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="190.85725" + height="49.999996" + width="52.857113" + id="rect3398-1" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="244.71437" + height="49.999996" + width="52.857113" + id="rect3398-6" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="298.57147" + height="49.999996" + width="52.857113" + id="rect3398-2" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="352.42859" + height="49.999996" + width="52.857113" + id="rect3398-15" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="406.28571" + height="49.999996" + width="52.857113" + id="rect3398-4" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="460.14282" + height="49.999996" + width="52.857113" + id="rect3398-65" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" /> + </g> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="313.90488" + y="495.49646" + id="text4269" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271" + x="313.90488" + y="495.49646">obj1</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="368.95203" + y="495.49646" + id="text4269-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-5" + x="368.95203" + y="495.49646">obj2</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="422.99518" + y="495.49646" + id="text4269-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4" + x="422.99518" + y="495.49646">obj3</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 323.57143,578.07647 0,-42.14286" + id="path4309" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="289.85715" + y="589.505" + id="text4787" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789" + x="289.85715" + y="589.505">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="293.45334" + y="603.41034" + id="text4787-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0" + x="293.45334" + y="603.41034">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="556.15527" + y="587.9577" + id="text4787-7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8" + x="556.15527" + y="587.9577">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="564.7514" + y="602.57739" + id="text4787-3-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8" + x="564.7514" + y="602.57739">prod_tail</tspan></text> + <rect + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial" + id="rect4889" + width="482.85718" + height="67.857185" + x="163.57143" + y="315.21933" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="174.28571" + y="328.93362" + id="text4891" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893" + x="174.28571" + y="328.93362">local variables</tspan><tspan + sodipodi:role="line" + x="174.28571" + y="346.43362" + id="tspan4582">core 2</tspan></text> + <rect + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0;font-family:Arial;-inkscape-font-specification:Arial" + id="rect4889-8" + width="482.85715" + height="138.57147" + x="163.57143" + y="529.93365" + rx="11.631636" + ry="11.631636" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="170.89287" + y="682.09021" + id="text4891-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4893-3" + x="170.89287" + y="682.09021">structure state</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 326.73097,334.53006 0,42.14286" + id="path4309-8-8" + inkscape:connector-curvature="0" /> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 537.44524,334.53006 0,42.14286" + id="path4309-4-9-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="298.47" + y="328.57767" + id="text4787-3-64-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-9-0" + x="298.47" + y="328.57767">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="491.02905" + y="328.57767" + id="text4787-7-5-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-8-0-6" + x="491.02905" + y="328.57767">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="571.19672" + y="328.57767" + id="text4787-3-6-4-1" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4789-0-8-8-0" + x="571.19672" + y="328.57767">prod_next</tspan></text> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 587.90657,334.53006 0,42.14286" + id="path4309-4-9-9-6" + inkscape:connector-curvature="0" /> + <path + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);font-family:Arial;-inkscape-font-specification:Arial" + d="m 590.00001,575.57647 0,-42.14286" + id="path4309-4-0" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="476.46906" + y="495.12097" + id="text4269-5-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4-1" + x="476.46906" + y="495.12097">obj4</tspan></text> + <text + xml:space="preserve" + style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="532.06372" + y="495.12097" + id="text4269-5-6-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4271-4-1-6" + x="532.06372" + y="495.12097">obj5</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/ring1.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/ring1.svg new file mode 100644 index 000000000..68de5503e --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/ring1.svg @@ -0,0 +1,355 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2010 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="706.33063" + height="225.98906" + id="svg3388" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="ring1.svg"> + <defs + id="defs3390"> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path4317" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective3396" /> + <inkscape:perspective + id="perspective4180" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-6" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-0" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-3" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-06" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-5" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-7" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4180-69" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4281-2" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4767" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend-7" + style="overflow:visible"> + <path + id="path4317-4" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + id="perspective4799" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + <inkscape:perspective + id="perspective4824" + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" + inkscape:vp_z="1 : 0.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 0.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.35" + inkscape:cx="464.87528" + inkscape:cy="304.52676" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="958" + inkscape:window-height="1059" + inkscape:window-x="797" + inkscape:window-y="33" + inkscape:window-maximized="0" + fit-margin-top="0.1" + fit-margin-left="0.1" + fit-margin-right="0.1" + fit-margin-bottom="0.1" /> + <metadata + id="metadata3393"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-20.563935,-371.41468)"> + <rect + style="fill:#ffd080;fill-opacity:1;stroke:#000000;stroke-width:1.60332525;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect4257" + width="704.52728" + height="93.936974" + x="21.465597" + y="372.31635" + rx="18.649294" + ry="18.649294" /> + <g + id="g4259" + transform="matrix(1.6033252,0,0,1.6033252,-104.17626,-364.40569)"> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="83.143028" + height="49.999996" + width="52.857113" + id="rect3398" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="137.00014" + height="49.999996" + width="52.857113" + id="rect3398-3" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="190.85725" + height="49.999996" + width="52.857113" + id="rect3398-1" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="244.71437" + height="49.999996" + width="52.857113" + id="rect3398-6" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="298.57147" + height="49.999996" + width="52.857113" + id="rect3398-2" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="352.42859" + height="49.999996" + width="52.857113" + id="rect3398-15" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="406.28571" + height="49.999996" + width="52.857113" + id="rect3398-4" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + <rect + ry="11.631636" + rx="11.631636" + y="463.79074" + x="460.14282" + height="49.999996" + width="52.857113" + id="rect3398-65" + style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-size:16.03325272px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="225.13065" + y="423.70807" + id="text4269"><tspan + sodipodi:role="line" + id="tspan4271" + x="225.13065" + y="423.70807">obj1</tspan></text> + <text + xml:space="preserve" + style="font-size:16.03325272px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="313.38913" + y="423.70807" + id="text4269-4"><tspan + sodipodi:role="line" + id="tspan4271-5" + x="313.38913" + y="423.70807">obj2</tspan></text> + <text + xml:space="preserve" + style="font-size:16.03325272px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="400.03784" + y="423.70807" + id="text4269-5"><tspan + sodipodi:role="line" + id="tspan4271-4" + x="400.03784" + y="423.70807">obj3</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:1.60332525px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 240.62926,556.11067 0,-67.56871" + id="path4309" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:1.60332525px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="m 502.88746,551.52975 0,-67.56871" + id="path4309-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:16.03325272px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="199.40092" + y="574.43433" + id="text4787"><tspan + sodipodi:role="line" + id="tspan4789" + x="199.40092" + y="574.43433">cons_head</tspan></text> + <text + xml:space="preserve" + style="font-size:16.03325272px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="205.16678" + y="593.52246" + id="text4787-3"><tspan + sodipodi:role="line" + id="tspan4789-0" + x="205.16678" + y="593.52246">cons_tail</tspan></text> + <text + xml:space="preserve" + style="font-size:16.03325272px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="465.11462" + y="571.95355" + id="text4787-7"><tspan + sodipodi:role="line" + id="tspan4789-8" + x="465.11462" + y="571.95355">prod_head</tspan></text> + <text + xml:space="preserve" + style="font-size:16.03325272px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" + x="467.44479" + y="592.18701" + id="text4787-3-6"><tspan + sodipodi:role="line" + id="tspan4789-0-8" + x="467.44479" + y="592.18701">prod_tail</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/sched_hier_per_port.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/sched_hier_per_port.svg new file mode 100644 index 000000000..759dead83 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/sched_hier_per_port.svg @@ -0,0 +1,492 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export sched_hier_per_port.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="6.25057in" height="7.26839in" + viewBox="0 0 450.041 523.324" xml:space="preserve" color-interpolation-filters="sRGB" class="st8"> + <v:documentProperties v:langID="2057" v:metric="true" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:#0070c0;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st2 {marker-end:url(#mrkr13-71);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5} + .st3 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.37313432835821} + .st4 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5} + .st5 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st6 {fill:#000000;font-family:Calibri;font-size:1.16666em} + .st7 {font-size:1em} + .st8 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend13"> + <path d="M 3 1 L 0 0 L 3 -1 L 3 1 " style="stroke:none"/> + </g> + <marker id="mrkr13-71" class="st3" v:arrowType="13" v:arrowSize="2" v:setback="8.04" refX="-8.04" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend13" transform="scale(-2.68,-2.68) "/> + </marker> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394" + v:shadowOffsetY="-8.50394"/> + <v:layer v:name="Connector" v:index="0"/> + <g id="group234-1" transform="translate(0.375,-12.7124)" v:mID="234" v:groupContext="group"> + <title>Sheet.234</title> + <g id="shape1-2" v:mID="1" v:groupContext="shape" transform="translate(265.039,-113.796)"> + <title>Sheet.1</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape2-4" v:mID="2" v:groupContext="shape" transform="translate(265.039,-98.3577)"> + <title>Sheet.2</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape3-6" v:mID="3" v:groupContext="shape" transform="translate(265.039,-82.9192)"> + <title>Sheet.3</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape4-8" v:mID="4" v:groupContext="shape" transform="translate(265.039,-67.4807)"> + <title>Sheet.4</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape6-10" v:mID="6" v:groupContext="shape" transform="translate(288.197,-113.796)"> + <title>Sheet.6</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape7-12" v:mID="7" v:groupContext="shape" transform="translate(288.197,-98.3577)"> + <title>Sheet.7</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape8-14" v:mID="8" v:groupContext="shape" transform="translate(288.197,-82.9192)"> + <title>Sheet.8</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape9-16" v:mID="9" v:groupContext="shape" transform="translate(288.197,-67.4807)"> + <title>Sheet.9</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape10-18" v:mID="10" v:groupContext="shape" transform="translate(311.355,-113.796)"> + <title>Sheet.10</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape11-20" v:mID="11" v:groupContext="shape" transform="translate(311.355,-98.3577)"> + <title>Sheet.11</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape12-22" v:mID="12" v:groupContext="shape" transform="translate(311.355,-82.9192)"> + <title>Sheet.12</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape13-24" v:mID="13" v:groupContext="shape" transform="translate(311.355,-67.4807)"> + <title>Sheet.13</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape14-26" v:mID="14" v:groupContext="shape" transform="translate(334.513,-113.796)"> + <title>Sheet.14</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape15-28" v:mID="15" v:groupContext="shape" transform="translate(334.513,-98.3577)"> + <title>Sheet.15</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape16-30" v:mID="16" v:groupContext="shape" transform="translate(334.513,-82.9192)"> + <title>Sheet.16</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape17-32" v:mID="17" v:groupContext="shape" transform="translate(334.513,-67.4807)"> + <title>Sheet.17</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape26-34" v:mID="26" v:groupContext="shape" transform="translate(199.484,-113.968)"> + <title>Sheet.26</title> + <rect x="0" y="507.713" width="19.5132" height="15.6106" class="st1"/> + </g> + <g id="shape27-36" v:mID="27" v:groupContext="shape" transform="translate(199.484,-98.3577)"> + <title>Sheet.27</title> + <rect x="0" y="507.713" width="19.5132" height="15.6106" class="st1"/> + </g> + <g id="shape28-38" v:mID="28" v:groupContext="shape" transform="translate(199.484,-82.7471)"> + <title>Sheet.28</title> + <rect x="0" y="507.713" width="19.5132" height="15.6106" class="st1"/> + </g> + <g id="shape29-40" v:mID="29" v:groupContext="shape" transform="translate(199.484,-67.1365)"> + <title>Sheet.29</title> + <rect x="0" y="507.713" width="19.5132" height="15.6106" class="st1"/> + </g> + <g id="shape30-42" v:mID="30" v:groupContext="shape" transform="translate(68.9749,-115.97)"> + <title>Sheet.30</title> + <rect x="0" y="508.004" width="19.1493" height="15.3195" class="st1"/> + </g> + <g id="shape31-44" v:mID="31" v:groupContext="shape" transform="translate(68.9749,-100.65)"> + <title>Sheet.31</title> + <rect x="0" y="508.004" width="19.1493" height="15.3195" class="st1"/> + </g> + <g id="shape32-46" v:mID="32" v:groupContext="shape" transform="translate(68.9749,-85.3307)"> + <title>Sheet.32</title> + <rect x="0" y="508.004" width="19.1493" height="15.3195" class="st1"/> + </g> + <g id="shape33-48" v:mID="33" v:groupContext="shape" transform="translate(68.9749,-70.0112)"> + <title>Sheet.33</title> + <rect x="0" y="508.004" width="19.1493" height="15.3195" class="st1"/> + </g> + <g id="shape40-50" v:mID="40" v:groupContext="shape" transform="translate(67.8551,-198.425)"> + <title>Sheet.40</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape42-52" v:mID="42" v:groupContext="shape" transform="translate(198.153,-205.871)"> + <title>Sheet.42</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape44-54" v:mID="44" v:groupContext="shape" transform="translate(297.427,-205.871)"> + <title>Sheet.44</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape46-56" v:mID="46" v:groupContext="shape" transform="translate(170.852,-306.005)"> + <title>Sheet.46</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape47-58" v:mID="47" v:groupContext="shape" transform="translate(255.236,-388.69)"> + <title>Sheet.47</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape48-60" v:mID="48" v:groupContext="shape" transform="translate(341.169,-317.821)"> + <title>Sheet.48</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape49-62" v:mID="49" v:groupContext="shape" transform="translate(344.583,-470.722)"> + <title>Sheet.49</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape50-64" v:mID="50" v:groupContext="shape" transform="translate(426.955,-399.855)"> + <title>Sheet.50</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape51-66" v:mID="51" v:groupContext="shape" v:layerMember="0" transform="translate(86.747,-217.661)"> + <title>Dynamic connector</title> + <path d="M0 523.32 L79.21 440.59" class="st2"/> + </g> + <g id="shape52-72" v:mID="52" v:groupContext="shape" v:layerMember="0" transform="translate(71.6902,-131.289)"> + <title>Dynamic connector.52</title> + <path d="M6.9 523.32 L7.21 468.25" class="st2"/> + </g> + <g id="shape157-77" v:mID="157" v:groupContext="shape" v:layerMember="0" transform="translate(202.193,-129.579)"> + <title>Dynamic connector.157</title> + <path d="M7.05 523.32 L7.11 459.09" class="st2"/> + </g> + <g id="shape158-82" v:mID="158" v:groupContext="shape" v:layerMember="0" transform="translate(206.384,-227.814)"> + <title>Dynamic connector.158</title> + <path d="M0 523.32 L-18.25 456.38" class="st2"/> + </g> + <g id="shape159-87" v:mID="159" v:groupContext="shape" v:layerMember="0" transform="translate(299.837,-223.969)"> + <title>Dynamic connector.159</title> + <path d="M0 523.32 L-99.6 444.53" class="st2"/> + </g> + <g id="shape160-92" v:mID="160" v:groupContext="shape" v:layerMember="0" transform="translate(295.944,-129.235)"> + <title>Dynamic connector.160</title> + <path d="M2.77 523.32 L10.05 458.6" class="st2"/> + </g> + <g id="shape161-97" v:mID="161" v:groupContext="shape" v:layerMember="0" transform="translate(277.428,-129.235)"> + <title>Dynamic connector.161</title> + <path d="M0 523.32 L23.4 457.41" class="st2"/> + </g> + <g id="shape162-102" v:mID="162" v:groupContext="shape" v:layerMember="0" transform="translate(322.104,-129.235)"> + <title>Dynamic connector.162</title> + <path d="M-2.1 523.32 L-10.52 458.55" class="st2"/> + </g> + <g id="shape163-107" v:mID="163" v:groupContext="shape" v:layerMember="0" transform="translate(341.288,-129.235)"> + <title>Dynamic connector.163</title> + <path d="M0 523.32 L-24.59 457.29" class="st2"/> + </g> + <g id="shape164-112" v:mID="164" v:groupContext="shape" v:layerMember="0" transform="translate(111.288,-84.3465)"> + <title>Dynamic connector.164</title> + <path d="M0 516.63 L69.49 515.85" class="st4"/> + </g> + <g id="shape165-115" v:mID="165" v:groupContext="shape" v:layerMember="0" transform="translate(189.998,-324.99)"> + <title>Dynamic connector.165</title> + <path d="M0 523.32 L59.82 464.71" class="st2"/> + </g> + <g id="shape166-120" v:mID="166" v:groupContext="shape" v:layerMember="0" transform="translate(343.721,-336.095)"> + <title>Dynamic connector.166</title> + <path d="M0 523.32 L-59.4 474.34" class="st2"/> + </g> + <g id="shape167-125" v:mID="167" v:groupContext="shape" v:layerMember="0" transform="translate(274.631,-407.412)"> + <title>Dynamic connector.167</title> + <path d="M0 523.32 L64.01 464.55" class="st2"/> + </g> + <g id="shape168-130" v:mID="168" v:groupContext="shape" v:layerMember="0" transform="translate(429.657,-418.308)"> + <title>Dynamic connector.168</title> + <path d="M0 523.32 L-56.3 474.89" class="st2"/> + </g> + <g id="shape170-135" v:mID="170" v:groupContext="shape" v:layerMember="0" transform="translate(70.9299,-2.87469)"> + <title>Dynamic connector.170</title> + <path d="M6.65 523.32 L7.36 468.25" class="st2"/> + </g> + <g id="shape171-140" v:mID="171" v:groupContext="shape" v:layerMember="0" transform="translate(201.964,1.13687E-13)"> + <title>Dynamic connector.171</title> + <path d="M6.93 523.32 L7.19 468.25" class="st2"/> + </g> + <g id="shape172-145" v:mID="172" v:groupContext="shape" v:layerMember="0" transform="translate(267.581,-0.34415)"> + <title>Dynamic connector.172</title> + <path d="M7.07 523.32 L7.1 468.25" class="st2"/> + </g> + <g id="shape173-150" v:mID="173" v:groupContext="shape" v:layerMember="0" transform="translate(290.626,-0.34415)"> + <title>Dynamic connector.173</title> + <path d="M6.98 523.32 L7.16 468.25" class="st2"/> + </g> + <g id="shape174-155" v:mID="174" v:groupContext="shape" v:layerMember="0" transform="translate(328.373,-0.34415)"> + <title>Dynamic connector.174</title> + <path d="M-6.86 523.32 L-7.23 468.25" class="st2"/> + </g> + <g id="shape175-160" v:mID="175" v:groupContext="shape" v:layerMember="0" transform="translate(336.683,-0.344153)"> + <title>Dynamic connector.175</title> + <path d="M6.77 523.32 L7.29 468.25" class="st2"/> + </g> + <g id="shape176-165" v:mID="176" v:groupContext="shape" transform="translate(3.59712E-14,-85.0395)"> + <title>Sheet.176</title> + <desc>Queue</desc> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="26.2205" cy="502.064" width="52.45" height="42.5197"/> + <rect x="0" y="480.804" width="52.4409" height="42.5197" class="st5"/> + <text x="7.19" y="506.26" class="st6" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Queue</text> </g> + <g id="shape177-168" v:mID="177" v:groupContext="shape" transform="translate(265.039,-113.796)"> + <title>Sheet.177</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape178-170" v:mID="178" v:groupContext="shape" transform="translate(265.039,-98.3577)"> + <title>Sheet.178</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape179-172" v:mID="179" v:groupContext="shape" transform="translate(265.039,-82.9192)"> + <title>Sheet.179</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape180-174" v:mID="180" v:groupContext="shape" transform="translate(265.039,-67.4807)"> + <title>Sheet.180</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape181-176" v:mID="181" v:groupContext="shape" transform="translate(288.197,-113.796)"> + <title>Sheet.181</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape182-178" v:mID="182" v:groupContext="shape" transform="translate(288.197,-98.3577)"> + <title>Sheet.182</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape183-180" v:mID="183" v:groupContext="shape" transform="translate(288.197,-82.9192)"> + <title>Sheet.183</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape184-182" v:mID="184" v:groupContext="shape" transform="translate(288.197,-67.4807)"> + <title>Sheet.184</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape185-184" v:mID="185" v:groupContext="shape" transform="translate(311.355,-113.796)"> + <title>Sheet.185</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape186-186" v:mID="186" v:groupContext="shape" transform="translate(311.355,-98.3577)"> + <title>Sheet.186</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape187-188" v:mID="187" v:groupContext="shape" transform="translate(311.355,-82.9192)"> + <title>Sheet.187</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape188-190" v:mID="188" v:groupContext="shape" transform="translate(311.355,-67.4807)"> + <title>Sheet.188</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape189-192" v:mID="189" v:groupContext="shape" transform="translate(334.513,-113.796)"> + <title>Sheet.189</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape190-194" v:mID="190" v:groupContext="shape" transform="translate(334.513,-98.3577)"> + <title>Sheet.190</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape191-196" v:mID="191" v:groupContext="shape" transform="translate(334.513,-82.9192)"> + <title>Sheet.191</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape192-198" v:mID="192" v:groupContext="shape" transform="translate(334.513,-67.4807)"> + <title>Sheet.192</title> + <rect x="0" y="507.885" width="19.2981" height="15.4385" class="st1"/> + </g> + <g id="shape193-200" v:mID="193" v:groupContext="shape" transform="translate(199.484,-113.968)"> + <title>Sheet.193</title> + <rect x="0" y="507.713" width="19.5132" height="15.6106" class="st1"/> + </g> + <g id="shape194-202" v:mID="194" v:groupContext="shape" transform="translate(199.484,-98.3577)"> + <title>Sheet.194</title> + <rect x="0" y="507.713" width="19.5132" height="15.6106" class="st1"/> + </g> + <g id="shape195-204" v:mID="195" v:groupContext="shape" transform="translate(199.484,-82.7471)"> + <title>Sheet.195</title> + <rect x="0" y="507.713" width="19.5132" height="15.6106" class="st1"/> + </g> + <g id="shape196-206" v:mID="196" v:groupContext="shape" transform="translate(199.484,-67.1365)"> + <title>Sheet.196</title> + <rect x="0" y="507.713" width="19.5132" height="15.6106" class="st1"/> + </g> + <g id="shape197-208" v:mID="197" v:groupContext="shape" transform="translate(68.9749,-115.97)"> + <title>Sheet.197</title> + <rect x="0" y="508.004" width="19.1493" height="15.3195" class="st1"/> + </g> + <g id="shape198-210" v:mID="198" v:groupContext="shape" transform="translate(68.9749,-100.65)"> + <title>Sheet.198</title> + <rect x="0" y="508.004" width="19.1493" height="15.3195" class="st1"/> + </g> + <g id="shape199-212" v:mID="199" v:groupContext="shape" transform="translate(68.9749,-85.3307)"> + <title>Sheet.199</title> + <rect x="0" y="508.004" width="19.1493" height="15.3195" class="st1"/> + </g> + <g id="shape200-214" v:mID="200" v:groupContext="shape" transform="translate(68.9749,-70.0112)"> + <title>Sheet.200</title> + <rect x="0" y="508.004" width="19.1493" height="15.3195" class="st1"/> + </g> + <g id="shape201-216" v:mID="201" v:groupContext="shape" transform="translate(67.8551,-198.425)"> + <title>Sheet.201</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape202-218" v:mID="202" v:groupContext="shape" transform="translate(198.153,-205.871)"> + <title>Sheet.202</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape203-220" v:mID="203" v:groupContext="shape" transform="translate(297.427,-205.871)"> + <title>Sheet.203</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape204-222" v:mID="204" v:groupContext="shape" transform="translate(170.852,-306.005)"> + <title>Sheet.204</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape205-224" v:mID="205" v:groupContext="shape" transform="translate(255.236,-388.69)"> + <title>Sheet.205</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape206-226" v:mID="206" v:groupContext="shape" transform="translate(341.169,-317.821)"> + <title>Sheet.206</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape207-228" v:mID="207" v:groupContext="shape" transform="translate(344.583,-470.722)"> + <title>Sheet.207</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape208-230" v:mID="208" v:groupContext="shape" transform="translate(426.955,-399.855)"> + <title>Sheet.208</title> + <ellipse cx="11.1684" cy="512.155" rx="11.1684" ry="11.1684" class="st1"/> + </g> + <g id="shape209-232" v:mID="209" v:groupContext="shape" v:layerMember="0" transform="translate(86.747,-217.661)"> + <title>Dynamic connector.209</title> + <path d="M0 523.32 L79.21 440.59" class="st2"/> + </g> + <g id="shape210-237" v:mID="210" v:groupContext="shape" v:layerMember="0" transform="translate(71.6902,-131.289)"> + <title>Dynamic connector.210</title> + <path d="M6.9 523.32 L7.21 468.25" class="st2"/> + </g> + <g id="shape211-242" v:mID="211" v:groupContext="shape" v:layerMember="0" transform="translate(202.193,-129.579)"> + <title>Dynamic connector.211</title> + <path d="M7.05 523.32 L7.11 459.09" class="st2"/> + </g> + <g id="shape212-247" v:mID="212" v:groupContext="shape" v:layerMember="0" transform="translate(206.384,-227.814)"> + <title>Dynamic connector.212</title> + <path d="M0 523.32 L-18.25 456.38" class="st2"/> + </g> + <g id="shape213-252" v:mID="213" v:groupContext="shape" v:layerMember="0" transform="translate(299.837,-223.969)"> + <title>Dynamic connector.213</title> + <path d="M0 523.32 L-99.6 444.53" class="st2"/> + </g> + <g id="shape214-257" v:mID="214" v:groupContext="shape" v:layerMember="0" transform="translate(295.944,-129.235)"> + <title>Dynamic connector.214</title> + <path d="M2.77 523.32 L10.05 458.6" class="st2"/> + </g> + <g id="shape215-262" v:mID="215" v:groupContext="shape" v:layerMember="0" transform="translate(277.428,-129.235)"> + <title>Dynamic connector.215</title> + <path d="M0 523.32 L23.4 457.41" class="st2"/> + </g> + <g id="shape216-267" v:mID="216" v:groupContext="shape" v:layerMember="0" transform="translate(322.104,-129.235)"> + <title>Dynamic connector.216</title> + <path d="M-2.1 523.32 L-10.52 458.55" class="st2"/> + </g> + <g id="shape217-272" v:mID="217" v:groupContext="shape" v:layerMember="0" transform="translate(341.288,-129.235)"> + <title>Dynamic connector.217</title> + <path d="M0 523.32 L-24.59 457.29" class="st2"/> + </g> + <g id="shape218-277" v:mID="218" v:groupContext="shape" v:layerMember="0" transform="translate(111.288,-84.3465)"> + <title>Dynamic connector.218</title> + <path d="M0 516.63 L69.49 515.85" class="st4"/> + </g> + <g id="shape219-280" v:mID="219" v:groupContext="shape" v:layerMember="0" transform="translate(189.998,-324.99)"> + <title>Dynamic connector.219</title> + <path d="M0 523.32 L59.82 464.71" class="st2"/> + </g> + <g id="shape220-285" v:mID="220" v:groupContext="shape" v:layerMember="0" transform="translate(343.721,-336.095)"> + <title>Dynamic connector.220</title> + <path d="M0 523.32 L-59.4 474.34" class="st2"/> + </g> + <g id="shape221-290" v:mID="221" v:groupContext="shape" v:layerMember="0" transform="translate(274.631,-407.412)"> + <title>Dynamic connector.221</title> + <path d="M0 523.32 L64.01 464.55" class="st2"/> + </g> + <g id="shape222-295" v:mID="222" v:groupContext="shape" v:layerMember="0" transform="translate(429.657,-418.308)"> + <title>Dynamic connector.222</title> + <path d="M0 523.32 L-56.3 474.89" class="st2"/> + </g> + <g id="shape223-300" v:mID="223" v:groupContext="shape" v:layerMember="0" transform="translate(70.9299,-2.87469)"> + <title>Dynamic connector.223</title> + <path d="M6.65 523.32 L7.36 468.25" class="st2"/> + </g> + <g id="shape224-305" v:mID="224" v:groupContext="shape" v:layerMember="0" transform="translate(201.964,1.13687E-13)"> + <title>Dynamic connector.224</title> + <path d="M6.93 523.32 L7.19 468.25" class="st2"/> + </g> + <g id="shape225-310" v:mID="225" v:groupContext="shape" v:layerMember="0" transform="translate(267.581,-0.34415)"> + <title>Dynamic connector.225</title> + <path d="M7.07 523.32 L7.1 468.25" class="st2"/> + </g> + <g id="shape226-315" v:mID="226" v:groupContext="shape" v:layerMember="0" transform="translate(290.626,-0.34415)"> + <title>Dynamic connector.226</title> + <path d="M6.98 523.32 L7.16 468.25" class="st2"/> + </g> + <g id="shape227-320" v:mID="227" v:groupContext="shape" v:layerMember="0" transform="translate(328.373,-0.34415)"> + <title>Dynamic connector.227</title> + <path d="M-6.86 523.32 L-7.23 468.25" class="st2"/> + </g> + <g id="shape228-325" v:mID="228" v:groupContext="shape" v:layerMember="0" transform="translate(336.683,-0.344153)"> + <title>Dynamic connector.228</title> + <path d="M6.77 523.32 L7.29 468.25" class="st2"/> + </g> + <g id="shape230-330" v:mID="230" v:groupContext="shape" transform="translate(9.92126,-185.273)"> + <title>Sheet.230</title> + <desc>Traffic Class</desc> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="26.2205" cy="499.003" width="52.45" height="48.6423"/> + <rect x="0" y="474.681" width="52.4409" height="48.6423" class="st5"/> + <text x="8.18" y="494.8" class="st6" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Traffic<v:newlineChar/><tspan + x="12.05" dy="1.2em" class="st7">Class</tspan></text> </g> + <g id="shape231-334" v:mID="231" v:groupContext="shape" transform="translate(113.386,-297.638)"> + <title>Sheet.231</title> + <desc>Pipe</desc> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="26.2205" cy="499.003" width="52.45" height="48.6423"/> + <rect x="0" y="474.681" width="52.4409" height="48.6423" class="st5"/> + <text x="13.84" y="503.2" class="st6" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Pipe</text> </g> + <g id="shape232-337" v:mID="232" v:groupContext="shape" transform="translate(185.669,-382.677)"> + <title>Sheet.232</title> + <desc>Subport</desc> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="32.5984" cy="499.003" width="65.2" height="48.6423"/> + <rect x="0" y="474.681" width="65.1969" height="48.6423" class="st5"/> + <text x="9.87" y="503.2" class="st6" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Subport</text> </g> + <g id="shape233-340" v:mID="233" v:groupContext="shape" transform="translate(284.882,-461.594)"> + <title>Sheet.233</title> + <desc>Port</desc> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="32.5984" cy="499.003" width="65.2" height="48.6423"/> + <rect x="0" y="474.681" width="65.1969" height="48.6423" class="st5"/> + <text x="20.51" y="503.2" class="st6" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Port</text> </g> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/stateful-op.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/stateful-op.svg new file mode 100644 index 000000000..e6ef6353d --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/stateful-op.svg @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export stateful-ops.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="1.49139in" height="1.35359in" + viewBox="0 0 107.38 97.4587" xml:space="preserve" color-interpolation-filters="sRGB" class="st6"> + <v:documentProperties v:langID="16393" v:metric="true" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st3 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st5 {stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st6 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394" + v:shadowOffsetY="-8.50394"/> + <g id="shape38-1" v:mID="38" v:groupContext="shape" transform="translate(58.305,-28.025)"> + <title>Circle</title> + <desc>stream</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="22.6772" cy="74.7815" width="39.69" height="34.0157"/> + <g id="shadow38-2" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 74.78 A22.6772 22.6772 0 0 1 45.35 74.78 A22.6772 22.6772 0 1 1 0 74.78 Z" class="st2"/> + </g> + <path d="M0 74.78 A22.6772 22.6772 0 0 1 45.35 74.78 A22.6772 22.6772 0 1 1 0 74.78 Z" class="st3"/> + <text x="8.43" y="77.78" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>stream</text> </g> + <g id="shape39-7" v:mID="39" v:groupContext="shape" transform="translate(3.0294,-73.3793)"> + <title>Circle.39</title> + <desc>op</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="11.3386" cy="86.1201" width="19.85" height="17.0079"/> + <g id="shadow39-8" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 86.12 A11.3386 11.3386 0 0 1 22.68 86.12 A11.3386 11.3386 0 1 1 0 86.12 Z" class="st2"/> + </g> + <path d="M0 86.12 A11.3386 11.3386 0 0 1 22.68 86.12 A11.3386 11.3386 0 1 1 0 86.12 Z" class="st3"/> + <text x="6.07" y="89.12" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>op</text> </g> + <g id="shape40-13" v:mID="40" v:groupContext="shape" transform="translate(3.0294,-50.7021)"> + <title>Circle.40</title> + <desc>op</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="11.3386" cy="86.1201" width="19.85" height="17.0079"/> + <g id="shadow40-14" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 86.12 A11.3386 11.3386 0 0 1 22.68 86.12 A11.3386 11.3386 0 1 1 0 86.12 Z" class="st2"/> + </g> + <path d="M0 86.12 A11.3386 11.3386 0 0 1 22.68 86.12 A11.3386 11.3386 0 1 1 0 86.12 Z" class="st3"/> + <text x="6.07" y="89.12" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>op</text> </g> + <g id="shape41-19" v:mID="41" v:groupContext="shape" transform="translate(3.0294,-28.025)"> + <title>Circle.41</title> + <desc>op</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="11.3386" cy="86.1201" width="19.85" height="17.0079"/> + <g id="shadow41-20" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 86.12 A11.3386 11.3386 0 0 1 22.68 86.12 A11.3386 11.3386 0 1 1 0 86.12 Z" class="st2"/> + </g> + <path d="M0 86.12 A11.3386 11.3386 0 0 1 22.68 86.12 A11.3386 11.3386 0 1 1 0 86.12 Z" class="st3"/> + <text x="6.07" y="89.12" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>op</text> </g> + <g id="shape42-25" v:mID="42" v:groupContext="shape" transform="translate(3.0294,-5.34779)"> + <title>Circle.249</title> + <desc>op</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="11.3386" cy="86.1201" width="19.85" height="17.0079"/> + <g id="shadow42-26" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 86.12 A11.3386 11.3386 0 0 1 22.68 86.12 A11.3386 11.3386 0 1 1 0 86.12 Z" class="st2"/> + </g> + <path d="M0 86.12 A11.3386 11.3386 0 0 1 22.68 86.12 A11.3386 11.3386 0 1 1 0 86.12 Z" class="st3"/> + <text x="6.07" y="89.12" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>op</text> </g> + <g id="shape43-31" v:mID="43" v:groupContext="shape" transform="translate(66.3024,-75.8604) rotate(24.6166)"> + <title>Sheet.43</title> + <path d="M0 97.46 L43.16 97.46" class="st5"/> + </g> + <g id="shape44-34" v:mID="44" v:groupContext="shape" transform="translate(37.2064,-61.3598) rotate(6.77654)"> + <title>Sheet.44</title> + <path d="M0 97.46 L34.05 97.46" class="st5"/> + </g> + <g id="shape45-37" v:mID="45" v:groupContext="shape" transform="translate(-6.31062,-33.9543) rotate(-19.179)"> + <title>Sheet.45</title> + <path d="M0 97.46 L34.51 97.46" class="st5"/> + </g> + <g id="shape46-40" v:mID="46" v:groupContext="shape" transform="translate(-14.8893,-7.82888) rotate(-24.6166)"> + <title>Sheet.46</title> + <path d="M0 97.46 L43.16 97.46" class="st5"/> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/stateless-op-shared.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/stateless-op-shared.svg new file mode 100644 index 000000000..257a69a52 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/stateless-op-shared.svg @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export Drawing5.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="1.89687in" height="1.60662in" + viewBox="0 0 136.575 115.676" xml:space="preserve" color-interpolation-filters="sRGB" class="st7"> + <v:documentProperties v:langID="16393" v:metric="true" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st3 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st5 {fill:none} + .st6 {stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.999999} + .st7 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394" + v:shadowOffsetY="-8.50394"/> + <g id="group47-1" transform="translate(3.02997,-5.34779)" v:mID="47" v:groupContext="group"> + <title>Sheet.47</title> + <g id="shape36-2" v:mID="36" v:groupContext="shape" transform="translate(66.2255,-27.0553)"> + <title>Circle</title> + <desc>priv_xform</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabSpace="42.5196"/> + <v:textRect cx="31.7998" cy="88.2699" width="55.66" height="40.7542"/> + <g id="shadow36-3" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 88.27 A31.7998 27.1694 0 1 1 63.6 88.27 A31.7998 27.1694 0 1 1 0 88.27 Z" class="st2"/> + </g> + <path d="M0 88.27 A31.7998 27.1694 0 1 1 63.6 88.27 A31.7998 27.1694 0 1 1 0 88.27 Z" class="st3"/> + <text x="9.47" y="91.27" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>priv_xform</text> </g> + <g id="shape39-8" v:mID="39" v:groupContext="shape" transform="translate(-5.9952E-015,-81.5083)"> + <title>Circle.40</title> + <desc>op</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabSpace="42.5196"/> + <v:textRect cx="13.5848" cy="101.968" width="23.78" height="20.3771"/> + <g id="shadow39-9" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 101.97 A13.5848 13.5848 0 1 1 27.17 101.97 A13.5848 13.5848 0 1 1 0 101.97 Z" class="st2"/> + </g> + <path d="M0 101.97 A13.5848 13.5848 0 1 1 27.17 101.97 A13.5848 13.5848 0 1 1 0 101.97 Z" class="st3"/> + <text x="8.32" y="104.97" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>op</text> </g> + <g id="shape40-14" v:mID="40" v:groupContext="shape" transform="translate(-5.9952E-015,-54.3389)"> + <title>Circle.41</title> + <desc>op</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabSpace="42.5196"/> + <v:textRect cx="13.5848" cy="101.968" width="23.78" height="20.3771"/> + <g id="shadow40-15" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 101.97 A13.5848 13.5848 0 1 1 27.17 101.97 A13.5848 13.5848 0 1 1 0 101.97 Z" class="st2"/> + </g> + <path d="M0 101.97 A13.5848 13.5848 0 1 1 27.17 101.97 A13.5848 13.5848 0 1 1 0 101.97 Z" class="st3"/> + <text x="8.32" y="104.97" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>op</text> </g> + <g id="shape41-20" v:mID="41" v:groupContext="shape" transform="translate(-5.9952E-015,-27.1694)"> + <title>Circle.42</title> + <desc>op</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabSpace="42.5196"/> + <v:textRect cx="13.5848" cy="101.968" width="23.78" height="20.3771"/> + <g id="shadow41-21" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 101.97 A13.5848 13.5848 0 1 1 27.17 101.97 A13.5848 13.5848 0 1 1 0 101.97 Z" class="st2"/> + </g> + <path d="M0 101.97 A13.5848 13.5848 0 1 1 27.17 101.97 A13.5848 13.5848 0 1 1 0 101.97 Z" class="st3"/> + <text x="8.32" y="104.97" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>op</text> </g> + <g id="shape42-26" v:mID="42" v:groupContext="shape"> + <title>Circle.249</title> + <desc>op</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabSpace="42.5196"/> + <v:textRect cx="13.5848" cy="101.968" width="23.78" height="20.3771"/> + <g id="shadow42-27" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 101.97 A13.5848 13.5848 0 1 1 27.17 101.97 A13.5848 13.5848 0 1 1 0 101.97 Z" class="st2"/> + </g> + <path d="M0 101.97 A13.5848 13.5848 0 1 1 27.17 101.97 A13.5848 13.5848 0 1 1 0 101.97 Z" class="st3"/> + <text x="8.32" y="104.97" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>op</text> </g> + <g id="shape43-32" v:mID="43" v:groupContext="shape" transform="translate(75.3544,-84.7046) rotate(24.6166)"> + <title>Sheet.43</title> + <path d="M0 115.68 L51.71 115.68 L0 115.68 Z" class="st5"/> + <path d="M0 115.68 L51.71 115.68" class="st6"/> + </g> + <g id="shape44-35" v:mID="44" v:groupContext="shape" transform="translate(40.8189,-67.2403) rotate(6.77654)"> + <title>Sheet.44</title> + <path d="M0 115.68 L40.8 115.68 L0 115.68 Z" class="st5"/> + <path d="M0 115.68 L40.8 115.68" class="st6"/> + </g> + <g id="shape45-38" v:mID="45" v:groupContext="shape" transform="translate(-10.8336,-34.4585) rotate(-19.179)"> + <title>Sheet.45</title> + <path d="M0 115.68 L41.35 115.68 L0 115.68 Z" class="st5"/> + <path d="M0 115.68 L41.35 115.68" class="st6"/> + </g> + <g id="shape46-41" v:mID="46" v:groupContext="shape" transform="translate(-21.0159,-3.19618) rotate(-24.6166)"> + <title>Sheet.46</title> + <path d="M0 115.68 L51.71 115.68 L0 115.68 Z" class="st5"/> + <path d="M0 115.68 L51.71 115.68" class="st6"/> + </g> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/stateless-op.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/stateless-op.svg new file mode 100644 index 000000000..fd951b7ad --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/stateless-op.svg @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export stateless-ops.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="2.24024in" height="2.70592in" + viewBox="0 0 161.298 194.826" xml:space="preserve" color-interpolation-filters="sRGB" class="st8"> + <v:documentProperties v:langID="16393" v:metric="true" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {visibility:visible} + .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22} + .st3 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25} + .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em} + .st5 {fill:#feffff;font-family:Calibri;font-size:0.75em} + .st6 {marker-start:url(#mrkr13-19);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st7 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.28409094308259} + .st8 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend13"> + <path d="M 3 1 L 0 0 L 3 -1 L 3 1 " style="stroke:none"/> + </g> + <marker id="mrkr13-19" class="st7" v:arrowType="13" v:arrowSize="2" v:setback="0" refX="0" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend13" transform="scale(3.5199995788296) "/> + </marker> + </defs> + <defs id="Filters"> + <filter id="filter_2"> + <feGaussianBlur stdDeviation="2"/> + </filter> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="9" + v:shadowOffsetY="-9"/> + <g id="group61-1" transform="translate(3.02943,-5.34782)" v:mID="61" v:groupContext="group"> + <title>Sheet.61</title> + <g id="shape52-2" v:mID="52" v:groupContext="shape" transform="translate(97.856,-133.39)"> + <title>Circle.40</title> + <desc>op</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="28.3463" cy="167.479" width="49.62" height="41.4408"/> + <g id="shadow52-3" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M-0 167.48 A28.3465 27.6272 180 0 1 56.69 167.48 A28.3465 27.6272 180 0 1 -0 167.48 Z" class="st2"/> + </g> + <path d="M-0 167.48 A28.3465 27.6272 180 0 1 56.69 167.48 A28.3465 27.6272 180 0 1 -0 167.48 Z" class="st3"/> + <text x="23.08" y="170.48" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>op</text> </g> + <g id="shape53-8" v:mID="53" v:groupContext="shape" transform="translate(-3.9968E-015,-133.39)"> + <title>Circle.299</title> + <desc>priv_xform</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="28.3463" cy="167.479" width="49.62" height="41.4408"/> + <g id="shadow53-9" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M-0 167.48 A28.3465 27.6272 180 0 1 56.69 167.48 A28.3465 27.6272 180 0 1 -0 167.48 Z" class="st2"/> + </g> + <path d="M-0 167.48 A28.3465 27.6272 180 0 1 56.69 167.48 A28.3465 27.6272 180 0 1 -0 167.48 Z" class="st3"/> + <text x="8.25" y="170.18" class="st5" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>priv_xform</text> </g> + <g id="shape54-14" v:mID="54" v:groupContext="shape" transform="translate(56.693,-160.74)"> + <title>Sheet.54</title> + <path d="M0 194.83 L10.2 194.83 L10.56 194.83 L41.16 194.83" class="st6"/> + </g> + <g id="shape55-20" v:mID="55" v:groupContext="shape" transform="translate(97.856,-65.1969)"> + <title>Circle.479</title> + <desc>op</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="28.3463" cy="166.185" width="49.62" height="42.5197"/> + <g id="shadow55-21" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 166.19 A28.3465 28.3465 0 1 1 56.69 166.19 A28.3465 28.3465 0 1 1 0 166.19 Z" class="st2"/> + </g> + <path d="M0 166.19 A28.3465 28.3465 0 1 1 56.69 166.19 A28.3465 28.3465 0 1 1 0 166.19 Z" class="st3"/> + <text x="23.08" y="169.19" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>op</text> </g> + <g id="shape56-26" v:mID="56" v:groupContext="shape" transform="translate(-3.9968E-015,-65.7801)"> + <title>Circle.480</title> + <desc>priv_xform</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="28.3463" cy="166.768" width="49.62" height="42.5197"/> + <g id="shadow56-27" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 166.77 A28.3465 28.3465 0 0 1 56.69 166.77 A28.3465 28.3465 0 0 1 0 166.77 Z" class="st2"/> + </g> + <path d="M0 166.77 A28.3465 28.3465 0 0 1 56.69 166.77 A28.3465 28.3465 0 0 1 0 166.77 Z" class="st3"/> + <text x="8.25" y="169.47" class="st5" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>priv_xform</text> </g> + <g id="shape57-32" v:mID="57" v:groupContext="shape" transform="translate(56.693,-93.8414)"> + <title>Sheet.57</title> + <path d="M0 194.83 L10.2 194.83 L10.56 194.83 L41.16 194.83" class="st6"/> + </g> + <g id="shape58-37" v:mID="58" v:groupContext="shape" transform="translate(97.856,0)"> + <title>Circle.482</title> + <desc>op</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="28.3463" cy="166.185" width="49.62" height="42.5197"/> + <g id="shadow58-38" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 166.19 A28.3465 28.3465 0 1 1 56.69 166.19 A28.3465 28.3465 0 1 1 0 166.19 Z" class="st2"/> + </g> + <path d="M0 166.19 A28.3465 28.3465 0 1 1 56.69 166.19 A28.3465 28.3465 0 1 1 0 166.19 Z" class="st3"/> + <text x="23.08" y="169.19" class="st4" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>op</text> </g> + <g id="shape59-43" v:mID="59" v:groupContext="shape" transform="translate(-3.9968E-015,-0.583223)"> + <title>Circle.483</title> + <desc>priv_xform</desc> + <v:userDefs> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/> + <v:textRect cx="28.3463" cy="166.768" width="49.62" height="42.5197"/> + <g id="shadow59-44" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1" + transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1"> + <path d="M0 166.77 A28.3465 28.3465 0 0 1 56.69 166.77 A28.3465 28.3465 0 0 1 0 166.77 Z" class="st2"/> + </g> + <path d="M0 166.77 A28.3465 28.3465 0 0 1 56.69 166.77 A28.3465 28.3465 0 0 1 0 166.77 Z" class="st3"/> + <text x="8.25" y="169.47" class="st5" v:langID="16393"><v:paragraph v:horizAlign="1"/><v:tabList/>priv_xform</text> </g> + <g id="shape60-49" v:mID="60" v:groupContext="shape" transform="translate(56.693,-28.6446)"> + <title>Sheet.60</title> + <path d="M0 194.83 L10.2 194.83 L10.56 194.83 L41.16 194.83" class="st6"/> + </g> + </g> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/tbl24_tbl8.png b/src/spdk/dpdk/doc/guides/prog_guide/img/tbl24_tbl8.png Binary files differnew file mode 100644 index 000000000..c39b55bd0 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/tbl24_tbl8.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/tbl24_tbl8_tbl8.png b/src/spdk/dpdk/doc/guides/prog_guide/img/tbl24_tbl8_tbl8.png Binary files differnew file mode 100644 index 000000000..eb99e2ab4 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/tbl24_tbl8_tbl8.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/turbo_tb_decode.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/turbo_tb_decode.svg new file mode 100644 index 000000000..a259f4586 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/turbo_tb_decode.svg @@ -0,0 +1,1471 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2018 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="194.21973mm" + height="163.25349mm" + viewBox="0 0 194.21973 163.25349" + version="1.1" + id="svg8" + inkscape:version="0.92.3 (2405546, 2018-03-11)" + sodipodi:docname="turbo_tb_decode.svg"> + <defs + id="defs2"> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker8474" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Mend"> + <path + transform="scale(-0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + id="path8472" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path6507" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5140" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5122" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5134" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(1.1,0,0,1.1,1.1,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5116" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Sstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5128" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(0.2,0,0,0.2,1.2,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mend" + style="overflow:visible" + inkscape:isstock="true" + inkscape:collect="always"> + <path + id="path5143" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0" + refX="0" + id="Arrow1Send" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5131" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.2,0,0,-0.2,-1.2,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5119" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <filter + id="filter_2"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur4" /> + </filter> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-0" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-5" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-1" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-0" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-4" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-9" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-11" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-2" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-0-1" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-5-6" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-1-3" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-0-1" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker8474-2" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Mend"> + <path + inkscape:connector-curvature="0" + transform="scale(-0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + id="path8472-4" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.98994949" + inkscape:cx="148.9027" + inkscape:cy="256.96386" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-text-baseline="true" + inkscape:window-width="1920" + inkscape:window-height="1137" + inkscape:window-x="1072" + inkscape:window-y="185" + inkscape:window-maximized="1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + style="display:inline" + transform="translate(-9.7553377,-54.351435)"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="41.159508" + y="61.13464" + id="text873"><tspan + sodipodi:role="line" + id="tspan871" + x="41.159508" + y="64.996841" + style="font-size:4.23333311px;stroke-width:0.26458332" /></text> + <g + id="g4997"> + <a + id="a990"> + <rect + style="opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.1950596;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect854" + width="44.771584" + height="14.03559" + x="18.573261" + y="54.450935" /> + </a> + <text + id="text877" + y="62.738258" + x="21.648832" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:3.52777767px;stroke-width:0.26458332" + y="62.738258" + x="21.648832" + id="tspan875" + sodipodi:role="line">w<tspan + id="tspan885" + style="font-size:64.99999762%;baseline-shift:sub">k</tspan> LLR circular buffer</tspan></text> + </g> + <rect + style="opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.1981452;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967" + width="25.196077" + height="14.03559" + x="63.344845" + y="54.450935" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="73.52343" + y="62.445942" + id="text877-8"><tspan + sodipodi:role="line" + id="tspan875-6" + x="73.52343" + y="62.445942" + style="font-size:3.52777767px;stroke-width:0.26458332">...</tspan></text> + <rect + style="opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.1950596;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect854-5" + width="44.771584" + height="14.03559" + x="88.540924" + y="54.450935" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="91.90699" + y="62.531521" + id="text877-4"><tspan + sodipodi:role="line" + id="tspan875-0" + x="91.90699" + y="62.531521" + style="font-size:3.52777767px;stroke-width:0.26458332">w<tspan + style="font-size:2.2930553px;baseline-shift:sub;stroke-width:0.26458332" + id="tspan885-9">k</tspan> LLR circular buffer</tspan></text> + <rect + style="opacity:1;fill:#d8d8d8;fill-opacity:1;stroke:#000000;stroke-width:0.199;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect4735" + width="6.6797671" + height="14.033618" + x="11.893495" + y="54.450935" /> + <g + id="g4807" + transform="translate(0,0.188984)"> + <path + inkscape:connector-curvature="0" + id="path4741" + d="m 11.929873,70.237907 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5" + d="m 18.686199,70.237907 c 0,0 -0.4016,2.480469 -1.370164,2.456847 -0.968564,-0.02363 -2.007999,-0.02363 -2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760" + d="m 15.308036,72.671124 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + id="g5063"> + <path + inkscape:connector-curvature="0" + id="path4741-0" + d="m 18.686199,70.426891 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-8" + d="m 132.59878,70.332401 c 0,0 -0.4016,2.480469 -1.37017,2.456847 -0.96856,-0.02363 -2.008,-0.02363 -2.008,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-2" + d="m 75.831475,72.954606 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4809" + d="M 22.064362,72.860108 129.22061,72.765618" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <flowRoot + xml:space="preserve" + id="flowRoot4811" + style="font-style:normal;font-weight:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" + transform="scale(0.26458333)"><flowRegion + id="flowRegion4813"><rect + id="rect4815" + width="41.785713" + height="14.642858" + x="39.285713" + y="287.16254" /></flowRegion><flowPara + id="flowPara4817">offse</flowPara></flowRoot> <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="74.16684" + y="75.043541" + id="text4821-3" + transform="scale(0.95903923,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0" + x="74.16684" + y="75.043541" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">length</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="11.603812" + y="75.449066" + id="text4821-3-9" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-0" + x="11.603812" + y="75.449066" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">offset</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#7f8085;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="150.53461" + y="58.039307" + id="text4821-3-6" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-1" + x="150.53461" + y="58.039307" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144">The encoded TB is given as a</tspan><tspan + sodipodi:role="line" + x="150.53461" + y="61.97533" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan4877">contiguous buffer</tspan></text> + <path + style="fill:none;stroke:#7f7f7f;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.1199999, 0.26499999;stroke-dashoffset:0;stroke-opacity:1" + d="M 10.423511,83.31801 H 72.162772" + id="path4885" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#818181;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.1199999, 0.26499999;stroke-dashoffset:0;stroke-opacity:1" + d="M 82.319012,83.31801 176.93243,83.184377" + id="path4887" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:5.39796209px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#818181;fill-opacity:1;stroke:none;stroke-width:0.40484715" + x="77.368088" + y="81.855705" + id="text4891" + transform="scale(0.96100989,1.040572)"><tspan + sodipodi:role="line" + id="tspan4889" + x="77.368088" + y="81.855705" + style="fill:#818181;fill-opacity:1;stroke-width:0.40484715">or</tspan></text> + <path + style="fill:none;stroke:#7f7f7f;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.11999992, 0.26499999;stroke-dashoffset:0;stroke-opacity:1" + d="M 9.7553377,181.2723 H 71.494599" + id="path4885-9" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#818181;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.11999992, 0.26499999;stroke-dashoffset:0;stroke-opacity:1" + d="m 81.786039,181.24224 94.613421,-0.13363" + id="path4887-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:5.39796209px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#818181;fill-opacity:1;stroke:none;stroke-width:0.40484715" + x="76.813484" + y="175.96187" + id="text4891-9" + transform="scale(0.9610099,1.040572)"><tspan + sodipodi:role="line" + id="tspan4889-7" + x="76.813484" + y="175.96187" + style="fill:#818181;fill-opacity:1;stroke-width:0.40484715">or</tspan></text> + <rect + style="opacity:1;fill:#d8d8d8;fill-opacity:1;stroke:#000000;stroke-width:0.199;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect4735-7" + width="6.6797671" + height="14.033618" + x="10.825401" + y="101.15727" /> + <g + id="g4807-3" + transform="translate(-0.98393573,46.759016)"> + <path + inkscape:connector-curvature="0" + id="path4741-2" + d="m 11.929873,70.237907 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-81" + d="m 18.686199,70.237907 c 0,0 -0.4016,2.480469 -1.370164,2.456847 -0.968564,-0.02363 -2.007999,-0.02363 -2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-3" + d="m 15.308036,72.671124 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="10.57785" + y="120.11156" + id="text4821-3-9-7" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-0-3" + x="10.57785" + y="120.11156" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">offset</tspan></text> + <g + transform="matrix(0.99106501,0,0,1.0000618,-0.90257595,46.700562)" + id="g4997-1"> + <a + id="a990-9"> + <rect + style="opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.1950596;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect854-4" + width="44.771584" + height="14.03559" + x="18.573261" + y="54.450935" /> + </a> + <text + id="text877-1" + y="62.738258" + x="21.648832" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:3.52777767px;stroke-width:0.26458332" + y="62.738258" + x="21.648832" + id="tspan875-9" + sodipodi:role="line">w<tspan + id="tspan885-5" + style="font-size:64.99999762%;baseline-shift:sub">k</tspan> LLR circular buffer</tspan></text> + </g> + <g + transform="matrix(0.98808659,0,0,1.0000825,72.450284,46.566642)" + id="g4997-1-4"> + <a + id="a990-9-5"> + <rect + style="opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.1950596;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect854-4-6" + width="44.771584" + height="14.03559" + x="18.573261" + y="54.450935" /> + </a> + <text + id="text877-1-0" + y="62.738258" + x="21.648832" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:3.52777767px;stroke-width:0.26458332" + y="62.738258" + x="21.648832" + id="tspan875-9-8" + sodipodi:role="line">w<tspan + id="tspan885-5-7" + style="font-size:64.99999762%;baseline-shift:sub">k</tspan> LLR circular buffer</tspan></text> + </g> + <g + transform="matrix(1.0292712,0,0,0.99978365,-1.5276486,46.585803)" + id="g5063-5"> + <path + inkscape:connector-curvature="0" + id="path4741-0-0" + d="m 18.686199,70.426891 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-8-2" + d="m 132.59878,70.332401 c 0,0 -0.4016,2.480469 -1.37017,2.456847 -0.96856,-0.02363 -2.008,-0.02363 -2.008,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-2-4" + d="m 75.831475,72.954606 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4809-8" + d="M 22.064362,72.860108 129.22061,72.765618" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="74.729973" + y="119.73718" + id="text4821-3-3" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7" + x="74.729973" + y="119.73718" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">length</tspan></text> + <path + style="fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 61.876283,101.15486 9.985811,-0.03 v 4.04245 l -2.53906,1.46999 5.57925,2.87314 -3.006781,1.60362 v 4.04245 l -10.01922,0.0348 z" + id="path5575" + inkscape:connector-curvature="0" /> + <path + style="fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 90.802274,101.02207 -9.953242,0.003 -0.03341,3.94222 -2.639287,1.63703 5.679477,2.87314 -2.939965,1.57021 v 4.00905 l 9.886426,0.003 z" + id="path5581" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="64.84626" + y="109.37679" + id="text5879"><tspan + sodipodi:role="line" + id="tspan5877" + x="64.84626" + y="109.37679" + style="stroke-width:0.26458332">..</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="85.559654" + y="109.51042" + id="text5883"><tspan + sodipodi:role="line" + id="tspan5881" + x="85.559654" + y="109.51042" + style="stroke-width:0.26458332">..</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)" + d="m 66.783973,101.05803 c 0,0 5.144937,-13.096212 18.942727,-0.33409" + id="path5899" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.06663418px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#7f8085;fill-opacity:1;stroke:none;stroke-width:0.22999756" + x="155.38319" + y="97.845207" + id="text4821-3-6-2" + transform="scale(0.93400804,1.0706546)"><tspan + sodipodi:role="line" + id="tspan4819-0-1-0" + x="155.38319" + y="97.845207" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.22999756">The encoded TB is given as a</tspan><tspan + sodipodi:role="line" + x="155.38319" + y="101.6785" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.22999756" + id="tspan4877-1">"scattered" buffer through a</tspan><tspan + sodipodi:role="line" + x="155.38319" + y="105.5118" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.22999756" + id="tspan5992">chained mbuf</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.06663418px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#7f8085;fill-opacity:1;stroke:none;stroke-width:0.22999756" + x="147.15628" + y="145.52435" + id="text4821-3-6-2-4" + transform="scale(0.93400803,1.0706546)"><tspan + sodipodi:role="line" + x="147.15628" + y="145.52435" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.22999756" + id="tspan5992-2">Result is decoded back into the given output</tspan><tspan + sodipodi:role="line" + x="147.15628" + y="149.35765" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.22999756" + id="tspan6023">mbuf as one contiguous buffer with no </tspan><tspan + sodipodi:role="line" + x="147.15628" + y="153.19093" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.22999756" + id="tspan6025">CRC24B retaining</tspan></text> + <g + id="g6253"> + <g + transform="translate(10.356694,1.2027129)" + id="g6079"> + <path + style="fill:#fec000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 64.144685,140.61392 -0.03341,-11.65963 h 4.209497 l -0.03341,11.65963 1.971111,-0.0334 -4.042449,3.90882 -4.04245,-3.90882 z" + id="path6066" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="-142.49652" + y="67.226768" + id="text6074" + transform="rotate(-90)"><tspan + sodipodi:role="line" + id="tspan6072" + x="-142.49652" + y="67.226768" + style="font-size:2.82222223px;stroke-width:0.26458332">decode</tspan></text> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.06663418px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#7f8085;fill-opacity:1;stroke:none;stroke-width:0.22999756" + x="146.80908" + y="180.29805" + id="text4821-3-6-2-4-6" + transform="scale(0.93400803,1.0706546)"><tspan + sodipodi:role="line" + x="146.80908" + y="180.29805" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.22999756" + id="tspan6025-0">Result is decoded back into the given output</tspan><tspan + sodipodi:role="line" + x="146.80908" + y="184.13135" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.22999756" + id="tspan6110">mbuf as one contiguous buffer with CRC24B</tspan><tspan + sodipodi:role="line" + x="146.80908" + y="187.96463" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.22999756" + id="tspan6112">retained in place when</tspan><tspan + sodipodi:role="line" + x="146.80908" + y="191.79793" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.22999756" + id="tspan6114">RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP</tspan><tspan + sodipodi:role="line" + x="146.80908" + y="195.63123" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.22999756" + id="tspan6116">is set in op_flags</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a8d08d;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="25.9951" + y="169.83803" + id="text4821-3-9-7-1" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-0-3-0" + x="25.9951" + y="169.83803" + style="fill:#a8d08d;fill-opacity:1;stroke-width:0.23616144">offset</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a8d08d;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="75.794968" + y="168.951" + id="text4821-3-3-0" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8" + x="75.794968" + y="168.951" + style="fill:#a8d08d;fill-opacity:1;stroke-width:0.23616144">length</tspan></text> + <path + style="display:inline;fill:none;stroke:#a8d08d;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart);marker-end:url(#marker6509)" + d="m 32.606882,149.73449 c 19.777945,-0.0668 19.777945,-0.0668 19.777945,-0.0668" + id="path6255" + inkscape:connector-curvature="0" /> + <g + style="display:inline" + id="g4807-5" + transform="translate(13.985119,97.480562)"> + <path + inkscape:connector-curvature="0" + id="path4741-6" + d="m 11.929873,70.237907 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-88" + d="m 18.686199,70.237907 c 0,0 -0.4016,2.480469 -1.370164,2.456847 -0.968564,-0.02363 -2.007999,-0.02363 -2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-9" + d="m 15.308036,72.671124 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + style="display:inline" + transform="matrix(0.78752716,0,0,1.0016782,17.928141,97.168708)" + id="g5063-5-2"> + <path + inkscape:connector-curvature="0" + id="path4741-0-0-0" + d="m 18.686199,70.426891 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-8-2-1" + d="m 132.59878,70.332401 c 0,0 -0.4016,2.480469 -1.37017,2.456847 -0.96856,-0.02363 -2.008,-0.02363 -2.008,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-2-4-5" + d="m 75.831475,72.954606 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4809-8-8" + d="M 22.064362,72.860108 129.22061,72.765618" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <rect + style="display:inline;opacity:1;fill:#d8d8d8;fill-opacity:1;stroke:#000000;stroke-width:0.199;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect4735-7-3" + width="6.6797671" + height="14.033618" + x="25.781357" + y="152.21487" /> + <g + id="g8093"> + <rect + y="152.21487" + x="32.461124" + height="14.0336" + width="16.248745" + id="rect6210" + style="display:inline;opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + id="text6214" + y="158.15347" + x="40.321487" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + y="158.15347" + x="40.321487" + id="tspan6212" + sodipodi:role="line">CB<tspan + id="tspan6218" + style="font-size:64.99999762%;text-align:center;baseline-shift:sub;text-anchor:middle">1</tspan></tspan><tspan + id="tspan6216" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + y="162.5632" + x="40.321487" + sodipodi:role="line">hard</tspan></text> + </g> + <g + id="g8100"> + <rect + y="152.21487" + x="48.709869" + height="14.0336" + width="16.248745" + id="rect6210-1" + style="display:inline;opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + id="text6214-7" + y="158.15347" + x="56.570232" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + y="158.15347" + x="56.570232" + id="tspan6212-1" + sodipodi:role="line">CB<tspan + id="tspan6247" + style="font-size:64.99999762%;baseline-shift:sub">2</tspan></tspan><tspan + id="tspan6216-4" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + y="162.5632" + x="56.570232" + sodipodi:role="line">hard</tspan></text> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a8d08d;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="39.47636" + y="140.81966" + id="text4821-3-3-0-5" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-3" + x="39.47636" + y="140.81966" + style="fill:#a8d08d;fill-opacity:1;stroke-width:0.23616144">k_neg</tspan></text> + <g + id="g8252"> + <rect + y="152.21487" + x="64.958618" + height="14.033598" + width="24.977577" + id="rect6693" + style="opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.26701048;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + id="text6697" + y="160.55891" + x="75.637276" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="stroke-width:0.26458332" + y="160.55891" + x="75.637276" + id="tspan6695" + sodipodi:role="line">...</tspan></text> + </g> + <rect + style="display:inline;opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect6210-8" + width="16.248745" + height="14.0336" + x="89.936195" + y="152.21487" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="98.231049" + y="158.29669" + id="text6214-78"><tspan + sodipodi:role="line" + id="tspan6212-2" + x="98.231049" + y="158.29669" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;text-align:center;baseline-shift:sub;text-anchor:middle;stroke-width:0.26458332" + id="tspan6218-3">c-1</tspan></tspan><tspan + sodipodi:role="line" + x="98.231049" + y="162.70642" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + id="tspan6216-2">hard</tspan></text> + <rect + style="display:inline;opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.23060164;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect6210-8-3" + width="12.2741" + height="14.067998" + x="106.16774" + y="152.19768" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="112.17137" + y="158.42459" + id="text6214-78-6"><tspan + sodipodi:role="line" + id="tspan6212-2-9" + x="112.17137" + y="158.42459" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;text-align:center;baseline-shift:sub;text-anchor:middle;stroke-width:0.26458332" + id="tspan6218-3-7">c</tspan></tspan><tspan + sodipodi:role="line" + x="112.17137" + y="162.83432" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + id="tspan6216-2-9">hard</tspan></text> + <g + id="g6838" + transform="translate(-4.1092682)"> + <rect + y="152.22496" + x="122.55111" + height="14.040706" + width="4.0010114" + id="rect6777" + style="opacity:1;fill:#375623;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781" + y="125.5383" + x="-164.82439" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="125.5383" + x="-164.82439" + id="tspan6779" + sodipodi:role="line">CRC24A</tspan></text> + </g> + <path + style="display:inline;fill:none;stroke:#a8d08d;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-0);marker-end:url(#marker6509-1)" + d="m 105.83873,149.28245 c 19.77795,-0.0668 19.77795,-0.0668 19.77795,-0.0668" + id="path6255-2" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a8d08d;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="115.83596" + y="140.38614" + id="text4821-3-3-0-5-1" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-3-7" + x="115.83596" + y="140.38614" + style="fill:#a8d08d;fill-opacity:1;stroke-width:0.23616144">k_pos</tspan></text> + <rect + style="display:inline;opacity:1;fill:#d8d8d8;fill-opacity:1;stroke:#000000;stroke-width:0.199;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect4735-7-3-8" + width="6.6797671" + height="14.033618" + x="17.908045" + y="192.83072" /> + <g + style="display:inline" + id="g4807-5-7" + transform="translate(6.0254188,138.42182)"> + <path + inkscape:connector-curvature="0" + id="path4741-6-7" + d="m 11.929873,70.237907 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-88-6" + d="m 18.686199,70.237907 c 0,0 -0.4016,2.480469 -1.370164,2.456847 -0.968564,-0.02363 -2.007999,-0.02363 -2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-9-4" + d="m 15.308036,72.671124 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a8d08d;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="17.775927" + y="208.62222" + id="text4821-3-9-7-1-7" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-0-3-0-0" + x="17.775927" + y="208.62222" + style="fill:#a8d08d;fill-opacity:1;stroke-width:0.23616144">offset</tspan></text> + <path + style="display:inline;fill:none;stroke:#a8d08d;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-4);marker-end:url(#marker6509-11)" + d="m 24.97933,190.59164 c 19.777946,-0.0668 19.777946,-0.0668 19.777946,-0.0668" + id="path6255-0" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a8d08d;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="31.523031" + y="180.00327" + id="text4821-3-3-0-5-5" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-3-9" + x="31.523031" + y="180.00327" + style="fill:#a8d08d;fill-opacity:1;stroke-width:0.23616144">k_neg</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a8d08d;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="75.525093" + y="208.04131" + id="text4821-3-3-0-9" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-8" + x="75.525093" + y="208.04131" + style="fill:#a8d08d;fill-opacity:1;stroke-width:0.23616144">length</tspan></text> + <g + style="display:inline" + transform="matrix(0.91917288,0,0,1.0006169,7.5499955,138.19202)" + id="g5063-5-2-9"> + <path + inkscape:connector-curvature="0" + id="path4741-0-0-0-9" + d="m 18.686199,70.426891 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-8-2-1-3" + d="m 132.59878,70.332401 c 0,0 -0.4016,2.480469 -1.37017,2.456847 -0.96856,-0.02363 -2.008,-0.02363 -2.008,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-2-4-5-3" + d="m 75.831475,72.954606 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4809-8-8-4" + d="M 22.064362,72.860108 129.22061,72.765618" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <path + style="display:inline;fill:none;stroke:#a8d08d;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-0-1);marker-end:url(#marker6509-1-3)" + d="m 109.83498,190.21366 c 19.77795,-0.0668 19.77795,-0.0668 19.77795,-0.0668" + id="path6255-2-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a8d08d;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="120.00289" + y="179.64078" + id="text4821-3-3-0-5-1-5" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-3-7-6" + x="120.00289" + y="179.64078" + style="fill:#a8d08d;fill-opacity:1;stroke-width:0.23616144">k_pos</tspan></text> + <g + transform="translate(-7.873312,40.61586)" + style="display:inline" + id="g8093-1"> + <rect + y="152.21487" + x="32.461124" + height="14.0336" + width="16.248745" + id="rect6210-9" + style="display:inline;opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + id="text6214-9" + y="158.15347" + x="40.321487" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + y="158.15347" + x="40.321487" + id="tspan6212-7" + sodipodi:role="line">CB<tspan + id="tspan6218-8" + style="font-size:64.99999762%;text-align:center;baseline-shift:sub;text-anchor:middle">1</tspan></tspan><tspan + id="tspan6216-0" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + y="162.5632" + x="40.321487" + sodipodi:role="line">hard</tspan></text> + </g> + <g + style="display:inline" + id="g6838-7" + transform="translate(-81.714552,40.598663)"> + <rect + y="152.22496" + x="122.55111" + height="14.040706" + width="4.0010114" + id="rect6777-5" + style="opacity:1;fill:#375623;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781-1" + y="125.5383" + x="-164.82439" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="125.5383" + x="-164.82439" + id="tspan6779-7" + sodipodi:role="line">CRC24B</tspan></text> + </g> + <g + transform="translate(-3.8722974,40.608749)" + style="display:inline" + id="g8100-3"> + <rect + y="152.21487" + x="48.709869" + height="14.0336" + width="16.248745" + id="rect6210-1-8" + style="display:inline;opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + id="text6214-7-4" + y="158.15347" + x="56.570232" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + y="158.15347" + x="56.570232" + id="tspan6212-1-0" + sodipodi:role="line">CB<tspan + id="tspan6247-0" + style="font-size:64.99999762%;baseline-shift:sub">2</tspan></tspan><tspan + id="tspan6216-4-1" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + y="162.5632" + x="56.570232" + sodipodi:role="line">hard</tspan></text> + </g> + <g + style="display:inline" + id="g6838-7-2" + transform="translate(-61.464789,40.591552)"> + <rect + y="152.22496" + x="122.55111" + height="14.040706" + width="4.0010114" + id="rect6777-5-2" + style="opacity:1;fill:#375623;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781-1-7" + y="125.5383" + x="-164.82439" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="125.5383" + x="-164.82439" + id="tspan6779-7-1" + sodipodi:role="line">CRC24B</tspan></text> + </g> + <g + transform="translate(0.12871686,40.608749)" + style="display:inline" + id="g8252-9"> + <rect + y="152.21487" + x="64.958618" + height="14.033598" + width="24.977577" + id="rect6693-0" + style="opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.26701048;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + id="text6697-7" + y="160.55891" + x="75.637276" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="stroke-width:0.26458332" + y="160.55891" + x="75.637276" + id="tspan6695-1" + sodipodi:role="line">...</tspan></text> + </g> + <rect + style="display:inline;opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect6210-8-5" + width="16.248745" + height="14.0336" + x="90.064911" + y="192.82362" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="98.359756" + y="198.90544" + id="text6214-78-69"><tspan + sodipodi:role="line" + id="tspan6212-2-98" + x="98.359756" + y="198.90544" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;text-align:center;baseline-shift:sub;text-anchor:middle;stroke-width:0.26458332" + id="tspan6218-3-1">c-1</tspan></tspan><tspan + sodipodi:role="line" + x="98.359756" + y="203.31517" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + id="tspan6216-2-8">hard</tspan></text> + <g + style="display:inline" + id="g6838-7-2-9" + transform="translate(-16.23745,40.591553)"> + <rect + y="152.22496" + x="122.55111" + height="14.040706" + width="4.0010114" + id="rect6777-5-2-0" + style="opacity:1;fill:#375623;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781-1-7-2" + y="125.5383" + x="-164.82439" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="125.5383" + x="-164.82439" + id="tspan6779-7-1-9" + sodipodi:role="line">CRC24B</tspan></text> + </g> + <rect + style="display:inline;opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.23060165;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect6210-8-3-2" + width="12.2741" + height="14.067998" + x="110.31467" + y="192.81651" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="116.3183" + y="199.04343" + id="text6214-78-6-8"><tspan + sodipodi:role="line" + id="tspan6212-2-9-7" + x="116.3183" + y="199.04343" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;text-align:center;baseline-shift:sub;text-anchor:middle;stroke-width:0.26458332" + id="tspan6218-3-7-9">c</tspan></tspan><tspan + sodipodi:role="line" + x="116.3183" + y="203.45316" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + id="tspan6216-2-9-1">hard</tspan></text> + <g + style="display:inline" + id="g6838-8" + transform="translate(0.03765869,40.591553)"> + <rect + y="152.22496" + x="122.55111" + height="14.040706" + width="4.0010114" + id="rect6777-6" + style="opacity:1;fill:#375623;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781-15" + y="125.5383" + x="-164.82439" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="125.5383" + x="-164.82439" + id="tspan6779-6" + sodipodi:role="line">CRC24A</tspan></text> + </g> + <g + style="display:inline" + id="g6838-7-2-7" + transform="translate(4.0386734,40.591553)"> + <rect + y="152.22496" + x="122.55111" + height="14.040706" + width="4.0010114" + id="rect6777-5-2-04" + style="opacity:1;fill:#375623;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781-1-7-5" + y="125.5383" + x="-164.82439" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="125.5383" + x="-164.82439" + id="tspan6779-7-1-0" + sodipodi:role="line">CRC24B</tspan></text> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="27.138876" + y="85.186432" + id="text4821-3-9-0" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-0-1" + x="27.138876" + y="85.186432" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">mbuf seg 1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="112.34333" + y="85.141403" + id="text4821-3-9-0-8" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-0-1-0" + x="112.34333" + y="85.141403" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">mbuf seg 2</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker8474)" + d="m 34.076864,90.734741 5.946746,5.746295" + id="path8464" + inkscape:connector-curvature="0" /> + <path + style="display:inline;fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker8474-2)" + d="m 115.35315,91.80841 -5.7463,5.946752" + id="path8464-8" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/turbo_tb_encode.svg b/src/spdk/dpdk/doc/guides/prog_guide/img/turbo_tb_encode.svg new file mode 100644 index 000000000..e3708a937 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/turbo_tb_encode.svg @@ -0,0 +1,1948 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<!-- SPDX-License-Identifier: BSD-3-Clause --> +<!-- Copyright(c) 2018 Intel Corporation --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="189.87321mm" + height="166.91023mm" + viewBox="0 0 189.87321 166.91023" + version="1.1" + id="svg8" + inkscape:version="0.92.3 (2405546, 2018-03-11)" + sodipodi:docname="turbo_tb_encode.svg"> + <defs + id="defs2"> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker8474" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Mend"> + <path + transform="scale(-0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + id="path8472" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path6507" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5140" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5122" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(0.4,0,0,0.4,4,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5134" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(1.1,0,0,1.1,1.1,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5116" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Sstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Sstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5128" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(0.2,0,0,0.2,1.2,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0" + refX="0" + id="Arrow1Send" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5131" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.2,0,0,-0.2,-1.2,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path5119" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <filter + id="filter_2"> + <feGaussianBlur + stdDeviation="2" + id="feGaussianBlur4" /> + </filter> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-0" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-5" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-1" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-0" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-4" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-9" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-11" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-2" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-0-1" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-5-6" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-1-3" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-0-1" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker8474-2" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Mend"> + <path + inkscape:connector-curvature="0" + transform="scale(-0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + id="path8472-4" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-0-9" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-5-7" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-1-38" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-0-6" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-1" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-6" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-7" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-22" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-1-2" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-6-4" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-7-7" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-22-7" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-0-9-1" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-5-7-6" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-1-38-0" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-0-6-0" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-1-2-5" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-6-4-6" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-7-7-6" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-22-7-9" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-0-9-1-6" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-5-7-6-8" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-1-38-0-6" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-0-6-0-8" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-0-9-1-4" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-5-7-6-2" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-1-38-0-7" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-0-6-0-5" + style="fill:#9cc3e5;fill-opacity:1;fill-rule:evenodd;stroke:#9cc3e5;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker8474-2-2" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Mend"> + <path + inkscape:connector-curvature="0" + transform="scale(-0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:#818181;fill-opacity:1;fill-rule:evenodd;stroke:#818181;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + id="path8472-4-6" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker8474-3" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Mend"> + <path + inkscape:connector-curvature="0" + transform="scale(-0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:#818181;fill-opacity:1;fill-rule:evenodd;stroke:#818181;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + id="path8472-3" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mend-1" + style="overflow:visible" + inkscape:isstock="true" + inkscape:collect="always"> + <path + inkscape:connector-curvature="0" + id="path5143-7" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-0-6" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-5-77" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-1-39" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-0-9" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart-8" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path5140-99" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="marker6509-78" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path6507-02" + style="fill:#a8d08d;fill-opacity:1;fill-rule:evenodd;stroke:#a8d08d;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.98994949" + inkscape:cx="213.35065" + inkscape:cy="360.88227" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-text-baseline="true" + inkscape:window-width="1920" + inkscape:window-height="1137" + inkscape:window-x="1072" + inkscape:window-y="185" + inkscape:window-maximized="1" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="bgImage" + style="display:inline" + transform="translate(-10.86151,-57.361626)" /> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + style="display:inline" + transform="translate(-10.86151,-57.361626)"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="41.159508" + y="61.13464" + id="text873"><tspan + sodipodi:role="line" + id="tspan871" + x="41.159508" + y="64.996841" + style="font-size:4.23333311px;stroke-width:0.26458332" /></text> + <flowRoot + xml:space="preserve" + id="flowRoot4811" + style="font-style:normal;font-weight:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" + transform="scale(0.26458333)"><flowRegion + id="flowRegion4813"><rect + id="rect4815" + width="41.785713" + height="14.642858" + x="39.285713" + y="287.16254" /></flowRegion><flowPara + id="flowPara4817">offse</flowPara></flowRoot> <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a8d08d;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="16.351753" + y="215.03786" + id="text4821-3-9-7-1-7" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-0-3-0-0" + x="16.351753" + y="215.03786" + style="fill:#a8d08d;fill-opacity:1;stroke-width:0.23616144">offset</tspan></text> + <rect + style="display:inline;opacity:1;fill:#d8d8d8;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect4735-7-3-8-5" + width="6.6797671" + height="14.033618" + x="13.480058" + y="65.465332" /> + <g + style="display:inline" + id="g4807-4" + transform="translate(1.6626143,11.103676)"> + <path + inkscape:connector-curvature="0" + id="path4741-8" + d="m 11.929873,70.237907 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-5" + d="m 18.686199,70.237907 c 0,0 -0.4016,2.480469 -1.370164,2.456847 -0.968564,-0.02363 -2.007999,-0.02363 -2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-5" + d="m 15.308036,72.671124 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + style="display:inline" + id="g5063-4" + transform="matrix(0.96955809,0,0,1.0002284,2.2280641,10.898039)"> + <path + inkscape:connector-curvature="0" + id="path4741-0-01" + d="m 18.686199,70.426891 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-8-9" + d="m 132.59878,70.332401 c 0,0 -0.4016,2.480469 -1.37017,2.456847 -0.96856,-0.02363 -2.008,-0.02363 -2.008,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-2-0" + d="m 75.831475,72.954606 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4809-2" + d="M 22.064362,72.860108 129.22061,72.765618" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="74.602684" + y="85.144012" + id="text4821-3-0" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-5" + x="74.602684" + y="85.144012" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">length</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="13.386705" + y="85.690132" + id="text4821-3-9-4" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-0-4" + x="13.386705" + y="85.690132" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">offset</tspan></text> + <g + transform="translate(209.08086,-15.131588)" + style="display:inline" + id="g10789-0"> + <path + inkscape:connector-curvature="0" + id="path4885-7" + d="m -198.21935,107.88646 h 61.73926" + style="fill:none;stroke:#7f7f7f;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.1199999, 0.26499999;stroke-dashoffset:0;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4887-5" + d="m -126.32385,107.88646 94.613422,-0.13363" + style="fill:none;stroke:#818181;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.1199999, 0.26499999;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="scale(0.9610099,1.040572)" + id="text4891-3" + y="105.46623" + x="-139.73984" + style="font-style:normal;font-weight:normal;font-size:5.39796209px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#818181;fill-opacity:1;stroke:none;stroke-width:0.40484715" + xml:space="preserve"><tspan + style="fill:#818181;fill-opacity:1;stroke-width:0.40484715" + y="105.46623" + x="-139.73984" + id="tspan4889-9" + sodipodi:role="line">or</tspan></text> + </g> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15867083;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-6" + width="16.144258" + height="14.033618" + x="20.159824" + y="65.465332" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="25.127815" + y="73.846748" + id="text877-8-6"><tspan + sodipodi:role="line" + id="tspan875-6-8" + x="25.127815" + y="73.846748" + style="font-size:3.52777767px;stroke-width:0.26458332">CB<tspan + style="font-size:64.99999762%;baseline-shift:sub" + id="tspan10851">1</tspan></tspan></text> + <g + id="g10891"> + <rect + y="65.443756" + x="36.304085" + height="14.074809" + width="4.0010114" + id="rect6777-5-2-04-3" + style="opacity:1;fill:#0070c0;fill-opacity:1;stroke:#000000;stroke-width:0.15919298;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781-1-7-5-6" + y="39.324684" + x="-78.343857" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="39.324684" + x="-78.343857" + id="tspan6779-7-1-0-4" + sodipodi:role="line">CRC24B</tspan></text> + </g> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-6-1" + width="16.163868" + height="14.074809" + x="40.305096" + y="65.443756" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="44.893223" + y="73.780594" + id="text877-8-6-7"><tspan + sodipodi:role="line" + id="tspan875-6-8-8" + x="44.893223" + y="73.780594" + style="font-size:3.52777767px;stroke-width:0.26458332">CB<tspan + style="font-size:64.99999762%;baseline-shift:sub" + id="tspan10935">2</tspan></tspan></text> + <g + transform="translate(20.164879)" + style="display:inline" + id="g10891-1"> + <rect + y="65.443756" + x="36.304085" + height="14.074809" + width="4.0010114" + id="rect6777-5-2-04-3-5" + style="opacity:1;fill:#0070c0;fill-opacity:1;stroke:#000000;stroke-width:0.15919298;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781-1-7-5-6-4" + y="39.324684" + x="-78.343857" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="39.324684" + x="-78.343857" + id="tspan6779-7-1-0-4-5" + sodipodi:role="line">CRC24B</tspan></text> + </g> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-8" + width="30.921177" + height="14.014396" + x="60.480572" + y="65.493568" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="73.468872" + y="73.892609" + id="text877-8-4"><tspan + sodipodi:role="line" + id="tspan875-6-3" + x="73.468872" + y="73.892609" + style="font-size:3.52777767px;stroke-width:0.26458332">...</tspan></text> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-6-0" + width="16.163868" + height="14.074809" + x="91.401749" + y="65.433159" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="95.206711" + y="73.84742" + id="text877-8-6-1"><tspan + sodipodi:role="line" + id="tspan875-6-8-9" + x="95.206711" + y="73.84742" + style="font-size:3.52777767px;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;baseline-shift:sub;stroke-width:0.26458332" + id="tspan10851-4">c-1</tspan></tspan></text> + <g + transform="translate(71.261528,-0.01059723)" + style="display:inline" + id="g10891-1-1"> + <rect + y="65.443756" + x="36.304085" + height="14.074809" + width="4.0010114" + id="rect6777-5-2-04-3-5-4" + style="opacity:1;fill:#0070c0;fill-opacity:1;stroke:#000000;stroke-width:0.15919298;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781-1-7-5-6-4-0" + y="39.324684" + x="-78.343857" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="39.324684" + x="-78.343857" + id="tspan6779-7-1-0-4-5-4" + sodipodi:role="line">CRC24B</tspan></text> + </g> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-6-0-8" + width="11.644219" + height="14.098742" + x="111.55466" + y="65.421196" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="114.16887" + y="73.780602" + id="text877-8-6-1-0"><tspan + sodipodi:role="line" + id="tspan875-6-8-9-9" + x="114.16887" + y="73.780602" + style="font-size:3.52777767px;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;baseline-shift:sub;stroke-width:0.26458332" + id="tspan10851-4-4">c</tspan></tspan></text> + <g + transform="translate(86.894791,0.00137329)" + style="display:inline" + id="g10891-1-1-1"> + <rect + y="65.443756" + x="36.304085" + height="14.074809" + width="4.0010114" + id="rect6777-5-2-04-3-5-4-9" + style="opacity:1;fill:#0070c0;fill-opacity:1;stroke:#000000;stroke-width:0.15919298;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781-1-7-5-6-4-0-4" + y="39.324684" + x="-78.343857" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="39.324684" + x="-78.343857" + id="tspan6779-7-1-0-4-5-4-7" + sodipodi:role="line">CRC24A</tspan></text> + </g> + <g + transform="translate(90.895802,0.00137329)" + style="display:inline" + id="g10891-1-1-6"> + <rect + y="65.443756" + x="36.304085" + height="14.074809" + width="4.0010114" + id="rect6777-5-2-04-3-5-4-95" + style="opacity:1;fill:#0070c0;fill-opacity:1;stroke:#000000;stroke-width:0.15919298;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781-1-7-5-6-4-0-6" + y="39.324684" + x="-78.343857" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="39.324684" + x="-78.343857" + id="tspan6779-7-1-0-4-5-4-2" + sodipodi:role="line">CRC24B</tspan></text> + </g> + <path + style="display:inline;fill:none;stroke:#9cc3e5;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-1);marker-end:url(#marker6509-7)" + d="m 20.359726,62.756584 c 19.77795,-0.0668 19.77795,-0.0668 19.77795,-0.0668" + id="path6255-4" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="26.706127" + y="57.404415" + id="text4821-3-3-0-5-4" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-3-95" + x="26.706127" + y="57.404415" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">k_neg</tspan></text> + <path + style="display:inline;fill:none;stroke:#9cc3e5;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-0-9);marker-end:url(#marker6509-1-38)" + d="m 111.58503,62.795193 c 19.77795,-0.0668 19.77795,-0.0668 19.77795,-0.0668" + id="path6255-2-3" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="121.82767" + y="57.441448" + id="text4821-3-3-0-5-1-6" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-3-7-9" + x="121.82767" + y="57.441448" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">k_pos</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#7f8085;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="144.51123" + y="64.972511" + id="text4821-3-6-0" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + x="144.51123" + y="64.972511" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan4877-6">- CRC24B & CRC24A were pre-calculated</tspan><tspan + sodipodi:role="line" + x="144.51123" + y="68.908539" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan11806">by the application</tspan><tspan + sodipodi:role="line" + x="144.51123" + y="72.844559" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan11808">- The raw TB is given as a contiguous</tspan><tspan + sodipodi:role="line" + x="144.51123" + y="76.780586" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan11810">buffer</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#7f8085;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="143.92094" + y="97.043495" + id="text4821-3-6-0-2" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + x="143.92094" + y="97.043495" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan11810-4">- Only CRC24A was pre-calculated by the</tspan><tspan + sodipodi:role="line" + x="143.92094" + y="100.97952" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan11848">application, therefore</tspan><tspan + sodipodi:role="line" + x="143.92094" + y="104.91554" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan11850">RTE_BBDEV_TURBO_CRC_24B_ATTACH</tspan><tspan + sodipodi:role="line" + x="143.92094" + y="108.85157" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan11852">is set in op_flags</tspan><tspan + sodipodi:role="line" + x="143.92094" + y="112.78759" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan11854">- The raw TB is given as a contiguous</tspan><tspan + sodipodi:role="line" + x="143.92094" + y="116.72362" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan11856">buffer</tspan></text> + <g + style="display:inline" + id="g4807-4-6" + transform="translate(9.4628222,49.06356)"> + <path + inkscape:connector-curvature="0" + id="path4741-8-0" + d="m 11.929873,70.237907 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-5-5" + d="m 18.686199,70.237907 c 0,0 -0.4016,2.480469 -1.370164,2.456847 -0.968564,-0.02363 -2.007999,-0.02363 -2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-5-6" + d="m 15.308036,72.671124 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="21.520061" + y="122.09515" + id="text4821-3-9-4-8" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-0-4-4" + x="21.520061" + y="122.09515" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">offset</tspan></text> + <g + style="display:inline" + id="g5063-4-7" + transform="matrix(0.83046983,0,0,1.0013214,12.615148,48.778811)"> + <path + inkscape:connector-curvature="0" + id="path4741-0-01-3" + d="m 18.686199,70.426891 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-8-9-4" + d="m 132.59878,70.332401 c 0,0 -0.4016,2.480469 -1.37017,2.456847 -0.96856,-0.02363 -2.008,-0.02363 -2.008,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-2-0-6" + d="m 75.831475,72.954606 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4809-2-9" + d="M 22.064362,72.860108 129.22061,72.765618" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="72.49247" + y="121.91208" + id="text4821-3-0-1" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-5-7" + x="72.49247" + y="121.91208" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">length</tspan></text> + <g + transform="translate(213.42759,24.366924)" + style="display:inline" + id="g10789-0-0"> + <path + inkscape:connector-curvature="0" + id="path4885-7-2" + d="m -198.21935,107.88646 h 61.73926" + style="fill:none;stroke:#7f7f7f;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.1199999, 0.26499999;stroke-dashoffset:0;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4887-5-0" + d="m -126.32385,107.88646 94.613422,-0.13363" + style="fill:none;stroke:#818181;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.1199999, 0.26499999;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="scale(0.9610099,1.040572)" + id="text4891-3-9" + y="105.46623" + x="-139.73984" + style="font-style:normal;font-weight:normal;font-size:5.39796209px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#818181;fill-opacity:1;stroke:none;stroke-width:0.40484715" + xml:space="preserve"><tspan + style="fill:#818181;fill-opacity:1;stroke-width:0.40484715" + y="105.46623" + x="-139.73984" + id="tspan4889-9-9" + sodipodi:role="line">or</tspan></text> + </g> + <rect + style="display:inline;opacity:1;fill:#d8d8d8;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect4735-7-3-8-5-5" + width="6.6797671" + height="14.033618" + x="20.985983" + y="103.46108" /> + <path + style="display:inline;fill:none;stroke:#9cc3e5;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-1-2);marker-end:url(#marker6509-7-7)" + d="m 28.597837,100.50577 c 19.777951,-0.0668 19.777951,-0.0668 19.777951,-0.0668" + id="path6255-4-7" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="35.296089" + y="93.607361" + id="text4821-3-3-0-5-4-7" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-3-95-5" + x="35.296089" + y="93.607361" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">k_neg</tspan></text> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-6-3" + width="16.163868" + height="14.074809" + x="27.665751" + y="103.46108" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="32.131104" + y="111.79969" + id="text877-8-6-9"><tspan + sodipodi:role="line" + id="tspan875-6-8-0" + x="32.131104" + y="111.79969" + style="font-size:3.52777767px;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;baseline-shift:sub;stroke-width:0.26458332" + id="tspan10851-5">1</tspan></tspan></text> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-6-1-0" + width="16.163868" + height="14.074809" + x="43.82962" + y="103.46108" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="48.417747" + y="111.79792" + id="text877-8-6-7-1"><tspan + sodipodi:role="line" + id="tspan875-6-8-8-5" + x="48.417747" + y="111.79792" + style="font-size:3.52777767px;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;baseline-shift:sub;stroke-width:0.26458332" + id="tspan10935-8">2</tspan></tspan></text> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-8-8" + width="30.921177" + height="14.014396" + x="59.993488" + y="103.46108" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="73.38308" + y="111.96056" + id="text877-8-4-6"><tspan + sodipodi:role="line" + id="tspan875-6-3-9" + x="73.38308" + y="111.96056" + style="font-size:3.52777767px;stroke-width:0.26458332">...</tspan></text> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-6-0-7" + width="16.163868" + height="14.074809" + x="90.914665" + y="103.46108" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="94.719627" + y="111.87534" + id="text877-8-6-1-5"><tspan + sodipodi:role="line" + id="tspan875-6-8-9-4" + x="94.719627" + y="111.87534" + style="font-size:3.52777767px;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;baseline-shift:sub;stroke-width:0.26458332" + id="tspan10851-4-2">c-1</tspan></tspan></text> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-6-0-8-6" + width="12.207969" + height="14.095527" + x="107.08015" + y="103.43876" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="109.69276" + y="111.79655" + id="text877-8-6-1-0-1"><tspan + sodipodi:role="line" + id="tspan875-6-8-9-9-0" + x="109.69276" + y="111.79655" + style="font-size:3.52777767px;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;baseline-shift:sub;stroke-width:0.26458332" + id="tspan10851-4-4-5">c</tspan></tspan></text> + <g + transform="translate(82.984032,37.995003)" + style="display:inline" + id="g10891-1-1-1-9"> + <rect + y="65.443756" + x="36.304085" + height="14.074809" + width="4.0010114" + id="rect6777-5-2-04-3-5-4-9-2" + style="opacity:1;fill:#0070c0;fill-opacity:1;stroke:#000000;stroke-width:0.15919298;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781-1-7-5-6-4-0-4-0" + y="39.324684" + x="-78.343857" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="39.324684" + x="-78.343857" + id="tspan6779-7-1-0-4-5-4-7-9" + sodipodi:role="line">CRC24A</tspan></text> + </g> + <path + style="display:inline;fill:none;stroke:#9cc3e5;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-0-9-1);marker-end:url(#marker6509-1-38-0)" + d="m 107.37813,100.63331 c 19.77795,-0.0668 19.77795,-0.0668 19.77795,-0.0668" + id="path6255-2-3-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="117.44109" + y="93.729691" + id="text4821-3-3-0-5-1-6-2" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-3-7-9-7" + x="117.44109" + y="93.729691" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">k_pos</tspan></text> + <rect + style="display:inline;opacity:1;fill:#d8d8d8;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect4735-7-3-8-5-5-2" + width="6.6797671" + height="14.033618" + x="13.230828" + y="152.20575" /> + <path + style="display:inline;fill:none;stroke:#9cc3e5;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-1-2-5);marker-end:url(#marker6509-7-7-6)" + d="m 20.312481,149.54973 c 19.777952,-0.0668 19.777952,-0.0668 19.777952,-0.0668" + id="path6255-4-7-7" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="26.656864" + y="140.64244" + id="text4821-3-3-0-5-4-7-0" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-3-95-5-0" + x="26.656864" + y="140.64244" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">k_neg</tspan></text> + <path + style="display:inline;fill:none;stroke:#9cc3e5;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-0-9-1-4);marker-end:url(#marker6509-1-38-0-7)" + d="m 114.65863,149.41609 c 19.77795,-0.0668 19.77795,-0.0668 19.77795,-0.0668" + id="path6255-2-3-9-5" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="125.03253" + y="140.5143" + id="text4821-3-3-0-5-1-6-2-0" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-3-7-9-7-4" + x="125.03253" + y="140.5143" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">k_pos</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="26.321789" + y="132.12051" + id="text4821-3-9-0-4" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-0-1-04" + x="26.321789" + y="132.12051" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">mbuf seg 1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="111.52624" + y="132.07547" + id="text4821-3-9-0-8-6" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-0-1-0-4" + x="111.52624" + y="132.07547" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">mbuf seg 2</tspan></text> + <path + style="display:inline;fill:none;stroke:#818181;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker8474-3)" + d="m 33.293244,139.67339 5.946743,5.7463" + id="path8464-83" + inkscape:connector-curvature="0" /> + <path + style="display:inline;fill:none;stroke:#818181;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker8474-2-2)" + d="m 114.56953,140.74706 -5.7463,5.94675" + id="path8464-8-8" + inkscape:connector-curvature="0" /> + <g + style="display:inline" + id="g4807-4-6-1" + transform="translate(1.5234255,97.894043)"> + <path + inkscape:connector-curvature="0" + id="path4741-8-0-9" + d="m 11.929873,70.237907 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-5-5-9" + d="m 18.686199,70.237907 c 0,0 -0.4016,2.480469 -1.370164,2.456847 -0.968564,-0.02363 -2.007999,-0.02363 -2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-5-6-4" + d="m 15.308036,72.671124 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="13.241572" + y="168.92551" + id="text4821-3-9-4-8-3" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-0-4-4-2" + x="13.241572" + y="168.92551" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">offset</tspan></text> + <g + style="display:inline" + id="g5063-4-7-3" + transform="matrix(0.96708187,0,0,1.0002483,2.1378366,97.68752)"> + <path + inkscape:connector-curvature="0" + id="path4741-0-01-3-5" + d="m 18.686199,70.426891 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-8-9-4-4" + d="m 132.59878,70.332401 c 0,0 -0.4016,2.480469 -1.37017,2.456847 -0.96856,-0.02363 -2.008,-0.02363 -2.008,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-2-0-6-6" + d="m 75.831475,72.954606 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4809-2-9-4" + d="M 22.064362,72.860108 129.22061,72.765618" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#9cc3e5;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="74.165497" + y="168.19868" + id="text4821-3-0-1-2" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-5-7-5" + x="74.165497" + y="168.19868" + style="fill:#9cc3e5;fill-opacity:1;stroke-width:0.23616144">length</tspan></text> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-6-3-0" + width="16.163868" + height="14.074809" + x="19.910595" + y="152.20575" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="24.37595" + y="160.54436" + id="text877-8-6-9-1"><tspan + sodipodi:role="line" + id="tspan875-6-8-0-4" + x="24.37595" + y="160.54436" + style="font-size:3.52777767px;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;baseline-shift:sub;stroke-width:0.26458332" + id="tspan10851-5-1">1</tspan></tspan></text> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-6-1-0-2" + width="16.163868" + height="14.074809" + x="36.074467" + y="152.20575" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="40.662594" + y="160.54259" + id="text877-8-6-7-1-7"><tspan + sodipodi:role="line" + id="tspan875-6-8-8-5-6" + x="40.662594" + y="160.54259" + style="font-size:3.52777767px;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;baseline-shift:sub;stroke-width:0.26458332" + id="tspan10935-8-3">2</tspan></tspan></text> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-8-8-7" + width="8.9107389" + height="14.115565" + x="52.187752" + y="152.21559" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="54.513344" + y="160.1346" + id="text877-8-4-6-7"><tspan + sodipodi:role="line" + id="tspan875-6-3-9-3" + x="54.513344" + y="160.1346" + style="font-size:3.52777767px;stroke-width:0.26458332">...</tspan></text> + <path + style="display:inline;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 61.098492,152.29471 9.985814,-0.03 v 4.04245 l -2.539064,1.46999 5.579254,2.87314 -3.00678,1.60362 v 4.04245 l -10.019224,0.0348 z" + id="path5575-6" + inkscape:connector-curvature="0" /> + <path + style="display:inline;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 90.024487,152.16192 -9.953251,0.003 -0.0334,3.94222 -2.63928,1.63703 5.67947,2.87314 -2.93996,1.57021 v 4.00905 l 9.886431,0.003 z" + id="path5581-0" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="62.273087" + y="160.61116" + id="text5879-0"><tspan + sodipodi:role="line" + id="tspan5877-5" + x="62.273087" + y="160.61116" + style="stroke-width:0.26458332">CB<tspan + style="font-size:64.99999762%;baseline-shift:sub" + id="tspan15311">N</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="83.078026" + y="160.61731" + id="text5883-5"><tspan + sodipodi:role="line" + id="tspan5881-6" + x="83.078026" + y="160.61731" + style="stroke-width:0.26458332">CB<tspan + style="font-size:64.99999762%;baseline-shift:sub" + id="tspan15313">N</tspan></tspan></text> + <path + style="display:inline;fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-1)" + d="m 66.006182,152.19788 c 0,0 5.144934,-13.09621 18.942724,-0.3341" + id="path5899-9" + inkscape:connector-curvature="0" /> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-8-8-7-8" + width="8.9107389" + height="14.115566" + x="90.024498" + y="152.084" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="92.247215" + y="160.20142" + id="text877-8-4-6-7-9"><tspan + sodipodi:role="line" + id="tspan875-6-3-9-3-4" + x="92.247215" + y="160.20142" + style="font-size:3.52777767px;stroke-width:0.26458332">...</tspan></text> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-6-3-0-3" + width="16.163868" + height="14.074809" + x="98.935234" + y="152.12476" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="102.77936" + y="160.27509" + id="text877-8-6-9-1-0"><tspan + sodipodi:role="line" + id="tspan875-6-8-0-4-7" + x="102.77936" + y="160.27509" + style="font-size:3.52777767px;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;baseline-shift:sub;stroke-width:0.26458332" + id="tspan10851-5-1-1">c-1</tspan></tspan></text> + <rect + style="display:inline;opacity:1;fill:#9cc3e5;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect967-6-0-8-6-9" + width="12.207969" + height="14.095527" + x="115.09911" + y="152.10405" /> + <g + transform="translate(91.002987,86.660285)" + style="display:inline" + id="g10891-1-1-1-9-9"> + <rect + y="65.443756" + x="36.304085" + height="14.074809" + width="4.0010114" + id="rect6777-5-2-04-3-5-4-9-2-3" + style="opacity:1;fill:#0070c0;fill-opacity:1;stroke:#000000;stroke-width:0.15919298;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + transform="rotate(-90)" + id="text6781-1-7-5-6-4-0-4-0-6" + y="39.324684" + x="-78.343857" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + xml:space="preserve"><tspan + style="font-size:2.82222223px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + y="39.324684" + x="-78.343857" + id="tspan6779-7-1-0-4-5-4-7-9-7" + sodipodi:role="line">CRC24A</tspan></text> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="118.12826" + y="160.26109" + id="text877-8-6-1-0-1-8"><tspan + sodipodi:role="line" + id="tspan875-6-8-9-9-0-1" + x="118.12826" + y="160.26109" + style="font-size:3.52777767px;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;baseline-shift:sub;stroke-width:0.26458332" + id="tspan10851-4-4-5-0">c</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#7f8085;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="144.46991" + y="144.41747" + id="text4821-3-6-0-2-7" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + x="144.46991" + y="144.41747" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan11856-1">- CRC24A was pre-calculated and </tspan><tspan + sodipodi:role="line" + x="144.46991" + y="148.35349" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan15485">RTE_BBDEV_TURBO_CRC_24B_ATTACH</tspan><tspan + sodipodi:role="line" + x="144.46991" + y="152.28952" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan15487">is set in op_flags</tspan><tspan + sodipodi:role="line" + x="144.46991" + y="156.22554" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan15489">- The raw TB is given as a "scattered"</tspan><tspan + sodipodi:role="line" + x="144.46991" + y="160.16156" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan15491">buffer through a chained mbuf</tspan></text> + <path + style="fill:#fec000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 73.879064,190.90497 -0.03341,-11.65962 h 4.209497 l -0.03341,11.65962 1.971111,-0.0334 -4.042449,3.90882 -4.04245,-3.90882 z" + id="path6066-6" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="-190.93837" + y="76.819031" + id="text6074-7" + transform="rotate(-90)"><tspan + sodipodi:role="line" + id="tspan6072-6" + x="-190.93837" + y="76.819031" + style="font-size:2.82222223px;stroke-width:0.26458332">encode</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a8d08d;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="74.319527" + y="213.86391" + id="text4821-3-3-0-8" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-6" + x="74.319527" + y="213.86391" + style="fill:#a8d08d;fill-opacity:1;stroke-width:0.23616144">length</tspan></text> + <path + style="display:inline;fill:none;stroke:#a8d08d;stroke-width:0.25237256;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-8);marker-end:url(#marker6509-78)" + d="m 22.905754,197.23808 c 15.904037,-0.0753 15.904037,-0.0753 15.904037,-0.0753" + id="path6255-22" + inkscape:connector-curvature="0" /> + <g + style="display:inline" + id="g4807-5-2" + transform="translate(4.1511086,145.38078)"> + <path + inkscape:connector-curvature="0" + id="path4741-6-72" + d="m 11.929873,70.237907 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-88-63" + d="m 18.686199,70.237907 c 0,0 -0.4016,2.480469 -1.370164,2.456847 -0.968564,-0.02363 -2.007999,-0.02363 -2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-9-0" + d="m 15.308036,72.671124 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + style="display:inline" + transform="matrix(0.9338915,0,0,1.0005032,5.402228,145.15927)" + id="g5063-5-2-4"> + <path + inkscape:connector-curvature="0" + id="path4741-0-0-0-2" + d="m 18.686199,70.426891 c 0,0 0.4016,2.480469 1.370164,2.456847 0.968564,-0.02363 2.007999,-0.02363 2.007999,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4741-5-8-2-1-6" + d="m 132.59878,70.332401 c 0,0 -0.4016,2.480469 -1.37017,2.456847 -0.96856,-0.02363 -2.008,-0.02363 -2.008,-0.02363" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4760-2-4-5-5" + d="m 75.831475,72.954606 -0.02362,2.527721" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path4809-8-8-9" + d="M 22.064362,72.860108 129.22061,72.765618" + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <rect + style="display:inline;opacity:1;fill:#d8d8d8;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect4735-7-3-3" + width="6.6797671" + height="14.033618" + x="15.753516" + y="199.83667" /> + <rect + style="display:inline;opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect6210-97" + width="16.248745" + height="14.0336" + x="22.433283" + y="199.83669" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="30.577127" + y="208.42111" + id="text6214-8"><tspan + sodipodi:role="line" + id="tspan6212-4" + x="30.577127" + y="208.42111" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332">CB<tspan + style="font-size:64.99999762%;text-align:center;baseline-shift:sub;text-anchor:middle" + id="tspan6218-7">1</tspan></tspan><tspan + sodipodi:role="line" + x="30.577127" + y="212.83084" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + id="tspan6216-3" /></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a8d08d;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="29.919048" + y="186.11703" + id="text4821-3-3-0-5-7" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-3-0" + x="29.919048" + y="186.11703" + style="fill:#a8d08d;fill-opacity:1;stroke-width:0.23616144">ea</tspan></text> + <rect + style="opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.15930426;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect6693-01" + width="42.577148" + height="13.993384" + x="54.930775" + y="199.87691" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="74.028419" + y="208.31436" + id="text6697-5"><tspan + sodipodi:role="line" + id="tspan6695-3" + x="74.028419" + y="208.31436" + style="stroke-width:0.26458332">...</tspan></text> + <rect + style="display:inline;opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.15922768;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect6210-8-1" + width="16.248745" + height="14.073822" + x="97.507919" + y="199.79646" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="105.80277" + y="207.61554" + id="text6214-78-1"><tspan + sodipodi:role="line" + id="tspan6212-2-2" + x="105.80277" + y="207.61554" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;text-align:center;baseline-shift:sub;text-anchor:middle;stroke-width:0.26458332" + id="tspan6218-3-0">c-1</tspan></tspan><tspan + sodipodi:role="line" + x="105.80277" + y="212.02527" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + id="tspan6216-2-3" /></text> + <rect + style="display:inline;opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.15929575;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect6210-8-3-28" + width="15.999747" + height="14.073821" + x="113.75667" + y="199.79646" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="121.63119" + y="208.12714" + id="text6214-78-6-0"><tspan + sodipodi:role="line" + id="tspan6212-2-9-72" + x="121.63119" + y="208.12714" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332">CB<tspan + style="font-size:2.2930553px;text-align:center;baseline-shift:sub;text-anchor:middle;stroke-width:0.26458332" + id="tspan6218-3-7-8">c</tspan></tspan><tspan + sodipodi:role="line" + x="121.63119" + y="212.53687" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + id="tspan6216-2-9-4" /></text> + <path + style="display:inline;fill:none;stroke:#a8d08d;stroke-width:0.25187415;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-0-6);marker-end:url(#marker6509-1-39)" + d="m 114.04452,197.18711 c 15.77071,-0.0757 15.77071,-0.0757 15.77071,-0.0757" + id="path6255-2-9" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#a8d08d;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="125.36855" + y="186.19617" + id="text4821-3-3-0-5-1-9" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + id="tspan4819-0-7-8-3-7-5" + x="125.36855" + y="186.19617" + style="fill:#a8d08d;fill-opacity:1;stroke-width:0.23616144">eb</tspan></text> + <rect + style="display:inline;opacity:1;fill:#a8d08d;fill-opacity:1;stroke:#000000;stroke-width:0.15899999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect6210-97-3" + width="16.248745" + height="14.0336" + x="38.68203" + y="199.83669" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="46.825874" + y="208.42111" + id="text6214-8-2"><tspan + sodipodi:role="line" + id="tspan6212-4-7" + x="46.825874" + y="208.42111" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332">CB<tspan + style="font-size:64.99999762%;text-align:center;baseline-shift:sub;text-anchor:middle" + id="tspan6218-7-0">2</tspan></tspan><tspan + sodipodi:role="line" + x="46.825874" + y="212.83084" + style="text-align:center;text-anchor:middle;stroke-width:0.26458332" + id="tspan6216-3-5" /></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.14881921px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#7f8085;fill-opacity:1;stroke:none;stroke-width:0.23616144" + x="145.06511" + y="197.72243" + id="text4821-3-6-0-2-7-2" + transform="scale(0.95903924,1.0427102)"><tspan + sodipodi:role="line" + x="145.06511" + y="197.72243" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan15491-4">Result is encoded back into the given</tspan><tspan + sodipodi:role="line" + x="145.06511" + y="201.65845" + style="fill:#7f8085;fill-opacity:1;stroke-width:0.23616144" + id="tspan16671">output mbuf as one contiguous buffer</tspan></text> + </g> +</svg> diff --git a/src/spdk/dpdk/doc/guides/prog_guide/img/vhost_net_arch.png b/src/spdk/dpdk/doc/guides/prog_guide/img/vhost_net_arch.png Binary files differnew file mode 100644 index 000000000..0005260f9 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/img/vhost_net_arch.png diff --git a/src/spdk/dpdk/doc/guides/prog_guide/index.rst b/src/spdk/dpdk/doc/guides/prog_guide/index.rst new file mode 100644 index 000000000..6f63f300a --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/index.rst @@ -0,0 +1,75 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2017 Intel Corporation. + +Programmer's Guide +================== + +.. toctree:: + :maxdepth: 3 + :numbered: + + intro + overview + env_abstraction_layer + service_cores + trace_lib + rcu_lib + ring_lib + stack_lib + mempool_lib + mbuf_lib + poll_mode_drv + rte_flow + switch_representation + traffic_metering_and_policing + traffic_management + bbdev + cryptodev_lib + compressdev + rte_security + rawdev + link_bonding_poll_mode_drv_lib + timer_lib + hash_lib + efd_lib + member_lib + lpm_lib + lpm6_lib + flow_classify_lib + packet_distrib_lib + reorder_lib + ip_fragment_reassembly_lib + generic_receive_offload_lib + generic_segmentation_offload_lib + pdump_lib + multi_proc_support + kernel_nic_interface + thread_safety_dpdk_functions + eventdev + event_ethernet_rx_adapter + event_ethernet_tx_adapter + event_timer_adapter + event_crypto_adapter + qos_framework + power_man + packet_classif_access_ctrl + packet_framework + vhost_lib + metrics_lib + telemetry_lib + bpf_lib + ipsec_lib + graph_lib + source_org + dev_kit_build_system + dev_kit_root_make_help + build-sdk-meson + meson_ut + extend_dpdk + build_app + ext_app_lib_make_help + perf_opt_guidelines + writing_efficient_code + lto + profile_app + glossary diff --git a/src/spdk/dpdk/doc/guides/prog_guide/intro.rst b/src/spdk/dpdk/doc/guides/prog_guide/intro.rst new file mode 100644 index 000000000..5b319d36d --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/intro.rst @@ -0,0 +1,56 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +Introduction +============ + +This document provides software architecture information, +development environment information and optimization guidelines. + +For programming examples and for instructions on compiling and running each sample application, +see the *DPDK Sample Applications User Guide* for details. + +For general information on compiling and running applications, see the *DPDK Getting Started Guide*. + +Documentation Roadmap +--------------------- + +The following is a list of DPDK documents in the suggested reading order: + +* **Release Notes** : Provides release-specific information, including supported features, + limitations, fixed issues, known issues and so on. + Also, provides the answers to frequently asked questions in FAQ format. + +* **Getting Started Guide** : Describes how to install and configure the DPDK software; + designed to get users up and running quickly with the software. + +* **FreeBSD* Getting Started Guide** : A document describing the use of the DPDK with FreeBSD* + has been added in DPDK Release 1.6.0. + Refer to this guide for installation and configuration instructions to get started using the DPDK with FreeBSD*. + +* **Programmer's Guide** (this document): Describes: + + * The software architecture and how to use it (through examples), + specifically in a Linux* application (linux) environment + + * The content of the DPDK, the build system + (including the commands that can be used in the root DPDK Makefile to build the development kit and an application) + and guidelines for porting an application + + * Optimizations used in the software and those that should be considered for new development + + A glossary of terms is also provided. + +* **API Reference** : Provides detailed information about DPDK functions, + data structures and other programming constructs. + +* **Sample Applications User Guide**: Describes a set of sample applications. + Each chapter describes a sample application that showcases specific functionality + and provides instructions on how to compile, run and use the sample application. + +Related Publications +-------------------- + +The following documents provide information that is relevant to the development of applications using the DPDK: + +* Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide diff --git a/src/spdk/dpdk/doc/guides/prog_guide/ip_fragment_reassembly_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/ip_fragment_reassembly_lib.rst new file mode 100644 index 000000000..6ac1bba64 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/ip_fragment_reassembly_lib.rst @@ -0,0 +1,110 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +IP Fragmentation and Reassembly Library +======================================= + +The IP Fragmentation and Reassembly Library implements IPv4 and IPv6 packet fragmentation and reassembly. + +Packet fragmentation +-------------------- + +Packet fragmentation routines divide input packet into number of fragments. +Both rte_ipv4_fragment_packet() and rte_ipv6_fragment_packet() functions assume that input mbuf data +points to the start of the IP header of the packet (i.e. L2 header is already stripped out). +To avoid copying of the actual packet's data zero-copy technique is used (rte_pktmbuf_attach). +For each fragment two new mbufs are created: + +* Direct mbuf -- mbuf that will contain L3 header of the new fragment. + +* Indirect mbuf -- mbuf that is attached to the mbuf with the original packet. + It's data field points to the start of the original packets data plus fragment offset. + +Then L3 header is copied from the original mbuf into the 'direct' mbuf and updated to reflect new fragmented status. +Note that for IPv4, header checksum is not recalculated and is set to zero. + +Finally 'direct' and 'indirect' mbufs for each fragment are linked together via mbuf's next filed to compose a packet for the new fragment. + +The caller has an ability to explicitly specify which mempools should be used to allocate 'direct' and 'indirect' mbufs from. + +For more information about direct and indirect mbufs, refer to :ref:`direct_indirect_buffer`. + +Packet reassembly +----------------- + +IP Fragment Table +~~~~~~~~~~~~~~~~~ + +Fragment table maintains information about already received fragments of the packet. + +Each IP packet is uniquely identified by triple <Source IP address>, <Destination IP address>, <ID>. + +Note that all update/lookup operations on Fragment Table are not thread safe. +So if different execution contexts (threads/processes) will access the same table simultaneously, +then some external syncing mechanism have to be provided. + +Each table entry can hold information about packets consisting of up to RTE_LIBRTE_IP_FRAG_MAX (by default: 4) fragments. + +Code example, that demonstrates creation of a new Fragment table: + +.. code-block:: c + + frag_cycles = (rte_get_tsc_hz() + MS_PER_S - 1) / MS_PER_S * max_flow_ttl; + bucket_num = max_flow_num + max_flow_num / 4; + frag_tbl = rte_ip_frag_table_create(max_flow_num, bucket_entries, max_flow_num, frag_cycles, socket_id); + +Internally Fragment table is a simple hash table. +The basic idea is to use two hash functions and <bucket_entries> \* associativity. +This provides 2 \* <bucket_entries> possible locations in the hash table for each key. +When the collision occurs and all 2 \* <bucket_entries> are occupied, +instead of reinserting existing keys into alternative locations, ip_frag_tbl_add() just returns a failure. + +Also, entries that resides in the table longer then <max_cycles> are considered as invalid, +and could be removed/replaced by the new ones. + +Note that reassembly demands a lot of mbuf's to be allocated. +At any given time up to (2 \* bucket_entries \* RTE_LIBRTE_IP_FRAG_MAX \* <maximum number of mbufs per packet>) +can be stored inside Fragment Table waiting for remaining fragments. + +Packet Reassembly +~~~~~~~~~~~~~~~~~ + +Fragmented packets processing and reassembly is done by the rte_ipv4_frag_reassemble_packet()/rte_ipv6_frag_reassemble_packet. +Functions. They either return a pointer to valid mbuf that contains reassembled packet, +or NULL (if the packet can't be reassembled for some reason). + +These functions are responsible for: + +#. Search the Fragment Table for entry with packet's <IPv4 Source Address, IPv4 Destination Address, Packet ID>. + +#. If the entry is found, then check if that entry already timed-out. + If yes, then free all previously received fragments, and remove information about them from the entry. + +#. If no entry with such key is found, then try to create a new one by one of two ways: + + a) Use as empty entry. + + b) Delete a timed-out entry, free mbufs associated with it mbufs and store a new entry with specified key in it. + +#. Update the entry with new fragment information and check if a packet can be reassembled + (the packet's entry contains all fragments). + + a) If yes, then, reassemble the packet, mark table's entry as empty and return the reassembled mbuf to the caller. + + b) If no, then return a NULL to the caller. + +If at any stage of packet processing an error is encountered +(e.g: can't insert new entry into the Fragment Table, or invalid/timed-out fragment), +then the function will free all associated with the packet fragments, +mark the table entry as invalid and return NULL to the caller. + +Debug logging and Statistics Collection +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The RTE_LIBRTE_IP_FRAG_TBL_STAT config macro controls statistics collection for the Fragment Table. +This macro is not enabled by default. + +The RTE_LIBRTE_IP_FRAG_DEBUG controls debug logging of IP fragments processing and reassembling. +This macro is disabled by default. +Note that while logging contains a lot of detailed information, +it slows down packet processing and might cause the loss of a lot of packets. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/ipsec_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/ipsec_lib.rst new file mode 100644 index 000000000..9f2b26072 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/ipsec_lib.rst @@ -0,0 +1,324 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2018-2020 Intel Corporation. + +IPsec Packet Processing Library +=============================== + +DPDK provides a library for IPsec data-path processing. +The library utilizes the existing DPDK crypto-dev and +security API to provide the application with a transparent and +high performant IPsec packet processing API. +The library is concentrated on data-path protocols processing +(ESP and AH), IKE protocol(s) implementation is out of scope +for this library. + +SA level API +------------ + +This API operates on the IPsec Security Association (SA) level. +It provides functionality that allows user for given SA to process +inbound and outbound IPsec packets. + +To be more specific: + +* for inbound ESP/AH packets perform decryption, authentication, integrity checking, remove ESP/AH related headers +* for outbound packets perform payload encryption, attach ICV, update/add IP headers, add ESP/AH headers/trailers, +* setup related mbuf fields (ol_flags, tx_offloads, etc.). +* initialize/un-initialize given SA based on user provided parameters. + +The SA level API is based on top of crypto-dev/security API and relies on +them to perform actual cipher and integrity checking. + +Due to the nature of the crypto-dev API (enqueue/dequeue model) the library +introduces an asynchronous API for IPsec packets destined to be processed by +the crypto-device. + +The expected API call sequence for data-path processing would be: + +.. code-block:: c + + /* enqueue for processing by crypto-device */ + rte_ipsec_pkt_crypto_prepare(...); + rte_cryptodev_enqueue_burst(...); + /* dequeue from crypto-device and do final processing (if any) */ + rte_cryptodev_dequeue_burst(...); + rte_ipsec_pkt_crypto_group(...); /* optional */ + rte_ipsec_pkt_process(...); + +For packets destined for inline processing no extra overhead +is required and the synchronous API call: rte_ipsec_pkt_process() +is sufficient for that case. + +.. note:: + + For more details about the IPsec API, please refer to the *DPDK API Reference*. + +The current implementation supports all four currently defined +rte_security types: + +RTE_SECURITY_ACTION_TYPE_NONE +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In that mode the library functions perform + +* for inbound packets: + + - check SQN + - prepare *rte_crypto_op* structure for each input packet + - verify that integrity check and decryption performed by crypto device + completed successfully + - check padding data + - remove outer IP header (tunnel mode) / update IP header (transport mode) + - remove ESP header and trailer, padding, IV and ICV data + - update SA replay window + +* for outbound packets: + + - generate SQN and IV + - add outer IP header (tunnel mode) / update IP header (transport mode) + - add ESP header and trailer, padding and IV data + - prepare *rte_crypto_op* structure for each input packet + - verify that crypto device operations (encryption, ICV generation) + were completed successfully + +RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In that mode the library functions perform same operations as in +``RTE_SECURITY_ACTION_TYPE_NONE``. The only difference is that crypto operations +are performed with CPU crypto synchronous API. + + +RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In that mode the library functions perform + +* for inbound packets: + + - verify that integrity check and decryption performed by *rte_security* + device completed successfully + - check SQN + - check padding data + - remove outer IP header (tunnel mode) / update IP header (transport mode) + - remove ESP header and trailer, padding, IV and ICV data + - update SA replay window + +* for outbound packets: + + - generate SQN and IV + - add outer IP header (tunnel mode) / update IP header (transport mode) + - add ESP header and trailer, padding and IV data + - update *ol_flags* inside *struct rte_mbuf* to indicate that + inline-crypto processing has to be performed by HW on this packet + - invoke *rte_security* device specific *set_pkt_metadata()* to associate + security device specific data with the packet + +RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In that mode the library functions perform + +* for inbound packets: + + - verify that integrity check and decryption performed by *rte_security* + device completed successfully + +* for outbound packets: + + - update *ol_flags* inside *struct rte_mbuf* to indicate that + inline-crypto processing has to be performed by HW on this packet + - invoke *rte_security* device specific *set_pkt_metadata()* to associate + security device specific data with the packet + +RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In that mode the library functions perform + +* for inbound packets: + + - prepare *rte_crypto_op* structure for each input packet + - verify that integrity check and decryption performed by crypto device + completed successfully + +* for outbound packets: + + - prepare *rte_crypto_op* structure for each input packet + - verify that crypto device operations (encryption, ICV generation) + were completed successfully + +To accommodate future custom implementations function pointers +model is used for both *crypto_prepare* and *process* implementations. + +SA database API +---------------- + +SA database(SAD) is a table with <key, value> pairs. + +Value is an opaque user provided pointer to the user defined SA data structure. + +According to RFC4301 each SA can be uniquely identified by a key +which is either: + + - security parameter index(SPI) + - or SPI and destination IP(DIP) + - or SPI, DIP and source IP(SIP) + +In case of multiple matches, longest matching key will be returned. + +Create/destroy +~~~~~~~~~~~~~~ + +librte_ipsec SAD implementation provides ability to create/destroy SAD tables. + +To create SAD table user has to specify how many entries of each key type is +required and IP protocol type (IPv4/IPv6). +As an example: + + +.. code-block:: c + + struct rte_ipsec_sad *sad; + struct rte_ipsec_sad_conf conf; + + conf.socket_id = -1; + conf.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = some_nb_rules_spi_only; + conf.max_sa[RTE_IPSEC_SAD_SPI_DIP] = some_nb_rules_spi_dip; + conf.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = some_nb_rules_spi_dip_sip; + conf.flags = RTE_IPSEC_SAD_FLAG_RW_CONCURRENCY; + + sad = rte_ipsec_sad_create("test", &conf); + +.. note:: + + for more information please refer to ipsec library API reference + +Add/delete rules +~~~~~~~~~~~~~~~~ + +Library also provides methods to add or delete key/value pairs from the SAD. +To add user has to specify key, key type and a value which is an opaque pointer to SA. +The key type reflects a set of tuple fields that will be used for lookup of the SA. +As mentioned above there are 3 types of a key and the representation of a key type is: + +.. code-block:: c + + RTE_IPSEC_SAD_SPI_ONLY, + RTE_IPSEC_SAD_SPI_DIP, + RTE_IPSEC_SAD_SPI_DIP_SIP, + +As an example, to add new entry into the SAD for IPv4 addresses: + +.. code-block:: c + + struct rte_ipsec_sa *sa; + union rte_ipsec_sad_key key; + + key.v4.spi = rte_cpu_to_be_32(spi_val); + if (key_type >= RTE_IPSEC_SAD_SPI_DIP) /* DIP is optional*/ + key.v4.dip = rte_cpu_to_be_32(dip_val); + if (key_type == RTE_IPSEC_SAD_SPI_DIP_SIP) /* SIP is optional*/ + key.v4.sip = rte_cpu_to_be_32(sip_val); + + rte_ipsec_sad_add(sad, &key, key_type, sa); + +.. note:: + + By performance reason it is better to keep spi/dip/sip in net byte order + to eliminate byteswap on lookup + +To delete user has to specify key and key type. + +Delete code would look like: + +.. code-block:: c + + union rte_ipsec_sad_key key; + + key.v4.spi = rte_cpu_to_be_32(necessary_spi); + if (key_type >= RTE_IPSEC_SAD_SPI_DIP) /* DIP is optional*/ + key.v4.dip = rte_cpu_to_be_32(necessary_dip); + if (key_type == RTE_IPSEC_SAD_SPI_DIP_SIP) /* SIP is optional*/ + key.v4.sip = rte_cpu_to_be_32(necessary_sip); + + rte_ipsec_sad_del(sad, &key, key_type); + + +Lookup +~~~~~~ +Library provides lookup by the given {SPI,DIP,SIP} tuple of +inbound ipsec packet as a key. + +The search key is represented by: + +.. code-block:: c + + union rte_ipsec_sad_key { + struct rte_ipsec_sadv4_key v4; + struct rte_ipsec_sadv6_key v6; + }; + +where v4 is a tuple for IPv4: + +.. code-block:: c + + struct rte_ipsec_sadv4_key { + uint32_t spi; + uint32_t dip; + uint32_t sip; + }; + +and v6 is a tuple for IPv6: + +.. code-block:: c + + struct rte_ipsec_sadv6_key { + uint32_t spi; + uint8_t dip[16]; + uint8_t sip[16]; + }; + +As an example, lookup related code could look like that: + +.. code-block:: c + + int i; + union rte_ipsec_sad_key keys[BURST_SZ]; + const union rte_ipsec_sad_key *keys_p[BURST_SZ]; + void *vals[BURST_SZ]; + + for (i = 0; i < BURST_SZ_MAX; i++) { + keys[i].v4.spi = esp_hdr[i]->spi; + keys[i].v4.dip = ipv4_hdr[i]->dst_addr; + keys[i].v4.sip = ipv4_hdr[i]->src_addr; + keys_p[i] = &keys[i]; + } + rte_ipsec_sad_lookup(sad, keys_p, vals, BURST_SZ); + + for (i = 0; i < BURST_SZ_MAX; i++) { + if (vals[i] == NULL) + printf("SA not found for key index %d\n", i); + else + printf("SA pointer is %p\n", vals[i]); + } + + +Supported features +------------------ + +* ESP protocol tunnel mode both IPv4/IPv6. + +* ESP protocol transport mode both IPv4/IPv6. + +* ESN and replay window. + +* algorithms: 3DES-CBC, AES-CBC, AES-CTR, AES-GCM, HMAC-SHA1, NULL. + + +Limitations +----------- + +The following features are not properly supported in the current version: + +* Hard/soft limit for SA lifetime (time interval/byte count). diff --git a/src/spdk/dpdk/doc/guides/prog_guide/kernel_nic_interface.rst b/src/spdk/dpdk/doc/guides/prog_guide/kernel_nic_interface.rst new file mode 100644 index 000000000..32d09ccf8 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/kernel_nic_interface.rst @@ -0,0 +1,323 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2015 Intel Corporation. + +.. _kni: + +Kernel NIC Interface +==================== + +The DPDK Kernel NIC Interface (KNI) allows userspace applications access to the Linux* control plane. + +The benefits of using the DPDK KNI are: + +* Faster than existing Linux TUN/TAP interfaces + (by eliminating system calls and copy_to_user()/copy_from_user() operations. + +* Allows management of DPDK ports using standard Linux net tools such as ethtool, ifconfig and tcpdump. + +* Allows an interface with the kernel network stack. + +The components of an application using the DPDK Kernel NIC Interface are shown in :numref:`figure_kernel_nic_intf`. + +.. _figure_kernel_nic_intf: + +.. figure:: img/kernel_nic_intf.* + + Components of a DPDK KNI Application + + +The DPDK KNI Kernel Module +-------------------------- + +The KNI kernel loadable module ``rte_kni`` provides the kernel interface +for DPDK applications. + +When the ``rte_kni`` module is loaded, it will create a device ``/dev/kni`` +that is used by the DPDK KNI API functions to control and communicate with +the kernel module. + +The ``rte_kni`` kernel module contains several optional parameters which +can be specified when the module is loaded to control its behavior: + +.. code-block:: console + + # modinfo rte_kni.ko + <snip> + parm: lo_mode: KNI loopback mode (default=lo_mode_none): + lo_mode_none Kernel loopback disabled + lo_mode_fifo Enable kernel loopback with fifo + lo_mode_fifo_skb Enable kernel loopback with fifo and skb buffer + (charp) + parm: kthread_mode: Kernel thread mode (default=single): + single Single kernel thread mode enabled. + multiple Multiple kernel thread mode enabled. + (charp) + parm: carrier: Default carrier state for KNI interface (default=off): + off Interfaces will be created with carrier state set to off. + on Interfaces will be created with carrier state set to on. + (charp) + +Loading the ``rte_kni`` kernel module without any optional parameters is +the typical way a DPDK application gets packets into and out of the kernel +network stack. Without any parameters, only one kernel thread is created +for all KNI devices for packet receiving in kernel side, loopback mode is +disabled, and the default carrier state of KNI interfaces is set to *off*. + +.. code-block:: console + + # insmod kmod/rte_kni.ko + +.. _kni_loopback_mode: + +Loopback Mode +~~~~~~~~~~~~~ + +For testing, the ``rte_kni`` kernel module can be loaded in loopback mode +by specifying the ``lo_mode`` parameter: + +.. code-block:: console + + # insmod kmod/rte_kni.ko lo_mode=lo_mode_fifo + +The ``lo_mode_fifo`` loopback option will loop back ring enqueue/dequeue +operations in kernel space. + +.. code-block:: console + + # insmod kmod/rte_kni.ko lo_mode=lo_mode_fifo_skb + +The ``lo_mode_fifo_skb`` loopback option will loop back ring enqueue/dequeue +operations and sk buffer copies in kernel space. + +If the ``lo_mode`` parameter is not specified, loopback mode is disabled. + +.. _kni_kernel_thread_mode: + +Kernel Thread Mode +~~~~~~~~~~~~~~~~~~ + +To provide flexibility of performance, the ``rte_kni`` KNI kernel module +can be loaded with the ``kthread_mode`` parameter. The ``rte_kni`` kernel +module supports two options: "single kernel thread" mode and "multiple +kernel thread" mode. + +Single kernel thread mode is enabled as follows: + +.. code-block:: console + + # insmod kmod/rte_kni.ko kthread_mode=single + +This mode will create only one kernel thread for all KNI interfaces to +receive data on the kernel side. By default, this kernel thread is not +bound to any particular core, but the user can set the core affinity for +this kernel thread by setting the ``core_id`` and ``force_bind`` parameters +in ``struct rte_kni_conf`` when the first KNI interface is created: + +For optimum performance, the kernel thread should be bound to a core in +on the same socket as the DPDK lcores used in the application. + +The KNI kernel module can also be configured to start a separate kernel +thread for each KNI interface created by the DPDK application. Multiple +kernel thread mode is enabled as follows: + +.. code-block:: console + + # insmod kmod/rte_kni.ko kthread_mode=multiple + +This mode will create a separate kernel thread for each KNI interface to +receive data on the kernel side. The core affinity of each ``kni_thread`` +kernel thread can be specified by setting the ``core_id`` and ``force_bind`` +parameters in ``struct rte_kni_conf`` when each KNI interface is created. + +Multiple kernel thread mode can provide scalable higher performance if +sufficient unused cores are available on the host system. + +If the ``kthread_mode`` parameter is not specified, the "single kernel +thread" mode is used. + +.. _kni_default_carrier_state: + +Default Carrier State +~~~~~~~~~~~~~~~~~~~~~ + +The default carrier state of KNI interfaces created by the ``rte_kni`` +kernel module is controlled via the ``carrier`` option when the module +is loaded. + +If ``carrier=off`` is specified, the kernel module will leave the carrier +state of the interface *down* when the interface is management enabled. +The DPDK application can set the carrier state of the KNI interface using the +``rte_kni_update_link()`` function. This is useful for DPDK applications +which require that the carrier state of the KNI interface reflect the +actual link state of the corresponding physical NIC port. + +If ``carrier=on`` is specified, the kernel module will automatically set +the carrier state of the interface to *up* when the interface is management +enabled. This is useful for DPDK applications which use the KNI interface as +a purely virtual interface that does not correspond to any physical hardware +and do not wish to explicitly set the carrier state of the interface with +``rte_kni_update_link()``. It is also useful for testing in loopback mode +where the NIC port may not be physically connected to anything. + +To set the default carrier state to *on*: + +.. code-block:: console + + # insmod kmod/rte_kni.ko carrier=on + +To set the default carrier state to *off*: + +.. code-block:: console + + # insmod kmod/rte_kni.ko carrier=off + +If the ``carrier`` parameter is not specified, the default carrier state +of KNI interfaces will be set to *off*. + +KNI Creation and Deletion +------------------------- + +Before any KNI interfaces can be created, the ``rte_kni`` kernel module must +be loaded into the kernel and configured withe ``rte_kni_init()`` function. + +The KNI interfaces are created by a DPDK application dynamically via the +``rte_kni_alloc()`` function. + +The ``struct rte_kni_conf`` structure contains fields which allow the +user to specify the interface name, set the MTU size, set an explicit or +random MAC address and control the affinity of the kernel Rx thread(s) +(both single and multi-threaded modes). +By default the KNI sample example gets the MTU from the matching device, +and in case of KNI PMD it is derived from mbuf buffer length. + +The ``struct rte_kni_ops`` structure contains pointers to functions to +handle requests from the ``rte_kni`` kernel module. These functions +allow DPDK applications to perform actions when the KNI interfaces are +manipulated by control commands or functions external to the application. + +For example, the DPDK application may wish to enabled/disable a physical +NIC port when a user enabled/disables a KNI interface with ``ip link set +[up|down] dev <ifaceX>``. The DPDK application can register a callback for +``config_network_if`` which will be called when the interface management +state changes. + +There are currently four callbacks for which the user can register +application functions: + +``config_network_if``: + + Called when the management state of the KNI interface changes. + For example, when the user runs ``ip link set [up|down] dev <ifaceX>``. + +``change_mtu``: + + Called when the user changes the MTU size of the KNI + interface. For example, when the user runs ``ip link set mtu <size> + dev <ifaceX>``. + +``config_mac_address``: + + Called when the user changes the MAC address of the KNI interface. + For example, when the user runs ``ip link set address <MAC> + dev <ifaceX>``. If the user sets this callback function to NULL, + but sets the ``port_id`` field to a value other than -1, a default + callback handler in the rte_kni library ``kni_config_mac_address()`` + will be called which calls ``rte_eth_dev_default_mac_addr_set()`` + on the specified ``port_id``. + +``config_promiscusity``: + + Called when the user changes the promiscuity state of the KNI + interface. For example, when the user runs ``ip link set promisc + [on|off] dev <ifaceX>``. If the user sets this callback function to + NULL, but sets the ``port_id`` field to a value other than -1, a default + callback handler in the rte_kni library ``kni_config_promiscusity()`` + will be called which calls ``rte_eth_promiscuous_<enable|disable>()`` + on the specified ``port_id``. + +``config_allmulticast``: + + Called when the user changes the allmulticast state of the KNI interface. + For example, when the user runs ``ifconfig <ifaceX> [-]allmulti``. If the + user sets this callback function to NULL, but sets the ``port_id`` field to + a value other than -1, a default callback handler in the rte_kni library + ``kni_config_allmulticast()`` will be called which calls + ``rte_eth_allmulticast_<enable|disable>()`` on the specified ``port_id``. + +In order to run these callbacks, the application must periodically call +the ``rte_kni_handle_request()`` function. Any user callback function +registered will be called directly from ``rte_kni_handle_request()`` so +care must be taken to prevent deadlock and to not block any DPDK fastpath +tasks. Typically DPDK applications which use these callbacks will need +to create a separate thread or secondary process to periodically call +``rte_kni_handle_request()``. + +The KNI interfaces can be deleted by a DPDK application with +``rte_kni_release()``. All KNI interfaces not explicitly deleted will be +deleted when the ``/dev/kni`` device is closed, either explicitly with +``rte_kni_close()`` or when the DPDK application is closed. + +DPDK mbuf Flow +-------------- + +To minimize the amount of DPDK code running in kernel space, the mbuf mempool is managed in userspace only. +The kernel module will be aware of mbufs, +but all mbuf allocation and free operations will be handled by the DPDK application only. + +:numref:`figure_pkt_flow_kni` shows a typical scenario with packets sent in both directions. + +.. _figure_pkt_flow_kni: + +.. figure:: img/pkt_flow_kni.* + + Packet Flow via mbufs in the DPDK KNI + + +Use Case: Ingress +----------------- + +On the DPDK RX side, the mbuf is allocated by the PMD in the RX thread context. +This thread will enqueue the mbuf in the rx_q FIFO, +and the next pointers in mbuf-chain will convert to physical address. +The KNI thread will poll all KNI active devices for the rx_q. +If an mbuf is dequeued, it will be converted to a sk_buff and sent to the net stack via netif_rx(). +The dequeued mbuf must be freed, so the same pointer is sent back in the free_q FIFO, +and next pointers must convert back to virtual address if exists before put in the free_q FIFO. + +The RX thread, in the same main loop, polls this FIFO and frees the mbuf after dequeuing it. +The address conversion of the next pointer is to prevent the chained mbuf +in different hugepage segments from causing kernel crash. + +Use Case: Egress +---------------- + +For packet egress the DPDK application must first enqueue several mbufs to create an mbuf cache on the kernel side. + +The packet is received from the Linux net stack, by calling the kni_net_tx() callback. +The mbuf is dequeued (without waiting due the cache) and filled with data from sk_buff. +The sk_buff is then freed and the mbuf sent in the tx_q FIFO. + +The DPDK TX thread dequeues the mbuf and sends it to the PMD via ``rte_eth_tx_burst()``. +It then puts the mbuf back in the cache. + +IOVA = VA: Support +------------------ + +KNI operates in IOVA_VA scheme when + +- LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) and +- EAL option `iova-mode=va` is passed or bus IOVA scheme in the DPDK is selected + as RTE_IOVA_VA. + +Due to IOVA to KVA address translations, based on the KNI use case there +can be a performance impact. For mitigation, forcing IOVA to PA via EAL +"--iova-mode=pa" option can be used, IOVA_DC bus iommu scheme can also +result in IOVA as PA. + +Ethtool +------- + +Ethtool is a Linux-specific tool with corresponding support in the kernel. +The current version of kni provides minimal ethtool functionality +including querying version and link state. It does not support link +control, statistics, or dumping device registers. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst new file mode 100644 index 000000000..2459fd243 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst @@ -0,0 +1,498 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2015 Intel Corporation. + +Link Bonding Poll Mode Driver Library +===================================== + +In addition to Poll Mode Drivers (PMDs) for physical and virtual hardware, +DPDK also includes a pure-software library that +allows physical PMDs to be bonded together to create a single logical PMD. + +.. figure:: img/bond-overview.* + + Bonded PMDs + + +The Link Bonding PMD library(librte_pmd_bond) supports bonding of groups of +``rte_eth_dev`` ports of the same speed and duplex to provide similar +capabilities to that found in Linux bonding driver to allow the aggregation +of multiple (slave) NICs into a single logical interface between a server +and a switch. The new bonded PMD will then process these interfaces based on +the mode of operation specified to provide support for features such as +redundant links, fault tolerance and/or load balancing. + +The librte_pmd_bond library exports a C API which provides an API for the +creation of bonded devices as well as the configuration and management of the +bonded device and its slave devices. + +.. note:: + + The Link Bonding PMD Library is enabled by default in the build + configuration files, the library can be disabled by setting + ``CONFIG_RTE_LIBRTE_PMD_BOND=n`` and recompiling the DPDK. + +Link Bonding Modes Overview +--------------------------- + +Currently the Link Bonding PMD library supports following modes of operation: + +* **Round-Robin (Mode 0):** + +.. figure:: img/bond-mode-0.* + + Round-Robin (Mode 0) + + + This mode provides load balancing and fault tolerance by transmission of + packets in sequential order from the first available slave device through + the last. Packets are bulk dequeued from devices then serviced in a + round-robin manner. This mode does not guarantee in order reception of + packets and down stream should be able to handle out of order packets. + +* **Active Backup (Mode 1):** + +.. figure:: img/bond-mode-1.* + + Active Backup (Mode 1) + + + In this mode only one slave in the bond is active at any time, a different + slave becomes active if, and only if, the primary active slave fails, + thereby providing fault tolerance to slave failure. The single logical + bonded interface's MAC address is externally visible on only one NIC (port) + to avoid confusing the network switch. + +* **Balance XOR (Mode 2):** + +.. figure:: img/bond-mode-2.* + + Balance XOR (Mode 2) + + + This mode provides transmit load balancing (based on the selected + transmission policy) and fault tolerance. The default policy (layer2) uses + a simple calculation based on the packet flow source and destination MAC + addresses as well as the number of active slaves available to the bonded + device to classify the packet to a specific slave to transmit on. Alternate + transmission policies supported are layer 2+3, this takes the IP source and + destination addresses into the calculation of the transmit slave port and + the final supported policy is layer 3+4, this uses IP source and + destination addresses as well as the TCP/UDP source and destination port. + +.. note:: + The coloring differences of the packets are used to identify different flow + classification calculated by the selected transmit policy + + +* **Broadcast (Mode 3):** + +.. figure:: img/bond-mode-3.* + + Broadcast (Mode 3) + + + This mode provides fault tolerance by transmission of packets on all slave + ports. + +* **Link Aggregation 802.3AD (Mode 4):** + +.. figure:: img/bond-mode-4.* + + Link Aggregation 802.3AD (Mode 4) + + + This mode provides dynamic link aggregation according to the 802.3ad + specification. It negotiates and monitors aggregation groups that share the + same speed and duplex settings using the selected balance transmit policy + for balancing outgoing traffic. + + DPDK implementation of this mode provide some additional requirements of + the application. + + #. It needs to call ``rte_eth_tx_burst`` and ``rte_eth_rx_burst`` with + intervals period of less than 100ms. + + #. Calls to ``rte_eth_tx_burst`` must have a buffer size of at least 2xN, + where N is the number of slaves. This is a space required for LACP + frames. Additionally LACP packets are included in the statistics, but + they are not returned to the application. + +* **Transmit Load Balancing (Mode 5):** + +.. figure:: img/bond-mode-5.* + + Transmit Load Balancing (Mode 5) + + + This mode provides an adaptive transmit load balancing. It dynamically + changes the transmitting slave, according to the computed load. Statistics + are collected in 100ms intervals and scheduled every 10ms. + + +Implementation Details +---------------------- + +The librte_pmd_bond bonded device are compatible with the Ethernet device API +exported by the Ethernet PMDs described in the *DPDK API Reference*. + +The Link Bonding Library supports the creation of bonded devices at application +startup time during EAL initialization using the ``--vdev`` option as well as +programmatically via the C API ``rte_eth_bond_create`` function. + +Bonded devices support the dynamical addition and removal of slave devices using +the ``rte_eth_bond_slave_add`` / ``rte_eth_bond_slave_remove`` APIs. + +After a slave device is added to a bonded device slave is stopped using +``rte_eth_dev_stop`` and then reconfigured using ``rte_eth_dev_configure`` +the RX and TX queues are also reconfigured using ``rte_eth_tx_queue_setup`` / +``rte_eth_rx_queue_setup`` with the parameters use to configure the bonding +device. If RSS is enabled for bonding device, this mode is also enabled on new +slave and configured as well. +Any flow which was configured to the bond device also is configured to the added +slave. + +Setting up multi-queue mode for bonding device to RSS, makes it fully +RSS-capable, so all slaves are synchronized with its configuration. This mode is +intended to provide RSS configuration on slaves transparent for client +application implementation. + +Bonding device stores its own version of RSS settings i.e. RETA, RSS hash +function and RSS key, used to set up its slaves. That let to define the meaning +of RSS configuration of bonding device as desired configuration of whole bonding +(as one unit), without pointing any of slave inside. It is required to ensure +consistency and made it more error-proof. + +RSS hash function set for bonding device, is a maximal set of RSS hash functions +supported by all bonded slaves. RETA size is a GCD of all its RETA's sizes, so +it can be easily used as a pattern providing expected behavior, even if slave +RETAs' sizes are different. If RSS Key is not set for bonded device, it's not +changed on the slaves and default key for device is used. + +As RSS configurations, there is flow consistency in the bonded slaves for the +next rte flow operations: + +Validate: + - Validate flow for each slave, failure at least for one slave causes to + bond validation failure. + +Create: + - Create the flow in all slaves. + - Save all the slaves created flows objects in bonding internal flow + structure. + - Failure in flow creation for existed slave rejects the flow. + - Failure in flow creation for new slaves in slave adding time rejects + the slave. + +Destroy: + - Destroy the flow in all slaves and release the bond internal flow + memory. + +Flush: + - Destroy all the bonding PMD flows in all the slaves. + +.. note:: + + Don't call slaves flush directly, It destroys all the slave flows which + may include external flows or the bond internal LACP flow. + +Query: + - Summarize flow counters from all the slaves, relevant only for + ``RTE_FLOW_ACTION_TYPE_COUNT``. + +Isolate: + - Call to flow isolate for all slaves. + - Failure in flow isolation for existed slave rejects the isolate mode. + - Failure in flow isolation for new slaves in slave adding time rejects + the slave. + +All settings are managed through the bonding port API and always are propagated +in one direction (from bonding to slaves). + +Link Status Change Interrupts / Polling +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Link bonding devices support the registration of a link status change callback, +using the ``rte_eth_dev_callback_register`` API, this will be called when the +status of the bonding device changes. For example in the case of a bonding +device which has 3 slaves, the link status will change to up when one slave +becomes active or change to down when all slaves become inactive. There is no +callback notification when a single slave changes state and the previous +conditions are not met. If a user wishes to monitor individual slaves then they +must register callbacks with that slave directly. + +The link bonding library also supports devices which do not implement link +status change interrupts, this is achieved by polling the devices link status at +a defined period which is set using the ``rte_eth_bond_link_monitoring_set`` +API, the default polling interval is 10ms. When a device is added as a slave to +a bonding device it is determined using the ``RTE_PCI_DRV_INTR_LSC`` flag +whether the device supports interrupts or whether the link status should be +monitored by polling it. + +Requirements / Limitations +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The current implementation only supports devices that support the same speed +and duplex to be added as a slaves to the same bonded device. The bonded device +inherits these attributes from the first active slave added to the bonded +device and then all further slaves added to the bonded device must support +these parameters. + +A bonding device must have a minimum of one slave before the bonding device +itself can be started. + +To use a bonding device dynamic RSS configuration feature effectively, it is +also required, that all slaves should be RSS-capable and support, at least one +common hash function available for each of them. Changing RSS key is only +possible, when all slave devices support the same key size. + +To prevent inconsistency on how slaves process packets, once a device is added +to a bonding device, RSS and rte flow configurations should be managed through +the bonding device API, and not directly on the slave. + +Like all other PMD, all functions exported by a PMD are lock-free functions +that are assumed not to be invoked in parallel on different logical cores to +work on the same target object. + +It should also be noted that the PMD receive function should not be invoked +directly on a slave devices after they have been to a bonded device since +packets read directly from the slave device will no longer be available to the +bonded device to read. + +Configuration +~~~~~~~~~~~~~ + +Link bonding devices are created using the ``rte_eth_bond_create`` API +which requires a unique device name, the bonding mode, +and the socket Id to allocate the bonding device's resources on. +The other configurable parameters for a bonded device are its slave devices, +its primary slave, a user defined MAC address and transmission policy to use if +the device is in balance XOR mode. + +Slave Devices +^^^^^^^^^^^^^ + +Bonding devices support up to a maximum of ``RTE_MAX_ETHPORTS`` slave devices +of the same speed and duplex. Ethernet devices can be added as a slave to a +maximum of one bonded device. Slave devices are reconfigured with the +configuration of the bonded device on being added to a bonded device. + +The bonded also guarantees to return the MAC address of the slave device to its +original value of removal of a slave from it. + +Primary Slave +^^^^^^^^^^^^^ + +The primary slave is used to define the default port to use when a bonded +device is in active backup mode. A different port will only be used if, and +only if, the current primary port goes down. If the user does not specify a +primary port it will default to being the first port added to the bonded device. + +MAC Address +^^^^^^^^^^^ + +The bonded device can be configured with a user specified MAC address, this +address will be inherited by the some/all slave devices depending on the +operating mode. If the device is in active backup mode then only the primary +device will have the user specified MAC, all other slaves will retain their +original MAC address. In mode 0, 2, 3, 4 all slaves devices are configure with +the bonded devices MAC address. + +If a user defined MAC address is not defined then the bonded device will +default to using the primary slaves MAC address. + +Balance XOR Transmit Policies +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There are 3 supported transmission policies for bonded device running in +Balance XOR mode. Layer 2, Layer 2+3, Layer 3+4. + +* **Layer 2:** Ethernet MAC address based balancing is the default + transmission policy for Balance XOR bonding mode. It uses a simple XOR + calculation on the source MAC address and destination MAC address of the + packet and then calculate the modulus of this value to calculate the slave + device to transmit the packet on. + +* **Layer 2 + 3:** Ethernet MAC address & IP Address based balancing uses a + combination of source/destination MAC addresses and the source/destination + IP addresses of the data packet to decide which slave port the packet will + be transmitted on. + +* **Layer 3 + 4:** IP Address & UDP Port based balancing uses a combination + of source/destination IP Address and the source/destination UDP ports of + the packet of the data packet to decide which slave port the packet will be + transmitted on. + +All these policies support 802.1Q VLAN Ethernet packets, as well as IPv4, IPv6 +and UDP protocols for load balancing. + +Using Link Bonding Devices +-------------------------- + +The librte_pmd_bond library supports two modes of device creation, the libraries +export full C API or using the EAL command line to statically configure link +bonding devices at application startup. Using the EAL option it is possible to +use link bonding functionality transparently without specific knowledge of the +libraries API, this can be used, for example, to add bonding functionality, +such as active backup, to an existing application which has no knowledge of +the link bonding C API. + +Using the Poll Mode Driver from an Application +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Using the librte_pmd_bond libraries API it is possible to dynamically create +and manage link bonding device from within any application. Link bonding +devices are created using the ``rte_eth_bond_create`` API which requires a +unique device name, the link bonding mode to initial the device in and finally +the socket Id which to allocate the devices resources onto. After successful +creation of a bonding device it must be configured using the generic Ethernet +device configure API ``rte_eth_dev_configure`` and then the RX and TX queues +which will be used must be setup using ``rte_eth_tx_queue_setup`` / +``rte_eth_rx_queue_setup``. + +Slave devices can be dynamically added and removed from a link bonding device +using the ``rte_eth_bond_slave_add`` / ``rte_eth_bond_slave_remove`` +APIs but at least one slave device must be added to the link bonding device +before it can be started using ``rte_eth_dev_start``. + +The link status of a bonded device is dictated by that of its slaves, if all +slave device link status are down or if all slaves are removed from the link +bonding device then the link status of the bonding device will go down. + +It is also possible to configure / query the configuration of the control +parameters of a bonded device using the provided APIs +``rte_eth_bond_mode_set/ get``, ``rte_eth_bond_primary_set/get``, +``rte_eth_bond_mac_set/reset`` and ``rte_eth_bond_xmit_policy_set/get``. + +Using Link Bonding Devices from the EAL Command Line +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Link bonding devices can be created at application startup time using the +``--vdev`` EAL command line option. The device name must start with the +net_bonding prefix followed by numbers or letters. The name must be unique for +each device. Each device can have multiple options arranged in a comma +separated list. Multiple devices definitions can be arranged by calling the +``--vdev`` option multiple times. + +Device names and bonding options must be separated by commas as shown below: + +.. code-block:: console + + $RTE_TARGET/app/testpmd -l 0-3 -n 4 --vdev 'net_bonding0,bond_opt0=..,bond opt1=..'--vdev 'net_bonding1,bond _opt0=..,bond_opt1=..' + +Link Bonding EAL Options +^^^^^^^^^^^^^^^^^^^^^^^^ + +There are multiple ways of definitions that can be assessed and combined as +long as the following two rules are respected: + +* A unique device name, in the format of net_bondingX is provided, + where X can be any combination of numbers and/or letters, + and the name is no greater than 32 characters long. + +* A least one slave device is provided with for each bonded device definition. + +* The operation mode of the bonded device being created is provided. + +The different options are: + +* mode: Integer value defining the bonding mode of the device. + Currently supports modes 0,1,2,3,4,5 (round-robin, active backup, balance, + broadcast, link aggregation, transmit load balancing). + +.. code-block:: console + + mode=2 + +* slave: Defines the PMD device which will be added as slave to the bonded + device. This option can be selected multiple times, for each device to be + added as a slave. Physical devices should be specified using their PCI + address, in the format domain:bus:devid.function + +.. code-block:: console + + slave=0000:0a:00.0,slave=0000:0a:00.1 + +* primary: Optional parameter which defines the primary slave port, + is used in active backup mode to select the primary slave for data TX/RX if + it is available. The primary port also is used to select the MAC address to + use when it is not defined by the user. This defaults to the first slave + added to the device if it is specified. The primary device must be a slave + of the bonded device. + +.. code-block:: console + + primary=0000:0a:00.0 + +* socket_id: Optional parameter used to select which socket on a NUMA device + the bonded devices resources will be allocated on. + +.. code-block:: console + + socket_id=0 + +* mac: Optional parameter to select a MAC address for link bonding device, + this overrides the value of the primary slave device. + +.. code-block:: console + + mac=00:1e:67:1d:fd:1d + +* xmit_policy: Optional parameter which defines the transmission policy when + the bonded device is in balance mode. If not user specified this defaults + to l2 (layer 2) forwarding, the other transmission policies available are + l23 (layer 2+3) and l34 (layer 3+4) + +.. code-block:: console + + xmit_policy=l23 + +* lsc_poll_period_ms: Optional parameter which defines the polling interval + in milli-seconds at which devices which don't support lsc interrupts are + checked for a change in the devices link status + +.. code-block:: console + + lsc_poll_period_ms=100 + +* up_delay: Optional parameter which adds a delay in milli-seconds to the + propagation of a devices link status changing to up, by default this + parameter is zero. + +.. code-block:: console + + up_delay=10 + +* down_delay: Optional parameter which adds a delay in milli-seconds to the + propagation of a devices link status changing to down, by default this + parameter is zero. + +.. code-block:: console + + down_delay=50 + +Examples of Usage +^^^^^^^^^^^^^^^^^ + +Create a bonded device in round robin mode with two slaves specified by their PCI address: + +.. code-block:: console + + $RTE_TARGET/app/testpmd -l 0-3 -n 4 --vdev 'net_bonding0,mode=0,slave=0000:0a:00.01,slave=0000:04:00.00' -- --port-topology=chained + +Create a bonded device in round robin mode with two slaves specified by their PCI address and an overriding MAC address: + +.. code-block:: console + + $RTE_TARGET/app/testpmd -l 0-3 -n 4 --vdev 'net_bonding0,mode=0,slave=0000:0a:00.01,slave=0000:04:00.00,mac=00:1e:67:1d:fd:1d' -- --port-topology=chained + +Create a bonded device in active backup mode with two slaves specified, and a primary slave specified by their PCI addresses: + +.. code-block:: console + + $RTE_TARGET/app/testpmd -l 0-3 -n 4 --vdev 'net_bonding0,mode=1,slave=0000:0a:00.01,slave=0000:04:00.00,primary=0000:0a:00.01' -- --port-topology=chained + +Create a bonded device in balance mode with two slaves specified by their PCI addresses, and a transmission policy of layer 3 + 4 forwarding: + +.. code-block:: console + + $RTE_TARGET/app/testpmd -l 0-3 -n 4 --vdev 'net_bonding0,mode=2,slave=0000:0a:00.01,slave=0000:04:00.00,xmit_policy=l34' -- --port-topology=chained diff --git a/src/spdk/dpdk/doc/guides/prog_guide/lpm6_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/lpm6_lib.rst new file mode 100644 index 000000000..d1aea91ca --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/lpm6_lib.rst @@ -0,0 +1,208 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +LPM6 Library +============ + +The LPM6 (LPM for IPv6) library component implements the Longest Prefix Match (LPM) table search method for 128-bit keys +that is typically used to find the best match route in IPv6 forwarding applications. + +LPM6 API Overview +----------------- + +The main configuration parameters for the LPM6 library are: + +* Maximum number of rules: This defines the size of the table that holds the rules, + and therefore the maximum number of rules that can be added. + +* Number of tbl8s: A tbl8 is a node of the trie that the LPM6 algorithm is based on. + +This parameter is related to the number of rules you can have, +but there is no way to accurately predict the number needed to hold a specific number of rules, +since it strongly depends on the depth and IP address of every rule. +One tbl8 consumes 1 kb of memory. As a recommendation, 65536 tbl8s should be sufficient to store +several thousand IPv6 rules, but the number can vary depending on the case. + +An LPM prefix is represented by a pair of parameters (128-bit key, depth), with depth in the range of 1 to 128. +An LPM rule is represented by an LPM prefix and some user data associated with the prefix. +The prefix serves as the unique identifier for the LPM rule. +In this implementation, the user data is 21-bits long and is called "next hop", +which corresponds to its main use of storing the ID of the next hop in a routing table entry. + +The main methods exported for the LPM component are: + +* Add LPM rule: The LPM rule is provided as input. + If there is no rule with the same prefix present in the table, then the new rule is added to the LPM table. + If a rule with the same prefix is already present in the table, the next hop of the rule is updated. + An error is returned when there is no available space left. + +* Delete LPM rule: The prefix of the LPM rule is provided as input. + If a rule with the specified prefix is present in the LPM table, then it is removed. + +* Lookup LPM key: The 128-bit key is provided as input. + The algorithm selects the rule that represents the best match for the given key and returns the next hop of that rule. + In the case that there are multiple rules present in the LPM table that have the same 128-bit value, + the algorithm picks the rule with the highest depth as the best match rule, + which means the rule has the highest number of most significant bits matching between the input key and the rule key. + +Implementation Details +~~~~~~~~~~~~~~~~~~~~~~ + +This is a modification of the algorithm used for IPv4 (see :ref:`lpm4_details`). +In this case, instead of using two levels, one with a tbl24 and a second with a tbl8, 14 levels are used. + +The implementation can be seen as a multi-bit trie where the *stride* +or number of bits inspected on each level varies from level to level. +Specifically, 24 bits are inspected on the root node, and the remaining 104 bits are inspected in groups of 8 bits. +This effectively means that the trie has 14 levels at the most, depending on the rules that are added to the table. + +The algorithm allows the lookup operation to be performed with a number of memory accesses +that directly depends on the length of the rule and +whether there are other rules with bigger depths and the same key in the data structure. +It can vary from 1 to 14 memory accesses, with 5 being the average value for the lengths +that are most commonly used in IPv6. + +The main data structure is built using the following elements: + +* A table with 224 entries + +* A number of tables, configurable by the user through the API, with 28 entries + +The first table, called tbl24, is indexed using the first 24 bits of the IP address be looked up, +while the rest of the tables, called tbl8s, +are indexed using the rest of the bytes of the IP address, in chunks of 8 bits. +This means that depending on the outcome of trying to match the IP address of an incoming packet to the rule stored in the tbl24 +or the subsequent tbl8s we might need to continue the lookup process in deeper levels of the tree. + +Similar to the limitation presented in the algorithm for IPv4, +to store every possible IPv6 rule, we would need a table with 2^128 entries. +This is not feasible due to resource restrictions. + +By splitting the process in different tables/levels and limiting the number of tbl8s, +we can greatly reduce memory consumption while maintaining a very good lookup speed (one memory access per level). + + +.. figure:: img/tbl24_tbl8_tbl8.* + + Table split into different levels + + +An entry in a table contains the following fields: + +* next hop / index to the tbl8 + +* depth of the rule (length) + +* valid flag + +* valid group flag + +* external entry flag + +The first field can either contain a number indicating the tbl8 in which the lookup process should continue +or the next hop itself if the longest prefix match has already been found. +The depth or length of the rule is the number of bits of the rule that is stored in a specific entry. +The flags are used to determine whether the entry/table is valid or not +and whether the search process have finished or not respectively. + +Both types of tables share the same structure. + +The other main data structure is a table containing the main information about the rules (IP, next hop and depth). +This is a higher level table, used for different things: + +* Check whether a rule already exists or not, prior to addition or deletion, + without having to actually perform a lookup. + +When deleting, to check whether there is a rule containing the one that is to be deleted. +This is important, since the main data structure will have to be updated accordingly. + +Addition +~~~~~~~~ + +When adding a rule, there are different possibilities. +If the rule's depth is exactly 24 bits, then: + +* Use the rule (IP address) as an index to the tbl24. + +* If the entry is invalid (i.e. it doesn't already contain a rule) then set its next hop to its value, + the valid flag to 1 (meaning this entry is in use), + and the external entry flag to 0 (meaning the lookup process ends at this point, + since this is the longest prefix that matches). + +If the rule's depth is bigger than 24 bits but a multiple of 8, then: + +* Use the first 24 bits of the rule as an index to the tbl24. + +* If the entry is invalid (i.e. it doesn't already contain a rule) then look for a free tbl8, + set the index to the tbl8 to this value, + the valid flag to 1 (meaning this entry is in use), + and the external entry flag to 1 + (meaning the lookup process must continue since the rule hasn't been explored completely). + +* Use the following 8 bits of the rule as an index to the next tbl8. + +* Repeat the process until the tbl8 at the right level (depending on the depth) has been reached + and fill it with the next hop, setting the next entry flag to 0. + +If the rule's depth is any other value, prefix expansion must be performed. +This means the rule is copied to all the entries (as long as they are not in use) which would also cause a match. + +As a simple example, let's assume the depth is 20 bits. +This means that there are 2^(24-20) = 16 different combinations of the first 24 bits of an IP address that would cause a match. +Hence, in this case, we copy the exact same entry to every position indexed by one of these combinations. + +By doing this we ensure that during the lookup process, if a rule matching the IP address exists, +it is found in, at the most, 14 memory accesses, +depending on how many times we need to move to the next table. +Prefix expansion is one of the keys of this algorithm, since it improves the speed dramatically by adding redundancy. + +Prefix expansion can be performed at any level. +So, for example, is the depth is 34 bits, it will be performed in the third level (second tbl8-based level). + +Lookup +~~~~~~ + +The lookup process is much simpler and quicker. In this case: + +* Use the first 24 bits of the IP address as an index to the tbl24. + If the entry is not in use, then it means we don't have a rule matching this IP. + If it is valid and the external entry flag is set to 0, then the next hop is returned. + +* If it is valid and the external entry flag is set to 1, then we use the tbl8 index to find out the tbl8 to be checked, + and the next 8 bits of the IP address as an index to this table. + Similarly, if the entry is not in use, then we don't have a rule matching this IP address. + If it is valid then check the external entry flag for a new tbl8 to be inspected. + +* Repeat the process until either we find an invalid entry (lookup miss) or a valid entry with the external entry flag set to 0. + Return the next hop in the latter case. + +Limitations in the Number of Rules +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +There are different things that limit the number of rules that can be added. +The first one is the maximum number of rules, which is a parameter passed through the API. +Once this number is reached, it is not possible to add any more rules to the routing table unless one or more are removed. + +The second limitation is in the number of tbl8s available. +If we exhaust tbl8s, we won't be able to add any more rules. +How to know how many of them are necessary for a specific routing table is hard to determine in advance. + +In this algorithm, the maximum number of tbl8s a single rule can consume is 13, +which is the number of levels minus one, since the first three bytes are resolved in the tbl24. However: + +* Typically, on IPv6, routes are not longer than 48 bits, which means rules usually take up to 3 tbl8s. + +As explained in the LPM for IPv4 algorithm, it is possible and very likely that several rules will share one or more tbl8s, +depending on what their first bytes are. +If they share the same first 24 bits, for instance, the tbl8 at the second level will be shared. +This might happen again in deeper levels, so, effectively, +two 48 bit-long rules may use the same three tbl8s if the only difference is in their last byte. + +The number of tbl8s is a parameter exposed to the user through the API in this version of the algorithm, +due to its impact in memory consumption and the number or rules that can be added to the LPM table. +One tbl8 consumes 1 kilobyte of memory. + +Use Case: IPv6 Forwarding +------------------------- + +The LPM algorithm is used to implement the Classless Inter-Domain Routing (CIDR) strategy used by routers implementing IP forwarding. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/lpm_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/lpm_lib.rst new file mode 100644 index 000000000..1609a57d0 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/lpm_lib.rst @@ -0,0 +1,198 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +.. _LPM_Library: + +LPM Library +=========== + +The DPDK LPM library component implements the Longest Prefix Match (LPM) table search method for 32-bit keys +that is typically used to find the best route match in IP forwarding applications. + +LPM API Overview +---------------- + +The main configuration parameter for LPM component instances is the maximum number of rules to support. +An LPM prefix is represented by a pair of parameters (32- bit key, depth), with depth in the range of 1 to 32. +An LPM rule is represented by an LPM prefix and some user data associated with the prefix. +The prefix serves as the unique identifier of the LPM rule. +In this implementation, the user data is 1-byte long and is called next hop, +in correlation with its main use of storing the ID of the next hop in a routing table entry. + +The main methods exported by the LPM component are: + +* Add LPM rule: The LPM rule is provided as input. + If there is no rule with the same prefix present in the table, then the new rule is added to the LPM table. + If a rule with the same prefix is already present in the table, the next hop of the rule is updated. + An error is returned when there is no available rule space left. + +* Delete LPM rule: The prefix of the LPM rule is provided as input. + If a rule with the specified prefix is present in the LPM table, then it is removed. + +* Lookup LPM key: The 32-bit key is provided as input. + The algorithm selects the rule that represents the best match for the given key and returns the next hop of that rule. + In the case that there are multiple rules present in the LPM table that have the same 32-bit key, + the algorithm picks the rule with the highest depth as the best match rule, + which means that the rule has the highest number of most significant bits matching between the input key and the rule key. + +.. _lpm4_details: + +Implementation Details +---------------------- + +The current implementation uses a variation of the DIR-24-8 algorithm that trades memory usage for improved LPM lookup speed. +The algorithm allows the lookup operation to be performed with typically a single memory read access. +In the statistically rare case when the best match rule is having a depth bigger than 24, +the lookup operation requires two memory read accesses. +Therefore, the performance of the LPM lookup operation is greatly influenced by +whether the specific memory location is present in the processor cache or not. + +The main data structure is built using the following elements: + +* A table with 2^24 entries. + +* A number of tables (RTE_LPM_TBL8_NUM_GROUPS) with 2^8 entries. + +The first table, called tbl24, is indexed using the first 24 bits of the IP address to be looked up, +while the second table(s), called tbl8, is indexed using the last 8 bits of the IP address. +This means that depending on the outcome of trying to match the IP address of an incoming packet to the rule stored in the tbl24 +we might need to continue the lookup process in the second level. + +Since every entry of the tbl24 can potentially point to a tbl8, ideally, we would have 2^24 tbl8s, +which would be the same as having a single table with 2^32 entries. +This is not feasible due to resource restrictions. +Instead, this approach takes advantage of the fact that rules longer than 24 bits are very rare. +By splitting the process in two different tables/levels and limiting the number of tbl8s, +we can greatly reduce memory consumption while maintaining a very good lookup speed (one memory access, most of the times). + + +.. figure:: img/tbl24_tbl8.* + + Table split into different levels + + +An entry in tbl24 contains the following fields: + +* next hop / index to the tbl8 + +* valid flag + +* external entry flag + +* depth of the rule (length) + +The first field can either contain a number indicating the tbl8 in which the lookup process should continue +or the next hop itself if the longest prefix match has already been found. +The two flags are used to determine whether the entry is valid or not and +whether the search process have finished or not respectively. +The depth or length of the rule is the number of bits of the rule that is stored in a specific entry. + +An entry in a tbl8 contains the following fields: + +* next hop + +* valid + +* valid group + +* depth + +Next hop and depth contain the same information as in the tbl24. +The two flags show whether the entry and the table are valid respectively. + +The other main data structure is a table containing the main information about the rules (IP and next hop). +This is a higher level table, used for different things: + +* Check whether a rule already exists or not, prior to addition or deletion, + without having to actually perform a lookup. + +* When deleting, to check whether there is a rule containing the one that is to be deleted. + This is important, since the main data structure will have to be updated accordingly. + +Addition +~~~~~~~~ + +When adding a rule, there are different possibilities. +If the rule's depth is exactly 24 bits, then: + +* Use the rule (IP address) as an index to the tbl24. + +* If the entry is invalid (i.e. it doesn't already contain a rule) then set its next hop to its value, + the valid flag to 1 (meaning this entry is in use), + and the external entry flag to 0 + (meaning the lookup process ends at this point, since this is the longest prefix that matches). + +If the rule's depth is exactly 32 bits, then: + +* Use the first 24 bits of the rule as an index to the tbl24. + +* If the entry is invalid (i.e. it doesn't already contain a rule) then look for a free tbl8, + set the index to the tbl8 to this value, + the valid flag to 1 (meaning this entry is in use), and the external entry flag to 1 + (meaning the lookup process must continue since the rule hasn't been explored completely). + +If the rule's depth is any other value, prefix expansion must be performed. +This means the rule is copied to all the entries (as long as they are not in use) which would also cause a match. + +As a simple example, let's assume the depth is 20 bits. +This means that there are 2^(24 - 20) = 16 different combinations of the first 24 bits of an IP address that +would cause a match. +Hence, in this case, we copy the exact same entry to every position indexed by one of these combinations. + +By doing this we ensure that during the lookup process, if a rule matching the IP address exists, +it is found in either one or two memory accesses, +depending on whether we need to move to the next table or not. +Prefix expansion is one of the keys of this algorithm, +since it improves the speed dramatically by adding redundancy. + +Lookup +~~~~~~ + +The lookup process is much simpler and quicker. In this case: + +* Use the first 24 bits of the IP address as an index to the tbl24. + If the entry is not in use, then it means we don't have a rule matching this IP. + If it is valid and the external entry flag is set to 0, then the next hop is returned. + +* If it is valid and the external entry flag is set to 1, + then we use the tbl8 index to find out the tbl8 to be checked, + and the last 8 bits of the IP address as an index to this table. + Similarly, if the entry is not in use, then we don't have a rule matching this IP address. + If it is valid then the next hop is returned. + +Limitations in the Number of Rules +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +There are different things that limit the number of rules that can be added. +The first one is the maximum number of rules, which is a parameter passed through the API. +Once this number is reached, +it is not possible to add any more rules to the routing table unless one or more are removed. + +The second reason is an intrinsic limitation of the algorithm. +As explained before, to avoid high memory consumption, the number of tbl8s is limited in compilation time +(this value is by default 256). +If we exhaust tbl8s, we won't be able to add any more rules. +How many of them are necessary for a specific routing table is hard to determine in advance. + +A tbl8 is consumed whenever we have a new rule with depth bigger than 24, +and the first 24 bits of this rule are not the same as the first 24 bits of a rule previously added. +If they are, then the new rule will share the same tbl8 than the previous one, +since the only difference between the two rules is within the last byte. + +With the default value of 256, we can have up to 256 rules longer than 24 bits that differ on their first three bytes. +Since routes longer than 24 bits are unlikely, this shouldn't be a problem in most setups. +Even if it is, however, the number of tbl8s can be modified. + +Use Case: IPv4 Forwarding +~~~~~~~~~~~~~~~~~~~~~~~~~ + +The LPM algorithm is used to implement Classless Inter-Domain Routing (CIDR) strategy used by routers implementing IPv4 forwarding. + +References +~~~~~~~~~~ + +* RFC1519 Classless Inter-Domain Routing (CIDR): an Address Assignment and Aggregation Strategy, + `http://www.ietf.org/rfc/rfc1519 <http://www.ietf.org/rfc/rfc1519>`_ + +* Pankaj Gupta, Algorithms for Routing Lookups and Packet Classification, PhD Thesis, Stanford University, + 2000 (`http://klamath.stanford.edu/~pankaj/thesis/thesis_1sided.pdf <http://klamath.stanford.edu/~pankaj/thesis/thesis_1sided.pdf>`_ ) diff --git a/src/spdk/dpdk/doc/guides/prog_guide/lto.rst b/src/spdk/dpdk/doc/guides/prog_guide/lto.rst new file mode 100644 index 000000000..277a6f109 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/lto.rst @@ -0,0 +1,43 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2019 Marvell International Ltd. + +Link Time Optimization +====================== + +The DPDK supports compilation with link time optimization turned on. +This depends obviously on the ability of the compiler to do "whole +program" optimization at link time and is available only for compilers +that support that feature. +To be more specific, compiler (in addition to performing LTO) have to +support creation of ELF objects containing both normal code and internal +representation (called fat-lto-objects in gcc and icc). +This is required since during build some code is generated by parsing +produced ELF objects (pmdinfogen). + +The amount of performance gain that one can get from LTO depends on the +compiler and the code that is being compiled. +However LTO is also useful for additional code analysis done by the +compiler. +In particular due to interprocedural analysis compiler can produce +additional warnings about variables that might be used uninitialized. +Some of these warnings might be "false positives" though and you might +need to explicitly initialize variable in order to silence the compiler. + +Please note that turning LTO on causes considerable extension of +build time. + +When using make based build, link time optimization can be enabled for +the whole DPDK by setting: + +.. code-block:: console + + CONFIG_RTE_ENABLE_LTO=y + +in config file. + +For the meson based build it can be enabled by setting meson built-in +'b_lto' option: + +.. code-block:: console + + meson build -Db_lto=true diff --git a/src/spdk/dpdk/doc/guides/prog_guide/mbuf_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/mbuf_lib.rst new file mode 100644 index 000000000..0d3223b08 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/mbuf_lib.rst @@ -0,0 +1,252 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +.. _Mbuf_Library: + +Mbuf Library +============ + +The mbuf library provides the ability to allocate and free buffers (mbufs) +that may be used by the DPDK application to store message buffers. +The message buffers are stored in a mempool, using the :ref:`Mempool Library <Mempool_Library>`. + +A rte_mbuf struct generally carries network packet buffers, but it can actually +be any data (control data, events, ...). +The rte_mbuf header structure is kept as small as possible and currently uses +just two cache lines, with the most frequently used fields being on the first +of the two cache lines. + +Design of Packet Buffers +------------------------ + +For the storage of the packet data (including protocol headers), two approaches were considered: + +#. Embed metadata within a single memory buffer the structure followed by a fixed size area for the packet data. + +#. Use separate memory buffers for the metadata structure and for the packet data. + +The advantage of the first method is that it only needs one operation to allocate/free the whole memory representation of a packet. +On the other hand, the second method is more flexible and allows +the complete separation of the allocation of metadata structures from the allocation of packet data buffers. + +The first method was chosen for the DPDK. +The metadata contains control information such as message type, length, +offset to the start of the data and a pointer for additional mbuf structures allowing buffer chaining. + +Message buffers that are used to carry network packets can handle buffer chaining +where multiple buffers are required to hold the complete packet. +This is the case for jumbo frames that are composed of many mbufs linked together through their next field. + +For a newly allocated mbuf, the area at which the data begins in the message buffer is +RTE_PKTMBUF_HEADROOM bytes after the beginning of the buffer, which is cache aligned. +Message buffers may be used to carry control information, packets, events, +and so on between different entities in the system. +Message buffers may also use their buffer pointers to point to other message buffer data sections or other structures. + +:numref:`figure_mbuf1` and :numref:`figure_mbuf2` show some of these scenarios. + +.. _figure_mbuf1: + +.. figure:: img/mbuf1.* + + An mbuf with One Segment + + +.. _figure_mbuf2: + +.. figure:: img/mbuf2.* + + An mbuf with Three Segments + + +The Buffer Manager implements a fairly standard set of buffer access functions to manipulate network packets. + +Buffers Stored in Memory Pools +------------------------------ + +The Buffer Manager uses the :ref:`Mempool Library <Mempool_Library>` to allocate buffers. +Therefore, it ensures that the packet header is interleaved optimally across the channels and ranks for L3 processing. +An mbuf contains a field indicating the pool that it originated from. +When calling rte_pktmbuf_free(m), the mbuf returns to its original pool. + +Constructors +------------ + +Packet mbuf constructors are provided by the API. +The rte_pktmbuf_init() function initializes some fields in the mbuf structure that +are not modified by the user once created (mbuf type, origin pool, buffer start address, and so on). +This function is given as a callback function to the rte_mempool_create() function at pool creation time. + +Allocating and Freeing mbufs +---------------------------- + +Allocating a new mbuf requires the user to specify the mempool from which the mbuf should be taken. +For any newly-allocated mbuf, it contains one segment, with a length of 0. +The offset to data is initialized to have some bytes of headroom in the buffer (RTE_PKTMBUF_HEADROOM). + +Freeing a mbuf means returning it into its original mempool. +The content of an mbuf is not modified when it is stored in a pool (as a free mbuf). +Fields initialized by the constructor do not need to be re-initialized at mbuf allocation. + +When freeing a packet mbuf that contains several segments, all of them are freed and returned to their original mempool. + +Manipulating mbufs +------------------ + +This library provides some functions for manipulating the data in a packet mbuf. For instance: + + * Get data length + + * Get a pointer to the start of data + + * Prepend data before data + + * Append data after data + + * Remove data at the beginning of the buffer (rte_pktmbuf_adj()) + + * Remove data at the end of the buffer (rte_pktmbuf_trim()) Refer to the *DPDK API Reference* for details. + +Meta Information +---------------- + +Some information is retrieved by the network driver and stored in an mbuf to make processing easier. +For instance, the VLAN, the RSS hash result (see :ref:`Poll Mode Driver <Poll_Mode_Driver>`) +and a flag indicating that the checksum was computed by hardware. + +An mbuf also contains the input port (where it comes from), and the number of segment mbufs in the chain. + +For chained buffers, only the first mbuf of the chain stores this meta information. + +For instance, this is the case on RX side for the IEEE1588 packet +timestamp mechanism, the VLAN tagging and the IP checksum computation. + +On TX side, it is also possible for an application to delegate some +processing to the hardware if it supports it. For instance, the +PKT_TX_IP_CKSUM flag allows to offload the computation of the IPv4 +checksum. + +The following examples explain how to configure different TX offloads on +a vxlan-encapsulated tcp packet: +``out_eth/out_ip/out_udp/vxlan/in_eth/in_ip/in_tcp/payload`` + +- calculate checksum of out_ip:: + + mb->l2_len = len(out_eth) + mb->l3_len = len(out_ip) + mb->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CSUM + set out_ip checksum to 0 in the packet + + This is supported on hardware advertising DEV_TX_OFFLOAD_IPV4_CKSUM. + +- calculate checksum of out_ip and out_udp:: + + mb->l2_len = len(out_eth) + mb->l3_len = len(out_ip) + mb->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CSUM | PKT_TX_UDP_CKSUM + set out_ip checksum to 0 in the packet + set out_udp checksum to pseudo header using rte_ipv4_phdr_cksum() + + This is supported on hardware advertising DEV_TX_OFFLOAD_IPV4_CKSUM + and DEV_TX_OFFLOAD_UDP_CKSUM. + +- calculate checksum of in_ip:: + + mb->l2_len = len(out_eth + out_ip + out_udp + vxlan + in_eth) + mb->l3_len = len(in_ip) + mb->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CSUM + set in_ip checksum to 0 in the packet + + This is similar to case 1), but l2_len is different. It is supported + on hardware advertising DEV_TX_OFFLOAD_IPV4_CKSUM. + Note that it can only work if outer L4 checksum is 0. + +- calculate checksum of in_ip and in_tcp:: + + mb->l2_len = len(out_eth + out_ip + out_udp + vxlan + in_eth) + mb->l3_len = len(in_ip) + mb->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CSUM | PKT_TX_TCP_CKSUM + set in_ip checksum to 0 in the packet + set in_tcp checksum to pseudo header using rte_ipv4_phdr_cksum() + + This is similar to case 2), but l2_len is different. It is supported + on hardware advertising DEV_TX_OFFLOAD_IPV4_CKSUM and + DEV_TX_OFFLOAD_TCP_CKSUM. + Note that it can only work if outer L4 checksum is 0. + +- segment inner TCP:: + + mb->l2_len = len(out_eth + out_ip + out_udp + vxlan + in_eth) + mb->l3_len = len(in_ip) + mb->l4_len = len(in_tcp) + mb->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CKSUM | PKT_TX_TCP_CKSUM | + PKT_TX_TCP_SEG; + set in_ip checksum to 0 in the packet + set in_tcp checksum to pseudo header without including the IP + payload length using rte_ipv4_phdr_cksum() + + This is supported on hardware advertising DEV_TX_OFFLOAD_TCP_TSO. + Note that it can only work if outer L4 checksum is 0. + +- calculate checksum of out_ip, in_ip, in_tcp:: + + mb->outer_l2_len = len(out_eth) + mb->outer_l3_len = len(out_ip) + mb->l2_len = len(out_udp + vxlan + in_eth) + mb->l3_len = len(in_ip) + mb->ol_flags |= PKT_TX_OUTER_IPV4 | PKT_TX_OUTER_IP_CKSUM | \ + PKT_TX_IP_CKSUM | PKT_TX_TCP_CKSUM; + set out_ip checksum to 0 in the packet + set in_ip checksum to 0 in the packet + set in_tcp checksum to pseudo header using rte_ipv4_phdr_cksum() + + This is supported on hardware advertising DEV_TX_OFFLOAD_IPV4_CKSUM, + DEV_TX_OFFLOAD_UDP_CKSUM and DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM. + +The list of flags and their precise meaning is described in the mbuf API +documentation (rte_mbuf.h). Also refer to the testpmd source code +(specifically the csumonly.c file) for details. + +.. _direct_indirect_buffer: + +Direct and Indirect Buffers +--------------------------- + +A direct buffer is a buffer that is completely separate and self-contained. +An indirect buffer behaves like a direct buffer but for the fact that the buffer pointer and +data offset in it refer to data in another direct buffer. +This is useful in situations where packets need to be duplicated or fragmented, +since indirect buffers provide the means to reuse the same packet data across multiple buffers. + +A buffer becomes indirect when it is "attached" to a direct buffer using the rte_pktmbuf_attach() function. +Each buffer has a reference counter field and whenever an indirect buffer is attached to the direct buffer, +the reference counter on the direct buffer is incremented. +Similarly, whenever the indirect buffer is detached, the reference counter on the direct buffer is decremented. +If the resulting reference counter is equal to 0, the direct buffer is freed since it is no longer in use. + +There are a few things to remember when dealing with indirect buffers. +First of all, an indirect buffer is never attached to another indirect buffer. +Attempting to attach buffer A to indirect buffer B that is attached to C, makes rte_pktmbuf_attach() automatically attach A to C, effectively cloning B. +Secondly, for a buffer to become indirect, its reference counter must be equal to 1, +that is, it must not be already referenced by another indirect buffer. +Finally, it is not possible to reattach an indirect buffer to the direct buffer (unless it is detached first). + +While the attach/detach operations can be invoked directly using the recommended rte_pktmbuf_attach() and rte_pktmbuf_detach() functions, +it is suggested to use the higher-level rte_pktmbuf_clone() function, +which takes care of the correct initialization of an indirect buffer and can clone buffers with multiple segments. + +Since indirect buffers are not supposed to actually hold any data, +the memory pool for indirect buffers should be configured to indicate the reduced memory consumption. +Examples of the initialization of a memory pool for indirect buffers (as well as use case examples for indirect buffers) +can be found in several of the sample applications, for example, the IPv4 Multicast sample application. + +Debug +----- + +In debug mode (CONFIG_RTE_MBUF_DEBUG is enabled), +the functions of the mbuf library perform sanity checks before any operation (such as, buffer corruption, bad type, and so on). + +Use Cases +--------- + +All networking application should use mbufs to transport network packets. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/member_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/member_lib.rst new file mode 100644 index 000000000..f0c190990 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/member_lib.rst @@ -0,0 +1,392 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation. + +.. _member_library: + +Membership Library +================== + +Introduction +------------ + +The DPDK Membership Library provides an API for DPDK applications to insert a +new member, delete an existing member, or query the existence of a member in a +given set, or a group of sets. For the case of a group of sets, the library +will return not only whether the element has been inserted before in one of +the sets but also which set it belongs to. The Membership Library is an +extension and generalization of a traditional filter structure (for example +Bloom Filter [Member-bloom]) that has multiple usages in a wide variety of +workloads and applications. In general, the Membership Library is a data +structure that provides a "set-summary" on whether a member belongs to a set, +and as discussed in detail later, there are two advantages of using such a +set-summary rather than operating on a "full-blown" complete list of elements: +first, it has a much smaller storage requirement than storing the whole list of +elements themselves, and secondly checking an element membership (or other +operations) in this set-summary is much faster than checking it for the +original full-blown complete list of elements. + +We use the term "Set-Summary" in this guide to refer to the space-efficient, +probabilistic membership data structure that is provided by the library. A +membership test for an element will return the set this element belongs to or +that the element is "not-found" with very high probability of accuracy. Set-summary +is a fundamental data aggregation component that can be used in many network +(and other) applications. It is a crucial structure to address performance and +scalability issues of diverse network applications including overlay networks, +data-centric networks, flow table summaries, network statistics and +traffic monitoring. A set-summary is useful for applications who need to +include a list of elements while a complete list requires too much space +and/or too much processing cost. In these situations, the set-summary works as +a lossy hash-based representation of a set of members. It can dramatically +reduce space requirement and significantly improve the performance of set +membership queries at the cost of introducing a very small membership test error +probability. + +.. _figure_membership1: +.. figure:: img/member_i1.* + + Example Usages of Membership Library + +There are various usages for a Membership Library in a very +large set of applications and workloads. Interested readers can refer to +[Member-survey] for a survey of possible networking usages. The above figure +provide a small set of examples of using the Membership Library: + +* Sub-figure (a) + depicts a distributed web cache architecture where a collection of proxies + attempt to share their web caches (cached from a set of back-end web servers) to + provide faster responses to clients, and the proxies use the Membership + Library to share summaries of what web pages/objects they are caching. With the + Membership Library, a proxy receiving an http request will inquire the + set-summary to find its location and quickly determine whether to retrieve the + requested web page from a nearby proxy or from a back-end web server. + +* Sub-figure (b) depicts another example for using the Membership Library to + prevent routing loops which is typically done using slow TTL countdown and + dropping packets when TTL expires. As shown in Sub-figure (b), an embedded + set-summary in the packet header itself can be used to summarize the set of + nodes a packet has gone through, and each node upon receiving a packet can check + whether its id is a member of the set of visited nodes, and if it is, then a + routing loop is detected. + +* Sub-Figure (c) presents another usage of the Membership + Library to load-balance flows to worker threads with in-order guarantee where a + set-summary is used to query if a packet belongs to an existing flow or a new + flow. Packets belonging to a new flow are forwarded to the current least loaded + worker thread, while those belonging to an existing flow are forwarded to the + pre-assigned thread to guarantee in-order processing. + +* Sub-figure (d) highlights + yet another usage example in the database domain where a set-summary is used to + determine joins between sets instead of creating a join by comparing each + element of a set against the other elements in a different set, a join is done + on the summaries since they can efficiently encode members of a given set. + +Membership Library is a configurable library that is optimized to cover set +membership functionality for both a single set and multi-set scenarios. Two set-summary +schemes are presented including (a) vector of Bloom Filters and (b) Hash-Table based +set-summary schemes with and without false negative probability. +This guide first briefly describes these different types of set-summaries, usage examples for each, +and then it highlights the Membership Library API. + +Vector of Bloom Filters +----------------------- + +Bloom Filter (BF) [Member-bloom] is a well-known space-efficient +probabilistic data structure that answers set membership queries (test whether +an element is a member of a set) with some probability of false positives and +zero false negatives; a query for an element returns either it is "possibly in +a set" (with very high probability) or "definitely not in a set". + +The BF is a method for representing a set of ``n`` elements (for example flow keys +in network applications domain) to support membership queries. The idea of BF is +to allocate a bit-vector ``v`` with ``m`` bits, which are initially all set to 0. Then +it chooses ``k`` independent hash functions ``h1``, ``h2``, ... ``hk`` with hash values range from +``0`` to ``m-1`` to perform hashing calculations on each element to be inserted. Every time when an +element ``X`` being inserted into the set, the bits at positions ``h1(X)``, ``h2(X)``, ... +``hk(X)`` in ``v`` are set to 1 (any particular bit might be set to 1 multiple times +for multiple different inserted elements). Given a query for any element ``Y``, the +bits at positions ``h1(Y)``, ``h2(Y)``, ... ``hk(Y)`` are checked. If any of them is 0, +then Y is definitely not in the set. Otherwise there is a high probability that +Y is a member of the set with certain false positive probability. As shown in +the next equation, the false positive probability can be made arbitrarily small +by changing the number of hash functions (``k``) and the vector length (``m``). + +.. _figure_membership2: +.. figure:: img/member_i2.* + + Bloom Filter False Positive Probability + +Without BF, an accurate membership testing could involve a costly hash table +lookup and full element comparison. The advantage of using a BF is to simplify +the membership test into a series of hash calculations and memory accesses for a +small bit-vector, which can be easily optimized. Hence the lookup throughput +(set membership test) can be significantly faster than a normal hash table +lookup with element comparison. + +.. _figure_membership3: +.. figure:: img/member_i3.* + + Detecting Routing Loops Using BF + +BF is used for applications that need only one set, and the +membership of elements is checked against the BF. The example discussed +in the above figure is one example of potential applications that uses only one +set to capture the node IDs that have been visited so far by the packet. Each +node will then check this embedded BF in the packet header for its own id, and +if the BF indicates that the current node is definitely not in the set then a +loop-free route is guaranteed. + + +.. _figure_membership4: +.. figure:: img/member_i4.* + + Vector Bloom Filter (vBF) Overview + +To support membership test for both multiple sets and a single set, +the library implements a Vector Bloom Filter (vBF) scheme. +vBF basically composes multiple bloom filters into a vector of bloom filers. +The membership test is conducted on all of the +bloom filters concurrently to determine which set(s) it belongs to or none of +them. The basic idea of vBF is shown in the above figure where an element is +used to address multiple bloom filters concurrently and the bloom filter +index(es) with a hit is returned. + +.. _figure_membership5: +.. figure:: img/member_i5.* + + vBF for Flow Scheduling to Worker Thread + +As previously mentioned, there are many usages of such structures. vBF is used +for applications that need to check membership against multiple sets +simultaneously. The example shown in the above figure uses a set to capture +all flows being assigned for processing at a given worker thread. Upon receiving +a packet the vBF is used to quickly figure out if this packet belongs to a new flow +so as to be forwarded to the current least loaded worker thread, or otherwise it +should be queued for an existing thread to guarantee in-order processing (i.e. +the property of vBF to indicate right away that a given flow is a new one or +not is critical to minimize response time latency). + +It should be noted that vBF can be implemented using a set of single bloom +filters with sequential lookup of each BF. However, being able to concurrently +search all set-summaries is a big throughput advantage. In the library, certain +parallelism is realized by the implementation of checking all bloom filters +together. + + +Hash-Table based Set-Summaries +------------------------------ + +Hash-table based set-summary (HTSS) is another scheme in the membership library. +Cuckoo filter [Member-cfilter] is an example of HTSS. +HTSS supports multi-set membership testing like +vBF does. However, while vBF is better for a small number of targets, HTSS is more suitable +and can easily outperform vBF when the number of sets is +large, since HTSS uses a single hash table for membership testing while vBF +requires testing a series of Bloom Filters each corresponding to one set. +As a result, generally speaking vBF is more adequate for the case of a small limited number of sets +while HTSS should be used with a larger number of sets. + +.. _figure_membership6: +.. figure:: img/member_i6.* + + Using HTSS for Attack Signature Matching + +As shown in the above figure, attack signature matching where each set +represents a certain signature length (for correctness of this example, an +attack signature should not be a subset of another one) in the payload is a good +example for using HTSS with 0% false negative (i.e., when an element returns not +found, it has a 100% certainty that it is not a member of any set). The packet +inspection application benefits from knowing right away that the current payload +does not match any attack signatures in the database to establish its +legitimacy, otherwise a deep inspection of the packet is needed. + +HTSS employs a similar but simpler data structure to a traditional hash table, +and the major difference is that HTSS stores only the signatures but not the +full keys/elements which can significantly reduce the footprint of the table. +Along with the signature, HTSS also stores a value to indicate the target set. +When looking up an element, the element is hashed and the HTSS is addressed +to retrieve the signature stored. If the signature matches then the value is +retrieved corresponding to the index of the target set which the element belongs +to. Because signatures can collide, HTSS can still has false positive +probability. Furthermore, if elements are allowed to be +overwritten or evicted when the hash table becomes full, it will also have a +false negative probability. We discuss this case in the next section. + +Set-Summaries with False Negative Probability +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +As previously mentioned, traditional set-summaries (e.g. Bloom Filters) do not +have a false negative probability, i.e., it is 100% certain when an element +returns "not to be present" for a given set. However, the Membership Library +also supports a set-summary probabilistic data structure based on HTSS which +allows for false negative probability. + +In HTSS, when the hash table becomes full, keys/elements will fail to be added +into the table and the hash table has to be resized to accommodate for these new +elements, which can be expensive. However, if we allow new elements to overwrite +or evict existing elements (as a cache typically does), then the resulting +set-summary will begin to have false negative probability. This is because the +element that was evicted from the set-summary may still be present in the target +set. For subsequent inquiries the set-summary will falsely report the element +not being in the set, hence having a false negative probability. + +The major usage of HTSS with false negative is to use it as a cache for +distributing elements to different target sets. By allowing HTSS to evict old +elements, the set-summary can keep track of the most recent elements +(i.e. active) as a cache typically does. Old inactive elements (infrequently +used elements) will automatically and eventually get evicted from the +set-summary. It is worth noting that the set-summary still has false positive +probability, which means the application either can tolerate certain false positive +or it has fall-back path when false positive happens. + +.. _figure_membership7: +.. figure:: img/member_i7.* + + Using HTSS with False Negatives for Wild Card Classification + +HTSS with false negative (i.e. a cache) also has its wide set of applications. +For example wild card flow classification (e.g. ACL rules) highlighted in the +above figure is an example of such application. In that case each target set +represents a sub-table with rules defined by a certain flow mask. The flow masks +are non-overlapping, and for flows matching more than one rule only the highest +priority one is inserted in the corresponding sub-table (interested readers can +refer to the Open vSwitch (OvS) design of Mega Flow Cache (MFC) [Member-OvS] +for further details). Typically the rules will have a large number of distinct +unique masks and hence, a large number of target sets each corresponding to one +mask. Because the active set of flows varies widely based on the network +traffic, HTSS with false negative will act as a cache for <flowid, target ACL +sub-table> pair for the current active set of flows. When a miss occurs (as +shown in red in the above figure) the sub-tables will be searched sequentially +one by one for a possible match, and when found the flow key and target +sub-table will be inserted into the set-summary (i.e. cache insertion) so +subsequent packets from the same flow don’t incur the overhead of the +sequential search of sub-tables. + +Library API Overview +-------------------- + +The design goal of the Membership Library API is to be as generic as possible to +support all the different types of set-summaries we discussed in previous +sections and beyond. Fundamentally, the APIs need to include creation, +insertion, deletion, and lookup. + + +Set-summary Create +~~~~~~~~~~~~~~~~~~ + +The ``rte_member_create()`` function is used to create a set-summary structure, the input parameter +is a struct to pass in parameters that needed to initialize the set-summary, while the function returns the +pointer to the created set-summary or ``NULL`` if the creation failed. + +The general input arguments used when creating the set-summary should include ``name`` +which is the name of the created set-summary, *type* which is one of the types +supported by the library (e.g. ``RTE_MEMBER_TYPE_HT`` for HTSS or ``RTE_MEMBER_TYPE_VBF`` for vBF), and ``key_len`` +which is the length of the element/key. There are other parameters +are only used for certain type of set-summary, or which have a slightly different meaning for different types of set-summary. +For example, ``num_keys`` parameter means the maximum number of entries for Hash table based set-summary. +However, for bloom filter, this value means the expected number of keys that could be +inserted into the bloom filter(s). The value is used to calculate the size of each +bloom filter. + +We also pass two seeds: ``prim_hash_seed`` and +``sec_hash_seed`` for the primary and secondary hash functions to calculate two independent hash values. +``socket_id`` parameter is the NUMA socket ID for the memory used to create the +set-summary. For HTSS, another parameter ``is_cache`` is used to indicate +if this set-summary is a cache (i.e. with false negative probability) or not. +For vBF, extra parameters are needed. For example, ``num_set`` is the number of +sets needed to initialize the vector bloom filters. This number is equal to the +number of bloom filters will be created. +``false_pos_rate`` is the false positive rate. num_keys and false_pos_rate will be used to determine +the number of hash functions and the bloom filter size. + + +Set-summary Element Insertion +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``rte_member_add()`` function is used to insert an element/key into a set-summary structure. If it fails an +error is returned. For success the returned value is dependent on the +set-summary mode to provide extra information for the users. For vBF +mode, a return value of 0 means a successful insert. For HTSS mode without false negative, the insert +could fail with ``-ENOSPC`` if the table is full. With false negative (i.e. cache mode), +for insert that does not cause any eviction (i.e. no overwriting happens to an +existing entry) the return value is 0. For insertion that causes eviction, the return +value is 1 to indicate such situation, but it is not an error. + +The input arguments for the function should include the ``key`` which is a pointer to the element/key that needs to +be added to the set-summary, and ``set_id`` which is the set id associated +with the key that needs to be added. + + +Set-summary Element Lookup +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``rte_member_lookup()`` function looks up a single key/element in the set-summary structure. It +returns as soon as the first match is found. The return value is 1 if a +match is found and 0 otherwise. The arguments for the function include ``key`` which is a pointer to the +element/key that needs to be looked up, and ``set_id`` which is used to return the +first target set id where the key has matched, if any. + +The ``rte_member_lookup_bulk()`` function is used to look up a bulk of keys/elements in the +set-summary structure for their first match. Each key lookup returns as soon as the first match is found. The +return value is the number of keys that find a match. The arguments of the function include ``keys`` +which is a pointer to a bulk of keys that are to be looked up, +``num_keys`` is the number +of keys that will be looked up, and ``set_ids`` are the return target set +ids for the first match found for each of the input keys. ``set_ids`` is an array +needs to be sized according to the ``num_keys``. If there is no match, the set id +for that key will be set to RTE_MEMBER_NO_MATCH. + +The ``rte_member_lookup_multi()`` function looks up a single key/element in the +set-summary structure for multiple matches. It +returns ALL the matches (possibly more than one) found for this key when it +is matched against all target sets (it is worth noting that for cache mode HTSS, +the current implementation matches at most one target set). The return value is +the number of matches +that was found for this key (for cache mode HTSS the return value +should be at most 1). The arguments for the function include ``key`` which is a pointer to the +element/key that needs to be looked up, ``max_match_per_key`` which is to indicate the maximum number of matches +the user expects to find for each key, and ``set_id`` which is used to return all +target set ids where the key has matched, if any. The ``set_id`` array should be sized +according to ``max_match_per_key``. For vBF, the maximum number of matches per key is equal +to the number of sets. For HTSS, the maximum number of matches per key is equal to two time +entry count per bucket. ``max_match_per_key`` should be equal or smaller than the maximum number of +possible matches. + +The ``rte_membership_lookup_multi_bulk()`` function looks up a bulk of keys/elements in the +set-summary structure for multiple matches, each key lookup returns ALL the matches (possibly more +than one) found for this key when it is matched against all target sets (cache mode HTSS +matches at most one target set). The +return value is the number of keys that find one or more matches in the +set-summary structure. The arguments of the +function include ``keys`` which is +a pointer to a bulk of keys that are to be looked up, ``num_keys`` is the number +of keys that will be looked up, ``max_match_per_key`` is the possible +maximum number of matches for each key, ``match_count`` which is the returned number +of matches for each key, and ``set_ids`` are the returned target set +ids for all matches found for each keys. ``set_ids`` is 2-D array +containing a 1-D array for each key (the size of 1-D array per key should be set by the user according to ``max_match_per_key``). +``max_match_per_key`` should be equal or smaller than the maximum number of +possible matches, similar to ``rte_member_lookup_multi``. + + +Set-summary Element Delete +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``rte_membership_delete()`` function deletes an element/key from a set-summary structure, if it fails +an error is returned. The input arguments should include ``key`` which is a pointer to the +element/key that needs to be deleted from the set-summary, and ``set_id`` +which is the set id associated with the key to delete. It is worth noting that current +implementation of vBF does not support deletion [1]_. An error code ``-EINVAL`` will be returned. + +.. [1] Traditional bloom filter does not support proactive deletion. Supporting proactive deletion require additional implementation and performance overhead. + +References +----------- + +[Member-bloom] B H Bloom, "Space/Time Trade-offs in Hash Coding with Allowable Errors," Communications of the ACM, 1970. + +[Member-survey] A Broder and M Mitzenmacher, "Network Applications of Bloom Filters: A Survey," in Internet Mathematics, 2005. + +[Member-cfilter] B Fan, D G Andersen and M Kaminsky, "Cuckoo Filter: Practically Better Than Bloom," in Conference on emerging Networking Experiments and Technologies, 2014. + +[Member-OvS] B Pfaff, "The Design and Implementation of Open vSwitch," in NSDI, 2015. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/mempool_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/mempool_lib.rst new file mode 100644 index 000000000..f8b430d65 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/mempool_lib.rst @@ -0,0 +1,155 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +.. _Mempool_Library: + +Mempool Library +=============== + +A memory pool is an allocator of a fixed-sized object. +In the DPDK, it is identified by name and uses a mempool handler to store free objects. +The default mempool handler is ring based. +It provides some other optional services such as a per-core object cache and +an alignment helper to ensure that objects are padded to spread them equally on all DRAM or DDR3 channels. + +This library is used by the :ref:`Mbuf Library <Mbuf_Library>`. + +Cookies +------- + +In debug mode (CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG is enabled), cookies are added at the beginning and end of allocated blocks. +The allocated objects then contain overwrite protection fields to help debugging buffer overflows. + +Stats +----- + +In debug mode (CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG is enabled), +statistics about get from/put in the pool are stored in the mempool structure. +Statistics are per-lcore to avoid concurrent access to statistics counters. + +Memory Alignment Constraints on x86 architecture +------------------------------------------------ + +Depending on hardware memory configuration on X86 architecture, performance can be greatly improved by adding a specific padding between objects. +The objective is to ensure that the beginning of each object starts on a different channel and rank in memory so that all channels are equally loaded. + +This is particularly true for packet buffers when doing L3 forwarding or flow classification. +Only the first 64 bytes are accessed, so performance can be increased by spreading the start addresses of objects among the different channels. + +The number of ranks on any DIMM is the number of independent sets of DRAMs that can be accessed for the full data bit-width of the DIMM. +The ranks cannot be accessed simultaneously since they share the same data path. +The physical layout of the DRAM chips on the DIMM itself does not necessarily relate to the number of ranks. + +When running an application, the EAL command line options provide the ability to add the number of memory channels and ranks. + +.. note:: + + The command line must always have the number of memory channels specified for the processor. + +Examples of alignment for different DIMM architectures are shown in +:numref:`figure_memory-management` and :numref:`figure_memory-management2`. + +.. _figure_memory-management: + +.. figure:: img/memory-management.* + + Two Channels and Quad-ranked DIMM Example + + +In this case, the assumption is that a packet is 16 blocks of 64 bytes, which is not true. + +The Intel® 5520 chipset has three channels, so in most cases, +no padding is required between objects (except for objects whose size are n x 3 x 64 bytes blocks). + +.. _figure_memory-management2: + +.. figure:: img/memory-management2.* + + Three Channels and Two Dual-ranked DIMM Example + + +When creating a new pool, the user can specify to use this feature or not. + +.. _mempool_local_cache: + +Local Cache +----------- + +In terms of CPU usage, the cost of multiple cores accessing a memory pool's ring of free buffers may be high +since each access requires a compare-and-set (CAS) operation. +To avoid having too many access requests to the memory pool's ring, +the memory pool allocator can maintain a per-core cache and do bulk requests to the memory pool's ring, +via the cache with many fewer locks on the actual memory pool structure. +In this way, each core has full access to its own cache (with locks) of free objects and +only when the cache fills does the core need to shuffle some of the free objects back to the pools ring or +obtain more objects when the cache is empty. + +While this may mean a number of buffers may sit idle on some core's cache, +the speed at which a core can access its own cache for a specific memory pool without locks provides performance gains. + +The cache is composed of a small, per-core table of pointers and its length (used as a stack). +This internal cache can be enabled or disabled at creation of the pool. + +The maximum size of the cache is static and is defined at compilation time (CONFIG_RTE_MEMPOOL_CACHE_MAX_SIZE). + +:numref:`figure_mempool` shows a cache in operation. + +.. _figure_mempool: + +.. figure:: img/mempool.* + + A mempool in Memory with its Associated Ring + +Alternatively to the internal default per-lcore local cache, an application can create and manage external caches through the ``rte_mempool_cache_create()``, ``rte_mempool_cache_free()`` and ``rte_mempool_cache_flush()`` calls. +These user-owned caches can be explicitly passed to ``rte_mempool_generic_put()`` and ``rte_mempool_generic_get()``. +The ``rte_mempool_default_cache()`` call returns the default internal cache if any. +In contrast to the default caches, user-owned caches can be used by non-EAL threads too. + +Mempool Handlers +------------------------ + +This allows external memory subsystems, such as external hardware memory +management systems and software based memory allocators, to be used with DPDK. + +There are two aspects to a mempool handler. + +* Adding the code for your new mempool operations (ops). This is achieved by + adding a new mempool ops code, and using the ``MEMPOOL_REGISTER_OPS`` macro. + +* Using the new API to call ``rte_mempool_create_empty()`` and + ``rte_mempool_set_ops_byname()`` to create a new mempool and specifying which + ops to use. + +Several different mempool handlers may be used in the same application. A new +mempool can be created by using the ``rte_mempool_create_empty()`` function, +then using ``rte_mempool_set_ops_byname()`` to point the mempool to the +relevant mempool handler callback (ops) structure. + +Legacy applications may continue to use the old ``rte_mempool_create()`` API +call, which uses a ring based mempool handler by default. These applications +will need to be modified to use a new mempool handler. + +For applications that use ``rte_pktmbuf_create()``, there is a config setting +(``RTE_MBUF_DEFAULT_MEMPOOL_OPS``) that allows the application to make use of +an alternative mempool handler. + + .. note:: + + When running a DPDK application with shared libraries, mempool handler + shared objects specified with the '-d' EAL command-line parameter are + dynamically loaded. When running a multi-process application with shared + libraries, the -d arguments for mempool handlers *must be specified in the + same order for all processes* to ensure correct operation. + + +Use Cases +--------- + +All allocations that require a high level of performance should use a pool-based memory allocator. +Below are some examples: + +* :ref:`Mbuf Library <Mbuf_Library>` + +* :ref:`Environment Abstraction Layer <Environment_Abstraction_Layer>` , for logging service + +* Any application that needs to allocate fixed-sized objects in the data plane and that will be continuously utilized by the system. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/meson_ut.rst b/src/spdk/dpdk/doc/guides/prog_guide/meson_ut.rst new file mode 100644 index 000000000..fff88655d --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/meson_ut.rst @@ -0,0 +1,66 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2018-2019 Intel Corporation. + +Running DPDK Unit Tests with Meson +================================== + +This section describes how to run test cases with the DPDK meson build system. + +Steps to build and install DPDK using meson can be referred +in :doc:`build-sdk-meson` + +Grouping of test cases +---------------------- + +Test cases have been classified into four different groups. + +* Fast tests. +* Performance tests. +* Driver tests. +* Tests which produce lists of objects as output, and therefore that need + manual checking. + +These tests can be run using the argument to ``meson test`` as +``--suite project_name:label``. + +For example:: + + $ meson test -C <build path> --suite DPDK:fast-tests + +If the ``<build path>`` is current working directory, +the ``-C <build path>`` option can be skipped as below:: + + $ meson test --suite DPDK:fast-tests + +The project name is optional so the following is equivalent to the previous +command:: + + $ meson test --suite fast-tests + +The meson command to list all available tests:: + + $ meson test --list + +Test cases are run serially by default for better stability. + +Arguments of ``test()`` that can be provided in meson.build are as below: + +* ``is_parallel`` is used to run test case either in parallel or non-parallel mode. +* ``timeout`` is used to specify the timeout of test case. +* ``args`` is used to specify test specific parameters. +* ``env`` is used to specify test specific environment parameters. + + +Dealing with skipped test cases +------------------------------- + +Some unit test cases have a dependency on external libraries, driver modules +or config flags, without which the test cases cannot be run. Such test cases +will be reported as skipped if they cannot run. To enable those test cases, +the user should ensure the required dependencies are met. +Below are a few possible causes why tests may be skipped: + +#. Optional external libraries are not found. +#. Config flags for the dependent library are not enabled. +#. Dependent driver modules are not installed on the system. +#. Not enough processing cores. Some tests are skipped on machines with 2 or 4 cores. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/metrics_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/metrics_lib.rst new file mode 100644 index 000000000..eca855d60 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/metrics_lib.rst @@ -0,0 +1,296 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation. + +.. _Metrics_Library: + +Metrics Library +=============== + +The Metrics library implements a mechanism by which *producers* can +publish numeric information for later querying by *consumers*. In +practice producers will typically be other libraries or primary +processes, whereas consumers will typically be applications. + +Metrics themselves are statistics that are not generated by PMDs. Metric +information is populated using a push model, where producers update the +values contained within the metric library by calling an update function +on the relevant metrics. Consumers receive metric information by querying +the central metric data, which is held in shared memory. + +For each metric, a separate value is maintained for each port id, and +when publishing metric values the producers need to specify which port is +being updated. In addition there is a special id ``RTE_METRICS_GLOBAL`` +that is intended for global statistics that are not associated with any +individual device. Since the metrics library is self-contained, the only +restriction on port numbers is that they are less than ``RTE_MAX_ETHPORTS`` +- there is no requirement for the ports to actually exist. + +Initializing the library +------------------------ + +Before the library can be used, it has to be initialized by calling +``rte_metrics_init()`` which sets up the metric store in shared memory. +This is where producers will publish metric information to, and where +consumers will query it from. + +.. code-block:: c + + rte_metrics_init(rte_socket_id()); + +This function **must** be called from a primary process, but otherwise +producers and consumers can be in either primary or secondary processes. + +Registering metrics +------------------- + +Metrics must first be *registered*, which is the way producers declare +the names of the metrics they will be publishing. Registration can either +be done individually, or a set of metrics can be registered as a group. +Individual registration is done using ``rte_metrics_reg_name()``: + +.. code-block:: c + + id_1 = rte_metrics_reg_name("mean_bits_in"); + id_2 = rte_metrics_reg_name("mean_bits_out"); + id_3 = rte_metrics_reg_name("peak_bits_in"); + id_4 = rte_metrics_reg_name("peak_bits_out"); + +or alternatively, a set of metrics can be registered together using +``rte_metrics_reg_names()``: + +.. code-block:: c + + const char * const names[] = { + "mean_bits_in", "mean_bits_out", + "peak_bits_in", "peak_bits_out", + }; + id_set = rte_metrics_reg_names(&names[0], 4); + +If the return value is negative, it means registration failed. Otherwise +the return value is the *key* for the metric, which is used when updating +values. A table mapping together these key values and the metrics' names +can be obtained using ``rte_metrics_get_names()``. + +Updating metric values +---------------------- + +Once registered, producers can update the metric for a given port using +the ``rte_metrics_update_value()`` function. This uses the metric key +that is returned when registering the metric, and can also be looked up +using ``rte_metrics_get_names()``. + +.. code-block:: c + + rte_metrics_update_value(port_id, id_1, values[0]); + rte_metrics_update_value(port_id, id_2, values[1]); + rte_metrics_update_value(port_id, id_3, values[2]); + rte_metrics_update_value(port_id, id_4, values[3]); + +if metrics were registered as a single set, they can either be updated +individually using ``rte_metrics_update_value()``, or updated together +using the ``rte_metrics_update_values()`` function: + +.. code-block:: c + + rte_metrics_update_value(port_id, id_set, values[0]); + rte_metrics_update_value(port_id, id_set + 1, values[1]); + rte_metrics_update_value(port_id, id_set + 2, values[2]); + rte_metrics_update_value(port_id, id_set + 3, values[3]); + + rte_metrics_update_values(port_id, id_set, values, 4); + +Note that ``rte_metrics_update_values()`` cannot be used to update +metric values from *multiple* *sets*, as there is no guarantee two +sets registered one after the other have contiguous id values. + +Querying metrics +---------------- + +Consumers can obtain metric values by querying the metrics library using +the ``rte_metrics_get_values()`` function that return an array of +``struct rte_metric_value``. Each entry within this array contains a metric +value and its associated key. A key-name mapping can be obtained using the +``rte_metrics_get_names()`` function that returns an array of +``struct rte_metric_name`` that is indexed by the key. The following will +print out all metrics for a given port: + +.. code-block:: c + + void print_metrics() { + struct rte_metric_value *metrics; + struct rte_metric_name *names; + int len; + + len = rte_metrics_get_names(NULL, 0); + if (len < 0) { + printf("Cannot get metrics count\n"); + return; + } + if (len == 0) { + printf("No metrics to display (none have been registered)\n"); + return; + } + metrics = malloc(sizeof(struct rte_metric_value) * len); + names = malloc(sizeof(struct rte_metric_name) * len); + if (metrics == NULL || names == NULL) { + printf("Cannot allocate memory\n"); + free(metrics); + free(names); + return; + } + ret = rte_metrics_get_values(port_id, metrics, len); + if (ret < 0 || ret > len) { + printf("Cannot get metrics values\n"); + free(metrics); + free(names); + return; + } + printf("Metrics for port %i:\n", port_id); + for (i = 0; i < len; i++) + printf(" %s: %"PRIu64"\n", + names[metrics[i].key].name, metrics[i].value); + free(metrics); + free(names); + } + + +Deinitialising the library +-------------------------- + +Once the library usage is done, it must be deinitialized by calling +``rte_metrics_deinit()`` which will free the shared memory reserved +during initialization. + +.. code-block:: c + + err = rte_metrics_deinit(void); + +If the return value is negative, it means deinitialization failed. +This function **must** be called from a primary process. + +Bit-rate statistics library +--------------------------- + +The bit-rate library calculates the exponentially-weighted moving +average and peak bit-rates for each active port (i.e. network device). +These statistics are reported via the metrics library using the +following names: + + - ``mean_bits_in``: Average inbound bit-rate + - ``mean_bits_out``: Average outbound bit-rate + - ``ewma_bits_in``: Average inbound bit-rate (EWMA smoothed) + - ``ewma_bits_out``: Average outbound bit-rate (EWMA smoothed) + - ``peak_bits_in``: Peak inbound bit-rate + - ``peak_bits_out``: Peak outbound bit-rate + +Once initialised and clocked at the appropriate frequency, these +statistics can be obtained by querying the metrics library. + +Initialization +~~~~~~~~~~~~~~ + +Before the library can be used, it has to be initialised by calling +``rte_stats_bitrate_create()``, which will return a bit-rate +calculation object. Since the bit-rate library uses the metrics library +to report the calculated statistics, the bit-rate library then needs to +register the calculated statistics with the metrics library. This is +done using the helper function ``rte_stats_bitrate_reg()``. + +.. code-block:: c + + struct rte_stats_bitrates *bitrate_data; + + bitrate_data = rte_stats_bitrate_create(); + if (bitrate_data == NULL) + rte_exit(EXIT_FAILURE, "Could not allocate bit-rate data.\n"); + rte_stats_bitrate_reg(bitrate_data); + +Controlling the sampling rate +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Since the library works by periodic sampling but does not use an +internal thread, the application has to periodically call +``rte_stats_bitrate_calc()``. The frequency at which this function +is called should be the intended sampling rate required for the +calculated statistics. For instance if per-second statistics are +desired, this function should be called once a second. + +.. code-block:: c + + tics_datum = rte_rdtsc(); + tics_per_1sec = rte_get_timer_hz(); + + while( 1 ) { + /* ... */ + tics_current = rte_rdtsc(); + if (tics_current - tics_datum >= tics_per_1sec) { + /* Periodic bitrate calculation */ + for (idx_port = 0; idx_port < cnt_ports; idx_port++) + rte_stats_bitrate_calc(bitrate_data, idx_port); + tics_datum = tics_current; + } + /* ... */ + } + + +Latency statistics library +-------------------------- + +The latency statistics library calculates the latency of packet +processing by a DPDK application, reporting the minimum, average, +and maximum nano-seconds that packet processing takes, as well as +the jitter in processing delay. These statistics are then reported +via the metrics library using the following names: + + - ``min_latency_ns``: Minimum processing latency (nano-seconds) + - ``avg_latency_ns``: Average processing latency (nano-seconds) + - ``mac_latency_ns``: Maximum processing latency (nano-seconds) + - ``jitter_ns``: Variance in processing latency (nano-seconds) + +Once initialised and clocked at the appropriate frequency, these +statistics can be obtained by querying the metrics library. + +Initialization +~~~~~~~~~~~~~~ + +Before the library can be used, it has to be initialised by calling +``rte_latencystats_init()``. + +.. code-block:: c + + lcoreid_t latencystats_lcore_id = -1; + + int ret = rte_latencystats_init(1, NULL); + if (ret) + rte_exit(EXIT_FAILURE, "Could not allocate latency data.\n"); + + +Triggering statistic updates +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``rte_latencystats_update()`` function needs to be called +periodically so that latency statistics can be updated. + +.. code-block:: c + + if (latencystats_lcore_id == rte_lcore_id()) + rte_latencystats_update(); + +Library shutdown +~~~~~~~~~~~~~~~~ + +When finished, ``rte_latencystats_uninit()`` needs to be called to +de-initialise the latency library. + +.. code-block:: c + + rte_latencystats_uninit(); + +Timestamp and latency calculation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Latency stats library marks the time in the timestamp field of the +mbuf for the ingress packets and sets the ``PKT_RX_TIMESTAMP`` flag of +``ol_flags`` for the mbuf to indicate the marked time as a valid one. +At the egress, the mbufs with the flag set are considered having valid +timestamp and are used for the latency calculation. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/multi_proc_support.rst b/src/spdk/dpdk/doc/guides/prog_guide/multi_proc_support.rst new file mode 100644 index 000000000..a84083b96 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/multi_proc_support.rst @@ -0,0 +1,353 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +.. _Multi-process_Support: + +Multi-process Support +===================== + +In the DPDK, multi-process support is designed to allow a group of DPDK processes +to work together in a simple transparent manner to perform packet processing, +or other workloads. +To support this functionality, +a number of additions have been made to the core DPDK Environment Abstraction Layer (EAL). + +The EAL has been modified to allow different types of DPDK processes to be spawned, +each with different permissions on the hugepage memory used by the applications. +For now, there are two types of process specified: + +* primary processes, which can initialize and which have full permissions on shared memory + +* secondary processes, which cannot initialize shared memory, + but can attach to pre- initialized shared memory and create objects in it. + +Standalone DPDK processes are primary processes, +while secondary processes can only run alongside a primary process or +after a primary process has already configured the hugepage shared memory for them. + +.. note:: + + Secondary processes should run alongside primary process with same DPDK version. + + Secondary processes which requires access to physical devices in Primary process, must + be passed with the same whitelist and blacklist options. + +To support these two process types, and other multi-process setups described later, +two additional command-line parameters are available to the EAL: + +* ``--proc-type:`` for specifying a given process instance as the primary or secondary DPDK instance + +* ``--file-prefix:`` to allow processes that do not want to co-operate to have different memory regions + +A number of example applications are provided that demonstrate how multiple DPDK processes can be used together. +These are more fully documented in the "Multi- process Sample Application" chapter +in the *DPDK Sample Application's User Guide*. + +Memory Sharing +-------------- + +The key element in getting a multi-process application working using the DPDK is to ensure that +memory resources are properly shared among the processes making up the multi-process application. +Once there are blocks of shared memory available that can be accessed by multiple processes, +then issues such as inter-process communication (IPC) becomes much simpler. + +On application start-up in a primary or standalone process, +the DPDK records to memory-mapped files the details of the memory configuration it is using - hugepages in use, +the virtual addresses they are mapped at, the number of memory channels present, etc. +When a secondary process is started, these files are read and the EAL recreates the same memory configuration +in the secondary process so that all memory zones are shared between processes and all pointers to that memory are valid, +and point to the same objects, in both processes. + +.. note:: + + Refer to `Multi-process Limitations`_ for details of + how Linux kernel Address-Space Layout Randomization (ASLR) can affect memory sharing. + + If the primary process was run with ``--legacy-mem`` or + ``--single-file-segments`` switch, secondary processes must be run with the + same switch specified. Otherwise, memory corruption may occur. + +.. _figure_multi_process_memory: + +.. figure:: img/multi_process_memory.* + + Memory Sharing in the DPDK Multi-process Sample Application + + +The EAL also supports an auto-detection mode (set by EAL ``--proc-type=auto`` flag ), +whereby an DPDK process is started as a secondary instance if a primary instance is already running. + +Deployment Models +----------------- + +Symmetric/Peer Processes +~~~~~~~~~~~~~~~~~~~~~~~~ + +DPDK multi-process support can be used to create a set of peer processes where each process performs the same workload. +This model is equivalent to having multiple threads each running the same main-loop function, +as is done in most of the supplied DPDK sample applications. +In this model, the first of the processes spawned should be spawned using the ``--proc-type=primary`` EAL flag, +while all subsequent instances should be spawned using the ``--proc-type=secondary`` flag. + +The simple_mp and symmetric_mp sample applications demonstrate this usage model. +They are described in the "Multi-process Sample Application" chapter in the *DPDK Sample Application's User Guide*. + +Asymmetric/Non-Peer Processes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +An alternative deployment model that can be used for multi-process applications +is to have a single primary process instance that acts as a load-balancer or +server distributing received packets among worker or client threads, which are run as secondary processes. +In this case, extensive use of rte_ring objects is made, which are located in shared hugepage memory. + +The client_server_mp sample application shows this usage model. +It is described in the "Multi-process Sample Application" chapter in the *DPDK Sample Application's User Guide*. + +Running Multiple Independent DPDK Applications +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In addition to the above scenarios involving multiple DPDK processes working together, +it is possible to run multiple DPDK processes side-by-side, +where those processes are all working independently. +Support for this usage scenario is provided using the ``--file-prefix`` parameter to the EAL. + +By default, the EAL creates hugepage files on each hugetlbfs filesystem using the rtemap_X filename, +where X is in the range 0 to the maximum number of hugepages -1. +Similarly, it creates shared configuration files, memory mapped in each process, using the /var/run/.rte_config filename, +when run as root (or $HOME/.rte_config when run as a non-root user; +if filesystem and device permissions are set up to allow this). +The rte part of the filenames of each of the above is configurable using the file-prefix parameter. + +In addition to specifying the file-prefix parameter, +any DPDK applications that are to be run side-by-side must explicitly limit their memory use. +This is less of a problem on Linux, as by default, applications will not +allocate more memory than they need. However if ``--legacy-mem`` is used, DPDK +will attempt to preallocate all memory it can get to, and memory use must be +explicitly limited. This is done by passing the ``-m`` flag to each process to +specify how much hugepage memory, in megabytes, each process can use (or passing +``--socket-mem`` to specify how much hugepage memory on each socket each process +can use). + +.. note:: + + Independent DPDK instances running side-by-side on a single machine cannot share any network ports. + Any network ports being used by one process should be blacklisted in every other process. + +Running Multiple Independent Groups of DPDK Applications +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In the same way that it is possible to run independent DPDK applications side- by-side on a single system, +this can be trivially extended to multi-process groups of DPDK applications running side-by-side. +In this case, the secondary processes must use the same ``--file-prefix`` parameter +as the primary process whose shared memory they are connecting to. + +.. note:: + + All restrictions and issues with multiple independent DPDK processes running side-by-side + apply in this usage scenario also. + +Multi-process Limitations +------------------------- + +There are a number of limitations to what can be done when running DPDK multi-process applications. +Some of these are documented below: + +* The multi-process feature requires that the exact same hugepage memory mappings be present in all applications. + This makes secondary process startup process generally unreliable. Disabling + Linux security feature - Address-Space Layout Randomization (ASLR) may + help getting more consistent mappings, but not necessarily more reliable - + if the mappings are wrong, they will be consistently wrong! + +.. warning:: + + Disabling Address-Space Layout Randomization (ASLR) may have security implications, + so it is recommended that it be disabled only when absolutely necessary, + and only when the implications of this change have been understood. + +* All DPDK processes running as a single application and using shared memory must have distinct coremask/corelist arguments. + It is not possible to have a primary and secondary instance, or two secondary instances, + using any of the same logical cores. + Attempting to do so can cause corruption of memory pool caches, among other issues. + +* The delivery of interrupts, such as Ethernet* device link status interrupts, do not work in secondary processes. + All interrupts are triggered inside the primary process only. + Any application needing interrupt notification in multiple processes should provide its own mechanism + to transfer the interrupt information from the primary process to any secondary process that needs the information. + +* The use of function pointers between multiple processes running based of different compiled binaries is not supported, + since the location of a given function in one process may be different to its location in a second. + This prevents the librte_hash library from behaving properly as in a multi-process instance, + since it uses a pointer to the hash function internally. + +To work around this issue, it is recommended that multi-process applications perform the hash calculations by directly calling +the hashing function from the code and then using the rte_hash_add_with_hash()/rte_hash_lookup_with_hash() functions +instead of the functions which do the hashing internally, such as rte_hash_add()/rte_hash_lookup(). + +* Depending upon the hardware in use, and the number of DPDK processes used, + it may not be possible to have HPET timers available in each DPDK instance. + The minimum number of HPET comparators available to Linux* userspace can be just a single comparator, + which means that only the first, primary DPDK process instance can open and mmap /dev/hpet. + If the number of required DPDK processes exceeds that of the number of available HPET comparators, + the TSC (which is the default timer in this release) must be used as a time source across all processes instead of the HPET. + +Communication between multiple processes +---------------------------------------- + +While there are multiple ways one can approach inter-process communication in +DPDK, there is also a native DPDK IPC API available. It is not intended to be +performance-critical, but rather is intended to be a convenient, general +purpose API to exchange short messages between primary and secondary processes. + +DPDK IPC API supports the following communication modes: + +* Unicast message from secondary to primary +* Broadcast message from primary to all secondaries + +In other words, any IPC message sent in a primary process will be delivered to +all secondaries, while any IPC message sent in a secondary process will only be +delivered to primary process. Unicast from primary to secondary or from +secondary to secondary is not supported. + +There are three types of communications that are available within DPDK IPC API: + +* Message +* Synchronous request +* Asynchronous request + +A "message" type does not expect a response and is meant to be a best-effort +notification mechanism, while the two types of "requests" are meant to be a two +way communication mechanism, with the requester expecting a response from the +other side. + +Both messages and requests will trigger a named callback on the receiver side. +These callbacks will be called from within a dedicated IPC or interrupt thread +that are not part of EAL lcore threads. + +Registering for incoming messages +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Before any messages can be received, a callback will need to be registered. +This is accomplished by calling ``rte_mp_action_register()`` function. This +function accepts a unique callback name, and a function pointer to a callback +that will be called when a message or a request matching this callback name +arrives. + +If the application is no longer willing to receive messages intended for a +specific callback function, ``rte_mp_action_unregister()`` function can be +called to ensure that callback will not be triggered again. + +Sending messages +~~~~~~~~~~~~~~~~ + +To send a message, a ``rte_mp_msg`` descriptor must be populated first. The list +of fields to be populated are as follows: + +* ``name`` - message name. This name must match receivers' callback name. +* ``param`` - message data (up to 256 bytes). +* ``len_param`` - length of message data. +* ``fds`` - file descriptors to pass long with the data (up to 8 fd's). +* ``num_fds`` - number of file descriptors to send. + +Once the structure is populated, calling ``rte_mp_sendmsg()`` will send the +descriptor either to all secondary processes (if sent from primary process), or +to primary process (if sent from secondary process). The function will return +a value indicating whether sending the message succeeded or not. + +Sending requests +~~~~~~~~~~~~~~~~ + +Sending requests involves waiting for the other side to reply, so they can block +for a relatively long time. + +To send a request, a message descriptor ``rte_mp_msg`` must be populated. +Additionally, a ``timespec`` value must be specified as a timeout, after which +IPC will stop waiting and return. + +For synchronous requests, the ``rte_mp_reply`` descriptor must also be created. +This is where the responses will be stored. +The list of fields that will be populated by IPC are as follows: + +* ``nb_sent`` - number indicating how many requests were sent (i.e. how many + peer processes were active at the time of the request). +* ``nb_received`` - number indicating how many responses were received (i.e. of + those peer processes that were active at the time of request, how many have + replied) +* ``msgs`` - pointer to where all of the responses are stored. The order in + which responses appear is undefined. When doing synchronous requests, this + memory must be freed by the requestor after request completes! + +For asynchronous requests, a function pointer to the callback function must be +provided instead. This callback will be called when the request either has timed +out, or will have received a response to all the messages that were sent. + +.. warning:: + + When an asynchronous request times out, the callback will be called not by + a dedicated IPC thread, but rather from EAL interrupt thread. Because of + this, it may not be possible for DPDK to trigger another interrupt-based + event (such as an alarm) while handling asynchronous IPC callback. + +When the callback is called, the original request descriptor will be provided +(so that it would be possible to determine for which sent message this is a +callback to), along with a response descriptor like the one described above. +When doing asynchronous requests, there is no need to free the resulting +``rte_mp_reply`` descriptor. + +Receiving and responding to messages +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To receive a message, a name callback must be registered using the +``rte_mp_action_register()`` function. The name of the callback must match the +``name`` field in sender's ``rte_mp_msg`` message descriptor in order for this +message to be delivered and for the callback to be trigger. + +The callback's definition is ``rte_mp_t``, and consists of the incoming message +pointer ``msg``, and an opaque pointer ``peer``. Contents of ``msg`` will be +identical to ones sent by the sender. + +If a response is required, a new ``rte_mp_msg`` message descriptor must be +constructed and sent via ``rte_mp_reply()`` function, along with ``peer`` +pointer. The resulting response will then be delivered to the correct requestor. + +.. warning:: + Simply returning a value when processing a request callback will not send a + response to the request - it must always be explicitly sent even in case + of errors. Implementation of error signalling rests with the application, + there is no built-in way to indicate success or error for a request. Failing + to do so will cause the requestor to time out while waiting on a response. + +Misc considerations +~~~~~~~~~~~~~~~~~~~~~~~~ + +Due to the underlying IPC implementation being single-threaded, recursive +requests (i.e. sending a request while responding to another request) is not +supported. However, since sending messages (not requests) does not involve an +IPC thread, sending messages while processing another message or request is +supported. + +Since the memory sybsystem uses IPC internally, memory allocations and IPC must +not be mixed: it is not safe to use IPC inside a memory-related callback, nor is +it safe to allocate/free memory inside IPC callbacks. Attempting to do so may +lead to a deadlock. + +Asynchronous request callbacks may be triggered either from IPC thread or from +interrupt thread, depending on whether the request has timed out. It is +therefore suggested to avoid waiting for interrupt-based events (such as alarms) +inside asynchronous IPC request callbacks. This limitation does not apply to +messages or synchronous requests. + +If callbacks spend a long time processing the incoming requests, the requestor +might time out, so setting the right timeout value on the requestor side is +imperative. + +If some of the messages timed out, ``nb_sent`` and ``nb_received`` fields in the +``rte_mp_reply`` descriptor will not have matching values. This is not treated +as error by the IPC API, and it is expected that the user will be responsible +for deciding how to handle such cases. + +If a callback has been registered, IPC will assume that it is safe to call it. +This is important when registering callbacks during DPDK initialization. +During initialization, IPC will consider the receiving side as non-existing if +the callback has not been registered yet. However, once the callback has been +registered, it is expected that IPC should be safe to trigger it, even if the +rest of the DPDK initialization hasn't finished yet. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/overview.rst b/src/spdk/dpdk/doc/guides/prog_guide/overview.rst new file mode 100644 index 000000000..986c89690 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/overview.rst @@ -0,0 +1,170 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +**Part 1: Architecture Overview** + +Overview +======== + +This section gives a global overview of the architecture of Data Plane Development Kit (DPDK). + +The main goal of the DPDK is to provide a simple, +complete framework for fast packet processing in data plane applications. +Users may use the code to understand some of the techniques employed, +to build upon for prototyping or to add their own protocol stacks. +Alternative ecosystem options that use the DPDK are available. + +The framework creates a set of libraries for specific environments +through the creation of an Environment Abstraction Layer (EAL), +which may be specific to a mode of the Intel® architecture (32-bit or 64-bit), +Linux* user space compilers or a specific platform. +These environments are created through the use of make files and configuration files. +Once the EAL library is created, the user may link with the library to create their own applications. +Other libraries, outside of EAL, including the Hash, +Longest Prefix Match (LPM) and rings libraries are also provided. +Sample applications are provided to help show the user how to use various features of the DPDK. + +The DPDK implements a run to completion model for packet processing, +where all resources must be allocated prior to calling Data Plane applications, +running as execution units on logical processing cores. +The model does not support a scheduler and all devices are accessed by polling. +The primary reason for not using interrupts is the performance overhead imposed by interrupt processing. + +In addition to the run-to-completion model, +a pipeline model may also be used by passing packets or messages between cores via the rings. +This allows work to be performed in stages and may allow more efficient use of code on cores. + +Development Environment +----------------------- + +The DPDK project installation requires Linux and the associated toolchain, +such as one or more compilers, assembler, make utility, +editor and various libraries to create the DPDK components and libraries. + +Once these libraries are created for the specific environment and architecture, +they may then be used to create the user's data plane application. + +When creating applications for the Linux user space, the glibc library is used. +For DPDK applications, two environmental variables (RTE_SDK and RTE_TARGET) +must be configured before compiling the applications. +The following are examples of how the variables can be set: + +.. code-block:: console + + export RTE_SDK=/home/user/DPDK + export RTE_TARGET=x86_64-native-linux-gcc + +See the *DPDK Getting Started Guide* for information on setting up the development environment. + +Environment Abstraction Layer +----------------------------- + +The Environment Abstraction Layer (EAL) provides a generic interface +that hides the environment specifics from the applications and libraries. +The services provided by the EAL are: + +* DPDK loading and launching + +* Support for multi-process and multi-thread execution types + +* Core affinity/assignment procedures + +* System memory allocation/de-allocation + +* Atomic/lock operations + +* Time reference + +* PCI bus access + +* Trace and debug functions + +* CPU feature identification + +* Interrupt handling + +* Alarm operations + +* Memory management (malloc) + +The EAL is fully described in :ref:`Environment Abstraction Layer <Environment_Abstraction_Layer>`. + +Core Components +--------------- + +The *core components* are a set of libraries that provide all the elements needed +for high-performance packet processing applications. + +.. _figure_architecture-overview: + +.. figure:: img/architecture-overview.* + + Core Components Architecture + + +Ring Manager (librte_ring) +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ring structure provides a lockless multi-producer, multi-consumer FIFO API in a finite size table. +It has some advantages over lockless queues; easier to implement, adapted to bulk operations and faster. +A ring is used by the :ref:`Memory Pool Manager (librte_mempool) <Mempool_Library>` +and may be used as a general communication mechanism between cores +and/or execution blocks connected together on a logical core. + +This ring buffer and its usage are fully described in :ref:`Ring Library <Ring_Library>`. + +Memory Pool Manager (librte_mempool) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Memory Pool Manager is responsible for allocating pools of objects in memory. +A pool is identified by name and uses a ring to store free objects. +It provides some other optional services, +such as a per-core object cache and an alignment helper to ensure that objects are padded to spread them equally on all RAM channels. + +This memory pool allocator is described in :ref:`Mempool Library <Mempool_Library>`. + +Network Packet Buffer Management (librte_mbuf) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The mbuf library provides the facility to create and destroy buffers +that may be used by the DPDK application to store message buffers. +The message buffers are created at startup time and stored in a mempool, using the DPDK mempool library. + +This library provides an API to allocate/free mbufs, manipulate +packet buffers which are used to carry network packets. + +Network Packet Buffer Management is described in :ref:`Mbuf Library <Mbuf_Library>`. + +Timer Manager (librte_timer) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This library provides a timer service to DPDK execution units, +providing the ability to execute a function asynchronously. +It can be periodic function calls, or just a one-shot call. +It uses the timer interface provided by the Environment Abstraction Layer (EAL) +to get a precise time reference and can be initiated on a per-core basis as required. + +The library documentation is available in :ref:`Timer Library <Timer_Library>`. + +Ethernet* Poll Mode Driver Architecture +--------------------------------------- + +The DPDK includes Poll Mode Drivers (PMDs) for 1 GbE, 10 GbE and 40GbE, and para virtualized virtio +Ethernet controllers which are designed to work without asynchronous, interrupt-based signaling mechanisms. + +See :ref:`Poll Mode Driver <Poll_Mode_Driver>`. + +Packet Forwarding Algorithm Support +----------------------------------- + +The DPDK includes Hash (librte_hash) and Longest Prefix Match (LPM,librte_lpm) +libraries to support the corresponding packet forwarding algorithms. + +See :ref:`Hash Library <Hash_Library>` and :ref:`LPM Library <LPM_Library>` for more information. + +librte_net +---------- + +The librte_net library is a collection of IP protocol definitions and convenience macros. +It is based on code from the FreeBSD* IP stack and contains protocol numbers (for use in IP headers), +IP-related macros, IPv4/IPv6 header structures and TCP, UDP and SCTP header structures. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/packet_classif_access_ctrl.rst b/src/spdk/dpdk/doc/guides/prog_guide/packet_classif_access_ctrl.rst new file mode 100644 index 000000000..0345512b9 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/packet_classif_access_ctrl.rst @@ -0,0 +1,550 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2015 Intel Corporation. + +Packet Classification and Access Control +======================================== + +The DPDK provides an Access Control library that gives the ability +to classify an input packet based on a set of classification rules. + +The ACL library is used to perform an N-tuple search over a set of rules with multiple categories +and find the best match (highest priority) for each category. +The library API provides the following basic operations: + +* Create a new Access Control (AC) context. + +* Add rules into the context. + +* For all rules in the context, build the runtime structures necessary to perform packet classification. + +* Perform input packet classifications. + +* Destroy an AC context and its runtime structures and free the associated memory. + +Overview +-------- + +Rule definition +~~~~~~~~~~~~~~~ + +The current implementation allows the user for each AC context to specify its own rule (set of fields) +over which packet classification will be performed. +Though there are few restrictions on the rule fields layout: + +* First field in the rule definition has to be one byte long. +* All subsequent fields has to be grouped into sets of 4 consecutive bytes. + +This is done mainly for performance reasons - search function processes the first input byte as part of the flow setup and then the inner loop of the search function is unrolled to process four input bytes at a time. + +To define each field inside an AC rule, the following structure is used: + +.. code-block:: c + + struct rte_acl_field_def { + uint8_t type; /*< type - ACL_FIELD_TYPE. */ + uint8_t size; /*< size of field 1,2,4, or 8. */ + uint8_t field_index; /*< index of field inside the rule. */ + uint8_t input_index; /*< 0-N input index. */ + uint32_t offset; /*< offset to start of field. */ + }; + +* type + The field type is one of three choices: + + * _MASK - for fields such as IP addresses that have a value and a mask defining the number of relevant bits. + + * _RANGE - for fields such as ports that have a lower and upper value for the field. + + * _BITMASK - for fields such as protocol identifiers that have a value and a bit mask. + +* size + The size parameter defines the length of the field in bytes. Allowable values are 1, 2, 4, or 8 bytes. + Note that due to the grouping of input bytes, 1 or 2 byte fields must be defined as consecutive fields + that make up 4 consecutive input bytes. + Also, it is best to define fields of 8 or more bytes as 4 byte fields so that + the build processes can eliminate fields that are all wild. + +* field_index + A zero-based value that represents the position of the field inside the rule; 0 to N-1 for N fields. + +* input_index + As mentioned above, all input fields, except the very first one, must be in groups of 4 consecutive bytes. + The input index specifies to which input group that field belongs to. + +* offset + The offset field defines the offset for the field. + This is the offset from the beginning of the buffer parameter for the search. + +For example, to define classification for the following IPv4 5-tuple structure: + +.. code-block:: c + + struct ipv4_5tuple { + uint8_t proto; + uint32_t ip_src; + uint32_t ip_dst; + uint16_t port_src; + uint16_t port_dst; + }; + +The following array of field definitions can be used: + +.. code-block:: c + + struct rte_acl_field_def ipv4_defs[5] = { + /* first input field - always one byte long. */ + { + .type = RTE_ACL_FIELD_TYPE_BITMASK, + .size = sizeof (uint8_t), + .field_index = 0, + .input_index = 0, + .offset = offsetof (struct ipv4_5tuple, proto), + }, + + /* next input field (IPv4 source address) - 4 consecutive bytes. */ + { + .type = RTE_ACL_FIELD_TYPE_MASK, + .size = sizeof (uint32_t), + .field_index = 1, + .input_index = 1, + .offset = offsetof (struct ipv4_5tuple, ip_src), + }, + + /* next input field (IPv4 destination address) - 4 consecutive bytes. */ + { + .type = RTE_ACL_FIELD_TYPE_MASK, + .size = sizeof (uint32_t), + .field_index = 2, + .input_index = 2, + .offset = offsetof (struct ipv4_5tuple, ip_dst), + }, + + /* + * Next 2 fields (src & dst ports) form 4 consecutive bytes. + * They share the same input index. + */ + { + .type = RTE_ACL_FIELD_TYPE_RANGE, + .size = sizeof (uint16_t), + .field_index = 3, + .input_index = 3, + .offset = offsetof (struct ipv4_5tuple, port_src), + }, + + { + .type = RTE_ACL_FIELD_TYPE_RANGE, + .size = sizeof (uint16_t), + .field_index = 4, + .input_index = 3, + .offset = offsetof (struct ipv4_5tuple, port_dst), + }, + }; + +A typical example of such an IPv4 5-tuple rule is a follows: + +:: + + source addr/mask destination addr/mask source ports dest ports protocol/mask + 192.168.1.0/24 192.168.2.31/32 0:65535 1234:1234 17/0xff + +Any IPv4 packets with protocol ID 17 (UDP), source address 192.168.1.[0-255], destination address 192.168.2.31, +source port [0-65535] and destination port 1234 matches the above rule. + +To define classification for the IPv6 2-tuple: <protocol, IPv6 source address> over the following IPv6 header structure: + +.. code-block:: c + + struct rte_ipv6_hdr { + uint32_t vtc_flow; /* IP version, traffic class & flow label. */ + uint16_t payload_len; /* IP packet length - includes sizeof(ip_header). */ + uint8_t proto; /* Protocol, next header. */ + uint8_t hop_limits; /* Hop limits. */ + uint8_t src_addr[16]; /* IP address of source host. */ + uint8_t dst_addr[16]; /* IP address of destination host(s). */ + } __rte_packed; + +The following array of field definitions can be used: + +.. code-block:: c + + struct rte_acl_field_def ipv6_2tuple_defs[5] = { + { + .type = RTE_ACL_FIELD_TYPE_BITMASK, + .size = sizeof (uint8_t), + .field_index = 0, + .input_index = 0, + .offset = offsetof (struct rte_ipv6_hdr, proto), + }, + + { + .type = RTE_ACL_FIELD_TYPE_MASK, + .size = sizeof (uint32_t), + .field_index = 1, + .input_index = 1, + .offset = offsetof (struct rte_ipv6_hdr, src_addr[0]), + }, + + { + .type = RTE_ACL_FIELD_TYPE_MASK, + .size = sizeof (uint32_t), + .field_index = 2, + .input_index = 2, + .offset = offsetof (struct rte_ipv6_hdr, src_addr[4]), + }, + + { + .type = RTE_ACL_FIELD_TYPE_MASK, + .size = sizeof (uint32_t), + .field_index = 3, + .input_index = 3, + .offset = offsetof (struct rte_ipv6_hdr, src_addr[8]), + }, + + { + .type = RTE_ACL_FIELD_TYPE_MASK, + .size = sizeof (uint32_t), + .field_index = 4, + .input_index = 4, + .offset = offsetof (struct rte_ipv6_hdr, src_addr[12]), + }, + }; + +A typical example of such an IPv6 2-tuple rule is a follows: + +:: + + source addr/mask protocol/mask + 2001:db8:1234:0000:0000:0000:0000:0000/48 6/0xff + +Any IPv6 packets with protocol ID 6 (TCP), and source address inside the range +[2001:db8:1234:0000:0000:0000:0000:0000 - 2001:db8:1234:ffff:ffff:ffff:ffff:ffff] matches the above rule. + +In the following example the last element of the search key is 8-bit long. +So it is a case where the 4 consecutive bytes of an input field are not fully occupied. +The structure for the classification is: + +.. code-block:: c + + struct acl_key { + uint8_t ip_proto; + uint32_t ip_src; + uint32_t ip_dst; + uint8_t tos; /*< This is partially using a 32-bit input element */ + }; + +The following array of field definitions can be used: + +.. code-block:: c + + struct rte_acl_field_def ipv4_defs[4] = { + /* first input field - always one byte long. */ + { + .type = RTE_ACL_FIELD_TYPE_BITMASK, + .size = sizeof (uint8_t), + .field_index = 0, + .input_index = 0, + .offset = offsetof (struct acl_key, ip_proto), + }, + + /* next input field (IPv4 source address) - 4 consecutive bytes. */ + { + .type = RTE_ACL_FIELD_TYPE_MASK, + .size = sizeof (uint32_t), + .field_index = 1, + .input_index = 1, + .offset = offsetof (struct acl_key, ip_src), + }, + + /* next input field (IPv4 destination address) - 4 consecutive bytes. */ + { + .type = RTE_ACL_FIELD_TYPE_MASK, + .size = sizeof (uint32_t), + .field_index = 2, + .input_index = 2, + .offset = offsetof (struct acl_key, ip_dst), + }, + + /* + * Next element of search key (Type of Service) is indeed 1 byte long. + * Anyway we need to allocate all the 4 consecutive bytes for it. + */ + { + .type = RTE_ACL_FIELD_TYPE_BITMASK, + .size = sizeof (uint32_t), /* All the 4 consecutive bytes are allocated */ + .field_index = 3, + .input_index = 3, + .offset = offsetof (struct acl_key, tos), + }, + }; + +A typical example of such an IPv4 4-tuple rule is as follows: + +:: + + source addr/mask destination addr/mask tos/mask protocol/mask + 192.168.1.0/24 192.168.2.31/32 1/0xff 6/0xff + +Any IPv4 packets with protocol ID 6 (TCP), source address 192.168.1.[0-255], destination address 192.168.2.31, +ToS 1 matches the above rule. + +When creating a set of rules, for each rule, additional information must be supplied also: + +* **priority**: A weight to measure the priority of the rules (higher is better). + If the input tuple matches more than one rule, then the rule with the higher priority is returned. + Note that if the input tuple matches more than one rule and these rules have equal priority, + it is undefined which rule is returned as a match. + It is recommended to assign a unique priority for each rule. + +* **category_mask**: Each rule uses a bit mask value to select the relevant category(s) for the rule. + When a lookup is performed, the result for each category is returned. + This effectively provides a "parallel lookup" by enabling a single search to return multiple results if, + for example, there were four different sets of ACL rules, one for access control, one for routing, and so on. + Each set could be assigned its own category and by combining them into a single database, + one lookup returns a result for each of the four sets. + +* **userdata**: A user-defined value. + For each category, a successful match returns the userdata field of the highest priority matched rule. + When no rules match, returned value is zero. + +.. note:: + + When adding new rules into an ACL context, all fields must be in host byte order (LSB). + When the search is performed for an input tuple, all fields in that tuple must be in network byte order (MSB). + +RT memory size limit +~~~~~~~~~~~~~~~~~~~~ + +Build phase (rte_acl_build()) creates for a given set of rules internal structure for further run-time traversal. +With current implementation it is a set of multi-bit tries (with stride == 8). +Depending on the rules set, that could consume significant amount of memory. +In attempt to conserve some space ACL build process tries to split the given +rule-set into several non-intersecting subsets and construct a separate trie +for each of them. +Depending on the rule-set, it might reduce RT memory requirements but might +increase classification time. +There is a possibility at build-time to specify maximum memory limit for internal RT structures for given AC context. +It could be done via **max_size** field of the **rte_acl_config** structure. +Setting it to the value greater than zero, instructs rte_acl_build() to: + +* attempt to minimize number of tries in the RT table, but +* make sure that size of RT table wouldn't exceed given value. + +Setting it to zero makes rte_acl_build() to use the default behavior: +try to minimize size of the RT structures, but doesn't expose any hard limit on it. + +That gives the user the ability to decisions about performance/space trade-off. +For example: + +.. code-block:: c + + struct rte_acl_ctx * acx; + struct rte_acl_config cfg; + int ret; + + /* + * assuming that acx points to already created and + * populated with rules AC context and cfg filled properly. + */ + + /* try to build AC context, with RT structures less then 8MB. */ + cfg.max_size = 0x800000; + ret = rte_acl_build(acx, &cfg); + + /* + * RT structures can't fit into 8MB for given context. + * Try to build without exposing any hard limit. + */ + if (ret == -ERANGE) { + cfg.max_size = 0; + ret = rte_acl_build(acx, &cfg); + } + + + +Classification methods +~~~~~~~~~~~~~~~~~~~~~~ + +After rte_acl_build() over given AC context has finished successfully, it can be used to perform classification - search for a rule with highest priority over the input data. +There are several implementations of classify algorithm: + +* **RTE_ACL_CLASSIFY_SCALAR**: generic implementation, doesn't require any specific HW support. + +* **RTE_ACL_CLASSIFY_SSE**: vector implementation, can process up to 8 flows in parallel. Requires SSE 4.1 support. + +* **RTE_ACL_CLASSIFY_AVX2**: vector implementation, can process up to 16 flows in parallel. Requires AVX2 support. + +It is purely a runtime decision which method to choose, there is no build-time difference. +All implementations operates over the same internal RT structures and use similar principles. The main difference is that vector implementations can manually exploit IA SIMD instructions and process several input data flows in parallel. +At startup ACL library determines the highest available classify method for the given platform and sets it as default one. Though the user has an ability to override the default classifier function for a given ACL context or perform particular search using non-default classify method. In that case it is user responsibility to make sure that given platform supports selected classify implementation. + +Application Programming Interface (API) Usage +--------------------------------------------- + +.. note:: + + For more details about the Access Control API, please refer to the *DPDK API Reference*. + +The following example demonstrates IPv4, 5-tuple classification for rules defined above +with multiple categories in more detail. + +Classify with Multiple Categories +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: c + + struct rte_acl_ctx * acx; + struct rte_acl_config cfg; + int ret; + + /* define a structure for the rule with up to 5 fields. */ + + RTE_ACL_RULE_DEF(acl_ipv4_rule, RTE_DIM(ipv4_defs)); + + /* AC context creation parameters. */ + + struct rte_acl_param prm = { + .name = "ACL_example", + .socket_id = SOCKET_ID_ANY, + .rule_size = RTE_ACL_RULE_SZ(RTE_DIM(ipv4_defs)), + + /* number of fields per rule. */ + + .max_rule_num = 8, /* maximum number of rules in the AC context. */ + }; + + struct acl_ipv4_rule acl_rules[] = { + + /* matches all packets traveling to 192.168.0.0/16, applies for categories: 0,1 */ + { + .data = {.userdata = 1, .category_mask = 3, .priority = 1}, + + /* destination IPv4 */ + .field[2] = {.value.u32 = RTE_IPV4(192,168,0,0),. mask_range.u32 = 16,}, + + /* source port */ + .field[3] = {.value.u16 = 0, .mask_range.u16 = 0xffff,}, + + /* destination port */ + .field[4] = {.value.u16 = 0, .mask_range.u16 = 0xffff,}, + }, + + /* matches all packets traveling to 192.168.1.0/24, applies for categories: 0 */ + { + .data = {.userdata = 2, .category_mask = 1, .priority = 2}, + + /* destination IPv4 */ + .field[2] = {.value.u32 = RTE_IPV4(192,168,1,0),. mask_range.u32 = 24,}, + + /* source port */ + .field[3] = {.value.u16 = 0, .mask_range.u16 = 0xffff,}, + + /* destination port */ + .field[4] = {.value.u16 = 0, .mask_range.u16 = 0xffff,}, + }, + + /* matches all packets traveling from 10.1.1.1, applies for categories: 1 */ + { + .data = {.userdata = 3, .category_mask = 2, .priority = 3}, + + /* source IPv4 */ + .field[1] = {.value.u32 = RTE_IPV4(10,1,1,1),. mask_range.u32 = 32,}, + + /* source port */ + .field[3] = {.value.u16 = 0, .mask_range.u16 = 0xffff,}, + + /* destination port */ + .field[4] = {.value.u16 = 0, .mask_range.u16 = 0xffff,}, + }, + + }; + + + /* create an empty AC context */ + + if ((acx = rte_acl_create(&prm)) == NULL) { + + /* handle context create failure. */ + + } + + /* add rules to the context */ + + ret = rte_acl_add_rules(acx, acl_rules, RTE_DIM(acl_rules)); + if (ret != 0) { + /* handle error at adding ACL rules. */ + } + + /* prepare AC build config. */ + + cfg.num_categories = 2; + cfg.num_fields = RTE_DIM(ipv4_defs); + + memcpy(cfg.defs, ipv4_defs, sizeof (ipv4_defs)); + + /* build the runtime structures for added rules, with 2 categories. */ + + ret = rte_acl_build(acx, &cfg); + if (ret != 0) { + /* handle error at build runtime structures for ACL context. */ + } + +For a tuple with source IP address: 10.1.1.1 and destination IP address: 192.168.1.15, +once the following lines are executed: + +.. code-block:: c + + uint32_t results[4]; /* make classify for 4 categories. */ + + rte_acl_classify(acx, data, results, 1, 4); + +then the results[] array contains: + +.. code-block:: c + + results[4] = {2, 3, 0, 0}; + +* For category 0, both rules 1 and 2 match, but rule 2 has higher priority, + therefore results[0] contains the userdata for rule 2. + +* For category 1, both rules 1 and 3 match, but rule 3 has higher priority, + therefore results[1] contains the userdata for rule 3. + +* For categories 2 and 3, there are no matches, so results[2] and results[3] contain zero, + which indicates that no matches were found for those categories. + +For a tuple with source IP address: 192.168.1.1 and destination IP address: 192.168.2.11, +once the following lines are executed: + +.. code-block:: c + + uint32_t results[4]; /* make classify by 4 categories. */ + + rte_acl_classify(acx, data, results, 1, 4); + +the results[] array contains: + +.. code-block:: c + + results[4] = {1, 1, 0, 0}; + +* For categories 0 and 1, only rule 1 matches. + +* For categories 2 and 3, there are no matches. + +For a tuple with source IP address: 10.1.1.1 and destination IP address: 201.212.111.12, +once the following lines are executed: + +.. code-block:: c + + uint32_t results[4]; /* make classify by 4 categories. */ + rte_acl_classify(acx, data, results, 1, 4); + +the results[] array contains: + +.. code-block:: c + + results[4] = {0, 3, 0, 0}; + +* For category 1, only rule 3 matches. + +* For categories 0, 2 and 3, there are no matches. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/packet_distrib_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/packet_distrib_lib.rst new file mode 100644 index 000000000..3c3b746ac --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/packet_distrib_lib.rst @@ -0,0 +1,94 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +Packet Distributor Library +========================== + +The DPDK Packet Distributor library is a library designed to be used for dynamic load balancing of traffic +while supporting single packet at a time operation. +When using this library, the logical cores in use are to be considered in two roles: firstly a distributor lcore, +which is responsible for load balancing or distributing packets, +and a set of worker lcores which are responsible for receiving the packets from the distributor and operating on them. +The model of operation is shown in the diagram below. + +.. figure:: img/packet_distributor1.* + + Packet Distributor mode of operation + +There are two modes of operation of the API in the distributor library, +one which sends one packet at a time to workers using 32-bits for flow_id, +and an optimized mode which sends bursts of up to 8 packets at a time to workers, using 15 bits of flow_id. +The mode is selected by the type field in the ``rte_distributor_create()`` function. + +Distributor Core Operation +-------------------------- + +The distributor core does the majority of the processing for ensuring that packets are fairly shared among workers. +The operation of the distributor is as follows: + +#. Packets are passed to the distributor component by having the distributor lcore thread call the "rte_distributor_process()" API + +#. The worker lcores all share a single cache line with the distributor core in order to pass messages and packets to and from the worker. + The process API call will poll all the worker cache lines to see what workers are requesting packets. + +#. As workers request packets, the distributor takes packets from the set of packets passed in and distributes them to the workers. + As it does so, it examines the "tag" -- stored in the RSS hash field in the mbuf -- for each packet + and records what tags are being processed by each worker. + +#. If the next packet in the input set has a tag which is already being processed by a worker, + then that packet will be queued up for processing by that worker + and given to it in preference to other packets when that work next makes a request for work. + This ensures that no two packets with the same tag are processed in parallel, + and that all packets with the same tag are processed in input order. + +#. Once all input packets passed to the process API have either been distributed to workers + or been queued up for a worker which is processing a given tag, + then the process API returns to the caller. + +Other functions which are available to the distributor lcore are: + +* rte_distributor_returned_pkts() + +* rte_distributor_flush() + +* rte_distributor_clear_returns() + +Of these the most important API call is "rte_distributor_returned_pkts()" +which should only be called on the lcore which also calls the process API. +It returns to the caller all packets which have finished processing by all worker cores. +Within this set of returned packets, all packets sharing the same tag will be returned in their original order. + +**NOTE:** +If worker lcores buffer up packets internally for transmission in bulk afterwards, +the packets sharing a tag will likely get out of order. +Once a worker lcore requests a new packet, the distributor assumes that it has completely finished with the previous packet and +therefore that additional packets with the same tag can safely be distributed to other workers -- +who may then flush their buffered packets sooner and cause packets to get out of order. + +**NOTE:** +No packet ordering guarantees are made about packets which do not share a common packet tag. + +Using the process and returned_pkts API, the following application workflow can be used, +while allowing packet order within a packet flow -- identified by a tag -- to be maintained. + + +.. figure:: img/packet_distributor2.* + + Application workflow + + +The flush and clear_returns API calls, mentioned previously, +are likely of less use that the process and returned_pkts APIS, and are principally provided to aid in unit testing of the library. +Descriptions of these functions and their use can be found in the DPDK API Reference document. + +Worker Operation +---------------- + +Worker cores are the cores which do the actual manipulation of the packets distributed by the packet distributor. +Each worker calls "rte_distributor_get_pkt()" API to request a new packet when it has finished processing the previous one. +[The previous packet should be returned to the distributor component by passing it as the final parameter to this API call.] + +Since it may be desirable to vary the number of worker cores, depending on the traffic load +i.e. to save power at times of lighter load, +it is possible to have a worker stop processing packets by calling "rte_distributor_return_pkt()" to indicate that +it has finished the current packet and does not want a new one. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/packet_framework.rst b/src/spdk/dpdk/doc/guides/prog_guide/packet_framework.rst new file mode 100644 index 000000000..48d257501 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/packet_framework.rst @@ -0,0 +1,1150 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +Packet Framework +================ + +Design Objectives +----------------- + +The main design objectives for the DPDK Packet Framework are: + +* Provide standard methodology to build complex packet processing pipelines. + Provide reusable and extensible templates for the commonly used pipeline functional blocks; + +* Provide capability to switch between pure software and hardware-accelerated implementations for the same pipeline functional block; + +* Provide the best trade-off between flexibility and performance. + Hardcoded pipelines usually provide the best performance, but are not flexible, + while developing flexible frameworks is never a problem, but performance is usually low; + +* Provide a framework that is logically similar to Open Flow. + +Overview +-------- + +Packet processing applications are frequently structured as pipelines of multiple stages, +with the logic of each stage glued around a lookup table. +For each incoming packet, the table defines the set of actions to be applied to the packet, +as well as the next stage to send the packet to. + +The DPDK Packet Framework minimizes the development effort required to build packet processing pipelines +by defining a standard methodology for pipeline development, +as well as providing libraries of reusable templates for the commonly used pipeline blocks. + +The pipeline is constructed by connecting the set of input ports with the set of output ports +through the set of tables in a tree-like topology. +As result of lookup operation for the current packet in the current table, +one of the table entries (on lookup hit) or the default table entry (on lookup miss) +provides the set of actions to be applied on the current packet, +as well as the next hop for the packet, which can be either another table, an output port or packet drop. + +An example of packet processing pipeline is presented in :numref:`figure_figure32`: + +.. _figure_figure32: + +.. figure:: img/figure32.* + + Example of Packet Processing Pipeline where Input Ports 0 and 1 + are Connected with Output Ports 0, 1 and 2 through Tables 0 and 1 + + +Port Library Design +------------------- + +Port Types +~~~~~~~~~~ + +:numref:`table_qos_19` is a non-exhaustive list of ports that can be implemented with the Packet Framework. + +.. _table_qos_19: + +.. table:: Port Types + + +---+------------------+---------------------------------------------------------------------------------------+ + | # | Port type | Description | + | | | | + +===+==================+=======================================================================================+ + | 1 | SW ring | SW circular buffer used for message passing between the application threads. Uses | + | | | the DPDK rte_ring primitive. Expected to be the most commonly used type of | + | | | port. | + | | | | + +---+------------------+---------------------------------------------------------------------------------------+ + | 2 | HW ring | Queue of buffer descriptors used to interact with NIC, switch or accelerator ports. | + | | | For NIC ports, it uses the DPDK rte_eth_rx_queue or rte_eth_tx_queue | + | | | primitives. | + | | | | + +---+------------------+---------------------------------------------------------------------------------------+ + | 3 | IP reassembly | Input packets are either IP fragments or complete IP datagrams. Output packets are | + | | | complete IP datagrams. | + | | | | + +---+------------------+---------------------------------------------------------------------------------------+ + | 4 | IP fragmentation | Input packets are jumbo (IP datagrams with length bigger than MTU) or non-jumbo | + | | | packets. Output packets are non-jumbo packets. | + | | | | + +---+------------------+---------------------------------------------------------------------------------------+ + | 5 | Traffic manager | Traffic manager attached to a specific NIC output port, performing congestion | + | | | management and hierarchical scheduling according to pre-defined SLAs. | + | | | | + +---+------------------+---------------------------------------------------------------------------------------+ + | 6 | KNI | Send/receive packets to/from Linux kernel space. | + | | | | + +---+------------------+---------------------------------------------------------------------------------------+ + | 7 | Source | Input port used as packet generator. Similar to Linux kernel /dev/zero character | + | | | device. | + | | | | + +---+------------------+---------------------------------------------------------------------------------------+ + | 8 | Sink | Output port used to drop all input packets. Similar to Linux kernel /dev/null | + | | | character device. | + | | | | + +---+------------------+---------------------------------------------------------------------------------------+ + | 9 | Sym_crypto | Output port used to extract DPDK Cryptodev operations from a fixed offset of the | + | | | packet and then enqueue to the Cryptodev PMD. Input port used to dequeue the | + | | | Cryptodev operations from the Cryptodev PMD and then retrieve the packets from them. | + +---+------------------+---------------------------------------------------------------------------------------+ + +Port Interface +~~~~~~~~~~~~~~ + +Each port is unidirectional, i.e. either input port or output port. +Each input/output port is required to implement an abstract interface that +defines the initialization and run-time operation of the port. +The port abstract interface is described in. + +.. _table_qos_20: + +.. table:: 20 Port Abstract Interface + + +---+----------------+-----------------------------------------------------------------------------------------+ + | # | Port Operation | Description | + | | | | + +===+================+=========================================================================================+ + | 1 | Create | Create the low-level port object (e.g. queue). Can internally allocate memory. | + | | | | + +---+----------------+-----------------------------------------------------------------------------------------+ + | 2 | Free | Free the resources (e.g. memory) used by the low-level port object. | + | | | | + +---+----------------+-----------------------------------------------------------------------------------------+ + | 3 | RX | Read a burst of input packets. Non-blocking operation. Only defined for input ports. | + | | | | + +---+----------------+-----------------------------------------------------------------------------------------+ + | 4 | TX | Write a burst of input packets. Non-blocking operation. Only defined for output ports. | + | | | | + +---+----------------+-----------------------------------------------------------------------------------------+ + | 5 | Flush | Flush the output buffer. Only defined for output ports. | + | | | | + +---+----------------+-----------------------------------------------------------------------------------------+ + +Table Library Design +-------------------- + +Table Types +~~~~~~~~~~~ + +:numref:`table_qos_21` is a non-exhaustive list of types of tables that can be implemented with the Packet Framework. + +.. _table_qos_21: + +.. table:: Table Types + + +---+----------------------------+-----------------------------------------------------------------------------+ + | # | Table Type | Description | + | | | | + +===+============================+=============================================================================+ + | 1 | Hash table | Lookup key is n-tuple based. | + | | | | + | | | Typically, the lookup key is hashed to produce a signature that is used to | + | | | identify a bucket of entries where the lookup key is searched next. | + | | | | + | | | The signature associated with the lookup key of each input packet is either | + | | | read from the packet descriptor (pre-computed signature) or computed at | + | | | table lookup time. | + | | | | + | | | The table lookup, add entry and delete entry operations, as well as any | + | | | other pipeline block that pre-computes the signature all have to use the | + | | | same hashing algorithm to generate the signature. | + | | | | + | | | Typically used to implement flow classification tables, ARP caches, routing | + | | | table for tunnelling protocols, etc. | + | | | | + +---+----------------------------+-----------------------------------------------------------------------------+ + | 2 | Longest Prefix Match (LPM) | Lookup key is the IP address. | + | | | | + | | | Each table entries has an associated IP prefix (IP and depth). | + | | | | + | | | The table lookup operation selects the IP prefix that is matched by the | + | | | lookup key; in case of multiple matches, the entry with the longest prefix | + | | | depth wins. | + | | | | + | | | Typically used to implement IP routing tables. | + | | | | + +---+----------------------------+-----------------------------------------------------------------------------+ + | 3 | Access Control List (ACLs) | Lookup key is 7-tuple of two VLAN/MPLS labels, IP destination address, | + | | | IP source addresses, L4 protocol, L4 destination port, L4 source port. | + | | | | + | | | Each table entry has an associated ACL and priority. The ACL contains bit | + | | | masks for the VLAN/MPLS labels, IP prefix for IP destination address, IP | + | | | prefix for IP source addresses, L4 protocol and bitmask, L4 destination | + | | | port and bit mask, L4 source port and bit mask. | + | | | | + | | | The table lookup operation selects the ACL that is matched by the lookup | + | | | key; in case of multiple matches, the entry with the highest priority wins. | + | | | | + | | | Typically used to implement rule databases for firewalls, etc. | + | | | | + +---+----------------------------+-----------------------------------------------------------------------------+ + | 4 | Pattern matching search | Lookup key is the packet payload. | + | | | | + | | | Table is a database of patterns, with each pattern having a priority | + | | | assigned. | + | | | | + | | | The table lookup operation selects the patterns that is matched by the | + | | | input packet; in case of multiple matches, the matching pattern with the | + | | | highest priority wins. | + | | | | + +---+----------------------------+-----------------------------------------------------------------------------+ + | 5 | Array | Lookup key is the table entry index itself. | + | | | | + +---+----------------------------+-----------------------------------------------------------------------------+ + +Table Interface +~~~~~~~~~~~~~~~ + +Each table is required to implement an abstract interface that defines the initialization +and run-time operation of the table. +The table abstract interface is described in :numref:`table_qos_29_1`. + +.. _table_qos_29_1: + +.. table:: Table Abstract Interface + + +---+-----------------+----------------------------------------------------------------------------------------+ + | # | Table operation | Description | + | | | | + +===+=================+========================================================================================+ + | 1 | Create | Create the low-level data structures of the lookup table. Can internally allocate | + | | | memory. | + | | | | + +---+-----------------+----------------------------------------------------------------------------------------+ + | 2 | Free | Free up all the resources used by the lookup table. | + | | | | + +---+-----------------+----------------------------------------------------------------------------------------+ + | 3 | Add entry | Add new entry to the lookup table. | + | | | | + +---+-----------------+----------------------------------------------------------------------------------------+ + | 4 | Delete entry | Delete specific entry from the lookup table. | + | | | | + +---+-----------------+----------------------------------------------------------------------------------------+ + | 5 | Lookup | Look up a burst of input packets and return a bit mask specifying the result of the | + | | | lookup operation for each packet: a set bit signifies lookup hit for the corresponding | + | | | packet, while a cleared bit a lookup miss. | + | | | | + | | | For each lookup hit packet, the lookup operation also returns a pointer to the table | + | | | entry that was hit, which contains the actions to be applied on the packet and any | + | | | associated metadata. | + | | | | + | | | For each lookup miss packet, the actions to be applied on the packet and any | + | | | associated metadata are specified by the default table entry preconfigured for lookup | + | | | miss. | + | | | | + +---+-----------------+----------------------------------------------------------------------------------------+ + + +Hash Table Design +~~~~~~~~~~~~~~~~~ + +Hash Table Overview +^^^^^^^^^^^^^^^^^^^ + +Hash tables are important because the key lookup operation is optimized for speed: +instead of having to linearly search the lookup key through all the keys in the table, +the search is limited to only the keys stored in a single table bucket. + +**Associative Arrays** + +An associative array is a function that can be specified as a set of (key, value) pairs, +with each key from the possible set of input keys present at most once. +For a given associative array, the possible operations are: + +#. *add (key, value)*: When no value is currently associated with *key*, then the (key, *value* ) association is created. + When *key* is already associated value *value0*, then the association (*key*, *value0*) is removed + and association *(key, value)* is created; + +#. *delete key*: When no value is currently associated with *key*, this operation has no effect. + When *key* is already associated *value*, then association *(key, value)* is removed; + +#. *lookup key*: When no value is currently associated with *key*, then this operation returns void value (lookup miss). + When *key* is associated with *value*, then this operation returns *value*. + The *(key, value)* association is not changed. + +The matching criterion used to compare the input key against the keys in the associative array is *exact match*, +as the key size (number of bytes) and the key value (array of bytes) have to match exactly for the two keys under comparison. + +**Hash Function** + +A hash function deterministically maps data of variable length (key) to data of fixed size (hash value or key signature). +Typically, the size of the key is bigger than the size of the key signature. +The hash function basically compresses a long key into a short signature. +Several keys can share the same signature (collisions). + +High quality hash functions have uniform distribution. +For large number of keys, when dividing the space of signature values into a fixed number of equal intervals (buckets), +it is desirable to have the key signatures evenly distributed across these intervals (uniform distribution), +as opposed to most of the signatures going into only a few of the intervals +and the rest of the intervals being largely unused (non-uniform distribution). + +**Hash Table** + +A hash table is an associative array that uses a hash function for its operation. +The reason for using a hash function is to optimize the performance of the lookup operation +by minimizing the number of table keys that have to be compared against the input key. + +Instead of storing the (key, value) pairs in a single list, the hash table maintains multiple lists (buckets). +For any given key, there is a single bucket where that key might exist, and this bucket is uniquely identified based on the key signature. +Once the key signature is computed and the hash table bucket identified, +the key is either located in this bucket or it is not present in the hash table at all, +so the key search can be narrowed down from the full set of keys currently in the table +to just the set of keys currently in the identified table bucket. + +The performance of the hash table lookup operation is greatly improved, +provided that the table keys are evenly distributed among the hash table buckets, +which can be achieved by using a hash function with uniform distribution. +The rule to map a key to its bucket can simply be to use the key signature (modulo the number of table buckets) as the table bucket ID: + + *bucket_id = f_hash(key) % n_buckets;* + +By selecting the number of buckets to be a power of two, the modulo operator can be replaced by a bitwise AND logical operation: + + *bucket_id = f_hash(key) & (n_buckets - 1);* + +considering *n_bits* as the number of bits set in *bucket_mask = n_buckets - 1*, +this means that all the keys that end up in the same hash table bucket have the lower *n_bits* of their signature identical. +In order to reduce the number of keys in the same bucket (collisions), the number of hash table buckets needs to be increased. + +In packet processing context, the sequence of operations involved in hash table operations is described in :numref:`figure_figure33`: + +.. _figure_figure33: + +.. figure:: img/figure33.* + + Sequence of Steps for Hash Table Operations in a Packet Processing Context + + + +Hash Table Use Cases +^^^^^^^^^^^^^^^^^^^^ + +**Flow Classification** + +*Description:* The flow classification is executed at least once for each input packet. +This operation maps each incoming packet against one of the known traffic flows in the flow database that typically contains millions of flows. + +*Hash table name:* Flow classification table + +*Number of keys:* Millions + +*Key format:* n-tuple of packet fields that uniquely identify a traffic flow/connection. +Example: DiffServ 5-tuple of (Source IP address, Destination IP address, L4 protocol, L4 protocol source port, L4 protocol destination port). +For IPv4 protocol and L4 protocols like TCP, UDP or SCTP, the size of the DiffServ 5-tuple is 13 bytes, while for IPv6 it is 37 bytes. + +*Key value (key data):* actions and action meta-data describing what processing to be applied for the packets of the current flow. +The size of the data associated with each traffic flow can vary from 8 bytes to kilobytes. + +**Address Resolution Protocol (ARP)** + +*Description:* Once a route has been identified for an IP packet (so the output interface and the IP address of the next hop station are known), +the MAC address of the next hop station is needed in order to send this packet onto the next leg of the journey +towards its destination (as identified by its destination IP address). +The MAC address of the next hop station becomes the destination MAC address of the outgoing Ethernet frame. + +*Hash table name:* ARP table + +*Number of keys:* Thousands + +*Key format:* The pair of (Output interface, Next Hop IP address), which is typically 5 bytes for IPv4 and 17 bytes for IPv6. + +*Key value (key data):* MAC address of the next hop station (6 bytes). + +Hash Table Types +^^^^^^^^^^^^^^^^ + +:numref:`table_qos_22` lists the hash table configuration parameters shared by all different hash table types. + +.. _table_qos_22: + +.. table:: Configuration Parameters Common for All Hash Table Types + + +---+---------------------------+------------------------------------------------------------------------------+ + | # | Parameter | Details | + | | | | + +===+===========================+==============================================================================+ + | 1 | Key size | Measured as number of bytes. All keys have the same size. | + | | | | + +---+---------------------------+------------------------------------------------------------------------------+ + | 2 | Key value (key data) size | Measured as number of bytes. | + | | | | + +---+---------------------------+------------------------------------------------------------------------------+ + | 3 | Number of buckets | Needs to be a power of two. | + | | | | + +---+---------------------------+------------------------------------------------------------------------------+ + | 4 | Maximum number of keys | Needs to be a power of two. | + | | | | + +---+---------------------------+------------------------------------------------------------------------------+ + | 5 | Hash function | Examples: jhash, CRC hash, etc. | + | | | | + +---+---------------------------+------------------------------------------------------------------------------+ + | 6 | Hash function seed | Parameter to be passed to the hash function. | + | | | | + +---+---------------------------+------------------------------------------------------------------------------+ + | 7 | Key offset | Offset of the lookup key byte array within the packet meta-data stored in | + | | | the packet buffer. | + | | | | + +---+---------------------------+------------------------------------------------------------------------------+ + +Bucket Full Problem +""""""""""""""""""" + +On initialization, each hash table bucket is allocated space for exactly 4 keys. +As keys are added to the table, it can happen that a given bucket already has 4 keys when a new key has to be added to this bucket. +The possible options are: + +#. **Least Recently Used (LRU) Hash Table.** + One of the existing keys in the bucket is deleted and the new key is added in its place. + The number of keys in each bucket never grows bigger than 4. The logic to pick the key to be dropped from the bucket is LRU. + The hash table lookup operation maintains the order in which the keys in the same bucket are hit, so every time a key is hit, + it becomes the new Most Recently Used (MRU) key, i.e. the last candidate for drop. + When a key is added to the bucket, it also becomes the new MRU key. + When a key needs to be picked and dropped, the first candidate for drop, i.e. the current LRU key, is always picked. + The LRU logic requires maintaining specific data structures per each bucket. + +#. **Extendable Bucket Hash Table.** + The bucket is extended with space for 4 more keys. + This is done by allocating additional memory at table initialization time, + which is used to create a pool of free keys (the size of this pool is configurable and always a multiple of 4). + On key add operation, the allocation of a group of 4 keys only happens successfully within the limit of free keys, + otherwise the key add operation fails. + On key delete operation, a group of 4 keys is freed back to the pool of free keys + when the key to be deleted is the only key that was used within its group of 4 keys at that time. + On key lookup operation, if the current bucket is in extended state and a match is not found in the first group of 4 keys, + the search continues beyond the first group of 4 keys, potentially until all keys in this bucket are examined. + The extendable bucket logic requires maintaining specific data structures per table and per each bucket. + +.. _table_qos_23: + +.. table:: Configuration Parameters Specific to Extendable Bucket Hash Table + + +---+---------------------------+--------------------------------------------------+ + | # | Parameter | Details | + | | | | + +===+===========================+==================================================+ + | 1 | Number of additional keys | Needs to be a power of two, at least equal to 4. | + | | | | + +---+---------------------------+--------------------------------------------------+ + + +Signature Computation +""""""""""""""""""""" + +The possible options for key signature computation are: + +#. **Pre-computed key signature.** + The key lookup operation is split between two CPU cores. + The first CPU core (typically the CPU core that performs packet RX) extracts the key from the input packet, + computes the key signature and saves both the key and the key signature in the packet buffer as packet meta-data. + The second CPU core reads both the key and the key signature from the packet meta-data + and performs the bucket search step of the key lookup operation. + +#. **Key signature computed on lookup ("do-sig" version).** + The same CPU core reads the key from the packet meta-data, uses it to compute the key signature + and also performs the bucket search step of the key lookup operation. + +.. _table_qos_24: + +.. table:: Configuration Parameters Specific to Pre-computed Key Signature Hash Table + + +---+------------------+-----------------------------------------------------------------------+ + | # | Parameter | Details | + | | | | + +===+==================+=======================================================================+ + | 1 | Signature offset | Offset of the pre-computed key signature within the packet meta-data. | + | | | | + +---+------------------+-----------------------------------------------------------------------+ + +Key Size Optimized Hash Tables +"""""""""""""""""""""""""""""" + +For specific key sizes, the data structures and algorithm of key lookup operation can be specially handcrafted for further performance improvements, +so following options are possible: + +#. **Implementation supporting configurable key size.** + +#. **Implementation supporting a single key size.** + Typical key sizes are 8 bytes and 16 bytes. + +Bucket Search Logic for Configurable Key Size Hash Tables +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The performance of the bucket search logic is one of the main factors influencing the performance of the key lookup operation. +The data structures and algorithm are designed to make the best use of Intel CPU architecture resources like: +cache memory space, cache memory bandwidth, external memory bandwidth, multiple execution units working in parallel, +out of order instruction execution, special CPU instructions, etc. + +The bucket search logic handles multiple input packets in parallel. +It is built as a pipeline of several stages (3 or 4), with each pipeline stage handling two different packets from the burst of input packets. +On each pipeline iteration, the packets are pushed to the next pipeline stage: for the 4-stage pipeline, +two packets (that just completed stage 3) exit the pipeline, +two packets (that just completed stage 2) are now executing stage 3, two packets (that just completed stage 1) are now executing stage 2, +two packets (that just completed stage 0) are now executing stage 1 and two packets (next two packets to read from the burst of input packets) +are entering the pipeline to execute stage 0. +The pipeline iterations continue until all packets from the burst of input packets execute the last stage of the pipeline. + +The bucket search logic is broken into pipeline stages at the boundary of the next memory access. +Each pipeline stage uses data structures that are stored (with high probability) into the L1 or L2 cache memory of the current CPU core and +breaks just before the next memory access required by the algorithm. +The current pipeline stage finalizes by prefetching the data structures required by the next pipeline stage, +so given enough time for the prefetch to complete, +when the next pipeline stage eventually gets executed for the same packets, +it will read the data structures it needs from L1 or L2 cache memory and thus avoid the significant penalty incurred by L2 or L3 cache memory miss. + +By prefetching the data structures required by the next pipeline stage in advance (before they are used) +and switching to executing another pipeline stage for different packets, +the number of L2 or L3 cache memory misses is greatly reduced, hence one of the main reasons for improved performance. +This is because the cost of L2/L3 cache memory miss on memory read accesses is high, as usually due to data dependency between instructions, +the CPU execution units have to stall until the read operation is completed from L3 cache memory or external DRAM memory. +By using prefetch instructions, the latency of memory read accesses is hidden, +provided that it is preformed early enough before the respective data structure is actually used. + +By splitting the processing into several stages that are executed on different packets (the packets from the input burst are interlaced), +enough work is created to allow the prefetch instructions to complete successfully (before the prefetched data structures are actually accessed) and +also the data dependency between instructions is loosened. +For example, for the 4-stage pipeline, stage 0 is executed on packets 0 and 1 and then, +before same packets 0 and 1 are used (i.e. before stage 1 is executed on packets 0 and 1), +different packets are used: packets 2 and 3 (executing stage 1), packets 4 and 5 (executing stage 2) and packets 6 and 7 (executing stage 3). +By executing useful work while the data structures are brought into the L1 or L2 cache memory, the latency of the read memory accesses is hidden. +By increasing the gap between two consecutive accesses to the same data structure, the data dependency between instructions is loosened; +this allows making the best use of the super-scalar and out-of-order execution CPU architecture, +as the number of CPU core execution units that are active (rather than idle or stalled due to data dependency constraints between instructions) is maximized. + +The bucket search logic is also implemented without using any branch instructions. +This avoids the important cost associated with flushing the CPU core execution pipeline on every instance of branch misprediction. + +Configurable Key Size Hash Table +"""""""""""""""""""""""""""""""" + +:numref:`figure_figure34`, :numref:`table_qos_25` and :numref:`table_qos_26` detail the main data structures used to implement configurable key size hash tables (either LRU or extendable bucket, +either with pre-computed signature or "do-sig"). + +.. _figure_figure34: + +.. figure:: img/figure34.* + + Data Structures for Configurable Key Size Hash Tables + + +.. _table_qos_25: + +.. table:: Main Large Data Structures (Arrays) used for Configurable Key Size Hash Tables + + +---+-------------------------+------------------------------+---------------------------+-------------------------------+ + | # | Array name | Number of entries | Entry size (bytes) | Description | + | | | | | | + +===+=========================+==============================+===========================+===============================+ + | 1 | Bucket array | n_buckets (configurable) | 32 | Buckets of the hash table. | + | | | | | | + +---+-------------------------+------------------------------+---------------------------+-------------------------------+ + | 2 | Bucket extensions array | n_buckets_ext (configurable) | 32 | This array is only created | + | | | | | for extendable bucket tables. | + | | | | | | + +---+-------------------------+------------------------------+---------------------------+-------------------------------+ + | 3 | Key array | n_keys | key_size (configurable) | Keys added to the hash table. | + | | | | | | + +---+-------------------------+------------------------------+---------------------------+-------------------------------+ + | 4 | Data array | n_keys | entry_size (configurable) | Key values (key data) | + | | | | | associated with the hash | + | | | | | table keys. | + | | | | | | + +---+-------------------------+------------------------------+---------------------------+-------------------------------+ + +.. _table_qos_26: + +.. table:: Field Description for Bucket Array Entry (Configurable Key Size Hash Tables) + + +---+------------------+--------------------+------------------------------------------------------------------+ + | # | Field name | Field size (bytes) | Description | + | | | | | + +===+==================+====================+==================================================================+ + | 1 | Next Ptr/LRU | 8 | For LRU tables, this fields represents the LRU list for the | + | | | | current bucket stored as array of 4 entries of 2 bytes each. | + | | | | Entry 0 stores the index (0 .. 3) of the MRU key, while entry 3 | + | | | | stores the index of the LRU key. | + | | | | | + | | | | For extendable bucket tables, this field represents the next | + | | | | pointer (i.e. the pointer to the next group of 4 keys linked to | + | | | | the current bucket). The next pointer is not NULL if the bucket | + | | | | is currently extended or NULL otherwise. | + | | | | To help the branchless implementation, bit 0 (least significant | + | | | | bit) of this field is set to 1 if the next pointer is not NULL | + | | | | and to 0 otherwise. | + | | | | | + +---+------------------+--------------------+------------------------------------------------------------------+ + | 2 | Sig[0 .. 3] | 4 x 2 | If key X (X = 0 .. 3) is valid, then sig X bits 15 .. 1 store | + | | | | the most significant 15 bits of key X signature and sig X bit 0 | + | | | | is set to 1. | + | | | | | + | | | | If key X is not valid, then sig X is set to zero. | + | | | | | + +---+------------------+--------------------+------------------------------------------------------------------+ + | 3 | Key Pos [0 .. 3] | 4 x 4 | If key X is valid (X = 0 .. 3), then Key Pos X represents the | + | | | | index into the key array where key X is stored, as well as the | + | | | | index into the data array where the value associated with key X | + | | | | is stored. | + | | | | | + | | | | If key X is not valid, then the value of Key Pos X is undefined. | + | | | | | + +---+------------------+--------------------+------------------------------------------------------------------+ + + +:numref:`figure_figure35` and :numref:`table_qos_27` detail the bucket search pipeline stages (either LRU or extendable bucket, +either with pre-computed signature or "do-sig"). +For each pipeline stage, the described operations are applied to each of the two packets handled by that stage. + +.. _figure_figure35: + +.. figure:: img/figure35.* + + Bucket Search Pipeline for Key Lookup Operation (Configurable Key Size Hash + Tables) + + +.. _table_qos_27: + +.. table:: Description of the Bucket Search Pipeline Stages (Configurable Key Size Hash Tables) + + +---+---------------------------+------------------------------------------------------------------------------+ + | # | Stage name | Description | + | | | | + +===+===========================+==============================================================================+ + | 0 | Prefetch packet meta-data | Select next two packets from the burst of input packets. | + | | | | + | | | Prefetch packet meta-data containing the key and key signature. | + | | | | + +---+---------------------------+------------------------------------------------------------------------------+ + | 1 | Prefetch table bucket | Read the key signature from the packet meta-data (for extendable bucket hash | + | | | tables) or read the key from the packet meta-data and compute key signature | + | | | (for LRU tables). | + | | | | + | | | Identify the bucket ID using the key signature. | + | | | | + | | | Set bit 0 of the signature to 1 (to match only signatures of valid keys from | + | | | the table). | + | | | | + | | | Prefetch the bucket. | + | | | | + +---+---------------------------+------------------------------------------------------------------------------+ + | 2 | Prefetch table key | Read the key signatures from the bucket. | + | | | | + | | | Compare the signature of the input key against the 4 key signatures from the | + | | | packet. As result, the following is obtained: | + | | | | + | | | *match* | + | | | = equal to TRUE if there was at least one signature match and to FALSE in | + | | | the case of no signature match; | + | | | | + | | | *match_many* | + | | | = equal to TRUE is there were more than one signature matches (can be up to | + | | | 4 signature matches in the worst case scenario) and to FALSE otherwise; | + | | | | + | | | *match_pos* | + | | | = the index of the first key that produced signature match (only valid if | + | | | match is true). | + | | | | + | | | For extendable bucket hash tables only, set | + | | | *match_many* | + | | | to TRUE if next pointer is valid. | + | | | | + | | | Prefetch the bucket key indicated by | + | | | *match_pos* | + | | | (even if | + | | | *match_pos* | + | | | does not point to valid key valid). | + | | | | + +---+---------------------------+------------------------------------------------------------------------------+ + | 3 | Prefetch table data | Read the bucket key indicated by | + | | | *match_pos*. | + | | | | + | | | Compare the bucket key against the input key. As result, the following is | + | | | obtained: | + | | | *match_key* | + | | | = equal to TRUE if the two keys match and to FALSE otherwise. | + | | | | + | | | Report input key as lookup hit only when both | + | | | *match* | + | | | and | + | | | *match_key* | + | | | are equal to TRUE and as lookup miss otherwise. | + | | | | + | | | For LRU tables only, use branchless logic to update the bucket LRU list | + | | | (the current key becomes the new MRU) only on lookup hit. | + | | | | + | | | Prefetch the key value (key data) associated with the current key (to avoid | + | | | branches, this is done on both lookup hit and miss). | + | | | | + +---+---------------------------+------------------------------------------------------------------------------+ + + +Additional notes: + +#. The pipelined version of the bucket search algorithm is executed only if there are at least 7 packets in the burst of input packets. + If there are less than 7 packets in the burst of input packets, + a non-optimized implementation of the bucket search algorithm is executed. + +#. Once the pipelined version of the bucket search algorithm has been executed for all the packets in the burst of input packets, + the non-optimized implementation of the bucket search algorithm is also executed for any packets that did not produce a lookup hit, + but have the *match_many* flag set. + As result of executing the non-optimized version, some of these packets may produce a lookup hit or lookup miss. + This does not impact the performance of the key lookup operation, + as the probability of matching more than one signature in the same group of 4 keys or of having the bucket in extended state + (for extendable bucket hash tables only) is relatively small. + +**Key Signature Comparison Logic** + +The key signature comparison logic is described in :numref:`table_qos_28`. + +.. _table_qos_28: + +.. table:: Lookup Tables for Match, Match_Many and Match_Pos + + +----+------+---------------+--------------------+--------------------+ + | # | mask | match (1 bit) | match_many (1 bit) | match_pos (2 bits) | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 0 | 0000 | 0 | 0 | 00 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 1 | 0001 | 1 | 0 | 00 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 2 | 0010 | 1 | 0 | 01 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 3 | 0011 | 1 | 1 | 00 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 4 | 0100 | 1 | 0 | 10 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 5 | 0101 | 1 | 1 | 00 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 6 | 0110 | 1 | 1 | 01 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 7 | 0111 | 1 | 1 | 00 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 8 | 1000 | 1 | 0 | 11 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 9 | 1001 | 1 | 1 | 00 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 10 | 1010 | 1 | 1 | 01 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 11 | 1011 | 1 | 1 | 00 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 12 | 1100 | 1 | 1 | 10 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 13 | 1101 | 1 | 1 | 00 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 14 | 1110 | 1 | 1 | 01 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + | 15 | 1111 | 1 | 1 | 00 | + | | | | | | + +----+------+---------------+--------------------+--------------------+ + +The input *mask* hash bit X (X = 0 .. 3) set to 1 if input signature is equal to bucket signature X and set to 0 otherwise. +The outputs *match*, *match_many* and *match_pos* are 1 bit, 1 bit and 2 bits in size respectively and their meaning has been explained above. + +As displayed in :numref:`table_qos_29`, the lookup tables for *match* and *match_many* can be collapsed into a single 32-bit value and the lookup table for +*match_pos* can be collapsed into a 64-bit value. +Given the input *mask*, the values for *match*, *match_many* and *match_pos* can be obtained by indexing their respective bit array to extract 1 bit, +1 bit and 2 bits respectively with branchless logic. + +.. _table_qos_29: + +.. table:: Collapsed Lookup Tables for Match, Match_Many and Match_Pos + + +------------+------------------------------------------+-------------------+ + | | Bit array | Hexadecimal value | + | | | | + +------------+------------------------------------------+-------------------+ + | match | 1111_1111_1111_1110 | 0xFFFELLU | + | | | | + +------------+------------------------------------------+-------------------+ + | match_many | 1111_1110_1110_1000 | 0xFEE8LLU | + | | | | + +------------+------------------------------------------+-------------------+ + | match_pos | 0001_0010_0001_0011__0001_0010_0001_0000 | 0x12131210LLU | + | | | | + +------------+------------------------------------------+-------------------+ + + +The pseudo-code for match, match_many and match_pos is:: + + match = (0xFFFELLU >> mask) & 1; + + match_many = (0xFEE8LLU >> mask) & 1; + + match_pos = (0x12131210LLU >> (mask << 1)) & 3; + +Single Key Size Hash Tables +""""""""""""""""""""""""""" + +:numref:`figure_figure37`, :numref:`figure_figure38`, :numref:`table_qos_30` and :numref:`table_qos_31` detail the main data structures used to implement 8-byte and 16-byte key hash tables +(either LRU or extendable bucket, either with pre-computed signature or "do-sig"). + +.. _figure_figure37: + +.. figure:: img/figure37.* + + Data Structures for 8-byte Key Hash Tables + + +.. _figure_figure38: + +.. figure:: img/figure38.* + + Data Structures for 16-byte Key Hash Tables + + +.. _table_qos_30: + +.. table:: Main Large Data Structures (Arrays) used for 8-byte and 16-byte Key Size Hash Tables + + +---+-------------------------+------------------------------+----------------------+------------------------------------+ + | # | Array name | Number of entries | Entry size (bytes) | Description | + | | | | | | + +===+=========================+==============================+======================+====================================+ + | 1 | Bucket array | n_buckets (configurable) | *8-byte key size:* | Buckets of the hash table. | + | | | | | | + | | | | 64 + 4 x entry_size | | + | | | | | | + | | | | | | + | | | | *16-byte key size:* | | + | | | | | | + | | | | 128 + 4 x entry_size | | + | | | | | | + +---+-------------------------+------------------------------+----------------------+------------------------------------+ + | 2 | Bucket extensions array | n_buckets_ext (configurable) | *8-byte key size:* | This array is only created for | + | | | | | extendable bucket tables. | + | | | | | | + | | | | 64 + 4 x entry_size | | + | | | | | | + | | | | | | + | | | | *16-byte key size:* | | + | | | | | | + | | | | 128 + 4 x entry_size | | + | | | | | | + +---+-------------------------+------------------------------+----------------------+------------------------------------+ + +.. _table_qos_31: + +.. table:: Field Description for Bucket Array Entry (8-byte and 16-byte Key Hash Tables) + + +---+---------------+--------------------+-------------------------------------------------------------------------------+ + | # | Field name | Field size (bytes) | Description | + | | | | | + +===+===============+====================+===============================================================================+ + | 1 | Valid | 8 | Bit X (X = 0 .. 3) is set to 1 if key X is valid or to 0 otherwise. | + | | | | | + | | | | Bit 4 is only used for extendable bucket tables to help with the | + | | | | implementation of the branchless logic. In this case, bit 4 is set to 1 if | + | | | | next pointer is valid (not NULL) or to 0 otherwise. | + | | | | | + +---+---------------+--------------------+-------------------------------------------------------------------------------+ + | 2 | Next Ptr/LRU | 8 | For LRU tables, this fields represents the LRU list for the current bucket | + | | | | stored as array of 4 entries of 2 bytes each. Entry 0 stores the index | + | | | | (0 .. 3) of the MRU key, while entry 3 stores the index of the LRU key. | + | | | | | + | | | | For extendable bucket tables, this field represents the next pointer (i.e. | + | | | | the pointer to the next group of 4 keys linked to the current bucket). The | + | | | | next pointer is not NULL if the bucket is currently extended or NULL | + | | | | otherwise. | + | | | | | + +---+---------------+--------------------+-------------------------------------------------------------------------------+ + | 3 | Key [0 .. 3] | 4 x key_size | Full keys. | + | | | | | + +---+---------------+--------------------+-------------------------------------------------------------------------------+ + | 4 | Data [0 .. 3] | 4 x entry_size | Full key values (key data) associated with keys 0 .. 3. | + | | | | | + +---+---------------+--------------------+-------------------------------------------------------------------------------+ + +and detail the bucket search pipeline used to implement 8-byte and 16-byte key hash tables (either LRU or extendable bucket, +either with pre-computed signature or "do-sig"). +For each pipeline stage, the described operations are applied to each of the two packets handled by that stage. + +.. _figure_figure39: + +.. figure:: img/figure39.* + + Bucket Search Pipeline for Key Lookup Operation (Single Key Size Hash + Tables) + + +.. _table_qos_32: + +.. table:: Description of the Bucket Search Pipeline Stages (8-byte and 16-byte Key Hash Tables) + + +---+---------------------------+-----------------------------------------------------------------------------+ + | # | Stage name | Description | + | | | | + +===+===========================+=============================================================================+ + | 0 | Prefetch packet meta-data | #. Select next two packets from the burst of input packets. | + | | | | + | | | #. Prefetch packet meta-data containing the key and key signature. | + | | | | + +---+---------------------------+-----------------------------------------------------------------------------+ + | 1 | Prefetch table bucket | #. Read the key signature from the packet meta-data (for extendable bucket | + | | | hash tables) or read the key from the packet meta-data and compute key | + | | | signature (for LRU tables). | + | | | | + | | | #. Identify the bucket ID using the key signature. | + | | | | + | | | #. Prefetch the bucket. | + | | | | + +---+---------------------------+-----------------------------------------------------------------------------+ + | 2 | Prefetch table data | #. Read the bucket. | + | | | | + | | | #. Compare all 4 bucket keys against the input key. | + | | | | + | | | #. Report input key as lookup hit only when a match is identified (more | + | | | than one key match is not possible) | + | | | | + | | | #. For LRU tables only, use branchless logic to update the bucket LRU list | + | | | (the current key becomes the new MRU) only on lookup hit. | + | | | | + | | | #. Prefetch the key value (key data) associated with the matched key (to | + | | | avoid branches, this is done on both lookup hit and miss). | + | | | | + +---+---------------------------+-----------------------------------------------------------------------------+ + +Additional notes: + +#. The pipelined version of the bucket search algorithm is executed only if there are at least 5 packets in the burst of input packets. + If there are less than 5 packets in the burst of input packets, a non-optimized implementation of the bucket search algorithm is executed. + +#. For extendable bucket hash tables only, + once the pipelined version of the bucket search algorithm has been executed for all the packets in the burst of input packets, + the non-optimized implementation of the bucket search algorithm is also executed for any packets that did not produce a lookup hit, + but have the bucket in extended state. + As result of executing the non-optimized version, some of these packets may produce a lookup hit or lookup miss. + This does not impact the performance of the key lookup operation, + as the probability of having the bucket in extended state is relatively small. + +Pipeline Library Design +----------------------- + +A pipeline is defined by: + +#. The set of input ports; + +#. The set of output ports; + +#. The set of tables; + +#. The set of actions. + +The input ports are connected with the output ports through tree-like topologies of interconnected tables. +The table entries contain the actions defining the operations to be executed on the input packets and the packet flow within the pipeline. + +Connectivity of Ports and Tables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To avoid any dependencies on the order in which pipeline elements are created, +the connectivity of pipeline elements is defined after all the pipeline input ports, +output ports and tables have been created. + +General connectivity rules: + +#. Each input port is connected to a single table. No input port should be left unconnected; + +#. The table connectivity to other tables or to output ports is regulated by the next hop actions of each table entry and the default table entry. + The table connectivity is fluid, as the table entries and the default table entry can be updated during run-time. + + * A table can have multiple entries (including the default entry) connected to the same output port. + A table can have different entries connected to different output ports. + Different tables can have entries (including default table entry) connected to the same output port. + + * A table can have multiple entries (including the default entry) connected to another table, + in which case all these entries have to point to the same table. + This constraint is enforced by the API and prevents tree-like topologies from being created (allowing table chaining only), + with the purpose of simplifying the implementation of the pipeline run-time execution engine. + +Port Actions +~~~~~~~~~~~~ + +Port Action Handler +^^^^^^^^^^^^^^^^^^^ + +An action handler can be assigned to each input/output port to define actions to be executed on each input packet that is received by the port. +Defining the action handler for a specific input/output port is optional (i.e. the action handler can be disabled). + +For input ports, the action handler is executed after RX function. For output ports, the action handler is executed before the TX function. + +The action handler can decide to drop packets. + +Table Actions +~~~~~~~~~~~~~ + +Table Action Handler +^^^^^^^^^^^^^^^^^^^^ + +An action handler to be executed on each input packet can be assigned to each table. +Defining the action handler for a specific table is optional (i.e. the action handler can be disabled). + +The action handler is executed after the table lookup operation is performed and the table entry associated with each input packet is identified. +The action handler can only handle the user-defined actions, while the reserved actions (e.g. the next hop actions) are handled by the Packet Framework. +The action handler can decide to drop the input packet. + +Reserved Actions +^^^^^^^^^^^^^^^^ + +The reserved actions are handled directly by the Packet Framework without the user being able to change their meaning +through the table action handler configuration. +A special category of the reserved actions is represented by the next hop actions, which regulate the packet flow between input ports, +tables and output ports through the pipeline. +:numref:`table_qos_33` lists the next hop actions. + +.. _table_qos_33: + +.. table:: Next Hop Actions (Reserved) + + +---+---------------------+-----------------------------------------------------------------------------------+ + | # | Next hop action | Description | + | | | | + +===+=====================+===================================================================================+ + | 1 | Drop | Drop the current packet. | + | | | | + +---+---------------------+-----------------------------------------------------------------------------------+ + | 2 | Send to output port | Send the current packet to specified output port. The output port ID is metadata | + | | | stored in the same table entry. | + | | | | + +---+---------------------+-----------------------------------------------------------------------------------+ + | 3 | Send to table | Send the current packet to specified table. The table ID is metadata stored in | + | | | the same table entry. | + | | | | + +---+---------------------+-----------------------------------------------------------------------------------+ + +User Actions +^^^^^^^^^^^^ + +For each table, the meaning of user actions is defined through the configuration of the table action handler. +Different tables can be configured with different action handlers, therefore the meaning of the user actions +and their associated meta-data is private to each table. +Within the same table, all the table entries (including the table default entry) share the same definition +for the user actions and their associated meta-data, +with each table entry having its own set of enabled user actions and its own copy of the action meta-data. +:numref:`table_qos_34` contains a non-exhaustive list of user action examples. + +.. _table_qos_34: + +.. table:: User Action Examples + + +---+-----------------------------------+---------------------------------------------------------------------+ + | # | User action | Description | + | | | | + +===+===================================+=====================================================================+ + | 1 | Metering | Per flow traffic metering using the srTCM and trTCM algorithms. | + | | | | + +---+-----------------------------------+---------------------------------------------------------------------+ + | 2 | Statistics | Update the statistics counters maintained per flow. | + | | | | + +---+-----------------------------------+---------------------------------------------------------------------+ + | 3 | App ID | Per flow state machine fed by variable length sequence of packets | + | | | at the flow initialization with the purpose of identifying the | + | | | traffic type and application. | + | | | | + +---+-----------------------------------+---------------------------------------------------------------------+ + | 4 | Push/pop labels | Push/pop VLAN/MPLS labels to/from the current packet. | + | | | | + +---+-----------------------------------+---------------------------------------------------------------------+ + | 5 | Network Address Translation (NAT) | Translate between the internal (LAN) and external (WAN) IP | + | | | destination/source address and/or L4 protocol destination/source | + | | | port. | + | | | | + +---+-----------------------------------+---------------------------------------------------------------------+ + | 6 | TTL update | Decrement IP TTL and, in case of IPv4 packets, update the IP | + | | | checksum. | + | | | | + +---+-----------------------------------+---------------------------------------------------------------------+ + | 7 | Sym Crypto | Generate Cryptodev session based on the user-specified algorithm | + | | | and key(s), and assemble the cryptodev operation based on the | + | | | predefined offsets. | + | | | | + +---+-----------------------------------+---------------------------------------------------------------------+ + +Multicore Scaling +----------------- + +A complex application is typically split across multiple cores, with cores communicating through SW queues. +There is usually a performance limit on the number of table lookups +and actions that can be fitted on the same CPU core due to HW constraints like: +available CPU cycles, cache memory size, cache transfer BW, memory transfer BW, etc. + +As the application is split across multiple CPU cores, the Packet Framework facilitates the creation of several pipelines, +the assignment of each such pipeline to a different CPU core +and the interconnection of all CPU core-level pipelines into a single application-level complex pipeline. +For example, if CPU core A is assigned to run pipeline P1 and CPU core B pipeline P2, +then the interconnection of P1 with P2 could be achieved by having the same set of SW queues act like output ports +for P1 and input ports for P2. + +This approach enables the application development using the pipeline, run-to-completion (clustered) or hybrid (mixed) models. + +It is allowed for the same core to run several pipelines, but it is not allowed for several cores to run the same pipeline. + +Shared Data Structures +~~~~~~~~~~~~~~~~~~~~~~ + +The threads performing table lookup are actually table writers rather than just readers. +Even if the specific table lookup algorithm is thread-safe for multiple readers +(e. g. read-only access of the search algorithm data structures is enough to conduct the lookup operation), +once the table entry for the current packet is identified, the thread is typically expected to update the action meta-data stored in the table entry +(e.g. increment the counter tracking the number of packets that hit this table entry), and thus modify the table entry. +During the time this thread is accessing this table entry (either writing or reading; duration is application specific), +for data consistency reasons, no other threads (threads performing table lookup or entry add/delete operations) are allowed to modify this table entry. + +Mechanisms to share the same table between multiple threads: + +#. **Multiple writer threads.** + Threads need to use synchronization primitives like semaphores (distinct semaphore per table entry) or atomic instructions. + The cost of semaphores is usually high, even when the semaphore is free. + The cost of atomic instructions is normally higher than the cost of regular instructions. + +#. **Multiple writer threads, with single thread performing table lookup operations and multiple threads performing table entry add/delete operations.** + The threads performing table entry add/delete operations send table update requests to the reader (typically through message passing queues), + which does the actual table updates and then sends the response back to the request initiator. + +#. **Single writer thread performing table entry add/delete operations and multiple reader threads that perform table lookup operations with read-only access to the table entries.** + The reader threads use the main table copy while the writer is updating the mirror copy. + Once the writer update is done, the writer can signal to the readers and busy wait until all readers swaps between the mirror copy (which now becomes the main copy) and + the mirror copy (which now becomes the main copy). + +Interfacing with Accelerators +----------------------------- + +The presence of accelerators is usually detected during the initialization phase by inspecting the HW devices that are part of the system (e.g. by PCI bus enumeration). +Typical devices with acceleration capabilities are: + +* Inline accelerators: NICs, switches, FPGAs, etc; + +* Look-aside accelerators: chipsets, FPGAs, Intel QuickAssist, etc. + +Usually, to support a specific functional block, specific implementation of Packet Framework tables and/or ports and/or actions has to be provided for each accelerator, +with all the implementations sharing the same API: pure SW implementation (no acceleration), implementation using accelerator A, implementation using accelerator B, etc. +The selection between these implementations could be done at build time or at run-time (recommended), based on which accelerators are present in the system, +with no application changes required. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/pdump_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/pdump_lib.rst new file mode 100644 index 000000000..2a0f1f397 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/pdump_lib.rst @@ -0,0 +1,86 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2016 Intel Corporation. + +.. _pdump_library: + +The librte_pdump Library +======================== + +The ``librte_pdump`` library provides a framework for packet capturing in DPDK. +The library does the complete copy of the Rx and Tx mbufs to a new mempool and +hence it slows down the performance of the applications, so it is recommended +to use this library for debugging purposes. + +The library provides the following APIs to initialize the packet capture framework, to enable +or disable the packet capture, and to uninitialize it: + +* ``rte_pdump_init()``: + This API initializes the packet capture framework. + +* ``rte_pdump_enable()``: + This API enables the packet capture on a given port and queue. + Note: The filter option in the API is a place holder for future enhancements. + +* ``rte_pdump_enable_by_deviceid()``: + This API enables the packet capture on a given device id (``vdev name or pci address``) and queue. + Note: The filter option in the API is a place holder for future enhancements. + +* ``rte_pdump_disable()``: + This API disables the packet capture on a given port and queue. + +* ``rte_pdump_disable_by_deviceid()``: + This API disables the packet capture on a given device id (``vdev name or pci address``) and queue. + +* ``rte_pdump_uninit()``: + This API uninitializes the packet capture framework. + + +Operation +--------- + +The ``librte_pdump`` library works on a client/server model. The server is responsible for enabling or +disabling the packet capture and the clients are responsible for requesting the enabling or disabling of +the packet capture. + +The packet capture framework, as part of its initialization, creates the pthread and the server socket in +the pthread. The application that calls the framework initialization will have the server socket created, +either under the path that the application has passed or under the default path i.e. either ``/var/run/.dpdk`` for +root user or ``~/.dpdk`` for non root user. + +Applications that request enabling or disabling of the packet capture will have the client socket created either under +the path that the application has passed or under the default path i.e. either ``/var/run/.dpdk`` for root user or +``~/.dpdk`` for not root user to send the requests to the server. The server socket will listen for client requests for +enabling or disabling the packet capture. + + +Implementation Details +---------------------- + +The library API ``rte_pdump_init()``, initializes the packet capture framework by creating the pdump server by calling +``rte_mp_action_register()`` function. The server will listen to the client requests to enable or disable the +packet capture. + +The library APIs ``rte_pdump_enable()`` and ``rte_pdump_enable_by_deviceid()`` enables the packet capture. +On each call to these APIs, the library creates a separate client socket, creates the "pdump enable" request and sends +the request to the server. The server that is listening on the socket will take the request and enable the packet capture +by registering the Ethernet RX and TX callbacks for the given port or device_id and queue combinations. +Then the server will mirror the packets to the new mempool and enqueue them to the rte_ring that clients have passed +to these APIs. The server also sends the response back to the client about the status of the request that was processed. +After the response is received from the server, the client socket is closed. + +The library APIs ``rte_pdump_disable()`` and ``rte_pdump_disable_by_deviceid()`` disables the packet capture. +On each call to these APIs, the library creates a separate client socket, creates the "pdump disable" request and sends +the request to the server. The server that is listening on the socket will take the request and disable the packet +capture by removing the Ethernet RX and TX callbacks for the given port or device_id and queue combinations. The server +also sends the response back to the client about the status of the request that was processed. After the response is +received from the server, the client socket is closed. + +The library API ``rte_pdump_uninit()``, uninitializes the packet capture framework by calling ``rte_mp_action_unregister()`` +function. + + +Use Case: Packet Capturing +-------------------------- + +The DPDK ``app/pdump`` tool is developed based on this library to capture packets in DPDK. +Users can use this as an example to develop their own packet capturing tools. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/perf_opt_guidelines.rst b/src/spdk/dpdk/doc/guides/prog_guide/perf_opt_guidelines.rst new file mode 100644 index 000000000..88f92909c --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/perf_opt_guidelines.rst @@ -0,0 +1,19 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +.. _Performance_Optimization: + +**Part 3: Performance Optimization** + +Performance Optimization Guidelines +=================================== + +Introduction +------------ + +The following sections describe optimizations used in DPDK and optimizations that should be considered for new applications. + +They also highlight the performance-impacting coding techniques that should, +and should not be, used when developing an application using the DPDK. + +And finally, they give an introduction to application profiling using a Performance Analyzer from Intel to optimize the software. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/poll_mode_drv.rst b/src/spdk/dpdk/doc/guides/prog_guide/poll_mode_drv.rst new file mode 100644 index 000000000..6fae39f90 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/poll_mode_drv.rst @@ -0,0 +1,617 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2015 Intel Corporation. + +.. _Poll_Mode_Driver: + +Poll Mode Driver +================ + +The DPDK includes 1 Gigabit, 10 Gigabit and 40 Gigabit and para virtualized virtio Poll Mode Drivers. + +A Poll Mode Driver (PMD) consists of APIs, provided through the BSD driver running in user space, +to configure the devices and their respective queues. +In addition, a PMD accesses the RX and TX descriptors directly without any interrupts +(with the exception of Link Status Change interrupts) to quickly receive, +process and deliver packets in the user's application. +This section describes the requirements of the PMDs, +their global design principles and proposes a high-level architecture and a generic external API for the Ethernet PMDs. + +Requirements and Assumptions +---------------------------- + +The DPDK environment for packet processing applications allows for two models, run-to-completion and pipe-line: + +* In the *run-to-completion* model, a specific port's RX descriptor ring is polled for packets through an API. + Packets are then processed on the same core and placed on a port's TX descriptor ring through an API for transmission. + +* In the *pipe-line* model, one core polls one or more port's RX descriptor ring through an API. + Packets are received and passed to another core via a ring. + The other core continues to process the packet which then may be placed on a port's TX descriptor ring through an API for transmission. + +In a synchronous run-to-completion model, +each logical core assigned to the DPDK executes a packet processing loop that includes the following steps: + +* Retrieve input packets through the PMD receive API + +* Process each received packet one at a time, up to its forwarding + +* Send pending output packets through the PMD transmit API + +Conversely, in an asynchronous pipe-line model, some logical cores may be dedicated to the retrieval of received packets and +other logical cores to the processing of previously received packets. +Received packets are exchanged between logical cores through rings. +The loop for packet retrieval includes the following steps: + +* Retrieve input packets through the PMD receive API + +* Provide received packets to processing lcores through packet queues + +The loop for packet processing includes the following steps: + +* Retrieve the received packet from the packet queue + +* Process the received packet, up to its retransmission if forwarded + +To avoid any unnecessary interrupt processing overhead, the execution environment must not use any asynchronous notification mechanisms. +Whenever needed and appropriate, asynchronous communication should be introduced as much as possible through the use of rings. + +Avoiding lock contention is a key issue in a multi-core environment. +To address this issue, PMDs are designed to work with per-core private resources as much as possible. +For example, a PMD maintains a separate transmit queue per-core, per-port, if the PMD is not ``DEV_TX_OFFLOAD_MT_LOCKFREE`` capable. +In the same way, every receive queue of a port is assigned to and polled by a single logical core (lcore). + +To comply with Non-Uniform Memory Access (NUMA), memory management is designed to assign to each logical core +a private buffer pool in local memory to minimize remote memory access. +The configuration of packet buffer pools should take into account the underlying physical memory architecture in terms of DIMMS, +channels and ranks. +The application must ensure that appropriate parameters are given at memory pool creation time. +See :ref:`Mempool Library <Mempool_Library>`. + +Design Principles +----------------- + +The API and architecture of the Ethernet* PMDs are designed with the following guidelines in mind. + +PMDs must help global policy-oriented decisions to be enforced at the upper application level. +Conversely, NIC PMD functions should not impede the benefits expected by upper-level global policies, +or worse prevent such policies from being applied. + +For instance, both the receive and transmit functions of a PMD have a maximum number of packets/descriptors to poll. +This allows a run-to-completion processing stack to statically fix or +to dynamically adapt its overall behavior through different global loop policies, such as: + +* Receive, process immediately and transmit packets one at a time in a piecemeal fashion. + +* Receive as many packets as possible, then process all received packets, transmitting them immediately. + +* Receive a given maximum number of packets, process the received packets, accumulate them and finally send all accumulated packets to transmit. + +To achieve optimal performance, overall software design choices and pure software optimization techniques must be considered and +balanced against available low-level hardware-based optimization features (CPU cache properties, bus speed, NIC PCI bandwidth, and so on). +The case of packet transmission is an example of this software/hardware tradeoff issue when optimizing burst-oriented network packet processing engines. +In the initial case, the PMD could export only an rte_eth_tx_one function to transmit one packet at a time on a given queue. +On top of that, one can easily build an rte_eth_tx_burst function that loops invoking the rte_eth_tx_one function to transmit several packets at a time. +However, an rte_eth_tx_burst function is effectively implemented by the PMD to minimize the driver-level transmit cost per packet through the following optimizations: + +* Share among multiple packets the un-amortized cost of invoking the rte_eth_tx_one function. + +* Enable the rte_eth_tx_burst function to take advantage of burst-oriented hardware features (prefetch data in cache, use of NIC head/tail registers) + to minimize the number of CPU cycles per packet, for example by avoiding unnecessary read memory accesses to ring transmit descriptors, + or by systematically using arrays of pointers that exactly fit cache line boundaries and sizes. + +* Apply burst-oriented software optimization techniques to remove operations that would otherwise be unavoidable, such as ring index wrap back management. + +Burst-oriented functions are also introduced via the API for services that are intensively used by the PMD. +This applies in particular to buffer allocators used to populate NIC rings, which provide functions to allocate/free several buffers at a time. +For example, an mbuf_multiple_alloc function returning an array of pointers to rte_mbuf buffers which speeds up the receive poll function of the PMD when +replenishing multiple descriptors of the receive ring. + +Logical Cores, Memory and NIC Queues Relationships +-------------------------------------------------- + +The DPDK supports NUMA allowing for better performance when a processor's logical cores and interfaces utilize its local memory. +Therefore, mbuf allocation associated with local PCIe* interfaces should be allocated from memory pools created in the local memory. +The buffers should, if possible, remain on the local processor to obtain the best performance results and RX and TX buffer descriptors +should be populated with mbufs allocated from a mempool allocated from local memory. + +The run-to-completion model also performs better if packet or data manipulation is in local memory instead of a remote processors memory. +This is also true for the pipe-line model provided all logical cores used are located on the same processor. + +Multiple logical cores should never share receive or transmit queues for interfaces since this would require global locks and hinder performance. + +If the PMD is ``DEV_TX_OFFLOAD_MT_LOCKFREE`` capable, multiple threads can invoke ``rte_eth_tx_burst()`` +concurrently on the same tx queue without SW lock. This PMD feature found in some NICs and useful in the following use cases: + +* Remove explicit spinlock in some applications where lcores are not mapped to Tx queues with 1:1 relation. + +* In the eventdev use case, avoid dedicating a separate TX core for transmitting and thus + enables more scaling as all workers can send the packets. + +See `Hardware Offload`_ for ``DEV_TX_OFFLOAD_MT_LOCKFREE`` capability probing details. + +Device Identification, Ownership and Configuration +-------------------------------------------------- + +Device Identification +~~~~~~~~~~~~~~~~~~~~~ + +Each NIC port is uniquely designated by its (bus/bridge, device, function) PCI +identifiers assigned by the PCI probing/enumeration function executed at DPDK initialization. +Based on their PCI identifier, NIC ports are assigned two other identifiers: + +* A port index used to designate the NIC port in all functions exported by the PMD API. + +* A port name used to designate the port in console messages, for administration or debugging purposes. + For ease of use, the port name includes the port index. + +Port Ownership +~~~~~~~~~~~~~~ +The Ethernet devices ports can be owned by a single DPDK entity (application, library, PMD, process, etc). +The ownership mechanism is controlled by ethdev APIs and allows to set/remove/get a port owner by DPDK entities. +Allowing this should prevent any multiple management of Ethernet port by different entities. + +.. note:: + + It is the DPDK entity responsibility to set the port owner before using it and to manage the port usage synchronization between different threads or processes. + +Device Configuration +~~~~~~~~~~~~~~~~~~~~ + +The configuration of each NIC port includes the following operations: + +* Allocate PCI resources + +* Reset the hardware (issue a Global Reset) to a well-known default state + +* Set up the PHY and the link + +* Initialize statistics counters + +The PMD API must also export functions to start/stop the all-multicast feature of a port and functions to set/unset the port in promiscuous mode. + +Some hardware offload features must be individually configured at port initialization through specific configuration parameters. +This is the case for the Receive Side Scaling (RSS) and Data Center Bridging (DCB) features for example. + +On-the-Fly Configuration +~~~~~~~~~~~~~~~~~~~~~~~~ + +All device features that can be started or stopped "on the fly" (that is, without stopping the device) do not require the PMD API to export dedicated functions for this purpose. + +All that is required is the mapping address of the device PCI registers to implement the configuration of these features in specific functions outside of the drivers. + +For this purpose, +the PMD API exports a function that provides all the information associated with a device that can be used to set up a given device feature outside of the driver. +This includes the PCI vendor identifier, the PCI device identifier, the mapping address of the PCI device registers, and the name of the driver. + +The main advantage of this approach is that it gives complete freedom on the choice of the API used to configure, to start, and to stop such features. + +As an example, refer to the configuration of the IEEE1588 feature for the Intel® 82576 Gigabit Ethernet Controller and +the Intel® 82599 10 Gigabit Ethernet Controller controllers in the testpmd application. + +Other features such as the L3/L4 5-Tuple packet filtering feature of a port can be configured in the same way. +Ethernet* flow control (pause frame) can be configured on the individual port. +Refer to the testpmd source code for details. +Also, L4 (UDP/TCP/ SCTP) checksum offload by the NIC can be enabled for an individual packet as long as the packet mbuf is set up correctly. See `Hardware Offload`_ for details. + +Configuration of Transmit Queues +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Each transmit queue is independently configured with the following information: + +* The number of descriptors of the transmit ring + +* The socket identifier used to identify the appropriate DMA memory zone from which to allocate the transmit ring in NUMA architectures + +* The values of the Prefetch, Host and Write-Back threshold registers of the transmit queue + +* The *minimum* transmit packets to free threshold (tx_free_thresh). + When the number of descriptors used to transmit packets exceeds this threshold, the network adaptor should be checked to see if it has written back descriptors. + A value of 0 can be passed during the TX queue configuration to indicate the default value should be used. + The default value for tx_free_thresh is 32. + This ensures that the PMD does not search for completed descriptors until at least 32 have been processed by the NIC for this queue. + +* The *minimum* RS bit threshold. The minimum number of transmit descriptors to use before setting the Report Status (RS) bit in the transmit descriptor. + Note that this parameter may only be valid for Intel 10 GbE network adapters. + The RS bit is set on the last descriptor used to transmit a packet if the number of descriptors used since the last RS bit setting, + up to the first descriptor used to transmit the packet, exceeds the transmit RS bit threshold (tx_rs_thresh). + In short, this parameter controls which transmit descriptors are written back to host memory by the network adapter. + A value of 0 can be passed during the TX queue configuration to indicate that the default value should be used. + The default value for tx_rs_thresh is 32. + This ensures that at least 32 descriptors are used before the network adapter writes back the most recently used descriptor. + This saves upstream PCIe* bandwidth resulting from TX descriptor write-backs. + It is important to note that the TX Write-back threshold (TX wthresh) should be set to 0 when tx_rs_thresh is greater than 1. + Refer to the Intel® 82599 10 Gigabit Ethernet Controller Datasheet for more details. + +The following constraints must be satisfied for tx_free_thresh and tx_rs_thresh: + +* tx_rs_thresh must be greater than 0. + +* tx_rs_thresh must be less than the size of the ring minus 2. + +* tx_rs_thresh must be less than or equal to tx_free_thresh. + +* tx_free_thresh must be greater than 0. + +* tx_free_thresh must be less than the size of the ring minus 3. + +* For optimal performance, TX wthresh should be set to 0 when tx_rs_thresh is greater than 1. + +One descriptor in the TX ring is used as a sentinel to avoid a hardware race condition, hence the maximum threshold constraints. + +.. note:: + + When configuring for DCB operation, at port initialization, both the number of transmit queues and the number of receive queues must be set to 128. + +Free Tx mbuf on Demand +~~~~~~~~~~~~~~~~~~~~~~ + +Many of the drivers do not release the mbuf back to the mempool, or local cache, +immediately after the packet has been transmitted. +Instead, they leave the mbuf in their Tx ring and +either perform a bulk release when the ``tx_rs_thresh`` has been crossed +or free the mbuf when a slot in the Tx ring is needed. + +An application can request the driver to release used mbufs with the ``rte_eth_tx_done_cleanup()`` API. +This API requests the driver to release mbufs that are no longer in use, +independent of whether or not the ``tx_rs_thresh`` has been crossed. +There are two scenarios when an application may want the mbuf released immediately: + +* When a given packet needs to be sent to multiple destination interfaces + (either for Layer 2 flooding or Layer 3 multi-cast). + One option is to make a copy of the packet or a copy of the header portion that needs to be manipulated. + A second option is to transmit the packet and then poll the ``rte_eth_tx_done_cleanup()`` API + until the reference count on the packet is decremented. + Then the same packet can be transmitted to the next destination interface. + The application is still responsible for managing any packet manipulations needed + between the different destination interfaces, but a packet copy can be avoided. + This API is independent of whether the packet was transmitted or dropped, + only that the mbuf is no longer in use by the interface. + +* Some applications are designed to make multiple runs, like a packet generator. + For performance reasons and consistency between runs, + the application may want to reset back to an initial state + between each run, where all mbufs are returned to the mempool. + In this case, it can call the ``rte_eth_tx_done_cleanup()`` API + for each destination interface it has been using + to request it to release of all its used mbufs. + +To determine if a driver supports this API, check for the *Free Tx mbuf on demand* feature +in the *Network Interface Controller Drivers* document. + +Hardware Offload +~~~~~~~~~~~~~~~~ + +Depending on driver capabilities advertised by +``rte_eth_dev_info_get()``, the PMD may support hardware offloading +feature like checksumming, TCP segmentation, VLAN insertion or +lockfree multithreaded TX burst on the same TX queue. + +The support of these offload features implies the addition of dedicated +status bit(s) and value field(s) into the rte_mbuf data structure, along +with their appropriate handling by the receive/transmit functions +exported by each PMD. The list of flags and their precise meaning is +described in the mbuf API documentation and in the in :ref:`Mbuf Library +<Mbuf_Library>`, section "Meta Information". + +Per-Port and Per-Queue Offloads +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the DPDK offload API, offloads are divided into per-port and per-queue offloads as follows: + +* A per-queue offloading can be enabled on a queue and disabled on another queue at the same time. +* A pure per-port offload is the one supported by device but not per-queue type. +* A pure per-port offloading can't be enabled on a queue and disabled on another queue at the same time. +* A pure per-port offloading must be enabled or disabled on all queues at the same time. +* Any offloading is per-queue or pure per-port type, but can't be both types at same devices. +* Port capabilities = per-queue capabilities + pure per-port capabilities. +* Any supported offloading can be enabled on all queues. + +The different offloads capabilities can be queried using ``rte_eth_dev_info_get()``. +The ``dev_info->[rt]x_queue_offload_capa`` returned from ``rte_eth_dev_info_get()`` includes all per-queue offloading capabilities. +The ``dev_info->[rt]x_offload_capa`` returned from ``rte_eth_dev_info_get()`` includes all pure per-port and per-queue offloading capabilities. +Supported offloads can be either per-port or per-queue. + +Offloads are enabled using the existing ``DEV_TX_OFFLOAD_*`` or ``DEV_RX_OFFLOAD_*`` flags. +Any requested offloading by an application must be within the device capabilities. +Any offloading is disabled by default if it is not set in the parameter +``dev_conf->[rt]xmode.offloads`` to ``rte_eth_dev_configure()`` and +``[rt]x_conf->offloads`` to ``rte_eth_[rt]x_queue_setup()``. + +If any offloading is enabled in ``rte_eth_dev_configure()`` by an application, +it is enabled on all queues no matter whether it is per-queue or +per-port type and no matter whether it is set or cleared in +``[rt]x_conf->offloads`` to ``rte_eth_[rt]x_queue_setup()``. + +If a per-queue offloading hasn't been enabled in ``rte_eth_dev_configure()``, +it can be enabled or disabled in ``rte_eth_[rt]x_queue_setup()`` for individual queue. +A newly added offloads in ``[rt]x_conf->offloads`` to ``rte_eth_[rt]x_queue_setup()`` input by application +is the one which hasn't been enabled in ``rte_eth_dev_configure()`` and is requested to be enabled +in ``rte_eth_[rt]x_queue_setup()``. It must be per-queue type, otherwise trigger an error log. + +Poll Mode Driver API +-------------------- + +Generalities +~~~~~~~~~~~~ + +By default, all functions exported by a PMD are lock-free functions that are assumed +not to be invoked in parallel on different logical cores to work on the same target object. +For instance, a PMD receive function cannot be invoked in parallel on two logical cores to poll the same RX queue of the same port. +Of course, this function can be invoked in parallel by different logical cores on different RX queues. +It is the responsibility of the upper-level application to enforce this rule. + +If needed, parallel accesses by multiple logical cores to shared queues can be explicitly protected by dedicated inline lock-aware functions +built on top of their corresponding lock-free functions of the PMD API. + +Generic Packet Representation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A packet is represented by an rte_mbuf structure, which is a generic metadata structure containing all necessary housekeeping information. +This includes fields and status bits corresponding to offload hardware features, such as checksum computation of IP headers or VLAN tags. + +The rte_mbuf data structure includes specific fields to represent, in a generic way, the offload features provided by network controllers. +For an input packet, most fields of the rte_mbuf structure are filled in by the PMD receive function with the information contained in the receive descriptor. +Conversely, for output packets, most fields of rte_mbuf structures are used by the PMD transmit function to initialize transmit descriptors. + +The mbuf structure is fully described in the :ref:`Mbuf Library <Mbuf_Library>` chapter. + +Ethernet Device API +~~~~~~~~~~~~~~~~~~~ + +The Ethernet device API exported by the Ethernet PMDs is described in the *DPDK API Reference*. + +.. _ethernet_device_standard_device_arguments: + +Ethernet Device Standard Device Arguments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Standard Ethernet device arguments allow for a set of commonly used arguments/ +parameters which are applicable to all Ethernet devices to be available to for +specification of specific device and for passing common configuration +parameters to those ports. + +* ``representor`` for a device which supports the creation of representor ports + this argument allows user to specify which switch ports to enable port + representors for.:: + + -w DBDF,representor=0 + -w DBDF,representor=[0,4,6,9] + -w DBDF,representor=[0-31] + +Note: PMDs are not required to support the standard device arguments and users +should consult the relevant PMD documentation to see support devargs. + +Extended Statistics API +~~~~~~~~~~~~~~~~~~~~~~~ + +The extended statistics API allows a PMD to expose all statistics that are +available to it, including statistics that are unique to the device. +Each statistic has three properties ``name``, ``id`` and ``value``: + +* ``name``: A human readable string formatted by the scheme detailed below. +* ``id``: An integer that represents only that statistic. +* ``value``: A unsigned 64-bit integer that is the value of the statistic. + +Note that extended statistic identifiers are +driver-specific, and hence might not be the same for different ports. +The API consists of various ``rte_eth_xstats_*()`` functions, and allows an +application to be flexible in how it retrieves statistics. + +Scheme for Human Readable Names +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A naming scheme exists for the strings exposed to clients of the API. This is +to allow scraping of the API for statistics of interest. The naming scheme uses +strings split by a single underscore ``_``. The scheme is as follows: + +* direction +* detail 1 +* detail 2 +* detail n +* unit + +Examples of common statistics xstats strings, formatted to comply to the scheme +proposed above: + +* ``rx_bytes`` +* ``rx_crc_errors`` +* ``tx_multicast_packets`` + +The scheme, although quite simple, allows flexibility in presenting and reading +information from the statistic strings. The following example illustrates the +naming scheme:``rx_packets``. In this example, the string is split into two +components. The first component ``rx`` indicates that the statistic is +associated with the receive side of the NIC. The second component ``packets`` +indicates that the unit of measure is packets. + +A more complicated example: ``tx_size_128_to_255_packets``. In this example, +``tx`` indicates transmission, ``size`` is the first detail, ``128`` etc are +more details, and ``packets`` indicates that this is a packet counter. + +Some additions in the metadata scheme are as follows: + +* If the first part does not match ``rx`` or ``tx``, the statistic does not + have an affinity with either receive of transmit. + +* If the first letter of the second part is ``q`` and this ``q`` is followed + by a number, this statistic is part of a specific queue. + +An example where queue numbers are used is as follows: ``tx_q7_bytes`` which +indicates this statistic applies to queue number 7, and represents the number +of transmitted bytes on that queue. + +API Design +^^^^^^^^^^ + +The xstats API uses the ``name``, ``id``, and ``value`` to allow performant +lookup of specific statistics. Performant lookup means two things; + +* No string comparisons with the ``name`` of the statistic in fast-path +* Allow requesting of only the statistics of interest + +The API ensures these requirements are met by mapping the ``name`` of the +statistic to a unique ``id``, which is used as a key for lookup in the fast-path. +The API allows applications to request an array of ``id`` values, so that the +PMD only performs the required calculations. Expected usage is that the +application scans the ``name`` of each statistic, and caches the ``id`` +if it has an interest in that statistic. On the fast-path, the integer can be used +to retrieve the actual ``value`` of the statistic that the ``id`` represents. + +API Functions +^^^^^^^^^^^^^ + +The API is built out of a small number of functions, which can be used to +retrieve the number of statistics and the names, IDs and values of those +statistics. + +* ``rte_eth_xstats_get_names_by_id()``: returns the names of the statistics. When given a + ``NULL`` parameter the function returns the number of statistics that are available. + +* ``rte_eth_xstats_get_id_by_name()``: Searches for the statistic ID that matches + ``xstat_name``. If found, the ``id`` integer is set. + +* ``rte_eth_xstats_get_by_id()``: Fills in an array of ``uint64_t`` values + with matching the provided ``ids`` array. If the ``ids`` array is NULL, it + returns all statistics that are available. + + +Application Usage +^^^^^^^^^^^^^^^^^ + +Imagine an application that wants to view the dropped packet count. If no +packets are dropped, the application does not read any other metrics for +performance reasons. If packets are dropped, the application has a particular +set of statistics that it requests. This "set" of statistics allows the app to +decide what next steps to perform. The following code-snippets show how the +xstats API can be used to achieve this goal. + +First step is to get all statistics names and list them: + +.. code-block:: c + + struct rte_eth_xstat_name *xstats_names; + uint64_t *values; + int len, i; + + /* Get number of stats */ + len = rte_eth_xstats_get_names_by_id(port_id, NULL, NULL, 0); + if (len < 0) { + printf("Cannot get xstats count\n"); + goto err; + } + + xstats_names = malloc(sizeof(struct rte_eth_xstat_name) * len); + if (xstats_names == NULL) { + printf("Cannot allocate memory for xstat names\n"); + goto err; + } + + /* Retrieve xstats names, passing NULL for IDs to return all statistics */ + if (len != rte_eth_xstats_get_names_by_id(port_id, xstats_names, NULL, len)) { + printf("Cannot get xstat names\n"); + goto err; + } + + values = malloc(sizeof(values) * len); + if (values == NULL) { + printf("Cannot allocate memory for xstats\n"); + goto err; + } + + /* Getting xstats values */ + if (len != rte_eth_xstats_get_by_id(port_id, NULL, values, len)) { + printf("Cannot get xstat values\n"); + goto err; + } + + /* Print all xstats names and values */ + for (i = 0; i < len; i++) { + printf("%s: %"PRIu64"\n", xstats_names[i].name, values[i]); + } + +The application has access to the names of all of the statistics that the PMD +exposes. The application can decide which statistics are of interest, cache the +ids of those statistics by looking up the name as follows: + +.. code-block:: c + + uint64_t id; + uint64_t value; + const char *xstat_name = "rx_errors"; + + if(!rte_eth_xstats_get_id_by_name(port_id, xstat_name, &id)) { + rte_eth_xstats_get_by_id(port_id, &id, &value, 1); + printf("%s: %"PRIu64"\n", xstat_name, value); + } + else { + printf("Cannot find xstats with a given name\n"); + goto err; + } + +The API provides flexibility to the application so that it can look up multiple +statistics using an array containing multiple ``id`` numbers. This reduces the +function call overhead of retrieving statistics, and makes lookup of multiple +statistics simpler for the application. + +.. code-block:: c + + #define APP_NUM_STATS 4 + /* application cached these ids previously; see above */ + uint64_t ids_array[APP_NUM_STATS] = {3,4,7,21}; + uint64_t value_array[APP_NUM_STATS]; + + /* Getting multiple xstats values from array of IDs */ + rte_eth_xstats_get_by_id(port_id, ids_array, value_array, APP_NUM_STATS); + + uint32_t i; + for(i = 0; i < APP_NUM_STATS; i++) { + printf("%d: %"PRIu64"\n", ids_array[i], value_array[i]); + } + + +This array lookup API for xstats allows the application create multiple +"groups" of statistics, and look up the values of those IDs using a single API +call. As an end result, the application is able to achieve its goal of +monitoring a single statistic ("rx_errors" in this case), and if that shows +packets being dropped, it can easily retrieve a "set" of statistics using the +IDs array parameter to ``rte_eth_xstats_get_by_id`` function. + +NIC Reset API +~~~~~~~~~~~~~ + +.. code-block:: c + + int rte_eth_dev_reset(uint16_t port_id); + +Sometimes a port has to be reset passively. For example when a PF is +reset, all its VFs should also be reset by the application to make them +consistent with the PF. A DPDK application also can call this function +to trigger a port reset. Normally, a DPDK application would invokes this +function when an RTE_ETH_EVENT_INTR_RESET event is detected. + +It is the duty of the PMD to trigger RTE_ETH_EVENT_INTR_RESET events and +the application should register a callback function to handle these +events. When a PMD needs to trigger a reset, it can trigger an +RTE_ETH_EVENT_INTR_RESET event. On receiving an RTE_ETH_EVENT_INTR_RESET +event, applications can handle it as follows: Stop working queues, stop +calling Rx and Tx functions, and then call rte_eth_dev_reset(). For +thread safety all these operations should be called from the same thread. + +For example when PF is reset, the PF sends a message to notify VFs of +this event and also trigger an interrupt to VFs. Then in the interrupt +service routine the VFs detects this notification message and calls +_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RESET, NULL). +This means that a PF reset triggers an RTE_ETH_EVENT_INTR_RESET +event within VFs. The function _rte_eth_dev_callback_process() will +call the registered callback function. The callback function can trigger +the application to handle all operations the VF reset requires including +stopping Rx/Tx queues and calling rte_eth_dev_reset(). + +The rte_eth_dev_reset() itself is a generic function which only does +some hardware reset operations through calling dev_unint() and +dev_init(), and itself does not handle synchronization, which is handled +by application. + +The PMD itself should not call rte_eth_dev_reset(). The PMD can trigger +the application to handle reset event. It is duty of application to +handle all synchronization before it calls rte_eth_dev_reset(). diff --git a/src/spdk/dpdk/doc/guides/prog_guide/power_man.rst b/src/spdk/dpdk/doc/guides/prog_guide/power_man.rst new file mode 100644 index 000000000..0a3755a90 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/power_man.rst @@ -0,0 +1,202 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +Power Management +================ + +The DPDK Power Management feature allows users space applications to save power +by dynamically adjusting CPU frequency or entering into different C-States. + +* Adjusting the CPU frequency dynamically according to the utilization of RX queue. + +* Entering into different deeper C-States according to the adaptive algorithms to speculate + brief periods of time suspending the application if no packets are received. + +The interfaces for adjusting the operating CPU frequency are in the power management library. +C-State control is implemented in applications according to the different use cases. + +CPU Frequency Scaling +--------------------- + +The Linux kernel provides a cpufreq module for CPU frequency scaling for each lcore. +For example, for cpuX, /sys/devices/system/cpu/cpuX/cpufreq/ has the following sys files for frequency scaling: + +* affected_cpus + +* bios_limit + +* cpuinfo_cur_freq + +* cpuinfo_max_freq + +* cpuinfo_min_freq + +* cpuinfo_transition_latency + +* related_cpus + +* scaling_available_frequencies + +* scaling_available_governors + +* scaling_cur_freq + +* scaling_driver + +* scaling_governor + +* scaling_max_freq + +* scaling_min_freq + +* scaling_setspeed + +In the DPDK, scaling_governor is configured in user space. +Then, a user space application can prompt the kernel by writing scaling_setspeed to adjust the CPU frequency +according to the strategies defined by the user space application. + +Core-load Throttling through C-States +------------------------------------- + +Core state can be altered by speculative sleeps whenever the specified lcore has nothing to do. +In the DPDK, if no packet is received after polling, +speculative sleeps can be triggered according the strategies defined by the user space application. + +Per-core Turbo Boost +-------------------- + +Individual cores can be allowed to enter a Turbo Boost state on a per-core +basis. This is achieved by enabling Turbo Boost Technology in the BIOS, then +looping through the relevant cores and enabling/disabling Turbo Boost on each +core. + +Use of Power Library in a Hyper-Threaded Environment +---------------------------------------------------- + +In the case where the power library is in use on a system with Hyper-Threading enabled, +the frequency on the physical core is set to the highest frequency of the Hyper-Thread siblings. +So even though an application may request a scale down, the core frequency will +remain at the highest frequency until all Hyper-Threads on that core request a scale down. + +API Overview of the Power Library +--------------------------------- + +The main methods exported by power library are for CPU frequency scaling and include the following: + +* **Freq up**: Prompt the kernel to scale up the frequency of the specific lcore. + +* **Freq down**: Prompt the kernel to scale down the frequency of the specific lcore. + +* **Freq max**: Prompt the kernel to scale up the frequency of the specific lcore to the maximum. + +* **Freq min**: Prompt the kernel to scale down the frequency of the specific lcore to the minimum. + +* **Get available freqs**: Read the available frequencies of the specific lcore from the sys file. + +* **Freq get**: Get the current frequency of the specific lcore. + +* **Freq set**: Prompt the kernel to set the frequency for the specific lcore. + +* **Enable turbo**: Prompt the kernel to enable Turbo Boost for the specific lcore. + +* **Disable turbo**: Prompt the kernel to disable Turbo Boost for the specific lcore. + +User Cases +---------- + +The power management mechanism is used to save power when performing L3 forwarding. + + +Empty Poll API +-------------- + +Abstract +~~~~~~~~ + +For packet processing workloads such as DPDK polling is continuous. +This means CPU cores always show 100% busy independent of how much work +those cores are doing. It is critical to accurately determine how busy +a core is hugely important for the following reasons: + + * No indication of overload conditions + * User does not know how much real load is on a system, resulting + in wasted energy as no power management is utilized + +Compared to the original l3fwd-power design, instead of going to sleep +after detecting an empty poll, the new mechanism just lowers the core frequency. +As a result, the application does not stop polling the device, which leads +to improved handling of bursts of traffic. + +When the system become busy, the empty poll mechanism can also increase the core +frequency (including turbo) to do best effort for intensive traffic. This gives +us more flexible and balanced traffic awareness over the standard l3fwd-power +application. + + +Proposed Solution +~~~~~~~~~~~~~~~~~ +The proposed solution focuses on how many times empty polls are executed. +The less the number of empty polls, means current core is busy with processing +workload, therefore, the higher frequency is needed. The high empty poll number +indicates the current core not doing any real work therefore, we can lower the +frequency to safe power. + +In the current implementation, each core has 1 empty-poll counter which assume +1 core is dedicated to 1 queue. This will need to be expanded in the future to +support multiple queues per core. + +Power state definition: +^^^^^^^^^^^^^^^^^^^^^^^ + +* LOW: Not currently used, reserved for future use. + +* MED: the frequency is used to process modest traffic workload. + +* HIGH: the frequency is used to process busy traffic workload. + +There are two phases to establish the power management system: +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* Training phase. This phase is used to measure the optimal frequency + change thresholds for a given system. The thresholds will differ from + system to system due to differences in processor micro-architecture, + cache and device configurations. + In this phase, the user must ensure that no traffic can enter the + system so that counts can be measured for empty polls at low, medium + and high frequencies. Each frequency is measured for two seconds. + Once the training phase is complete, the threshold numbers are + displayed, and normal mode resumes, and traffic can be allowed into + the system. These threshold number can be used on the command line + when starting the application in normal mode to avoid re-training + every time. + +* Normal phase. Every 10ms the run-time counters are compared + to the supplied threshold values, and the decision will be made + whether to move to a different power state (by adjusting the + frequency). + +API Overview for Empty Poll Power Management +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* **State Init**: initialize the power management system. + +* **State Free**: free the resource hold by power management system. + +* **Update Empty Poll Counter**: update the empty poll counter. + +* **Update Valid Poll Counter**: update the valid poll counter. + +* **Set the Frequency Index**: update the power state/frequency mapping. + +* **Detect empty poll state change**: empty poll state change detection algorithm then take action. + +User Cases +---------- +The mechanism can applied to any device which is based on polling. e.g. NIC, FPGA. + +References +---------- + +* The :doc:`../sample_app_ug/l3_forward_power_man` + chapter in the :doc:`../sample_app_ug/index` section. + +* The :doc:`../sample_app_ug/vm_power_management` + chapter in the :doc:`../sample_app_ug/index` section. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/profile_app.rst b/src/spdk/dpdk/doc/guides/prog_guide/profile_app.rst new file mode 100644 index 000000000..e5d0e9079 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/profile_app.rst @@ -0,0 +1,101 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +Profile Your Application +======================== + +The following sections describe methods of profiling DPDK applications on +different architectures. + + +Profiling on x86 +---------------- + +Intel processors provide performance counters to monitor events. +Some tools provided by Intel, such as Intel® VTune™ Amplifier, can be used +to profile and benchmark an application. +See the *VTune Performance Analyzer Essentials* publication from Intel Press for more information. + +For a DPDK application, this can be done in a Linux* application environment only. + +The main situations that should be monitored through event counters are: + +* Cache misses + +* Branch mis-predicts + +* DTLB misses + +* Long latency instructions and exceptions + +Refer to the +`Intel Performance Analysis Guide <http://software.intel.com/sites/products/collateral/hpc/vtune/performance_analysis_guide.pdf>`_ +for details about application profiling. + + +Profiling with VTune +~~~~~~~~~~~~~~~~~~~~ + +To allow VTune attaching to the DPDK application, reconfigure and recompile +the DPDK with ``CONFIG_RTE_ETHDEV_RXTX_CALLBACKS`` and +``CONFIG_RTE_ETHDEV_PROFILE_WITH_VTUNE`` enabled. + + +Profiling on ARM64 +------------------ + +Using Linux perf +~~~~~~~~~~~~~~~~ + +The ARM64 architecture provide performance counters to monitor events. The +Linux ``perf`` tool can be used to profile and benchmark an application. In +addition to the standard events, ``perf`` can be used to profile arm64 +specific PMU (Performance Monitor Unit) events through raw events (``-e`` +``-rXX``). + +For more derails refer to the +`ARM64 specific PMU events enumeration <http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.100095_0002_04_en/way1382543438508.html>`_. + + +Low-resolution generic counter +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The default ``cntvct_el0`` based ``rte_rdtsc()`` provides a portable means to +get a wall clock counter in user space. Typically it runs at a lower clock frequency than the CPU clock frequency. +Cycles counted using this method should be scaled to CPU clock frequency. + + +High-resolution cycle counter +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The alternative method to enable ``rte_rdtsc()`` for a high resolution wall +clock counter is through the ARMv8 PMU subsystem. The PMU cycle counter runs +at CPU frequency. However, access to the PMU cycle counter from user space is +not enabled by default in the arm64 linux kernel. It is possible to enable +cycle counter for user space access by configuring the PMU from the privileged +mode (kernel space). + +By default the ``rte_rdtsc()`` implementation uses a portable ``cntvct_el0`` +scheme. Application can choose the PMU based implementation with +``CONFIG_RTE_ARM_EAL_RDTSC_USE_PMU``. + +The example below shows the steps to configure the PMU based cycle counter on +an ARMv8 machine. + +.. code-block:: console + + git clone https://github.com/jerinjacobk/armv8_pmu_cycle_counter_el0 + cd armv8_pmu_cycle_counter_el0 + make + sudo insmod pmu_el0_cycle_counter.ko + cd $DPDK_DIR + make config T=arm64-armv8a-linux-gcc + echo "CONFIG_RTE_ARM_EAL_RDTSC_USE_PMU=y" >> build/.config + make + +.. warning:: + + The PMU based scheme is useful for high accuracy performance profiling with + ``rte_rdtsc()``. However, this method can not be used in conjunction with + Linux userspace profiling tools like ``perf`` as this scheme alters the PMU + registers state. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/qos_framework.rst b/src/spdk/dpdk/doc/guides/prog_guide/qos_framework.rst new file mode 100644 index 000000000..a15970945 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/qos_framework.rst @@ -0,0 +1,1741 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +Quality of Service (QoS) Framework +================================== + +This chapter describes the DPDK Quality of Service (QoS) framework. + +Packet Pipeline with QoS Support +-------------------------------- + +An example of a complex packet processing pipeline with QoS support is shown in the following figure. + +.. _figure_pkt_proc_pipeline_qos: + +.. figure:: img/pkt_proc_pipeline_qos.* + + Complex Packet Processing Pipeline with QoS Support + + +This pipeline can be built using reusable DPDK software libraries. +The main blocks implementing QoS in this pipeline are: the policer, the dropper and the scheduler. +A functional description of each block is provided in the following table. + +.. _table_qos_1: + +.. table:: Packet Processing Pipeline Implementing QoS + + +---+------------------------+--------------------------------------------------------------------------------+ + | # | Block | Functional Description | + | | | | + +===+========================+================================================================================+ + | 1 | Packet I/O RX & TX | Packet reception/ transmission from/to multiple NIC ports. Poll mode drivers | + | | | (PMDs) for Intel 1 GbE/10 GbE NICs. | + | | | | + +---+------------------------+--------------------------------------------------------------------------------+ + | 2 | Packet parser | Identify the protocol stack of the input packet. Check the integrity of the | + | | | packet headers. | + | | | | + +---+------------------------+--------------------------------------------------------------------------------+ + | 3 | Flow classification | Map the input packet to one of the known traffic flows. Exact match table | + | | | lookup using configurable hash function (jhash, CRC and so on) and bucket | + | | | logic to handle collisions. | + | | | | + +---+------------------------+--------------------------------------------------------------------------------+ + | 4 | Policer | Packet metering using srTCM (RFC 2697) or trTCM (RFC2698) algorithms. | + | | | | + +---+------------------------+--------------------------------------------------------------------------------+ + | 5 | Load Balancer | Distribute the input packets to the application workers. Provide uniform load | + | | | to each worker. Preserve the affinity of traffic flows to workers and the | + | | | packet order within each flow. | + | | | | + +---+------------------------+--------------------------------------------------------------------------------+ + | 6 | Worker threads | Placeholders for the customer specific application workload (for example, IP | + | | | stack and so on). | + | | | | + +---+------------------------+--------------------------------------------------------------------------------+ + | 7 | Dropper | Congestion management using the Random Early Detection (RED) algorithm | + | | | (specified by the Sally Floyd - Van Jacobson paper) or Weighted RED (WRED). | + | | | Drop packets based on the current scheduler queue load level and packet | + | | | priority. When congestion is experienced, lower priority packets are dropped | + | | | first. | + | | | | + +---+------------------------+--------------------------------------------------------------------------------+ + | 8 | Hierarchical Scheduler | 5-level hierarchical scheduler (levels are: output port, subport, pipe, | + | | | traffic class and queue) with thousands (typically 64K) leaf nodes (queues). | + | | | Implements traffic shaping (for subport and pipe levels), strict priority | + | | | (for traffic class level) and Weighted Round Robin (WRR) (for queues within | + | | | each pipe traffic class). | + | | | | + +---+------------------------+--------------------------------------------------------------------------------+ + +The infrastructure blocks used throughout the packet processing pipeline are listed in the following table. + +.. _table_qos_2: + +.. table:: Infrastructure Blocks Used by the Packet Processing Pipeline + + +---+-----------------------+-----------------------------------------------------------------------+ + | # | Block | Functional Description | + | | | | + +===+=======================+=======================================================================+ + | 1 | Buffer manager | Support for global buffer pools and private per-thread buffer caches. | + | | | | + +---+-----------------------+-----------------------------------------------------------------------+ + | 2 | Queue manager | Support for message passing between pipeline blocks. | + | | | | + +---+-----------------------+-----------------------------------------------------------------------+ + | 3 | Power saving | Support for power saving during low activity periods. | + | | | | + +---+-----------------------+-----------------------------------------------------------------------+ + +The mapping of pipeline blocks to CPU cores is configurable based on the performance level required by each specific application +and the set of features enabled for each block. +Some blocks might consume more than one CPU core (with each CPU core running a different instance of the same block on different input packets), +while several other blocks could be mapped to the same CPU core. + +Hierarchical Scheduler +---------------------- + +The hierarchical scheduler block, when present, usually sits on the TX side just before the transmission stage. +Its purpose is to prioritize the transmission of packets from different users and different traffic classes +according to the policy specified by the Service Level Agreements (SLAs) of each network node. + +Overview +~~~~~~~~ + +The hierarchical scheduler block is similar to the traffic manager block used by network processors +that typically implement per flow (or per group of flows) packet queuing and scheduling. +It typically acts like a buffer that is able to temporarily store a large number of packets just before their transmission (enqueue operation); +as the NIC TX is requesting more packets for transmission, +these packets are later on removed and handed over to the NIC TX with the packet selection logic observing the predefined SLAs (dequeue operation). + +.. _figure_hier_sched_blk: + +.. figure:: img/hier_sched_blk.* + + Hierarchical Scheduler Block Internal Diagram + + +The hierarchical scheduler is optimized for a large number of packet queues. +When only a small number of queues are needed, message passing queues should be used instead of this block. +See `Worst Case Scenarios for Performance`_ for a more detailed discussion. + +Scheduling Hierarchy +~~~~~~~~~~~~~~~~~~~~ + +The scheduling hierarchy is shown in :numref:`figure_sched_hier_per_port`. +The first level of the hierarchy is the Ethernet TX port 1/10/40 GbE, +with subsequent hierarchy levels defined as subport, pipe, traffic class and queue. + +Typically, each subport represents a predefined group of users, while each pipe represents an individual user/subscriber. +Each traffic class is the representation of a different traffic type with specific loss rate, +delay and jitter requirements, such as voice, video or data transfers. +Each queue hosts packets from one or multiple connections of the same type belonging to the same user. + +.. _figure_sched_hier_per_port: + +.. figure:: img/sched_hier_per_port.* + + Scheduling Hierarchy per Port + + +The functionality of each hierarchical level is detailed in the following table. + +.. _table_qos_3: + +.. table:: Port Scheduling Hierarchy + + +---+--------------------+----------------------------+---------------------------------------------------------------+ + | # | Level | Siblings per Parent | Functional Description | + | | | | | + +===+====================+============================+===============================================================+ + | 1 | Port | - | #. Output Ethernet port 1/10/40 GbE. | + | | | | | + | | | | #. Multiple ports are scheduled in round robin order with | + | | | | all ports having equal priority. | + | | | | | + +---+--------------------+----------------------------+---------------------------------------------------------------+ + | 2 | Subport | Configurable (default: 8) | #. Traffic shaping using token bucket algorithm (one token | + | | | | bucket per subport). | + | | | | | + | | | | #. Upper limit enforced per Traffic Class (TC) at the | + | | | | subport level. | + | | | | | + | | | | #. Lower priority TCs able to reuse subport bandwidth | + | | | | currently unused by higher priority TCs. | + | | | | | + +---+--------------------+----------------------------+---------------------------------------------------------------+ + | 3 | Pipe | Configurable (default: 4K) | #. Traffic shaping using the token bucket algorithm (one | + | | | | token bucket per pipe. | + | | | | | + +---+--------------------+----------------------------+---------------------------------------------------------------+ + | 4 | Traffic Class (TC) | 13 | #. TCs of the same pipe handled in strict priority order. | + | | | | | + | | | | #. Upper limit enforced per TC at the pipe level. | + | | | | | + | | | | #. Lower priority TCs able to reuse pipe bandwidth currently | + | | | | unused by higher priority TCs. | + | | | | | + | | | | #. When subport TC is oversubscribed (configuration time | + | | | | event), pipe TC upper limit is capped to a dynamically | + | | | | adjusted value that is shared by all the subport pipes. | + | | | | | + +---+--------------------+----------------------------+---------------------------------------------------------------+ + | 5 | Queue | High priority TCs: 1, | #. All the high priority TCs (TC0, TC1, ...,TC11) have | + | | | Lowest priority TC: 4 | exactly 1 queue, while the lowest priority TC (TC12), | + | | | | called Best Effort (BE), has 4 queues. | + | | | | | + | | | | #. Queues of the lowest priority TC (BE) are serviced using | + | | | | Weighted Round Robin (WRR) according to predefined weights| + | | | | weights. | + | | | | | + +---+--------------------+----------------------------+---------------------------------------------------------------+ + +Application Programming Interface (API) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Port Scheduler Configuration API +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The rte_sched.h file contains configuration functions for port, subport and pipe. + +Port Scheduler Enqueue API +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The port scheduler enqueue API is very similar to the API of the DPDK PMD TX function. + +.. code-block:: c + + int rte_sched_port_enqueue(struct rte_sched_port *port, struct rte_mbuf **pkts, uint32_t n_pkts); + +Port Scheduler Dequeue API +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The port scheduler dequeue API is very similar to the API of the DPDK PMD RX function. + +.. code-block:: c + + int rte_sched_port_dequeue(struct rte_sched_port *port, struct rte_mbuf **pkts, uint32_t n_pkts); + +Usage Example +^^^^^^^^^^^^^ + +.. code-block:: c + + /* File "application.c" */ + + #define N_PKTS_RX 64 + #define N_PKTS_TX 48 + #define NIC_RX_PORT 0 + #define NIC_RX_QUEUE 0 + #define NIC_TX_PORT 1 + #define NIC_TX_QUEUE 0 + + struct rte_sched_port *port = NULL; + struct rte_mbuf *pkts_rx[N_PKTS_RX], *pkts_tx[N_PKTS_TX]; + uint32_t n_pkts_rx, n_pkts_tx; + + /* Initialization */ + + <initialization code> + + /* Runtime */ + while (1) { + /* Read packets from NIC RX queue */ + + n_pkts_rx = rte_eth_rx_burst(NIC_RX_PORT, NIC_RX_QUEUE, pkts_rx, N_PKTS_RX); + + /* Hierarchical scheduler enqueue */ + + rte_sched_port_enqueue(port, pkts_rx, n_pkts_rx); + + /* Hierarchical scheduler dequeue */ + + n_pkts_tx = rte_sched_port_dequeue(port, pkts_tx, N_PKTS_TX); + + /* Write packets to NIC TX queue */ + + rte_eth_tx_burst(NIC_TX_PORT, NIC_TX_QUEUE, pkts_tx, n_pkts_tx); + } + +Implementation +~~~~~~~~~~~~~~ + +Internal Data Structures per Port +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A schematic of the internal data structures in shown in with details in. + +.. _figure_data_struct_per_port: + +.. figure:: img/data_struct_per_port.* + + Internal Data Structures per Port + + +.. _table_qos_4: + +.. table:: Scheduler Internal Data Structures per Port + + +---+----------------------+-------------------------+---------------------+------------------------------+---------------------------------------------------+ + | # | Data structure | Size (bytes) | # per port | Access type | Description | + | | | | | | | + | | | | +-------------+----------------+---------------------------------------------------+ + | | | | | Enq | Deq | | + | | | | | | | | + +===+======================+=========================+=====================+=============+================+===================================================+ + | 1 | Subport table entry | 64 | # subports per port | - | Rd, Wr | Persistent subport data (credits, etc). | + | | | | | | | | + +---+----------------------+-------------------------+---------------------+-------------+----------------+---------------------------------------------------+ + | 2 | Pipe table entry | 64 | # pipes per port | - | Rd, Wr | Persistent data for pipe, its TCs and its queues | + | | | | | | | (credits, etc) that is updated during run-time. | + | | | | | | | | + | | | | | | | The pipe configuration parameters do not change | + | | | | | | | during run-time. The same pipe configuration | + | | | | | | | parameters are shared by multiple pipes, | + | | | | | | | therefore they are not part of pipe table entry. | + | | | | | | | | + +---+----------------------+-------------------------+---------------------+-------------+----------------+---------------------------------------------------+ + | 3 | Queue table entry | 4 | #queues per port | Rd, Wr | Rd, Wr | Persistent queue data (read and write pointers). | + | | | | | | | The queue size is the same per TC for all queues, | + | | | | | | | allowing the queue base address to be computed | + | | | | | | | using a fast formula, so these two parameters are | + | | | | | | | not part of queue table entry. | + | | | | | | | | + | | | | | | | The queue table entries for any given pipe are | + | | | | | | | stored in the same cache line. | + | | | | | | | | + +---+----------------------+-------------------------+---------------------+-------------+----------------+---------------------------------------------------+ + | 4 | Queue storage area | Config (default: 64 x8) | # queues per port | Wr | Rd | Array of elements per queue; each element is 8 | + | | | | | | | byte in size (mbuf pointer). | + | | | | | | | | + +---+----------------------+-------------------------+---------------------+-------------+----------------+---------------------------------------------------+ + | 5 | Active queues bitmap | 1 bit per queue | 1 | Wr (Set) | Rd, Wr (Clear) | The bitmap maintains one status bit per queue: | + | | | | | | | queue not active (queue is empty) or queue active | + | | | | | | | (queue is not empty). | + | | | | | | | | + | | | | | | | Queue bit is set by the scheduler enqueue and | + | | | | | | | cleared by the scheduler dequeue when queue | + | | | | | | | becomes empty. | + | | | | | | | | + | | | | | | | Bitmap scan operation returns the next non-empty | + | | | | | | | pipe and its status (16-bit mask of active queue | + | | | | | | | in the pipe). | + | | | | | | | | + +---+----------------------+-------------------------+---------------------+-------------+----------------+---------------------------------------------------+ + | 6 | Grinder | ~128 | Config (default: 8) | - | Rd, Wr | Short list of active pipes currently under | + | | | | | | | processing. The grinder contains temporary data | + | | | | | | | during pipe processing. | + | | | | | | | | + | | | | | | | Once the current pipe exhausts packets or | + | | | | | | | credits, it is replaced with another active pipe | + | | | | | | | from the bitmap. | + | | | | | | | | + +---+----------------------+-------------------------+---------------------+-------------+----------------+---------------------------------------------------+ + +Multicore Scaling Strategy +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The multicore scaling strategy is: + +#. Running different physical ports on different threads. The enqueue and dequeue of the same port are run by the same thread. + +#. Splitting the same physical port to different threads by running different sets of subports of the same physical port (virtual ports) on different threads. + Similarly, a subport can be split into multiple subports that are each run by a different thread. + The enqueue and dequeue of the same port are run by the same thread. + This is only required if, for performance reasons, it is not possible to handle a full port with a single core. + +Enqueue and Dequeue for the Same Output Port +"""""""""""""""""""""""""""""""""""""""""""" + +Running enqueue and dequeue operations for the same output port from different cores is likely to cause significant impact on scheduler's performance +and it is therefore not recommended. + +The port enqueue and dequeue operations share access to the following data structures: + +#. Packet descriptors + +#. Queue table + +#. Queue storage area + +#. Bitmap of active queues + +The expected drop in performance is due to: + +#. Need to make the queue and bitmap operations thread safe, + which requires either using locking primitives for access serialization (for example, spinlocks/ semaphores) or + using atomic primitives for lockless access (for example, Test and Set, Compare And Swap, an so on). + The impact is much higher in the former case. + +#. Ping-pong of cache lines storing the shared data structures between the cache hierarchies of the two cores + (done transparently by the MESI protocol cache coherency CPU hardware). + +Therefore, the scheduler enqueue and dequeue operations have to be run from the same thread, +which allows the queues and the bitmap operations to be non-thread safe and +keeps the scheduler data structures internal to the same core. + +Performance Scaling +""""""""""""""""""" + +Scaling up the number of NIC ports simply requires a proportional increase in the number of CPU cores to be used for traffic scheduling. + +Enqueue Pipeline +^^^^^^^^^^^^^^^^ + +The sequence of steps per packet: + +#. *Access* the mbuf to read the data fields required to identify the destination queue for the packet. + These fields are: port, subport, traffic class and queue within traffic class, and are typically set by the classification stage. + +#. *Access* the queue structure to identify the write location in the queue array. + If the queue is full, then the packet is discarded. + +#. *Access* the queue array location to store the packet (i.e. write the mbuf pointer). + +It should be noted the strong data dependency between these steps, as steps 2 and 3 cannot start before the result from steps 1 and 2 becomes available, +which prevents the processor out of order execution engine to provide any significant performance optimizations. + +Given the high rate of input packets and the large amount of queues, +it is expected that the data structures accessed to enqueue the current packet are not present +in the L1 or L2 data cache of the current core, thus the above 3 memory accesses would result (on average) in L1 and L2 data cache misses. +A number of 3 L1/L2 cache misses per packet is not acceptable for performance reasons. + +The workaround is to prefetch the required data structures in advance. The prefetch operation has an execution latency during which +the processor should not attempt to access the data structure currently under prefetch, so the processor should execute other work. +The only other work available is to execute different stages of the enqueue sequence of operations on other input packets, +thus resulting in a pipelined implementation for the enqueue operation. + +:numref:`figure_prefetch_pipeline` illustrates a pipelined implementation for the enqueue operation with 4 pipeline stages and each stage executing 2 different input packets. +No input packet can be part of more than one pipeline stage at a given time. + +.. _figure_prefetch_pipeline: + +.. figure:: img/prefetch_pipeline.* + + Prefetch Pipeline for the Hierarchical Scheduler Enqueue Operation + + +The congestion management scheme implemented by the enqueue pipeline described above is very basic: +packets are enqueued until a specific queue becomes full, +then all the packets destined to the same queue are dropped until packets are consumed (by the dequeue operation). +This can be improved by enabling RED/WRED as part of the enqueue pipeline which looks at the queue occupancy and +packet priority in order to yield the enqueue/drop decision for a specific packet +(as opposed to enqueuing all packets / dropping all packets indiscriminately). + +Dequeue State Machine +^^^^^^^^^^^^^^^^^^^^^ + +The sequence of steps to schedule the next packet from the current pipe is: + +#. Identify the next active pipe using the bitmap scan operation, *prefetch* pipe. + +#. *Read* pipe data structure. Update the credits for the current pipe and its subport. + Identify the first active traffic class within the current pipe, select the next queue using WRR, + *prefetch* queue pointers for all the 16 queues of the current pipe. + +#. *Read* next element from the current WRR queue and *prefetch* its packet descriptor. + +#. *Read* the packet length from the packet descriptor (mbuf structure). + Based on the packet length and the available credits (of current pipe, pipe traffic class, subport and subport traffic class), + take the go/no go scheduling decision for the current packet. + +To avoid the cache misses, the above data structures (pipe, queue, queue array, mbufs) are prefetched in advance of being accessed. +The strategy of hiding the latency of the prefetch operations is to switch from the current pipe (in grinder A) to another pipe +(in grinder B) immediately after a prefetch is issued for the current pipe. +This gives enough time to the prefetch operation to complete before the execution switches back to this pipe (in grinder A). + +The dequeue pipe state machine exploits the data presence into the processor cache, +therefore it tries to send as many packets from the same pipe TC and pipe as possible (up to the available packets and credits) before +moving to the next active TC from the same pipe (if any) or to another active pipe. + +.. _figure_pipe_prefetch_sm: + +.. figure:: img/pipe_prefetch_sm.* + + Pipe Prefetch State Machine for the Hierarchical Scheduler Dequeue + Operation + + +Timing and Synchronization +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The output port is modeled as a conveyor belt of byte slots that need to be filled by the scheduler with data for transmission. +For 10 GbE, there are 1.25 billion byte slots that need to be filled by the port scheduler every second. +If the scheduler is not fast enough to fill the slots, provided that enough packets and credits exist, +then some slots will be left unused and bandwidth will be wasted. + +In principle, the hierarchical scheduler dequeue operation should be triggered by NIC TX. +Usually, once the occupancy of the NIC TX input queue drops below a predefined threshold, +the port scheduler is woken up (interrupt based or polling based, +by continuously monitoring the queue occupancy) to push more packets into the queue. + +Internal Time Reference +""""""""""""""""""""""" + +The scheduler needs to keep track of time advancement for the credit logic, +which requires credit updates based on time (for example, subport and pipe traffic shaping, traffic class upper limit enforcement, and so on). + +Every time the scheduler decides to send a packet out to the NIC TX for transmission, the scheduler will increment its internal time reference accordingly. +Therefore, it is convenient to keep the internal time reference in units of bytes, +where a byte signifies the time duration required by the physical interface to send out a byte on the transmission medium. +This way, as a packet is scheduled for transmission, the time is incremented with (n + h), +where n is the packet length in bytes and h is the number of framing overhead bytes per packet. + +Internal Time Reference Re-synchronization +"""""""""""""""""""""""""""""""""""""""""" + +The scheduler needs to align its internal time reference to the pace of the port conveyor belt. +The reason is to make sure that the scheduler does not feed the NIC TX with more bytes than the line rate of the physical medium in order to prevent packet drop +(by the scheduler, due to the NIC TX input queue being full, or later on, internally by the NIC TX). + +The scheduler reads the current time on every dequeue invocation. +The CPU time stamp can be obtained by reading either the Time Stamp Counter (TSC) register or the High Precision Event Timer (HPET) register. +The current CPU time stamp is converted from number of CPU clocks to number of bytes: +*time_bytes = time_cycles / cycles_per_byte, where cycles_per_byte* +is the amount of CPU cycles that is equivalent to the transmission time for one byte on the wire +(e.g. for a CPU frequency of 2 GHz and a 10GbE port,*cycles_per_byte = 1.6*). + +The scheduler maintains an internal time reference of the NIC time. +Whenever a packet is scheduled, the NIC time is incremented with the packet length (including framing overhead). +On every dequeue invocation, the scheduler checks its internal reference of the NIC time against the current time: + +#. If NIC time is in the future (NIC time >= current time), no adjustment of NIC time is needed. + This means that scheduler is able to schedule NIC packets before the NIC actually needs those packets, so the NIC TX is well supplied with packets; + +#. If NIC time is in the past (NIC time < current time), then NIC time should be adjusted by setting it to the current time. + This means that the scheduler is not able to keep up with the speed of the NIC byte conveyor belt, + so NIC bandwidth is wasted due to poor packet supply to the NIC TX. + +Scheduler Accuracy and Granularity +"""""""""""""""""""""""""""""""""" + +The scheduler round trip delay (SRTD) is the time (number of CPU cycles) between two consecutive examinations of the same pipe by the scheduler. + +To keep up with the output port (that is, avoid bandwidth loss), +the scheduler should be able to schedule n packets faster than the same n packets are transmitted by NIC TX. + +The scheduler needs to keep up with the rate of each individual pipe, +as configured for the pipe token bucket, assuming that no port oversubscription is taking place. +This means that the size of the pipe token bucket should be set high enough to prevent it from overflowing due to big SRTD, +as this would result in credit loss (and therefore bandwidth loss) for the pipe. + +Credit Logic +^^^^^^^^^^^^ + +Scheduling Decision +""""""""""""""""""" + +The scheduling decision to send next packet from (subport S, pipe P, traffic class TC, queue Q) is favorable (packet is sent) +when all the conditions below are met: + +* Pipe P of subport S is currently selected by one of the port grinders; + +* Traffic class TC is the highest priority active traffic class of pipe P; + +* Queue Q is the next queue selected by WRR within traffic class TC of pipe P; + +* Subport S has enough credits to send the packet; + +* Subport S has enough credits for traffic class TC to send the packet; + +* Pipe P has enough credits to send the packet; + +* Pipe P has enough credits for traffic class TC to send the packet. + +If all the above conditions are met, +then the packet is selected for transmission and the necessary credits are subtracted from subport S, +subport S traffic class TC, pipe P, pipe P traffic class TC. + +Framing Overhead +"""""""""""""""" + +As the greatest common divisor for all packet lengths is one byte, the unit of credit is selected as one byte. +The number of credits required for the transmission of a packet of n bytes is equal to (n+h), +where h is equal to the number of framing overhead bytes per packet. + +.. _table_qos_5: + +.. table:: Ethernet Frame Overhead Fields + + +---+--------------------------------+----------------+---------------------------------------------------------------------------+ + | # | Packet field | Length (bytes) | Comments | + | | | | | + +===+================================+================+===========================================================================+ + | 1 | Preamble | 7 | | + | | | | | + +---+--------------------------------+----------------+---------------------------------------------------------------------------+ + | 2 | Start of Frame Delimiter (SFD) | 1 | | + | | | | | + +---+--------------------------------+----------------+---------------------------------------------------------------------------+ + | 3 | Frame Check Sequence (FCS) | 4 | Considered overhead only if not included in the mbuf packet length field. | + | | | | | + +---+--------------------------------+----------------+---------------------------------------------------------------------------+ + | 4 | Inter Frame Gap (IFG) | 12 | | + | | | | | + +---+--------------------------------+----------------+---------------------------------------------------------------------------+ + | 5 | Total | 24 | | + | | | | | + +---+--------------------------------+----------------+---------------------------------------------------------------------------+ + +Traffic Shaping +""""""""""""""" + +The traffic shaping for subport and pipe is implemented using a token bucket per subport/per pipe. +Each token bucket is implemented using one saturated counter that keeps track of the number of available credits. + +The token bucket generic parameters and operations are presented in :numref:`table_qos_6` and :numref:`table_qos_7`. + +.. _table_qos_6: + +.. table:: Token Bucket Generic Parameters + + +---+------------------------+--------------------+---------------------------------------------------------+ + | # | Token Bucket Parameter | Unit | Description | + | | | | | + +===+========================+====================+=========================================================+ + | 1 | bucket_rate | Credits per second | Rate of adding credits to the bucket. | + | | | | | + +---+------------------------+--------------------+---------------------------------------------------------+ + | 2 | bucket_size | Credits | Max number of credits that can be stored in the bucket. | + | | | | | + +---+------------------------+--------------------+---------------------------------------------------------+ + +.. _table_qos_7: + +.. table:: Token Bucket Generic Operations + + +---+------------------------+------------------------------------------------------------------------------+ + | # | Token Bucket Operation | Description | + | | | | + +===+========================+==============================================================================+ + | 1 | Initialization | Bucket set to a predefined value, e.g. zero or half of the bucket size. | + | | | | + +---+------------------------+------------------------------------------------------------------------------+ + | 2 | Credit update | Credits are added to the bucket on top of existing ones, either periodically | + | | | or on demand, based on the bucket_rate. Credits cannot exceed the upper | + | | | limit defined by the bucket_size, so any credits to be added to the bucket | + | | | while the bucket is full are dropped. | + | | | | + +---+------------------------+------------------------------------------------------------------------------+ + | 3 | Credit consumption | As result of packet scheduling, the necessary number of credits is removed | + | | | from the bucket. The packet can only be sent if enough credits are in the | + | | | bucket to send the full packet (packet bytes and framing overhead for the | + | | | packet). | + | | | | + +---+------------------------+------------------------------------------------------------------------------+ + +To implement the token bucket generic operations described above, +the current design uses the persistent data structure presented in :numref:`table_qos_8`, +while the implementation of the token bucket operations is described in :numref:`table_qos_9`. + +.. _table_qos_8: + +.. table:: Token Bucket Persistent Data Structure + + +---+------------------------+-------+----------------------------------------------------------------------+ + | # | Token bucket field | Unit | Description | + | | | | | + +===+========================+=======+======================================================================+ + | 1 | tb_time | Bytes | Time of the last credit update. Measured in bytes instead of seconds | + | | | | or CPU cycles for ease of credit consumption operation | + | | | | (as the current time is also maintained in bytes). | + | | | | | + | | | | See Section 26.2.4.5.1 "Internal Time Reference" for an | + | | | | explanation of why the time is maintained in byte units. | + | | | | | + +---+------------------------+-------+----------------------------------------------------------------------+ + | 2 | tb_period | Bytes | Time period that should elapse since the last credit update in order | + | | | | for the bucket to be awarded tb_credits_per_period worth or credits. | + | | | | | + +---+------------------------+-------+----------------------------------------------------------------------+ + | 3 | tb_credits_per_period | Bytes | Credit allowance per tb_period. | + | | | | | + +---+------------------------+-------+----------------------------------------------------------------------+ + | 4 | tb_size | Bytes | Bucket size, i.e. upper limit for the tb_credits. | + | | | | | + +---+------------------------+-------+----------------------------------------------------------------------+ + | 5 | tb_credits | Bytes | Number of credits currently in the bucket. | + | | | | | + +---+------------------------+-------+----------------------------------------------------------------------+ + +The bucket rate (in bytes per second) can be computed with the following formula: + +*bucket_rate = (tb_credits_per_period / tb_period) * r* + +where, r = port line rate (in bytes per second). + +.. _table_qos_9: + +.. table:: Token Bucket Operations + + +---+-------------------------+-----------------------------------------------------------------------------+ + | # | Token bucket operation | Description | + | | | | + +===+=========================+=============================================================================+ + | 1 | Initialization | *tb_credits = 0; or tb_credits = tb_size / 2;* | + | | | | + +---+-------------------------+-----------------------------------------------------------------------------+ + | 2 | Credit update | Credit update options: | + | | | | + | | | * Every time a packet is sent for a port, update the credits of all the | + | | | the subports and pipes of that port. Not feasible. | + | | | | + | | | * Every time a packet is sent, update the credits for the pipe and | + | | | subport. Very accurate, but not needed (a lot of calculations). | + | | | | + | | | * Every time a pipe is selected (that is, picked by one | + | | | of the grinders), update the credits for the pipe and its subport. | + | | | | + | | | The current implementation is using option 3. According to Section | + | | | `Dequeue State Machine`_, the pipe and subport credits are | + | | | updated every time a pipe is selected by the dequeue process before the | + | | | pipe and subport credits are actually used. | + | | | | + | | | The implementation uses a tradeoff between accuracy and speed by updating | + | | | the bucket credits only when at least a full *tb_period* has elapsed since | + | | | the last update. | + | | | | + | | | * Full accuracy can be achieved by selecting the value for *tb_period* | + | | | for which *tb_credits_per_period = 1*. | + | | | | + | | | * When full accuracy is not required, better performance is achieved by | + | | | setting *tb_credits* to a larger value. | + | | | | + | | | Update operations: | + | | | | + | | | * n_periods = (time - tb_time) / tb_period; | + | | | | + | | | * tb_credits += n_periods * tb_credits_per_period; | + | | | | + | | | * tb_credits = min(tb_credits, tb_size); | + | | | | + | | | * tb_time += n_periods * tb_period; | + | | | | + +---+-------------------------+-----------------------------------------------------------------------------+ + | 3 | Credit consumption | As result of packet scheduling, the necessary number of credits is removed | + | | (on packet scheduling) | from the bucket. The packet can only be sent if enough credits are in the | + | | | bucket to send the full packet (packet bytes and framing overhead for the | + | | | packet). | + | | | | + | | | Scheduling operations: | + | | | | + | | | pkt_credits = pkt_len + frame_overhead; | + | | | if (tb_credits >= pkt_credits){tb_credits -= pkt_credits;} | + | | | | + +---+-------------------------+-----------------------------------------------------------------------------+ + +Traffic Classes +""""""""""""""" + +Implementation of Strict Priority Scheduling +'''''''''''''''''''''''''''''''''''''''''''' + +Strict priority scheduling of traffic classes within the same pipe is implemented by the pipe dequeue state machine, +which selects the queues in ascending order. +Therefore, queue 0 (associated with TC 0, highest priority TC) is handled before +queue 1 (TC 1, lower priority than TC 0), +which is handled before queue 2 (TC 2, lower priority than TC 1) and it conitnues until queues of all TCs except the +lowest priority TC are handled. At last, queues 12..15 (best effort TC, lowest priority TC) are handled. + +Upper Limit Enforcement +''''''''''''''''''''''' + +The traffic classes at the pipe and subport levels are not traffic shaped, +so there is no token bucket maintained in this context. +The upper limit for the traffic classes at the subport and +pipe levels is enforced by periodically refilling the subport / pipe traffic class credit counter, +out of which credits are consumed every time a packet is scheduled for that subport / pipe, +as described in :numref:`table_qos_10` and :numref:`table_qos_11`. + +.. _table_qos_10: + +.. table:: Subport/Pipe Traffic Class Upper Limit Enforcement Persistent Data Structure + + +---+-----------------------+-------+-----------------------------------------------------------------------+ + | # | Subport or pipe field | Unit | Description | + | | | | | + +===+=======================+=======+=======================================================================+ + | 1 | tc_time | Bytes | Time of the next update (upper limit refill) for the TCs of the | + | | | | current subport / pipe. | + | | | | | + | | | | See Section `Internal Time Reference`_ for the | + | | | | explanation of why the time is maintained in byte units. | + | | | | | + +---+-----------------------+-------+-----------------------------------------------------------------------+ + | 2 | tc_period | Bytes | Time between two consecutive updates for the all TCs of the current | + | | | | subport / pipe. This is expected to be many times bigger than the | + | | | | typical value of the token bucket tb_period. | + | | | | | + +---+-----------------------+-------+-----------------------------------------------------------------------+ + | 3 | tc_credits_per_period | Bytes | Upper limit for the number of credits allowed to be consumed by the | + | | | | current TC during each enforcement period tc_period. | + | | | | | + +---+-----------------------+-------+-----------------------------------------------------------------------+ + | 4 | tc_credits | Bytes | Current upper limit for the number of credits that can be consumed by | + | | | | the current traffic class for the remainder of the current | + | | | | enforcement period. | + | | | | | + +---+-----------------------+-------+-----------------------------------------------------------------------+ + +.. _table_qos_11: + +.. table:: Subport/Pipe Traffic Class Upper Limit Enforcement Operations + + +---+--------------------------+----------------------------------------------------------------------------+ + | # | Traffic Class Operation | Description | + | | | | + +===+==========================+============================================================================+ + | 1 | Initialization | tc_credits = tc_credits_per_period; | + | | | | + | | | tc_time = tc_period; | + | | | | + +---+--------------------------+----------------------------------------------------------------------------+ + | 2 | Credit update | Update operations: | + | | | | + | | | if (time >= tc_time) { | + | | | | + | | | tc_credits = tc_credits_per_period; | + | | | | + | | | tc_time = time + tc_period; | + | | | | + | | | } | + | | | | + +---+--------------------------+----------------------------------------------------------------------------+ + | 3 | Credit consumption | As result of packet scheduling, the TC limit is decreased with the | + | | (on packet scheduling) | necessary number of credits. The packet can only be sent if enough credits | + | | | are currently available in the TC limit to send the full packet | + | | | (packet bytes and framing overhead for the packet). | + | | | | + | | | Scheduling operations: | + | | | | + | | | pkt_credits = pk_len + frame_overhead; | + | | | | + | | | if (tc_credits >= pkt_credits) {tc_credits -= pkt_credits;} | + | | | | + +---+--------------------------+----------------------------------------------------------------------------+ + +Weighted Round Robin (WRR) +"""""""""""""""""""""""""" + +The evolution of the WRR design solution for the lowest priority traffic class (best effort TC) from simple to complex is shown in :numref:`table_qos_12`. + +.. _table_qos_12: + +.. table:: Weighted Round Robin (WRR) + + +---+------------+-----------------+-------------+----------------------------------------------------------+ + | # | All Queues | Equal Weights | All Packets | Strategy | + | | Active? | for All Queues? | Equal? | | + +===+============+=================+=============+==========================================================+ + | 1 | Yes | Yes | Yes | **Byte level round robin** | + | | | | | | + | | | | | *Next queue* queue #i, i = *(i + 1) % n* | + | | | | | | + +---+------------+-----------------+-------------+----------------------------------------------------------+ + | 2 | Yes | Yes | No | **Packet level round robin** | + | | | | | | + | | | | | Consuming one byte from queue #i requires consuming | + | | | | | exactly one token for queue #i. | + | | | | | | + | | | | | T(i) = Accumulated number of tokens previously consumed | + | | | | | from queue #i. Every time a packet is consumed from | + | | | | | queue #i, T(i) is updated as: T(i) += *pkt_len*. | + | | | | | | + | | | | | *Next queue* : queue with the smallest T. | + | | | | | | + | | | | | | + +---+------------+-----------------+-------------+----------------------------------------------------------+ + | 3 | Yes | No | No | **Packet level weighted round robin** | + | | | | | | + | | | | | This case can be reduced to the previous case by | + | | | | | introducing a cost per byte that is different for each | + | | | | | queue. Queues with lower weights have a higher cost per | + | | | | | byte. This way, it is still meaningful to compare the | + | | | | | consumption amongst different queues in order to select | + | | | | | the next queue. | + | | | | | | + | | | | | w(i) = Weight of queue #i | + | | | | | | + | | | | | t(i) = Tokens per byte for queue #i, defined as the | + | | | | | inverse weight of queue #i. | + | | | | | For example, if w[0..3] = [1:2:4:8], | + | | | | | then t[0..3] = [8:4:2:1]; if w[0..3] = [1:4:15:20], | + | | | | | then t[0..3] = [60:15:4:3]. | + | | | | | Consuming one byte from queue #i requires consuming t(i) | + | | | | | tokens for queue #i. | + | | | | | | + | | | | | T(i) = Accumulated number of tokens previously consumed | + | | | | | from queue #i. Every time a packet is consumed from | + | | | | | queue #i, T(i) is updated as: *T(i) += pkt_len * t(i)*. | + | | | | | *Next queue* : queue with the smallest T. | + | | | | | | + +---+------------+-----------------+-------------+----------------------------------------------------------+ + | 4 | No | No | No | **Packet level weighted round robin with variable queue | + | | | | | status** | + | | | | | | + | | | | | Reduce this case to the previous case by setting the | + | | | | | consumption of inactive queues to a high number, so that | + | | | | | the inactive queues will never be selected by the | + | | | | | smallest T logic. | + | | | | | | + | | | | | To prevent T from overflowing as result of successive | + | | | | | accumulations, T(i) is truncated after each packet | + | | | | | consumption for all queues. | + | | | | | For example, T[0..3] = [1000, 1100, 1200, 1300] | + | | | | | is truncated to T[0..3] = [0, 100, 200, 300] | + | | | | | by subtracting the min T from T(i), i = 0..n. | + | | | | | | + | | | | | This requires having at least one active queue in the | + | | | | | set of input queues, which is guaranteed by the dequeue | + | | | | | state machine never selecting an inactive traffic class. | + | | | | | | + | | | | | *mask(i) = Saturation mask for queue #i, defined as:* | + | | | | | | + | | | | | mask(i) = (queue #i is active)? 0 : 0xFFFFFFFF; | + | | | | | | + | | | | | w(i) = Weight of queue #i | + | | | | | | + | | | | | t(i) = Tokens per byte for queue #i, defined as the | + | | | | | inverse weight of queue #i. | + | | | | | | + | | | | | T(i) = Accumulated numbers of tokens previously consumed | + | | | | | from queue #i. | + | | | | | | + | | | | | *Next queue* : queue with smallest T. | + | | | | | | + | | | | | Before packet consumption from queue #i: | + | | | | | | + | | | | | *T(i) |= mask(i)* | + | | | | | | + | | | | | After packet consumption from queue #i: | + | | | | | | + | | | | | T(j) -= T(i), j != i | + | | | | | | + | | | | | T(i) = pkt_len * t(i) | + | | | | | | + | | | | | Note: T(j) uses the T(i) value before T(i) is updated. | + | | | | | | + +---+------------+-----------------+-------------+----------------------------------------------------------+ + +Subport Traffic Class Oversubscription +"""""""""""""""""""""""""""""""""""""" + +Problem Statement +''''''''''''''''' + +Oversubscription for subport traffic class X is a configuration-time event that occurs when +more bandwidth is allocated for traffic class X at the level of subport member pipes than +allocated for the same traffic class at the parent subport level. + +The existence of the oversubscription for a specific subport and +traffic class is solely the result of pipe and +subport-level configuration as opposed to being created due +to dynamic evolution of the traffic load at run-time (as congestion is). + +When the overall demand for traffic class X for the current subport is low, +the existence of the oversubscription condition does not represent a problem, +as demand for traffic class X is completely satisfied for all member pipes. +However, this can no longer be achieved when the aggregated demand for traffic class X +for all subport member pipes exceeds the limit configured at the subport level. + +Solution Space +'''''''''''''' + +summarizes some of the possible approaches for handling this problem, +with the third approach selected for implementation. + +.. _table_qos_13: + +.. table:: Subport Traffic Class Oversubscription + + +-----+---------------------------+-------------------------------------------------------------------------+ + | No. | Approach | Description | + | | | | + +=====+===========================+=========================================================================+ + | 1 | Don't care | First come, first served. | + | | | | + | | | This approach is not fair amongst subport member pipes, as pipes that | + | | | are served first will use up as much bandwidth for TC X as they need, | + | | | while pipes that are served later will receive poor service due to | + | | | bandwidth for TC X at the subport level being scarce. | + | | | | + +-----+---------------------------+-------------------------------------------------------------------------+ + | 2 | Scale down all pipes | All pipes within the subport have their bandwidth limit for TC X scaled | + | | | down by the same factor. | + | | | | + | | | This approach is not fair among subport member pipes, as the low end | + | | | pipes (that is, pipes configured with low bandwidth) can potentially | + | | | experience severe service degradation that might render their service | + | | | unusable (if available bandwidth for these pipes drops below the | + | | | minimum requirements for a workable service), while the service | + | | | degradation for high end pipes might not be noticeable at all. | + | | | | + +-----+---------------------------+-------------------------------------------------------------------------+ + | 3 | Cap the high demand pipes | Each subport member pipe receives an equal share of the bandwidth | + | | | available at run-time for TC X at the subport level. Any bandwidth left | + | | | unused by the low-demand pipes is redistributed in equal portions to | + | | | the high-demand pipes. This way, the high-demand pipes are truncated | + | | | while the low-demand pipes are not impacted. | + | | | | + +-----+---------------------------+-------------------------------------------------------------------------+ + +Typically, the subport TC oversubscription feature is enabled only for the lowest priority traffic class, +which is typically used for best effort traffic, +with the management plane preventing this condition from occurring for the other (higher priority) traffic classes. + +To ease implementation, it is also assumed that the upper limit for subport best effort TC is set to 100% of the subport rate, +and that the upper limit for pipe best effort TC is set to 100% of pipe rate for all subport member pipes. + +Implementation Overview +''''''''''''''''''''''' + +The algorithm computes a watermark, which is periodically updated based on the current demand experienced by the subport member pipes, +whose purpose is to limit the amount of traffic that each pipe is allowed to send for best effort TC. +The watermark is computed at the subport level at the beginning of each traffic class upper limit enforcement period and +the same value is used by all the subport member pipes throughout the current enforcement period. +illustrates how the watermark computed as subport level at the beginning of each period is propagated to all subport member pipes. + +At the beginning of the current enforcement period (which coincides with the end of the previous enforcement period), +the value of the watermark is adjusted based on the amount of bandwidth allocated to best effort TC at the beginning of the previous period that +was not left unused by the subport member pipes at the end of the previous period. + +If there was subport best effort TC bandwidth left unused, +the value of the watermark for the current period is increased to encourage the subport member pipes to consume more bandwidth. +Otherwise, the value of the watermark is decreased to enforce equality of bandwidth consumption among subport member pipes for best effort TC. + +The increase or decrease in the watermark value is done in small increments, +so several enforcement periods might be required to reach the equilibrium state. +This state can change at any moment due to variations in the demand experienced by the subport member pipes for best effort TC, for example, +as a result of demand increase (when the watermark needs to be lowered) or demand decrease (when the watermark needs to be increased). + +When demand is low, the watermark is set high to prevent it from impeding the subport member pipes from consuming more bandwidth. +The highest value for the watermark is picked as the highest rate configured for a subport member pipe. +:numref:`table_qos_14` and :numref:`table_qos_15` illustrates the watermark operation. + +.. _table_qos_14: + +.. table:: Watermark Propagation from Subport Level to Member Pipes at the Beginning of Each Traffic Class Upper Limit Enforcement Period + + +-----+---------------------------------+----------------------------------------------------+ + | No. | Subport Traffic Class Operation | Description | + | | | | + +=====+=================================+====================================================+ + | 1 | Initialization | **Subport level**: subport_period_id= 0 | + | | | | + | | | **Pipe level**: pipe_period_id = 0 | + | | | | + +-----+---------------------------------+----------------------------------------------------+ + | 2 | Credit update | **Subport Level**: | + | | | | + | | | if (time>=subport_tc_time) | + | | | | + | | | { | + | | | subport_wm = water_mark_update(); | + | | | | + | | | subport_tc_time = time + subport_tc_period; | + | | | | + | | | subport_period_id++; | + | | | | + | | | } | + | | | | + | | | **Pipelevel:** | + | | | | + | | | if(pipe_period_id != subport_period_id) | + | | | | + | | | { | + | | | | + | | | pipe_ov_credits = subport_wm \* pipe_weight; | + | | | | + | | | pipe_period_id = subport_period_id; | + | | | | + | | | } | + | | | | + +-----+---------------------------------+----------------------------------------------------+ + | 3 | Credit consumption | **Pipe level:** | + | | (on packet scheduling) | | + | | | pkt_credits = pk_len + frame_overhead; | + | | | | + | | | if(pipe_ov_credits >= pkt_credits{ | + | | | | + | | | pipe_ov_credits -= pkt_credits; | + | | | | + | | | } | + | | | | + +-----+---------------------------------+----------------------------------------------------+ + +.. _table_qos_15: + +.. table:: Watermark Calculation + + +-----+------------------+----------------------------------------------------------------------------------+ + | No. | Subport Traffic | Description | + | | Class Operation | | + +=====+==================+==================================================================================+ + | 1 | Initialization | **Subport level:** | + | | | | + | | | wm = WM_MAX | + | | | | + +-----+------------------+----------------------------------------------------------------------------------+ + | 2 | Credit update | **Subport level (water_mark_update):** | + | | | | + | | | tc0_cons = subport_tc0_credits_per_period - subport_tc0_credits; | + | | | | + | | | tc1_cons = subport_tc1_credits_per_period - subport_tc1_credits; | + | | | | + | | | tc2_cons = subport_tc2_credits_per_period - subport_tc2_credits; | + | | | | + | | | tc3_cons = subport_tc3_credits_per_period - subport_tc3_credits; | + | | | | + | | | tc4_cons = subport_tc4_credits_per_period - subport_tc4_credits; | + | | | | + | | | tc5_cons = subport_tc5_credits_per_period - subport_tc5_credits; | + | | | | + | | | tc6_cons = subport_tc6_credits_per_period - subport_tc6_credits; | + | | | | + | | | tc7_cons = subport_tc7_credits_per_period - subport_tc7_credits; | + | | | | + | | | tc8_cons = subport_tc8_credits_per_period - subport_tc8_credits; | + | | | | + | | | tc9_cons = subport_tc9_credits_per_period - subport_tc9_credits; | + | | | | + | | | tc10_cons = subport_tc10_credits_per_period - subport_tc10_credits; | + | | | | + | | | tc11_cons = subport_tc11_credits_per_period - subport_tc11_credits; | + | | | | + | | | tc_be_cons_max = subport_tc_be_credits_per_period - (tc0_cons + tc1_cons + | + | | | tc2_cons + tc3_cons + tc4_cons + tc5_cons + tc6_cons + tc7_cons + tc8_cons + | + | | | tc9_cons + tc10_cons + tc11_cons); | + | | | | + | | | if(tc_be_consumption > (tc_be_consumption_max - MTU)){ | + | | | | + | | | wm -= wm >> 7; | + | | | | + | | | if(wm < WM_MIN) wm = WM_MIN; | + | | | | + | | | } else { | + | | | | + | | | wm += (wm >> 7) + 1; | + | | | | + | | | if(wm > WM_MAX) wm = WM_MAX; | + | | | | + | | | } | + | | | | + +-----+------------------+----------------------------------------------------------------------------------+ + +Worst Case Scenarios for Performance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Lots of Active Queues with Not Enough Credits +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The more queues the scheduler has to examine for packets and credits in order to select one packet, +the lower the performance of the scheduler is. + +The scheduler maintains the bitmap of active queues, which skips the non-active queues, +but in order to detect whether a specific pipe has enough credits, +the pipe has to be drilled down using the pipe dequeue state machine, +which consumes cycles regardless of the scheduling result +(no packets are produced or at least one packet is produced). + +This scenario stresses the importance of the policer for the scheduler performance: +if the pipe does not have enough credits, +its packets should be dropped as soon as possible (before they reach the hierarchical scheduler), +thus rendering the pipe queues as not active, +which allows the dequeue side to skip that pipe with no cycles being spent on investigating the pipe credits +that would result in a "not enough credits" status. + +Single Queue with 100% Line Rate +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The port scheduler performance is optimized for a large number of queues. +If the number of queues is small, +then the performance of the port scheduler for the same level of active traffic is expected to be worse than +the performance of a small set of message passing queues. + +.. _Dropper: + +Dropper +------- + +The purpose of the DPDK dropper is to drop packets arriving at a packet scheduler to avoid congestion. +The dropper supports the Random Early Detection (RED), +Weighted Random Early Detection (WRED) and tail drop algorithms. +:numref:`figure_blk_diag_dropper` illustrates how the dropper integrates with the scheduler. +The DPDK currently does not support congestion management +so the dropper provides the only method for congestion avoidance. + +.. _figure_blk_diag_dropper: + +.. figure:: img/blk_diag_dropper.* + + High-level Block Diagram of the DPDK Dropper + + +The dropper uses the Random Early Detection (RED) congestion avoidance algorithm as documented in the reference publication. +The purpose of the RED algorithm is to monitor a packet queue, +determine the current congestion level in the queue and decide whether an arriving packet should be enqueued or dropped. +The RED algorithm uses an Exponential Weighted Moving Average (EWMA) filter to compute average queue size which +gives an indication of the current congestion level in the queue. + +For each enqueue operation, the RED algorithm compares the average queue size to minimum and maximum thresholds. +Depending on whether the average queue size is below, above or in between these thresholds, +the RED algorithm calculates the probability that an arriving packet should be dropped and +makes a random decision based on this probability. + +The dropper also supports Weighted Random Early Detection (WRED) by allowing the scheduler to select +different RED configurations for the same packet queue at run-time. +In the case of severe congestion, the dropper resorts to tail drop. +This occurs when a packet queue has reached maximum capacity and cannot store any more packets. +In this situation, all arriving packets are dropped. + +The flow through the dropper is illustrated in :numref:`figure_flow_tru_droppper`. +The RED/WRED algorithm is exercised first and tail drop second. + +.. _figure_flow_tru_droppper: + +.. figure:: img/flow_tru_droppper.* + + Flow Through the Dropper + + +The use cases supported by the dropper are: + +* * Initialize configuration data + +* * Initialize run-time data + +* * Enqueue (make a decision to enqueue or drop an arriving packet) + +* * Mark empty (record the time at which a packet queue becomes empty) + +The configuration use case is explained in :ref:`Section2.23.3.1 <Configuration>`, +the enqueue operation is explained in :ref:`Section 2.23.3.2 <Enqueue_Operation>` +and the mark empty operation is explained in :ref:`Section 2.23.3.3 <Queue_Empty_Operation>`. + +.. _Configuration: + +Configuration +~~~~~~~~~~~~~ + +A RED configuration contains the parameters given in :numref:`table_qos_16`. + +.. _table_qos_16: + +.. table:: RED Configuration Parameters + + +--------------------------+---------+---------+------------------+ + | Parameter | Minimum | Maximum | Typical | + | | | | | + +==========================+=========+=========+==================+ + | Minimum Threshold | 0 | 1022 | 1/4 x queue size | + | | | | | + +--------------------------+---------+---------+------------------+ + | Maximum Threshold | 1 | 1023 | 1/2 x queue size | + | | | | | + +--------------------------+---------+---------+------------------+ + | Inverse Mark Probability | 1 | 255 | 10 | + | | | | | + +--------------------------+---------+---------+------------------+ + | EWMA Filter Weight | 1 | 12 | 9 | + | | | | | + +--------------------------+---------+---------+------------------+ + +The meaning of these parameters is explained in more detail in the following sections. +The format of these parameters as specified to the dropper module API +corresponds to the format used by Cisco* in their RED implementation. +The minimum and maximum threshold parameters are specified to the dropper module in terms of number of packets. +The mark probability parameter is specified as an inverse value, for example, +an inverse mark probability parameter value of 10 corresponds +to a mark probability of 1/10 (that is, 1 in 10 packets will be dropped). +The EWMA filter weight parameter is specified as an inverse log value, +for example, a filter weight parameter value of 9 corresponds to a filter weight of 1/29. + +.. _Enqueue_Operation: + +Enqueue Operation +~~~~~~~~~~~~~~~~~ + +In the example shown in :numref:`figure_ex_data_flow_tru_dropper`, q (actual queue size) is the input value, +avg (average queue size) and count (number of packets since the last drop) are run-time values, +decision is the output value and the remaining values are configuration parameters. + +.. _figure_ex_data_flow_tru_dropper: + +.. figure:: img/ex_data_flow_tru_dropper.* + + Example Data Flow Through Dropper + + +EWMA Filter Microblock +^^^^^^^^^^^^^^^^^^^^^^ + +The purpose of the EWMA Filter microblock is to filter queue size values to smooth out transient changes +that result from "bursty" traffic. +The output value is the average queue size which gives a more stable view of the current congestion level in the queue. + +The EWMA filter has one configuration parameter, filter weight, which determines how quickly +or slowly the average queue size output responds to changes in the actual queue size input. +Higher values of filter weight mean that the average queue size responds more quickly to changes in actual queue size. + +Average Queue Size Calculation when the Queue is not Empty +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +The definition of the EWMA filter is given in the following equation. + +.. image:: img/ewma_filter_eq_1.* + +Where: + +* *avg* = average queue size + +* *wq* = filter weight + +* *q* = actual queue size + +.. note:: + + The filter weight, wq = 1/2^n, where n is the filter weight parameter value passed to the dropper module + on configuration (see :ref:`Section2.23.3.1 <Configuration>` ). + +Average Queue Size Calculation when the Queue is Empty +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The EWMA filter does not read time stamps and instead assumes that enqueue operations will happen quite regularly. +Special handling is required when the queue becomes empty as the queue could be empty for a short time or a long time. +When the queue becomes empty, average queue size should decay gradually to zero instead of dropping suddenly to zero +or remaining stagnant at the last computed value. +When a packet is enqueued on an empty queue, the average queue size is computed using the following formula: + +.. image:: img/ewma_filter_eq_2.* + +Where: + +* *m* = the number of enqueue operations that could have occurred on this queue while the queue was empty + +In the dropper module, *m* is defined as: + +.. image:: img/m_definition.* + +Where: + +* *time* = current time + +* *qtime* = time the queue became empty + +* *s* = typical time between successive enqueue operations on this queue + +The time reference is in units of bytes, +where a byte signifies the time duration required by the physical interface to send out a byte on the transmission medium +(see Section `Internal Time Reference`_). +The parameter s is defined in the dropper module as a constant with the value: s=2^22. +This corresponds to the time required by every leaf node in a hierarchy with 64K leaf nodes +to transmit one 64-byte packet onto the wire and represents the worst case scenario. +For much smaller scheduler hierarchies, +it may be necessary to reduce the parameter s, which is defined in the red header source file (rte_red.h) as: + +.. code-block:: c + + #define RTE_RED_S + +Since the time reference is in bytes, the port speed is implied in the expression: *time-qtime*. +The dropper does not have to be configured with the actual port speed. +It adjusts automatically to low speed and high speed links. + +Implementation +"""""""""""""" + +A numerical method is used to compute the factor (1-wq)^m that appears in Equation 2. + +This method is based on the following identity: + +.. image:: img/eq2_factor.* + + +This allows us to express the following: + +.. image:: img/eq2_expression.* + + +In the dropper module, a look-up table is used to compute log2(1-wq) for each value of wq supported by the dropper module. +The factor (1-wq)^m can then be obtained by multiplying the table value by *m* and applying shift operations. +To avoid overflow in the multiplication, the value, *m*, and the look-up table values are limited to 16 bits. +The total size of the look-up table is 56 bytes. +Once the factor (1-wq)^m is obtained using this method, the average queue size can be calculated from Equation 2. + +Alternative Approaches +"""""""""""""""""""""" + +Other methods for calculating the factor (1-wq)^m in the expression for computing average queue size +when the queue is empty (Equation 2) were considered. +These approaches include: + +* Floating-point evaluation + +* Fixed-point evaluation using a small look-up table (512B) and up to 16 multiplications + (this is the approach used in the FreeBSD* ALTQ RED implementation) + +* Fixed-point evaluation using a small look-up table (512B) and 16 SSE multiplications + (SSE optimized version of the approach used in the FreeBSD* ALTQ RED implementation) + +* Large look-up table (76 KB) + +The method that was finally selected (described above in Section 26.3.2.2.1) out performs all of these approaches +in terms of run-time performance and memory requirements and +also achieves accuracy comparable to floating-point evaluation. +:numref:`table_qos_17` lists the performance of each of these alternative approaches relative to the method that is used in the dropper. +As can be seen, the floating-point implementation achieved the worst performance. + +.. _table_qos_17: + +.. table:: Relative Performance of Alternative Approaches + + +------------------------------------------------------------------------------------+----------------------+ + | Method | Relative Performance | + | | | + +====================================================================================+======================+ + | Current dropper method (see :ref:`Section 23.3.2.1.3 <Dropper>`) | 100% | + | | | + +------------------------------------------------------------------------------------+----------------------+ + | Fixed-point method with small (512B) look-up table | 148% | + | | | + +------------------------------------------------------------------------------------+----------------------+ + | SSE method with small (512B) look-up table | 114% | + | | | + +------------------------------------------------------------------------------------+----------------------+ + | Large (76KB) look-up table | 118% | + | | | + +------------------------------------------------------------------------------------+----------------------+ + | Floating-point | 595% | + | | | + +------------------------------------------------------------------------------------+----------------------+ + | **Note**: In this case, since performance is expressed as time spent executing the operation in a | + | specific condition, any relative performance value above 100% runs slower than the reference method. | + | | + +-----------------------------------------------------------------------------------------------------------+ + +Drop Decision Block +^^^^^^^^^^^^^^^^^^^ + +The Drop Decision block: + +* Compares the average queue size with the minimum and maximum thresholds + +* Calculates a packet drop probability + +* Makes a random decision to enqueue or drop an arriving packet + +The calculation of the drop probability occurs in two stages. +An initial drop probability is calculated based on the average queue size, +the minimum and maximum thresholds and the mark probability. +An actual drop probability is then computed from the initial drop probability. +The actual drop probability takes the count run-time value into consideration +so that the actual drop probability increases as more packets arrive to the packet queue +since the last packet was dropped. + +Initial Packet Drop Probability +""""""""""""""""""""""""""""""" + +The initial drop probability is calculated using the following equation. + +.. image:: img/drop_probability_eq3.* + +Where: + +* *maxp* = mark probability + +* *avg* = average queue size + +* *minth* = minimum threshold + +* *maxth* = maximum threshold + +The calculation of the packet drop probability using Equation 3 is illustrated in :numref:`figure_pkt_drop_probability`. +If the average queue size is below the minimum threshold, an arriving packet is enqueued. +If the average queue size is at or above the maximum threshold, an arriving packet is dropped. +If the average queue size is between the minimum and maximum thresholds, +a drop probability is calculated to determine if the packet should be enqueued or dropped. + +.. _figure_pkt_drop_probability: + +.. figure:: img/pkt_drop_probability.* + + Packet Drop Probability for a Given RED Configuration + + +Actual Drop Probability +""""""""""""""""""""""" + +If the average queue size is between the minimum and maximum thresholds, +then the actual drop probability is calculated from the following equation. + +.. image:: img/drop_probability_eq4.* + +Where: + +* *Pb* = initial drop probability (from Equation 3) + +* *count* = number of packets that have arrived since the last drop + +The constant 2, in Equation 4 is the only deviation from the drop probability formulae +given in the reference document where a value of 1 is used instead. +It should be noted that the value pa computed from can be negative or greater than 1. +If this is the case, then a value of 1 should be used instead. + +The initial and actual drop probabilities are shown in :numref:`figure_drop_probability_graph`. +The actual drop probability is shown for the case where +the formula given in the reference document1 is used (blue curve) +and also for the case where the formula implemented in the dropper module, +is used (red curve). +The formula in the reference document results in a significantly higher drop rate +compared to the mark probability configuration parameter specified by the user. +The choice to deviate from the reference document is simply a design decision and +one that has been taken by other RED implementations, for example, FreeBSD* ALTQ RED. + +.. _figure_drop_probability_graph: + +.. figure:: img/drop_probability_graph.* + + Initial Drop Probability (pb), Actual Drop probability (pa) Computed Using + a Factor 1 (Blue Curve) and a Factor 2 (Red Curve) + + +.. _Queue_Empty_Operation: + +Queue Empty Operation +~~~~~~~~~~~~~~~~~~~~~ + +The time at which a packet queue becomes empty must be recorded and saved with the RED run-time data +so that the EWMA filter block can calculate the average queue size on the next enqueue operation. +It is the responsibility of the calling application to inform the dropper module +through the API that a queue has become empty. + +Source Files Location +~~~~~~~~~~~~~~~~~~~~~ + +The source files for the DPDK dropper are located at: + +* DPDK/lib/librte_sched/rte_red.h + +* DPDK/lib/librte_sched/rte_red.c + +Integration with the DPDK QoS Scheduler +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +RED functionality in the DPDK QoS scheduler is disabled by default. +To enable it, use the DPDK configuration parameter: + +:: + + CONFIG_RTE_SCHED_RED=y + +This parameter must be set to y. +The parameter is found in the build configuration files in the DPDK/config directory, +for example, DPDK/config/common_linux. +RED configuration parameters are specified in the rte_red_params structure within the rte_sched_port_params structure +that is passed to the scheduler on initialization. +RED parameters are specified separately for four traffic classes and three packet colors (green, yellow and red) +allowing the scheduler to implement Weighted Random Early Detection (WRED). + +Integration with the DPDK QoS Scheduler Sample Application +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The DPDK QoS Scheduler Application reads a configuration file on start-up. +The configuration file includes a section containing RED parameters. +The format of these parameters is described in :ref:`Section2.23.3.1 <Configuration>`. +A sample RED configuration is shown below. In this example, the queue size is 64 packets. + +.. note:: + + For correct operation, the same EWMA filter weight parameter (wred weight) should be used + for each packet color (green, yellow, red) in the same traffic class (tc). + +:: + + ; RED params per traffic class and color (Green / Yellow / Red) + + [red] + tc 0 wred min = 28 22 16 + tc 0 wred max = 32 32 32 + tc 0 wred inv prob = 10 10 10 + tc 0 wred weight = 9 9 9 + + tc 1 wred min = 28 22 16 + tc 1 wred max = 32 32 32 + tc 1 wred inv prob = 10 10 10 + tc 1 wred weight = 9 9 9 + + tc 2 wred min = 28 22 16 + tc 2 wred max = 32 32 32 + tc 2 wred inv prob = 10 10 10 + tc 2 wred weight = 9 9 9 + + tc 3 wred min = 28 22 16 + tc 3 wred max = 32 32 32 + tc 3 wred inv prob = 10 10 10 + tc 3 wred weight = 9 9 9 + + tc 4 wred min = 28 22 16 + tc 4 wred max = 32 32 32 + tc 4 wred inv prob = 10 10 10 + tc 4 wred weight = 9 9 9 + + tc 5 wred min = 28 22 16 + tc 5 wred max = 32 32 32 + tc 5 wred inv prob = 10 10 10 + tc 5 wred weight = 9 9 9 + + tc 6 wred min = 28 22 16 + tc 6 wred max = 32 32 32 + tc 6 wred inv prob = 10 10 10 + tc 6 wred weight = 9 9 9 + + tc 7 wred min = 28 22 16 + tc 7 wred max = 32 32 32 + tc 7 wred inv prob = 10 10 10 + tc 7 wred weight = 9 9 9 + + tc 8 wred min = 28 22 16 + tc 8 wred max = 32 32 32 + tc 8 wred inv prob = 10 10 10 + tc 8 wred weight = 9 9 9 + + tc 9 wred min = 28 22 16 + tc 9 wred max = 32 32 32 + tc 9 wred inv prob = 10 10 10 + tc 9 wred weight = 9 9 9 + + + tc 10 wred min = 28 22 16 + tc 10 wred max = 32 32 32 + tc 10 wred inv prob = 10 10 10 + tc 10 wred weight = 9 9 9 + + tc 11 wred min = 28 22 16 + tc 11 wred max = 32 32 32 + tc 11 wred inv prob = 10 10 10 + tc 11 wred weight = 9 9 9 + + tc 12 wred min = 28 22 16 + tc 12 wred max = 32 32 32 + tc 12 wred inv prob = 10 10 10 + tc 12 wred weight = 9 9 9 + +With this configuration file, the RED configuration that applies to green, +yellow and red packets in traffic class 0 is shown in :numref:`table_qos_18`. + +.. _table_qos_18: + +.. table:: RED Configuration Corresponding to RED Configuration File + + +--------------------+--------------------+-------+--------+-----+ + | RED Parameter | Configuration Name | Green | Yellow | Red | + | | | | | | + +====================+====================+=======+========+=====+ + | Minimum Threshold | tc 0 wred min | 28 | 22 | 16 | + | | | | | | + +--------------------+--------------------+-------+--------+-----+ + | Maximum Threshold | tc 0 wred max | 32 | 32 | 32 | + | | | | | | + +--------------------+--------------------+-------+--------+-----+ + | Mark Probability | tc 0 wred inv prob | 10 | 10 | 10 | + | | | | | | + +--------------------+--------------------+-------+--------+-----+ + | EWMA Filter Weight | tc 0 wred weight | 9 | 9 | 9 | + | | | | | | + +--------------------+--------------------+-------+--------+-----+ + +Application Programming Interface (API) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Enqueue API +^^^^^^^^^^^ + +The syntax of the enqueue API is as follows: + +.. code-block:: c + + int rte_red_enqueue(const struct rte_red_config *red_cfg, struct rte_red *red, const unsigned q, const uint64_t time) + + +The arguments passed to the enqueue API are configuration data, run-time data, +the current size of the packet queue (in packets) and a value representing the current time. +The time reference is in units of bytes, +where a byte signifies the time duration required by the physical interface to send out a byte on the transmission medium +(see Section 26.2.4.5.1 "Internal Time Reference" ). +The dropper reuses the scheduler time stamps for performance reasons. + +Empty API +^^^^^^^^^ + +The syntax of the empty API is as follows: + +.. code-block:: c + + void rte_red_mark_queue_empty(struct rte_red *red, const uint64_t time) + +The arguments passed to the empty API are run-time data and the current time in bytes. + +Traffic Metering +---------------- + +The traffic metering component implements the Single Rate Three Color Marker (srTCM) and +Two Rate Three Color Marker (trTCM) algorithms, as defined by IETF RFC 2697 and 2698 respectively. +These algorithms meter the stream of incoming packets based on the allowance defined in advance for each traffic flow. +As result, each incoming packet is tagged as green, +yellow or red based on the monitored consumption of the flow the packet belongs to. + +Functional Overview +~~~~~~~~~~~~~~~~~~~ + +The srTCM algorithm defines two token buckets for each traffic flow, +with the two buckets sharing the same token update rate: + +* Committed (C) bucket: fed with tokens at the rate defined by the Committed Information Rate (CIR) parameter + (measured in IP packet bytes per second). + The size of the C bucket is defined by the Committed Burst Size (CBS) parameter (measured in bytes); + +* Excess (E) bucket: fed with tokens at the same rate as the C bucket. + The size of the E bucket is defined by the Excess Burst Size (EBS) parameter (measured in bytes). + +The trTCM algorithm defines two token buckets for each traffic flow, +with the two buckets being updated with tokens at independent rates: + +* Committed (C) bucket: fed with tokens at the rate defined by the Committed Information Rate (CIR) parameter + (measured in bytes of IP packet per second). + The size of the C bucket is defined by the Committed Burst Size (CBS) parameter (measured in bytes); + +* Peak (P) bucket: fed with tokens at the rate defined by the Peak Information Rate (PIR) parameter + (measured in IP packet bytes per second). + The size of the P bucket is defined by the Peak Burst Size (PBS) parameter (measured in bytes). + +Please refer to RFC 2697 (for srTCM) and RFC 2698 (for trTCM) for details on how tokens are consumed +from the buckets and how the packet color is determined. + +Color Blind and Color Aware Modes +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For both algorithms, the color blind mode is functionally equivalent to the color aware mode with input color set as green. +For color aware mode, a packet with red input color can only get the red output color, +while a packet with yellow input color can only get the yellow or red output colors. + +The reason why the color blind mode is still implemented distinctly than the color aware mode is +that color blind mode can be implemented with fewer operations than the color aware mode. + +Implementation Overview +~~~~~~~~~~~~~~~~~~~~~~~ + +For each input packet, the steps for the srTCM / trTCM algorithms are: + +* Update the C and E / P token buckets. This is done by reading the current time (from the CPU timestamp counter), + identifying the amount of time since the last bucket update and computing the associated number of tokens + (according to the pre-configured bucket rate). + The number of tokens in the bucket is limited by the pre-configured bucket size; + +* Identify the output color for the current packet based on the size of the IP packet + and the amount of tokens currently available in the C and E / P buckets; for color aware mode only, + the input color of the packet is also considered. + When the output color is not red, a number of tokens equal to the length of the IP packet are + subtracted from the C or E /P or both buckets, depending on the algorithm and the output color of the packet. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/rawdev.rst b/src/spdk/dpdk/doc/guides/prog_guide/rawdev.rst new file mode 100644 index 000000000..a712c7fa9 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/rawdev.rst @@ -0,0 +1,107 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2018 NXP + +Rawdevice Library +================= + +Introduction +------------ + +In terms of device flavor (type) support, DPDK currently has ethernet +(lib_ether), cryptodev (libcryptodev), eventdev (libeventdev) and vdev +(virtual device) support. + +For a new type of device, for example an accelerator, there are not many +options except: +1. create another lib/librte_MySpecialDev, driver/MySpecialDrv and use it +through Bus/PMD model. +2. Or, create a vdev and implement necessary custom APIs which are directly +exposed from driver layer. However this may still require changes in bus code +in DPDK. + +The DPDK Rawdev library is an abstraction that provides the DPDK framework a +way to manage such devices in a generic manner without expecting changes to +library or EAL for each device type. This library provides a generic set of +operations and APIs for framework and Applications to use, respectively, for +interfacing with such type of devices. + +Design +------ + +Key factors guiding design of the Rawdevice library: + +1. Following are some generic operations which can be treated as applicable + to a large subset of device types. None of the operations are mandatory to + be implemented by a driver. Application should also be designed for proper + handling for unsupported APIs. + + * Device Start/Stop - In some cases, 'reset' might also be required which + has different semantics than a start-stop-start cycle. + * Configuration - Device, Queue or any other sub-system configuration + * I/O - Sending a series of buffers which can enclose any arbitrary data + * Statistics - Fetch arbitrary device statistics + * Firmware Management - Firmware load/unload/status + +2. Application API should be able to pass along arbitrary state information + to/from device driver. This can be achieved by maintaining context + information through opaque data or pointers. + +Figure below outlines the layout of the rawdevice library and device vis-a-vis +other well known device types like eth and crypto: + +.. code-block:: console + + +-----------------------------------------------------------+ + | Application(s) | + +------------------------------.----------------------------+ + | + | + +------------------------------'----------------------------+ + | DPDK Framework (APIs) | + +--------------|----|-----------------|---------------------+ + / \ \ + (crypto ops) (eth ops) (rawdev ops) +----+ + / \ \ |DrvA| + +-----'---+ +----`----+ +---'-----+ +----+ + | crypto | | ethdev | | raw | + +--/------+ +---/-----+ +----/----+ +----+ + /\ __/\ / ..........|DrvB| + / \ / \ / ../ \ +----+ + +====+ +====+ +====+ +====+ +==/=+ ```Bus Probe + |DevA| |DevB| |DevC| |DevD| |DevF| + +====+ +====+ +====+ +====+ +====+ + | | | | | + ``|``````|````````|``````|`````````````````|````````Bus Scan + (PCI) | (PCI) (PCI) (PCI) + (BusA) + + * It is assumed above that DrvB is a PCI type driver which registers itself + with PCI Bus + * Thereafter, when the PCI scan is done, during probe DrvB would match the + rawdev DevF ID and take control of device + * Applications can then continue using the device through rawdev API + interfaces + + +Device Identification +~~~~~~~~~~~~~~~~~~~~~ + +Physical rawdev devices are discovered during the Bus scan executed at DPDK +initialization, based on their identification and probing with corresponding +driver. Thus, a generic device needs to have an identifier and a driver +capable of identifying it through this identifier. + +Virtual devices can be created by two mechanisms, either using the EAL command +line options or from within the application using an EAL API directly. + +From the command line using the --vdev EAL option + +.. code-block:: console + + --vdev 'rawdev_dev1' + +Or using the rte_vdev_init API within the application code. + +.. code-block:: c + + rte_vdev_init("rawdev_dev1", NULL) diff --git a/src/spdk/dpdk/doc/guides/prog_guide/rcu_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/rcu_lib.rst new file mode 100644 index 000000000..d142d0c79 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/rcu_lib.rst @@ -0,0 +1,251 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2019 Arm Limited. + +.. _RCU_Library: + +RCU Library +============ + +Lockless data structures provide scalability and determinism. +They enable use cases where locking may not be allowed +(for example real-time applications). + +In the following sections, the term "memory" refers to memory allocated +by typical APIs like malloc() or anything that is representative of +memory, for example an index of a free element array. + +Since these data structures are lockless, the writers and readers +are accessing the data structures concurrently. Hence, while removing +an element from a data structure, the writers cannot return the memory +to the allocator, without knowing that the readers are not +referencing that element/memory anymore. Hence, it is required to +separate the operation of removing an element into two steps: + +#. Delete: in this step, the writer removes the reference to the element from + the data structure but does not return the associated memory to the + allocator. This will ensure that new readers will not get a reference to + the removed element. Removing the reference is an atomic operation. + +#. Free (Reclaim): in this step, the writer returns the memory to the + memory allocator only after knowing that all the readers have stopped + referencing the deleted element. + +This library helps the writer determine when it is safe to free the +memory by making use of thread Quiescent State (QS). + +What is Quiescent State +----------------------- + +Quiescent State can be defined as "any point in the thread execution where the +thread does not hold a reference to shared memory". It is the responsibility of +the application to determine its quiescent state. + +Let us consider the following diagram: + +.. _figure_quiescent_state: + +.. figure:: img/rcu_general_info.* + + Phases in the Quiescent State model. + + +As shown in :numref:`figure_quiescent_state`, reader thread 1 accesses data +structures D1 and D2. When it is accessing D1, if the writer has to remove an +element from D1, the writer cannot free the memory associated with that +element immediately. The writer can return the memory to the allocator only +after the reader stops referencing D1. In other words, reader thread RT1 has +to enter a quiescent state. + +Similarly, since reader thread 2 is also accessing D1, the writer has to +wait till thread 2 enters quiescent state as well. + +However, the writer does not need to wait for reader thread 3 to enter +quiescent state. Reader thread 3 was not accessing D1 when the delete +operation happened. So, reader thread 3 will not have a reference to the +deleted entry. + +It can be noted that, the critical sections for D2 is a quiescent state +for D1. i.e. for a given data structure Dx, any point in the thread execution +that does not reference Dx is a quiescent state. + +Since memory is not freed immediately, there might be a need for +provisioning of additional memory, depending on the application requirements. + +Factors affecting the RCU mechanism +----------------------------------- + +It is important to make sure that this library keeps the overhead of +identifying the end of grace period and subsequent freeing of memory, +to a minimum. The following paras explain how grace period and critical +section affect this overhead. + +The writer has to poll the readers to identify the end of grace period. +Polling introduces memory accesses and wastes CPU cycles. The memory +is not available for reuse during the grace period. Longer grace periods +exasperate these conditions. + +The length of the critical section and the number of reader threads +is proportional to the duration of the grace period. Keeping the critical +sections smaller will keep the grace period smaller. However, keeping the +critical sections smaller requires additional CPU cycles (due to additional +reporting) in the readers. + +Hence, we need the characteristics of a small grace period and large critical +section. This library addresses these characteristics by allowing the writer +to do other work without having to block until the readers report their +quiescent state. + +RCU in DPDK +----------- + +For DPDK applications, the beginning and end of a ``while(1)`` loop (where no +references to shared data structures are kept) act as perfect quiescent +states. This will combine all the shared data structure accesses into a +single, large critical section which helps keep the overhead on the +reader side to a minimum. + +DPDK supports a pipeline model of packet processing and service cores. +In these use cases, a given data structure may not be used by all the +workers in the application. The writer has to wait only for the workers that +use the data structure to report their quiescent state. To provide the required +flexibility, this library has a concept of a QS variable. If required, the +application can create one QS variable per data structure to help it track the +end of grace period for each data structure. This helps keep the length of grace +period to a minimum. + +How to use this library +----------------------- + +The application must allocate memory and initialize a QS variable. + +Applications can call ``rte_rcu_qsbr_get_memsize()`` to calculate the size +of memory to allocate. This API takes a maximum number of reader threads, +using this variable, as a parameter. + +Further, the application can initialize a QS variable using the API +``rte_rcu_qsbr_init()``. + +Each reader thread is assumed to have a unique thread ID. Currently, the +management of the thread ID (for example allocation/free) is left to the +application. The thread ID should be in the range of 0 to +maximum number of threads provided while creating the QS variable. +The application could also use ``lcore_id`` as the thread ID where applicable. + +The ``rte_rcu_qsbr_thread_register()`` API will register a reader thread +to report its quiescent state. This can be called from a reader thread. +A control plane thread can also call this on behalf of a reader thread. +The reader thread must call ``rte_rcu_qsbr_thread_online()`` API to start +reporting its quiescent state. + +Some of the use cases might require the reader threads to make blocking API +calls (for example while using eventdev APIs). The writer thread should not +wait for such reader threads to enter quiescent state. The reader thread must +call ``rte_rcu_qsbr_thread_offline()`` API, before calling blocking APIs. It +can call ``rte_rcu_qsbr_thread_online()`` API once the blocking API call +returns. + +The writer thread can trigger the reader threads to report their quiescent +state by calling the API ``rte_rcu_qsbr_start()``. It is possible for multiple +writer threads to query the quiescent state status simultaneously. Hence, +``rte_rcu_qsbr_start()`` returns a token to each caller. + +The writer thread must call ``rte_rcu_qsbr_check()`` API with the token to +get the current quiescent state status. Option to block till all the reader +threads enter the quiescent state is provided. If this API indicates that +all the reader threads have entered the quiescent state, the application +can free the deleted entry. + +The APIs ``rte_rcu_qsbr_start()`` and ``rte_rcu_qsbr_check()`` are lock free. +Hence, they can be called concurrently from multiple writers even while +running as worker threads. + +The separation of triggering the reporting from querying the status provides +the writer threads flexibility to do useful work instead of blocking for the +reader threads to enter the quiescent state or go offline. This reduces the +memory accesses due to continuous polling for the status. But, since the +resource is freed at a later time, the token and the reference to the deleted +resource need to be stored for later queries. + +The ``rte_rcu_qsbr_synchronize()`` API combines the functionality of +``rte_rcu_qsbr_start()`` and blocking ``rte_rcu_qsbr_check()`` into a single +API. This API triggers the reader threads to report their quiescent state and +polls till all the readers enter the quiescent state or go offline. This API +does not allow the writer to do useful work while waiting and introduces +additional memory accesses due to continuous polling. However, the application +does not have to store the token or the reference to the deleted resource. The +resource can be freed immediately after ``rte_rcu_qsbr_synchronize()`` API +returns. + +The reader thread must call ``rte_rcu_qsbr_thread_offline()`` and +``rte_rcu_qsbr_thread_unregister()`` APIs to remove itself from reporting its +quiescent state. The ``rte_rcu_qsbr_check()`` API will not wait for this reader +thread to report the quiescent state status anymore. + +The reader threads should call ``rte_rcu_qsbr_quiescent()`` API to indicate that +they entered a quiescent state. This API checks if a writer has triggered a +quiescent state query and update the state accordingly. + +The ``rte_rcu_qsbr_lock()`` and ``rte_rcu_qsbr_unlock()`` are empty functions. +However, when ``CONFIG_RTE_LIBRTE_RCU_DEBUG`` is enabled, these APIs aid +in debugging issues. One can mark the access to shared data structures on the +reader side using these APIs. The ``rte_rcu_qsbr_quiescent()`` will check if +all the locks are unlocked. + +Resource reclamation framework for DPDK +--------------------------------------- + +Lock-free algorithms place additional burden of resource reclamation on +the application. When a writer deletes an entry from a data structure, the writer: + +#. Has to start the grace period +#. Has to store a reference to the deleted resources in a FIFO +#. Should check if the readers have completed a grace period and free the resources. + +There are several APIs provided to help with this process. The writer +can create a FIFO to store the references to deleted resources using ``rte_rcu_qsbr_dq_create()``. +The resources can be enqueued to this FIFO using ``rte_rcu_qsbr_dq_enqueue()``. +If the FIFO is full, ``rte_rcu_qsbr_dq_enqueue`` will reclaim the resources before enqueuing. It will also reclaim resources on regular basis to keep the FIFO from growing too large. If the writer runs out of resources, the writer can call ``rte_rcu_qsbr_dq_reclaim`` API to reclaim resources. ``rte_rcu_qsbr_dq_delete`` is provided to reclaim any remaining resources and free the FIFO while shutting down. + +However, if this resource reclamation process were to be integrated in lock-free data structure libraries, it +hides this complexity from the application and makes it easier for the application to adopt lock-free algorithms. The following paragraphs discuss how the reclamation process can be integrated in DPDK libraries. + +In any DPDK application, the resource reclamation process using QSBR can be split into 4 parts: + +#. Initialization +#. Quiescent State Reporting +#. Reclaiming Resources +#. Shutdown + +The design proposed here assigns different parts of this process to client libraries and applications. The term 'client library' refers to lock-free data structure libraries such at rte_hash, rte_lpm etc. in DPDK or similar libraries outside of DPDK. The term 'application' refers to the packet processing application that makes use of DPDK such as L3 Forwarding example application, OVS, VPP etc.. + +The application has to handle 'Initialization' and 'Quiescent State Reporting'. So, + +* the application has to create the RCU variable and register the reader threads to report their quiescent state. +* the application has to register the same RCU variable with the client library. +* reader threads in the application have to report the quiescent state. This allows for the application to control the length of the critical section/how frequently the application wants to report the quiescent state. + +The client library will handle 'Reclaiming Resources' part of the process. The +client libraries will make use of the writer thread context to execute the memory +reclamation algorithm. So, + +* client library should provide an API to register a RCU variable that it will use. It should call ``rte_rcu_qsbr_dq_create()`` to create the FIFO to store the references to deleted entries. +* client library should use ``rte_rcu_qsbr_dq_enqueue`` to enqueue the deleted resources on the FIFO and start the grace period. +* if the library runs out of resources while adding entries, it should call ``rte_rcu_qsbr_dq_reclaim`` to reclaim the resources and try the resource allocation again. + +The 'Shutdown' process needs to be shared between the application and the +client library. + +* the application should make sure that the reader threads are not using the shared data structure, unregister the reader threads from the QSBR variable before calling the client library's shutdown function. + +* client library should call ``rte_rcu_qsbr_dq_delete`` to reclaim any remaining resources and free the FIFO. + +Integrating the resource reclamation with client libraries removes the burden from +the application and makes it easy to use lock-free algorithms. + +This design has several advantages over currently known methods. + +#. Application does not need a dedicated thread to reclaim resources. Memory + reclamation happens as part of the writer thread with little impact on + performance. +#. The client library has better control over the resources. For example: the client + library can attempt to reclaim when it has run out of resources. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/reorder_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/reorder_lib.rst new file mode 100644 index 000000000..8e95e2645 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/reorder_lib.rst @@ -0,0 +1,88 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2015 Intel Corporation. + +.. _Reorder_Library: + +Reorder Library +================= + +The Reorder Library provides a mechanism for reordering mbufs based on their +sequence number. + +Operation +---------- + +The reorder library is essentially a buffer that reorders mbufs. +The user inserts out of order mbufs into the reorder buffer and pulls in-order +mbufs from it. + +At a given time, the reorder buffer contains mbufs whose sequence number are +inside the sequence window. The sequence window is determined by the minimum +sequence number and the number of entries that the buffer was configured to hold. +For example, given a reorder buffer with 200 entries and a minimum sequence +number of 350, the sequence window has low and high limits of 350 and 550 +respectively. + +When inserting mbufs, the reorder library differentiates between valid, early +and late mbufs depending on the sequence number of the inserted mbuf: + +* valid: the sequence number is inside the window. +* late: the sequence number is outside the window and less than the low limit. +* early: the sequence number is outside the window and greater than the high + limit. + +The reorder buffer directly returns late mbufs and tries to accommodate early +mbufs. + + +Implementation Details +------------------------- + +The reorder library is implemented as a pair of buffers, which referred to as +the *Order* buffer and the *Ready* buffer. + +On an insert call, valid mbufs are inserted directly into the Order buffer and +late mbufs are returned to the user with an error. + +In the case of early mbufs, the reorder buffer will try to move the window +(incrementing the minimum sequence number) so that the mbuf becomes a valid one. +To that end, mbufs in the Order buffer are moved into the Ready buffer. +Any mbufs that have not arrived yet are ignored and therefore will become +late mbufs. +This means that as long as there is room in the Ready buffer, the window will +be moved to accommodate early mbufs that would otherwise be outside the +reordering window. + +For example, assuming that we have a buffer of 200 entries with a 350 minimum +sequence number, and we need to insert an early mbuf with 565 sequence number. +That means that we would need to move the windows at least 15 positions to +accommodate the mbuf. +The reorder buffer would try to move mbufs from at least the next 15 slots in +the Order buffer to the Ready buffer, as long as there is room in the Ready buffer. +Any gaps in the Order buffer at that point are skipped, and those packet will +be reported as late packets when they arrive. The process of moving packets +to the Ready buffer continues beyond the minimum required until a gap, +i.e. missing mbuf, in the Order buffer is encountered. + +When draining mbufs, the reorder buffer would return mbufs in the Ready +buffer first and then from the Order buffer until a gap is found (mbufs that +have not arrived yet). + +Use Case: Packet Distributor +------------------------------- + +An application using the DPDK packet distributor could make use of the reorder +library to transmit packets in the same order they were received. + +A basic packet distributor use case would consist of a distributor with +multiple workers cores. +The processing of packets by the workers is not guaranteed to be in order, +hence a reorder buffer can be used to order as many packets as possible. + +In such a scenario, the distributor assigns a sequence number to mbufs before +delivering them to the workers. +As the workers finish processing the packets, the distributor inserts those +mbufs into the reorder buffer and finally transmit drained mbufs. + +NOTE: Currently the reorder buffer is not thread safe so the same thread is +responsible for inserting and draining mbufs. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/ring_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/ring_lib.rst new file mode 100644 index 000000000..f0a5a78b0 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/ring_lib.rst @@ -0,0 +1,454 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +.. _Ring_Library: + +Ring Library +============ + +The ring allows the management of queues. +Instead of having a linked list of infinite size, the rte_ring has the following properties: + +* FIFO + +* Maximum size is fixed, the objects are stored in a table + +* Objects can be pointers or elements of multiple of 4 byte size + +* Lockless implementation + +* Multi-consumer or single-consumer dequeue + +* Multi-producer or single-producer enqueue + +* Bulk dequeue - Dequeues the specified count of objects if successful; otherwise fails + +* Bulk enqueue - Enqueues the specified count of objects if successful; otherwise fails + +* Burst dequeue - Dequeue the maximum available objects if the specified count cannot be fulfilled + +* Burst enqueue - Enqueue the maximum available objects if the specified count cannot be fulfilled + +The advantages of this data structure over a linked list queue are as follows: + +* Faster; only requires a single 32 bit Compare-And-Swap instruction instead of several pointer size Compare-And-Swap instructions. + +* Simpler than a full lockless queue. + +* Adapted to bulk enqueue/dequeue operations. + As objects are stored in a table, a dequeue of several objects will not produce as many cache misses as in a linked queue. + Also, a bulk dequeue of many objects does not cost more than a dequeue of a simple object. + +The disadvantages: + +* Size is fixed + +* Having many rings costs more in terms of memory than a linked list queue. An empty ring contains at least N objects. + +A simplified representation of a Ring is shown in with consumer and producer head and tail pointers to objects stored in the data structure. + +.. _figure_ring1: + +.. figure:: img/ring1.* + + Ring Structure + + +References for Ring Implementation in FreeBSD* +---------------------------------------------- + +The following code was added in FreeBSD 8.0, and is used in some network device drivers (at least in Intel drivers): + + * `bufring.h in FreeBSD <http://svn.freebsd.org/viewvc/base/release/8.0.0/sys/sys/buf_ring.h?revision=199625&view=markup>`_ + + * `bufring.c in FreeBSD <http://svn.freebsd.org/viewvc/base/release/8.0.0/sys/kern/subr_bufring.c?revision=199625&view=markup>`_ + +Lockless Ring Buffer in Linux* +------------------------------ + +The following is a link describing the `Linux Lockless Ring Buffer Design <http://lwn.net/Articles/340400/>`_. + +Additional Features +------------------- + +Name +~~~~ + +A ring is identified by a unique name. +It is not possible to create two rings with the same name (rte_ring_create() returns NULL if this is attempted). + +Use Cases +--------- + +Use cases for the Ring library include: + + * Communication between applications in the DPDK + + * Used by memory pool allocator + +Anatomy of a Ring Buffer +------------------------ + +This section explains how a ring buffer operates. +The ring structure is composed of two head and tail couples; one is used by producers and one is used by the consumers. +The figures of the following sections refer to them as prod_head, prod_tail, cons_head and cons_tail. + +Each figure represents a simplified state of the ring, which is a circular buffer. +The content of the function local variables is represented on the top of the figure, +and the content of ring structure is represented on the bottom of the figure. + +Single Producer Enqueue +~~~~~~~~~~~~~~~~~~~~~~~ + +This section explains what occurs when a producer adds an object to the ring. +In this example, only the producer head and tail (prod_head and prod_tail) are modified, +and there is only one producer. + +The initial state is to have a prod_head and prod_tail pointing at the same location. + +Enqueue First Step +^^^^^^^^^^^^^^^^^^ + +First, *ring->prod_head* and ring->cons_tail are copied in local variables. +The prod_next local variable points to the next element of the table, or several elements after in case of bulk enqueue. + +If there is not enough room in the ring (this is detected by checking cons_tail), it returns an error. + + +.. _figure_ring-enqueue1: + +.. figure:: img/ring-enqueue1.* + + Enqueue first step + + +Enqueue Second Step +^^^^^^^^^^^^^^^^^^^ + +The second step is to modify *ring->prod_head* in ring structure to point to the same location as prod_next. + +The added object is copied in the ring (obj4). + + +.. _figure_ring-enqueue2: + +.. figure:: img/ring-enqueue2.* + + Enqueue second step + + +Enqueue Last Step +^^^^^^^^^^^^^^^^^ + +Once the object is added in the ring, ring->prod_tail in the ring structure is modified to point to the same location as *ring->prod_head*. +The enqueue operation is finished. + + +.. _figure_ring-enqueue3: + +.. figure:: img/ring-enqueue3.* + + Enqueue last step + + +Single Consumer Dequeue +~~~~~~~~~~~~~~~~~~~~~~~ + +This section explains what occurs when a consumer dequeues an object from the ring. +In this example, only the consumer head and tail (cons_head and cons_tail) are modified and there is only one consumer. + +The initial state is to have a cons_head and cons_tail pointing at the same location. + +Dequeue First Step +^^^^^^^^^^^^^^^^^^ + +First, ring->cons_head and ring->prod_tail are copied in local variables. +The cons_next local variable points to the next element of the table, or several elements after in the case of bulk dequeue. + +If there are not enough objects in the ring (this is detected by checking prod_tail), it returns an error. + + +.. _figure_ring-dequeue1: + +.. figure:: img/ring-dequeue1.* + + Dequeue last step + + +Dequeue Second Step +^^^^^^^^^^^^^^^^^^^ + +The second step is to modify ring->cons_head in the ring structure to point to the same location as cons_next. + +The dequeued object (obj1) is copied in the pointer given by the user. + + +.. _figure_ring-dequeue2: + +.. figure:: img/ring-dequeue2.* + + Dequeue second step + + +Dequeue Last Step +^^^^^^^^^^^^^^^^^ + +Finally, ring->cons_tail in the ring structure is modified to point to the same location as ring->cons_head. +The dequeue operation is finished. + + +.. _figure_ring-dequeue3: + +.. figure:: img/ring-dequeue3.* + + Dequeue last step + + +Multiple Producers Enqueue +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section explains what occurs when two producers concurrently add an object to the ring. +In this example, only the producer head and tail (prod_head and prod_tail) are modified. + +The initial state is to have a prod_head and prod_tail pointing at the same location. + +Multiple Producers Enqueue First Step +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +On both cores, *ring->prod_head* and ring->cons_tail are copied in local variables. +The prod_next local variable points to the next element of the table, +or several elements after in the case of bulk enqueue. + +If there is not enough room in the ring (this is detected by checking cons_tail), it returns an error. + + +.. _figure_ring-mp-enqueue1: + +.. figure:: img/ring-mp-enqueue1.* + + Multiple producer enqueue first step + + +Multiple Producers Enqueue Second Step +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The second step is to modify ring->prod_head in the ring structure to point to the same location as prod_next. +This operation is done using a Compare And Swap (CAS) instruction, which does the following operations atomically: + +* If ring->prod_head is different to local variable prod_head, + the CAS operation fails, and the code restarts at first step. + +* Otherwise, ring->prod_head is set to local prod_next, + the CAS operation is successful, and processing continues. + +In the figure, the operation succeeded on core 1, and step one restarted on core 2. + + +.. _figure_ring-mp-enqueue2: + +.. figure:: img/ring-mp-enqueue2.* + + Multiple producer enqueue second step + + +Multiple Producers Enqueue Third Step +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The CAS operation is retried on core 2 with success. + +The core 1 updates one element of the ring(obj4), and the core 2 updates another one (obj5). + + +.. _figure_ring-mp-enqueue3: + +.. figure:: img/ring-mp-enqueue3.* + + Multiple producer enqueue third step + + +Multiple Producers Enqueue Fourth Step +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each core now wants to update ring->prod_tail. +A core can only update it if ring->prod_tail is equal to the prod_head local variable. +This is only true on core 1. The operation is finished on core 1. + + +.. _figure_ring-mp-enqueue4: + +.. figure:: img/ring-mp-enqueue4.* + + Multiple producer enqueue fourth step + + +Multiple Producers Enqueue Last Step +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Once ring->prod_tail is updated by core 1, core 2 is allowed to update it too. +The operation is also finished on core 2. + + +.. _figure_ring-mp-enqueue5: + +.. figure:: img/ring-mp-enqueue5.* + + Multiple producer enqueue last step + + +Modulo 32-bit Indexes +~~~~~~~~~~~~~~~~~~~~~ + +In the preceding figures, the prod_head, prod_tail, cons_head and cons_tail indexes are represented by arrows. +In the actual implementation, these values are not between 0 and size(ring)-1 as would be assumed. +The indexes are between 0 and 2^32 -1, and we mask their value when we access the object table (the ring itself). +32-bit modulo also implies that operations on indexes (such as, add/subtract) will automatically do 2^32 modulo +if the result overflows the 32-bit number range. + +The following are two examples that help to explain how indexes are used in a ring. + +.. note:: + + To simplify the explanation, operations with modulo 16-bit are used instead of modulo 32-bit. + In addition, the four indexes are defined as unsigned 16-bit integers, + as opposed to unsigned 32-bit integers in the more realistic case. + + +.. _figure_ring-modulo1: + +.. figure:: img/ring-modulo1.* + + Modulo 32-bit indexes - Example 1 + + +This ring contains 11000 entries. + + +.. _figure_ring-modulo2: + +.. figure:: img/ring-modulo2.* + + Modulo 32-bit indexes - Example 2 + + +This ring contains 12536 entries. + +.. note:: + + For ease of understanding, we use modulo 65536 operations in the above examples. + In real execution cases, this is redundant for low efficiency, but is done automatically when the result overflows. + +The code always maintains a distance between producer and consumer between 0 and size(ring)-1. +Thanks to this property, we can do subtractions between 2 index values in a modulo-32bit base: +that's why the overflow of the indexes is not a problem. + +At any time, entries and free_entries are between 0 and size(ring)-1, +even if only the first term of subtraction has overflowed: + +.. code-block:: c + + uint32_t entries = (prod_tail - cons_head); + uint32_t free_entries = (mask + cons_tail -prod_head); + +Producer/consumer synchronization modes +--------------------------------------- + +rte_ring supports different synchronization modes for producers and consumers. +These modes can be specified at ring creation/init time via ``flags`` +parameter. +That should help users to configure ring in the most suitable way for his +specific usage scenarios. +Currently supported modes: + +MP/MC (default one) +~~~~~~~~~~~~~~~~~~~ + +Multi-producer (/multi-consumer) mode. This is a default enqueue (/dequeue) +mode for the ring. In this mode multiple threads can enqueue (/dequeue) +objects to (/from) the ring. For 'classic' DPDK deployments (with one thread +per core) this is usually the most suitable and fastest synchronization mode. +As a well known limitation - it can perform quite pure on some overcommitted +scenarios. + +SP/SC +~~~~~ +Single-producer (/single-consumer) mode. In this mode only one thread at a time +is allowed to enqueue (/dequeue) objects to (/from) the ring. + +MP_RTS/MC_RTS +~~~~~~~~~~~~~ + +Multi-producer (/multi-consumer) with Relaxed Tail Sync (RTS) mode. +The main difference from the original MP/MC algorithm is that +tail value is increased not by every thread that finished enqueue/dequeue, +but only by the last one. +That allows threads to avoid spinning on ring tail value, +leaving actual tail value change to the last thread at a given instance. +That technique helps to avoid the Lock-Waiter-Preemption (LWP) problem on tail +update and improves average enqueue/dequeue times on overcommitted systems. +To achieve that RTS requires 2 64-bit CAS for each enqueue(/dequeue) operation: +one for head update, second for tail update. +In comparison the original MP/MC algorithm requires one 32-bit CAS +for head update and waiting/spinning on tail value. + +MP_HTS/MC_HTS +~~~~~~~~~~~~~ + +Multi-producer (/multi-consumer) with Head/Tail Sync (HTS) mode. +In that mode enqueue/dequeue operation is fully serialized: +at any given moment only one enqueue/dequeue operation can proceed. +This is achieved by allowing a thread to proceed with changing ``head.value`` +only when ``head.value == tail.value``. +Both head and tail values are updated atomically (as one 64-bit value). +To achieve that 64-bit CAS is used by head update routine. +That technique also avoids the Lock-Waiter-Preemption (LWP) problem on tail +update and helps to improve ring enqueue/dequeue behavior in overcommitted +scenarios. Another advantage of fully serialized producer/consumer - +it provides the ability to implement MT safe peek API for rte_ring. + +Ring Peek API +------------- + +For ring with serialized producer/consumer (HTS sync mode) it is possible +to split public enqueue/dequeue API into two phases: + +* enqueue/dequeue start + +* enqueue/dequeue finish + +That allows user to inspect objects in the ring without removing them +from it (aka MT safe peek) and reserve space for the objects in the ring +before actual enqueue. +Note that this API is available only for two sync modes: + +* Single Producer/Single Consumer (SP/SC) + +* Multi-producer/Multi-consumer with Head/Tail Sync (HTS) + +It is a user responsibility to create/init ring with appropriate sync modes +selected. As an example of usage: + +.. code-block:: c + + /* read 1 elem from the ring: */ + uint32_t n = rte_ring_dequeue_bulk_start(ring, &obj, 1, NULL); + if (n != 0) { + /* examine object */ + if (object_examine(obj) == KEEP) + /* decided to keep it in the ring. */ + rte_ring_dequeue_finish(ring, 0); + else + /* decided to remove it from the ring. */ + rte_ring_dequeue_finish(ring, n); + } + +Note that between ``_start_`` and ``_finish_`` none other thread can proceed +with enqueue(/dequeue) operation till ``_finish_`` completes. + +References +---------- + + * `bufring.h in FreeBSD <http://svn.freebsd.org/viewvc/base/release/8.0.0/sys/sys/buf_ring.h?revision=199625&view=markup>`_ (version 8) + + * `bufring.c in FreeBSD <http://svn.freebsd.org/viewvc/base/release/8.0.0/sys/kern/subr_bufring.c?revision=199625&view=markup>`_ (version 8) + + * `Linux Lockless Ring Buffer Design <http://lwn.net/Articles/340400/>`_ diff --git a/src/spdk/dpdk/doc/guides/prog_guide/rte_flow.rst b/src/spdk/dpdk/doc/guides/prog_guide/rte_flow.rst new file mode 100644 index 000000000..d5dd18ce9 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/rte_flow.rst @@ -0,0 +1,3251 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2016 6WIND S.A. + Copyright 2016 Mellanox Technologies, Ltd + +Generic flow API (rte_flow) +=========================== + +Overview +-------- + +This API provides a generic means to configure hardware to match specific +ingress or egress traffic, alter its fate and query related counters +according to any number of user-defined rules. + +It is named *rte_flow* after the prefix used for all its symbols, and is +defined in ``rte_flow.h``. + +- Matching can be performed on packet data (protocol headers, payload) and + properties (e.g. associated physical port, virtual device function ID). + +- Possible operations include dropping traffic, diverting it to specific + queues, to virtual/physical device functions or ports, performing tunnel + offloads, adding marks and so on. + +It is slightly higher-level than the legacy filtering framework which it +encompasses and supersedes (including all functions and filter types) in +order to expose a single interface with an unambiguous behavior that is +common to all poll-mode drivers (PMDs). + +Flow rule +--------- + +Description +~~~~~~~~~~~ + +A flow rule is the combination of attributes with a matching pattern and a +list of actions. Flow rules form the basis of this API. + +Flow rules can have several distinct actions (such as counting, +encapsulating, decapsulating before redirecting packets to a particular +queue, etc.), instead of relying on several rules to achieve this and having +applications deal with hardware implementation details regarding their +order. + +Support for different priority levels on a rule basis is provided, for +example in order to force a more specific rule to come before a more generic +one for packets matched by both. However hardware support for more than a +single priority level cannot be guaranteed. When supported, the number of +available priority levels is usually low, which is why they can also be +implemented in software by PMDs (e.g. missing priority levels may be +emulated by reordering rules). + +In order to remain as hardware-agnostic as possible, by default all rules +are considered to have the same priority, which means that the order between +overlapping rules (when a packet is matched by several filters) is +undefined. + +PMDs may refuse to create overlapping rules at a given priority level when +they can be detected (e.g. if a pattern matches an existing filter). + +Thus predictable results for a given priority level can only be achieved +with non-overlapping rules, using perfect matching on all protocol layers. + +Flow rules can also be grouped, the flow rule priority is specific to the +group they belong to. All flow rules in a given group are thus processed within +the context of that group. Groups are not linked by default, so the logical +hierarchy of groups must be explicitly defined by flow rules themselves in each +group using the JUMP action to define the next group to redirect too. Only flow +rules defined in the default group 0 are guarantee to be matched against, this +makes group 0 the origin of any group hierarchy defined by an application. + +Support for multiple actions per rule may be implemented internally on top +of non-default hardware priorities, as a result both features may not be +simultaneously available to applications. + +Considering that allowed pattern/actions combinations cannot be known in +advance and would result in an impractically large number of capabilities to +expose, a method is provided to validate a given rule from the current +device configuration state. + +This enables applications to check if the rule types they need is supported +at initialization time, before starting their data path. This method can be +used anytime, its only requirement being that the resources needed by a rule +should exist (e.g. a target RX queue should be configured first). + +Each defined rule is associated with an opaque handle managed by the PMD, +applications are responsible for keeping it. These can be used for queries +and rules management, such as retrieving counters or other data and +destroying them. + +To avoid resource leaks on the PMD side, handles must be explicitly +destroyed by the application before releasing associated resources such as +queues and ports. + +The following sections cover: + +- **Attributes** (represented by ``struct rte_flow_attr``): properties of a + flow rule such as its direction (ingress or egress) and priority. + +- **Pattern item** (represented by ``struct rte_flow_item``): part of a + matching pattern that either matches specific packet data or traffic + properties. It can also describe properties of the pattern itself, such as + inverted matching. + +- **Matching pattern**: traffic properties to look for, a combination of any + number of items. + +- **Actions** (represented by ``struct rte_flow_action``): operations to + perform whenever a packet is matched by a pattern. + +Attributes +~~~~~~~~~~ + +Attribute: Group +^^^^^^^^^^^^^^^^ + +Flow rules can be grouped by assigning them a common group number. Groups +allow a logical hierarchy of flow rule groups (tables) to be defined. These +groups can be supported virtually in the PMD or in the physical device. +Group 0 is the default group and this is the only group which flows are +guarantee to matched against, all subsequent groups can only be reached by +way of the JUMP action from a matched flow rule. + +Although optional, applications are encouraged to group similar rules as +much as possible to fully take advantage of hardware capabilities +(e.g. optimized matching) and work around limitations (e.g. a single pattern +type possibly allowed in a given group), while being aware that the groups +hierarchies must be programmed explicitly. + +Note that support for more than a single group is not guaranteed. + +Attribute: Priority +^^^^^^^^^^^^^^^^^^^ + +A priority level can be assigned to a flow rule, lower values +denote higher priority, with 0 as the maximum. + +Priority levels are arbitrary and up to the application, they do +not need to be contiguous nor start from 0, however the maximum number +varies between devices and may be affected by existing flow rules. + +A flow which matches multiple rules in the same group will always matched by +the rule with the highest priority in that group. + +If a packet is matched by several rules of a given group for a given +priority level, the outcome is undefined. It can take any path, may be +duplicated or even cause unrecoverable errors. + +Note that support for more than a single priority level is not guaranteed. + +Attribute: Traffic direction +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Flow rule patterns apply to inbound and/or outbound traffic. + +In the context of this API, **ingress** and **egress** respectively stand +for **inbound** and **outbound** based on the standpoint of the application +creating a flow rule. + +There are no exceptions to this definition. + +Several pattern items and actions are valid and can be used in both +directions. At least one direction must be specified. + +Specifying both directions at once for a given rule is not recommended but +may be valid in a few cases (e.g. shared counters). + +Attribute: Transfer +^^^^^^^^^^^^^^^^^^^ + +Instead of simply matching the properties of traffic as it would appear on a +given DPDK port ID, enabling this attribute transfers a flow rule to the +lowest possible level of any device endpoints found in the pattern. + +When supported, this effectively enables an application to reroute traffic +not necessarily intended for it (e.g. coming from or addressed to different +physical ports, VFs or applications) at the device level. + +It complements the behavior of some pattern items such as `Item: PHY_PORT`_ +and is meaningless without them. + +When transferring flow rules, **ingress** and **egress** attributes +(`Attribute: Traffic direction`_) keep their original meaning, as if +processing traffic emitted or received by the application. + +Pattern item +~~~~~~~~~~~~ + +Pattern items fall in two categories: + +- Matching protocol headers and packet data, usually associated with a + specification structure. These must be stacked in the same order as the + protocol layers to match inside packets, starting from the lowest. + +- Matching meta-data or affecting pattern processing, often without a + specification structure. Since they do not match packet contents, their + position in the list is usually not relevant. + +Item specification structures are used to match specific values among +protocol fields (or item properties). Documentation describes for each item +whether they are associated with one and their type name if so. + +Up to three structures of the same type can be set for a given item: + +- ``spec``: values to match (e.g. a given IPv4 address). + +- ``last``: upper bound for an inclusive range with corresponding fields in + ``spec``. + +- ``mask``: bit-mask applied to both ``spec`` and ``last`` whose purpose is + to distinguish the values to take into account and/or partially mask them + out (e.g. in order to match an IPv4 address prefix). + +Usage restrictions and expected behavior: + +- Setting either ``mask`` or ``last`` without ``spec`` is an error. + +- Field values in ``last`` which are either 0 or equal to the corresponding + values in ``spec`` are ignored; they do not generate a range. Nonzero + values lower than those in ``spec`` are not supported. + +- Setting ``spec`` and optionally ``last`` without ``mask`` causes the PMD + to use the default mask defined for that item (defined as + ``rte_flow_item_{name}_mask`` constants). + +- Not setting any of them (assuming item type allows it) is equivalent to + providing an empty (zeroed) ``mask`` for broad (nonspecific) matching. + +- ``mask`` is a simple bit-mask applied before interpreting the contents of + ``spec`` and ``last``, which may yield unexpected results if not used + carefully. For example, if for an IPv4 address field, ``spec`` provides + *10.1.2.3*, ``last`` provides *10.3.4.5* and ``mask`` provides + *255.255.0.0*, the effective range becomes *10.1.0.0* to *10.3.255.255*. + +Example of an item specification matching an Ethernet header: + +.. _table_rte_flow_pattern_item_example: + +.. table:: Ethernet item + + +----------+----------+-----------------------+ + | Field | Subfield | Value | + +==========+==========+=======================+ + | ``spec`` | ``src`` | ``00:00:01:02:03:04`` | + | +----------+-----------------------+ + | | ``dst`` | ``00:00:2a:66:00:01`` | + | +----------+-----------------------+ + | | ``type`` | ``0x22aa`` | + +----------+----------+-----------------------+ + | ``last`` | unspecified | + +----------+----------+-----------------------+ + | ``mask`` | ``src`` | ``00:00:ff:ff:ff:00`` | + | +----------+-----------------------+ + | | ``dst`` | ``00:00:00:00:00:ff`` | + | +----------+-----------------------+ + | | ``type`` | ``0x0000`` | + +----------+----------+-----------------------+ + +Non-masked bits stand for any value (shown as ``?`` below), Ethernet headers +with the following properties are thus matched: + +- ``src``: ``??:??:01:02:03:??`` +- ``dst``: ``??:??:??:??:??:01`` +- ``type``: ``0x????`` + +Matching pattern +~~~~~~~~~~~~~~~~ + +A pattern is formed by stacking items starting from the lowest protocol +layer to match. This stacking restriction does not apply to meta items which +can be placed anywhere in the stack without affecting the meaning of the +resulting pattern. + +Patterns are terminated by END items. + +Examples: + +.. _table_rte_flow_tcpv4_as_l4: + +.. table:: TCPv4 as L4 + + +-------+----------+ + | Index | Item | + +=======+==========+ + | 0 | Ethernet | + +-------+----------+ + | 1 | IPv4 | + +-------+----------+ + | 2 | TCP | + +-------+----------+ + | 3 | END | + +-------+----------+ + +| + +.. _table_rte_flow_tcpv6_in_vxlan: + +.. table:: TCPv6 in VXLAN + + +-------+------------+ + | Index | Item | + +=======+============+ + | 0 | Ethernet | + +-------+------------+ + | 1 | IPv4 | + +-------+------------+ + | 2 | UDP | + +-------+------------+ + | 3 | VXLAN | + +-------+------------+ + | 4 | Ethernet | + +-------+------------+ + | 5 | IPv6 | + +-------+------------+ + | 6 | TCP | + +-------+------------+ + | 7 | END | + +-------+------------+ + +| + +.. _table_rte_flow_tcpv4_as_l4_meta: + +.. table:: TCPv4 as L4 with meta items + + +-------+----------+ + | Index | Item | + +=======+==========+ + | 0 | VOID | + +-------+----------+ + | 1 | Ethernet | + +-------+----------+ + | 2 | VOID | + +-------+----------+ + | 3 | IPv4 | + +-------+----------+ + | 4 | TCP | + +-------+----------+ + | 5 | VOID | + +-------+----------+ + | 6 | VOID | + +-------+----------+ + | 7 | END | + +-------+----------+ + +The above example shows how meta items do not affect packet data matching +items, as long as those remain stacked properly. The resulting matching +pattern is identical to "TCPv4 as L4". + +.. _table_rte_flow_udpv6_anywhere: + +.. table:: UDPv6 anywhere + + +-------+------+ + | Index | Item | + +=======+======+ + | 0 | IPv6 | + +-------+------+ + | 1 | UDP | + +-------+------+ + | 2 | END | + +-------+------+ + +If supported by the PMD, omitting one or several protocol layers at the +bottom of the stack as in the above example (missing an Ethernet +specification) enables looking up anywhere in packets. + +It is unspecified whether the payload of supported encapsulations +(e.g. VXLAN payload) is matched by such a pattern, which may apply to inner, +outer or both packets. + +.. _table_rte_flow_invalid_l3: + +.. table:: Invalid, missing L3 + + +-------+----------+ + | Index | Item | + +=======+==========+ + | 0 | Ethernet | + +-------+----------+ + | 1 | UDP | + +-------+----------+ + | 2 | END | + +-------+----------+ + +The above pattern is invalid due to a missing L3 specification between L2 +(Ethernet) and L4 (UDP). Doing so is only allowed at the bottom and at the +top of the stack. + +Meta item types +~~~~~~~~~~~~~~~ + +They match meta-data or affect pattern processing instead of matching packet +data directly, most of them do not need a specification structure. This +particularity allows them to be specified anywhere in the stack without +causing any side effect. + +Item: ``END`` +^^^^^^^^^^^^^ + +End marker for item lists. Prevents further processing of items, thereby +ending the pattern. + +- Its numeric value is 0 for convenience. +- PMD support is mandatory. +- ``spec``, ``last`` and ``mask`` are ignored. + +.. _table_rte_flow_item_end: + +.. table:: END + + +----------+---------+ + | Field | Value | + +==========+=========+ + | ``spec`` | ignored | + +----------+---------+ + | ``last`` | ignored | + +----------+---------+ + | ``mask`` | ignored | + +----------+---------+ + +Item: ``VOID`` +^^^^^^^^^^^^^^ + +Used as a placeholder for convenience. It is ignored and simply discarded by +PMDs. + +- PMD support is mandatory. +- ``spec``, ``last`` and ``mask`` are ignored. + +.. _table_rte_flow_item_void: + +.. table:: VOID + + +----------+---------+ + | Field | Value | + +==========+=========+ + | ``spec`` | ignored | + +----------+---------+ + | ``last`` | ignored | + +----------+---------+ + | ``mask`` | ignored | + +----------+---------+ + +One usage example for this type is generating rules that share a common +prefix quickly without reallocating memory, only by updating item types: + +.. _table_rte_flow_item_void_example: + +.. table:: TCP, UDP or ICMP as L4 + + +-------+--------------------+ + | Index | Item | + +=======+====================+ + | 0 | Ethernet | + +-------+--------------------+ + | 1 | IPv4 | + +-------+------+------+------+ + | 2 | UDP | VOID | VOID | + +-------+------+------+------+ + | 3 | VOID | TCP | VOID | + +-------+------+------+------+ + | 4 | VOID | VOID | ICMP | + +-------+------+------+------+ + | 5 | END | + +-------+--------------------+ + +Item: ``INVERT`` +^^^^^^^^^^^^^^^^ + +Inverted matching, i.e. process packets that do not match the pattern. + +- ``spec``, ``last`` and ``mask`` are ignored. + +.. _table_rte_flow_item_invert: + +.. table:: INVERT + + +----------+---------+ + | Field | Value | + +==========+=========+ + | ``spec`` | ignored | + +----------+---------+ + | ``last`` | ignored | + +----------+---------+ + | ``mask`` | ignored | + +----------+---------+ + +Usage example, matching non-TCPv4 packets only: + +.. _table_rte_flow_item_invert_example: + +.. table:: Anything but TCPv4 + + +-------+----------+ + | Index | Item | + +=======+==========+ + | 0 | INVERT | + +-------+----------+ + | 1 | Ethernet | + +-------+----------+ + | 2 | IPv4 | + +-------+----------+ + | 3 | TCP | + +-------+----------+ + | 4 | END | + +-------+----------+ + +Item: ``PF`` +^^^^^^^^^^^^ + +Matches traffic originating from (ingress) or going to (egress) the physical +function of the current device. + +If supported, should work even if the physical function is not managed by +the application and thus not associated with a DPDK port ID. + +- Can be combined with any number of `Item: VF`_ to match both PF and VF + traffic. +- ``spec``, ``last`` and ``mask`` must not be set. + +.. _table_rte_flow_item_pf: + +.. table:: PF + + +----------+-------+ + | Field | Value | + +==========+=======+ + | ``spec`` | unset | + +----------+-------+ + | ``last`` | unset | + +----------+-------+ + | ``mask`` | unset | + +----------+-------+ + +Item: ``VF`` +^^^^^^^^^^^^ + +Matches traffic originating from (ingress) or going to (egress) a given +virtual function of the current device. + +If supported, should work even if the virtual function is not managed by the +application and thus not associated with a DPDK port ID. + +Note this pattern item does not match VF representors traffic which, as +separate entities, should be addressed through their own DPDK port IDs. + +- Can be specified multiple times to match traffic addressed to several VF + IDs. +- Can be combined with a PF item to match both PF and VF traffic. +- Default ``mask`` matches any VF ID. + +.. _table_rte_flow_item_vf: + +.. table:: VF + + +----------+----------+---------------------------+ + | Field | Subfield | Value | + +==========+==========+===========================+ + | ``spec`` | ``id`` | destination VF ID | + +----------+----------+---------------------------+ + | ``last`` | ``id`` | upper range value | + +----------+----------+---------------------------+ + | ``mask`` | ``id`` | zeroed to match any VF ID | + +----------+----------+---------------------------+ + +Item: ``PHY_PORT`` +^^^^^^^^^^^^^^^^^^ + +Matches traffic originating from (ingress) or going to (egress) a physical +port of the underlying device. + +The first PHY_PORT item overrides the physical port normally associated with +the specified DPDK input port (port_id). This item can be provided several +times to match additional physical ports. + +Note that physical ports are not necessarily tied to DPDK input ports +(port_id) when those are not under DPDK control. Possible values are +specific to each device, they are not necessarily indexed from zero and may +not be contiguous. + +As a device property, the list of allowed values as well as the value +associated with a port_id should be retrieved by other means. + +- Default ``mask`` matches any port index. + +.. _table_rte_flow_item_phy_port: + +.. table:: PHY_PORT + + +----------+-----------+--------------------------------+ + | Field | Subfield | Value | + +==========+===========+================================+ + | ``spec`` | ``index`` | physical port index | + +----------+-----------+--------------------------------+ + | ``last`` | ``index`` | upper range value | + +----------+-----------+--------------------------------+ + | ``mask`` | ``index`` | zeroed to match any port index | + +----------+-----------+--------------------------------+ + +Item: ``PORT_ID`` +^^^^^^^^^^^^^^^^^ + +Matches traffic originating from (ingress) or going to (egress) a given DPDK +port ID. + +Normally only supported if the port ID in question is known by the +underlying PMD and related to the device the flow rule is created against. + +This must not be confused with `Item: PHY_PORT`_ which refers to the +physical port of a device, whereas `Item: PORT_ID`_ refers to a ``struct +rte_eth_dev`` object on the application side (also known as "port +representor" depending on the kind of underlying device). + +- Default ``mask`` matches the specified DPDK port ID. + +.. _table_rte_flow_item_port_id: + +.. table:: PORT_ID + + +----------+----------+-----------------------------+ + | Field | Subfield | Value | + +==========+==========+=============================+ + | ``spec`` | ``id`` | DPDK port ID | + +----------+----------+-----------------------------+ + | ``last`` | ``id`` | upper range value | + +----------+----------+-----------------------------+ + | ``mask`` | ``id`` | zeroed to match any port ID | + +----------+----------+-----------------------------+ + +Item: ``MARK`` +^^^^^^^^^^^^^^ + +Matches an arbitrary integer value which was set using the ``MARK`` action in +a previously matched rule. + +This item can only specified once as a match criteria as the ``MARK`` action can +only be specified once in a flow action. + +Note the value of MARK field is arbitrary and application defined. + +Depending on the underlying implementation the MARK item may be supported on +the physical device, with virtual groups in the PMD or not at all. + +- Default ``mask`` matches any integer value. + +.. _table_rte_flow_item_mark: + +.. table:: MARK + + +----------+----------+---------------------------+ + | Field | Subfield | Value | + +==========+==========+===========================+ + | ``spec`` | ``id`` | integer value | + +----------+--------------------------------------+ + | ``last`` | ``id`` | upper range value | + +----------+----------+---------------------------+ + | ``mask`` | ``id`` | zeroed to match any value | + +----------+----------+---------------------------+ + +Item: ``TAG`` +^^^^^^^^^^^^^ + +Matches tag item set by other flows. Multiple tags are supported by specifying +``index``. + +- Default ``mask`` matches the specified tag value and index. + +.. _table_rte_flow_item_tag: + +.. table:: TAG + + +----------+----------+----------------------------------------+ + | Field | Subfield | Value | + +==========+===========+=======================================+ + | ``spec`` | ``data`` | 32 bit flow tag value | + | +-----------+---------------------------------------+ + | | ``index`` | index of flow tag | + +----------+-----------+---------------------------------------+ + | ``last`` | ``data`` | upper range value | + | +-----------+---------------------------------------+ + | | ``index`` | field is ignored | + +----------+-----------+---------------------------------------+ + | ``mask`` | ``data`` | bit-mask applies to "spec" and "last" | + | +-----------+---------------------------------------+ + | | ``index`` | field is ignored | + +----------+-----------+---------------------------------------+ + +Item: ``META`` +^^^^^^^^^^^^^^^^^ + +Matches 32 bit metadata item set. + +On egress, metadata can be set either by mbuf metadata field with +PKT_TX_DYNF_METADATA flag or ``SET_META`` action. On ingress, ``SET_META`` +action sets metadata for a packet and the metadata will be reported via +``metadata`` dynamic field of ``rte_mbuf`` with PKT_RX_DYNF_METADATA flag. + +- Default ``mask`` matches the specified Rx metadata value. + +.. _table_rte_flow_item_meta: + +.. table:: META + + +----------+----------+---------------------------------------+ + | Field | Subfield | Value | + +==========+==========+=======================================+ + | ``spec`` | ``data`` | 32 bit metadata value | + +----------+----------+---------------------------------------+ + | ``last`` | ``data`` | upper range value | + +----------+----------+---------------------------------------+ + | ``mask`` | ``data`` | bit-mask applies to "spec" and "last" | + +----------+----------+---------------------------------------+ + +Data matching item types +~~~~~~~~~~~~~~~~~~~~~~~~ + +Most of these are basically protocol header definitions with associated +bit-masks. They must be specified (stacked) from lowest to highest protocol +layer to form a matching pattern. + +The following list is not exhaustive, new protocols will be added in the +future. + +Item: ``ANY`` +^^^^^^^^^^^^^ + +Matches any protocol in place of the current layer, a single ANY may also +stand for several protocol layers. + +This is usually specified as the first pattern item when looking for a +protocol anywhere in a packet. + +- Default ``mask`` stands for any number of layers. + +.. _table_rte_flow_item_any: + +.. table:: ANY + + +----------+----------+--------------------------------------+ + | Field | Subfield | Value | + +==========+==========+======================================+ + | ``spec`` | ``num`` | number of layers covered | + +----------+----------+--------------------------------------+ + | ``last`` | ``num`` | upper range value | + +----------+----------+--------------------------------------+ + | ``mask`` | ``num`` | zeroed to cover any number of layers | + +----------+----------+--------------------------------------+ + +Example for VXLAN TCP payload matching regardless of outer L3 (IPv4 or IPv6) +and L4 (UDP) both matched by the first ANY specification, and inner L3 (IPv4 +or IPv6) matched by the second ANY specification: + +.. _table_rte_flow_item_any_example: + +.. table:: TCP in VXLAN with wildcards + + +-------+------+----------+----------+-------+ + | Index | Item | Field | Subfield | Value | + +=======+======+==========+==========+=======+ + | 0 | Ethernet | + +-------+------+----------+----------+-------+ + | 1 | ANY | ``spec`` | ``num`` | 2 | + +-------+------+----------+----------+-------+ + | 2 | VXLAN | + +-------+------------------------------------+ + | 3 | Ethernet | + +-------+------+----------+----------+-------+ + | 4 | ANY | ``spec`` | ``num`` | 1 | + +-------+------+----------+----------+-------+ + | 5 | TCP | + +-------+------------------------------------+ + | 6 | END | + +-------+------------------------------------+ + +Item: ``RAW`` +^^^^^^^^^^^^^ + +Matches a byte string of a given length at a given offset. + +Offset is either absolute (using the start of the packet) or relative to the +end of the previous matched item in the stack, in which case negative values +are allowed. + +If search is enabled, offset is used as the starting point. The search area +can be delimited by setting limit to a nonzero value, which is the maximum +number of bytes after offset where the pattern may start. + +Matching a zero-length pattern is allowed, doing so resets the relative +offset for subsequent items. + +- This type does not support ranges (``last`` field). +- Default ``mask`` matches all fields exactly. + +.. _table_rte_flow_item_raw: + +.. table:: RAW + + +----------+--------------+-------------------------------------------------+ + | Field | Subfield | Value | + +==========+==============+=================================================+ + | ``spec`` | ``relative`` | look for pattern after the previous item | + | +--------------+-------------------------------------------------+ + | | ``search`` | search pattern from offset (see also ``limit``) | + | +--------------+-------------------------------------------------+ + | | ``reserved`` | reserved, must be set to zero | + | +--------------+-------------------------------------------------+ + | | ``offset`` | absolute or relative offset for ``pattern`` | + | +--------------+-------------------------------------------------+ + | | ``limit`` | search area limit for start of ``pattern`` | + | +--------------+-------------------------------------------------+ + | | ``length`` | ``pattern`` length | + | +--------------+-------------------------------------------------+ + | | ``pattern`` | byte string to look for | + +----------+--------------+-------------------------------------------------+ + | ``last`` | if specified, either all 0 or with the same values as ``spec`` | + +----------+----------------------------------------------------------------+ + | ``mask`` | bit-mask applied to ``spec`` values with usual behavior | + +----------+----------------------------------------------------------------+ + +Example pattern looking for several strings at various offsets of a UDP +payload, using combined RAW items: + +.. _table_rte_flow_item_raw_example: + +.. table:: UDP payload matching + + +-------+------+----------+--------------+-------+ + | Index | Item | Field | Subfield | Value | + +=======+======+==========+==============+=======+ + | 0 | Ethernet | + +-------+----------------------------------------+ + | 1 | IPv4 | + +-------+----------------------------------------+ + | 2 | UDP | + +-------+------+----------+--------------+-------+ + | 3 | RAW | ``spec`` | ``relative`` | 1 | + | | | +--------------+-------+ + | | | | ``search`` | 1 | + | | | +--------------+-------+ + | | | | ``offset`` | 10 | + | | | +--------------+-------+ + | | | | ``limit`` | 0 | + | | | +--------------+-------+ + | | | | ``length`` | 3 | + | | | +--------------+-------+ + | | | | ``pattern`` | "foo" | + +-------+------+----------+--------------+-------+ + | 4 | RAW | ``spec`` | ``relative`` | 1 | + | | | +--------------+-------+ + | | | | ``search`` | 0 | + | | | +--------------+-------+ + | | | | ``offset`` | 20 | + | | | +--------------+-------+ + | | | | ``limit`` | 0 | + | | | +--------------+-------+ + | | | | ``length`` | 3 | + | | | +--------------+-------+ + | | | | ``pattern`` | "bar" | + +-------+------+----------+--------------+-------+ + | 5 | RAW | ``spec`` | ``relative`` | 1 | + | | | +--------------+-------+ + | | | | ``search`` | 0 | + | | | +--------------+-------+ + | | | | ``offset`` | -29 | + | | | +--------------+-------+ + | | | | ``limit`` | 0 | + | | | +--------------+-------+ + | | | | ``length`` | 3 | + | | | +--------------+-------+ + | | | | ``pattern`` | "baz" | + +-------+------+----------+--------------+-------+ + | 6 | END | + +-------+----------------------------------------+ + +This translates to: + +- Locate "foo" at least 10 bytes deep inside UDP payload. +- Locate "bar" after "foo" plus 20 bytes. +- Locate "baz" after "bar" minus 29 bytes. + +Such a packet may be represented as follows (not to scale):: + + 0 >= 10 B == 20 B + | |<--------->| |<--------->| + | | | | | + |-----|------|-----|-----|-----|-----|-----------|-----|------| + | ETH | IPv4 | UDP | ... | baz | foo | ......... | bar | .... | + |-----|------|-----|-----|-----|-----|-----------|-----|------| + | | + |<--------------------------->| + == 29 B + +Note that matching subsequent pattern items would resume after "baz", not +"bar" since matching is always performed after the previous item of the +stack. + +Item: ``ETH`` +^^^^^^^^^^^^^ + +Matches an Ethernet header. + +The ``type`` field either stands for "EtherType" or "TPID" when followed by +so-called layer 2.5 pattern items such as ``RTE_FLOW_ITEM_TYPE_VLAN``. In +the latter case, ``type`` refers to that of the outer header, with the inner +EtherType/TPID provided by the subsequent pattern item. This is the same +order as on the wire. +If the ``type`` field contains a TPID value, then only tagged packets with the +specified TPID will match the pattern. +Otherwise, only untagged packets will match the pattern. +If the ``ETH`` item is the only item in the pattern, and the ``type`` field is +not specified, then both tagged and untagged packets will match the pattern. + +- ``dst``: destination MAC. +- ``src``: source MAC. +- ``type``: EtherType or TPID. +- Default ``mask`` matches destination and source addresses only. + +Item: ``VLAN`` +^^^^^^^^^^^^^^ + +Matches an 802.1Q/ad VLAN tag. + +The corresponding standard outer EtherType (TPID) values are +``RTE_ETHER_TYPE_VLAN`` or ``RTE_ETHER_TYPE_QINQ``. It can be overridden by the +preceding pattern item. +If a ``VLAN`` item is present in the pattern, then only tagged packets will +match the pattern. + +- ``tci``: tag control information. +- ``inner_type``: inner EtherType or TPID. +- Default ``mask`` matches the VID part of TCI only (lower 12 bits). + +Item: ``IPV4`` +^^^^^^^^^^^^^^ + +Matches an IPv4 header. + +Note: IPv4 options are handled by dedicated pattern items. + +- ``hdr``: IPv4 header definition (``rte_ip.h``). +- Default ``mask`` matches source and destination addresses only. + +Item: ``IPV6`` +^^^^^^^^^^^^^^ + +Matches an IPv6 header. + +Note: IPv6 options are handled by dedicated pattern items, see `Item: +IPV6_EXT`_. + +- ``hdr``: IPv6 header definition (``rte_ip.h``). +- Default ``mask`` matches source and destination addresses only. + +Item: ``ICMP`` +^^^^^^^^^^^^^^ + +Matches an ICMP header. + +- ``hdr``: ICMP header definition (``rte_icmp.h``). +- Default ``mask`` matches ICMP type and code only. + +Item: ``UDP`` +^^^^^^^^^^^^^ + +Matches a UDP header. + +- ``hdr``: UDP header definition (``rte_udp.h``). +- Default ``mask`` matches source and destination ports only. + +Item: ``TCP`` +^^^^^^^^^^^^^ + +Matches a TCP header. + +- ``hdr``: TCP header definition (``rte_tcp.h``). +- Default ``mask`` matches source and destination ports only. + +Item: ``SCTP`` +^^^^^^^^^^^^^^ + +Matches a SCTP header. + +- ``hdr``: SCTP header definition (``rte_sctp.h``). +- Default ``mask`` matches source and destination ports only. + +Item: ``VXLAN`` +^^^^^^^^^^^^^^^ + +Matches a VXLAN header (RFC 7348). + +- ``flags``: normally 0x08 (I flag). +- ``rsvd0``: reserved, normally 0x000000. +- ``vni``: VXLAN network identifier. +- ``rsvd1``: reserved, normally 0x00. +- Default ``mask`` matches VNI only. + +Item: ``E_TAG`` +^^^^^^^^^^^^^^^ + +Matches an IEEE 802.1BR E-Tag header. + +The corresponding standard outer EtherType (TPID) value is +``RTE_ETHER_TYPE_ETAG``. It can be overridden by the preceding pattern item. + +- ``epcp_edei_in_ecid_b``: E-Tag control information (E-TCI), E-PCP (3b), + E-DEI (1b), ingress E-CID base (12b). +- ``rsvd_grp_ecid_b``: reserved (2b), GRP (2b), E-CID base (12b). +- ``in_ecid_e``: ingress E-CID ext. +- ``ecid_e``: E-CID ext. +- ``inner_type``: inner EtherType or TPID. +- Default ``mask`` simultaneously matches GRP and E-CID base. + +Item: ``NVGRE`` +^^^^^^^^^^^^^^^ + +Matches a NVGRE header (RFC 7637). + +- ``c_k_s_rsvd0_ver``: checksum (1b), undefined (1b), key bit (1b), + sequence number (1b), reserved 0 (9b), version (3b). This field must have + value 0x2000 according to RFC 7637. +- ``protocol``: protocol type (0x6558). +- ``tni``: virtual subnet ID. +- ``flow_id``: flow ID. +- Default ``mask`` matches TNI only. + +Item: ``MPLS`` +^^^^^^^^^^^^^^ + +Matches a MPLS header. + +- ``label_tc_s_ttl``: label, TC, Bottom of Stack and TTL. +- Default ``mask`` matches label only. + +Item: ``GRE`` +^^^^^^^^^^^^^ + +Matches a GRE header. + +- ``c_rsvd0_ver``: checksum, reserved 0 and version. +- ``protocol``: protocol type. +- Default ``mask`` matches protocol only. + +Item: ``GRE_KEY`` +^^^^^^^^^^^^^^^^^ + +Matches a GRE key field. +This should be preceded by item ``GRE``. + +- Value to be matched is a big-endian 32 bit integer. +- When this item present it implicitly match K bit in default mask as "1" + +Item: ``FUZZY`` +^^^^^^^^^^^^^^^ + +Fuzzy pattern match, expect faster than default. + +This is for device that support fuzzy match option. Usually a fuzzy match is +fast but the cost is accuracy. i.e. Signature Match only match pattern's hash +value, but it is possible two different patterns have the same hash value. + +Matching accuracy level can be configured by threshold. Driver can divide the +range of threshold and map to different accuracy levels that device support. + +Threshold 0 means perfect match (no fuzziness), while threshold 0xffffffff +means fuzziest match. + +.. _table_rte_flow_item_fuzzy: + +.. table:: FUZZY + + +----------+---------------+--------------------------------------------------+ + | Field | Subfield | Value | + +==========+===============+==================================================+ + | ``spec`` | ``threshold`` | 0 as perfect match, 0xffffffff as fuzziest match | + +----------+---------------+--------------------------------------------------+ + | ``last`` | ``threshold`` | upper range value | + +----------+---------------+--------------------------------------------------+ + | ``mask`` | ``threshold`` | bit-mask apply to "spec" and "last" | + +----------+---------------+--------------------------------------------------+ + +Usage example, fuzzy match a TCPv4 packets: + +.. _table_rte_flow_item_fuzzy_example: + +.. table:: Fuzzy matching + + +-------+----------+ + | Index | Item | + +=======+==========+ + | 0 | FUZZY | + +-------+----------+ + | 1 | Ethernet | + +-------+----------+ + | 2 | IPv4 | + +-------+----------+ + | 3 | TCP | + +-------+----------+ + | 4 | END | + +-------+----------+ + +Item: ``GTP``, ``GTPC``, ``GTPU`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Matches a GTPv1 header. + +Note: GTP, GTPC and GTPU use the same structure. GTPC and GTPU item +are defined for a user-friendly API when creating GTP-C and GTP-U +flow rules. + +- ``v_pt_rsv_flags``: version (3b), protocol type (1b), reserved (1b), + extension header flag (1b), sequence number flag (1b), N-PDU number + flag (1b). +- ``msg_type``: message type. +- ``msg_len``: message length. +- ``teid``: tunnel endpoint identifier. +- Default ``mask`` matches teid only. + +Item: ``ESP`` +^^^^^^^^^^^^^ + +Matches an ESP header. + +- ``hdr``: ESP header definition (``rte_esp.h``). +- Default ``mask`` matches SPI only. + +Item: ``GENEVE`` +^^^^^^^^^^^^^^^^ + +Matches a GENEVE header. + +- ``ver_opt_len_o_c_rsvd0``: version (2b), length of the options fields (6b), + OAM packet (1b), critical options present (1b), reserved 0 (6b). +- ``protocol``: protocol type. +- ``vni``: virtual network identifier. +- ``rsvd1``: reserved, normally 0x00. +- Default ``mask`` matches VNI only. + +Item: ``VXLAN-GPE`` +^^^^^^^^^^^^^^^^^^^ + +Matches a VXLAN-GPE header (draft-ietf-nvo3-vxlan-gpe-05). + +- ``flags``: normally 0x0C (I and P flags). +- ``rsvd0``: reserved, normally 0x0000. +- ``protocol``: protocol type. +- ``vni``: VXLAN network identifier. +- ``rsvd1``: reserved, normally 0x00. +- Default ``mask`` matches VNI only. + +Item: ``ARP_ETH_IPV4`` +^^^^^^^^^^^^^^^^^^^^^^ + +Matches an ARP header for Ethernet/IPv4. + +- ``hdr``: hardware type, normally 1. +- ``pro``: protocol type, normally 0x0800. +- ``hln``: hardware address length, normally 6. +- ``pln``: protocol address length, normally 4. +- ``op``: opcode (1 for request, 2 for reply). +- ``sha``: sender hardware address. +- ``spa``: sender IPv4 address. +- ``tha``: target hardware address. +- ``tpa``: target IPv4 address. +- Default ``mask`` matches SHA, SPA, THA and TPA. + +Item: ``IPV6_EXT`` +^^^^^^^^^^^^^^^^^^ + +Matches the presence of any IPv6 extension header. + +- ``next_hdr``: next header. +- Default ``mask`` matches ``next_hdr``. + +Normally preceded by any of: + +- `Item: IPV6`_ +- `Item: IPV6_EXT`_ + +Item: ``ICMP6`` +^^^^^^^^^^^^^^^ + +Matches any ICMPv6 header. + +- ``type``: ICMPv6 type. +- ``code``: ICMPv6 code. +- ``checksum``: ICMPv6 checksum. +- Default ``mask`` matches ``type`` and ``code``. + +Item: ``ICMP6_ND_NS`` +^^^^^^^^^^^^^^^^^^^^^ + +Matches an ICMPv6 neighbor discovery solicitation. + +- ``type``: ICMPv6 type, normally 135. +- ``code``: ICMPv6 code, normally 0. +- ``checksum``: ICMPv6 checksum. +- ``reserved``: reserved, normally 0. +- ``target_addr``: target address. +- Default ``mask`` matches target address only. + +Item: ``ICMP6_ND_NA`` +^^^^^^^^^^^^^^^^^^^^^ + +Matches an ICMPv6 neighbor discovery advertisement. + +- ``type``: ICMPv6 type, normally 136. +- ``code``: ICMPv6 code, normally 0. +- ``checksum``: ICMPv6 checksum. +- ``rso_reserved``: route flag (1b), solicited flag (1b), override flag + (1b), reserved (29b). +- ``target_addr``: target address. +- Default ``mask`` matches target address only. + +Item: ``ICMP6_ND_OPT`` +^^^^^^^^^^^^^^^^^^^^^^ + +Matches the presence of any ICMPv6 neighbor discovery option. + +- ``type``: ND option type. +- ``length``: ND option length. +- Default ``mask`` matches type only. + +Normally preceded by any of: + +- `Item: ICMP6_ND_NA`_ +- `Item: ICMP6_ND_NS`_ +- `Item: ICMP6_ND_OPT`_ + +Item: ``ICMP6_ND_OPT_SLA_ETH`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Matches an ICMPv6 neighbor discovery source Ethernet link-layer address +option. + +- ``type``: ND option type, normally 1. +- ``length``: ND option length, normally 1. +- ``sla``: source Ethernet LLA. +- Default ``mask`` matches source link-layer address only. + +Normally preceded by any of: + +- `Item: ICMP6_ND_NA`_ +- `Item: ICMP6_ND_OPT`_ + +Item: ``ICMP6_ND_OPT_TLA_ETH`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Matches an ICMPv6 neighbor discovery target Ethernet link-layer address +option. + +- ``type``: ND option type, normally 2. +- ``length``: ND option length, normally 1. +- ``tla``: target Ethernet LLA. +- Default ``mask`` matches target link-layer address only. + +Normally preceded by any of: + +- `Item: ICMP6_ND_NS`_ +- `Item: ICMP6_ND_OPT`_ + +Item: ``META`` +^^^^^^^^^^^^^^ + +Matches an application specific 32 bit metadata item. + +- Default ``mask`` matches the specified metadata value. + +Item: ``GTP_PSC`` +^^^^^^^^^^^^^^^^^ + +Matches a GTP PDU extension header with type 0x85. + +- ``pdu_type``: PDU type. +- ``qfi``: QoS flow identifier. +- Default ``mask`` matches QFI only. + +Item: ``PPPOES``, ``PPPOED`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Matches a PPPoE header. + +- ``version_type``: version (4b), type (4b). +- ``code``: message type. +- ``session_id``: session identifier. +- ``length``: payload length. + +Item: ``PPPOE_PROTO_ID`` +^^^^^^^^^^^^^^^^^^^^^^^^ + +Matches a PPPoE session protocol identifier. + +- ``proto_id``: PPP protocol identifier. +- Default ``mask`` matches proto_id only. + +Item: ``NSH`` +^^^^^^^^^^^^^ + +Matches a network service header (RFC 8300). + +- ``version``: normally 0x0 (2 bits). +- ``oam_pkt``: indicate oam packet (1 bit). +- ``reserved``: reserved bit (1 bit). +- ``ttl``: maximum SFF hopes (6 bits). +- ``length``: total length in 4 bytes words (6 bits). +- ``reserved1``: reserved1 bits (4 bits). +- ``mdtype``: ndicates format of NSH header (4 bits). +- ``next_proto``: indicates protocol type of encap data (8 bits). +- ``spi``: service path identifier (3 bytes). +- ``sindex``: service index (1 byte). +- Default ``mask`` matches mdtype, next_proto, spi, sindex. + + +Item: ``IGMP`` +^^^^^^^^^^^^^^ + +Matches a Internet Group Management Protocol (RFC 2236). + +- ``type``: IGMP message type (Query/Report). +- ``max_resp_time``: max time allowed before sending report. +- ``checksum``: checksum, 1s complement of whole IGMP message. +- ``group_addr``: group address, for Query value will be 0. +- Default ``mask`` matches group_addr. + + +Item: ``AH`` +^^^^^^^^^^^^ + +Matches a IP Authentication Header (RFC 4302). + +- ``next_hdr``: next payload after AH. +- ``payload_len``: total length of AH in 4B words. +- ``reserved``: reserved bits. +- ``spi``: security parameters index. +- ``seq_num``: counter value increased by 1 on each packet sent. +- Default ``mask`` matches spi. + +Item: ``HIGIG2`` +^^^^^^^^^^^^^^^^^ + +Matches a HIGIG2 header field. It is layer 2.5 protocol and used in +Broadcom switches. + +- Default ``mask`` matches classification and vlan. + +Item: ``L2TPV3OIP`` +^^^^^^^^^^^^^^^^^^^ + +Matches a L2TPv3 over IP header. + +- ``session_id``: L2TPv3 over IP session identifier. +- Default ``mask`` matches session_id only. + +Item: ``PFCP`` +^^^^^^^^^^^^^^ + +Matches a PFCP Header. + +- ``s_field``: S field. +- ``msg_type``: message type. +- ``msg_len``: message length. +- ``seid``: session endpoint identifier. +- Default ``mask`` matches s_field and seid. + +Actions +~~~~~~~ + +Each possible action is represented by a type. +An action can have an associated configuration object. +Several actions combined in a list can be assigned +to a flow rule and are performed in order. + +They fall in three categories: + +- Actions that modify the fate of matching traffic, for instance by dropping + or assigning it a specific destination. + +- Actions that modify matching traffic contents or its properties. This + includes adding/removing encapsulation, encryption, compression and marks. + +- Actions related to the flow rule itself, such as updating counters or + making it non-terminating. + +Flow rules being terminating by default, not specifying any action of the +fate kind results in undefined behavior. This applies to both ingress and +egress. + +PASSTHRU, when supported, makes a flow rule non-terminating. + +Like matching patterns, action lists are terminated by END items. + +Example of action that redirects packets to queue index 10: + +.. _table_rte_flow_action_example: + +.. table:: Queue action + + +-----------+-------+ + | Field | Value | + +===========+=======+ + | ``index`` | 10 | + +-----------+-------+ + +Actions are performed in list order: + +.. _table_rte_flow_count_then_drop: + +.. table:: Count then drop + + +-------+--------+ + | Index | Action | + +=======+========+ + | 0 | COUNT | + +-------+--------+ + | 1 | DROP | + +-------+--------+ + | 2 | END | + +-------+--------+ + +| + +.. _table_rte_flow_mark_count_redirect: + +.. table:: Mark, count then redirect + + +-------+--------+------------+-------+ + | Index | Action | Field | Value | + +=======+========+============+=======+ + | 0 | MARK | ``mark`` | 0x2a | + +-------+--------+------------+-------+ + | 1 | COUNT | ``shared`` | 0 | + | | +------------+-------+ + | | | ``id`` | 0 | + +-------+--------+------------+-------+ + | 2 | QUEUE | ``queue`` | 10 | + +-------+--------+------------+-------+ + | 3 | END | + +-------+-----------------------------+ + +| + +.. _table_rte_flow_redirect_queue_5: + +.. table:: Redirect to queue 5 + + +-------+--------+-----------+-------+ + | Index | Action | Field | Value | + +=======+========+===========+=======+ + | 0 | DROP | + +-------+--------+-----------+-------+ + | 1 | QUEUE | ``queue`` | 5 | + +-------+--------+-----------+-------+ + | 2 | END | + +-------+----------------------------+ + +In the above example, while DROP and QUEUE must be performed in order, both +have to happen before reaching END. Only QUEUE has a visible effect. + +Note that such a list may be thought as ambiguous and rejected on that +basis. + +.. _table_rte_flow_redirect_queue_5_3: + +.. table:: Redirect to queues 5 and 3 + + +-------+--------+-----------+-------+ + | Index | Action | Field | Value | + +=======+========+===========+=======+ + | 0 | QUEUE | ``queue`` | 5 | + +-------+--------+-----------+-------+ + | 1 | VOID | + +-------+--------+-----------+-------+ + | 2 | QUEUE | ``queue`` | 3 | + +-------+--------+-----------+-------+ + | 3 | END | + +-------+----------------------------+ + +As previously described, all actions must be taken into account. This +effectively duplicates traffic to both queues. The above example also shows +that VOID is ignored. + +Action types +~~~~~~~~~~~~ + +Common action types are described in this section. Like pattern item types, +this list is not exhaustive as new actions will be added in the future. + +Action: ``END`` +^^^^^^^^^^^^^^^ + +End marker for action lists. Prevents further processing of actions, thereby +ending the list. + +- Its numeric value is 0 for convenience. +- PMD support is mandatory. +- No configurable properties. + +.. _table_rte_flow_action_end: + +.. table:: END + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``VOID`` +^^^^^^^^^^^^^^^^ + +Used as a placeholder for convenience. It is ignored and simply discarded by +PMDs. + +- PMD support is mandatory. +- No configurable properties. + +.. _table_rte_flow_action_void: + +.. table:: VOID + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``PASSTHRU`` +^^^^^^^^^^^^^^^^^^^^ + +Leaves traffic up for additional processing by subsequent flow rules; makes +a flow rule non-terminating. + +- No configurable properties. + +.. _table_rte_flow_action_passthru: + +.. table:: PASSTHRU + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Example to copy a packet to a queue and continue processing by subsequent +flow rules: + +.. _table_rte_flow_action_passthru_example: + +.. table:: Copy to queue 8 + + +-------+--------+-----------+-------+ + | Index | Action | Field | Value | + +=======+========+===========+=======+ + | 0 | PASSTHRU | + +-------+--------+-----------+-------+ + | 1 | QUEUE | ``queue`` | 8 | + +-------+--------+-----------+-------+ + | 2 | END | + +-------+----------------------------+ + +Action: ``JUMP`` +^^^^^^^^^^^^^^^^ + +Redirects packets to a group on the current device. + +In a hierarchy of groups, which can be used to represent physical or logical +flow group/tables on the device, this action redirects the matched flow to +the specified group on that device. + +If a matched flow is redirected to a table which doesn't contain a matching +rule for that flow then the behavior is undefined and the resulting behavior +is up to the specific device. Best practice when using groups would be define +a default flow rule for each group which a defines the default actions in that +group so a consistent behavior is defined. + +Defining an action for matched flow in a group to jump to a group which is +higher in the group hierarchy may not be supported by physical devices, +depending on how groups are mapped to the physical devices. In the +definitions of jump actions, applications should be aware that it may be +possible to define flow rules which trigger an undefined behavior causing +flows to loop between groups. + +.. _table_rte_flow_action_jump: + +.. table:: JUMP + + +-----------+------------------------------+ + | Field | Value | + +===========+==============================+ + | ``group`` | Group to redirect packets to | + +-----------+------------------------------+ + +Action: ``MARK`` +^^^^^^^^^^^^^^^^ + +Attaches an integer value to packets and sets ``PKT_RX_FDIR`` and +``PKT_RX_FDIR_ID`` mbuf flags. + +This value is arbitrary and application-defined. Maximum allowed value +depends on the underlying implementation. It is returned in the +``hash.fdir.hi`` mbuf field. + +.. _table_rte_flow_action_mark: + +.. table:: MARK + + +--------+--------------------------------------+ + | Field | Value | + +========+======================================+ + | ``id`` | integer value to return with packets | + +--------+--------------------------------------+ + +Action: ``FLAG`` +^^^^^^^^^^^^^^^^ + +Flags packets. Similar to `Action: MARK`_ without a specific value; only +sets the ``PKT_RX_FDIR`` mbuf flag. + +- No configurable properties. + +.. _table_rte_flow_action_flag: + +.. table:: FLAG + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``QUEUE`` +^^^^^^^^^^^^^^^^^ + +Assigns packets to a given queue index. + +.. _table_rte_flow_action_queue: + +.. table:: QUEUE + + +-----------+--------------------+ + | Field | Value | + +===========+====================+ + | ``index`` | queue index to use | + +-----------+--------------------+ + +Action: ``DROP`` +^^^^^^^^^^^^^^^^ + +Drop packets. + +- No configurable properties. + +.. _table_rte_flow_action_drop: + +.. table:: DROP + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``COUNT`` +^^^^^^^^^^^^^^^^^ + +Adds a counter action to a matched flow. + +If more than one count action is specified in a single flow rule, then each +action must specify a unique id. + +Counters can be retrieved and reset through ``rte_flow_query()``, see +``struct rte_flow_query_count``. + +The shared flag indicates whether the counter is unique to the flow rule the +action is specified with, or whether it is a shared counter. + +For a count action with the shared flag set, then a global device +namespace is assumed for the counter id, so that any matched flow rules using +a count action with the same counter id on the same port will contribute to +that counter. + +For ports within the same switch domain then the counter id namespace extends +to all ports within that switch domain. + +.. _table_rte_flow_action_count: + +.. table:: COUNT + + +------------+---------------------+ + | Field | Value | + +============+=====================+ + | ``shared`` | shared counter flag | + +------------+---------------------+ + | ``id`` | counter id | + +------------+---------------------+ + +Query structure to retrieve and reset flow rule counters: + +.. _table_rte_flow_query_count: + +.. table:: COUNT query + + +---------------+-----+-----------------------------------+ + | Field | I/O | Value | + +===============+=====+===================================+ + | ``reset`` | in | reset counter after query | + +---------------+-----+-----------------------------------+ + | ``hits_set`` | out | ``hits`` field is set | + +---------------+-----+-----------------------------------+ + | ``bytes_set`` | out | ``bytes`` field is set | + +---------------+-----+-----------------------------------+ + | ``hits`` | out | number of hits for this rule | + +---------------+-----+-----------------------------------+ + | ``bytes`` | out | number of bytes through this rule | + +---------------+-----+-----------------------------------+ + +Action: ``RSS`` +^^^^^^^^^^^^^^^ + +Similar to QUEUE, except RSS is additionally performed on packets to spread +them among several queues according to the provided parameters. + +Unlike global RSS settings used by other DPDK APIs, unsetting the ``types`` +field does not disable RSS in a flow rule. Doing so instead requests safe +unspecified "best-effort" settings from the underlying PMD, which depending +on the flow rule, may result in anything ranging from empty (single queue) +to all-inclusive RSS. + +Note: RSS hash result is stored in the ``hash.rss`` mbuf field which +overlaps ``hash.fdir.lo``. Since `Action: MARK`_ sets the ``hash.fdir.hi`` +field only, both can be requested simultaneously. + +Also, regarding packet encapsulation ``level``: + +- ``0`` requests the default behavior. Depending on the packet type, it can + mean outermost, innermost, anything in between or even no RSS. + + It basically stands for the innermost encapsulation level RSS can be + performed on according to PMD and device capabilities. + +- ``1`` requests RSS to be performed on the outermost packet encapsulation + level. + +- ``2`` and subsequent values request RSS to be performed on the specified + inner packet encapsulation level, from outermost to innermost (lower to + higher values). + +Values other than ``0`` are not necessarily supported. + +Requesting a specific RSS level on unrecognized traffic results in undefined +behavior. For predictable results, it is recommended to make the flow rule +pattern match packet headers up to the requested encapsulation level so that +only matching traffic goes through. + +.. _table_rte_flow_action_rss: + +.. table:: RSS + + +---------------+---------------------------------------------+ + | Field | Value | + +===============+=============================================+ + | ``func`` | RSS hash function to apply | + +---------------+---------------------------------------------+ + | ``level`` | encapsulation level for ``types`` | + +---------------+---------------------------------------------+ + | ``types`` | specific RSS hash types (see ``ETH_RSS_*``) | + +---------------+---------------------------------------------+ + | ``key_len`` | hash key length in bytes | + +---------------+---------------------------------------------+ + | ``queue_num`` | number of entries in ``queue`` | + +---------------+---------------------------------------------+ + | ``key`` | hash key | + +---------------+---------------------------------------------+ + | ``queue`` | queue indices to use | + +---------------+---------------------------------------------+ + +Action: ``PF`` +^^^^^^^^^^^^^^ + +Directs matching traffic to the physical function (PF) of the current +device. + +See `Item: PF`_. + +- No configurable properties. + +.. _table_rte_flow_action_pf: + +.. table:: PF + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``VF`` +^^^^^^^^^^^^^^ + +Directs matching traffic to a given virtual function of the current device. + +Packets matched by a VF pattern item can be redirected to their original VF +ID instead of the specified one. This parameter may not be available and is +not guaranteed to work properly if the VF part is matched by a prior flow +rule or if packets are not addressed to a VF in the first place. + +See `Item: VF`_. + +.. _table_rte_flow_action_vf: + +.. table:: VF + + +--------------+--------------------------------+ + | Field | Value | + +==============+================================+ + | ``original`` | use original VF ID if possible | + +--------------+--------------------------------+ + | ``id`` | VF ID | + +--------------+--------------------------------+ + +Action: ``PHY_PORT`` +^^^^^^^^^^^^^^^^^^^^ + +Directs matching traffic to a given physical port index of the underlying +device. + +See `Item: PHY_PORT`_. + +.. _table_rte_flow_action_phy_port: + +.. table:: PHY_PORT + + +--------------+-------------------------------------+ + | Field | Value | + +==============+=====================================+ + | ``original`` | use original port index if possible | + +--------------+-------------------------------------+ + | ``index`` | physical port index | + +--------------+-------------------------------------+ + +Action: ``PORT_ID`` +^^^^^^^^^^^^^^^^^^^ +Directs matching traffic to a given DPDK port ID. + +See `Item: PORT_ID`_. + +.. _table_rte_flow_action_port_id: + +.. table:: PORT_ID + + +--------------+---------------------------------------+ + | Field | Value | + +==============+=======================================+ + | ``original`` | use original DPDK port ID if possible | + +--------------+---------------------------------------+ + | ``id`` | DPDK port ID | + +--------------+---------------------------------------+ + +Action: ``METER`` +^^^^^^^^^^^^^^^^^ + +Applies a stage of metering and policing. + +The metering and policing (MTR) object has to be first created using the +rte_mtr_create() API function. The ID of the MTR object is specified as +action parameter. More than one flow can use the same MTR object through +the meter action. The MTR object can be further updated or queried using +the rte_mtr* API. + +.. _table_rte_flow_action_meter: + +.. table:: METER + + +--------------+---------------+ + | Field | Value | + +==============+===============+ + | ``mtr_id`` | MTR object ID | + +--------------+---------------+ + +Action: ``SECURITY`` +^^^^^^^^^^^^^^^^^^^^ + +Perform the security action on flows matched by the pattern items +according to the configuration of the security session. + +This action modifies the payload of matched flows. For INLINE_CRYPTO, the +security protocol headers and IV are fully provided by the application as +specified in the flow pattern. The payload of matching packets is +encrypted on egress, and decrypted and authenticated on ingress. +For INLINE_PROTOCOL, the security protocol is fully offloaded to HW, +providing full encapsulation and decapsulation of packets in security +protocols. The flow pattern specifies both the outer security header fields +and the inner packet fields. The security session specified in the action +must match the pattern parameters. + +The security session specified in the action must be created on the same +port as the flow action that is being specified. + +The ingress/egress flow attribute should match that specified in the +security session if the security session supports the definition of the +direction. + +Multiple flows can be configured to use the same security session. + +.. _table_rte_flow_action_security: + +.. table:: SECURITY + + +----------------------+--------------------------------------+ + | Field | Value | + +======================+======================================+ + | ``security_session`` | security session to apply | + +----------------------+--------------------------------------+ + +The following is an example of configuring IPsec inline using the +INLINE_CRYPTO security session: + +The encryption algorithm, keys and salt are part of the opaque +``rte_security_session``. The SA is identified according to the IP and ESP +fields in the pattern items. + +.. _table_rte_flow_item_esp_inline_example: + +.. table:: IPsec inline crypto flow pattern items. + + +-------+----------+ + | Index | Item | + +=======+==========+ + | 0 | Ethernet | + +-------+----------+ + | 1 | IPv4 | + +-------+----------+ + | 2 | ESP | + +-------+----------+ + | 3 | END | + +-------+----------+ + +.. _table_rte_flow_action_esp_inline_example: + +.. table:: IPsec inline flow actions. + + +-------+----------+ + | Index | Action | + +=======+==========+ + | 0 | SECURITY | + +-------+----------+ + | 1 | END | + +-------+----------+ + +Action: ``OF_SET_MPLS_TTL`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Implements ``OFPAT_SET_MPLS_TTL`` ("MPLS TTL") as defined by the `OpenFlow +Switch Specification`_. + +.. _table_rte_flow_action_of_set_mpls_ttl: + +.. table:: OF_SET_MPLS_TTL + + +--------------+----------+ + | Field | Value | + +==============+==========+ + | ``mpls_ttl`` | MPLS TTL | + +--------------+----------+ + +Action: ``OF_DEC_MPLS_TTL`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Implements ``OFPAT_DEC_MPLS_TTL`` ("decrement MPLS TTL") as defined by the +`OpenFlow Switch Specification`_. + +.. _table_rte_flow_action_of_dec_mpls_ttl: + +.. table:: OF_DEC_MPLS_TTL + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``OF_SET_NW_TTL`` +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Implements ``OFPAT_SET_NW_TTL`` ("IP TTL") as defined by the `OpenFlow +Switch Specification`_. + +.. _table_rte_flow_action_of_set_nw_ttl: + +.. table:: OF_SET_NW_TTL + + +------------+--------+ + | Field | Value | + +============+========+ + | ``nw_ttl`` | IP TTL | + +------------+--------+ + +Action: ``OF_DEC_NW_TTL`` +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Implements ``OFPAT_DEC_NW_TTL`` ("decrement IP TTL") as defined by the +`OpenFlow Switch Specification`_. + +.. _table_rte_flow_action_of_dec_nw_ttl: + +.. table:: OF_DEC_NW_TTL + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``OF_COPY_TTL_OUT`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Implements ``OFPAT_COPY_TTL_OUT`` ("copy TTL "outwards" -- from +next-to-outermost to outermost") as defined by the `OpenFlow Switch +Specification`_. + +.. _table_rte_flow_action_of_copy_ttl_out: + +.. table:: OF_COPY_TTL_OUT + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``OF_COPY_TTL_IN`` +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Implements ``OFPAT_COPY_TTL_IN`` ("copy TTL "inwards" -- from outermost to +next-to-outermost") as defined by the `OpenFlow Switch Specification`_. + +.. _table_rte_flow_action_of_copy_ttl_in: + +.. table:: OF_COPY_TTL_IN + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``OF_POP_VLAN`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Implements ``OFPAT_POP_VLAN`` ("pop the outer VLAN tag") as defined +by the `OpenFlow Switch Specification`_. + +.. _table_rte_flow_action_of_pop_vlan: + +.. table:: OF_POP_VLAN + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``OF_PUSH_VLAN`` +^^^^^^^^^^^^^^^^^^^^^^^^ + +Implements ``OFPAT_PUSH_VLAN`` ("push a new VLAN tag") as defined by the +`OpenFlow Switch Specification`_. + +.. _table_rte_flow_action_of_push_vlan: + +.. table:: OF_PUSH_VLAN + + +---------------+-----------+ + | Field | Value | + +===============+===========+ + | ``ethertype`` | EtherType | + +---------------+-----------+ + +Action: ``OF_SET_VLAN_VID`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Implements ``OFPAT_SET_VLAN_VID`` ("set the 802.1q VLAN id") as defined by +the `OpenFlow Switch Specification`_. + +.. _table_rte_flow_action_of_set_vlan_vid: + +.. table:: OF_SET_VLAN_VID + + +--------------+---------+ + | Field | Value | + +==============+=========+ + | ``vlan_vid`` | VLAN id | + +--------------+---------+ + +Action: ``OF_SET_VLAN_PCP`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Implements ``OFPAT_SET_LAN_PCP`` ("set the 802.1q priority") as defined by +the `OpenFlow Switch Specification`_. + +.. _table_rte_flow_action_of_set_vlan_pcp: + +.. table:: OF_SET_VLAN_PCP + + +--------------+---------------+ + | Field | Value | + +==============+===============+ + | ``vlan_pcp`` | VLAN priority | + +--------------+---------------+ + +Action: ``OF_POP_MPLS`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Implements ``OFPAT_POP_MPLS`` ("pop the outer MPLS tag") as defined by the +`OpenFlow Switch Specification`_. + +.. _table_rte_flow_action_of_pop_mpls: + +.. table:: OF_POP_MPLS + + +---------------+-----------+ + | Field | Value | + +===============+===========+ + | ``ethertype`` | EtherType | + +---------------+-----------+ + +Action: ``OF_PUSH_MPLS`` +^^^^^^^^^^^^^^^^^^^^^^^^ + +Implements ``OFPAT_PUSH_MPLS`` ("push a new MPLS tag") as defined by the +`OpenFlow Switch Specification`_. + +.. _table_rte_flow_action_of_push_mpls: + +.. table:: OF_PUSH_MPLS + + +---------------+-----------+ + | Field | Value | + +===============+===========+ + | ``ethertype`` | EtherType | + +---------------+-----------+ + +Action: ``VXLAN_ENCAP`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Performs a VXLAN encapsulation action by encapsulating the matched flow in the +VXLAN tunnel as defined in the``rte_flow_action_vxlan_encap`` flow items +definition. + +This action modifies the payload of matched flows. The flow definition specified +in the ``rte_flow_action_tunnel_encap`` action structure must define a valid +VLXAN network overlay which conforms with RFC 7348 (Virtual eXtensible Local +Area Network (VXLAN): A Framework for Overlaying Virtualized Layer 2 Networks +over Layer 3 Networks). The pattern must be terminated with the +RTE_FLOW_ITEM_TYPE_END item type. + +.. _table_rte_flow_action_vxlan_encap: + +.. table:: VXLAN_ENCAP + + +----------------+-------------------------------------+ + | Field | Value | + +================+=====================================+ + | ``definition`` | Tunnel end-point overlay definition | + +----------------+-------------------------------------+ + +.. _table_rte_flow_action_vxlan_encap_example: + +.. table:: IPv4 VxLAN flow pattern example. + + +-------+----------+ + | Index | Item | + +=======+==========+ + | 0 | Ethernet | + +-------+----------+ + | 1 | IPv4 | + +-------+----------+ + | 2 | UDP | + +-------+----------+ + | 3 | VXLAN | + +-------+----------+ + | 4 | END | + +-------+----------+ + +Action: ``VXLAN_DECAP`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Performs a decapsulation action by stripping all headers of the VXLAN tunnel +network overlay from the matched flow. + +The flow items pattern defined for the flow rule with which a ``VXLAN_DECAP`` +action is specified, must define a valid VXLAN tunnel as per RFC7348. If the +flow pattern does not specify a valid VXLAN tunnel then a +RTE_FLOW_ERROR_TYPE_ACTION error should be returned. + +This action modifies the payload of matched flows. + +Action: ``NVGRE_ENCAP`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Performs a NVGRE encapsulation action by encapsulating the matched flow in the +NVGRE tunnel as defined in the``rte_flow_action_tunnel_encap`` flow item +definition. + +This action modifies the payload of matched flows. The flow definition specified +in the ``rte_flow_action_tunnel_encap`` action structure must defined a valid +NVGRE network overlay which conforms with RFC 7637 (NVGRE: Network +Virtualization Using Generic Routing Encapsulation). The pattern must be +terminated with the RTE_FLOW_ITEM_TYPE_END item type. + +.. _table_rte_flow_action_nvgre_encap: + +.. table:: NVGRE_ENCAP + + +----------------+-------------------------------------+ + | Field | Value | + +================+=====================================+ + | ``definition`` | NVGRE end-point overlay definition | + +----------------+-------------------------------------+ + +.. _table_rte_flow_action_nvgre_encap_example: + +.. table:: IPv4 NVGRE flow pattern example. + + +-------+----------+ + | Index | Item | + +=======+==========+ + | 0 | Ethernet | + +-------+----------+ + | 1 | IPv4 | + +-------+----------+ + | 2 | NVGRE | + +-------+----------+ + | 3 | END | + +-------+----------+ + +Action: ``NVGRE_DECAP`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Performs a decapsulation action by stripping all headers of the NVGRE tunnel +network overlay from the matched flow. + +The flow items pattern defined for the flow rule with which a ``NVGRE_DECAP`` +action is specified, must define a valid NVGRE tunnel as per RFC7637. If the +flow pattern does not specify a valid NVGRE tunnel then a +RTE_FLOW_ERROR_TYPE_ACTION error should be returned. + +This action modifies the payload of matched flows. + +Action: ``RAW_ENCAP`` +^^^^^^^^^^^^^^^^^^^^^ + +Adds outer header whose template is provided in its data buffer, +as defined in the ``rte_flow_action_raw_encap`` definition. + +This action modifies the payload of matched flows. The data supplied must +be a valid header, either holding layer 2 data in case of adding layer 2 after +decap layer 3 tunnel (for example MPLSoGRE) or complete tunnel definition +starting from layer 2 and moving to the tunnel item itself. When applied to +the original packet the resulting packet must be a valid packet. + +.. _table_rte_flow_action_raw_encap: + +.. table:: RAW_ENCAP + + +----------------+----------------------------------------+ + | Field | Value | + +================+========================================+ + | ``data`` | Encapsulation data | + +----------------+----------------------------------------+ + | ``preserve`` | Bit-mask of data to preserve on output | + +----------------+----------------------------------------+ + | ``size`` | Size of data and preserve | + +----------------+----------------------------------------+ + +Action: ``RAW_DECAP`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Remove outer header whose template is provided in its data buffer, +as defined in the ``rte_flow_action_raw_decap`` + +This action modifies the payload of matched flows. The data supplied must +be a valid header, either holding layer 2 data in case of removing layer 2 +before encapsulation of layer 3 tunnel (for example MPLSoGRE) or complete +tunnel definition starting from layer 2 and moving to the tunnel item itself. +When applied to the original packet the resulting packet must be a +valid packet. + +.. _table_rte_flow_action_raw_decap: + +.. table:: RAW_DECAP + + +----------------+----------------------------------------+ + | Field | Value | + +================+========================================+ + | ``data`` | Decapsulation data | + +----------------+----------------------------------------+ + | ``size`` | Size of data | + +----------------+----------------------------------------+ + +Action: ``SET_IPV4_SRC`` +^^^^^^^^^^^^^^^^^^^^^^^^ + +Set a new IPv4 source address in the outermost IPv4 header. + +It must be used with a valid RTE_FLOW_ITEM_TYPE_IPV4 flow pattern item. +Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned. + +.. _table_rte_flow_action_set_ipv4_src: + +.. table:: SET_IPV4_SRC + + +-----------------------------------------+ + | Field | Value | + +===============+=========================+ + | ``ipv4_addr`` | new IPv4 source address | + +---------------+-------------------------+ + +Action: ``SET_IPV4_DST`` +^^^^^^^^^^^^^^^^^^^^^^^^ + +Set a new IPv4 destination address in the outermost IPv4 header. + +It must be used with a valid RTE_FLOW_ITEM_TYPE_IPV4 flow pattern item. +Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned. + +.. _table_rte_flow_action_set_ipv4_dst: + +.. table:: SET_IPV4_DST + + +---------------+------------------------------+ + | Field | Value | + +===============+==============================+ + | ``ipv4_addr`` | new IPv4 destination address | + +---------------+------------------------------+ + +Action: ``SET_IPV6_SRC`` +^^^^^^^^^^^^^^^^^^^^^^^^ + +Set a new IPv6 source address in the outermost IPv6 header. + +It must be used with a valid RTE_FLOW_ITEM_TYPE_IPV6 flow pattern item. +Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned. + +.. _table_rte_flow_action_set_ipv6_src: + +.. table:: SET_IPV6_SRC + + +---------------+-------------------------+ + | Field | Value | + +===============+=========================+ + | ``ipv6_addr`` | new IPv6 source address | + +---------------+-------------------------+ + +Action: ``SET_IPV6_DST`` +^^^^^^^^^^^^^^^^^^^^^^^^ + +Set a new IPv6 destination address in the outermost IPv6 header. + +It must be used with a valid RTE_FLOW_ITEM_TYPE_IPV6 flow pattern item. +Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned. + +.. _table_rte_flow_action_set_ipv6_dst: + +.. table:: SET_IPV6_DST + + +---------------+------------------------------+ + | Field | Value | + +===============+==============================+ + | ``ipv6_addr`` | new IPv6 destination address | + +---------------+------------------------------+ + +Action: ``SET_TP_SRC`` +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Set a new source port number in the outermost TCP/UDP header. + +It must be used with a valid RTE_FLOW_ITEM_TYPE_TCP or RTE_FLOW_ITEM_TYPE_UDP +flow pattern item. Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned. + +.. _table_rte_flow_action_set_tp_src: + +.. table:: SET_TP_SRC + + +----------+-------------------------+ + | Field | Value | + +==========+=========================+ + | ``port`` | new TCP/UDP source port | + +---------------+--------------------+ + +Action: ``SET_TP_DST`` +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Set a new destination port number in the outermost TCP/UDP header. + +It must be used with a valid RTE_FLOW_ITEM_TYPE_TCP or RTE_FLOW_ITEM_TYPE_UDP +flow pattern item. Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned. + +.. _table_rte_flow_action_set_tp_dst: + +.. table:: SET_TP_DST + + +----------+------------------------------+ + | Field | Value | + +==========+==============================+ + | ``port`` | new TCP/UDP destination port | + +---------------+-------------------------+ + +Action: ``MAC_SWAP`` +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Swap the source and destination MAC addresses in the outermost Ethernet +header. + +It must be used with a valid RTE_FLOW_ITEM_TYPE_ETH flow pattern item. +Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned. + +.. _table_rte_flow_action_mac_swap: + +.. table:: MAC_SWAP + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``DEC_TTL`` +^^^^^^^^^^^^^^^^^^^ + +Decrease TTL value. + +If there is no valid RTE_FLOW_ITEM_TYPE_IPV4 or RTE_FLOW_ITEM_TYPE_IPV6 +in pattern, Some PMDs will reject rule because behavior will be undefined. + +.. _table_rte_flow_action_dec_ttl: + +.. table:: DEC_TTL + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``SET_TTL`` +^^^^^^^^^^^^^^^^^^^ + +Assigns a new TTL value. + +If there is no valid RTE_FLOW_ITEM_TYPE_IPV4 or RTE_FLOW_ITEM_TYPE_IPV6 +in pattern, Some PMDs will reject rule because behavior will be undefined. + +.. _table_rte_flow_action_set_ttl: + +.. table:: SET_TTL + + +---------------+--------------------+ + | Field | Value | + +===============+====================+ + | ``ttl_value`` | new TTL value | + +---------------+--------------------+ + +Action: ``SET_MAC_SRC`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Set source MAC address. + +It must be used with a valid RTE_FLOW_ITEM_TYPE_ETH flow pattern item. +Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned. + +.. _table_rte_flow_action_set_mac_src: + +.. table:: SET_MAC_SRC + + +--------------+---------------+ + | Field | Value | + +==============+===============+ + | ``mac_addr`` | MAC address | + +--------------+---------------+ + +Action: ``SET_MAC_DST`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Set destination MAC address. + +It must be used with a valid RTE_FLOW_ITEM_TYPE_ETH flow pattern item. +Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned. + +.. _table_rte_flow_action_set_mac_dst: + +.. table:: SET_MAC_DST + + +--------------+---------------+ + | Field | Value | + +==============+===============+ + | ``mac_addr`` | MAC address | + +--------------+---------------+ + +Action: ``INC_TCP_SEQ`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Increase sequence number in the outermost TCP header. +Value to increase TCP sequence number by is a big-endian 32 bit integer. + +Using this action on non-matching traffic will result in undefined behavior. + +Action: ``DEC_TCP_SEQ`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Decrease sequence number in the outermost TCP header. +Value to decrease TCP sequence number by is a big-endian 32 bit integer. + +Using this action on non-matching traffic will result in undefined behavior. + +Action: ``INC_TCP_ACK`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Increase acknowledgment number in the outermost TCP header. +Value to increase TCP acknowledgment number by is a big-endian 32 bit integer. + +Using this action on non-matching traffic will result in undefined behavior. + +Action: ``DEC_TCP_ACK`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Decrease acknowledgment number in the outermost TCP header. +Value to decrease TCP acknowledgment number by is a big-endian 32 bit integer. + +Using this action on non-matching traffic will result in undefined behavior. + +Action: ``SET_TAG`` +^^^^^^^^^^^^^^^^^^^ + +Set Tag. + +Tag is a transient data used during flow matching. This is not delivered to +application. Multiple tags are supported by specifying index. + +.. _table_rte_flow_action_set_tag: + +.. table:: SET_TAG + + +-----------+----------------------------+ + | Field | Value | + +===========+============================+ + | ``data`` | 32 bit tag value | + +-----------+----------------------------+ + | ``mask`` | bit-mask applies to "data" | + +-----------+----------------------------+ + | ``index`` | index of tag to set | + +-----------+----------------------------+ + +Action: ``SET_META`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Set metadata. Item ``META`` matches metadata. + +Metadata set by mbuf metadata field with PKT_TX_DYNF_METADATA flag on egress +will be overridden by this action. On ingress, the metadata will be carried by +``metadata`` dynamic field of ``rte_mbuf`` which can be accessed by +``RTE_FLOW_DYNF_METADATA()``. PKT_RX_DYNF_METADATA flag will be set along +with the data. + +The mbuf dynamic field must be registered by calling +``rte_flow_dynf_metadata_register()`` prior to use ``SET_META`` action. + +Altering partial bits is supported with ``mask``. For bits which have never been +set, unpredictable value will be seen depending on driver implementation. For +loopback/hairpin packet, metadata set on Rx/Tx may or may not be propagated to +the other path depending on HW capability. + +.. _table_rte_flow_action_set_meta: + +.. table:: SET_META + + +----------+----------------------------+ + | Field | Value | + +==========+============================+ + | ``data`` | 32 bit metadata value | + +----------+----------------------------+ + | ``mask`` | bit-mask applies to "data" | + +----------+----------------------------+ + +Action: ``SET_IPV4_DSCP`` +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Set IPv4 DSCP. + +Modify DSCP in IPv4 header. + +It must be used with RTE_FLOW_ITEM_TYPE_IPV4 in pattern. +Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned. + +.. _table_rte_flow_action_set_ipv4_dscp: + +.. table:: SET_IPV4_DSCP + + +-----------+---------------------------------+ + | Field | Value | + +===========+=================================+ + | ``dscp`` | DSCP in low 6 bits, rest ignore | + +-----------+---------------------------------+ + +Action: ``SET_IPV6_DSCP`` +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Set IPv6 DSCP. + +Modify DSCP in IPv6 header. + +It must be used with RTE_FLOW_ITEM_TYPE_IPV6 in pattern. +Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned. + +.. _table_rte_flow_action_set_ipv6_dscp: + +.. table:: SET_IPV6_DSCP + + +-----------+---------------------------------+ + | Field | Value | + +===========+=================================+ + | ``dscp`` | DSCP in low 6 bits, rest ignore | + +-----------+---------------------------------+ + +Action: ``AGE`` +^^^^^^^^^^^^^^^ + +Set ageing timeout configuration to a flow. + +Event RTE_ETH_EVENT_FLOW_AGED will be reported if +timeout passed without any matching on the flow. + +.. _table_rte_flow_action_age: + +.. table:: AGE + + +--------------+---------------------------------+ + | Field | Value | + +==============+=================================+ + | ``timeout`` | 24 bits timeout value | + +--------------+---------------------------------+ + | ``reserved`` | 8 bits reserved, must be zero | + +--------------+---------------------------------+ + | ``context`` | user input flow context | + +--------------+---------------------------------+ + +Negative types +~~~~~~~~~~~~~~ + +All specified pattern items (``enum rte_flow_item_type``) and actions +(``enum rte_flow_action_type``) use positive identifiers. + +The negative space is reserved for dynamic types generated by PMDs during +run-time. PMDs may encounter them as a result but must not accept negative +identifiers they are not aware of. + +A method to generate them remains to be defined. + +Planned types +~~~~~~~~~~~~~ + +Pattern item types will be added as new protocols are implemented. + +Variable headers support through dedicated pattern items, for example in +order to match specific IPv4 options and IPv6 extension headers would be +stacked after IPv4/IPv6 items. + +Other action types are planned but are not defined yet. These include the +ability to alter packet data in several ways, such as performing +encapsulation/decapsulation of tunnel headers. + +Rules management +---------------- + +A rather simple API with few functions is provided to fully manage flow +rules. + +Each created flow rule is associated with an opaque, PMD-specific handle +pointer. The application is responsible for keeping it until the rule is +destroyed. + +Flows rules are represented by ``struct rte_flow`` objects. + +Validation +~~~~~~~~~~ + +Given that expressing a definite set of device capabilities is not +practical, a dedicated function is provided to check if a flow rule is +supported and can be created. + +.. code-block:: c + + int + rte_flow_validate(uint16_t port_id, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + struct rte_flow_error *error); + +The flow rule is validated for correctness and whether it could be accepted +by the device given sufficient resources. The rule is checked against the +current device mode and queue configuration. The flow rule may also +optionally be validated against existing flow rules and device resources. +This function has no effect on the target device. + +The returned value is guaranteed to remain valid only as long as no +successful calls to ``rte_flow_create()`` or ``rte_flow_destroy()`` are made +in the meantime and no device parameter affecting flow rules in any way are +modified, due to possible collisions or resource limitations (although in +such cases ``EINVAL`` should not be returned). + +Arguments: + +- ``port_id``: port identifier of Ethernet device. +- ``attr``: flow rule attributes. +- ``pattern``: pattern specification (list terminated by the END pattern + item). +- ``actions``: associated actions (list terminated by the END action). +- ``error``: perform verbose error reporting if not NULL. PMDs initialize + this structure in case of error only. + +Return values: + +- 0 if flow rule is valid and can be created. A negative errno value + otherwise (``rte_errno`` is also set), the following errors are defined. +- ``-ENOSYS``: underlying device does not support this functionality. +- ``-EINVAL``: unknown or invalid rule specification. +- ``-ENOTSUP``: valid but unsupported rule specification (e.g. partial + bit-masks are unsupported). +- ``EEXIST``: collision with an existing rule. Only returned if device + supports flow rule collision checking and there was a flow rule + collision. Not receiving this return code is no guarantee that creating + the rule will not fail due to a collision. +- ``ENOMEM``: not enough memory to execute the function, or if the device + supports resource validation, resource limitation on the device. +- ``-EBUSY``: action cannot be performed due to busy device resources, may + succeed if the affected queues or even the entire port are in a stopped + state (see ``rte_eth_dev_rx_queue_stop()`` and ``rte_eth_dev_stop()``). + +Creation +~~~~~~~~ + +Creating a flow rule is similar to validating one, except the rule is +actually created and a handle returned. + +.. code-block:: c + + struct rte_flow * + rte_flow_create(uint16_t port_id, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action *actions[], + struct rte_flow_error *error); + +Arguments: + +- ``port_id``: port identifier of Ethernet device. +- ``attr``: flow rule attributes. +- ``pattern``: pattern specification (list terminated by the END pattern + item). +- ``actions``: associated actions (list terminated by the END action). +- ``error``: perform verbose error reporting if not NULL. PMDs initialize + this structure in case of error only. + +Return values: + +A valid handle in case of success, NULL otherwise and ``rte_errno`` is set +to the positive version of one of the error codes defined for +``rte_flow_validate()``. + +Destruction +~~~~~~~~~~~ + +Flow rules destruction is not automatic, and a queue or a port should not be +released if any are still attached to them. Applications must take care of +performing this step before releasing resources. + +.. code-block:: c + + int + rte_flow_destroy(uint16_t port_id, + struct rte_flow *flow, + struct rte_flow_error *error); + + +Failure to destroy a flow rule handle may occur when other flow rules depend +on it, and destroying it would result in an inconsistent state. + +This function is only guaranteed to succeed if handles are destroyed in +reverse order of their creation. + +Arguments: + +- ``port_id``: port identifier of Ethernet device. +- ``flow``: flow rule handle to destroy. +- ``error``: perform verbose error reporting if not NULL. PMDs initialize + this structure in case of error only. + +Return values: + +- 0 on success, a negative errno value otherwise and ``rte_errno`` is set. + +Flush +~~~~~ + +Convenience function to destroy all flow rule handles associated with a +port. They are released as with successive calls to ``rte_flow_destroy()``. + +.. code-block:: c + + int + rte_flow_flush(uint16_t port_id, + struct rte_flow_error *error); + +In the unlikely event of failure, handles are still considered destroyed and +no longer valid but the port must be assumed to be in an inconsistent state. + +Arguments: + +- ``port_id``: port identifier of Ethernet device. +- ``error``: perform verbose error reporting if not NULL. PMDs initialize + this structure in case of error only. + +Return values: + +- 0 on success, a negative errno value otherwise and ``rte_errno`` is set. + +Query +~~~~~ + +Query an existing flow rule. + +This function allows retrieving flow-specific data such as counters. Data +is gathered by special actions which must be present in the flow rule +definition. + +.. code-block:: c + + int + rte_flow_query(uint16_t port_id, + struct rte_flow *flow, + const struct rte_flow_action *action, + void *data, + struct rte_flow_error *error); + +Arguments: + +- ``port_id``: port identifier of Ethernet device. +- ``flow``: flow rule handle to query. +- ``action``: action to query, this must match prototype from flow rule. +- ``data``: pointer to storage for the associated query data type. +- ``error``: perform verbose error reporting if not NULL. PMDs initialize + this structure in case of error only. + +Return values: + +- 0 on success, a negative errno value otherwise and ``rte_errno`` is set. + +.. _flow_isolated_mode: + +Flow isolated mode +------------------ + +The general expectation for ingress traffic is that flow rules process it +first; the remaining unmatched or pass-through traffic usually ends up in a +queue (with or without RSS, locally or in some sub-device instance) +depending on the global configuration settings of a port. + +While fine from a compatibility standpoint, this approach makes drivers more +complex as they have to check for possible side effects outside of this API +when creating or destroying flow rules. It results in a more limited set of +available rule types due to the way device resources are assigned (e.g. no +support for the RSS action even on capable hardware). + +Given that nonspecific traffic can be handled by flow rules as well, +isolated mode is a means for applications to tell a driver that ingress on +the underlying port must be injected from the defined flow rules only; that +no default traffic is expected outside those rules. + +This has the following benefits: + +- Applications get finer-grained control over the kind of traffic they want + to receive (no traffic by default). + +- More importantly they control at what point nonspecific traffic is handled + relative to other flow rules, by adjusting priority levels. + +- Drivers can assign more hardware resources to flow rules and expand the + set of supported rule types. + +Because toggling isolated mode may cause profound changes to the ingress +processing path of a driver, it may not be possible to leave it once +entered. Likewise, existing flow rules or global configuration settings may +prevent a driver from entering isolated mode. + +Applications relying on this mode are therefore encouraged to toggle it as +soon as possible after device initialization, ideally before the first call +to ``rte_eth_dev_configure()`` to avoid possible failures due to conflicting +settings. + +Once effective, the following functionality has no effect on the underlying +port and may return errors such as ``ENOTSUP`` ("not supported"): + +- Toggling promiscuous mode. +- Toggling allmulticast mode. +- Configuring MAC addresses. +- Configuring multicast addresses. +- Configuring VLAN filters. +- Configuring Rx filters through the legacy API (e.g. FDIR). +- Configuring global RSS settings. + +.. code-block:: c + + int + rte_flow_isolate(uint16_t port_id, int set, struct rte_flow_error *error); + +Arguments: + +- ``port_id``: port identifier of Ethernet device. +- ``set``: nonzero to enter isolated mode, attempt to leave it otherwise. +- ``error``: perform verbose error reporting if not NULL. PMDs initialize + this structure in case of error only. + +Return values: + +- 0 on success, a negative errno value otherwise and ``rte_errno`` is set. + +Verbose error reporting +----------------------- + +The defined *errno* values may not be accurate enough for users or +application developers who want to investigate issues related to flow rules +management. A dedicated error object is defined for this purpose: + +.. code-block:: c + + enum rte_flow_error_type { + RTE_FLOW_ERROR_TYPE_NONE, /**< No error. */ + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, /**< Cause unspecified. */ + RTE_FLOW_ERROR_TYPE_HANDLE, /**< Flow rule (handle). */ + RTE_FLOW_ERROR_TYPE_ATTR_GROUP, /**< Group field. */ + RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, /**< Priority field. */ + RTE_FLOW_ERROR_TYPE_ATTR_INGRESS, /**< Ingress field. */ + RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, /**< Egress field. */ + RTE_FLOW_ERROR_TYPE_ATTR, /**< Attributes structure. */ + RTE_FLOW_ERROR_TYPE_ITEM_NUM, /**< Pattern length. */ + RTE_FLOW_ERROR_TYPE_ITEM, /**< Specific pattern item. */ + RTE_FLOW_ERROR_TYPE_ACTION_NUM, /**< Number of actions. */ + RTE_FLOW_ERROR_TYPE_ACTION, /**< Specific action. */ + }; + + struct rte_flow_error { + enum rte_flow_error_type type; /**< Cause field and error types. */ + const void *cause; /**< Object responsible for the error. */ + const char *message; /**< Human-readable error message. */ + }; + +Error type ``RTE_FLOW_ERROR_TYPE_NONE`` stands for no error, in which case +remaining fields can be ignored. Other error types describe the type of the +object pointed by ``cause``. + +If non-NULL, ``cause`` points to the object responsible for the error. For a +flow rule, this may be a pattern item or an individual action. + +If non-NULL, ``message`` provides a human-readable error message. + +This object is normally allocated by applications and set by PMDs in case of +error, the message points to a constant string which does not need to be +freed by the application, however its pointer can be considered valid only +as long as its associated DPDK port remains configured. Closing the +underlying device or unloading the PMD invalidates it. + +Helpers +------- + +Error initializer +~~~~~~~~~~~~~~~~~ + +.. code-block:: c + + static inline int + rte_flow_error_set(struct rte_flow_error *error, + int code, + enum rte_flow_error_type type, + const void *cause, + const char *message); + +This function initializes ``error`` (if non-NULL) with the provided +parameters and sets ``rte_errno`` to ``code``. A negative error ``code`` is +then returned. + +Object conversion +~~~~~~~~~~~~~~~~~ + +.. code-block:: c + + int + rte_flow_conv(enum rte_flow_conv_op op, + void *dst, + size_t size, + const void *src, + struct rte_flow_error *error); + +Convert ``src`` to ``dst`` according to operation ``op``. Possible +operations include: + +- Attributes, pattern item or action duplication. +- Duplication of an entire pattern or list of actions. +- Duplication of a complete flow rule description. +- Pattern item or action name retrieval. + +Caveats +------- + +- DPDK does not keep track of flow rules definitions or flow rule objects + automatically. Applications may keep track of the former and must keep + track of the latter. PMDs may also do it for internal needs, however this + must not be relied on by applications. + +- Flow rules are not maintained between successive port initializations. An + application exiting without releasing them and restarting must re-create + them from scratch. + +- API operations are synchronous and blocking (``EAGAIN`` cannot be + returned). + +- There is no provision for re-entrancy/multi-thread safety, although nothing + should prevent different devices from being configured at the same + time. PMDs may protect their control path functions accordingly. + +- Stopping the data path (TX/RX) should not be necessary when managing flow + rules. If this cannot be achieved naturally or with workarounds (such as + temporarily replacing the burst function pointers), an appropriate error + code must be returned (``EBUSY``). + +- PMDs, not applications, are responsible for maintaining flow rules + configuration when stopping and restarting a port or performing other + actions which may affect them. They can only be destroyed explicitly by + applications. + +For devices exposing multiple ports sharing global settings affected by flow +rules: + +- All ports under DPDK control must behave consistently, PMDs are + responsible for making sure that existing flow rules on a port are not + affected by other ports. + +- Ports not under DPDK control (unaffected or handled by other applications) + are user's responsibility. They may affect existing flow rules and cause + undefined behavior. PMDs aware of this may prevent flow rules creation + altogether in such cases. + +PMD interface +------------- + +The PMD interface is defined in ``rte_flow_driver.h``. It is not subject to +API/ABI versioning constraints as it is not exposed to applications and may +evolve independently. + +It is currently implemented on top of the legacy filtering framework through +filter type *RTE_ETH_FILTER_GENERIC* that accepts the single operation +*RTE_ETH_FILTER_GET* to return PMD-specific *rte_flow* callbacks wrapped +inside ``struct rte_flow_ops``. + +This overhead is temporarily necessary in order to keep compatibility with +the legacy filtering framework, which should eventually disappear. + +- PMD callbacks implement exactly the interface described in `Rules + management`_, except for the port ID argument which has already been + converted to a pointer to the underlying ``struct rte_eth_dev``. + +- Public API functions do not process flow rules definitions at all before + calling PMD functions (no basic error checking, no validation + whatsoever). They only make sure these callbacks are non-NULL or return + the ``ENOSYS`` (function not supported) error. + +This interface additionally defines the following helper function: + +- ``rte_flow_ops_get()``: get generic flow operations structure from a + port. + +More will be added over time. + +Device compatibility +-------------------- + +No known implementation supports all the described features. + +Unsupported features or combinations are not expected to be fully emulated +in software by PMDs for performance reasons. Partially supported features +may be completed in software as long as hardware performs most of the work +(such as queue redirection and packet recognition). + +However PMDs are expected to do their best to satisfy application requests +by working around hardware limitations as long as doing so does not affect +the behavior of existing flow rules. + +The following sections provide a few examples of such cases and describe how +PMDs should handle them, they are based on limitations built into the +previous APIs. + +Global bit-masks +~~~~~~~~~~~~~~~~ + +Each flow rule comes with its own, per-layer bit-masks, while hardware may +support only a single, device-wide bit-mask for a given layer type, so that +two IPv4 rules cannot use different bit-masks. + +The expected behavior in this case is that PMDs automatically configure +global bit-masks according to the needs of the first flow rule created. + +Subsequent rules are allowed only if their bit-masks match those, the +``EEXIST`` error code should be returned otherwise. + +Unsupported layer types +~~~~~~~~~~~~~~~~~~~~~~~ + +Many protocols can be simulated by crafting patterns with the `Item: RAW`_ +type. + +PMDs can rely on this capability to simulate support for protocols with +headers not directly recognized by hardware. + +``ANY`` pattern item +~~~~~~~~~~~~~~~~~~~~ + +This pattern item stands for anything, which can be difficult to translate +to something hardware would understand, particularly if followed by more +specific types. + +Consider the following pattern: + +.. _table_rte_flow_unsupported_any: + +.. table:: Pattern with ANY as L3 + + +-------+-----------------------+ + | Index | Item | + +=======+=======================+ + | 0 | ETHER | + +-------+-----+---------+-------+ + | 1 | ANY | ``num`` | ``1`` | + +-------+-----+---------+-------+ + | 2 | TCP | + +-------+-----------------------+ + | 3 | END | + +-------+-----------------------+ + +Knowing that TCP does not make sense with something other than IPv4 and IPv6 +as L3, such a pattern may be translated to two flow rules instead: + +.. _table_rte_flow_unsupported_any_ipv4: + +.. table:: ANY replaced with IPV4 + + +-------+--------------------+ + | Index | Item | + +=======+====================+ + | 0 | ETHER | + +-------+--------------------+ + | 1 | IPV4 (zeroed mask) | + +-------+--------------------+ + | 2 | TCP | + +-------+--------------------+ + | 3 | END | + +-------+--------------------+ + +| + +.. _table_rte_flow_unsupported_any_ipv6: + +.. table:: ANY replaced with IPV6 + + +-------+--------------------+ + | Index | Item | + +=======+====================+ + | 0 | ETHER | + +-------+--------------------+ + | 1 | IPV6 (zeroed mask) | + +-------+--------------------+ + | 2 | TCP | + +-------+--------------------+ + | 3 | END | + +-------+--------------------+ + +Note that as soon as a ANY rule covers several layers, this approach may +yield a large number of hidden flow rules. It is thus suggested to only +support the most common scenarios (anything as L2 and/or L3). + +Unsupported actions +~~~~~~~~~~~~~~~~~~~ + +- When combined with `Action: QUEUE`_, packet counting (`Action: COUNT`_) + and tagging (`Action: MARK`_ or `Action: FLAG`_) may be implemented in + software as long as the target queue is used by a single rule. + +- When a single target queue is provided, `Action: RSS`_ can also be + implemented through `Action: QUEUE`_. + +Flow rules priority +~~~~~~~~~~~~~~~~~~~ + +While it would naturally make sense, flow rules cannot be assumed to be +processed by hardware in the same order as their creation for several +reasons: + +- They may be managed internally as a tree or a hash table instead of a + list. +- Removing a flow rule before adding another one can either put the new rule + at the end of the list or reuse a freed entry. +- Duplication may occur when packets are matched by several rules. + +For overlapping rules (particularly in order to use `Action: PASSTHRU`_) +predictable behavior is only guaranteed by using different priority levels. + +Priority levels are not necessarily implemented in hardware, or may be +severely limited (e.g. a single priority bit). + +For these reasons, priority levels may be implemented purely in software by +PMDs. + +- For devices expecting flow rules to be added in the correct order, PMDs + may destroy and re-create existing rules after adding a new one with + a higher priority. + +- A configurable number of dummy or empty rules can be created at + initialization time to save high priority slots for later. + +- In order to save priority levels, PMDs may evaluate whether rules are + likely to collide and adjust their priority accordingly. + +Future evolutions +----------------- + +- A device profile selection function which could be used to force a + permanent profile instead of relying on its automatic configuration based + on existing flow rules. + +- A method to optimize *rte_flow* rules with specific pattern items and + action types generated on the fly by PMDs. DPDK should assign negative + numbers to these in order to not collide with the existing types. See + `Negative types`_. + +- Adding specific egress pattern items and actions as described in + `Attribute: Traffic direction`_. + +- Optional software fallback when PMDs are unable to handle requested flow + rules so applications do not have to implement their own. + +.. _OpenFlow Switch Specification: https://www.opennetworking.org/software-defined-standards/specifications/ diff --git a/src/spdk/dpdk/doc/guides/prog_guide/rte_security.rst b/src/spdk/dpdk/doc/guides/prog_guide/rte_security.rst new file mode 100644 index 000000000..9b5d249de --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/rte_security.rst @@ -0,0 +1,659 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2017 NXP + + + +Security Library +================ + +The security library provides a framework for management and provisioning +of security protocol operations offloaded to hardware based devices. The +library defines generic APIs to create and free security sessions which can +support full protocol offload as well as inline crypto operation with +NIC or crypto devices. The framework currently only supports the IPsec and PDCP +protocol and associated operations, other protocols will be added in future. + +Design Principles +----------------- + +The security library provides an additional offload capability to an existing +crypto device and/or ethernet device. + +.. code-block:: console + + +---------------+ + | rte_security | + +---------------+ + \ / + +-----------+ +--------------+ + | NIC PMD | | CRYPTO PMD | + +-----------+ +--------------+ + +.. note:: + + Currently, the security library does not support the case of multi-process. + It will be updated in the future releases. + +The supported offload types are explained in the sections below. + +Inline Crypto +~~~~~~~~~~~~~ + +RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO: +The crypto processing for security protocol (e.g. IPsec) is processed +inline during receive and transmission on NIC port. The flow based +security action should be configured on the port. + +Ingress Data path - The packet is decrypted in RX path and relevant +crypto status is set in Rx descriptors. After the successful inline +crypto processing the packet is presented to host as a regular Rx packet +however all security protocol related headers are still attached to the +packet. e.g. In case of IPsec, the IPsec tunnel headers (if any), +ESP/AH headers will remain in the packet but the received packet +contains the decrypted data where the encrypted data was when the packet +arrived. The driver Rx path check the descriptors and based on the +crypto status sets additional flags in the rte_mbuf.ol_flags field. + +.. note:: + + The underlying device may not support crypto processing for all ingress packet + matching to a particular flow (e.g. fragmented packets), such packets will + be passed as encrypted packets. It is the responsibility of application to + process such encrypted packets using other crypto driver instance. + +Egress Data path - The software prepares the egress packet by adding +relevant security protocol headers. Only the data will not be +encrypted by the software. The driver will accordingly configure the +tx descriptors. The hardware device will encrypt the data before sending the +packet out. + +.. note:: + + The underlying device may support post encryption TSO. + +.. code-block:: console + + Egress Data Path + | + +--------|--------+ + | egress IPsec | + | | | + | +------V------+ | + | | SADB lookup | | + | +------|------+ | + | +------V------+ | + | | Tunnel | | <------ Add tunnel header to packet + | +------|------+ | + | +------V------+ | + | | ESP | | <------ Add ESP header without trailer to packet + | | | | <------ Mark packet to be offloaded, add trailer + | +------|------+ | meta-data to mbuf + +--------V--------+ + | + +--------V--------+ + | L2 Stack | + +--------|--------+ + | + +--------V--------+ + | | + | NIC PMD | <------ Set hw context for inline crypto offload + | | + +--------|--------+ + | + +--------|--------+ + | HW ACCELERATED | <------ Packet Encryption and + | NIC | Authentication happens inline + | | + +-----------------+ + + +Inline protocol offload +~~~~~~~~~~~~~~~~~~~~~~~ + +RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL: +The crypto and protocol processing for security protocol (e.g. IPsec) +is processed inline during receive and transmission. The flow based +security action should be configured on the port. + +Ingress Data path - The packet is decrypted in the RX path and relevant +crypto status is set in the Rx descriptors. After the successful inline +crypto processing the packet is presented to the host as a regular Rx packet +but all security protocol related headers are optionally removed from the +packet. e.g. in the case of IPsec, the IPsec tunnel headers (if any), +ESP/AH headers will be removed from the packet and the received packet +will contains the decrypted packet only. The driver Rx path checks the +descriptors and based on the crypto status sets additional flags in +``rte_mbuf.ol_flags`` field. The driver would also set device-specific +metadata in ``rte_mbuf.udata64`` field. This will allow the application +to identify the security processing done on the packet. + +.. note:: + + The underlying device in this case is stateful. It is expected that + the device shall support crypto processing for all kind of packets matching + to a given flow, this includes fragmented packets (post reassembly). + E.g. in case of IPsec the device may internally manage anti-replay etc. + It will provide a configuration option for anti-replay behavior i.e. to drop + the packets or pass them to driver with error flags set in the descriptor. + +Egress Data path - The software will send the plain packet without any +security protocol headers added to the packet. The driver will configure +the security index and other requirement in tx descriptors. +The hardware device will do security processing on the packet that includes +adding the relevant protocol headers and encrypting the data before sending +the packet out. The software should make sure that the buffer +has required head room and tail room for any protocol header addition. The +software may also do early fragmentation if the resultant packet is expected +to cross the MTU size. + + +.. note:: + + The underlying device will manage state information required for egress + processing. E.g. in case of IPsec, the seq number will be added to the + packet, however the device shall provide indication when the sequence number + is about to overflow. The underlying device may support post encryption TSO. + +.. code-block:: console + + Egress Data Path + | + +--------|--------+ + | egress IPsec | + | | | + | +------V------+ | + | | SADB lookup | | + | +------|------+ | + | +------V------+ | + | | Desc | | <------ Mark packet to be offloaded + | +------|------+ | + +--------V--------+ + | + +--------V--------+ + | L2 Stack | + +--------|--------+ + | + +--------V--------+ + | | + | NIC PMD | <------ Set hw context for inline crypto offload + | | + +--------|--------+ + | + +--------|--------+ + | HW ACCELERATED | <------ Add tunnel, ESP header etc header to + | NIC | packet. Packet Encryption and + | | Authentication happens inline. + +-----------------+ + + +Lookaside protocol offload +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL: +This extends librte_cryptodev to support the programming of IPsec +Security Association (SA) as part of a crypto session creation including +the definition. In addition to standard crypto processing, as defined by +the cryptodev, the security protocol processing is also offloaded to the +crypto device. + +Decryption: The packet is sent to the crypto device for security +protocol processing. The device will decrypt the packet and it will also +optionally remove additional security headers from the packet. +E.g. in case of IPsec, IPsec tunnel headers (if any), ESP/AH headers +will be removed from the packet and the decrypted packet may contain +plain data only. + +.. note:: + + In case of IPsec the device may internally manage anti-replay etc. + It will provide a configuration option for anti-replay behavior i.e. to drop + the packets or pass them to driver with error flags set in descriptor. + +Encryption: The software will submit the packet to cryptodev as usual +for encryption, the hardware device in this case will also add the relevant +security protocol header along with encrypting the packet. The software +should make sure that the buffer has required head room and tail room +for any protocol header addition. + +.. note:: + + In the case of IPsec, the seq number will be added to the packet, + It shall provide an indication when the sequence number is about to + overflow. + +.. code-block:: console + + Egress Data Path + | + +--------|--------+ + | egress IPsec | + | | | + | +------V------+ | + | | SADB lookup | | <------ SA maps to cryptodev session + | +------|------+ | + | +------|------+ | + | | \--------------------\ + | | Crypto | | | <- Crypto processing through + | | /----------------\ | inline crypto PMD + | +------|------+ | | | + +--------V--------+ | | + | | | + +--------V--------+ | | create <-- SA is added to hw + | L2 Stack | | | inline using existing create + +--------|--------+ | | session sym session APIs + | | | | + +--------V--------+ +---|---|----V---+ + | | | \---/ | | <--- Add tunnel, ESP header etc + | NIC PMD | | INLINE | | header to packet.Packet + | | | CRYPTO PMD | | Encryption/Decryption and + +--------|--------+ +----------------+ Authentication happens + | inline. + +--------|--------+ + | NIC | + +--------|--------+ + V + +PDCP Flow Diagram +~~~~~~~~~~~~~~~~~ + +Based on 3GPP TS 36.323 Evolved Universal Terrestrial Radio Access (E-UTRA); +Packet Data Convergence Protocol (PDCP) specification + +.. code-block:: c + + Transmitting PDCP Entity Receiving PDCP Entity + | ^ + | +-----------|-----------+ + V | In order delivery and | + +---------|----------+ | Duplicate detection | + | Sequence Numbering | | (Data Plane only) | + +---------|----------+ +-----------|-----------+ + | | + +---------|----------+ +-----------|----------+ + | Header Compression*| | Header Decompression*| + | (Data-Plane only) | | (Data Plane only) | + +---------|----------+ +-----------|----------+ + | | + +---------|-----------+ +-----------|----------+ + | Integrity Protection| |Integrity Verification| + | (Control Plane only)| | (Control Plane only) | + +---------|-----------+ +-----------|----------+ + +---------|-----------+ +----------|----------+ + | Ciphering | | Deciphering | + +---------|-----------+ +----------|----------+ + +---------|-----------+ +----------|----------+ + | Add PDCP header | | Remove PDCP Header | + +---------|-----------+ +----------|----------+ + | | + +----------------->>----------------+ + + +.. note:: + + * Header Compression and decompression are not supported currently. + +Just like IPsec, in case of PDCP also header addition/deletion, cipher/ +de-cipher, integrity protection/verification is done based on the action +type chosen. + +Device Features and Capabilities +--------------------------------- + +Device Capabilities For Security Operations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The device (crypto or ethernet) capabilities which support security operations, +are defined by the security action type, security protocol, protocol +capabilities and corresponding crypto capabilities for security. For the full +scope of the Security capability see definition of rte_security_capability +structure in the *DPDK API Reference*. + +.. code-block:: c + + struct rte_security_capability; + +Each driver (crypto or ethernet) defines its own private array of capabilities +for the operations it supports. Below is an example of the capabilities for a +PMD which supports the IPsec and PDCP protocol. + +.. code-block:: c + + static const struct rte_security_capability pmd_security_capabilities[] = { + { /* IPsec Lookaside Protocol offload ESP Tunnel Egress */ + .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, + .protocol = RTE_SECURITY_PROTOCOL_IPSEC, + .ipsec = { + .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP, + .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL, + .direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS, + .options = { 0 } + }, + .crypto_capabilities = pmd_capabilities + }, + { /* IPsec Lookaside Protocol offload ESP Tunnel Ingress */ + .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, + .protocol = RTE_SECURITY_PROTOCOL_IPSEC, + .ipsec = { + .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP, + .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL, + .direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS, + .options = { 0 } + }, + .crypto_capabilities = pmd_capabilities + }, + { /* PDCP Lookaside Protocol offload Data Plane */ + .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, + .protocol = RTE_SECURITY_PROTOCOL_PDCP, + .pdcp = { + .domain = RTE_SECURITY_PDCP_MODE_DATA, + .capa_flags = 0 + }, + .crypto_capabilities = pmd_capabilities + }, + { /* PDCP Lookaside Protocol offload Control */ + .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, + .protocol = RTE_SECURITY_PROTOCOL_PDCP, + .pdcp = { + .domain = RTE_SECURITY_PDCP_MODE_CONTROL, + .capa_flags = 0 + }, + .crypto_capabilities = pmd_capabilities + }, + { + .action = RTE_SECURITY_ACTION_TYPE_NONE + } + }; + static const struct rte_cryptodev_capabilities pmd_capabilities[] = { + { /* SHA1 HMAC */ + .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, + .sym = { + .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, + .auth = { + .algo = RTE_CRYPTO_AUTH_SHA1_HMAC, + .block_size = 64, + .key_size = { + .min = 64, + .max = 64, + .increment = 0 + }, + .digest_size = { + .min = 12, + .max = 12, + .increment = 0 + }, + .aad_size = { 0 }, + .iv_size = { 0 } + } + } + }, + { /* AES CBC */ + .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, + .sym = { + .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, + .cipher = { + .algo = RTE_CRYPTO_CIPHER_AES_CBC, + .block_size = 16, + .key_size = { + .min = 16, + .max = 32, + .increment = 8 + }, + .iv_size = { + .min = 16, + .max = 16, + .increment = 0 + } + } + } + } + } + + +Capabilities Discovery +~~~~~~~~~~~~~~~~~~~~~~ + +Discovering the features and capabilities of a driver (crypto/ethernet) +is achieved through the ``rte_security_capabilities_get()`` function. + +.. code-block:: c + + const struct rte_security_capability *rte_security_capabilities_get(uint16_t id); + +This allows the user to query a specific driver and get all device +security capabilities. It returns an array of ``rte_security_capability`` structures +which contains all the capabilities for that device. + +Security Session Create/Free +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Security Sessions are created to store the immutable fields of a particular Security +Association for a particular protocol which is defined by a security session +configuration structure which is used in the operation processing of a packet flow. +Sessions are used to manage protocol specific information as well as crypto parameters. +Security sessions cache this immutable data in a optimal way for the underlying PMD +and this allows further acceleration of the offload of Crypto workloads. + +The Security framework provides APIs to create and free sessions for crypto/ethernet +devices, where sessions are mempool objects. It is the application's responsibility +to create and manage the session mempools. The mempool object size should be able to +accommodate the driver's private data of security session. + +Once the session mempools have been created, ``rte_security_session_create()`` +is used to allocate and initialize a session for the required crypto/ethernet device. + +Session APIs need a parameter ``rte_security_ctx`` to identify the crypto/ethernet +security ops. This parameter can be retrieved using the APIs +``rte_cryptodev_get_sec_ctx()`` (for crypto device) or ``rte_eth_dev_get_sec_ctx`` +(for ethernet port). + +Sessions already created can be updated with ``rte_security_session_update()``. + +When a session is no longer used, the user must call ``rte_security_session_destroy()`` +to free the driver private session data and return the memory back to the mempool. + +For look aside protocol offload to hardware crypto device, the ``rte_crypto_op`` +created by the application is attached to the security session by the API +``rte_security_attach_session()``. + +For Inline Crypto and Inline protocol offload, device specific defined metadata is +updated in the mbuf using ``rte_security_set_pkt_metadata()`` if +``DEV_TX_OFFLOAD_SEC_NEED_MDATA`` is set. + +For inline protocol offloaded ingress traffic, the application can register a +pointer, ``userdata`` , in the security session. When the packet is received, +``rte_security_get_userdata()`` would return the userdata registered for the +security session which processed the packet. + +.. note:: + + In case of inline processed packets, ``rte_mbuf.udata64`` field would be + used by the driver to relay information on the security processing + associated with the packet. In ingress, the driver would set this in Rx + path while in egress, ``rte_security_set_pkt_metadata()`` would perform a + similar operation. The application is expected not to modify the field + when it has relevant info. For ingress, this device-specific 64 bit value + is required to derive other information (like userdata), required for + identifying the security processing done on the packet. + +Security session configuration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Security Session configuration structure is defined as ``rte_security_session_conf`` + +.. code-block:: c + + struct rte_security_session_conf { + enum rte_security_session_action_type action_type; + /**< Type of action to be performed on the session */ + enum rte_security_session_protocol protocol; + /**< Security protocol to be configured */ + union { + struct rte_security_ipsec_xform ipsec; + struct rte_security_macsec_xform macsec; + struct rte_security_pdcp_xform pdcp; + }; + /**< Configuration parameters for security session */ + struct rte_crypto_sym_xform *crypto_xform; + /**< Security Session Crypto Transformations */ + void *userdata; + /**< Application specific userdata to be saved with session */ + }; + +The configuration structure reuses the ``rte_crypto_sym_xform`` struct for crypto related +configuration. The ``rte_security_session_action_type`` struct is used to specify whether the +session is configured for Lookaside Protocol offload or Inline Crypto or Inline Protocol +Offload. + +.. code-block:: c + + enum rte_security_session_action_type { + RTE_SECURITY_ACTION_TYPE_NONE, + /**< No security actions */ + RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO, + /**< Crypto processing for security protocol is processed inline + * during transmission + */ + RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL, + /**< All security protocol processing is performed inline during + * transmission + */ + RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, + /**< All security protocol processing including crypto is performed + * on a lookaside accelerator + */ + RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO + /**< Similar to ACTION_TYPE_NONE but crypto processing for security + * protocol is processed synchronously by a CPU. + */ + }; + +The ``rte_security_session_protocol`` is defined as + +.. code-block:: c + + enum rte_security_session_protocol { + RTE_SECURITY_PROTOCOL_IPSEC = 1, + /**< IPsec Protocol */ + RTE_SECURITY_PROTOCOL_MACSEC, + /**< MACSec Protocol */ + RTE_SECURITY_PROTOCOL_PDCP, + /**< PDCP Protocol */ + }; + +Currently the library defines configuration parameters for IPsec and PDCP only. +For other protocols like MACSec, structures and enums are defined as place holders +which will be updated in the future. + +IPsec related configuration parameters are defined in ``rte_security_ipsec_xform`` + +.. code-block:: c + + struct rte_security_ipsec_xform { + uint32_t spi; + /**< SA security parameter index */ + uint32_t salt; + /**< SA salt */ + struct rte_security_ipsec_sa_options options; + /**< various SA options */ + enum rte_security_ipsec_sa_direction direction; + /**< IPsec SA Direction - Egress/Ingress */ + enum rte_security_ipsec_sa_protocol proto; + /**< IPsec SA Protocol - AH/ESP */ + enum rte_security_ipsec_sa_mode mode; + /**< IPsec SA Mode - transport/tunnel */ + struct rte_security_ipsec_tunnel_param tunnel; + /**< Tunnel parameters, NULL for transport mode */ + }; + +PDCP related configuration parameters are defined in ``rte_security_pdcp_xform`` + +.. code-block:: c + + struct rte_security_pdcp_xform { + int8_t bearer; /**< PDCP bearer ID */ + /** Enable in order delivery, this field shall be set only if + * driver/HW is capable. See RTE_SECURITY_PDCP_ORDERING_CAP. + */ + uint8_t en_ordering; + /** Notify driver/HW to detect and remove duplicate packets. + * This field should be set only when driver/hw is capable. + * See RTE_SECURITY_PDCP_DUP_DETECT_CAP. + */ + uint8_t remove_duplicates; + /** PDCP mode of operation: Control or data */ + enum rte_security_pdcp_domain domain; + /** PDCP Frame Direction 0:UL 1:DL */ + enum rte_security_pdcp_direction pkt_dir; + /** Sequence number size, 5/7/12/15/18 */ + enum rte_security_pdcp_sn_size sn_size; + /** Starting Hyper Frame Number to be used together with the SN + * from the PDCP frames + */ + uint32_t hfn; + /** HFN Threshold for key renegotiation */ + uint32_t hfn_threshold; + }; + + +Security API +~~~~~~~~~~~~ + +The rte_security Library API is described in the *DPDK API Reference* document. + +Flow based Security Session +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In the case of NIC based offloads, the security session specified in the +'rte_flow_action_security' must be created on the same port as the +flow action that is being specified. + +The ingress/egress flow attribute should match that specified in the security +session if the security session supports the definition of the direction. + +Multiple flows can be configured to use the same security session. For +example if the security session specifies an egress IPsec SA, then multiple +flows can be specified to that SA. In the case of an ingress IPsec SA then +it is only valid to have a single flow to map to that security session. + +.. code-block:: console + + Configuration Path + | + +--------|--------+ + | Add/Remove | + | IPsec SA | <------ Build security flow action of + | | | ipsec transform + |--------|--------| + | + +--------V--------+ + | Flow API | + +--------|--------+ + | + +--------V--------+ + | | + | NIC PMD | <------ Add/Remove SA to/from hw context + | | + +--------|--------+ + | + +--------|--------+ + | HW ACCELERATED | + | NIC | + | | + +--------|--------+ + +* Add/Delete SA flow: + To add a new inline SA construct a rte_flow_item for Ethernet + IP + ESP + using the SA selectors and the ``rte_crypto_ipsec_xform`` as the ``rte_flow_action``. + Note that any rte_flow_items may be empty, which means it is not checked. + +.. code-block:: console + + In its most basic form, IPsec flow specification is as follows: + +-------+ +----------+ +--------+ +-----+ + | Eth | -> | IP4/6 | -> | ESP | -> | END | + +-------+ +----------+ +--------+ +-----+ + + However, the API can represent, IPsec crypto offload with any encapsulation: + +-------+ +--------+ +-----+ + | Eth | -> ... -> | ESP | -> | END | + +-------+ +--------+ +-----+ diff --git a/src/spdk/dpdk/doc/guides/prog_guide/service_cores.rst b/src/spdk/dpdk/doc/guides/prog_guide/service_cores.rst new file mode 100644 index 000000000..270b87578 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/service_cores.rst @@ -0,0 +1,54 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation. + +Service Cores +============= + +DPDK has a concept known as service cores, which enables a dynamic way of +performing work on DPDK lcores. Service core support is built into the EAL, and +an API is provided to optionally allow applications to control how the service +cores are used at runtime. + +The service cores concept is built up out of services (components of DPDK that +require CPU cycles to operate) and service cores (DPDK lcores, tasked with +running services). The power of the service core concept is that the mapping +between service cores and services can be configured to abstract away the +difference between platforms and environments. + +For example, the Eventdev has hardware and software PMDs. Of these the software +PMD requires an lcore to perform the scheduling operations, while the hardware +PMD does not. With service cores, the application would not directly notice +that the scheduling is done in software. + +For detailed information about the service core API, please refer to the docs. + +Service Core Initialization +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +There are two methods to having service cores in a DPDK application, either by +using the service coremask, or by dynamically adding cores using the API. +The simpler of the two is to pass the `-s` coremask argument to EAL, which will +take any cores available in the main DPDK coremask, and if the bits are also set +in the service coremask the cores become service-cores instead of DPDK +application lcores. + +Enabling Services on Cores +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Each registered service can be individually mapped to a service core, or set of +service cores. Enabling a service on a particular core means that the lcore in +question will run the service. Disabling that core on the service stops the +lcore in question from running the service. + +Using this method, it is possible to assign specific workloads to each +service core, and map N workloads to M number of service cores. Each service +lcore loops over the services that are enabled for that core, and invokes the +function to run the service. + +Service Core Statistics +~~~~~~~~~~~~~~~~~~~~~~~ + +The service core library is capable of collecting runtime statistics like number +of calls to a specific service, and number of cycles used by the service. The +cycle count collection is dynamically configurable, allowing any application to +profile the services running on the system at any time. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/source_org.rst b/src/spdk/dpdk/doc/guides/prog_guide/source_org.rst new file mode 100644 index 000000000..31c153a1b --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/source_org.rst @@ -0,0 +1,63 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +**Part 2: Development Environment** + +Source Organization +=================== + +This section describes the organization of sources in the DPDK framework. + +Makefiles and Config +-------------------- + +.. note:: + + In the following descriptions, + ``RTE_SDK`` is the environment variable that points to the base directory into which the tarball was extracted. + See + :ref:`Useful_Variables_Provided_by_the_Build_System` + for descriptions of other variables. + +Makefiles that are provided by the DPDK libraries and applications are located in ``$(RTE_SDK)/mk``. + +Config templates are located in ``$(RTE_SDK)/config``. The templates describe the options that are enabled for each target. +The config file also contains items that can be enabled and disabled for many of the DPDK libraries, +including debug options. +The user should look at the config file and become familiar with these options. +The config file is also used to create a header file, which will be located in the new build directory. + +Libraries +--------- + +Libraries are located in subdirectories of ``$(RTE_SDK)/lib``. +By convention a library refers to any code that provides an API to an application. +Typically, it generates an archive file (``.a``), but a kernel module would also go in the same directory. + +Drivers +------- + +Drivers are special libraries which provide poll-mode driver implementations for +devices: either hardware devices or pseudo/virtual devices. They are contained +in the *drivers* subdirectory, classified by type, and each compiles to a +library with the format ``librte_pmd_X.a`` where ``X`` is the driver name. + +.. note:: + + Several of the ``driver/net`` directories contain a ``base`` + sub-directory. The ``base`` directory generally contains code the shouldn't + be modified directly by the user. Any enhancements should be done via the + ``X_osdep.c`` and/or ``X_osdep.h`` files in that directory. Refer to the + local README in the base directories for driver specific instructions. + + +Applications +------------ + +Applications are source files that contain a ``main()`` function. +They are located in the ``$(RTE_SDK)/app`` and ``$(RTE_SDK)/examples`` directories. + +The app directory contains sample applications that are used to test DPDK (such as autotests) +or the Poll Mode Drivers (test-pmd). + +The examples directory contains :doc:`Sample applications<../sample_app_ug/index>` that show how libraries can be used. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/stack_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/stack_lib.rst new file mode 100644 index 000000000..8fe8804e3 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/stack_lib.rst @@ -0,0 +1,83 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2019 Intel Corporation. + +Stack Library +============= + +DPDK's stack library provides an API for configuration and use of a bounded +stack of pointers. + +The stack library provides the following basic operations: + +* Create a uniquely named stack of a user-specified size and using a + user-specified socket, with either standard (lock-based) or lock-free + behavior. + +* Push and pop a burst of one or more stack objects (pointers). These function + are multi-threading safe. + +* Free a previously created stack. + +* Lookup a pointer to a stack by its name. + +* Query a stack's current depth and number of free entries. + +Implementation +~~~~~~~~~~~~~~ + +The library supports two types of stacks: standard (lock-based) and lock-free. +Both types use the same set of interfaces, but their implementations differ. + +Lock-based Stack +---------------- + +The lock-based stack consists of a contiguous array of pointers, a current +index, and a spinlock. Accesses to the stack are made multi-thread safe by the +spinlock. + +Lock-free Stack +------------------ + +The lock-free stack consists of a linked list of elements, each containing a +data pointer and a next pointer, and an atomic stack depth counter. The +lock-free property means that multiple threads can push and pop simultaneously, +and one thread being preempted/delayed in a push or pop operation will not +impede the forward progress of any other thread. + +The lock-free push operation enqueues a linked list of pointers by pointing the +list's tail to the current stack head, and using a CAS to swing the stack head +pointer to the head of the list. The operation retries if it is unsuccessful +(i.e. the list changed between reading the head and modifying it), else it +adjusts the stack length and returns. + +The lock-free pop operation first reserves one or more list elements by +adjusting the stack length, to ensure the dequeue operation will succeed +without blocking. It then dequeues pointers by walking the list -- starting +from the head -- then swinging the head pointer (using a CAS as well). While +walking the list, the data pointers are recorded in an object table. + +The linked list elements themselves are maintained in a lock-free LIFO, and are +allocated before stack pushes and freed after stack pops. Since the stack has a +fixed maximum depth, these elements do not need to be dynamically created. + +The lock-free behavior is selected by passing the *RTE_STACK_F_LF* flag to +rte_stack_create(). + +Preventing the ABA Problem +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To prevent the ABA problem, this algorithm stack uses a 128-bit +compare-and-swap instruction to atomically update both the stack top pointer +and a modification counter. The ABA problem can occur without a modification +counter if, for example: + +1. Thread A reads head pointer X and stores the pointed-to list element. +2. Other threads modify the list such that the head pointer is once again X, + but its pointed-to data is different than what thread A read. +3. Thread A changes the head pointer with a compare-and-swap and succeeds. + +In this case thread A would not detect that the list had changed, and would +both pop stale data and incorrect change the head pointer. By adding a +modification counter that is updated on every push and pop as part of the +compare-and-swap, the algorithm can detect when the list changes even if the +head pointer remains the same. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/switch_representation.rst b/src/spdk/dpdk/doc/guides/prog_guide/switch_representation.rst new file mode 100644 index 000000000..cc1d0d756 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/switch_representation.rst @@ -0,0 +1,835 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2018 6WIND S.A. + +.. _switch_representation: + +Switch Representation within DPDK Applications +============================================== + +.. contents:: :local: + +Introduction +------------ + +Network adapters with multiple physical ports and/or SR-IOV capabilities +usually support the offload of traffic steering rules between their virtual +functions (VFs), physical functions (PFs) and ports. + +Like for standard Ethernet switches, this involves a combination of +automatic MAC learning and manual configuration. For most purposes it is +managed by the host system and fully transparent to users and applications. + +On the other hand, applications typically found on hypervisors that process +layer 2 (L2) traffic (such as OVS) need to steer traffic themselves +according on their own criteria. + +Without a standard software interface to manage traffic steering rules +between VFs, PFs and the various physical ports of a given device, +applications cannot take advantage of these offloads; software processing is +mandatory even for traffic which ends up re-injected into the device it +originates from. + +This document describes how such steering rules can be configured through +the DPDK flow API (**rte_flow**), with emphasis on the SR-IOV use case +(PF/VF steering) using a single physical port for clarity, however the same +logic applies to any number of ports without necessarily involving SR-IOV. + +Port Representors +----------------- + +In many cases, traffic steering rules cannot be determined in advance; +applications usually have to process a bit of traffic in software before +thinking about offloading specific flows to hardware. + +Applications therefore need the ability to receive and inject traffic to +various device endpoints (other VFs, PFs or physical ports) before +connecting them together. Device drivers must provide means to hook the +"other end" of these endpoints and to refer them when configuring flow +rules. + +This role is left to so-called "port representors" (also known as "VF +representors" in the specific context of VFs), which are to DPDK what the +Ethernet switch device driver model (**switchdev**) [1]_ is to Linux, and +which can be thought as a software "patch panel" front-end for applications. + +- DPDK port representors are implemented as additional virtual Ethernet + device (**ethdev**) instances, spawned on an as needed basis through + configuration parameters passed to the driver of the underlying + device using devargs. + +:: + + -w pci:dbdf,representor=0 + -w pci:dbdf,representor=[0-3] + -w pci:dbdf,representor=[0,5-11] + +- As virtual devices, they may be more limited than their physical + counterparts, for instance by exposing only a subset of device + configuration callbacks and/or by not necessarily having Rx/Tx capability. + +- Among other things, they can be used to assign MAC addresses to the + resource they represent. + +- Applications can tell port representors apart from other physical of virtual + port by checking the dev_flags field within their device information + structure for the RTE_ETH_DEV_REPRESENTOR bit-field. + +.. code-block:: c + + struct rte_eth_dev_info { + ... + uint32_t dev_flags; /**< Device flags */ + ... + }; + +- The device or group relationship of ports can be discovered using the + switch ``domain_id`` field within the devices switch information structure. By + default the switch ``domain_id`` of a port will be + ``RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID`` to indicate that the port doesn't + support the concept of a switch domain, but ports which do support the concept + will be allocated a unique switch ``domain_id``, ports within the same switch + domain will share the same ``domain_id``. The switch ``port_id`` is used to + specify the port_id in terms of the switch, so in the case of SR-IOV devices + the switch ``port_id`` would represent the virtual function identifier of the + port. + +.. code-block:: c + + /** + * Ethernet device associated switch information + */ + struct rte_eth_switch_info { + const char *name; /**< switch name */ + uint16_t domain_id; /**< switch domain id */ + uint16_t port_id; /**< switch port id */ + }; + + +.. [1] `Ethernet switch device driver model (switchdev) + <https://www.kernel.org/doc/Documentation/networking/switchdev.txt>`_ + +Basic SR-IOV +------------ + +"Basic" in the sense that it is not managed by applications, which +nonetheless expect traffic to flow between the various endpoints and the +outside as if everything was linked by an Ethernet hub. + +The following diagram pictures a setup involving a device with one PF, two +VFs and one shared physical port + +:: + + .-------------. .-------------. .-------------. + | hypervisor | | VM 1 | | VM 2 | + | application | | application | | application | + `--+----------' `----------+--' `--+----------' + | | | + .-----+-----. | | + | port_id 3 | | | + `-----+-----' | | + | | | + .-+--. .---+--. .--+---. + | PF | | VF 1 | | VF 2 | + `-+--' `---+--' `--+---' + | | | + `---------. .-----------------------' | + | | .-------------------------' + | | | + .--+-----+-----+--. + | interconnection | + `--------+--------' + | + .----+-----. + | physical | + | port 0 | + `----------' + +- A DPDK application running on the hypervisor owns the PF device, which is + arbitrarily assigned port index 3. + +- Both VFs are assigned to VMs and used by unknown applications; they may be + DPDK-based or anything else. + +- Interconnection is not necessarily done through a true Ethernet switch and + may not even exist as a separate entity. The role of this block is to show + that something brings PF, VFs and physical ports together and enables + communication between them, with a number of built-in restrictions. + +Subsequent sections in this document describe means for DPDK applications +running on the hypervisor to freely assign specific flows between PF, VFs +and physical ports based on traffic properties, by managing this +interconnection. + +Controlled SR-IOV +----------------- + +Initialization +~~~~~~~~~~~~~~ + +When a DPDK application gets assigned a PF device and is deliberately not +started in `basic SR-IOV`_ mode, any traffic coming from physical ports is +received by PF according to default rules, while VFs remain isolated. + +:: + + .-------------. .-------------. .-------------. + | hypervisor | | VM 1 | | VM 2 | + | application | | application | | application | + `--+----------' `----------+--' `--+----------' + | | | + .-----+-----. | | + | port_id 3 | | | + `-----+-----' | | + | | | + .-+--. .---+--. .--+---. + | PF | | VF 1 | | VF 2 | + `-+--' `------' `------' + | + `-----. + | + .--+----------------------. + | managed interconnection | + `------------+------------' + | + .----+-----. + | physical | + | port 0 | + `----------' + +In this mode, interconnection must be configured by the application to +enable VF communication, for instance by explicitly directing traffic with a +given destination MAC address to VF 1 and allowing that with the same source +MAC address to come out of it. + +For this to work, hypervisor applications need a way to refer to either VF 1 +or VF 2 in addition to the PF. This is addressed by `VF representors`_. + +VF Representors +~~~~~~~~~~~~~~~ + +VF representors are virtual but standard DPDK network devices (albeit with +limited capabilities) created by PMDs when managing a PF device. + +Since they represent VF instances used by other applications, configuring +them (e.g. assigning a MAC address or setting up promiscuous mode) affects +interconnection accordingly. If supported, they may also be used as two-way +communication ports with VFs (assuming **switchdev** topology) + + +:: + + .-------------. .-------------. .-------------. + | hypervisor | | VM 1 | | VM 2 | + | application | | application | | application | + `--+---+---+--' `----------+--' `--+----------' + | | | | | + | | `-------------------. | | + | `---------. | | | + | | | | | + .-----+-----. .-----+-----. .-----+-----. | | + | port_id 3 | | port_id 4 | | port_id 5 | | | + `-----+-----' `-----+-----' `-----+-----' | | + | | | | | + .-+--. .-----+-----. .-----+-----. .---+--. .--+---. + | PF | | VF 1 rep. | | VF 2 rep. | | VF 1 | | VF 2 | + `-+--' `-----+-----' `-----+-----' `---+--' `--+---' + | | | | | + | | .---------' | | + `-----. | | .-----------------' | + | | | | .---------------------' + | | | | | + .--+-------+---+---+---+--. + | managed interconnection | + `------------+------------' + | + .----+-----. + | physical | + | port 0 | + `----------' + +- VF representors are assigned arbitrary port indices 4 and 5 in the + hypervisor application and are respectively associated with VF 1 and VF 2. + +- They can't be dissociated; even if VF 1 and VF 2 were not connected, + representors could still be used for configuration. + +- In this context, port index 3 can be thought as a representor for physical + port 0. + +As previously described, the "interconnection" block represents a logical +concept. Interconnection occurs when hardware configuration enables traffic +flows from one place to another (e.g. physical port 0 to VF 1) according to +some criteria. + +This is discussed in more detail in `traffic steering`_. + +Traffic Steering +~~~~~~~~~~~~~~~~ + +In the following diagram, each meaningful traffic origin or endpoint as seen +by the hypervisor application is tagged with a unique letter from A to F. + +:: + + .-------------. .-------------. .-------------. + | hypervisor | | VM 1 | | VM 2 | + | application | | application | | application | + `--+---+---+--' `----------+--' `--+----------' + | | | | | + | | `-------------------. | | + | `---------. | | | + | | | | | + .----(A)----. .----(B)----. .----(C)----. | | + | port_id 3 | | port_id 4 | | port_id 5 | | | + `-----+-----' `-----+-----' `-----+-----' | | + | | | | | + .-+--. .-----+-----. .-----+-----. .---+--. .--+---. + | PF | | VF 1 rep. | | VF 2 rep. | | VF 1 | | VF 2 | + `-+--' `-----+-----' `-----+-----' `--(D)-' `-(E)--' + | | | | | + | | .---------' | | + `-----. | | .-----------------' | + | | | | .---------------------' + | | | | | + .--+-------+---+---+---+--. + | managed interconnection | + `------------+------------' + | + .---(F)----. + | physical | + | port 0 | + `----------' + +- **A**: PF device. +- **B**: port representor for VF 1. +- **C**: port representor for VF 2. +- **D**: VF 1 proper. +- **E**: VF 2 proper. +- **F**: physical port. + +Although uncommon, some devices do not enforce a one to one mapping between +PF and physical ports. For instance, by default all ports of **mlx4** +adapters are available to all their PF/VF instances, in which case +additional ports appear next to **F** in the above diagram. + +Assuming no interconnection is provided by default in this mode, setting up +a `basic SR-IOV`_ configuration involving physical port 0 could be broken +down as: + +PF: + +- **A to F**: let everything through. +- **F to A**: PF MAC as destination. + +VF 1: + +- **A to D**, **E to D** and **F to D**: VF 1 MAC as destination. +- **D to A**: VF 1 MAC as source and PF MAC as destination. +- **D to E**: VF 1 MAC as source and VF 2 MAC as destination. +- **D to F**: VF 1 MAC as source. + +VF 2: + +- **A to E**, **D to E** and **F to E**: VF 2 MAC as destination. +- **E to A**: VF 2 MAC as source and PF MAC as destination. +- **E to D**: VF 2 MAC as source and VF 1 MAC as destination. +- **E to F**: VF 2 MAC as source. + +Devices may additionally support advanced matching criteria such as +IPv4/IPv6 addresses or TCP/UDP ports. + +The combination of matching criteria with target endpoints fits well with +**rte_flow** [6]_, which expresses flow rules as combinations of patterns +and actions. + +Enhancing **rte_flow** with the ability to make flow rules match and target +these endpoints provides a standard interface to manage their +interconnection without introducing new concepts and whole new API to +implement them. This is described in `flow API (rte_flow)`_. + +.. [6] :doc:`Generic flow API (rte_flow) <rte_flow>` + +Flow API (rte_flow) +------------------- + +Extensions +~~~~~~~~~~ + +Compared to creating a brand new dedicated interface, **rte_flow** was +deemed flexible enough to manage representor traffic only with minor +extensions: + +- Using physical ports, PF, VF or port representors as targets. + +- Affecting traffic that is not necessarily addressed to the DPDK port ID a + flow rule is associated with (e.g. forcing VF traffic redirection to PF). + +For advanced uses: + +- Rule-based packet counters. + +- The ability to combine several identical actions for traffic duplication + (e.g. VF representor in addition to a physical port). + +- Dedicated actions for traffic encapsulation / decapsulation before + reaching an endpoint. + +Traffic Direction +~~~~~~~~~~~~~~~~~ + +From an application standpoint, "ingress" and "egress" flow rule attributes +apply to the DPDK port ID they are associated with. They select a traffic +direction for matching patterns, but have no impact on actions. + +When matching traffic coming from or going to a different place than the +immediate port ID a flow rule is associated with, these attributes keep +their meaning while applying to the chosen origin, as highlighted by the +following diagram + +:: + + .-------------. .-------------. .-------------. + | hypervisor | | VM 1 | | VM 2 | + | application | | application | | application | + `--+---+---+--' `----------+--' `--+----------' + | | | | | + | | `-------------------. | | + | `---------. | | | + | ^ | ^ | ^ | | + | | ingress | | ingress | | ingress | | + | | egress | | egress | | egress | | + | v | v | v | | + .----(A)----. .----(B)----. .----(C)----. | | + | port_id 3 | | port_id 4 | | port_id 5 | | | + `-----+-----' `-----+-----' `-----+-----' | | + | | | | | + .-+--. .-----+-----. .-----+-----. .---+--. .--+---. + | PF | | VF 1 rep. | | VF 2 rep. | | VF 1 | | VF 2 | + `-+--' `-----+-----' `-----+-----' `--(D)-' `-(E)--' + | | | ^ | | ^ + | | | egress | | | | egress + | | | ingress | | | | ingress + | | .---------' v | | v + `-----. | | .-----------------' | + | | | | .---------------------' + | | | | | + .--+-------+---+---+---+--. + | managed interconnection | + `------------+------------' + ^ | + ingress | | + egress | | + v | + .---(F)----. + | physical | + | port 0 | + `----------' + +Ingress and egress are defined as relative to the application creating the +flow rule. + +For instance, matching traffic sent by VM 2 would be done through an ingress +flow rule on VF 2 (**E**). Likewise for incoming traffic on physical port +(**F**). This also applies to **C** and **A** respectively. + +Transferring Traffic +~~~~~~~~~~~~~~~~~~~~ + +Without Port Representors +^^^^^^^^^^^^^^^^^^^^^^^^^ + +`Traffic direction`_ describes how an application could match traffic coming +from or going to a specific place reachable from a DPDK port ID. This makes +sense when the traffic in question is normally seen (i.e. sent or received) +by the application creating the flow rule (e.g. as in "redirect all traffic +coming from VF 1 to local queue 6"). + +However this does not force such traffic to take a specific route. Creating +a flow rule on **A** matching traffic coming from **D** is only meaningful +if it can be received by **A** in the first place, otherwise doing so simply +has no effect. + +A new flow rule attribute named "transfer" is necessary for that. Combining +it with "ingress" or "egress" and a specific origin requests a flow rule to +be applied at the lowest level + +:: + + ingress only : ingress + transfer + : + .-------------. .-------------. : .-------------. .-------------. + | hypervisor | | VM 1 | : | hypervisor | | VM 1 | + | application | | application | : | application | | application | + `------+------' `--+----------' : `------+------' `--+----------' + | | | traffic : | | | traffic + .----(A)----. | v : .----(A)----. | v + | port_id 3 | | : | port_id 3 | | + `-----+-----' | : `-----+-----' | + | | : | ^ | + | | : | | traffic | + .-+--. .---+--. : .-+--. .---+--. + | PF | | VF 1 | : | PF | | VF 1 | + `-+--' `--(D)-' : `-+--' `--(D)-' + | | | traffic : | ^ | | traffic + | | v : | | traffic | v + .--+-----------+--. : .--+-----------+--. + | interconnection | : | interconnection | + `--------+--------' : `--------+--------' + | | traffic : | + | v : | + .---(F)----. : .---(F)----. + | physical | : | physical | + | port 0 | : | port 0 | + `----------' : `----------' + +With "ingress" only, traffic is matched on **A** thus still goes to physical +port **F** by default + + +:: + + testpmd> flow create 3 ingress pattern vf id is 1 / end + actions queue index 6 / end + +With "ingress + transfer", traffic is matched on **D** and is therefore +successfully assigned to queue 6 on **A** + + +:: + + testpmd> flow create 3 ingress transfer pattern vf id is 1 / end + actions queue index 6 / end + + +With Port Representors +^^^^^^^^^^^^^^^^^^^^^^ + +When port representors exist, implicit flow rules with the "transfer" +attribute (described in `without port representors`_) are be assumed to +exist between them and their represented resources. These may be immutable. + +In this case, traffic is received by default through the representor and +neither the "transfer" attribute nor traffic origin in flow rule patterns +are necessary. They simply have to be created on the representor port +directly and may target a different representor as described in `PORT_ID +action`_. + +Implicit traffic flow with port representor + +:: + + .-------------. .-------------. + | hypervisor | | VM 1 | + | application | | application | + `--+-------+--' `----------+--' + | | ^ | | traffic + | | | traffic | v + | `-----. | + | | | + .----(A)----. .----(B)----. | + | port_id 3 | | port_id 4 | | + `-----+-----' `-----+-----' | + | | | + .-+--. .-----+-----. .---+--. + | PF | | VF 1 rep. | | VF 1 | + `-+--' `-----+-----' `--(D)-' + | | | + .--|-------------|-----------|--. + | | | | | + | | `-----------' | + | | <-- traffic | + `--|----------------------------' + | + .---(F)----. + | physical | + | port 0 | + `----------' + +Pattern Items And Actions +~~~~~~~~~~~~~~~~~~~~~~~~~ + +PORT Pattern Item +^^^^^^^^^^^^^^^^^ + +Matches traffic originating from (ingress) or going to (egress) a physical +port of the underlying device. + +Using this pattern item without specifying a port index matches the physical +port associated with the current DPDK port ID by default. As described in +`traffic steering`_, specifying it should be rarely needed. + +- Matches **F** in `traffic steering`_. + +PORT Action +^^^^^^^^^^^ + +Directs matching traffic to a given physical port index. + +- Targets **F** in `traffic steering`_. + +PORT_ID Pattern Item +^^^^^^^^^^^^^^^^^^^^ + +Matches traffic originating from (ingress) or going to (egress) a given DPDK +port ID. + +Normally only supported if the port ID in question is known by the +underlying PMD and related to the device the flow rule is created against. + +This must not be confused with the `PORT pattern item`_ which refers to the +physical port of a device. ``PORT_ID`` refers to a ``struct rte_eth_dev`` +object on the application side (also known as "port representor" depending +on the kind of underlying device). + +- Matches **A**, **B** or **C** in `traffic steering`_. + +PORT_ID Action +^^^^^^^^^^^^^^ + +Directs matching traffic to a given DPDK port ID. + +Same restrictions as `PORT_ID pattern item`_. + +- Targets **A**, **B** or **C** in `traffic steering`_. + +PF Pattern Item +^^^^^^^^^^^^^^^ + +Matches traffic originating from (ingress) or going to (egress) the physical +function of the current device. + +If supported, should work even if the physical function is not managed by +the application and thus not associated with a DPDK port ID. Its behavior is +otherwise similar to `PORT_ID pattern item`_ using PF port ID. + +- Matches **A** in `traffic steering`_. + +PF Action +^^^^^^^^^ + +Directs matching traffic to the physical function of the current device. + +Same restrictions as `PF pattern item`_. + +- Targets **A** in `traffic steering`_. + +VF Pattern Item +^^^^^^^^^^^^^^^ + +Matches traffic originating from (ingress) or going to (egress) a given +virtual function of the current device. + +If supported, should work even if the virtual function is not managed by +the application and thus not associated with a DPDK port ID. Its behavior is +otherwise similar to `PORT_ID pattern item`_ using VF port ID. + +Note this pattern item does not match VF representors traffic which, as +separate entities, should be addressed through their own port IDs. + +- Matches **D** or **E** in `traffic steering`_. + +VF Action +^^^^^^^^^ + +Directs matching traffic to a given virtual function of the current device. + +Same restrictions as `VF pattern item`_. + +- Targets **D** or **E** in `traffic steering`_. + +\*_ENCAP actions +^^^^^^^^^^^^^^^^ + +These actions are named according to the protocol they encapsulate traffic +with (e.g. ``VXLAN_ENCAP``) and using specific parameters (e.g. VNI for +VXLAN). + +While they modify traffic and can be used multiple times (order matters), +unlike `PORT_ID action`_ and friends, they have no impact on steering. + +As described in `actions order and repetition`_ this means they are useless +if used alone in an action list, the resulting traffic gets dropped unless +combined with either ``PASSTHRU`` or other endpoint-targeting actions. + +\*_DECAP actions +^^^^^^^^^^^^^^^^ + +They perform the reverse of `\*_ENCAP actions`_ by popping protocol headers +from traffic instead of pushing them. They can be used multiple times as +well. + +Note that using these actions on non-matching traffic results in undefined +behavior. It is recommended to match the protocol headers to decapsulate on +the pattern side of a flow rule in order to use these actions or otherwise +make sure only matching traffic goes through. + +Actions Order and Repetition +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Flow rules are currently restricted to at most a single action of each +supported type, performed in an unpredictable order (or all at once). To +repeat actions in a predictable fashion, applications have to make rules +pass-through and use priority levels. + +It's now clear that PMD support for chaining multiple non-terminating flow +rules of varying priority levels is prohibitively difficult to implement +compared to simply allowing multiple identical actions performed in a +defined order by a single flow rule. + +- This change is required to support protocol encapsulation offloads and the + ability to perform them multiple times (e.g. VLAN then VXLAN). + +- It makes the ``DUP`` action redundant since multiple ``QUEUE`` actions can + be combined for duplication. + +- The (non-)terminating property of actions must be discarded. Instead, flow + rules themselves must be considered terminating by default (i.e. dropping + traffic if there is no specific target) unless a ``PASSTHRU`` action is + also specified. + +Switching Examples +------------------ + +This section provides practical examples based on the established testpmd +flow command syntax [2]_, in the context described in `traffic steering`_ + +:: + + .-------------. .-------------. .-------------. + | hypervisor | | VM 1 | | VM 2 | + | application | | application | | application | + `--+---+---+--' `----------+--' `--+----------' + | | | | | + | | `-------------------. | | + | `---------. | | | + | | | | | + .----(A)----. .----(B)----. .----(C)----. | | + | port_id 3 | | port_id 4 | | port_id 5 | | | + `-----+-----' `-----+-----' `-----+-----' | | + | | | | | + .-+--. .-----+-----. .-----+-----. .---+--. .--+---. + | PF | | VF 1 rep. | | VF 2 rep. | | VF 1 | | VF 2 | + `-+--' `-----+-----' `-----+-----' `--(D)-' `-(E)--' + | | | | | + | | .---------' | | + `-----. | | .-----------------' | + | | | | .---------------------' + | | | | | + .--|-------|---|---|---|--. + | | | `---|---' | + | | `-------' | + | `---------. | + `------------|------------' + | + .---(F)----. + | physical | + | port 0 | + `----------' + +By default, PF (**A**) can communicate with the physical port it is +associated with (**F**), while VF 1 (**D**) and VF 2 (**E**) are isolated +and restricted to communicate with the hypervisor application through their +respective representors (**B** and **C**) if supported. + +Examples in subsequent sections apply to hypervisor applications only and +are based on port representors **A**, **B** and **C**. + +.. [2] :ref:`Flow syntax <testpmd_rte_flow>` + +Associating VF 1 with Physical Port 0 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Assign all port traffic (**F**) to VF 1 (**D**) indiscriminately through +their representors + +:: + + flow create 3 ingress pattern / end actions port_id id 4 / end + flow create 4 ingress pattern / end actions port_id id 3 / end + +More practical example with MAC address restrictions + +:: + + flow create 3 ingress + pattern eth dst is {VF 1 MAC} / end + actions port_id id 4 / end + +:: + + flow create 4 ingress + pattern eth src is {VF 1 MAC} / end + actions port_id id 3 / end + + +Sharing Broadcasts +~~~~~~~~~~~~~~~~~~ + +From outside to PF and VFs + +:: + + flow create 3 ingress + pattern eth dst is ff:ff:ff:ff:ff:ff / end + actions port_id id 3 / port_id id 4 / port_id id 5 / end + +Note ``port_id id 3`` is necessary otherwise only VFs would receive matching +traffic. + +From PF to outside and VFs + +:: + + flow create 3 egress + pattern eth dst is ff:ff:ff:ff:ff:ff / end + actions port / port_id id 4 / port_id id 5 / end + +From VFs to outside and PF + +:: + + flow create 4 ingress + pattern eth dst is ff:ff:ff:ff:ff:ff src is {VF 1 MAC} / end + actions port_id id 3 / port_id id 5 / end + + flow create 5 ingress + pattern eth dst is ff:ff:ff:ff:ff:ff src is {VF 2 MAC} / end + actions port_id id 4 / port_id id 4 / end + +Similar ``33:33:*`` rules based on known MAC addresses should be added for +IPv6 traffic. + +Encapsulating VF 2 Traffic in VXLAN +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Assuming pass-through flow rules are supported + +:: + + flow create 5 ingress + pattern eth / end + actions vxlan_encap vni 42 / passthru / end + +:: + + flow create 5 egress + pattern vxlan vni is 42 / end + actions vxlan_decap / passthru / end + +Here ``passthru`` is needed since as described in `actions order and +repetition`_, flow rules are otherwise terminating; if supported, a rule +without a target endpoint will drop traffic. + +Without pass-through support, ingress encapsulation on the destination +endpoint might not be supported and action list must provide one + +:: + + flow create 5 ingress + pattern eth src is {VF 2 MAC} / end + actions vxlan_encap vni 42 / port_id id 3 / end + + flow create 3 ingress + pattern vxlan vni is 42 / end + actions vxlan_decap / port_id id 5 / end diff --git a/src/spdk/dpdk/doc/guides/prog_guide/telemetry_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/telemetry_lib.rst new file mode 100644 index 000000000..8563a7200 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/telemetry_lib.rst @@ -0,0 +1,62 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2020 Intel Corporation. + +Telemetry Library +================= + +The Telemetry library provides an interface to retrieve information from a +variety of DPDK libraries. The library provides this information via socket +connection, taking requests from a connected client and replying with the JSON +response containing the requested telemetry information. + +Telemetry is enabled to run by default when running a DPDK application, and the +telemetry information from enabled libraries is made available. Libraries are +responsible for registering their own commands, and providing the callback +function that will format the library specific stats into the correct data +format, when requested. + + +Registering Commands +-------------------- + +Libraries and applications must register commands to make their information +available via the Telemetry library. This involves providing a string command +in the required format ("/library/command"), the callback function that +will handle formatting the information when required, and help text for the +command. An example showing ethdev commands being registered is shown below: + +.. code-block:: c + + rte_telemetry_register_cmd("/ethdev/list", handle_port_list, + "Returns list of available ethdev ports. Takes no parameters"); + rte_telemetry_register_cmd("/ethdev/xstats", handle_port_xstats, + "Returns the extended stats for a port. Parameters: int port_id"); + rte_telemetry_register_cmd("/ethdev/link_status", handle_port_link_status, + "Returns the link status for a port. Parameters: int port_id"); + + +Formatting JSON response +------------------------ + +The callback function provided by the library must format its telemetry +information in the required data format. The Telemetry library provides a data +utilities API to build up the response. For example, the ethdev library provides a +list of available ethdev ports in a formatted data response, constructed using the +following functions to build up the list: + +.. code-block:: c + + rte_tel_data_start_array(d, RTE_TEL_INT_VAL); + RTE_ETH_FOREACH_DEV(port_id) + rte_tel_data_add_array_int(d, port_id); + +The data structure is then formatted into a JSON response before sending. +The resulting response shows the port list data provided above by the handler +function in ethdev, placed in a JSON reply by telemetry: + +.. code-block:: console + + {"/ethdev/list": [0, 1]} + +For more information on the range of data functions available in the API, +please refer to the docs. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/thread_safety_dpdk_functions.rst b/src/spdk/dpdk/doc/guides/prog_guide/thread_safety_dpdk_functions.rst new file mode 100644 index 000000000..0f539db2b --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/thread_safety_dpdk_functions.rst @@ -0,0 +1,75 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +Thread Safety of DPDK Functions +=============================== + +The DPDK is comprised of several libraries. +Some of the functions in these libraries can be safely called from multiple threads simultaneously, while others cannot. +This section allows the developer to take these issues into account when building their own application. + +The run-time environment of the DPDK is typically a single thread per logical core. +In some cases, it is not only multi-threaded, but multi-process. +Typically, it is best to avoid sharing data structures between threads and/or processes where possible. +Where this is not possible, then the execution blocks must access the data in a thread- safe manner. +Mechanisms such as atomics or locking can be used that will allow execution blocks to operate serially. +However, this can have an effect on the performance of the application. + +Fast-Path APIs +-------------- + +Applications operating in the data plane are performance sensitive but +certain functions within those libraries may not be safe to call from multiple threads simultaneously. +The hash, LPM and mempool libraries and RX/TX in the PMD are examples of this. + +The hash and LPM libraries are, by design, thread unsafe in order to maintain performance. +However, if required the developer can add layers on top of these libraries to provide thread safety. +Locking is not needed in all situations, and in both the hash and LPM libraries, +lookups of values can be performed in parallel in multiple threads. +Adding, removing or modifying values, however, +cannot be done in multiple threads without using locking when a single hash or LPM table is accessed. +Another alternative to locking would be to create multiple instances of these tables allowing each thread its own copy. + +The RX and TX of the PMD are the most critical aspects of a DPDK application +and it is recommended that no locking be used as it will impact performance. +Note, however, that these functions can safely be used from multiple threads +when each thread is performing I/O on a different NIC queue. +If multiple threads are to use the same hardware queue on the same NIC port, +then locking, or some other form of mutual exclusion, is necessary. + +The ring library is based on a lockless ring-buffer algorithm that maintains its original design for thread safety. +Moreover, it provides high performance for either multi- or single-consumer/producer enqueue/dequeue operations. +The mempool library is based on the DPDK lockless ring library and therefore is also multi-thread safe. + +Performance Insensitive API +--------------------------- + +Outside of the performance sensitive areas described in Section 25.1, +the DPDK provides a thread-safe API for most other libraries. +For example, malloc and memzone functions are safe for use in multi-threaded and multi-process environments. + +The setup and configuration of the PMD is not performance sensitive, but is not thread safe either. +It is possible that the multiple read/writes during PMD setup and configuration could be corrupted in a multi-thread environment. +Since this is not performance sensitive, the developer can choose to add their own layer to provide thread-safe setup and configuration. +It is expected that, in most applications, the initial configuration of the network ports would be done by a single thread at startup. + +Library Initialization +---------------------- + +It is recommended that DPDK libraries are initialized in the main thread at application startup +rather than subsequently in the forwarding threads. +However, the DPDK performs checks to ensure that libraries are only initialized once. +If initialization is attempted more than once, an error is returned. + +In the multi-process case, the configuration information of shared memory will only be initialized by the master process. +Thereafter, both master and secondary processes can allocate/release any objects of memory that finally rely on rte_malloc or memzones. + +Interrupt Thread +---------------- + +The DPDK works almost entirely in Linux user space in polling mode. +For certain infrequent operations, such as receiving a PMD link status change notification, +callbacks may be called in an additional thread outside the main DPDK processing threads. +These function callbacks should avoid manipulating DPDK objects that are also managed by the normal DPDK threads, +and if they need to do so, +it is up to the application to provide the appropriate locking or mutual exclusion restrictions around those objects. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/timer_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/timer_lib.rst new file mode 100644 index 000000000..3af2c92e0 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/timer_lib.rst @@ -0,0 +1,77 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +.. _Timer_Library: + +Timer Library +============= + +The Timer library provides a timer service to DPDK execution units to enable execution of callback functions asynchronously. +Features of the library are: + +* Timers can be periodic (multi-shot) or single (one-shot). + +* Timers can be loaded from one core and executed on another. It has to be specified in the call to rte_timer_reset(). + +* Timers provide high precision (depends on the call frequency to rte_timer_manage() that checks timer expiration for the local core). + +* If not required in the application, timers can be disabled at compilation time by not calling the rte_timer_manage() to increase performance. + +The timer library uses the rte_get_timer_cycles() function that uses the High Precision Event Timer (HPET) +or the CPUs Time Stamp Counter (TSC) to provide a reliable time reference. + +This library provides an interface to add, delete and restart a timer. The API is based on BSD callout() with a few differences. +Refer to the `callout manual <http://www.daemon-systems.org/man/callout.9.html>`_. + +Implementation Details +---------------------- + +Timers are tracked on a per-lcore basis, +with all pending timers for a core being maintained in order of timer expiry in a skiplist data structure. +The skiplist used has ten levels and each entry in the table appears in each level with probability ¼^level. +This means that all entries are present in level 0, 1 in every 4 entries is present at level 1, +one in every 16 at level 2 and so on up to level 9. +This means that adding and removing entries from the timer list for a core can be done in log(n) time, +up to 4^10 entries, that is, approximately 1,000,000 timers per lcore. + +A timer structure contains a special field called status, +which is a union of a timer state (stopped, pending, running, config) and an owner (lcore id). +Depending on the timer state, we know if a timer is present in a list or not: + +* STOPPED: no owner, not in a list + +* CONFIG: owned by a core, must not be modified by another core, maybe in a list or not, depending on previous state + +* PENDING: owned by a core, present in a list + +* RUNNING: owned by a core, must not be modified by another core, present in a list + +Resetting or stopping a timer while it is in a CONFIG or RUNNING state is not allowed. +When modifying the state of a timer, +a Compare And Swap instruction should be used to guarantee that the status (state+owner) is modified atomically. + +Inside the rte_timer_manage() function, +the skiplist is used as a regular list by iterating along the level 0 list, which contains all timer entries, +until an entry which has not yet expired has been encountered. +To improve performance in the case where there are entries in the timer list but none of those timers have yet expired, +the expiry time of the first list entry is maintained within the per-core timer list structure itself. +On 64-bit platforms, this value can be checked without the need to take a lock on the overall structure. +(Since expiry times are maintained as 64-bit values, +a check on the value cannot be done on 32-bit platforms without using either a compare-and-swap (CAS) instruction or using a lock, +so this additional check is skipped in favor of checking as normal once the lock has been taken.) +On both 64-bit and 32-bit platforms, +a call to rte_timer_manage() returns without taking a lock in the case where the timer list for the calling core is empty. + +Use Cases +--------- + +The timer library is used for periodic calls, such as garbage collectors, or some state machines (ARP, bridging, and so on). + +References +---------- + +* `callout manual <http://www.daemon-systems.org/man/callout.9.html>`_ + - The callout facility that provides timers with a mechanism to execute a function at a given time. + +* `HPET <http://en.wikipedia.org/wiki/HPET>`_ + - Information about the High Precision Event Timer (HPET). diff --git a/src/spdk/dpdk/doc/guides/prog_guide/trace_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/trace_lib.rst new file mode 100644 index 000000000..b6c628577 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/trace_lib.rst @@ -0,0 +1,357 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(C) 2020 Marvell International Ltd. + +Trace Library +============= + +Overview +-------- + +*Tracing* is a technique used to understand what goes on in a running software +system. The software used for tracing is called a *tracer*, which is +conceptually similar to a tape recorder. +When recording, specific instrumentation points placed in the software source +code generate events that are saved on a giant tape: a trace file. +The trace file then later can be opened in *trace viewers* to visualize and +analyze the trace events with timestamps and multi-core views. +Such a mechanism will be useful for resolving a wide range of problems such as +multi-core synchronization issues, latency measurements, finding out the +post analysis information like CPU idle time, etc that would otherwise be +extremely challenging to get. + +Tracing is often compared to *logging*. However, tracers and loggers are two +different tools, serving two different purposes. +Tracers are designed to record much lower-level events that occur much more +frequently than log messages, often in the range of thousands per second, with +very little execution overhead. +Logging is more appropriate for a very high-level analysis of less frequent +events: user accesses, exceptional conditions (errors and warnings, for +example), database transactions, instant messaging communications, and such. +Simply put, logging is one of the many use cases that can be satisfied with +tracing. + +DPDK tracing library features +----------------------------- + +- A framework to add tracepoints in control and fast path APIs with minimum + impact on performance. + Typical trace overhead is ~20 cycles and instrumentation overhead is 1 cycle. +- Enable and disable the tracepoints at runtime. +- Save the trace buffer to the filesystem at any point in time. +- Support ``overwrite`` and ``discard`` trace mode operations. +- String-based tracepoint object lookup. +- Enable and disable a set of tracepoints based on regular expression and/or + globbing. +- Generate trace in ``Common Trace Format (CTF)``. ``CTF`` is an open-source + trace format and is compatible with ``LTTng``. + For detailed information, refer to + `Common Trace Format <https://diamon.org/ctf/>`_. + +How to add a tracepoint? +------------------------ + +This section steps you through the details of adding a simple tracepoint. + +.. _create_tracepoint_header_file: + +Create the tracepoint header file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: c + + #include <rte_trace_point.h> + + RTE_TRACE_POINT( + app_trace_string, + RTE_TRACE_POINT_ARGS(const char *str), + rte_trace_point_emit_string(str); + ) + +The above macro creates ``app_trace_string`` tracepoint. +The user can choose any name for the tracepoint. +However, when adding a tracepoint in the DPDK library, the +``rte_<library_name>_trace_[<domain>_]<name>`` naming convention must be +followed. +The examples are ``rte_eal_trace_generic_str``, ``rte_mempool_trace_create``. + +The ``RTE_TRACE_POINT`` macro expands from above definition as the following +function template: + +.. code-block:: c + + static __rte_always_inline void + app_trace_string(const char *str) + { + /* Trace subsystem hooks */ + ... + rte_trace_point_emit_string(str); + } + +The consumer of this tracepoint can invoke +``app_trace_string(const char *str)`` to emit the trace event to the trace +buffer. + +Register the tracepoint +~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: c + + #include <rte_trace_point_register.h> + + #include <my_tracepoint.h> + + RTE_TRACE_POINT_DEFINE(app_trace_string); + + RTE_INIT(app_trace_init) + { + RTE_TRACE_POINT_REGISTER(app_trace_string, app.trace.string); + } + +The above code snippet registers the ``app_trace_string`` tracepoint to +trace library. Here, the ``my_tracepoint.h`` is the header file +that the user created in the first step :ref:`create_tracepoint_header_file`. + +The second argument for the ``RTE_TRACE_POINT_REGISTER`` is the name for the +tracepoint. This string will be used for tracepoint lookup or regular +expression and/or glob based tracepoint operations. +There is no requirement for the tracepoint function and its name to be similar. +However, it is recommended to have a similar name for a better naming +convention. + +The user must register the tracepoint before the ``rte_eal_init`` invocation. +The user can use the ``RTE_INIT`` construction scheme to achieve this. + +.. note:: + + The ``rte_trace_point_register.h`` header must be included before any + inclusion of the ``rte_trace_point.h`` header. + +.. note:: + + The ``RTE_TRACE_POINT_DEFINE`` defines the placeholder for the + ``rte_trace_point_t`` tracepoint object. The user must export a + ``__<trace_function_name>`` symbol in the library ``.map`` file for this + tracepoint to be used out of the library, in shared builds. + For example, ``__app_trace_string`` will be the exported symbol in the + above example. + +Fast path tracepoint +-------------------- + +In order to avoid performance impact in fast path code, the library introduced +``RTE_TRACE_POINT_FP``. When adding the tracepoint in fast path code, +the user must use ``RTE_TRACE_POINT_FP`` instead of ``RTE_TRACE_POINT``. + +``RTE_TRACE_POINT_FP`` is compiled out by default and it can be enabled using +``CONFIG_RTE_ENABLE_TRACE_FP`` configuration parameter. +The ``enable_trace_fp`` option shall be used for the same for meson build. + +Event record mode +----------------- + +Event record mode is an attribute of trace buffers. Trace library exposes the +following modes: + +Overwrite + When the trace buffer is full, new trace events overwrites the existing + captured events in the trace buffer. +Discard + When the trace buffer is full, new trace events will be discarded. + +The mode can be configured either using EAL command line parameter +``--trace-mode`` on application boot up or use ``rte_trace_mode_set()`` API to +configure at runtime. + +Trace file location +------------------- + +On ``rte_trace_save()`` or ``rte_eal_cleanup()`` invocation, the library saves +the trace buffers to the filesystem. By default, the trace files are stored in +``$HOME/dpdk-traces/rte-yyyy-mm-dd-[AP]M-hh-mm-ss/``. +It can be overridden by the ``--trace-dir=<directory path>`` EAL command line +option. + +For more information, refer to :doc:`../linux_gsg/linux_eal_parameters` for +trace EAL command line options. + +View and analyze the recorded events +------------------------------------ + +Once the trace directory is available, the user can view/inspect the recorded +events. + +There are many tools you can use to read DPDK traces: + +1. ``babeltrace`` is a command-line utility that converts trace formats; it +supports the format that DPDK trace library produces, CTF, as well as a +basic text output that can be grep'ed. +The babeltrace command is part of the Open Source Babeltrace project. + +2. ``Trace Compass`` is a graphical user interface for viewing and analyzing +any type of logs or traces, including DPDK traces. + +Use the babeltrace command-line tool +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The simplest way to list all the recorded events of a trace is to pass its path +to babeltrace with no options:: + + babeltrace </path-to-trace-events/rte-yyyy-mm-dd-[AP]M-hh-mm-ss/> + +``babeltrace`` finds all traces recursively within the given path and prints +all their events, merging them in chronological order. + +You can pipe the output of the babeltrace into a tool like grep(1) for further +filtering. Below example grep the events for ``ethdev`` only:: + + babeltrace /tmp/my-dpdk-trace | grep ethdev + +You can pipe the output of babeltrace into a tool like wc(1) to count the +recorded events. Below example count the number of ``ethdev`` events:: + + babeltrace /tmp/my-dpdk-trace | grep ethdev | wc --lines + +Use the tracecompass GUI tool +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``Tracecompass`` is another tool to view/analyze the DPDK traces which gives +a graphical view of events. Like ``babeltrace``, tracecompass also provides +an interface to search for a particular event. +To use ``tracecompass``, following are the minimum required steps: + +- Install ``tracecompass`` to the localhost. Variants are available for Linux, + Windows, and OS-X. +- Launch ``tracecompass`` which will open a graphical window with trace + management interfaces. +- Open a trace using ``File->Open Trace`` option and select metadata file which + is to be viewed/analyzed. + +For more details, refer +`Trace Compass <https://www.eclipse.org/tracecompass/>`_. + +Quick start +----------- + +This section steps you through the details of generating trace and viewing it. + +- Start the dpdk-test:: + + echo "quit" | ./build/app/test/dpdk-test --no-huge --trace=.* + +- View the traces with babeltrace viewer:: + + babeltrace $HOME/dpdk-traces/rte-yyyy-mm-dd-[AP]M-hh-mm-ss/ + +Implementation details +---------------------- + +As DPDK trace library is designed to generate traces that uses ``Common Trace +Format (CTF)``. ``CTF`` specification consists of the following units to create +a trace. + +- ``Stream`` Sequence of packets. +- ``Packet`` Header and one or more events. +- ``Event`` Header and payload. + +For detailed information, refer to +`Common Trace Format <https://diamon.org/ctf/>`_. + +The implementation details broadly divided into the following areas: + +Trace metadata creation +~~~~~~~~~~~~~~~~~~~~~~~ + +Based on the ``CTF`` specification, one of a CTF trace's streams is mandatory: +the metadata stream. It contains exactly what you would expect: data about the +trace itself. The metadata stream contains a textual description of the binary +layouts of all the other streams. + +This description is written using the Trace Stream Description Language (TSDL), +a declarative language that exists only in the realm of CTF. +The purpose of the metadata stream is to make CTF readers know how to parse a +trace's binary streams of events without CTF specifying any fixed layout. +The only stream layout known in advance is, in fact, the metadata stream's one. + +The internal ``trace_metadata_create()`` function generates the metadata. + +Trace memory +~~~~~~~~~~~~ + +The trace memory will be allocated through an internal function +``__rte_trace_mem_per_thread_alloc()``. The trace memory will be allocated +per thread to enable lock less trace-emit function. +The memory for the trace memory for DPDK lcores will be allocated on +``rte_eal_init()`` if the trace is enabled through a EAL option. +For non DPDK threads, on the first trace emission, the memory will be +allocated. + +Trace memory layout +~~~~~~~~~~~~~~~~~~~ + +.. _table_trace_mem_layout: + +.. table:: Trace memory layout. + + +-------------------+ + | packet.header | + +-------------------+ + | packet.context | + +-------------------+ + | trace 0 header | + +-------------------+ + | trace 0 payload | + +-------------------+ + | trace 1 header | + +-------------------+ + | trace 1 payload | + +-------------------+ + | trace N header | + +-------------------+ + | trace N payload | + +-------------------+ + +packet.header +^^^^^^^^^^^^^ + +.. _table_packet_header: + +.. table:: Packet header layout. + + +-------------------+ + | uint32_t magic | + +-------------------+ + | rte_uuid_t uuid | + +-------------------+ + +packet.context +^^^^^^^^^^^^^^ + +.. _table_packet_context: + +.. table:: Packet context layout. + + +----------------------+ + | uint32_t thread_id | + +----------------------+ + | char thread_name[32] | + +----------------------+ + +trace.header +^^^^^^^^^^^^ + +.. _table_trace_header: + +.. table:: Trace header layout. + + +----------------------+ + | event_id [63:48] | + +----------------------+ + | timestamp [47:0] | + +----------------------+ + +The trace header is 64 bits, it consists of 48 bits of timestamp and 16 bits +event ID. + +The ``packet.header`` and ``packet.context`` will be written in the slow path +at the time of trace memory creation. The ``trace.header`` and trace payload +will be emitted when the tracepoint function is invoked. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/traffic_management.rst b/src/spdk/dpdk/doc/guides/prog_guide/traffic_management.rst new file mode 100644 index 000000000..05b34d93a --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/traffic_management.rst @@ -0,0 +1,223 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation. + +Traffic Management API +====================== + + +Overview +-------- + +This is the generic API for the Quality of Service (QoS) Traffic Management of +Ethernet devices, which includes the following main features: hierarchical +scheduling, traffic shaping, congestion management, packet marking. This API +is agnostic of the underlying HW, SW or mixed HW-SW implementation. + +Main features: + +* Part of DPDK rte_ethdev API +* Capability query API per port, per hierarchy level and per hierarchy node +* Scheduling algorithms: Strict Priority (SP), Weighed Fair Queuing (WFQ) +* Traffic shaping: single/dual rate, private (per node) and + shared (by multiple nodes) shapers +* Congestion management for hierarchy leaf nodes: algorithms of tail drop, head + drop, WRED, private (per node) and shared (by multiple nodes) WRED contexts +* Packet marking: IEEE 802.1q (VLAN DEI), IETF RFC 3168 (IPv4/IPv6 ECN for TCP + and SCTP), IETF RFC 2597 (IPv4 / IPv6 DSCP) + + +Capability API +-------------- + +The aim of these APIs is to advertise the capability information (i.e critical +parameter values) that the TM implementation (HW/SW) is able to support for the +application. The APIs supports the information disclosure at the TM level, at +any hierarchical level of the TM and at any node level of the specific +hierarchical level. Such information helps towards rapid understanding of +whether a specific implementation does meet the needs to the user application. + +At the TM level, users can get high level idea with the help of various +parameters such as maximum number of nodes, maximum number of hierarchical +levels, maximum number of shapers, maximum number of private shapers, type of +scheduling algorithm (Strict Priority, Weighted Fair Queuing , etc.), etc., +supported by the implementation. + +Likewise, users can query the capability of the TM at the hierarchical level to +have more granular knowledge about the specific level. The various parameters +such as maximum number of nodes at the level, maximum number of leaf/non-leaf +nodes at the level, type of the shaper(dual rate, single rate) supported at +the level if node is non-leaf type etc., are exposed as a result of +hierarchical level capability query. + +Finally, the node level capability API offers knowledge about the capability +supported by the node at any specific level. The information whether the +support is available for private shaper, dual rate shaper, maximum and minimum +shaper rate, etc. is exposed by node level capability API. + + +Scheduling Algorithms +--------------------- + +The fundamental scheduling algorithms that are supported are Strict Priority +(SP) and Weighted Fair Queuing (WFQ). The SP and WFQ algorithms are supported +at the level of each node of the scheduling hierarchy, regardless of the node +level/position in the tree. The SP algorithm is used to schedule between +sibling nodes with different priority, while WFQ is used to schedule between +groups of siblings that have the same priority. + +Algorithms such as Weighed Round Robin (WRR), byte-level WRR, Deficit WRR +(DWRR), etc are considered approximations of the ideal WFQ and are therefore +assimilated to WFQ, although an associated implementation-dependent accuracy, +performance and resource usage trade-off might exist. + + +Traffic Shaping +--------------- + +The TM API provides support for single rate and dual rate shapers (rate +limiters) for the hierarchy nodes, subject to the specific implementation +support being available. + +Each hierarchy node has zero or one private shaper (only one node using it) +and/or zero, one or several shared shapers (multiple nodes use the same shaper +instance). A private shaper is used to perform traffic shaping for a single +node, while a shared shaper is used to perform traffic shaping for a group of +nodes. + +The configuration of private and shared shapers is done through the definition +of shaper profiles. Any shaper profile (single rate or dual rate shaper) can be +used by one or several shaper instances (either private or shared). + +Single rate shapers use a single token bucket. Therefore, single rate shaper is +configured by setting the rate of the committed bucket to zero, which +effectively disables this bucket. The peak bucket is used to limit the rate +and the burst size for the single rate shaper. Dual rate shapers use both the +committed and the peak token buckets. The rate of the peak bucket has to be +bigger than zero, as well as greater than or equal to the rate of the committed +bucket. + + +Congestion Management +--------------------- + +Congestion management is used to control the admission of packets into a packet +queue or group of packet queues on congestion. The congestion management +algorithms that are supported are: Tail Drop, Head Drop and Weighted Random +Early Detection (WRED). They are made available for every leaf node in the +hierarchy, subject to the specific implementation supporting them. +On request of writing a new packet into the current queue while the queue is +full, the Tail Drop algorithm drops the new packet while leaving the queue +unmodified, as opposed to the Head Drop* algorithm, which drops the packet +at the head of the queue (the oldest packet waiting in the queue) and admits +the new packet at the tail of the queue. + +The Random Early Detection (RED) algorithm works by proactively dropping more +and more input packets as the queue occupancy builds up. When the queue is full +or almost full, RED effectively works as Tail Drop. The Weighted RED (WRED) +algorithm uses a separate set of RED thresholds for each packet color and uses +separate set of RED thresholds for each packet color. + +Each hierarchy leaf node with WRED enabled as its congestion management mode +has zero or one private WRED context (only one leaf node using it) and/or zero, +one or several shared WRED contexts (multiple leaf nodes use the same WRED +context). A private WRED context is used to perform congestion management for +a single leaf node, while a shared WRED context is used to perform congestion +management for a group of leaf nodes. + +The configuration of WRED private and shared contexts is done through the +definition of WRED profiles. Any WRED profile can be used by one or several +WRED contexts (either private or shared). + + +Packet Marking +-------------- +The TM APIs have been provided to support various types of packet marking such +as VLAN DEI packet marking (IEEE 802.1Q), IPv4/IPv6 ECN marking of TCP and SCTP +packets (IETF RFC 3168) and IPv4/IPv6 DSCP packet marking (IETF RFC 2597). +All VLAN frames of a given color get their DEI bit set if marking is enabled +for this color. In case, when marking for a given color is not enabled, the +DEI bit is left as is (either set or not). + +All IPv4/IPv6 packets of a given color with ECN set to 2’b01 or 2’b10 carrying +TCP or SCTP have their ECN set to 2’b11 if the marking feature is enabled for +the current color, otherwise the ECN field is left as is. + +All IPv4/IPv6 packets have their color marked into DSCP bits 3 and 4 as +follows: green mapped to Low Drop Precedence (2’b01), yellow to Medium (2’b10) +and red to High (2’b11). Marking needs to be explicitly enabled for each color; +when not enabled for a given color, the DSCP field of all packets with that +color is left as is. + + +Steps to Setup the Hierarchy +---------------------------- + +The TM hierarchical tree consists of leaf nodes and non-leaf nodes. Each leaf +node sits on top of a scheduling queue of the current Ethernet port. Therefore, +the leaf nodes have predefined IDs in the range of 0... (N-1), where N is the +number of scheduling queues of the current Ethernet port. The non-leaf nodes +have their IDs generated by the application outside of the above range, which +is reserved for leaf nodes. + +Each non-leaf node has multiple inputs (its children nodes) and single output +(which is input to its parent node). It arbitrates its inputs using Strict +Priority (SP) and Weighted Fair Queuing (WFQ) algorithms to schedule input +packets to its output while observing its shaping (rate limiting) constraints. + +The children nodes with different priorities are scheduled using the SP +algorithm based on their priority, with 0 as the highest priority. Children +with the same priority are scheduled using the WFQ algorithm according to their +weights. The WFQ weight of a given child node is relative to the sum of the +weights of all its sibling nodes that have the same priority, with 1 as the +lowest weight. For each SP priority, the WFQ weight mode can be set as either +byte-based or packet-based. + + +Initial Hierarchy Specification +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The hierarchy is specified by incrementally adding nodes to build up the +scheduling tree. The first node that is added to the hierarchy becomes the root +node and all the nodes that are subsequently added have to be added as +descendants of the root node. The parent of the root node has to be specified +as RTE_TM_NODE_ID_NULL and there can only be one node with this parent ID +(i.e. the root node). The unique ID that is assigned to each node when the node +is created is further used to update the node configuration or to connect +children nodes to it. + +During this phase, some limited checks on the hierarchy specification can be +conducted, usually limited in scope to the current node, its parent node and +its sibling nodes. At this time, since the hierarchy is not fully defined, +there is typically no real action performed by the underlying implementation. + + +Hierarchy Commit +~~~~~~~~~~~~~~~~ + +The hierarchy commit API is called during the port initialization phase (before +the Ethernet port is started) to freeze the start-up hierarchy. This function +typically performs the following steps: + +* It validates the start-up hierarchy that was previously defined for the + current port through successive node add API invocations. +* Assuming successful validation, it performs all the necessary implementation + specific operations to install the specified hierarchy on the current port, + with immediate effect once the port is started. + +This function fails when the currently configured hierarchy is not supported by +the Ethernet port, in which case the user can abort or try out another +hierarchy configuration (e.g. a hierarchy with less leaf nodes), which can be +built from scratch or by modifying the existing hierarchy configuration. Note +that this function can still fail due to other causes (e.g. not enough memory +available in the system, etc.), even though the specified hierarchy is +supported in principle by the current port. + + +Run-Time Hierarchy Updates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The TM API provides support for on-the-fly changes to the scheduling hierarchy, +thus operations such as node add/delete, node suspend/resume, parent node +update, etc., can be invoked after the Ethernet port has been started, subject +to the specific implementation supporting them. The set of dynamic updates +supported by the implementation is advertised through the port capability set. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/traffic_metering_and_policing.rst b/src/spdk/dpdk/doc/guides/prog_guide/traffic_metering_and_policing.rst new file mode 100644 index 000000000..90c781eb1 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/traffic_metering_and_policing.rst @@ -0,0 +1,74 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2017 Intel Corporation. + +Traffic Metering and Policing API +================================= + + +Overview +-------- + +This is the generic API for the Quality of Service (QoS) Traffic Metering and +Policing (MTR) of Ethernet devices. This API is agnostic of the underlying HW, +SW or mixed HW-SW implementation. + +The main features are: + +* Part of DPDK rte_ethdev API +* Capability query API +* Metering algorithms: RFC 2697 Single Rate Three Color Marker (srTCM), RFC 2698 + and RFC 4115 Two Rate Three Color Marker (trTCM) +* Policer actions (per meter output color): recolor, drop +* Statistics (per policer output color) + +Configuration steps +------------------- + +The metering and policing stage typically sits on top of flow classification, +which is why the MTR objects are enabled through a special "meter" action. + +The MTR objects are created and updated in their own name space (``rte_mtr``) +within the ``librte_ethdev`` library. Whether an MTR object is private to a +flow or potentially shared by several flows has to be specified at its +creation time. + +Once successfully created, an MTR object is hooked into the RX processing path +of the Ethernet device by linking it to one or several flows through the +dedicated "meter" flow action. One or several "meter" actions can be registered +for the same flow. An MTR object can only be destroyed if there are no flows +using it. + +Run-time processing +------------------- + +Traffic metering determines the color for the current packet (green, yellow, +red) based on the previous history for this flow as maintained by the MTR +object. The policer can do nothing, override the color the packet or drop the +packet. Statistics counters are maintained for MTR object, as configured. + +The processing done for each input packet hitting an MTR object is: + +* Traffic metering: The packet is assigned a color (the meter output color) + based on the previous traffic history reflected in the current state of the + MTR object, according to the specific traffic metering algorithm. The + traffic metering algorithm can typically work in color aware mode, in which + case the input packet already has an initial color (the input color), or in + color blind mode, which is equivalent to considering all input packets + initially colored as green. + +* Policing: There is a separate policer action configured for each meter + output color, which can: + + * Drop the packet. + + * Keep the same packet color: the policer output color matches the meter + output color (essentially a no-op action). + + * Recolor the packet: the policer output color is set to a different color + than the meter output color. The policer output color is the output color + of the packet, which is set in the packet meta-data (i.e. struct + ``rte_mbuf::sched::color``). + +* Statistics: The set of counters maintained for each MTR object is + configurable and subject to the implementation support. This set includes + the number of packets and bytes dropped or passed for each output color. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/vhost_lib.rst b/src/spdk/dpdk/doc/guides/prog_guide/vhost_lib.rst new file mode 100644 index 000000000..07e40e3c5 --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/vhost_lib.rst @@ -0,0 +1,381 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2016 Intel Corporation. + +Vhost Library +============= + +The vhost library implements a user space virtio net server allowing the user +to manipulate the virtio ring directly. In another words, it allows the user +to fetch/put packets from/to the VM virtio net device. To achieve this, a +vhost library should be able to: + +* Access the guest memory: + + For QEMU, this is done by using the ``-object memory-backend-file,share=on,...`` + option. Which means QEMU will create a file to serve as the guest RAM. + The ``share=on`` option allows another process to map that file, which + means it can access the guest RAM. + +* Know all the necessary information about the vring: + + Information such as where the available ring is stored. Vhost defines some + messages (passed through a Unix domain socket file) to tell the backend all + the information it needs to know how to manipulate the vring. + + +Vhost API Overview +------------------ + +The following is an overview of some key Vhost API functions: + +* ``rte_vhost_driver_register(path, flags)`` + + This function registers a vhost driver into the system. ``path`` specifies + the Unix domain socket file path. + + Currently supported flags are: + + - ``RTE_VHOST_USER_CLIENT`` + + DPDK vhost-user will act as the client when this flag is given. See below + for an explanation. + + - ``RTE_VHOST_USER_NO_RECONNECT`` + + When DPDK vhost-user acts as the client it will keep trying to reconnect + to the server (QEMU) until it succeeds. This is useful in two cases: + + * When QEMU is not started yet. + * When QEMU restarts (for example due to a guest OS reboot). + + This reconnect option is enabled by default. However, it can be turned off + by setting this flag. + + - ``RTE_VHOST_USER_DEQUEUE_ZERO_COPY`` + + Dequeue zero copy will be enabled when this flag is set. It is disabled by + default. + + There are some truths (including limitations) you might want to know while + setting this flag: + + * zero copy is not good for small packets (typically for packet size below + 512). + + * zero copy is really good for VM2VM case. For iperf between two VMs, the + boost could be above 70% (when TSO is enabled). + + * For zero copy in VM2NIC case, guest Tx used vring may be starved if the + PMD driver consume the mbuf but not release them timely. + + For example, i40e driver has an optimization to maximum NIC pipeline which + postpones returning transmitted mbuf until only tx_free_threshold free + descs left. The virtio TX used ring will be starved if the formula + (num_i40e_tx_desc - num_virtio_tx_desc > tx_free_threshold) is true, since + i40e will not return back mbuf. + + A performance tip for tuning zero copy in VM2NIC case is to adjust the + frequency of mbuf free (i.e. adjust tx_free_threshold of i40e driver) to + balance consumer and producer. + + * Guest memory should be backended with huge pages to achieve better + performance. Using 1G page size is the best. + + When dequeue zero copy is enabled, the guest phys address and host phys + address mapping has to be established. Using non-huge pages means far + more page segments. To make it simple, DPDK vhost does a linear search + of those segments, thus the fewer the segments, the quicker we will get + the mapping. NOTE: we may speed it by using tree searching in future. + + * zero copy can not work when using vfio-pci with iommu mode currently, this + is because we don't setup iommu dma mapping for guest memory. If you have + to use vfio-pci driver, please insert vfio-pci kernel module in noiommu + mode. + + * The consumer of zero copy mbufs should consume these mbufs as soon as + possible, otherwise it may block the operations in vhost. + + - ``RTE_VHOST_USER_IOMMU_SUPPORT`` + + IOMMU support will be enabled when this flag is set. It is disabled by + default. + + Enabling this flag makes possible to use guest vIOMMU to protect vhost + from accessing memory the virtio device isn't allowed to, when the feature + is negotiated and an IOMMU device is declared. + + However, this feature enables vhost-user's reply-ack protocol feature, + which implementation is buggy in Qemu v2.7.0-v2.9.0 when doing multiqueue. + Enabling this flag with these Qemu version results in Qemu being blocked + when multiple queue pairs are declared. + + - ``RTE_VHOST_USER_POSTCOPY_SUPPORT`` + + Postcopy live-migration support will be enabled when this flag is set. + It is disabled by default. + + Enabling this flag should only be done when the calling application does + not pre-fault the guest shared memory, otherwise migration would fail. + + - ``RTE_VHOST_USER_LINEARBUF_SUPPORT`` + + Enabling this flag forces vhost dequeue function to only provide linear + pktmbuf (no multi-segmented pktmbuf). + + The vhost library by default provides a single pktmbuf for given a + packet, but if for some reason the data doesn't fit into a single + pktmbuf (e.g., TSO is enabled), the library will allocate additional + pktmbufs from the same mempool and chain them together to create a + multi-segmented pktmbuf. + + However, the vhost application needs to support multi-segmented format. + If the vhost application does not support that format and requires large + buffers to be dequeue, this flag should be enabled to force only linear + buffers (see RTE_VHOST_USER_EXTBUF_SUPPORT) or drop the packet. + + It is disabled by default. + + - ``RTE_VHOST_USER_EXTBUF_SUPPORT`` + + Enabling this flag allows vhost dequeue function to allocate and attach + an external buffer to a pktmbuf if the pkmbuf doesn't provide enough + space to store all data. + + This is useful when the vhost application wants to support large packets + but doesn't want to increase the default mempool object size nor to + support multi-segmented mbufs (non-linear). In this case, a fresh buffer + is allocated using rte_malloc() which gets attached to a pktmbuf using + rte_pktmbuf_attach_extbuf(). + + See RTE_VHOST_USER_LINEARBUF_SUPPORT as well to disable multi-segmented + mbufs for application that doesn't support chained mbufs. + + It is disabled by default. + +* ``rte_vhost_driver_set_features(path, features)`` + + This function sets the feature bits the vhost-user driver supports. The + vhost-user driver could be vhost-user net, yet it could be something else, + say, vhost-user SCSI. + +* ``rte_vhost_driver_callback_register(path, vhost_device_ops)`` + + This function registers a set of callbacks, to let DPDK applications take + the appropriate action when some events happen. The following events are + currently supported: + + * ``new_device(int vid)`` + + This callback is invoked when a virtio device becomes ready. ``vid`` + is the vhost device ID. + + * ``destroy_device(int vid)`` + + This callback is invoked when a virtio device is paused or shut down. + + * ``vring_state_changed(int vid, uint16_t queue_id, int enable)`` + + This callback is invoked when a specific queue's state is changed, for + example to enabled or disabled. + + * ``features_changed(int vid, uint64_t features)`` + + This callback is invoked when the features is changed. For example, + ``VHOST_F_LOG_ALL`` will be set/cleared at the start/end of live + migration, respectively. + + * ``new_connection(int vid)`` + + This callback is invoked on new vhost-user socket connection. If DPDK + acts as the server the device should not be deleted before + ``destroy_connection`` callback is received. + + * ``destroy_connection(int vid)`` + + This callback is invoked when vhost-user socket connection is closed. + It indicates that device with id ``vid`` is no longer in use and can be + safely deleted. + +* ``rte_vhost_driver_disable/enable_features(path, features))`` + + This function disables/enables some features. For example, it can be used to + disable mergeable buffers and TSO features, which both are enabled by + default. + +* ``rte_vhost_driver_start(path)`` + + This function triggers the vhost-user negotiation. It should be invoked at + the end of initializing a vhost-user driver. + +* ``rte_vhost_enqueue_burst(vid, queue_id, pkts, count)`` + + Transmits (enqueues) ``count`` packets from host to guest. + +* ``rte_vhost_dequeue_burst(vid, queue_id, mbuf_pool, pkts, count)`` + + Receives (dequeues) ``count`` packets from guest, and stored them at ``pkts``. + +* ``rte_vhost_crypto_create(vid, cryptodev_id, sess_mempool, socket_id)`` + + As an extension of new_device(), this function adds virtio-crypto workload + acceleration capability to the device. All crypto workload is processed by + DPDK cryptodev with the device ID of ``cryptodev_id``. + +* ``rte_vhost_crypto_free(vid)`` + + Frees the memory and vhost-user message handlers created in + rte_vhost_crypto_create(). + +* ``rte_vhost_crypto_fetch_requests(vid, queue_id, ops, nb_ops)`` + + Receives (dequeues) ``nb_ops`` virtio-crypto requests from guest, parses + them to DPDK Crypto Operations, and fills the ``ops`` with parsing results. + +* ``rte_vhost_crypto_finalize_requests(queue_id, ops, nb_ops)`` + + After the ``ops`` are dequeued from Cryptodev, finalizes the jobs and + notifies the guest(s). + +* ``rte_vhost_crypto_set_zero_copy(vid, option)`` + + Enable or disable zero copy feature of the vhost crypto backend. + +Vhost-user Implementations +-------------------------- + +Vhost-user uses Unix domain sockets for passing messages. This means the DPDK +vhost-user implementation has two options: + +* DPDK vhost-user acts as the server. + + DPDK will create a Unix domain socket server file and listen for + connections from the frontend. + + Note, this is the default mode, and the only mode before DPDK v16.07. + + +* DPDK vhost-user acts as the client. + + Unlike the server mode, this mode doesn't create the socket file; + it just tries to connect to the server (which responses to create the + file instead). + + When the DPDK vhost-user application restarts, DPDK vhost-user will try to + connect to the server again. This is how the "reconnect" feature works. + + .. Note:: + * The "reconnect" feature requires **QEMU v2.7** (or above). + + * The vhost supported features must be exactly the same before and + after the restart. For example, if TSO is disabled and then enabled, + nothing will work and issues undefined might happen. + +No matter which mode is used, once a connection is established, DPDK +vhost-user will start receiving and processing vhost messages from QEMU. + +For messages with a file descriptor, the file descriptor can be used directly +in the vhost process as it is already installed by the Unix domain socket. + +The supported vhost messages are: + +* ``VHOST_SET_MEM_TABLE`` +* ``VHOST_SET_VRING_KICK`` +* ``VHOST_SET_VRING_CALL`` +* ``VHOST_SET_LOG_FD`` +* ``VHOST_SET_VRING_ERR`` + +For ``VHOST_SET_MEM_TABLE`` message, QEMU will send information for each +memory region and its file descriptor in the ancillary data of the message. +The file descriptor is used to map that region. + +``VHOST_SET_VRING_KICK`` is used as the signal to put the vhost device into +the data plane, and ``VHOST_GET_VRING_BASE`` is used as the signal to remove +the vhost device from the data plane. + +When the socket connection is closed, vhost will destroy the device. + +Guest memory requirement +------------------------ + +* Memory pre-allocation + + For non-zerocopy, guest memory pre-allocation is not a must. This can help + save of memory. If users really want the guest memory to be pre-allocated + (e.g., for performance reason), we can add option ``-mem-prealloc`` when + starting QEMU. Or, we can lock all memory at vhost side which will force + memory to be allocated when mmap at vhost side; option --mlockall in + ovs-dpdk is an example in hand. + + For zerocopy, we force the VM memory to be pre-allocated at vhost lib when + mapping the guest memory; and also we need to lock the memory to prevent + pages being swapped out to disk. + +* Memory sharing + + Make sure ``share=on`` QEMU option is given. vhost-user will not work with + a QEMU version without shared memory mapping. + +Vhost supported vSwitch reference +--------------------------------- + +For more vhost details and how to support vhost in vSwitch, please refer to +the vhost example in the DPDK Sample Applications Guide. + +Vhost data path acceleration (vDPA) +----------------------------------- + +vDPA supports selective datapath in vhost-user lib by enabling virtio ring +compatible devices to serve virtio driver directly for datapath acceleration. + +``rte_vhost_driver_attach_vdpa_device`` is used to configure the vhost device +with accelerated backend. + +Also vhost device capabilities are made configurable to adopt various devices. +Such capabilities include supported features, protocol features, queue number. + +Finally, a set of device ops is defined for device specific operations: + +* ``get_queue_num`` + + Called to get supported queue number of the device. + +* ``get_features`` + + Called to get supported features of the device. + +* ``get_protocol_features`` + + Called to get supported protocol features of the device. + +* ``dev_conf`` + + Called to configure the actual device when the virtio device becomes ready. + +* ``dev_close`` + + Called to close the actual device when the virtio device is stopped. + +* ``set_vring_state`` + + Called to change the state of the vring in the actual device when vring state + changes. + +* ``set_features`` + + Called to set the negotiated features to device. + +* ``migration_done`` + + Called to allow the device to response to RARP sending. + +* ``get_vfio_group_fd`` + + Called to get the VFIO group fd of the device. + +* ``get_vfio_device_fd`` + + Called to get the VFIO device fd of the device. + +* ``get_notify_area`` + + Called to get the notify area info of the queue. diff --git a/src/spdk/dpdk/doc/guides/prog_guide/writing_efficient_code.rst b/src/spdk/dpdk/doc/guides/prog_guide/writing_efficient_code.rst new file mode 100644 index 000000000..849f63efe --- /dev/null +++ b/src/spdk/dpdk/doc/guides/prog_guide/writing_efficient_code.rst @@ -0,0 +1,220 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2010-2014 Intel Corporation. + +Writing Efficient Code +====================== + +This chapter provides some tips for developing efficient code using the DPDK. +For additional and more general information, +please refer to the *Intel® 64 and IA-32 Architectures Optimization Reference Manual* +which is a valuable reference to writing efficient code. + +Memory +------ + +This section describes some key memory considerations when developing applications in the DPDK environment. + +Memory Copy: Do not Use libc in the Data Plane +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Many libc functions are available in the DPDK, via the Linux* application environment. +This can ease the porting of applications and the development of the configuration plane. +However, many of these functions are not designed for performance. +Functions such as memcpy() or strcpy() should not be used in the data plane. +To copy small structures, the preference is for a simpler technique that can be optimized by the compiler. +Refer to the *VTune™ Performance Analyzer Essentials* publication from Intel Press for recommendations. + +For specific functions that are called often, +it is also a good idea to provide a self-made optimized function, which should be declared as static inline. + +The DPDK API provides an optimized rte_memcpy() function. + +Memory Allocation +~~~~~~~~~~~~~~~~~ + +Other functions of libc, such as malloc(), provide a flexible way to allocate and free memory. +In some cases, using dynamic allocation is necessary, +but it is really not advised to use malloc-like functions in the data plane because +managing a fragmented heap can be costly and the allocator may not be optimized for parallel allocation. + +If you really need dynamic allocation in the data plane, it is better to use a memory pool of fixed-size objects. +This API is provided by librte_mempool. +This data structure provides several services that increase performance, such as memory alignment of objects, +lockless access to objects, NUMA awareness, bulk get/put and per-lcore cache. +The rte_malloc () function uses a similar concept to mempools. + +Concurrent Access to the Same Memory Area +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Read-Write (RW) access operations by several lcores to the same memory area can generate a lot of data cache misses, +which are very costly. +It is often possible to use per-lcore variables, for example, in the case of statistics. +There are at least two solutions for this: + +* Use RTE_PER_LCORE variables. Note that in this case, data on lcore X is not available to lcore Y. + +* Use a table of structures (one per lcore). In this case, each structure must be cache-aligned. + +Read-mostly variables can be shared among lcores without performance losses if there are no RW variables in the same cache line. + +NUMA +~~~~ + +On a NUMA system, it is preferable to access local memory since remote memory access is slower. +In the DPDK, the memzone, ring, rte_malloc and mempool APIs provide a way to create a pool on a specific socket. + +Sometimes, it can be a good idea to duplicate data to optimize speed. +For read-mostly variables that are often accessed, +it should not be a problem to keep them in one socket only, since data will be present in cache. + +Distribution Across Memory Channels +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Modern memory controllers have several memory channels that can load or store data in parallel. +Depending on the memory controller and its configuration, +the number of channels and the way the memory is distributed across the channels varies. +Each channel has a bandwidth limit, +meaning that if all memory access operations are done on the first channel only, there is a potential bottleneck. + +By default, the :ref:`Mempool Library <Mempool_Library>` spreads the addresses of objects among memory channels. + +Locking memory pages +~~~~~~~~~~~~~~~~~~~~ + +The underlying operating system is allowed to load/unload memory pages at its own discretion. +These page loads could impact the performance, as the process is on hold when the kernel fetches them. + +To avoid these you could pre-load, and lock them into memory with the ``mlockall()`` call. + +.. code-block:: c + + if (mlockall(MCL_CURRENT | MCL_FUTURE)) { + RTE_LOG(NOTICE, USER1, "mlockall() failed with error \"%s\"\n", + strerror(errno)); + } + +Communication Between lcores +---------------------------- + +To provide a message-based communication between lcores, +it is advised to use the DPDK ring API, which provides a lockless ring implementation. + +The ring supports bulk and burst access, +meaning that it is possible to read several elements from the ring with only one costly atomic operation +(see :doc:`ring_lib`). +Performance is greatly improved when using bulk access operations. + +The code algorithm that dequeues messages may be something similar to the following: + +.. code-block:: c + + #define MAX_BULK 32 + + while (1) { + /* Process as many elements as can be dequeued. */ + count = rte_ring_dequeue_burst(ring, obj_table, MAX_BULK, NULL); + if (unlikely(count == 0)) + continue; + + my_process_bulk(obj_table, count); + } + +PMD Driver +---------- + +The DPDK Poll Mode Driver (PMD) is also able to work in bulk/burst mode, +allowing the factorization of some code for each call in the send or receive function. + +Avoid partial writes. +When PCI devices write to system memory through DMA, +it costs less if the write operation is on a full cache line as opposed to part of it. +In the PMD code, actions have been taken to avoid partial writes as much as possible. + +Lower Packet Latency +~~~~~~~~~~~~~~~~~~~~ + +Traditionally, there is a trade-off between throughput and latency. +An application can be tuned to achieve a high throughput, +but the end-to-end latency of an average packet will typically increase as a result. +Similarly, the application can be tuned to have, on average, +a low end-to-end latency, at the cost of lower throughput. + +In order to achieve higher throughput, +the DPDK attempts to aggregate the cost of processing each packet individually by processing packets in bursts. + +Using the testpmd application as an example, +the burst size can be set on the command line to a value of 16 (also the default value). +This allows the application to request 16 packets at a time from the PMD. +The testpmd application then immediately attempts to transmit all the packets that were received, +in this case, all 16 packets. + +The packets are not transmitted until the tail pointer is updated on the corresponding TX queue of the network port. +This behavior is desirable when tuning for high throughput because +the cost of tail pointer updates to both the RX and TX queues can be spread across 16 packets, +effectively hiding the relatively slow MMIO cost of writing to the PCIe* device. +However, this is not very desirable when tuning for low latency because +the first packet that was received must also wait for another 15 packets to be received. +It cannot be transmitted until the other 15 packets have also been processed because +the NIC will not know to transmit the packets until the TX tail pointer has been updated, +which is not done until all 16 packets have been processed for transmission. + +To consistently achieve low latency, even under heavy system load, +the application developer should avoid processing packets in bunches. +The testpmd application can be configured from the command line to use a burst value of 1. +This will allow a single packet to be processed at a time, providing lower latency, +but with the added cost of lower throughput. + +Locks and Atomic Operations +--------------------------- + +Atomic operations imply a lock prefix before the instruction, +causing the processor's LOCK# signal to be asserted during execution of the following instruction. +This has a big impact on performance in a multicore environment. + +Performance can be improved by avoiding lock mechanisms in the data plane. +It can often be replaced by other solutions like per-lcore variables. +Also, some locking techniques are more efficient than others. +For instance, the Read-Copy-Update (RCU) algorithm can frequently replace simple rwlocks. + +Coding Considerations +--------------------- + +Inline Functions +~~~~~~~~~~~~~~~~ + +Small functions can be declared as static inline in the header file. +This avoids the cost of a call instruction (and the associated context saving). +However, this technique is not always efficient; it depends on many factors including the compiler. + +Branch Prediction +~~~~~~~~~~~~~~~~~ + +The Intel® C/C++ Compiler (icc)/gcc built-in helper functions likely() and unlikely() +allow the developer to indicate if a code branch is likely to be taken or not. +For instance: + +.. code-block:: c + + if (likely(x > 1)) + do_stuff(); + +Setting the Target CPU Type +--------------------------- + +The DPDK supports CPU microarchitecture-specific optimizations by means of CONFIG_RTE_MACHINE option +in the DPDK configuration file. +The degree of optimization depends on the compiler's ability to optimize for a specific microarchitecture, +therefore it is preferable to use the latest compiler versions whenever possible. + +If the compiler version does not support the specific feature set (for example, the Intel® AVX instruction set), +the build process gracefully degrades to whatever latest feature set is supported by the compiler. + +Since the build and runtime targets may not be the same, +the resulting binary also contains a platform check that runs before the +main() function and checks if the current machine is suitable for running the binary. + +Along with compiler optimizations, +a set of preprocessor defines are automatically added to the build process (regardless of the compiler version). +These defines correspond to the instruction sets that the target CPU should be able to support. +For example, a binary compiled for any SSE4.2-capable processor will have RTE_MACHINE_CPUFLAG_SSE4_2 defined, +thus enabling compile-time code path selection for different platforms. |