[PATCH v4 6/6] net/eth: Return earlier in _eth_get_rss_ex_dst_addr()

Philippe Mathieu-Daudé posted 6 patches 4 years, 8 months ago
There is a newer version of this series
[PATCH v4 6/6] net/eth: Return earlier in _eth_get_rss_ex_dst_addr()
Posted by Philippe Mathieu-Daudé 4 years, 8 months ago
Slightly simplify _eth_get_rss_ex_dst_addr() by returning earlier.

Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 net/eth.c | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/net/eth.c b/net/eth.c
index e984edcfb0b..b44439d31c5 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -407,23 +407,21 @@ _eth_get_rss_ex_dst_addr(const struct iovec *pkt, int pkt_frags,
 {
     size_t input_size = iov_size(pkt, pkt_frags);
     struct ip6_ext_hdr_routing *rthdr;
+    size_t bytes_read;
 
     if (input_size < ext_hdr_offset + sizeof(*rthdr)) {
         return false;
     }
     rthdr = (struct ip6_ext_hdr_routing *) ext_hdr;
 
-    if ((rthdr->rtype == 2) && (rthdr->segleft == 1)) {
-        size_t bytes_read;
-
-        bytes_read = iov_to_buf(pkt, pkt_frags,
-                                ext_hdr_offset + sizeof(*ext_hdr),
-                                dst_addr, sizeof(*dst_addr));
-
-        return bytes_read == sizeof(*dst_addr);
+    if ((rthdr->rtype != 2) || (rthdr->segleft != 1)) {
+        return false;
     }
 
-    return false;
+    bytes_read = iov_to_buf(pkt, pkt_frags, ext_hdr_offset + sizeof(*ext_hdr),
+                            dst_addr, sizeof(*dst_addr));
+
+    return bytes_read == sizeof(*dst_addr);
 }
 
 static bool
-- 
2.26.2

Re: [PATCH v4 6/6] net/eth: Return earlier in _eth_get_rss_ex_dst_addr()
Posted by Stefano Garzarella 4 years, 8 months ago
On Tue, Mar 09, 2021 at 07:27:09PM +0100, Philippe Mathieu-Daudé wrote:
>Slightly simplify _eth_get_rss_ex_dst_addr() by returning earlier.
>
>Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
>---
> net/eth.c | 16 +++++++---------
> 1 file changed, 7 insertions(+), 9 deletions(-)
>
>diff --git a/net/eth.c b/net/eth.c
>index e984edcfb0b..b44439d31c5 100644
>--- a/net/eth.c
>+++ b/net/eth.c
>@@ -407,23 +407,21 @@ _eth_get_rss_ex_dst_addr(const struct iovec *pkt, int pkt_frags,
> {
>     size_t input_size = iov_size(pkt, pkt_frags);
>     struct ip6_ext_hdr_routing *rthdr;
>+    size_t bytes_read;
>
>     if (input_size < ext_hdr_offset + sizeof(*rthdr)) {
>         return false;
>     }
>     rthdr = (struct ip6_ext_hdr_routing *) ext_hdr;
>
>-    if ((rthdr->rtype == 2) && (rthdr->segleft == 1)) {
>-        size_t bytes_read;
>-
>-        bytes_read = iov_to_buf(pkt, pkt_frags,
>-                                ext_hdr_offset + sizeof(*ext_hdr),
>-                                dst_addr, sizeof(*dst_addr));
>-
>-        return bytes_read == sizeof(*dst_addr);
>+    if ((rthdr->rtype != 2) || (rthdr->segleft != 1)) {
>+        return false;
>     }
>
>-    return false;
>+    bytes_read = iov_to_buf(pkt, pkt_frags, ext_hdr_offset + sizeof(*ext_hdr),
>+                            dst_addr, sizeof(*dst_addr));

Pre-existing issue, but looking at the Routing extension header format 
[1], I think the offset we're using here is wrong.

I had a doubt if the address started at ext_hdr_offset + 4 or 
ext_hdr_offset + 8 but looking in the linux code I think the offset we 
should use is ext_hdr_offset + sizeof(*rthdr).

This is the structure that I found in include/uapi/linux/ipv6.h:

     /*
      *	routing header type 2
      */

     struct rt2_hdr {
     	struct ipv6_rt_hdr	rt_hdr;
     	__u32			reserved;
     	struct in6_addr		addr;

     #define rt2_type		rt_hdr.type
     };

Thanks,
Stefano

[1] https://en.wikipedia.org/wiki/IPv6_packet#Routing