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é <phi...@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