From 243a0433ff05a37113d6890bbeb163bbea033687 Mon Sep 17 00:00:00 2001 From: Dou Chao Date: Tue, 29 Nov 2022 19:41:34 +0800 Subject: vcl: enable gso for 'sendmsg' in LDP mode. Some upon apps(e.g. Nginx-quic) package it's several protocol buffers into a struct msg which is a combination of gso_buffer and gso_size. but if HostStack regardless the gso_size to the buffer and split the buffer with default mss, that cause peer client failed on parsing the package. Type: improvement Signed-off-by: Dou Chao Change-Id: I805eb642be826038ba96d1b85dad8ec0c0f6c459 Signed-off-by: Dou Chao --- src/vcl/vppcom.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) (limited to 'src/vcl/vppcom.c') diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index 3538a36f508..57355967900 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -2227,8 +2227,8 @@ vcl_fifo_is_writeable (svm_fifo_t * f, u32 len, u8 is_dgram) } always_inline int -vppcom_session_write_inline (vcl_worker_t * wrk, vcl_session_t * s, void *buf, - size_t n, u8 is_flush, u8 is_dgram) +vppcom_session_write_inline (vcl_worker_t *wrk, vcl_session_t *s, void *buf, + size_t n, u16 gso_size, u8 is_flush, u8 is_dgram) { int n_write, is_nonblocking; session_evt_type_t et; @@ -2293,9 +2293,9 @@ vppcom_session_write_inline (vcl_worker_t * wrk, vcl_session_t * s, void *buf, et = SESSION_IO_EVT_TX_FLUSH; if (is_dgram) - n_write = app_send_dgram_raw (tx_fifo, &s->transport, - s->vpp_evt_q, buf, n, et, - 0 /* do_evt */ , SVM_Q_WAIT); + n_write = + app_send_dgram_raw_gso (tx_fifo, &s->transport, s->vpp_evt_q, buf, n, + gso_size, et, 0 /* do_evt */, SVM_Q_WAIT); else n_write = app_send_stream_raw (tx_fifo, s->vpp_evt_q, buf, n, et, 0 /* do_evt */ , SVM_Q_WAIT); @@ -2324,8 +2324,8 @@ vppcom_session_write (uint32_t session_handle, void *buf, size_t n) if (PREDICT_FALSE (!s)) return VPPCOM_EBADFD; - return vppcom_session_write_inline (wrk, s, buf, n, - 0 /* is_flush */ , s->is_dgram ? 1 : 0); + return vppcom_session_write_inline (wrk, s, buf, n, 0, 0 /* is_flush */, + s->is_dgram ? 1 : 0); } int @@ -2338,8 +2338,8 @@ vppcom_session_write_msg (uint32_t session_handle, void *buf, size_t n) if (PREDICT_FALSE (!s)) return VPPCOM_EBADFD; - return vppcom_session_write_inline (wrk, s, buf, n, - 1 /* is_flush */ , s->is_dgram ? 1 : 0); + return vppcom_session_write_inline (wrk, s, buf, n, 0, 1 /* is_flush */, + s->is_dgram ? 1 : 0); } #define vcl_fifo_rx_evt_valid_or_break(_s) \ @@ -4008,7 +4008,6 @@ vppcom_session_attr (uint32_t session_handle, uint32_t op, VDBG (2, "VPPCOM_ATTR_GET_TCP_USER_MSS: %d, buflen %d", *(int *) buffer, *buflen); break; - case VPPCOM_ATTR_SET_TCP_USER_MSS: if (!(buffer && buflen && (*buflen == sizeof (u32)))) { @@ -4151,6 +4150,7 @@ vppcom_session_sendto (uint32_t session_handle, void *buffer, { vcl_worker_t *wrk = vcl_worker_get_current (); vcl_session_t *s; + u16 gso_size = 0; s = vcl_session_get_w_handle (wrk, session_handle); if (PREDICT_FALSE (!s)) @@ -4165,6 +4165,12 @@ vppcom_session_sendto (uint32_t session_handle, void *buffer, s->transport.rmt_port = ep->port; vcl_ip_copy_from_ep (&s->transport.rmt_ip, ep); + vppcom_endpt_tlv_t *p_app_data = &ep->app_data; + + if (p_app_data && (p_app_data->data_type == VCL_UDP_SEGMENT)) + { + gso_size = p_app_data->value; + } /* Session not connected/bound in vpp. Create it by 'connecting' it */ if (PREDICT_FALSE (s->session_state == VCL_STATE_CLOSED)) { @@ -4188,7 +4194,7 @@ vppcom_session_sendto (uint32_t session_handle, void *buffer, VDBG (2, "handling flags 0x%u (%d) not implemented yet.", flags, flags); } - return (vppcom_session_write_inline (wrk, s, buffer, buflen, 1, + return (vppcom_session_write_inline (wrk, s, buffer, buflen, gso_size, 1, s->is_dgram ? 1 : 0)); } -- cgit 1.2.3-korg