summaryrefslogtreecommitdiff
path: root/lib/packets.c
diff options
context:
space:
mode:
authorDarrell Ball <dlu998@gmail.com>2019-08-26 09:05:44 -0700
committerBen Pfaff <blp@ovn.org>2019-09-25 08:58:11 -0700
commit594570ea1cdecc7ef7880d707cbc7a4a4ecef09f (patch)
tree702eec3e00d443f043f62f5723514b7602b10fe0 /lib/packets.c
parentba5ca284098fdf92ca851405c8fab2ef1a4fac39 (diff)
downloadopenvswitch-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.c9
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