From: Andrew Morton <akpm@osdl•org>
To: netdev@vger•kernel.org, yujiang.wang@sun•com
Cc: bugme-daemon@bugzilla•kernel.org
Subject: Re: [Bugme-new] [Bug 6646] New: UDP socket doesn't return to bound state after association is dissolved by connect(..AF_UNSPEC)
Date: Mon, 5 Jun 2006 00:07:51 -0700 [thread overview]
Message-ID: <20060605000751.f3bc7ed3.akpm@osdl.org> (raw)
In-Reply-To: <200606050658.k556wJ8X032608@fire-2.osdl.org>
On Sun, 4 Jun 2006 23:58:19 -0700
bugme-daemon@bugzilla•kernel.org wrote:
> http://bugzilla.kernel.org/show_bug.cgi?id=6646
>
> Summary: UDP socket doesn't return to bound state after
> association is dissolved by connect(..AF_UNSPEC)
> Kernel Version: 2.6.12
> Status: NEW
> Severity: high
> Owner: shemminger@osdl•org
> Submitter: yujiang.wang@sun•com
>
>
> Most recent kernel where this bug did not occur:
> Distribution:
> Hardware Environment:
> Software Environment:
> Problem Description:
> When disconnect a UDP socket, Linux kernel set local port to zero if the port
> number comes from a implicit bind. Linux connect(2) man page reads:
> "Generally, connection-based protocol sockets may successfully *connect* only
> once; connectionless protocol sockets may use *connect* multiple times to change
> their association. Connectionless sockets may dissolve the association by
> connecting to an address with the /sa_family/ member of *sockaddr* set to
> *AF_UNSPEC*."
> But dissolve the association should not impact the local binding, while
> currently it does. In contrast, Unix variants like Solaris don't alter local
> binding when disconnecting a UDP socket.
>
> Steps to reproduce:
> Compile attached c file, and run it. You'll see local port number changed after
> a UDP socket disconnected.
>
> #include <errno.h>
> #include <string.h>
> #include <sys/types.h>
> #include <sys/socket.h>
> #include <netinet/in.h>
> #include <net/if.h>
> #include <netdb.h>
> #include <arpa/inet.h>
> #include <stdio.h>
> #include <stdlib.h>
>
> #define SERV_PORT 12345
>
> void print_local_addr(int s);
>
> int main(int argc, char** argv)
> {
> int sockfd;
> struct sockaddr_in servaddr, cliaddr;
>
> if (argc != 2) {
> printf("Usage: disconnect_udp <ipaddress>");
> exit(0);
> }
>
> // creat a UDP socket which binds to a local address
> sockfd = socket(AF_INET, SOCK_DGRAM, 0);
> bzero(&cliaddr, sizeof(cliaddr));
> cliaddr.sin_family = AF_INET;
> if (inet_pton(AF_INET, argv[1], &cliaddr.sin_addr) != 1) {
> perror("inet_pton failed");
> }
> bind(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
>
> // connect this UDP socket
> bzero(&servaddr, sizeof(servaddr));
> servaddr.sin_family = AF_INET;
> servaddr.sin_port = htons(SERV_PORT);
> if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) != 1) {
> perror("inet_pton failed");
> }
> if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) {
> perror("connect failed");
> }
> print_local_addr(sockfd);
>
> // disconnect it
> servaddr.sin_family = AF_UNSPEC;
> if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) {
> perror("connect failed");
> }
> print_local_addr(sockfd);
>
> close(sockfd);
> }
>
> void print_local_addr(int s)
> {
> struct sockaddr_in localaddr;
> socklen_t len = 0;
> char temp[INET_ADDRSTRLEN];
>
> len = sizeof(localaddr);
> if (getsockname(s, (struct sockaddr *)&localaddr, &len) != 0) {
> perror("getsockname failed");
> }
>
> inet_ntop(AF_INET, &localaddr.sin_addr, temp, INET_ADDRSTRLEN);
> printf("Local binding: address=%s, port=%d\n",
> temp, ntohs(localaddr.sin_port));
> }
>
> ------- You are receiving this mail because: -------
> You are on the CC list for the bug, or are watching someone who is.
next parent reply other threads:[~2006-06-05 7:07 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <200606050658.k556wJ8X032608@fire-2.osdl.org>
2006-06-05 7:07 ` Andrew Morton [this message]
2006-06-11 1:10 ` [Bugme-new] [Bug 6646] New: UDP socket doesn't return to bound state after association is dissolved by connect(..AF_UNSPEC) David Miller
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=20060605000751.f3bc7ed3.akpm@osdl.org \
--to=akpm@osdl$(echo .)org \
--cc=bugme-daemon@bugzilla$(echo .)kernel.org \
--cc=netdev@vger$(echo .)kernel.org \
--cc=yujiang.wang@sun$(echo .)com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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