netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next-2.6 v2] ipv6: adding ip_nonlocal_bind option from ipv4
@ 2010-07-05 10:12 Michal Humpula
  2010-07-05 10:30 ` YOSHIFUJI Hideaki
  0 siblings, 1 reply; 3+ messages in thread
From: Michal Humpula @ 2010-07-05 10:12 UTC (permalink / raw)
  To: netdev

Adds ability to bind to non-local IPv6 address the same way as for IPv4

Signed-off-by: Michal Humpula <michal.humpula@web4u.cz>

diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
index f350c69..1ebed5e 100644
--- a/Documentation/networking/ip-sysctl.txt
+++ b/Documentation/networking/ip-sysctl.txt
@@ -963,6 +963,11 @@ bindv6only - BOOLEAN
 
 	Default: FALSE (as specified in RFC2553bis)
 
+ipv6_nonlocal_bind - BOOLEAN
+	If set, allows processes to bind() to non-local IPv6 addresses,
+	which can be quite useful - but may break some applications.
+	Default: 0
+
 IPv6 Fragmentation:
 
 ip6frag_high_thresh - INTEGER
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
index 7bb5cb6..8957ead 100644
--- a/include/linux/sysctl.h
+++ b/include/linux/sysctl.h
@@ -528,6 +528,7 @@ enum {
 	NET_IPV6_IP6FRAG_TIME=23,
 	NET_IPV6_IP6FRAG_SECRET_INTERVAL=24,
 	NET_IPV6_MLD_MAX_MSF=25,
+	NET_IPV6_NONLOCAL_BIND=26
 };
 
 enum {
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index 1f84124..f459fcb 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -641,6 +641,8 @@ static inline int snmp6_unregister_dev(struct inet6_dev *idev) { return 0; }
 #endif
 
 #ifdef CONFIG_SYSCTL
+extern int sysctl_ipv6_nonlocal_bind;
+
 extern ctl_table ipv6_route_table_template[];
 extern ctl_table ipv6_icmp_table_template[];
 
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
index 1357c57..525edae 100644
--- a/kernel/sysctl_binary.c
+++ b/kernel/sysctl_binary.c
@@ -559,6 +559,7 @@ static const struct bin_table bin_net_ipv6_table[] = {
 	{ CTL_DIR,	NET_IPV6_ROUTE,		"route",	bin_net_ipv6_route_table },
 	{ CTL_DIR,	NET_IPV6_ICMP,		"icmp",		bin_net_ipv6_icmp_table },
 	{ CTL_INT,	NET_IPV6_BINDV6ONLY,		"bindv6only" },
+	{ CTL_INT,	NET_IPV6_NONLOCAL_BIND,		"ipv6_nonlocal_bind" },
 	{ CTL_INT,	NET_IPV6_IP6FRAG_HIGH_THRESH,	"ip6frag_high_thresh" },
 	{ CTL_INT,	NET_IPV6_IP6FRAG_LOW_THRESH,	"ip6frag_low_thresh" },
 	{ CTL_INT,	NET_IPV6_IP6FRAG_TIME,		"ip6frag_time" },
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
index e830cd4..ed59ec4 100644
--- a/net/ipv6/af_inet6.c
+++ b/net/ipv6/af_inet6.c
@@ -252,6 +252,8 @@ out_rcu_unlock:
 	goto out;
 }
 
+int sysctl_ipv6_nonlocal_bind __read_mostly;
+EXPORT_SYMBOL(sysctl_ipv6_nonlocal_bind);
 
 /* bind for INET6 API */
 int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
@@ -342,12 +344,11 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 			 * unspecified and mapped address have a v4 equivalent.
 			 */
 			v4addr = LOOPBACK4_IPV6;
-			if (!(addr_type & IPV6_ADDR_MULTICAST))	{
-				if (!ipv6_chk_addr(net, &addr->sin6_addr,
-						   dev, 0)) {
-					err = -EADDRNOTAVAIL;
-					goto out_unlock;
-				}
+			if (!(addr_type & IPV6_ADDR_MULTICAST) &&
+			    !sysctl_ipv6_nonlocal_bind &&
+			    !ipv6_chk_addr(net, &addr->sin6_addr, dev, 0)) {
+				err = -EADDRNOTAVAIL;
+				goto out_unlock;
 			}
 			rcu_read_unlock();
 		}
diff --git a/net/ipv6/sysctl_net_ipv6.c b/net/ipv6/sysctl_net_ipv6.c
index fa1d8f4..56bfe76 100644
--- a/net/ipv6/sysctl_net_ipv6.c
+++ b/net/ipv6/sysctl_net_ipv6.c
@@ -35,6 +35,13 @@ static ctl_table ipv6_table_template[] = {
 		.mode		= 0644,
 		.proc_handler	= proc_dointvec
 	},
+	{
+		.procname = "ipv6_nonlocal_bind",
+		.data   = &sysctl_ipv6_nonlocal_bind,
+		.maxlen   = sizeof(int),
+		.mode   = 0644,
+		.proc_handler = proc_dointvec
+	},
 	{ }
 };
 

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH net-next-2.6 v2] ipv6: adding ip_nonlocal_bind option from ipv4
  2010-07-05 10:12 [PATCH net-next-2.6 v2] ipv6: adding ip_nonlocal_bind option from ipv4 Michal Humpula
@ 2010-07-05 10:30 ` YOSHIFUJI Hideaki
  2010-07-05 11:59   ` Michal Humpula
  0 siblings, 1 reply; 3+ messages in thread
From: YOSHIFUJI Hideaki @ 2010-07-05 10:30 UTC (permalink / raw)
  To: Michal Humpula; +Cc: netdev, yoshfuji

Hello.

Mails are crossing, but additional comments below.

Michal Humpula wrote:

> diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
> index 1357c57..525edae 100644
> --- a/kernel/sysctl_binary.c
> +++ b/kernel/sysctl_binary.c
> @@ -559,6 +559,7 @@ static const struct bin_table bin_net_ipv6_table[] = {
>  	{ CTL_DIR,	NET_IPV6_ROUTE,		"route",	bin_net_ipv6_route_table },
>  	{ CTL_DIR,	NET_IPV6_ICMP,		"icmp",		bin_net_ipv6_icmp_table },
>  	{ CTL_INT,	NET_IPV6_BINDV6ONLY,		"bindv6only" },
> +	{ CTL_INT,	NET_IPV6_NONLOCAL_BIND,		"ipv6_nonlocal_bind" },
>  	{ CTL_INT,	NET_IPV6_IP6FRAG_HIGH_THRESH,	"ip6frag_high_thresh" },
>  	{ CTL_INT,	NET_IPV6_IP6FRAG_LOW_THRESH,	"ip6frag_low_thresh" },
>  	{ CTL_INT,	NET_IPV6_IP6FRAG_TIME,		"ip6frag_time" },

No more binary interface.

> diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
> index e830cd4..ed59ec4 100644
> --- a/net/ipv6/af_inet6.c
> +++ b/net/ipv6/af_inet6.c
> @@ -252,6 +252,8 @@ out_rcu_unlock:
>  	goto out;
>  }
>  
> +int sysctl_ipv6_nonlocal_bind __read_mostly;
> +EXPORT_SYMBOL(sysctl_ipv6_nonlocal_bind);
>  

why?

In IPv4 it seems to be exported for SCTP. Probably you need to
look into SCTP as well.

--yoshfuji


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH net-next-2.6 v2] ipv6: adding ip_nonlocal_bind option from ipv4
  2010-07-05 10:30 ` YOSHIFUJI Hideaki
@ 2010-07-05 11:59   ` Michal Humpula
  0 siblings, 0 replies; 3+ messages in thread
From: Michal Humpula @ 2010-07-05 11:59 UTC (permalink / raw)
  To: YOSHIFUJI Hideaki; +Cc: netdev

On Monday 05 of July 2010 12:30:32 YOSHIFUJI Hideaki wrote:
> Hello.
> 
> Mails are crossing, but additional comments below.
> 
> Michal Humpula wrote:
> > diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
> > index 1357c57..525edae 100644
> > --- a/kernel/sysctl_binary.c
> > +++ b/kernel/sysctl_binary.c
> > @@ -559,6 +559,7 @@ static const struct bin_table bin_net_ipv6_table[] =
> > {
> > 
> >  	{ CTL_DIR,	NET_IPV6_ROUTE,		"route",	bin_net_ipv6_route_table },
> >  	{ CTL_DIR,	NET_IPV6_ICMP,		"icmp",		bin_net_ipv6_icmp_table },
> >  	{ CTL_INT,	NET_IPV6_BINDV6ONLY,		"bindv6only" },
> > 
> > +	{ CTL_INT,	NET_IPV6_NONLOCAL_BIND,		"ipv6_nonlocal_bind" },
> > 
> >  	{ CTL_INT,	NET_IPV6_IP6FRAG_HIGH_THRESH,	"ip6frag_high_thresh" },
> >  	{ CTL_INT,	NET_IPV6_IP6FRAG_LOW_THRESH,	"ip6frag_low_thresh" },
> >  	{ CTL_INT,	NET_IPV6_IP6FRAG_TIME,		"ip6frag_time" },
> 
> No more binary interface.
> 
> > diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
> > index e830cd4..ed59ec4 100644
> > --- a/net/ipv6/af_inet6.c
> > +++ b/net/ipv6/af_inet6.c
> > 
> > @@ -252,6 +252,8 @@ out_rcu_unlock:
> >  	goto out;
> >  
> >  }
> > 
> > +int sysctl_ipv6_nonlocal_bind __read_mostly;
> > +EXPORT_SYMBOL(sysctl_ipv6_nonlocal_bind);
> 
> why?
> 
> In IPv4 it seems to be exported for SCTP. Probably you need to
> look into SCTP as well.
> 
> --yoshfuji

Thanks for review. I should obviously wait a little bit longer before posting the v2.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-07-05 11:59 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-05 10:12 [PATCH net-next-2.6 v2] ipv6: adding ip_nonlocal_bind option from ipv4 Michal Humpula
2010-07-05 10:30 ` YOSHIFUJI Hideaki
2010-07-05 11:59   ` Michal Humpula

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).