diff options
author | Jielong Zhou <jielong.zjl@antfin.com> | 2019-07-02 20:53:44 +0800 |
---|---|---|
committer | Konstantin Ananyev <konstantin.ananyev@intel.com> | 2019-08-13 13:27:56 +0100 |
commit | e4380f4866091fd92a7a57667dd938a99144f9cd (patch) | |
tree | 817010bea3e2cae296298d049b5224598e81c856 /lib/libtle_l4p/tcp_rxtx.c | |
parent | 17f6b7ad23f52784f0a6897480d7a6050806aa65 (diff) |
l4p/tcp: fix removing overlapped data
rte_pktmbuf_adj and rte_pktmbuf_trim don't support removing data more than
one segment. We reimplemented these funtions to support removing multiple
segments.
Change-Id: I3e2d48310595ecae0acef0674ea2c78fa1068c5b
Signed-off-by: Jielong Zhou <jielong.zjl@antfin.com>
Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Diffstat (limited to 'lib/libtle_l4p/tcp_rxtx.c')
-rw-r--r-- | lib/libtle_l4p/tcp_rxtx.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/lib/libtle_l4p/tcp_rxtx.c b/lib/libtle_l4p/tcp_rxtx.c index d1d2a16..a519645 100644 --- a/lib/libtle_l4p/tcp_rxtx.c +++ b/lib/libtle_l4p/tcp_rxtx.c @@ -973,7 +973,7 @@ rx_ack_listen(struct tle_tcp_stream *s, struct stbl *st, } static inline int -data_pkt_adjust(const struct tcb *tcb, struct rte_mbuf *mb, uint32_t hlen, +data_pkt_adjust(const struct tcb *tcb, struct rte_mbuf **mb, uint32_t hlen, uint32_t *seqn, uint32_t *plen) { uint32_t len, n, seq; @@ -981,7 +981,7 @@ data_pkt_adjust(const struct tcb *tcb, struct rte_mbuf *mb, uint32_t hlen, seq = *seqn; len = *plen; - rte_pktmbuf_adj(mb, hlen); + rte_pktmbuf_adj(*mb, hlen); if (len == 0) return -ENODATA; /* cut off the start of the packet */ @@ -990,7 +990,7 @@ data_pkt_adjust(const struct tcb *tcb, struct rte_mbuf *mb, uint32_t hlen, if (n >= len) return -ENODATA; - rte_pktmbuf_adj(mb, n); + *mb = _rte_pktmbuf_adj(*mb, n); *seqn = seq + n; *plen = len - n; } @@ -1097,7 +1097,7 @@ rx_fin(struct tle_tcp_stream *s, uint32_t state, if (plen != 0) { - ret = data_pkt_adjust(&s->tcb, mb, hlen, &seq, &plen); + ret = data_pkt_adjust(&s->tcb, &mb, hlen, &seq, &plen); if (ret != 0) return ret; if (rx_data_enqueue(s, seq, plen, &mb, 1) != 1) @@ -1303,7 +1303,7 @@ rx_data_ack(struct tle_tcp_stream *s, struct dack_info *tack, if (ret == 0) { /* skip duplicate data, if any */ - ret = data_pkt_adjust(&s->tcb, mb[i], hlen, + ret = data_pkt_adjust(&s->tcb, &mb[i], hlen, &seq, &plen); } |