From: Eric Dumazet <eric.dumazet@gmail.com>
To: David Miller <davem@davemloft.net>
Cc: brian.haley@hp.com, ole@ans.pl, netdev@vger.kernel.org
Subject: Re: [PATCH] inet: dont set inet_rcv_saddr in connect()
Date: Wed, 08 Sep 2010 06:42:45 +0200 [thread overview]
Message-ID: <1283920965.2634.723.camel@edumazet-laptop> (raw)
In-Reply-To: <20100907.203410.245386536.davem@davemloft.net>
Le mardi 07 septembre 2010 à 20:34 -0700, David Miller a écrit :
> From: Brian Haley <brian.haley@hp.com>
> Date: Tue, 07 Sep 2010 22:34:59 -0400
>
> > Is this really the right thing to do? Linux has been doing this forever,
> > right? Just like BSD has done it forever.
>
> Indeed, I checked for this in Stevens volume 2 when I reviewed
> Eric's patch, the logic is identical.
>
> > The way I've always "cleared" a local address is to set the address
> > family to AF_UNSPEC on the next connect() call, as mentioned on the
> > man page. I just want to make sure we're not changing something
> > just to work around a broken application, sendto()/sendmsg() work
> > perfect in this case by not setting the local address.
> >
Problem is AF_UNSPEC always clears the remote address (as stated in
manual), and sometimes local one (as not stated)
if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK))
inet_reset_saddr(sk);
This is the workaround that was coded years ago in Linux to undo the
local addr setting ;)
Following program produces this output :
local addr=0x7f000001 sin_port=37877
after connect(AF_UNSPEC) local addr=0x0 sin_port=0
local addr=0x7f000001 sin_port=37877
after connect(AF_UNSPEC) local addr=0x7f000001 sin_port=0
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int fd;
struct sockaddr_in target, me;
socklen_t len;
if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
perror("socket");
return 1;
}
memset(&target, 0, sizeof(target));
target.sin_family = AF_INET;
target.sin_port = 123;
target.sin_addr.s_addr = htonl(0x7f000001);
if (connect(fd, (const struct sockaddr *)&target, sizeof(target)) == -1) {
perror("connect");
close(fd);
return 2;
}
len = sizeof(me);
if (getsockname(fd, (struct sockaddr *)&me, &len)== -1) {
perror("getsockname");
close(fd);
return 3;
}
printf("local addr=0x%x sin_port=%u\n",
ntohl(me.sin_addr.s_addr), ntohs(me.sin_port));
memset(&target, 0, sizeof(target));
target.sin_family = AF_UNSPEC;
if (connect(fd, (const struct sockaddr *)&target, sizeof(target)) == -1) {
perror("connect AF_UNSPEC");
close(fd);
return 4;
}
len = sizeof(me);
if (getsockname(fd, (struct sockaddr *)&me, &len)== -1) {
perror("getsockname 2");
close(fd);
return 3;
}
printf("after connect(AF_UNSPEC) local addr=0x%x sin_port=%u\n",
ntohl(me.sin_addr.s_addr), ntohs(me.sin_port));
memset(&target, 0, sizeof(target));
target.sin_family = AF_INET;
target.sin_addr.s_addr = htonl(0x7f000001);
if (bind(fd, (const struct sockaddr *)&target, sizeof(target)) == -1) {
perror("bind");
close(fd);
return 2;
}
len = sizeof(me);
if (getsockname(fd, (struct sockaddr *)&me, &len)== -1) {
perror("getsockname");
close(fd);
return 3;
}
printf("local addr=0x%x sin_port=%u\n",
ntohl(me.sin_addr.s_addr), ntohs(me.sin_port));
memset(&target, 0, sizeof(target));
target.sin_family = AF_UNSPEC;
if (connect(fd, (const struct sockaddr *)&target, sizeof(target)) == -1) {
perror("connect AF_UNSPEC");
close(fd);
return 4;
}
len = sizeof(me);
if (getsockname(fd, (struct sockaddr *)&me, &len)== -1) {
perror("getsockname 2");
close(fd);
return 3;
}
printf("after connect(AF_UNSPEC) local addr=0x%x sin_port=%u\n",
ntohl(me.sin_addr.s_addr), ntohs(me.sin_port));
return 0;
}
next prev parent reply other threads:[~2010-09-08 4:42 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-06 17:11 2.6.34: Problem with UDP traffic on lo + poll(?) Krzysztof Oledzki
2010-09-06 19:42 ` Eric Dumazet
2010-09-06 19:55 ` Krzysztof Olędzki
2010-09-06 20:29 ` Eric Dumazet
2010-09-06 20:44 ` Krzysztof Olędzki
2010-09-06 20:48 ` Krzysztof Olędzki
2010-09-07 15:37 ` Krzysztof Olędzki
2010-09-07 16:36 ` Eric Dumazet
2010-09-07 19:20 ` Krzysztof Olędzki
2010-09-07 19:26 ` Eric Dumazet
2010-09-07 19:59 ` David Miller
2010-09-07 21:35 ` [PATCH] inet: dont set inet_rcv_saddr in connect() Eric Dumazet
2010-09-07 21:52 ` Krzysztof Olędzki
2010-09-08 2:16 ` David Miller
2010-09-08 4:13 ` Eric Dumazet
2010-09-08 2:34 ` Brian Haley
2010-09-08 3:34 ` David Miller
2010-09-08 4:42 ` Eric Dumazet [this message]
2010-09-08 5:51 ` David Miller
2010-09-08 4:57 ` Eric Dumazet
2010-09-08 5:36 ` David Miller
2010-09-08 5:52 ` Eric Dumazet
2010-09-08 10:10 ` [PATCH] udp: add rehash on connect() Eric Dumazet
2010-09-08 15:06 ` Krzysztof Olędzki
2010-09-08 15:17 ` Eric Dumazet
2010-09-08 15:29 ` Krzysztof Olędzki
2010-09-08 15:08 ` [PATCH v2] " Eric Dumazet
2010-09-08 16:52 ` Krzysztof Olędzki
2010-09-09 4:39 ` David Miller
2010-09-08 14:27 ` [PATCH] inet: dont set inet_rcv_saddr in connect() Eric Dumazet
2010-09-07 21:28 ` 2.6.34: Problem with UDP traffic on lo + poll(?) Krzysztof Olędzki
2010-09-07 21:39 ` Eric Dumazet
2010-09-07 21:51 ` Krzysztof Olędzki
2010-09-08 4:12 ` Eric Dumazet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1283920965.2634.723.camel@edumazet-laptop \
--to=eric.dumazet@gmail.com \
--cc=brian.haley@hp.com \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
--cc=ole@ans.pl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox