[v3] busybox: Update udhcpc.script for stateful DHCPv6

Message ID 20180702010817.3711-1-sam@mendozajonas.com
State Superseded
Headers show
Series
  • [v3] busybox: Update udhcpc.script for stateful DHCPv6
Related show

Commit Message

Samuel Mendoza-Jonas July 2, 2018, 1:08 a.m.
udhcpc6 will call the default script with the address set in the "ipv6"
variable. Set "ip" to this address if present.

Also from Rob, if handling a DHCPv6 address wait a moment for the IPv6
route to be configured; this doesn't come from DHCPv6 but rather the
IPv6 Router Advertisement (RA).

(wait for IPv6 route)
From: Robert Lippert <rlippert@google.com>
Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
---
v3: Point out 'stateful' DHCPv6 in commit, send to the correct list...
v2: Avoid bashisms

 package/busybox/udhcpc.script | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

Comments

Arnout Vandecappelle July 10, 2018, 9:54 p.m. | #1
On 02-07-18 03:08, Samuel Mendoza-Jonas wrote:
> udhcpc6 will call the default script with the address set in the "ipv6"
> variable. Set "ip" to this address if present.
> 
> Also from Rob, if handling a DHCPv6 address wait a moment for the IPv6
> route to be configured; this doesn't come from DHCPv6 but rather the
> IPv6 Router Advertisement (RA).

 Point being that you want to *delete* the route coming from the RA, and keep
only the DHCPv6 route, correct? That's not entirely clear from the commit
message. Then, you would only need to do that if the DHCPv6 actually announces a
router, no?

> 
> (wait for IPv6 route)
> From: Robert Lippert <rlippert@google.com>
> Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
> ---
> v3: Point out 'stateful' DHCPv6 in commit, send to the correct list...

 I don't see 'stateful' in the commit message :-)

> v2: Avoid bashisms
> 
>  package/busybox/udhcpc.script | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/package/busybox/udhcpc.script b/package/busybox/udhcpc.script
> index ad110d3a7f..65114b6cd0 100755
> --- a/package/busybox/udhcpc.script
> +++ b/package/busybox/udhcpc.script
> @@ -8,6 +8,16 @@ RESOLV_CONF="/etc/resolv.conf"
>  [ -e $RESOLV_CONF ] || touch $RESOLV_CONF
>  [ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
>  [ -n "$subnet" ] && NETMASK="netmask $subnet"
> +[ -n "$ipv6" ] && ip="$ipv6/128"
> +
> +wait_for_ipv6_default_route() {
> +	attempts=10
> +	while [ $attempts != 0 ] && [ -z "$(ip -6 route list | grep default)" ] ; do
> +		sleep 1
> +		attempts=$(($attempts-1))
> +	done
> +	[ $attempts = 0 ] && echo "failed to get default ipv6 route"
> +}
>  
>  case "$1" in
>  	deconfig)
> @@ -37,6 +47,10 @@ case "$1" in
>  			/usr/sbin/avahi-autoipd -k $interface
>  		fi
>  		/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
> +		if [ -n "$ipv6" ] ; then

 So I would move this bit...

> +			echo "waiting for default ipv6 route set"
> +			wait_for_ipv6_default_route
> +		fi
>  
>  		if [ -n "$router" ] ; then

 ... here, so it only happens if routers are present.

 Regards,
 Arnout

>  			echo "deleting routers"
>
Samuel Mendoza-Jonas July 11, 2018, 12:58 a.m. | #2
On Tue, 2018-07-10 at 23:54 +0200, Arnout Vandecappelle wrote:
> 
> On 02-07-18 03:08, Samuel Mendoza-Jonas wrote:
> > udhcpc6 will call the default script with the address set in the "ipv6"
> > variable. Set "ip" to this address if present.
> > 
> > Also from Rob, if handling a DHCPv6 address wait a moment for the IPv6
> > route to be configured; this doesn't come from DHCPv6 but rather the
> > IPv6 Router Advertisement (RA).
> 
>  Point being that you want to *delete* the route coming from the RA, and keep
> only the DHCPv6 route, correct? That's not entirely clear from the commit
> message. Then, you would only need to do that if the DHCPv6 actually announces a
> router, no?

No the aim is to check if we've received a route from the RA, since
DHCPv6 does not advertise any route. Rob can correct me if needed but the
goal here is to have udhcpc6 behave as much like udhcpc as possible in
that once it configures an address you would usually expect the network
to also be routable. We can't determine that from the DHCPv6 response so
we check to see if the RA has set one before setting the address.

> 
> > 
> > (wait for IPv6 route)
> > From: Robert Lippert <rlippert@google.com>
> > Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
> > ---
> > v3: Point out 'stateful' DHCPv6 in commit, send to the correct list...
> 
>  I don't see 'stateful' in the commit message :-)

Message, title... :)

> 
> > v2: Avoid bashisms
> > 
> >  package/busybox/udhcpc.script | 14 ++++++++++++++
> >  1 file changed, 14 insertions(+)
> > 
> > diff --git a/package/busybox/udhcpc.script b/package/busybox/udhcpc.script
> > index ad110d3a7f..65114b6cd0 100755
> > --- a/package/busybox/udhcpc.script
> > +++ b/package/busybox/udhcpc.script
> > @@ -8,6 +8,16 @@ RESOLV_CONF="/etc/resolv.conf"
> >  [ -e $RESOLV_CONF ] || touch $RESOLV_CONF
> >  [ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
> >  [ -n "$subnet" ] && NETMASK="netmask $subnet"
> > +[ -n "$ipv6" ] && ip="$ipv6/128"
> > +
> > +wait_for_ipv6_default_route() {
> > +	attempts=10
> > +	while [ $attempts != 0 ] && [ -z "$(ip -6 route list | grep default)" ] ; do
> > +		sleep 1
> > +		attempts=$(($attempts-1))
> > +	done
> > +	[ $attempts = 0 ] && echo "failed to get default ipv6 route"
> > +}
> >  
> >  case "$1" in
> >  	deconfig)
> > @@ -37,6 +47,10 @@ case "$1" in
> >  			/usr/sbin/avahi-autoipd -k $interface
> >  		fi
> >  		/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
> > +		if [ -n "$ipv6" ] ; then
> 
>  So I would move this bit...
> 
> > +			echo "waiting for default ipv6 route set"
> > +			wait_for_ipv6_default_route
> > +		fi
> >  
> >  		if [ -n "$router" ] ; then
> 
>  ... here, so it only happens if routers are present.
> 
>  Regards,
>  Arnout
> 
> >  			echo "deleting routers"
> > 
> 
>

Patch

diff --git a/package/busybox/udhcpc.script b/package/busybox/udhcpc.script
index ad110d3a7f..65114b6cd0 100755
--- a/package/busybox/udhcpc.script
+++ b/package/busybox/udhcpc.script
@@ -8,6 +8,16 @@  RESOLV_CONF="/etc/resolv.conf"
 [ -e $RESOLV_CONF ] || touch $RESOLV_CONF
 [ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
 [ -n "$subnet" ] && NETMASK="netmask $subnet"
+[ -n "$ipv6" ] && ip="$ipv6/128"
+
+wait_for_ipv6_default_route() {
+	attempts=10
+	while [ $attempts != 0 ] && [ -z "$(ip -6 route list | grep default)" ] ; do
+		sleep 1
+		attempts=$(($attempts-1))
+	done
+	[ $attempts = 0 ] && echo "failed to get default ipv6 route"
+}
 
 case "$1" in
 	deconfig)
@@ -37,6 +47,10 @@  case "$1" in
 			/usr/sbin/avahi-autoipd -k $interface
 		fi
 		/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
+		if [ -n "$ipv6" ] ; then
+			echo "waiting for default ipv6 route set"
+			wait_for_ipv6_default_route
+		fi
 
 		if [ -n "$router" ] ; then
 			echo "deleting routers"