diff options
author | David Gwynne <dlg@cvs.openbsd.org> | 2011-07-06 01:57:38 +0000 |
---|---|---|
committer | David Gwynne <dlg@cvs.openbsd.org> | 2011-07-06 01:57:38 +0000 |
commit | 331b4363053aa0348db11124ffb4bbe57f433a8a (patch) | |
tree | aafbb1d01e016aee46e6313cb4ccf591c05833ca /sys/netinet/in_pcb.c | |
parent | 45b3845c4bcc6cce64d0a683b18f928a9bda8d6a (diff) |
allow /31s on broadcast interfaces (eg ethernet) to work as per rfc3021.
the issue in our kernel was the broadcast address calculated on the /31
caused a ton of checks for use of broadcast addresses to kick in and
prevent one of the two addresses on the /31 from being used.
this diff basically detects if a /31 has been configured and doesnt
configure a broadcast address for it, which makes the ips usable
for normal traffic.
i wrote this so i could interoperate with "carrier" network gear
better, and sthen wants it so he can conserve address space use.
the further special casing of broadcast address handling was from claudio@
ok claudio@ markus@ sthen@ henning@
Diffstat (limited to 'sys/netinet/in_pcb.c')
-rw-r--r-- | sys/netinet/in_pcb.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index df5c49d2b37..a36b09cbb6c 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in_pcb.c,v 1.123 2011/07/05 21:40:38 dhill Exp $ */ +/* $OpenBSD: in_pcb.c,v 1.124 2011/07/06 01:57:37 dlg Exp $ */ /* $NetBSD: in_pcb.c,v 1.25 1996/02/13 23:41:53 christos Exp $ */ /* @@ -402,8 +402,10 @@ in_pcbconnect(void *v, struct mbuf *nam) if (sin->sin_addr.s_addr == INADDR_ANY) sin->sin_addr = TAILQ_FIRST(&in_ifaddr)->ia_addr.sin_addr; else if (sin->sin_addr.s_addr == INADDR_BROADCAST && - (TAILQ_FIRST(&in_ifaddr)->ia_ifp->if_flags & IFF_BROADCAST)) - sin->sin_addr = TAILQ_FIRST(&in_ifaddr)->ia_broadaddr.sin_addr; + (TAILQ_FIRST(&in_ifaddr)->ia_ifp->if_flags & IFF_BROADCAST) && + TAILQ_FIRST(&in_ifaddr)->ia_broadaddr.sin_addr.s_addr) + sin->sin_addr = + TAILQ_FIRST(&in_ifaddr)->ia_broadaddr.sin_addr; } if (inp->inp_laddr.s_addr == INADDR_ANY) { int error; |