[ovs-dev] [PATCH 3/4] ofpbuf: Add ofpbuf_rss()

Pravin Shelar pshelar at nicira.com
Wed Aug 13 22:28:12 UTC 2014


On Wed, Aug 13, 2014 at 8:49 AM, Daniele Di Proietto
<ddiproietto at vmware.com> wrote:
>
>
> On 8/12/14, 5:42 PM, "Pravin Shelar" <pshelar at nicira.com> wrote:
>
>>On Tue, Jul 22, 2014 at 5:06 PM, Daniele Di Proietto
>><ddiproietto at vmware.com> wrote:
>>> ofpbuf_rss() is introduced to get the RSS hash from the NIC. It works
>>>only for
>>> packets received by DPDK (otherwise it returns 0, which tells the
>>>caller to
>>> compute the hash in another way)
>>>
>>> This commit also configure DPDK devices to compute RSS hash for UDP
>>>packets
>>>
>>> Signed-off-by: Daniele Di Proietto <ddiproietto at vmware.com>
>>> ---
>>>  lib/netdev-dpdk.c |  3 ++-
>>>  lib/ofpbuf.h      | 13 +++++++++++++
>>>  2 files changed, 15 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
>>> index 62c9a0c..44d2dc0 100644
>>> --- a/lib/netdev-dpdk.c
>>> +++ b/lib/netdev-dpdk.c
>>> @@ -96,7 +96,8 @@ static const struct rte_eth_conf port_conf = {
>>>      .rx_adv_conf = {
>>>          .rss_conf = {
>>>              .rss_key = NULL,
>>> -            .rss_hf = ETH_RSS_IPV4_TCP | ETH_RSS_IPV4 | ETH_RSS_IPV6,
>>> +            .rss_hf = ETH_RSS_IPV4_TCP | ETH_RSS_IPV4 | ETH_RSS_IPV6
>>> +                      | ETH_RSS_IPV4_UDP,
>>>          },
>>>      },
>>>      .txmode = {
>>> diff --git a/lib/ofpbuf.h b/lib/ofpbuf.h
>>> index adaf526..9254c98 100644
>>> --- a/lib/ofpbuf.h
>>> +++ b/lib/ofpbuf.h
>>> @@ -159,6 +159,7 @@ char *ofpbuf_to_string(const struct ofpbuf *,
>>>size_t maxbytes);
>>>  static inline struct ofpbuf *ofpbuf_from_list(const struct list *);
>>>  void ofpbuf_list_delete(struct list *);
>>>  static inline bool ofpbuf_equal(const struct ofpbuf *, const struct
>>>ofpbuf *);
>>> +static inline uint32_t ofpbuf_rss(const struct ofpbuf *);
>>>
>>>
>>>  /* Returns a pointer that may be passed to free() to accomplish the
>>>same thing
>>> @@ -389,6 +390,13 @@ static inline void ofpbuf_set_size(struct ofpbuf
>>>*b, uint32_t v)
>>>      b->mbuf.pkt.pkt_len = v;     /* Total length of all segments
>>>linked to
>>>                                    * this segment. */
>>>  }
>>> +static inline uint32_t ofpbuf_rss(const struct ofpbuf * b)
>>> +{
>>> +    if (OVS_LIKELY(b->source == OFPBUF_DPDK)) {
>>> +        return (b)->mbuf.pkt.hash.rss;
>>> +    }
>>> +    return 0;
>>> +}
>>We need to handle case if buffer is not from dpdk.
>
> If the buffer is not from DPDK we just return 0 (which is considered an
> invalid hash value). Is there anything better we could do?
>

You can use miniflow_hash_5tuple() to calculate the hash. We also need
this API for hash action code in dpif-netdev to use DPDK rss rather
than extracting flow key for every packet.



More information about the dev mailing list