Public bug reported:

Summary:
========

If a interface does not yet have a link-local address (as it may have
just been brought up), dhclient -6 <ifname> will fail. The built-in
"wait for link-local address" loop does not function properly, causing
DHCP failure.

Discussion:
===========

In trying to configure isc-dhcp-client 4.3.5-3ubuntu1 for IPv6 on Ubuntu
17.04, I was finding that on boot I was getting failures with the logged
message "no link-local IPv6 address for <ifname>"

I found that it took several seconds for the link-local address to be
assigned when the interface came up (in this case, the ISP/modem-facing
interface), and worked around it with a script that looks at

  /sbin/ifconfig $IFACE | /bin/fgrep -q 'scopeid 0x20'

and loops for a fixed number of times for that to be successful.

On looking at /sbin/dhclient-script it appears that it *tries* to do the
same thing in

  # set the link up and wait for ipv6 link local dad to finish
  ipv6_link_up_and_dad()

this code sets

  out=$(ip -6 -o address show dev "$dev" scope link)

then checks it with a case statement inside of a loop for

        case " $out " in
            *\ dadfailed\ *)
                error "$dev: ipv6 dad failed."
                return 1;;
            *\ tentative\ *) :;;
            *) return 0;;
        esac

If there is no link-local address, $out will be empty. The default case
is taken, and the loop exits immediately:

$ echo "'$out'" ; case " $out " in
>     *\ dadfailed\ *)
>         echo "dadfailed"
>         ;;
>     *\ tentative\ *)
>         echo "tentative"
>         ;;
>     *)
>         echo "default"
> esac
''
default

As a result, there is no "wait for link-local address" and when there is
no link-local address, dhclient fails later on.

Possible Fix:
=============

Adding "the missing case" for "no address" case that continues the loop
is one possible solution.

        case " $out " in
            *\ dadfailed\ *)
                error "$dev: ipv6 dad failed."
                return 1;;
            *\ tentative\ *) :;;
     "  ")
  :
  ;;
            *) return 0;;
        esac

At least in my situation, this prevents the failure of dhclient due to
the link-local address not being "ready" yet.

** Affects: isc-dhcp (Ubuntu)
     Importance: Undecided
         Status: New

** Affects: isc-dhcp (Debian)
     Importance: Unknown
         Status: Unknown


** Tags: ipv6

** Description changed:

  Summary:
  ========
  
- If a interface does not have a link-local address, dhclient -6 <ifname>
- will fail. The built-in "wait for link-local address" loop does not
- function properly, causing DHCP failure.
+ If a interface does not yet have a link-local address (as it may have
+ just been brought up), dhclient -6 <ifname> will fail. The built-in
+ "wait for link-local address" loop does not function properly, causing
+ DHCP failure.
  
  Discussion:
  ===========
  
  In trying to configure isc-dhcp-client 4.3.5-3ubuntu1 for IPv6 on Ubuntu
  17.04, I was finding that on boot I was getting failures with the logged
  message "no link-local IPv6 address for <ifname>"
  
  I found that it took several seconds for the link-local address to be
  assigned when the interface came up (in this case, the ISP/modem-facing
  interface), and worked around it with a script that looks at
  
-   /sbin/ifconfig $IFACE | /bin/fgrep -q 'scopeid 0x20'
+   /sbin/ifconfig $IFACE | /bin/fgrep -q 'scopeid 0x20'
  
  and loops for a fixed number of times for that to be successful.
  
  On looking at /sbin/dhclient-script it appears that it *tries* to do the
  same thing in
  
-   # set the link up and wait for ipv6 link local dad to finish
-   ipv6_link_up_and_dad()
+   # set the link up and wait for ipv6 link local dad to finish
+   ipv6_link_up_and_dad()
  
  this code sets
  
-   out=$(ip -6 -o address show dev "$dev" scope link)
+   out=$(ip -6 -o address show dev "$dev" scope link)
  
  then checks it with a case statement inside of a loop for
  
-         case " $out " in
-             *\ dadfailed\ *)
-                 error "$dev: ipv6 dad failed."
-                 return 1;;
-             *\ tentative\ *) :;;
-             *) return 0;;
-         esac
+         case " $out " in
+             *\ dadfailed\ *)
+                 error "$dev: ipv6 dad failed."
+                 return 1;;
+             *\ tentative\ *) :;;
+             *) return 0;;
+         esac
  
  If there is no link-local address, $out will be empty. The default case
  is taken, and the loop exits immediately:
  
  $ echo "'$out'" ; case " $out " in
  >     *\ dadfailed\ *)
  >         echo "dadfailed"
  >         ;;
  >     *\ tentative\ *)
  >         echo "tentative"
  >         ;;
  >     *)
  >         echo "default"
  > esac
  ''
  default
  
  As a result, there is no "wait for link-local address" and when there is
  no link-local address, dhclient fails later on.
  
- 
  Possible Fix:
  =============
  
  Adding "the missing case" for "no address" case that continues the loop
  is one possible solution.
  
-         case " $out " in
-             *\ dadfailed\ *)
-                 error "$dev: ipv6 dad failed."
-                 return 1;;
-             *\ tentative\ *) :;;
-           "  ")
-               :
-               ;;
-             *) return 0;;
-         esac
+         case " $out " in
+             *\ dadfailed\ *)
+                 error "$dev: ipv6 dad failed."
+                 return 1;;
+             *\ tentative\ *) :;;
+      "  ")
+   :
+   ;;
+             *) return 0;;
+         esac
  
  At least in my situation, this prevents the failure of dhclient due to
  the link-local address not being "ready" yet.

** Bug watch added: Debian Bug tracker #783387
   https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=783387

** Also affects: isc-dhcp (Debian) via
   https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=783387
   Importance: Unknown
       Status: Unknown

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1718568

Title:
  dhclient-script fails to wait for link-local address

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/isc-dhcp/+bug/1718568/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to