[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20200311055343.GE8012@unicorn.suse.cz>
Date: Wed, 11 Mar 2020 06:53:43 +0100
From: Michal Kubecek <mkubecek@...e.cz>
To: netdev@...r.kernel.org
Cc: Andrej Ras <kermitthekoder@...il.com>
Subject: Re: What does this code do
On Tue, Mar 10, 2020 at 09:11:06PM -0700, Andrej Ras wrote:
> On Tue, Mar 10, 2020 at 3:12 PM Michal Kubecek <mkubecek@...e.cz> wrote:
> >
> > On Tue, Mar 10, 2020 at 02:42:11PM -0700, Andrej Ras wrote:
> > > While browsing the Linux networking code I came across these two lines
> > > in __ip_append_data() which I do not understand.
> > >
> > > /* Check if the remaining data fits into current packet. */
> > > copy = mtu - skb->len;
> > > if (copy < length)
> > > copy = maxfraglen - skb->len;
> > > if (copy <= 0) {
> > >
> > > Why not just use maxfraglen.
> > >
> > > Perhaps someone can explain why this is needed.
> >
> > This function appends more data to an skb which can already contain some
> > payload. Therefore you need to take current length (from earlier) into
> > account, not only newly appended data.
> >
> > This can be easily enforced e.g. with TCP_CORK or UDP_CORK socket option
> > or MSG_MORE flag.
> >
> I understand that the code is appending data, what I do not understand
> is why is it first calculating the remaining space by taking the
> difference using the size of mtu and if the difference is <= 0 it
> recalculates the difference using maxfraglen. Why not just use
> maxfraglen -- All we need to know is how much more data can be added
> to the skb.
Ah, I see. The first test checks if we can fit into an unfragmented
packet so that we check against mtu. If we don't fit, fragmentation will
be needed so that maxfraglen is the limit (maxfraglen can be shorter
than mtu due to the rounding down to a multiple of 8).
Michal Kubecek
(Please do not top post in developer lists.)
Powered by blists - more mailing lists