1fc1f2750SBernard Iremonger.. BSD LICENSE 2fc1f2750SBernard Iremonger Copyright(c) 2010-2014 Intel Corporation. All rights reserved. 3fc1f2750SBernard Iremonger All rights reserved. 4fc1f2750SBernard Iremonger 5fc1f2750SBernard Iremonger Redistribution and use in source and binary forms, with or without 6fc1f2750SBernard Iremonger modification, are permitted provided that the following conditions 7fc1f2750SBernard Iremonger are met: 8fc1f2750SBernard Iremonger 9fc1f2750SBernard Iremonger * Redistributions of source code must retain the above copyright 10fc1f2750SBernard Iremonger notice, this list of conditions and the following disclaimer. 11fc1f2750SBernard Iremonger * Redistributions in binary form must reproduce the above copyright 12fc1f2750SBernard Iremonger notice, this list of conditions and the following disclaimer in 13fc1f2750SBernard Iremonger the documentation and/or other materials provided with the 14fc1f2750SBernard Iremonger distribution. 15fc1f2750SBernard Iremonger * Neither the name of Intel Corporation nor the names of its 16fc1f2750SBernard Iremonger contributors may be used to endorse or promote products derived 17fc1f2750SBernard Iremonger from this software without specific prior written permission. 18fc1f2750SBernard Iremonger 19fc1f2750SBernard Iremonger THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fc1f2750SBernard Iremonger "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fc1f2750SBernard Iremonger LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fc1f2750SBernard Iremonger A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fc1f2750SBernard Iremonger OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fc1f2750SBernard Iremonger SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fc1f2750SBernard Iremonger LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fc1f2750SBernard Iremonger DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fc1f2750SBernard Iremonger THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fc1f2750SBernard Iremonger (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fc1f2750SBernard Iremonger OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fc1f2750SBernard Iremonger 31fc1f2750SBernard Iremonger.. _Hash_Library: 32fc1f2750SBernard Iremonger 33fc1f2750SBernard IremongerHash Library 34fc1f2750SBernard Iremonger============ 35fc1f2750SBernard Iremonger 36*48624fd9SSiobhan ButlerThe DPDK provides a Hash Library for creating hash table for fast lookup. 37fc1f2750SBernard IremongerThe hash table is a data structure optimized for searching through a set of entries that are each identified by a unique key. 38*48624fd9SSiobhan ButlerFor increased performance the DPDK Hash requires that all the keys have the same number of bytes which is set at the hash creation time. 39fc1f2750SBernard Iremonger 40fc1f2750SBernard IremongerHash API Overview 41fc1f2750SBernard Iremonger----------------- 42fc1f2750SBernard Iremonger 43fc1f2750SBernard IremongerThe main configuration parameters for the hash are: 44fc1f2750SBernard Iremonger 45fc1f2750SBernard Iremonger* Total number of hash entries 46fc1f2750SBernard Iremonger 47fc1f2750SBernard Iremonger* Size of the key in bytes 48fc1f2750SBernard Iremonger 49fc1f2750SBernard IremongerThe hash also allows the configuration of some low-level implementation related parameters such as: 50fc1f2750SBernard Iremonger 51fc1f2750SBernard Iremonger* Hash function to translate the key into a bucket index 52fc1f2750SBernard Iremonger 53fc1f2750SBernard Iremonger* Number of entries per bucket 54fc1f2750SBernard Iremonger 55fc1f2750SBernard IremongerThe main methods exported by the hash are: 56fc1f2750SBernard Iremonger 57fc1f2750SBernard Iremonger* Add entry with key: The key is provided as input. If a new entry is successfully added to the hash for the specified key, 58fc1f2750SBernard Iremonger or there is already an entry in the hash for the specified key, then the position of the entry is returned. 59fc1f2750SBernard Iremonger If the operation was not successful, for example due to lack of free entries in the hash, then a negative value is returned; 60fc1f2750SBernard Iremonger 61fc1f2750SBernard Iremonger* Delete entry with key: The key is provided as input. If an entry with the specified key is found in the hash, 62fc1f2750SBernard Iremonger then the entry is removed from the hash and the position where the entry was found in the hash is returned. 63fc1f2750SBernard Iremonger If no entry with the specified key exists in the hash, then a negative value is returned 64fc1f2750SBernard Iremonger 65fc1f2750SBernard Iremonger* Lookup for entry with key: The key is provided as input. If an entry with the specified key is found in the hash (lookup hit), 66fc1f2750SBernard Iremonger then the position of the entry is returned, otherwise (lookup miss) a negative value is returned. 67fc1f2750SBernard Iremonger 68fc1f2750SBernard IremongerThe current hash implementation handles the key management only. 69fc1f2750SBernard IremongerThe actual data associated with each key has to be managed by the user using a separate table that 70fc1f2750SBernard Iremongermirrors the hash in terms of number of entries and position of each entry, 71fc1f2750SBernard Iremongeras shown in the Flow Classification use case describes in the following sections. 72fc1f2750SBernard Iremonger 73fc1f2750SBernard IremongerThe example hash tables in the L2/L3 Forwarding sample applications defines which port to forward a packet to based on a packet flow identified by the five-tuple lookup. 74fc1f2750SBernard IremongerHowever, 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. 75fc1f2750SBernard Iremonger 76fc1f2750SBernard IremongerImplementation Details 77fc1f2750SBernard Iremonger---------------------- 78fc1f2750SBernard Iremonger 79fc1f2750SBernard IremongerThe hash table is implemented as an array of entries which is further divided into buckets, 80fc1f2750SBernard Iremongerwith the same number of consecutive array entries in each bucket. 81fc1f2750SBernard IremongerFor any input key, there is always a single bucket where that key can be stored in the hash, 82fc1f2750SBernard Iremongertherefore only the entries within that bucket need to be examined when the key is looked up. 83fc1f2750SBernard IremongerThe lookup speed is achieved by reducing the number of entries to be scanned from the total 84fc1f2750SBernard Iremongernumber of hash entries down to the number of entries in a hash bucket, 85fc1f2750SBernard Iremongeras opposed to the basic method of linearly scanning all the entries in the array. 86fc1f2750SBernard IremongerThe hash uses a hash function (configurable) to translate the input key into a 4-byte key signature. 87fc1f2750SBernard IremongerThe bucket index is the key signature modulo the number of hash buckets. 88fc1f2750SBernard IremongerOnce the bucket is identified, the scope of the hash add, 89fc1f2750SBernard Iremongerdelete and lookup operations is reduced to the entries in that bucket. 90fc1f2750SBernard Iremonger 91fc1f2750SBernard IremongerTo speed up the search logic within the bucket, each hash entry stores the 4-byte key signature together with the full key for each hash entry. 92fc1f2750SBernard IremongerFor large key sizes, comparing the input key against a key from the bucket can take significantly more time than 93fc1f2750SBernard Iremongercomparing the 4-byte signature of the input key against the signature of a key from the bucket. 94fc1f2750SBernard IremongerTherefore, the signature comparison is done first and the full key comparison done only when the signatures matches. 95fc1f2750SBernard IremongerThe full key comparison is still necessary, as two input keys from the same bucket can still potentially have the same 4-byte hash signature, 96fc1f2750SBernard Iremongeralthough this event is relatively rare for hash functions providing good uniform distributions for the set of input keys. 97fc1f2750SBernard Iremonger 98fc1f2750SBernard IremongerUse Case: Flow Classification 99fc1f2750SBernard Iremonger----------------------------- 100fc1f2750SBernard Iremonger 101fc1f2750SBernard IremongerFlow classification is used to map each input packet to the connection/flow it belongs to. 102fc1f2750SBernard IremongerThis operation is necessary as the processing of each input packet is usually done in the context of their connection, 103fc1f2750SBernard Iremongerso the same set of operations is applied to all the packets from the same flow. 104fc1f2750SBernard Iremonger 105fc1f2750SBernard IremongerApplications using flow classification typically have a flow table to manage, with each separate flow having an entry associated with it in this table. 106fc1f2750SBernard IremongerThe size of the flow table entry is application specific, with typical values of 4, 16, 32 or 64 bytes. 107fc1f2750SBernard Iremonger 108fc1f2750SBernard IremongerEach application using flow classification typically has a mechanism defined to uniquely identify a flow based on 109fc1f2750SBernard Iremongera number of fields read from the input packet that make up the flow key. 110fc1f2750SBernard IremongerOne example is to use the DiffServ 5-tuple made up of the following fields of the IP and transport layer packet headers: 111fc1f2750SBernard IremongerSource IP Address, Destination IP Address, Protocol, Source Port, Destination Port. 112fc1f2750SBernard Iremonger 113*48624fd9SSiobhan ButlerThe DPDK hash provides a generic method to implement an application specific flow classification mechanism. 114fc1f2750SBernard IremongerGiven 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 115fc1f2750SBernard Iremongerwith the hash key size set to the number of bytes in the selected flow key. 116fc1f2750SBernard Iremonger 117fc1f2750SBernard IremongerThe flow table operations on the application side are described below: 118fc1f2750SBernard Iremonger 119fc1f2750SBernard Iremonger* Add flow: Add the flow key to hash. 120fc1f2750SBernard Iremonger If the returned position is valid, use it to access the flow entry in the flow table for adding a new flow or 121fc1f2750SBernard Iremonger updating the information associated with an existing flow. 122fc1f2750SBernard Iremonger Otherwise, the flow addition failed, for example due to lack of free entries for storing new flows. 123fc1f2750SBernard Iremonger 124fc1f2750SBernard Iremonger* Delete flow: Delete the flow key from the hash. If the returned position is valid, 125fc1f2750SBernard Iremonger use it to access the flow entry in the flow table to invalidate the information associated with the flow. 126fc1f2750SBernard Iremonger 127fc1f2750SBernard Iremonger* Lookup flow: Lookup for the flow key in the hash. 128fc1f2750SBernard Iremonger If the returned position is valid (flow lookup hit), use the returned position to access the flow entry in the flow table. 129fc1f2750SBernard Iremonger Otherwise (flow lookup miss) there is no flow registered for the current packet. 130fc1f2750SBernard Iremonger 131fc1f2750SBernard IremongerReferences 132fc1f2750SBernard Iremonger---------- 133fc1f2750SBernard Iremonger 134fc1f2750SBernard Iremonger* Donald E. Knuth, The Art of Computer Programming, Volume 3: Sorting and Searching (2nd Edition), 1998, Addison-Wesley Professional 135