When IP layer fragments packets, L4 header is only present in the first packet. The next fragmented packets donot contain L4 headers. So hash calculation based on 5tuple should ignore the L4 headers for all fragmented packets.
Signed-off-by: Somnath Chatterjee <somnath.b.chatter...@ericsson.com> --- lib/flow.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/flow.c b/lib/flow.c index c2e1e4ad6..db425d681 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -1075,10 +1075,12 @@ miniflow_extract(struct dp_packet *packet, struct miniflow *dst) miniflow_push_be16(mf, tp_dst, tcp->tcp_dst); miniflow_push_be16(mf, ct_tp_src, ct_tp_src); miniflow_push_be16(mf, ct_tp_dst, ct_tp_dst); - if (dl_type == htons(ETH_TYPE_IP)) { - dp_packet_update_rss_hash_ipv4_tcp_udp(packet); - } else if (dl_type == htons(ETH_TYPE_IPV6)) { - dp_packet_update_rss_hash_ipv6_tcp_udp(packet); + if (OVS_LIKELY(!nw_frag)) { + if (dl_type == htons(ETH_TYPE_IP)) { + dp_packet_update_rss_hash_ipv4_tcp_udp(packet); + } else if (dl_type == htons(ETH_TYPE_IPV6)) { + dp_packet_update_rss_hash_ipv6_tcp_udp(packet); + } } dp_packet_ol_l4_csum_check_partial(packet); if (dp_packet_l4_checksum_good(packet) @@ -1095,10 +1097,12 @@ miniflow_extract(struct dp_packet *packet, struct miniflow *dst) miniflow_push_be16(mf, tp_dst, udp->udp_dst); miniflow_push_be16(mf, ct_tp_src, ct_tp_src); miniflow_push_be16(mf, ct_tp_dst, ct_tp_dst); - if (dl_type == htons(ETH_TYPE_IP)) { - dp_packet_update_rss_hash_ipv4_tcp_udp(packet); - } else if (dl_type == htons(ETH_TYPE_IPV6)) { - dp_packet_update_rss_hash_ipv6_tcp_udp(packet); + if (OVS_LIKELY(!nw_frag)) { + if (dl_type == htons(ETH_TYPE_IP)) { + dp_packet_update_rss_hash_ipv4_tcp_udp(packet); + } else if (dl_type == htons(ETH_TYPE_IPV6)) { + dp_packet_update_rss_hash_ipv6_tcp_udp(packet); + } } dp_packet_ol_l4_csum_check_partial(packet); if (dp_packet_l4_checksum_good(packet) @@ -2426,10 +2430,12 @@ flow_hash_5tuple(const struct flow *flow, uint32_t basis) goto out; } - /* Add both ports at once. */ - hash = hash_add(hash, - ((const uint32_t *)flow)[offsetof(struct flow, tp_src) - / sizeof(uint32_t)]); + /* Add both L4 ports, only if the packet is not fragmented. */ + if (OVS_LIKELY(!(flow->nw_frag & FLOW_NW_FRAG_MASK))) { + hash = hash_add(hash, + ((const uint32_t *)flow) + [offsetof(struct flow, tp_src) / sizeof(uint32_t)]); + } } out: return hash_finish(hash, 42); /* Arbitrary number. */ -- 2.45.1.windows.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev