On Wed, Jun 30, 2021 at 10:33 AM Jon Maloy <jma...@redhat.com> wrote: > > > On 29/06/2021 17:41, Xin Long wrote: > > On Tue, Jun 29, 2021 at 3:57 PM Jon Maloy <jma...@redhat.com> wrote: > >> > [...] > > Yes, Jon, I mean the opposite. > > > > when MSG_EOR is set, we will go with what this patch does, > > but to delete MSG_EOR if this is not the last part of the data, > > and keep MSG_EOR if this is the last part of the data. > > > > when MSG_EOR is not set, the msg will be truncated as before. > > Yes, that would be a safe behavior. Is SCTP doing this? No, SCTP doesn't need to, as it doesn't truncate msg since the beginning. That's why no compatibility issue was caused.
> > ///jon > > > > >> In the first case, we don't solve any compatibility issue, if that is > >> the purpose. The programmer still has to add code to get the current > >> behavior. > >> > >> In the latter case we would be on the 100% safe side, although I have a > >> real hard time to see that this could be a real issue. Why would anybody > >> deliberately design an application for having messages truncated. > >> > >> ///jon > >> > >> > >>>> to indicate we don't want the truncating msg. > >>>> > >>>> When the msg flag returns with no MSG_EOR, it means there's more data to > >>>> read. > >>>> > >>>> Thanks. > >>>>> - Erin > >>>>> > >>>>>> Signed-off-by: Xin Long <lucien....@gmail.com> > >>>>>> --- > >>>>>> net/tipc/socket.c | 30 +++++++++++++++++++++--------- > >>>>>> 1 file changed, 21 insertions(+), 9 deletions(-) > >>>>>> > >>>>>> diff --git a/net/tipc/socket.c b/net/tipc/socket.c > >>>>>> index 34a97ea36cc8..504e59838b8b 100644 > >>>>>> --- a/net/tipc/socket.c > >>>>>> +++ b/net/tipc/socket.c > >>>>>> @@ -1880,6 +1880,7 @@ static int tipc_recvmsg(struct socket *sock, > >>>>>> struct msghdr *m, > >>>>>> bool connected = !tipc_sk_type_connectionless(sk); > >>>>>> struct tipc_sock *tsk = tipc_sk(sk); > >>>>>> int rc, err, hlen, dlen, copy; > >>>>>> + struct tipc_skb_cb *skb_cb; > >>>>>> struct sk_buff_head xmitq; > >>>>>> struct tipc_msg *hdr; > >>>>>> struct sk_buff *skb; > >>>>>> @@ -1903,6 +1904,7 @@ static int tipc_recvmsg(struct socket *sock, > >>>>>> struct msghdr *m, > >>>>>> if (unlikely(rc)) > >>>>>> goto exit; > >>>>>> skb = skb_peek(&sk->sk_receive_queue); > >>>>>> + skb_cb = TIPC_SKB_CB(skb); > >>>>>> hdr = buf_msg(skb); > >>>>>> dlen = msg_data_sz(hdr); > >>>>>> hlen = msg_hdr_sz(hdr); > >>>>>> @@ -1922,18 +1924,27 @@ static int tipc_recvmsg(struct socket *sock, > >>>>>> struct msghdr *m, > >>>>>> > >>>>>> /* Capture data if non-error msg, otherwise just set return > >>>>>> value */ > >>>>>> if (likely(!err)) { > >>>>>> - copy = min_t(int, dlen, buflen); > >>>>>> - if (unlikely(copy != dlen)) > >>>>>> - m->msg_flags |= MSG_TRUNC; > >>>>>> - rc = skb_copy_datagram_msg(skb, hlen, m, copy); > >>>>>> + int offset = skb_cb->bytes_read; > >>>>>> + > >>>>>> + copy = min_t(int, dlen - offset, buflen); > >>>>>> + rc = skb_copy_datagram_msg(skb, hlen + offset, m, copy); > >>>>>> + if (unlikely(rc)) > >>>>>> + goto exit; > >>>>>> + if (unlikely(offset + copy < dlen)) { > >>>>>> + if (!(flags & MSG_PEEK)) > >>>>>> + skb_cb->bytes_read = offset + copy; > >>>>>> + } else { > >>>>>> + m->msg_flags |= MSG_EOR; > >>>>>> + skb_cb->bytes_read = 0; > >>>>>> + } > >>>>>> } else { > >>>>>> copy = 0; > >>>>>> rc = 0; > >>>>>> - if (err != TIPC_CONN_SHUTDOWN && connected && > >>>>>> !m->msg_control) > >>>>>> + if (err != TIPC_CONN_SHUTDOWN && connected && > >>>>>> !m->msg_control) { > >>>>>> rc = -ECONNRESET; > >>>>>> + goto exit; > >>>>>> + } > >>>>>> } > >>>>>> - if (unlikely(rc)) > >>>>>> - goto exit; > >>>>>> > >>>>>> /* Mark message as group event if applicable */ > >>>>>> if (unlikely(grp_evt)) { > >>>>>> @@ -1956,9 +1967,10 @@ static int tipc_recvmsg(struct socket *sock, > >>>>>> struct msghdr *m, > >>>>>> tipc_node_distr_xmit(sock_net(sk), &xmitq); > >>>>>> } > >>>>>> > >>>>>> - tsk_advance_rx_queue(sk); > >>>>>> + if (!skb_cb->bytes_read) > >>>>>> + tsk_advance_rx_queue(sk); > >>>>>> > >>>>>> - if (likely(!connected)) > >>>>>> + if (likely(!connected) || skb_cb->bytes_read) > >>>>>> goto exit; > >>>>>> > >>>>>> /* Send connection flow control advertisement when applicable > >>>>>> */ > >>>>>> -- > >>>>>> 2.27.0 > >>>>>> > >>>>>> > >>>>>> > >>>>>> _______________________________________________ > >>>>>> tipc-discussion mailing list > >>>>>> tipc-discussion@lists.sourceforge.net > >>>>>> https://lists.sourceforge.net/lists/listinfo/tipc-discussion > >>> _______________________________________________ > >>> tipc-discussion mailing list > >>> tipc-discussion@lists.sourceforge.net > >>> https://lists.sourceforge.net/lists/listinfo/tipc-discussion > >>> > _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion