title: rx_queue_index returns always value 1 for ipv6-Srv6 packets on XDP-eBPF
body: <p>I am trying to keep track of <code>Ipv6-Srv6</code> packets using simple XDP-eBPF program. I get the NIC queue as always 1.</p>
  <p>Following is environment details</p>
  <ol>
  <li>OS: guest OS, Ubuntu 19.10, 5.3.0-64-generic</li>
  <li>NIC: x710: 10Gbps, driver=i40e, driverversion=2.8.20-k, firmware=7.20</li>
  <li>XDP-eBPF: my custom sample program</li>
  </ol>
  <pre><code>#include &lt;bpf.h&gt;
  #include &lt;bpf/bpf_helpers.h&gt;
  
  #include &lt;linux/if_ether.h&gt;
  #include &lt;linux/ipv6.h&gt;
  
  #include &lt;stdint.h&gt;
  
  #ifndef lock_xadd
  #define lock_xadd(ptr, val)     ((void) __sync_fetch_and_add(ptr, val))
  #endif
  
  struct bpf_map_def SEC(&quot;maps&quot;) queue_rx_pkts = {
          .type        = BPF_MAP_TYPE_ARRAY,
          .key_size    = sizeof(__u32),
          .value_size  = sizeof(__u64),
          .max_entries = 256,
  };
  
  SEC(&quot;prog&quot;)
  int xdp_select(struct xdp_md *ctx)
  {
          //__u32 input_port = ctx-&gt;ingress_ifindex;
          __u32 input_queue = ctx-&gt;rx_queue_index;
  
          void *data_end = (void *)(long)ctx-&gt;data_end;
          void *data = (void *)(long)ctx-&gt;data;
          struct ethhdr *eth_ptr = (struct ethhdr *)data;
          struct ipv6hdr *ipv6_ptr = (struct ipv6hdr *)(data + sizeof(struct ethhdr));
          unsigned int *pkt_count = bpf_map_lookup_elem(&amp;queue_rx_pkts, &amp;input_queue);
  
          if (!pkt_count)
                  return XDP_ABORTED;
  
          if ((data + sizeof(*eth_ptr)) &gt; data_end)
                  return XDP_DROP;
  
  
          if (eth_ptr-&gt;h_proto == 0xdd86) {
                  if ((void *)(ipv6_ptr + 1) &gt; data_end)
                          return XDP_DROP;
                  *pkt_count += 1;
                  return XDP_PASS;
          }
  
          return XDP_DROP;
  }
  </code></pre>
  <ul>
  <li>packet generator: Host NIC X710 run with packEth cli utility with <code>packETHcli -i ens261f2 -m 2- d 0 -n 0 -f /tmp/test.pcap</code></li>
  <li>Expected result: Ingress packets would be spread on multiple RX queues.</li>
  <li>Observed result: RX queue 1 is only getting packets.</li>
  </ul>
  <p><a href="https://i.stack.imgur.com/QiyJ5.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/QiyJ5.png" alt="enter image description here" /></a></p>
  <p>I verified the results with <code>ethtool -S [interface name]</code> and <code>bpftool map dump id 12</code>. Both cases RX-Queue-1 is only getting updated.</p>
  <p><a href="https://i.stack.imgur.com/dk5iU.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/dk5iU.png" alt="enter image description here" /></a></p>
  <p>[EDIT-1] updating RSS hash status as per the recommendation from comment</p>
  <pre class="lang-sh prettyprint-override"><code>$ ethtool --show-rxfh-indir ens10                                                                                                                                                                                                      [4/1785]
  RX flow hash indirection table for ens10 with 8 RX ring(s):
      0:      0     1     2     3     4     5     6     7
      8:      0     1     2     3     4     5     6     7
  &lt;snipped&gt;
    504:      0     1     2     3     4     5     6     7
  RSS hash key:
  9b:d2:e1:c0:f7:aa:1f:69:49:7c:55:76:48:7e:2c:fc:d5:91:47:39:df:50:52:8f:88:07:c8:63:62:27:93:17:35:75:dc:f6:85:e8:ff:c2:72:1d:de:92:d4:2b:1e:d9:f2:53:df:38
  RSS hash function:
      toeplitz: on
      xor: off
      crc32: off
  </code></pre>