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