The calculation in tcp_reader_run() failed to account for L2 padding.
This fixes the problem, by moving the existing function
tcp_payload_length() from a conntrack private header file into
dp-packet.h and renaming it to suit the dp_packet style.

Signed-off-by: Ben Pfaff <[email protected]>
---
 lib/conntrack-private.h | 12 ------------
 lib/conntrack-tcp.c     |  4 ++--
 lib/conntrack.c         |  2 +-
 lib/dp-packet.h         | 12 ++++++++++++
 lib/pcap-file.c         |  2 +-
 5 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/lib/conntrack-private.h b/lib/conntrack-private.h
index 3895bc6880d7..e8332bdba1ec 100644
--- a/lib/conntrack-private.h
+++ b/lib/conntrack-private.h
@@ -204,16 +204,4 @@ struct ct_l4_proto {
                                struct ct_dpif_protoinfo *);
 };
 
-static inline uint32_t
-tcp_payload_length(struct dp_packet *pkt)
-{
-    const char *tcp_payload = dp_packet_get_tcp_payload(pkt);
-    if (tcp_payload) {
-        return ((char *) dp_packet_tail(pkt) - dp_packet_l2_pad_size(pkt)
-                - tcp_payload);
-    } else {
-        return 0;
-    }
-}
-
 #endif /* conntrack-private.h */
diff --git a/lib/conntrack-tcp.c b/lib/conntrack-tcp.c
index 18a2aa7c7d02..8a7c98cc459e 100644
--- a/lib/conntrack-tcp.c
+++ b/lib/conntrack-tcp.c
@@ -175,7 +175,7 @@ tcp_conn_update(struct conntrack *ct, struct conn *conn_,
 
     uint16_t win = ntohs(tcp->tcp_winsz);
     uint32_t ack, end, seq, orig_seq;
-    uint32_t p_len = tcp_payload_length(pkt);
+    uint32_t p_len = dp_packet_get_tcp_payload_length(pkt);
 
     if (tcp_invalid_flags(tcp_flags)) {
         COVERAGE_INC(conntrack_invalid_tcp_flags);
@@ -450,7 +450,7 @@ tcp_new_conn(struct conntrack *ct, struct dp_packet *pkt, 
long long now,
     dst = &newconn->peer[1];
 
     src->seqlo = ntohl(get_16aligned_be32(&tcp->tcp_seq));
-    src->seqhi = src->seqlo + tcp_payload_length(pkt) + 1;
+    src->seqhi = src->seqlo + dp_packet_get_tcp_payload_length(pkt) + 1;
 
     if (tcp_flags & TCP_SYN) {
         src->seqhi++;
diff --git a/lib/conntrack.c b/lib/conntrack.c
index bba38f9f576d..423281a257a6 100644
--- a/lib/conntrack.c
+++ b/lib/conntrack.c
@@ -2899,7 +2899,7 @@ get_ftp_ctl_msg(struct dp_packet *pkt, char *ftp_msg)
 {
     struct tcp_header *th = dp_packet_l4(pkt);
     char *tcp_hdr = (char *) th;
-    uint32_t tcp_payload_len = tcp_payload_length(pkt);
+    uint32_t tcp_payload_len = dp_packet_get_tcp_payload_length(pkt);
     size_t tcp_payload_of_interest = MIN(tcp_payload_len,
                                          LARGEST_FTP_MSG_OF_INTEREST);
     size_t tcp_hdr_len = TCP_OFFSET(th->tcp_ctl) * 4;
diff --git a/lib/dp-packet.h b/lib/dp-packet.h
index 0430cca8ebbd..36c53360cde8 100644
--- a/lib/dp-packet.h
+++ b/lib/dp-packet.h
@@ -466,6 +466,18 @@ dp_packet_get_tcp_payload(const struct dp_packet *b)
     return NULL;
 }
 
+static inline uint32_t
+dp_packet_get_tcp_payload_length(const struct dp_packet *pkt)
+{
+    const char *tcp_payload = dp_packet_get_tcp_payload(pkt);
+    if (tcp_payload) {
+        return ((char *) dp_packet_tail(pkt) - dp_packet_l2_pad_size(pkt)
+                - tcp_payload);
+    } else {
+        return 0;
+    }
+}
+
 static inline const void *
 dp_packet_get_udp_payload(const struct dp_packet *b)
 {
diff --git a/lib/pcap-file.c b/lib/pcap-file.c
index f0cac8e0fa4d..b30a11c24b87 100644
--- a/lib/pcap-file.c
+++ b/lib/pcap-file.c
@@ -411,7 +411,7 @@ tcp_reader_run(struct tcp_reader *r, const struct flow 
*flow,
     }
     tcp = dp_packet_l4(packet);
     flags = TCP_FLAGS(tcp->tcp_ctl);
-    l7_length = (char *) dp_packet_tail(packet) - l7;
+    l7_length = dp_packet_get_tcp_payload_length(packet);
     seq = ntohl(get_16aligned_be32(&tcp->tcp_seq));
 
     /* Construct key. */
-- 
2.28.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to