Removal of deprecated implied connect for TCP
Andre Oppermann
andre at freebsd.org
Tue Aug 31 13:25:16 UTC 2010
On 31.08.2010 15:01, Michael Tüxen wrote:
> On Aug 31, 2010, at 12:04 PM, Robert Watson wrote:
>> On Sun, 29 Aug 2010, Andre Oppermann wrote:
>>> When T/TCP RFC1644 support was introduced in r6283 by wollman 15 years ago the semantics of
>>> sendto(2) with regard to TCP sockets were changed.
>>>
>>> It became possible directly do a sendto(2) call with the target address in the *to argument
>>> instead of doing a connect(2) first and subsequent write(2) or send(2) calls as the standard
>>> TCP API specifies. Optionally MSG_EOR could be specified to close the connection again right
>>> again after the data has been sent out.
>>>
>>> This is totally non-portable and no other OS (Linux, NetBSD, OpenBSD, Solaris, HP-UX) ever
>>> supported this functionality for TCP sockets. FreeBSD was the only OS to ever ship this.
>>>
>>> T/TCP was ill-defined and had major security issues and never gained any support. It has been
>>> defunct in FreeBSD and most code has been removed about 6 years ago. The sendto(2) extended
>>> functionality is one of the last parts that persisted and remained around living a zombie
>>> life.
>>>
>>> I want to remove it now because it is totally non-portable, has no known users and
>>> complicates the TCP send path. The patch is attached.
>>>
>>> If you have any objections speak up now.
>>
>> I'm not entirely comfortable with this change, and would like a chance to cogitate on it a bit
>> more. While I'm not aware of any applications depending on the semantic for TCP, I know that
>> we do use it for UNIX domain sockets. Since it's a documented API, if we are going to remove
>> it, then we need to go through a deprecation process, not least by marking it as a deprecated
>> API in 8.x before having it vanish in 9.0.
>
> sendto() is also used for SCTP SOCK_STREAMS and SOCK_SEQPACKET sockets...
sendto() will not be touched or modified. It's just that on a TCP socket
the tcp protocol will not perform an implied connect anymore. The only thing
that changes is TCP dropping a deprecated and experimental extension and
behaving like every other UNIXy OS.
sendto() will continue to work for UDP, SCTP and Domain sockets and whoever
else currently supports it, except TCP.
--
Andre
More information about the freebsd-net
mailing list