[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5 3/5] public/io/netif.h: add documentation for hash negotiation and mapping
This patch specifies the xenstore keys that should be used by frontends and backends to negotiate a particular hash algorithm and queue mapping to be used for mult-queue packet steering on the guest receive side. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Keir Fraser <keir@xxxxxxx> Cc: Tim Deegan <tim@xxxxxxx> --- v4: - Fix spelling of 'capabilities' --- xen/include/public/io/netif.h | 111 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 106 insertions(+), 5 deletions(-) diff --git a/xen/include/public/io/netif.h b/xen/include/public/io/netif.h index 46b85b8..b60e86b 100644 --- a/xen/include/public/io/netif.h +++ b/xen/include/public/io/netif.h @@ -114,11 +114,112 @@ * error. This includes scenarios where more (or fewer) queues were * requested than the frontend provided details for. * - * Mapping of packets to queues is considered to be a function of the - * transmitting system (backend or frontend) and is not negotiated - * between the two. Guests are free to transmit packets on any queue - * they choose, provided it has been set up correctly. Guests must be - * prepared to receive packets on any queue they have requested be set up. + * Unless a hash algorithm or mapping of packet hash to queues has been + * negotiated (see below), queue selection is considered to be a function of + * the transmitting system (backend or frontend) and either end is free to + * transmit packets on any queue, provided it has been set up correctly. + * Guests must therefore be prepared to receive packets on any queue they + * have requested be set up. + */ + +/* + * Hash negotiation (only applicable if using multiple queues): + * + * A backend can advertise a set of hash algorithms that it can perform by + * naming it in a space separated list in the "multi-queue-hash-list" + * xenstore key. For example, if the backend supports the 'foo' and 'bar' + * algorithms it would set: + * + * /local/domain/X/backend/vif/Y/Z/multi-queue-hash-list = "foo bar" + * + * Additionally, in supporting a particular algorithm, it may be necessary + * for the backend to specify the capabilities of its implementation of + * that algorithm, e.g. what sections of packet header it can hash. + * To do that it can set algorithm-specific keys under a parent capabilities + * key. For example, if the 'bar' algorithm implementation in the backend + * is capable of hashing over an IP version 4 header and a TCP header, the + * backend might set: + * + * /local/domain/X/backend/vif/Y/Z/multi-queue-hash-caps-bar/types = "ipv4+tcp" + * + * The backend should set all such keys before it moves into the initwait + * state. + * + * The frontend can select a hash algorithm at any time after it moves into + * the connected state by setting the "multi-queue-hash" key. The backend + * must therefore watch this key and be prepared to change hash algorithms + * at any time whilst in the connected state. So, for example, if the + * frontend wants 'foo' hashing, it should set: + * + * /local/domain/Y/device/vif/Z/multi-queue-hash = "foo" + * + * Additionally it may set parameters for that algorithm by setting + * algorithm-specific keys under a parent parameters key. For example, if + * the 'foo' algorithm implementation in the backend is capable of hashing + * over an IP version 4 header, a TCP header or both but the frontend only + * wants it to hash over only the IP version 4 header then it might set: + * + * /local/domain/Y/device/vif/Z/multi-queue-hash-params-foo/types = "ipv4" + * + * The backend must also watch the parameters key as the frontend may + * change the parameters at any time whilst in the connected state. + * + * (Capabilities and parameters documentation for specific algorithms is + * below). + * + * TOEPLITZ: + * + * If the backend supports Toeplitz hashing then it should include + * the algorithm name 'toeplitz' in its "multi-queue-hash-list" key. + * It should also advertise the following capabilities: + * + * types: a space separated list containing any or all of 'ipv4', 'tcpv4', + * 'ipv6', 'tcpv6', indicating over which headers the hash algorithm + * is capable of being performed. + * + * max-key-length: an integer value indicating the maximum key length (in + * octets) that the frontend may supply. + * + * Upon selecting this algorithm, the frontend may supply the following + * parameters. + * + * types: a space separated list containing none, any or all of the type + * names included in the types list in the capabilities. + * When the backend encounters a packet type not in this list it + * will assign a hash value of 0. + * + * key: a ':' separated list of octets (up to the maximum length specified + * in the capabilities) expressed in hexadecimal indicating the key + * that should be used in the hash calculation. + * + * For more information on Toeplitz hash calculation see: + * + * https://msdn.microsoft.com/en-us/library/windows/hardware/ff570725.aspx + */ + +/* + * Hash mapping (only applicable if using multiple queues): + * + * If the backend is not capable, or no mapping is specified by the frontend + * then it is assumed that the hash -> queue mapping is done by simple + * modular arithmetic. + * + * To advertise that it is capable of accepting a specific mapping from the + * frontend the backend should set the "multi-queue-max-hash-mapping-length" + * key to a non-zero value. The frontend may then specify a mapping (up to + * the maximum specified length) as a ',' separated list of decimal queue + * numbers in the "multi-queue-hash-mapping" key. + * + * The backend should parse this list into an array and perform the mapping + * as follows: + * + * queue = mapping[hash % length-of-list] + * + * If any of the queue values specified in the list is not connected then + * the backend is free to choose a connected queue arbitrarily. + * + * The backend must be prepared to handle updates the mapping list at any + * time whilst in the connected state. */ /* -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |