Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Nov 2004 23:09:36 +0300
From:      Gleb Smirnoff <glebius@freebsd.org>
To:        Archie Cobbs <archie@dellroad.org>
Cc:        net@freebsd.org
Subject:   Re: divert(4) socket isn't connection oriented
Message-ID:  <20041115200936.GB96804@cell.sick.ru>
In-Reply-To: <200411151417.iAFEHfhN015171@arch20m.dellroad.org>
References:  <20041115104331.GA93477@cell.sick.ru> <200411151417.iAFEHfhN015171@arch20m.dellroad.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Nov 15, 2004 at 08:17:41AM -0600, Archie Cobbs wrote:
A> > Since it is working, it was not noticed quickly. Real problems occur when
A> > a multicast packet comes on interface: it is diverted to ng_ksocket, returned
A> > and div_output() sends it to ip_output(). In ip_output() it is ip_mloopback()ed
A> > and if_simloop()ed. A copy of packet enters divert socket, duplicated... a
A> > forever loop and total freeze.
A> 
A> Your fix makes sense, but is it more of a workaround than a proper fix?

I don't think so.

Is divert(4) connection oriented? No, therefore so->so_state & SS_ISCONNECTED
must be zero; therefore it shouldn't have pru_disconnect method.
Does divert(4) has listen queue? No, therefore it shouldn't have pru_abort
method.

A> It seems like the real bug is that divert is promising to write the packet
A> as "outgoing" yet the packet loops back as "incoming". Maybe it would make
A> more sense to attach a tag to the packet that divert would recognize and
A> know to ignore the extra incoming packet.

This would be a workaround. divert(4) protocol uses sockaddr for this purpose,
because m_tags do not pass thru userland. And ng_ksocket should emulate
userland socket perfectly, otherwise it has no sense. It must understand
sockaddr.

A> Also, does the same thing happen with broadcast packets?

No.

So, the real change suggested is to remove SS_ISCONNECTED from so->so_state. All
other changes are its logical consequences.
What was idea of that SS_ISCONNECTED flag always set? I can't find any problems we
can get by removing this code.

-- 
Totus tuus, Glebius.
GLEBIUS-RIPN GLEB-RIPE



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20041115200936.GB96804>