diff options
author | Darrell Ball <dlu998@gmail.com> | 2019-08-26 09:05:44 -0700 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2019-09-25 08:58:11 -0700 |
commit | 594570ea1cdecc7ef7880d707cbc7a4a4ecef09f (patch) | |
tree | 702eec3e00d443f043f62f5723514b7602b10fe0 /lib/packets.c | |
parent | ba5ca284098fdf92ca851405c8fab2ef1a4fac39 (diff) | |
download | openvswitch-594570ea1cdecc7ef7880d707cbc7a4a4ecef09f.tar.gz |
conntrack: Optimize recirculations.
Cache the 'conn' context and use it when it is valid. The cached 'conn'
context will get reset if it is not expected to be valid; the cost to do
this is negligible. Besides being most optimal, this also handles corner
cases, such as decapsulation leading to the same tuple, as in tunnel VPN
cases. A negative test is added to check the resetting of the cached
'conn'.
Signed-off-by: Darrell Ball <dlu998@gmail.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'lib/packets.c')
-rw-r--r-- | lib/packets.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/packets.c b/lib/packets.c index 12053df57..fba69eed2 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -391,6 +391,8 @@ push_mpls(struct dp_packet *packet, ovs_be16 ethtype, ovs_be32 lse) header = dp_packet_resize_l2_5(packet, MPLS_HLEN); memmove(header, header + MPLS_HLEN, len); memcpy(header + len, &lse, sizeof lse); + + pkt_metadata_init_conn(&packet->md); } /* If 'packet' is an MPLS packet, removes its outermost MPLS label stack entry. @@ -983,6 +985,8 @@ packet_set_ipv4_addr(struct dp_packet *packet, ovs_be32 old_addr = get_16aligned_be32(addr); size_t l4_size = dp_packet_l4_size(packet); + pkt_metadata_init_conn(&packet->md); + if (nh->ip_proto == IPPROTO_TCP && l4_size >= TCP_HEADER_LEN) { struct tcp_header *th = dp_packet_l4(packet); @@ -1122,6 +1126,7 @@ packet_set_ipv6_addr(struct dp_packet *packet, uint8_t proto, packet_update_csum128(packet, proto, addr, new_addr); } memcpy(addr, new_addr, sizeof(ovs_be32[4])); + pkt_metadata_init_conn(&packet->md); } static void @@ -1223,6 +1228,7 @@ packet_set_tcp_port(struct dp_packet *packet, ovs_be16 src, ovs_be16 dst) packet_set_port(&th->tcp_src, src, &th->tcp_csum); packet_set_port(&th->tcp_dst, dst, &th->tcp_csum); + pkt_metadata_init_conn(&packet->md); } /* Sets the UDP source and destination port ('src' and 'dst' respectively) of @@ -1244,6 +1250,7 @@ packet_set_udp_port(struct dp_packet *packet, ovs_be16 src, ovs_be16 dst) uh->udp_src = src; uh->udp_dst = dst; } + pkt_metadata_init_conn(&packet->md); } /* Sets the SCTP source and destination port ('src' and 'dst' respectively) of @@ -1265,6 +1272,7 @@ packet_set_sctp_port(struct dp_packet *packet, ovs_be16 src, ovs_be16 dst) new_csum = crc32c((void *)sh, tp_len); put_16aligned_be32(&sh->sctp_csum, old_csum ^ old_correct_csum ^ new_csum); + pkt_metadata_init_conn(&packet->md); } /* Sets the ICMP type and code of the ICMP header contained in 'packet'. @@ -1283,6 +1291,7 @@ packet_set_icmp(struct dp_packet *packet, uint8_t type, uint8_t code) ih->icmp_csum = recalc_csum16(ih->icmp_csum, orig_tc, new_tc); } + pkt_metadata_init_conn(&packet->md); } /* Sets the IGMP type to IGMP_HOST_MEMBERSHIP_QUERY and populates the |