Re: Problems with peeled-off sockets

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Feb 28, 2020 at 10:31 PM Xin Long <lucien.xin@xxxxxxxxx> wrote:
>
> On Fri, Feb 28, 2020 at 9:57 PM Leppanen, Jere (Nokia - FI/Espoo)
> <jere.leppanen@xxxxxxxxx> wrote:
> >
> > On Thu, 27 Feb 2020, Xin Long wrote:
> >
> > > On Tue, Feb 25, 2020 at 3:28 AM Leppanen, Jere (Nokia - FI/Espoo)
> > > <jere.leppanen@xxxxxxxxx> wrote:
> > >>
> > >> On Sat, 22 Feb 2020, Xin Long wrote:
> > >>
> > >>> On Thu, Feb 20, 2020 at 5:18 PM Leppanen, Jere (Nokia - FI/Espoo)
> > >>> <jere.leppanen@xxxxxxxxx> wrote:
> > >>>>
> > >>>> Hello All,
> > >>>>
> > >>>> According to the RFC, a peeled-off socket is a one-to-one socket. But
> > >>>> in lksctp a peeled-off socket it not TCP style, it's UDP_HIGH_BANDWIDTH
> > >>>> style. Because of this, shutdown() doesn't work, linger probably
> > >>>> doesn't work, and so on.
> > >>>>
> > >>>> For example, in sctp_shutdown():
> > >>>>
> > >>>> static void sctp_shutdown(struct sock *sk, int how)
> > >>>> {
> > >>>>         struct net *net = sock_net(sk);
> > >>>>         struct sctp_endpoint *ep;
> > >>>>
> > >>>>         if (!sctp_style(sk, TCP))
> > >>>>                 return;
> > >>>>
> > >>>> Here we just bail out, because a peeled-off socket is not TCP style.
> > >>>>
> > >>>> Is this just a bug, or am I missing something? Asking mostly out of
> > >>>> personal curiosity.
> > >>> I would say, it's because .shutdown is tcp_prot thing and udp_prot doesn't
> > >>> have. sctp doesn't have to implement it for UDP style socket. But for TCP-
> > >>> style socket, sctp is trying to be compatible with TCP protocol user API.
> > >>> But even though,  sctp's .shutdown is still not fully compatible with TCP
> > >>> protocol due to sctp's 3-way shakehands for finishing a connection.
> > >>
> > >> Thanks a bunch for replying, Xin Long. I'm not quite sure what you mean.
> > >> The actual association shutdown doesn't even come into play here, since
> > >> shutdown() doesn't do anything with peeled-off sockets.
> > > Hi,  Leppanen,
> > > sorry for late.
> > >
> > > SCTP has two types of sockets: UDP and TCP styles.
> > > TCP style associations are not allowed to be peeled off.
> > > only UDP style associations can be peeled off.
> > >
> > > Then shutdown can only work for TCP style, this explains
> > > why peeled-off sk can use shutdown.
> > >
> > >
> > >>
> > >> If you mean that the current implementation of shutdown() might have
> > >> some problems with peeled-off sockets; well, that's true, but I suppose
> > >> that means that there's something to fix somewhere.
> > > I think it returns for peeled-off sockets (UDP style sockets) on purpose.
> > > it's like why you want to use shutdown on a UDP socket?
> > >
> > >>
> > >> It looks like the reason for the peculiar socket style of peeled-off
> > >> sockets is that they're created by copying from a one-to-many socket and
> > >> modified a little to resemble a one-to-one socket. But this leads to
> > >> problems in several places in the code. Is this just implementation that
> > >> was never finalized?
> > > Right, peeled-off will allow users to use a new sk to control that asoc.
> > > but again, it's a feature UDP style socket.
> > > any other problems have you seen?
> >
> > To clarify, by "peeled-off socket" I mean a socket returned by
> > sctp_peeloff(). sctp_peeloff() takes as an argument a
> > one-to-many socket, and returns a one-to-one socket.
> >
> > The RFC (https://tools.ietf.org/html/rfc6458#section-9.2)
> > clearly states about the socket returned by sctp_peeloff() that
> > "[...] the new socket is a one-to-one style socket."
> OK, I got you now.
> Linux creates a TCP/one-to-many style socket there actually.
sorry, UDP/one-to-many style.
> Interesting, BSD seems to do the same.
> I will double check and make a patch for this once confirmed.
>
> Thanks.



[Index of Archives]     [Linux Networking Development]     [Linux OMAP]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux