[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
(usagi-users 02160) Bug?: bind(6);bind(4);listen(6) used to work
- To: usagi-users@xxxxxxxxxxxxxx
- Subject: (usagi-users 02160) Bug?: bind(6);bind(4);listen(6) used to work
- From: Lionel Elie Mamane <lionel@xxxxxxxxx>
- Date: Fri, 31 Jan 2003 13:55:58 +0100
- Mail-followup-to: Lionel Elie Mamane <lionel@xxxxxxxxx>, usagi-users@xxxxxxxxxxxxxx
- Reply-to: usagi-users@xxxxxxxxxxxxxx
- Sender: Lionel Elie Mamane <master@xxxxxxxxxxxxxx>
- User-agent: Mutt/1.4i
Hi,
This (pseudo-) code works with vanilla Linux, and other platforms:
- bind(IPv6 any address, port foo)
- bind(IPv4 any address, port foo)
- listen(IPv6 any address, port foo)
- listen(IPv4 any address, port foo)
ignore failure if errno=EADDRINUSE: the IPv6 socket listens
for IPv4 connections
In particular, that's what the exim MTA does by default (if no
explicit bind/listen instruction given in config file)
But with USAGI patch, the first listen fails, with errno=EADDRINUSE,
while _there_ is no one listening!
Looks like you expect programs to do:
- bind(IPv6 any address)
- listen(IPv6 any address)
- bind(IPv4 any address), failure because EADDRINUSE -> goto end
- listen(IPv4 any address)
- :end:
Anyway, failing at the first listen is IMHO a bad idea: Either fail at
the _second_ listen like vanilla Linux, or fail at the second bind.
So, where's the problem? Should exim change its way or is this an
USAGI glitch? It looks like the first case works for all other
platforms supported by exim!
If you think exim should change its way, could you please give me
arguments (RFC references, POSIX or Single Unix Specification
reference, ...) to convince the exim authors?
Details
=======
USAGI Snapshot 20/3/2003 on Linux 2.4.20 kernel
GNU libc: 2.3.1 (Debian GNU/Linux)
=============== begin Example program ==================
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(void)
{
struct sockaddr_in6 sin6;
struct sockaddr_in sin4;
int fd6, fd4;
int result;
int on = 1;
sin6.sin6_family = AF_INET6;
sin6.sin6_port = htons(9887);
sin6.sin6_addr = in6addr_any;
sin4.sin_family = AF_INET;
sin4.sin_port = htons(9887);
sin4.sin_addr.s_addr = INADDR_ANY;
fd6 = socket(AF_INET6,SOCK_STREAM,0);
if (fd6<0)
fprintf(stderr,"Socket failed because %s\n",strerror(errno));
else
fprintf(stderr,"Socket succeeded\n");
fd4 = socket(AF_INET,SOCK_STREAM,0);
if (fd4<0)
fprintf(stderr,"Socket failed because %s\n",strerror(errno));
else
fprintf(stderr,"Socket succeeded\n");
if (setsockopt(fd6, SOL_SOCKET, SO_REUSEADDR, (char *)(&on), sizeof(on)) < 0)
fprintf(stderr, "setting SO_REUSEADDR on socket failed: %s", strerror(errno));
if (setsockopt(fd4, SOL_SOCKET, SO_REUSEADDR, (char *)(&on), sizeof(on)) < 0)
fprintf(stderr, "setting SO_REUSEADDR on socket failed: %s", strerror(errno));
result = bind(fd6, &sin6, sizeof(sin6));
if (result)
fprintf(stderr,"Bind failed because %s\n",strerror(errno));
else
fprintf(stderr,"Bind succeeded\n");
result = bind(fd4, &sin4, sizeof(sin4));
if (result)
fprintf(stderr,"Bind failed because %s\n",strerror(errno));
else
fprintf(stderr,"Bind succeeded\n");
result = listen(fd6, 42);
if (result)
fprintf(stderr,"Listen failed because %s\n",strerror(errno));
else
fprintf(stderr,"Listen succeeded\n");
result = listen(fd4, 42);
if (result)
fprintf(stderr,"Listen failed because %s\n",strerror(errno));
else
fprintf(stderr,"Listen succeeded\n");
return 0;
}
================ end Example program ===================
============= begin kernel config ===============
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_NETLINK_DEV=m
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_FILTER=y
# CONFIG_NET_NEIGH_DEBUG is not set
CONFIG_NET_RESTRICTED_REUSE=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IPSEC=y
CONFIG_IPSEC_DEBUG=y
CONFIG_IPSEC_DEBUG_DISABLE_DEFAULT=y
# CONFIG_IPCOMP is not set
CONFIG_IPSEC_TUNNEL=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
# CONFIG_IP_PNP is not set
CONFIG_NET_IPIP=m
CONFIG_NET_IPGRE=m
CONFIG_NET_IPGRE_BROADCAST=y
# CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
CONFIG_INET_ECN=y
CONFIG_SYN_COOKIES=y
CONFIG_IP_IPSEC=y
CONFIG_IPV4_IPSEC_TUNNEL=y
#
# IP: Netfilter Configuration
#
CONFIG_IP_NF_CONNTRACK=m
CONFIG_IP_NF_FTP=m
CONFIG_IP_NF_IRC=m
CONFIG_IP_NF_QUEUE=y
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_LIMIT=m
CONFIG_IP_NF_MATCH_MAC=m
CONFIG_IP_NF_MATCH_PKTTYPE=m
CONFIG_IP_NF_MATCH_MARK=m
CONFIG_IP_NF_MATCH_MULTIPORT=m
CONFIG_IP_NF_MATCH_TOS=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_DSCP=m
CONFIG_IP_NF_MATCH_AH_ESP=m
CONFIG_IP_NF_MATCH_LENGTH=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_MATCH_TCPMSS=m
CONFIG_IP_NF_MATCH_HELPER=m
CONFIG_IP_NF_MATCH_STATE=m
CONFIG_IP_NF_MATCH_CONNTRACK=m
CONFIG_IP_NF_MATCH_UNCLEAN=m
CONFIG_IP_NF_MATCH_OWNER=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_MIRROR=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_REDIRECT=m
# CONFIG_IP_NF_NAT_LOCAL is not set
CONFIG_IP_NF_NAT_SNMP_BASIC=m
CONFIG_IP_NF_NAT_IRC=m
CONFIG_IP_NF_NAT_FTP=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_TOS=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_DSCP=m
CONFIG_IP_NF_TARGET_MARK=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_TARGET_TCPMSS=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_COMPAT_IPCHAINS=m
CONFIG_IP_NF_NAT_NEEDED=y
# CONFIG_IP_NF_COMPAT_IPFWADM is not set
CONFIG_IPV6=y
CONFIG_IPV6_DEBUG=y
CONFIG_IPV6_ZONE=y
CONFIG_IPV6_ZONE_SITELOCAL=y
CONFIG_IPV6_DROP_FAKE_V4MAPPED=y
CONFIG_IPV6_RESTRICTED_DOUBLE_BIND=y
CONFIG_IPV6_6TO4_NEXTHOP=y
CONFIG_IPV6_PRIVACY=y
# CONFIG_IPV6_ANYCAST is not set
# CONFIG_IPV6_ISATAP is not set
# CONFIG_IPV6_PREFIXLIST is not set
# CONFIG_IPV6_NDISC_DEBUG is not set
# CONFIG_IPV6_ACONF_DEBUG is not set
# CONFIG_IPV6_RT6_DEBUG is not set
# CONFIG_IPV6_SUBTREES is not set
# CONFIG_IPV6_MLD6_DEBUG is not set
# CONFIG_IPV6_MLD6_ALL_DONE is not set
CONFIG_IPV6_NODEINFO=y
# CONFIG_IPV6_NODEINFO_DEBUG is not set
# CONFIG_IPV6_NODEINFO_USE_UTS_DOMAIN is not set
#
# IPv6: Netfilter Configuration
#
CONFIG_IP6_NF_QUEUE=m
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP6_NF_MATCH_LIMIT=m
CONFIG_IP6_NF_MATCH_MAC=m
CONFIG_IP6_NF_MATCH_RT=m
CONFIG_IP6_NF_MATCH_OPTS=m
CONFIG_IP6_NF_MATCH_FRAG=m
CONFIG_IP6_NF_MATCH_MULTIPORT=m
CONFIG_IP6_NF_MATCH_OWNER=m
CONFIG_IP6_NF_MATCH_MARK=m
CONFIG_IP6_NF_MATCH_AHESP=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_MATCH_LENGTH=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_TARGET_LOG=m
CONFIG_IP6_NF_TARGET_REJECT=m
CONFIG_IP6_NF_MANGLE=m
CONFIG_IP6_NF_TARGET_MARK=m
# CONFIG_IPV6_SUBTREES is not set
CONFIG_IPV6_IPSEC=y
CONFIG_IPV6_IPSEC_TUNNEL=y
CONFIG_IPV6_IPV6_TUNNEL=m
CONFIG_IPV6_MOBILITY=m
CONFIG_IPV6_MOBILITY_MN=y
CONFIG_IPV6_MOBILITY_DEBUG=y
# CONFIG_KHTTPD is not set
# CONFIG_ATM is not set
CONFIG_VLAN_8021Q=m
#
#
#
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
#
# Appletalk devices
#
# CONFIG_DEV_APPLETALK is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
CONFIG_X25=m
CONFIG_LAPB=m
CONFIG_LLC=y
CONFIG_NET_DIVERT=y
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_FASTROUTE is not set
# CONFIG_NET_HW_FLOWCONTROL is not set
#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
#
# Network testing
#
CONFIG_NET_PKTGEN=m
============== end kernel config ================
master@linzen:~/src/exim/tries$ /sbin/lsmod
Module Size Used by Not tainted
mousedev 4340 0 (autoclean)
input 3648 0 (autoclean) [mousedev]
capi 18400 0
capifs 4036 0 [capi]
kernelcapi 30400 1 [capi]
capiutil 22912 0 [kernelcapi]
apm 10524 1 (autoclean)
snd-seq-midi 3840 0 (autoclean) (unused)
snd-seq-oss 28736 0 (unused)
snd-seq-midi-event 3304 0 [snd-seq-midi snd-seq-oss]
snd-seq 38256 2 [snd-seq-midi snd-seq-oss snd-seq-midi-event]
snd-pcm-oss 38820 0 (unused)
snd-mixer-oss 12792 0 [snd-pcm-oss]
snd-cs46xx 65332 0
snd-ac97-codec 30564 0 [snd-cs46xx]
snd-pcm 61728 0 [snd-pcm-oss snd-cs46xx]
snd-timer 11144 0 [snd-seq snd-pcm]
gameport 1676 0 [snd-cs46xx]
snd-rawmidi 13664 0 [snd-seq-midi snd-cs46xx]
snd-seq-device 4316 0 [snd-seq-midi snd-seq-oss snd-seq snd-rawmidi]
snd 27884 0 [snd-seq-midi snd-seq-oss snd-seq-midi-event snd-seq snd-pcm-oss snd-mixer-oss snd-cs46xx snd-ac97-codec snd-pcm snd-timer snd-rawmidi snd-seq-device]
soundcore 3908 8 [snd]
xircom_cb 7016 1
ds 7048 2
yenta_socket 10112 2
pcmcia_core 45248 0 [ds yenta_socket]
ide-floppy 14048 0 (autoclean)
ide-tape 57264 0 (autoclean)
usb-uhci 23436 0 (unused)
rtc 6908 1 (autoclean)
--
Lionel