IPv6 DHCPv6 — Stateful & Stateless (SLAAC)

IPv4 has one way to assign addresses dynamically — DHCP. IPv6 has three. A host joining an IPv6 network can receive its address through SLAAC (Stateless Address Autoconfiguration), Stateless DHCPv6, or Stateful DHCPv6 — and the router controls which method clients use entirely through flags in a single message: the Router Advertisement (RA). Understanding which method to deploy, how to configure each one on a Cisco router, and how to verify client addressing is essential for both the CCNA exam and any real IPv6 deployment.

The three methods are not mutually exclusive — they are layered. SLAAC always provides the IPv6 address itself. Stateless DHCPv6 adds configuration parameters (DNS, domain name) without tracking addresses. Stateful DHCPv6 does everything — assigns addresses, tracks bindings, and delivers configuration — exactly like IPv4 DHCP. The RA message is the signalling mechanism that tells clients which combination to use.

Before starting, ensure you understand IPv6 addressing fundamentals from IPv6 Addressing and the difference between link-local and global unicast addresses from IPv6 Link-Local vs Global Unicast. For IPv4 DHCP context, review DHCP Server Configuration and DHCP Relay Agent — DHCPv6 relay uses a similar concept with different syntax. IPv6 routing must be enabled before any of these methods work — this is covered in Basic Interface Configuration.

1. IPv6 Address Assignment — Core Concepts

The Three IPv6 Address Assignment Methods

Method Address Source Other Config (DNS etc.) Server Tracks Bindings Best For
SLAAC Client generates its own from the prefix in the RA No — client gets nothing else No Simple networks, IoT, where DNS is not needed from the network
Stateless DHCPv6 Client generates its own from the RA prefix (SLAAC) Yes — DHCPv6 server provides DNS, domain name, NTP etc. No — no address bindings stored Most enterprise LANs — clients self-address but get DNS from a server
Stateful DHCPv6 DHCPv6 server assigns a specific address from a pool Yes — full configuration delivered Yes — binding table maintained per client Environments needing address tracking, fixed assignments, or audit trails

Router Advertisement Flags — The Control Signals

The router sends periodic Router Advertisement (RA) messages to the all-nodes multicast address (FF02::1). Three flags in the RA header control exactly which addressing method clients must use. These flags are set on the router's interface:

  RA Flag Summary:

  Flag   Name                    Meaning When SET (1)
  ─────────────────────────────────────────────────────────────────────
  A      Autonomous              Client SHOULD use SLAAC to self-generate address
         (in Prefix Info option) Set by default when a prefix is in the RA

  M      Managed address config  Client MUST get address from DHCPv6 server (Stateful)
         (in RA header)          When M=1, client ignores A flag for addressing

  O      Other config            Client SHOULD get OTHER config (DNS, NTP) from DHCPv6
         (in RA header)          When O=1 with M=0 → Stateless DHCPv6
                                 When M=1, O is implied (M covers everything)

  ─────────────────────────────────────────────────────────────────────
  Resulting method combinations:

  M=0  O=0  A=1  →  Pure SLAAC only         (client self-addresses, no DHCPv6)
  M=0  O=1  A=1  →  SLAAC + Stateless DHCP  (self-address + get DNS from server)
  M=1  O=0  A=0  →  Stateful DHCPv6 only    (server assigns address + config)
  M=1  O=1  A=0  →  Stateful DHCPv6 only    (M=1 implies O — explicit is fine)
  ─────────────────────────────────────────────────────────────────────
  

How SLAAC Generates an Address (EUI-64)

When a client receives an RA with a /64 prefix and the A flag set, it generates the host portion of its address using EUI-64 — a method that derives a 64-bit interface ID from the device's 48-bit MAC address:

  EUI-64 Interface ID Generation:

  MAC address:       a4:b1:c2:d3:e4:f5
                     ─────┬─────  ─────┬─────
                      OUI (24 bit)  Device ID (24 bit)

  Step 1: Split MAC in half → a4:b1:c2 | d3:e4:f5
  Step 2: Insert FFFE in the middle → a4:b1:c2:FF:FE:d3:e4:f5
  Step 3: Flip the 7th bit (Universal/Local bit) of the first byte
          a4 = 1010 0100 → flip bit 7 → 1010 0110 = a6
  Result: a6b1:c2ff:fed3:e4f5

  Final IPv6 address (with prefix 2001:db8:1::/64):
  2001:db8:1::a6b1:c2ff:fed3:e4f5

  Note: Many modern OSes (Windows 10+, iOS, Android) use
  privacy extensions (RFC 4941) to generate RANDOM interface IDs
  instead of EUI-64 — preventing device tracking by MAC.
  The network admin cannot predict or control these addresses,
  which is why stateful DHCPv6 is preferred when tracking matters.
  

IPv6 Neighbour Discovery — RS and RA Messages

Message Type Sent By Destination Purpose
RS (Router Solicitation) ICMPv6 Type 133 Client (host) FF02::2 (all-routers) Host asks: "Is there a router here? Send me your RA immediately"
RA (Router Advertisement) ICMPv6 Type 134 Router FF02::1 (all-nodes) Router announces: prefix, flags (M/O/A), default gateway, MTU, lifetime
DHCPv6 Solicit DHCPv6 Client FF02::1:2 (all-DHCPv6-servers) Client requests DHCPv6 service after seeing M=1 or O=1 in RA
DHCPv6 Advertise DHCPv6 DHCPv6 Server Client link-local Server responds with available address or configuration

2. Lab Topology & Scenario

This lab uses NetsTuts_R1 as both the IPv6 router and DHCPv6 server across three LAN segments — one for each addressing method. This allows direct comparison of all three methods on the same device. NetsTuts_R2 acts as an upstream router to demonstrate prefix delegation.

                           NetsTuts_R1
              ┌────────────────────────────────────────┐
              │                                        │
  [Host-A] ───┤ Gi0/0  SLAAC only                     │
              │ 2001:db8:1::1/64                       │
              │ M=0  O=0  A=1                          │
              │                                        │
  [Host-B] ───┤ Gi0/1  SLAAC + Stateless DHCPv6       │
              │ 2001:db8:2::1/64                       │
              │ M=0  O=1  A=1                          │
              │                                        │
  [Host-C] ───┤ Gi0/2  Stateful DHCPv6                │
              │ 2001:db8:3::1/64  Pool: ::10–::ff      │
              │ M=1  O=0  A=0                          │
              │                                        │
              │ Gi0/3 ─────────────────────────────────┼── NetsTuts_R2
              │ 2001:db8:ff::1/64   (WAN / upstream)   │   2001:db8:ff::2/64
              └────────────────────────────────────────┘

  Lab Objectives:
  1. Enable IPv6 routing and configure interface addresses
  2. Configure pure SLAAC on Gi0/0 — clients self-address, no DHCPv6
  3. Configure stateless DHCPv6 on Gi0/1 — SLAAC + DNS from server
  4. Configure stateful DHCPv6 on Gi0/2 — server assigns all addressing
  5. Verify each method with show ipv6 dhcp binding and RA inspection
  6. Configure a DHCPv6 relay for remote segments
  
Interface IPv6 Address Method M Flag O Flag A Flag
Gi0/0 2001:db8:1::1/64 SLAAC only 0 0 1 (default)
Gi0/1 2001:db8:2::1/64 SLAAC + Stateless DHCPv6 0 1 1 (default)
Gi0/2 2001:db8:3::1/64 Stateful DHCPv6 1 0 0
Gi0/3 2001:db8:ff::1/64 WAN (static)

3. Step 1 — Enable IPv6 Routing & Configure Interfaces

IPv6 unicast routing is disabled by default on Cisco IOS routers. It must be enabled globally before any IPv6 routing or RA generation works. Without this command the router will not send Router Advertisements and clients will not be able to autoconfigure:

NetsTuts_R1>en
NetsTuts_R1#conf t
Enter configuration commands, one per line.  End with CNTL/Z.

! ── Enable IPv6 unicast routing globally ─────────────────
NetsTuts_R1(config)#ipv6 unicast-routing

! ── SLAAC-only segment (Gi0/0) ───────────────────────────
NetsTuts_R1(config)#interface GigabitEthernet0/0
NetsTuts_R1(config-if)#description SLAAC-Only-Segment
NetsTuts_R1(config-if)#ipv6 address 2001:db8:1::1/64
NetsTuts_R1(config-if)#ipv6 nd prefix 2001:db8:1::/64
NetsTuts_R1(config-if)#no shutdown
NetsTuts_R1(config-if)#exit

! ── Stateless DHCPv6 segment (Gi0/1) ─────────────────────
NetsTuts_R1(config)#interface GigabitEthernet0/1
NetsTuts_R1(config-if)#description Stateless-DHCPv6-Segment
NetsTuts_R1(config-if)#ipv6 address 2001:db8:2::1/64
NetsTuts_R1(config-if)#no shutdown
NetsTuts_R1(config-if)#exit

! ── Stateful DHCPv6 segment (Gi0/2) ─────────────────────
NetsTuts_R1(config)#interface GigabitEthernet0/2
NetsTuts_R1(config-if)#description Stateful-DHCPv6-Segment
NetsTuts_R1(config-if)#ipv6 address 2001:db8:3::1/64
NetsTuts_R1(config-if)#no shutdown
NetsTuts_R1(config-if)#exit

! ── WAN interface (Gi0/3) ────────────────────────────────
NetsTuts_R1(config)#interface GigabitEthernet0/3
NetsTuts_R1(config-if)#description WAN-to-R2
NetsTuts_R1(config-if)#ipv6 address 2001:db8:ff::1/64
NetsTuts_R1(config-if)#no shutdown
NetsTuts_R1(config-if)#exit
  
ipv6 unicast-routing does three things: enables IPv6 packet forwarding between interfaces, causes the router to generate Router Advertisements on all IPv6-enabled interfaces, and allows the router to act as a default gateway for IPv6 hosts. Without it, the router behaves as an IPv6 host — it can have IPv6 addresses but will not route packets or send RAs. Assigning a global unicast address with ipv6 address also automatically creates a link-local address on the interface (fe80::/10 range).

Verify Interface IPv6 Addresses

NetsTuts_R1#show ipv6 interface brief
GigabitEthernet0/0    [up/up]
    FE80::1            (link-local — auto-generated)
    2001:DB8:1::1
GigabitEthernet0/1    [up/up]
    FE80::1
    2001:DB8:2::1
GigabitEthernet0/2    [up/up]
    FE80::1
    2001:DB8:3::1
GigabitEthernet0/3    [up/up]
    FE80::1
    2001:DB8:FF::1
  
Every interface now has both a link-local address (FE80::1 — derived from the router's MAC) and a global unicast address. The link-local address is critical — it is what clients use as their IPv6 default gateway, not the global unicast address. When a client receives an RA, the source address of that RA (the router's link-local) becomes the client's default gateway entry.

4. Step 2 — Pure SLAAC (No DHCPv6)

SLAAC is the default IPv6 behaviour when ipv6 unicast-routing is enabled. The router automatically sends RAs containing the interface prefix with the A flag set. No additional configuration is needed for pure SLAAC — but understanding how to verify and control the RA content is important:

! ── Gi0/0 is already sending RAs with default flags ──────
! ── Default: M=0, O=0, A=1 (pure SLAAC) ─────────────────
! ── No additional commands needed for basic SLAAC ────────

! ── Optionally set explicit RA interval and lifetime ─────
NetsTuts_R1(config)#interface GigabitEthernet0/0
NetsTuts_R1(config-if)#ipv6 nd ra-interval 30
NetsTuts_R1(config-if)#ipv6 nd ra-lifetime 180
NetsTuts_R1(config-if)#exit
  
ipv6 nd ra-interval 30 sets the router to send an unsolicited RA every 30 seconds (default is 200 seconds). The ra-lifetime tells clients how long to treat this router as a valid default gateway — if the router stops sending RAs, clients remove it as a default gateway after this timer expires. Setting ra-lifetime to 0 tells clients "do not use me as a default gateway" — useful on non-default-gateway routers that still send prefix information.

Verify RA Content on Gi0/0

NetsTuts_R1#show ipv6 interface GigabitEthernet0/0
GigabitEthernet0/0 is up, line protocol is up
  IPv6 is enabled, link-local address is FE80::1
  Global unicast address(es):
    2001:DB8:1::1, subnet is 2001:DB8:1::/64
  Joined group address(es):
    FF02::1     (all-nodes multicast)
    FF02::2     (all-routers multicast)
    FF02::1:FF00:1  (solicited-node multicast)
  ND DAD is enabled, number of DAD attempts: 1
  ND reachable time is 30000 milliseconds
  ND advertised reachable time is 0 (unspecified)
  ND advertised retransmit interval is 0 (unspecified)
  ND router advertisements are sent every 30 seconds
  ND router advertisements live for 180 seconds
  ND advertised default router preference is Medium
  Hosts use stateless autoconfig for addresses.
  
The last line — "Hosts use stateless autoconfig for addresses" — confirms pure SLAAC is active on this interface. This maps to M=0, O=0. Clients receiving this RA will self-generate their address from the 2001:db8:1::/64 prefix using EUI-64 or privacy extensions, and set FE80::1 as their default gateway. They will not contact any DHCPv6 server.

Suppress RAs on an Interface (Security)

! ── Stop sending RAs on an interface where no clients exist
! ── e.g., WAN link — prevents hosts on that segment from
! ── using this router as a default gateway unintentionally
NetsTuts_R1(config)#interface GigabitEthernet0/3
NetsTuts_R1(config-if)#ipv6 nd ra suppress all
NetsTuts_R1(config-if)#exit
  
Suppressing RAs on WAN or point-to-point links is a security best practice — it prevents an attacker on the WAN segment from receiving prefix information or using the router as an unintended default gateway. The all keyword suppresses both periodic and solicited RAs. For individual hosts that need the gateway, static IPv6 configuration is used instead.

5. Step 3 — Stateless DHCPv6 (SLAAC + DNS)

Stateless DHCPv6 combines SLAAC address generation with a DHCPv6 server providing configuration parameters. The router sets O=1 in the RA — clients self-generate their address from the RA prefix, then separately contact the DHCPv6 server to retrieve DNS servers, domain name, and other options. The DHCPv6 server tracks no address bindings — hence "stateless":

Create the Stateless DHCPv6 Pool

! ── DHCPv6 pool for stateless service on Gi0/1 ───────────
! ── No address range — stateless pools provide config only
NetsTuts_R1(config)#ipv6 dhcp pool STATELESS-POOL
NetsTuts_R1(config-dhcpv6)#dns-server 2001:db8::53
NetsTuts_R1(config-dhcpv6)#dns-server 2001:4860:4860::8888
NetsTuts_R1(config-dhcpv6)#domain-name netstuts.com
NetsTuts_R1(config-dhcpv6)#exit
  
A stateless DHCPv6 pool contains no address prefix or range — that is the defining characteristic. It only holds configuration options: DNS servers, domain names, NTP servers, and SIP server addresses. The pool name (STATELESS-POOL) must be referenced on the interface to bind it to a segment.

Apply the Pool and Set the O Flag on Gi0/1

NetsTuts_R1(config)#interface GigabitEthernet0/1
! ── Bind the DHCPv6 pool to this interface ───────────────
NetsTuts_R1(config-if)#ipv6 dhcp server STATELESS-POOL
! ── Set O=1: tell clients to get OTHER config from DHCPv6 ─
NetsTuts_R1(config-if)#ipv6 nd other-config-flag
! ── M flag stays 0 (default) — clients still use SLAAC ───
NetsTuts_R1(config-if)#exit
  
ipv6 nd other-config-flag sets the O bit in the RA to 1. Clients receiving this RA will: (1) use SLAAC to generate their own IPv6 address from the 2001:db8:2::/64 prefix (A=1, M=0), then (2) send a DHCPv6 Information-Request to FF02::1:2 to retrieve DNS and domain name. The DHCPv6 server responds with the pool contents but does not record the client's address — there is no binding table entry for stateless clients.

Verify Stateless Configuration

NetsTuts_R1#show ipv6 interface GigabitEthernet0/1
GigabitEthernet0/1 is up, line protocol is up
  IPv6 is enabled, link-local address is FE80::1
  Global unicast address(es):
    2001:DB8:2::1, subnet is 2001:DB8:2::/64
  ...
  ND router advertisements are sent every 200 seconds
  ND router advertisements live for 1800 seconds
  Hosts use stateless autoconfig for addresses.
  Hosts use DHCP to get other configuration parameters.
  
Two critical lines confirm the stateless DHCPv6 configuration: "Hosts use stateless autoconfig for addresses" (M=0, A=1 — SLAAC for addressing) and "Hosts use DHCP to get other configuration parameters" (O=1 — DHCPv6 for DNS etc.). This is exactly the combination needed for stateless DHCPv6.
NetsTuts_R1#show ipv6 dhcp pool STATELESS-POOL
DHCPv6 pool: STATELESS-POOL
  DNS server: 2001:DB8::53
  DNS server: 2001:4860:4860::8888
  Domain name: netstuts.com
  Active clients: 0
  
Active clients: 0 is expected and correct for a stateless pool — the server responds to Information-Request messages but does not record clients. Even with multiple hosts actively using DNS obtained from this pool, the active client count will always show 0. This is the fundamental difference from stateful DHCPv6 where every address assignment creates a binding entry.

6. Step 4 — Stateful DHCPv6 (Full Address Assignment)

Stateful DHCPv6 mirrors IPv4 DHCP behaviour — the server assigns a specific IPv6 address to each client from a configured pool, maintains a binding table with client DUID, assigned address, and lease time, and delivers full configuration parameters. The router sets M=1 and suppresses the A flag — clients must not use SLAAC for their address:

Create the Stateful DHCPv6 Pool

! ── DHCPv6 pool for stateful service on Gi0/2 ───────────
NetsTuts_R1(config)#ipv6 dhcp pool STATEFUL-POOL
! ── Define the address range to assign from ─────────────
NetsTuts_R1(config-dhcpv6)#address prefix 2001:db8:3::/64 lifetime 86400 3600
! ── DNS and domain configuration ────────────────────────
NetsTuts_R1(config-dhcpv6)#dns-server 2001:db8::53
NetsTuts_R1(config-dhcpv6)#domain-name netstuts.com
NetsTuts_R1(config-dhcpv6)#exit
  
The address prefix command is what distinguishes a stateful pool from a stateless one. It defines the prefix from which addresses are allocated. The lifetime values set the valid lifetime (86400 seconds = 24 hours — how long the address is valid) and the preferred lifetime (3600 seconds = 1 hour — after this, the client should seek renewal but can still use the address). Clients are assigned addresses sequentially from the pool — the server picks the next available address within the /64 prefix.

Exclude Addresses from the Stateful Pool

! ── Exclude the router's own address and reserved addresses
! ── from being assigned to clients ──────────────────────
NetsTuts_R1(config)#ipv6 dhcp pool STATEFUL-POOL
NetsTuts_R1(config-dhcpv6)#address prefix 2001:db8:3::/64 lifetime 86400 3600 exclude 2001:db8:3::1
NetsTuts_R1(config-dhcpv6)#exit
  
Unlike IPv4 DHCP which uses an explicit exclusion range command (ip dhcp excluded-address), DHCPv6 on IOS uses the exclude keyword within the address prefix command to specify individual addresses or ranges to skip. Always exclude the router's own interface address (::1) and any other static addresses in the prefix.

Apply the Pool and Set the M Flag on Gi0/2

NetsTuts_R1(config)#interface GigabitEthernet0/2
! ── Bind the stateful DHCPv6 pool ────────────────────────
NetsTuts_R1(config-if)#ipv6 dhcp server STATEFUL-POOL
! ── Set M=1: clients MUST get address from DHCPv6 ────────
NetsTuts_R1(config-if)#ipv6 nd managed-config-flag
! ── Set A=0: suppress the prefix in RA ───────────────────
! ── Clients should NOT use SLAAC for this segment ────────
NetsTuts_R1(config-if)#ipv6 nd prefix 2001:db8:3::/64 no-autoconfig
NetsTuts_R1(config-if)#exit

NetsTuts_R1(config)#end
NetsTuts_R1#wr
Building configuration...
[OK]
  
Three commands work together to enforce stateful DHCPv6: ipv6 dhcp server STATEFUL-POOL binds the pool to this interface. ipv6 nd managed-config-flag sets M=1 in the RA — clients receiving this RA know they must request an address from a DHCPv6 server. ipv6 nd prefix 2001:db8:3::/64 no-autoconfig sets A=0 for this prefix in the RA — clients will not attempt to self-generate an address from this prefix using SLAAC. Without the no-autoconfig flag, clients would receive both a DHCPv6-assigned address AND a SLAAC-generated address — resulting in dual addressing which is undesirable in controlled environments.

Verify Stateful DHCPv6 Configuration

NetsTuts_R1#show ipv6 interface GigabitEthernet0/2
GigabitEthernet0/2 is up, line protocol is up
  IPv6 is enabled, link-local address is FE80::1
  Global unicast address(es):
    2001:DB8:3::1, subnet is 2001:DB8:3::/64
  ...
  ND router advertisements are sent every 200 seconds
  ND router advertisements live for 1800 seconds
  Hosts use DHCP to get their addresses and configuration.
  
The confirmation line — "Hosts use DHCP to get their addresses and configuration" — confirms M=1 is set and SLAAC is suppressed. This is distinct from both previous segments: no mention of "stateless autoconfig", clients are directed exclusively to DHCPv6 for their address assignment.

7. Step 5 — Verifying DHCPv6 Bindings and Client Addressing

show ipv6 dhcp binding — Stateful Clients

NetsTuts_R1#show ipv6 dhcp binding
Client: FE80::A6B1:C2FF:FED3:E4F5
  DUID: 00030001A4B1C2D3E4F5
  Username : unassigned
  VRF : default
  Interface : GigabitEthernet0/2
  IA NA: IA ID 0x00000001, T1 43200, T2 69120
    Address: 2001:DB8:3::10
            preferred lifetime 3600, valid lifetime 86400
            expires at Mar 08 2026 08:14:33 (86021 seconds)
Client: FE80::B7C2:D3FF:FEE4:F506
  DUID: 00030001B8C3D4E5F607
  Username : unassigned
  VRF : default
  Interface : GigabitEthernet0/2
  IA NA: IA ID 0x00000002, T1 43200, T2 69120
    Address: 2001:DB8:3::11
            preferred lifetime 3600, valid lifetime 86400
            expires at Mar 08 2026 08:15:01 (86049 seconds)
  
The binding table shows every active stateful DHCPv6 assignment. Client = the client's link-local address (used as the source for DHCPv6 messages — link-locals are unique per segment). DUID (DHCP Unique Identifier) = a globally unique client identifier — DHCPv6 uses DUIDs instead of MAC addresses for client identification, allowing address persistence across interface changes. IA NA (Identity Association for Non-temporary Addresses) = the assigned address block — IA ID is the client's identifier for this address, T1 is the renewal timer (50% of valid lifetime), T2 is the rebind timer (80% of valid lifetime). Address 2001:DB8:3::10 = the assigned IPv6 address. Note: stateless DHCPv6 clients on Gi0/1 do not appear here.

show ipv6 dhcp pool — Pool Statistics

NetsTuts_R1#show ipv6 dhcp pool
DHCPv6 pool: STATELESS-POOL
  DNS server: 2001:DB8::53
  DNS server: 2001:4860:4860::8888
  Domain name: netstuts.com
  Active clients: 0

DHCPv6 pool: STATEFUL-POOL
  Address allocation prefix: 2001:DB8:3::/64
    (excluded: 2001:DB8:3::1)
    valid lifetime 86400 preferred lifetime 3600
  DNS server: 2001:DB8::53
  Domain name: netstuts.com
  Active clients: 2
  
The contrast is clear: STATELESS-POOL always shows 0 active clients (stateless servers do not track clients), while STATEFUL-POOL shows 2 (two hosts have active leases). This is the most visible operational difference between the two DHCPv6 modes — the binding table and active client count.

show ipv6 dhcp interface — Per-Interface DHCPv6 Status

NetsTuts_R1#show ipv6 dhcp interface
GigabitEthernet0/1 is in server mode
  Using pool: STATELESS-POOL
  Preference value: 0
  Hint from client: ignored
  Rapid-Commit: disabled

GigabitEthernet0/2 is in server mode
  Using pool: STATEFUL-POOL
  Preference value: 0
  Hint from client: ignored
  Rapid-Commit: disabled
  

show ipv6 dhcp binding — Verify No Stateless Bindings

! ── Stateless clients are NOT in the binding table ───────
! ── Only stateful (Gi0/2) clients appear here ────────────
NetsTuts_R1#show ipv6 dhcp binding | count Client
2
  
Only 2 binding entries exist — the two stateful clients on Gi0/2. Hosts on Gi0/0 (SLAAC only) and Gi0/1 (stateless DHCPv6) are not in this table. From the router's perspective, it has no knowledge of which addresses those hosts are using — they chose their own addresses independently. This is a fundamental operational implication: if you need to know what address a specific host is using, stateful DHCPv6 is the only method that provides that visibility on the router.

Verify RA Flags with debug ipv6 nd

NetsTuts_R1#debug ipv6 nd
ICMPv6-ND: Sending RA to FF02::1 on GigabitEthernet0/0
    flags: M=0 O=0
    prefix 2001:DB8:1::/64 flags A=1 valid 2592000 preferred 604800

ICMPv6-ND: Sending RA to FF02::1 on GigabitEthernet0/1
    flags: M=0 O=1
    prefix 2001:DB8:2::/64 flags A=1 valid 2592000 preferred 604800

ICMPv6-ND: Sending RA to FF02::1 on GigabitEthernet0/2
    flags: M=1 O=0
    prefix 2001:DB8:3::/64 flags A=0 valid 2592000 preferred 604800

NetsTuts_R1#undebug all
  
The debug output confirms all three RA configurations simultaneously. Gi0/0 (M=0, O=0, A=1) = pure SLAAC. Gi0/1 (M=0, O=1, A=1) = stateless DHCPv6. Gi0/2 (M=1, O=0, A=0) = stateful DHCPv6 with SLAAC suppressed. This is the most direct way to confirm the RA flags are set correctly — always run undebug all immediately after to stop the debug output.

8. Step 6 — DHCPv6 Relay Agent

DHCPv6 clients send their Solicit messages to the link-local multicast address FF02::1:2. This multicast cannot cross router boundaries — if the DHCPv6 server is on a different subnet from the clients, a DHCPv6 relay agent must forward the messages. This is the IPv6 equivalent of the IPv4 ip helper-address command:

! ── Scenario: Clients on Gi0/2 need to reach a centralised
! ── DHCPv6 server at 2001:db8:ff::10 (on the WAN segment)
! ── instead of using the local pool on R1

! ── Remove the local server binding first ─────────────────
NetsTuts_R1(config)#interface GigabitEthernet0/2
NetsTuts_R1(config-if)#no ipv6 dhcp server STATEFUL-POOL

! ── Configure DHCPv6 relay on Gi0/2 pointing to the ──────
! ── centralised DHCPv6 server ────────────────────────────
NetsTuts_R1(config-if)#ipv6 dhcp relay destination 2001:db8:ff::10
NetsTuts_R1(config-if)#exit
  
ipv6 dhcp relay destination [server-IPv6-address] is the complete DHCPv6 relay configuration. When a client on Gi0/2 sends a DHCPv6 Solicit to FF02::1:2, R1 intercepts it and forwards a unicast Relay-Forward message to 2001:db8:ff::10. The server responds with a Relay-Reply, which R1 unwraps and delivers back to the client. The M and O flags on the interface remain in effect — the relay just changes where the DHCPv6 requests are forwarded, not how clients decide to use DHCPv6.

Verify Relay Configuration

NetsTuts_R1#show ipv6 dhcp interface GigabitEthernet0/2
GigabitEthernet0/2 is in relay mode
  Relay destinations:
    2001:DB8:FF::10
  
The interface now shows "is in relay mode" rather than "server mode". The relay destination is the centralised DHCPv6 server's address. Note that a single interface can relay to multiple DHCPv6 servers for redundancy by adding multiple ipv6 dhcp relay destination commands.

9. Side-by-Side Method Comparison

Characteristic SLAAC Only Stateless DHCPv6 Stateful DHCPv6
RA M flag 0 0 1
RA O flag 0 1 0 (or 1)
RA A flag 1 1 0 (use no-autoconfig)
Address source Client generates (EUI-64 or random) Client generates (EUI-64 or random) DHCPv6 server assigns
DNS delivered No Yes — via DHCPv6 Yes — via DHCPv6
Default gateway Router link-local (from RA) Router link-local (from RA) Router link-local (from RA)
Server tracks bindings No server involved No — stateless Yes — full binding table
Address predictability Unpredictable (EUI-64/random) Unpredictable (EUI-64/random) Controlled — server assigns specific addresses
Router config needed None beyond interface + unicast-routing DHCPv6 pool (no prefix) + O flag DHCPv6 pool (with prefix) + M flag + no-autoconfig
IOS verification show ipv6 interface show ipv6 dhcp pool (shows 0 clients) show ipv6 dhcp binding (shows all clients)

10. Verification Command Summary

Command What It Shows Primary Use
show ipv6 dhcp binding All active stateful DHCPv6 leases — client DUID, link-local, assigned address, lifetimes, interface Primary verification for stateful DHCPv6 — confirm clients received addresses and see lease expiry
show ipv6 dhcp pool All DHCPv6 pools — configuration (DNS, prefix, lifetime) and active client count Confirm pool config is correct — stateless shows 0 clients, stateful shows active lease count
show ipv6 dhcp interface Per-interface DHCPv6 mode (server or relay), pool name, rapid-commit status Confirm each interface is bound to the correct pool and operating in the right mode
show ipv6 interface [int] Full IPv6 interface detail — addresses, ND settings, RA interval/lifetime, M/O/A flag summary line Verify RA flags — the last line confirms "stateless autoconfig", "DHCP other config", or "DHCP addresses"
show ipv6 interface brief All IPv6 interfaces — status and addresses (link-local and global) Quick check that all interfaces have the correct IPv6 addresses and are up
show ipv6 neighbors IPv6 neighbour cache — equivalent of show ip arp for IPv6. See IPv6 Neighbour Discovery Confirm clients are reachable at Layer 3 — shows client link-locals and global addresses learned via NDP
show ipv6 routers Router entries learned from RAs (run on a host or another router) Verify RA is being received correctly — shows prefix, lifetime, and flags as seen by receiving device
debug ipv6 nd Live RA send/receive events — shows M, O, A flag values and prefix info in each RA Confirm exact RA content being sent — use briefly and always follow with undebug all
debug ipv6 dhcp Live DHCPv6 message exchange — Solicit, Advertise, Request, Reply, Information-Request Trace the full DHCPv6 handshake — see exactly what messages are sent and received per client
show ipv6 route IPv6 routing table — confirms routes for each prefix are present Verify IPv6 prefixes are in the routing table and reachable before troubleshooting DHCPv6

11. Troubleshooting DHCPv6 and SLAAC Issues

Problem Symptom Cause Fix
Clients not getting any IPv6 address Hosts on the segment have only a link-local address — no global unicast. No DHCPv6 bindings ipv6 unicast-routing is not enabled — the router is not sending RAs, so clients never learn the prefix or flags Verify with show run | include unicast-routing. If missing, add ipv6 unicast-routing in global config. Confirm RAs are being sent with debug ipv6 nd
Clients get SLAAC address but no DNS Hosts have a global IPv6 address (SLAAC working) but cannot resolve hostnames — no DNS server configured The O flag is not set — clients are not being told to contact DHCPv6 for additional configuration. Pure SLAAC (M=0, O=0) does not deliver DNS Add ipv6 nd other-config-flag on the interface and create a stateless DHCPv6 pool with dns-server. Bind the pool to the interface with ipv6 dhcp server [pool-name]
Stateful clients also get a SLAAC address Hosts on the stateful DHCPv6 segment have two global addresses — one from DHCPv6 and one self-generated M=1 was set but no-autoconfig was not applied to the prefix in the RA. Clients see M=1 (get address from DHCPv6) and A=1 (also do SLAAC) — both succeed Add ipv6 nd prefix 2001:db8:3::/64 no-autoconfig on the Gi0/2 interface to set A=0 for that prefix. Clients will then only use the DHCPv6-assigned address
No bindings in show ipv6 dhcp binding Stateful DHCPv6 configured but show ipv6 dhcp binding shows no entries even with active clients Most common causes: (1) the DHCPv6 pool is not bound to the interface with ipv6 dhcp server, (2) M flag is not set so clients never sent Solicit messages, (3) pool address prefix does not match the interface prefix Verify with show ipv6 dhcp interface [int] — confirms pool binding and mode. Check M flag with show ipv6 interface [int] last line. Use debug ipv6 dhcp to see if Solicit messages are arriving
DHCPv6 relay not working Clients on a relayed segment get no address — show ipv6 dhcp interface shows relay mode but clients fail The relay destination is unreachable — no route to the DHCPv6 server's address, or the server does not have a pool for this prefix. The relay uses unicast to forward to the server, so routing must work Verify the relay destination is reachable: ping ipv6 [server-address]. Confirm the DHCPv6 server has a pool covering the client's prefix. Check debug ipv6 dhcp on R1 to see if Relay-Forward is being sent and Relay-Reply is returning
Clients ignoring M=1 flag M flag confirmed set in RA debug but Windows/Linux clients still use SLAAC only Some client OS implementations (notably some Linux distributions with NetworkManager) do not fully honour the M flag and continue to use SLAAC unless explicitly configured otherwise. This is a client-side behaviour, not a router misconfiguration Verify the client OS IPv6 stack behaviour. On Linux: check NetworkManager or systemd-networkd DHCPv6 client setting. On Windows: netsh interface ipv6 show interface. As a workaround, suppress SLAAC on the router with no-autoconfig so clients have no choice but to use DHCPv6

Key Points & Exam Tips

  • IPv6 has three address assignment methods: SLAAC (client self-generates from RA prefix using EUI-64 or privacy extensions), Stateless DHCPv6 (SLAAC for address + DHCPv6 for DNS/options), and Stateful DHCPv6 (server assigns address and all config). The RA flags control which method clients use.
  • The three RA flags: M (Managed) = client must get address from DHCPv6; O (Other) = client must get other config (DNS) from DHCPv6; A (Autonomous) = client may use SLAAC. Pure SLAAC: M=0, O=0, A=1. Stateless DHCPv6: M=0, O=1, A=1. Stateful DHCPv6: M=1, O=0, A=0.
  • ipv6 unicast-routing must be enabled globally before any RA is sent. Without it, the router will not send Router Advertisements and clients cannot autoconfigure. This is the first thing to check when clients get no IPv6 address.
  • IOS commands to set RA flags: ipv6 nd managed-config-flag (sets M=1), ipv6 nd other-config-flag (sets O=1), ipv6 nd prefix [prefix] no-autoconfig (sets A=0 for that prefix). These are entered in interface configuration mode.
  • A stateless DHCPv6 pool has no address prefix command — it only contains DNS servers, domain names, and other options. A stateful pool has address prefix [prefix/len] lifetime [valid] [preferred]. This is the key syntax difference between the two pool types.
  • show ipv6 dhcp binding only shows stateful clients — stateless DHCPv6 clients are invisible in this table by design. If you need to know a host's IPv6 address, only stateful DHCPv6 provides that visibility from the router. SLAAC and stateless clients must be discovered via show ipv6 neighbors.
  • IPv6 default gateway is always the router's link-local address — not the global unicast address — regardless of which addressing method is used. The client learns this from the RA source address (the router's link-local). There is no DHCPv6 option for default gateway — this is intentional by design in IPv6.
  • DHCPv6 relay uses ipv6 dhcp relay destination [server-address] on the interface facing clients. This is the IPv6 equivalent of IPv4's ip helper-address. The relay forwards DHCPv6 Solicit messages to the server as unicast Relay-Forward messages.
  • For stateful DHCPv6, always use ipv6 nd prefix [prefix] no-autoconfig to suppress SLAAC on the same segment. Without it, clients receive M=1 (use DHCPv6) but A=1 is still set, causing dual-addressing where the client has both a DHCPv6-assigned and a SLAAC-generated address.
  • On the CCNA exam: know the M and O flag meanings, the three method combinations, the difference between stateless and stateful pool configurations (the address prefix command), that DHCPv6 does not provide the default gateway (RA does), and the commands to verify: show ipv6 dhcp binding, show ipv6 dhcp pool, and show ipv6 interface.
Next Steps: With IPv6 address assignment configured, the natural next step is routing between IPv6 segments. See OSPF Single-Area Configuration for adding OSPFv3 (IPv6 OSPF) to carry IPv6 routes between routers, or IPv6 Static Routing for simpler topologies. For securing IPv6 address assignment against rogue RAs and unauthorised DHCPv6 servers, explore RA Guard and DHCPv6 Guard — covered in DHCP Snooping & Dynamic ARP Inspection (the IPv6 equivalents use the same conceptual framework). To understand IPv6 addressing fundamentals including EUI-64 in depth, visit IPv6 Addressing and IPv6 Link-Local vs Global Unicast. For managing IPv6 NTP synchronisation using these same IPv6 addresses, see NTP Configuration.

TEST WHAT YOU LEARNED

1. A host receives a Router Advertisement with M=0, O=1, A=1. What addressing behaviour results?

Correct answer is B. The flag combination M=0, O=1, A=1 is the signature of stateless DHCPv6. M=0 means the client must NOT request an address from a DHCPv6 server. A=1 means the client SHOULD use SLAAC (autonomous configuration) to generate its own address from the prefix in the RA. O=1 means the client SHOULD contact a DHCPv6 server for "other" configuration — specifically DNS servers, domain names, and NTP. The DHCPv6 server responds to the client's Information-Request with these parameters but does not assign or record an address. This is why the active client count on a stateless pool always shows 0.

2. What is the mandatory first command before any IPv6 addressing method (SLAAC, stateless, or stateful DHCPv6) will work on a Cisco router?

Correct answer is D. ipv6 unicast-routing is the single most important IPv6 prerequisite on a Cisco router. Without it, the router operates in IPv6 host mode — it can have IPv6 addresses on interfaces but will not forward packets between interfaces and will not send Router Advertisements. Since all three IPv6 addressing methods rely on clients receiving an RA (to learn the prefix, flags, and default gateway), no client on any segment will be able to autoconfigure. This is the first thing to verify when IPv6 address assignment is not working. Option C (interface address) is necessary but not sufficient — the interface address alone does not trigger RA generation.

3. What is the key configuration difference between a stateless DHCPv6 pool and a stateful DHCPv6 pool on a Cisco router?

Correct answer is A. Both stateless and stateful DHCPv6 pools are created with the same ipv6 dhcp pool [name] command — there is no separate command for each type. The pool becomes stateless or stateful based solely on its contents. A pool with only dns-server and domain-name entries is stateless — it provides configuration but assigns no addresses. A pool with address prefix [prefix/len] lifetime [valid] [preferred] is stateful — it assigns addresses and records bindings. You can even have a single pool that provides both an address range and DNS servers — this is a fully stateful pool that happens to also deliver DNS.

4. Why does show ipv6 dhcp binding show zero entries for hosts using stateless DHCPv6 on Gi0/1, even when those hosts have successfully obtained DNS from the DHCPv6 server?

Correct answer is C. The word "stateless" directly describes this behaviour — no state is maintained on the server. In stateless DHCPv6, the client sends a DHCPv6 Information-Request (not a Solicit/Request for an address). The server responds with a Reply containing the requested options (DNS, domain name) and immediately forgets the exchange. There is no lease, no binding, no DUID recorded. The active client count in show ipv6 dhcp pool for the stateless pool will always show 0, even with 100 hosts actively using the DNS servers obtained from that pool. This is a fundamental operational implication: stateless DHCPv6 provides no address visibility from the router's perspective.

5. A host on the stateful DHCPv6 segment (Gi0/2) receives both a DHCPv6-assigned address AND a SLAAC-generated address. The M flag is confirmed as 1 in the RA. What is missing?

Correct answer is D. This is a common stateful DHCPv6 configuration oversight. M=1 in the RA header tells clients "use DHCPv6 for your address." However, the prefix information option within the same RA still has A=1 by default — which tells clients "you may also use SLAAC with this prefix." A compliant IPv6 client honours both instructions simultaneously, resulting in dual addressing. The fix is to explicitly suppress SLAAC for that prefix with ipv6 nd prefix 2001:db8:3::/64 no-autoconfig on the interface. This sets the A bit to 0 in the prefix information option, removing the SLAAC instruction. Option C (suppressing all RAs) would eliminate the default gateway — clients would lose their default gateway even if DHCPv6 still functioned, since DHCPv6 does not deliver gateway information.

6. How does an IPv6 client learn its default gateway — regardless of whether SLAAC, stateless, or stateful DHCPv6 is used?

Correct answer is B. This is one of the most important IPv6 design differences from IPv4. In IPv4, DHCPv4 Option 3 delivers the default gateway. In IPv6, DHCPv6 intentionally has no default gateway option — RFC 3315 explicitly excludes it. The default gateway is always delivered via the Router Advertisement. The RA is sourced from the router's link-local address (FE80::), and clients install this link-local address as their default gateway when they process the RA. This means even in a fully stateful DHCPv6 environment, the client still needs to receive a valid RA to get its default gateway. Suppressing all RAs on a client-facing interface (with ipv6 nd ra suppress all) would prevent clients from learning their default gateway even if DHCPv6 is fully functional.

7. What is the IPv6 DHCPv6 relay equivalent of IPv4's ip helper-address, and on which interface is it configured?

Correct answer is C. The command is ipv6 dhcp relay destination [server-address] and it is applied on the interface that faces the clients — the same placement logic as IPv4's ip helper-address. When a client sends a DHCPv6 Solicit to the link-local multicast FF02::1:2, the relay agent (the router) intercepts it, encapsulates it in a Relay-Forward message, and sends it as unicast to the server's address. The server processes it and responds with a Relay-Reply addressed back to the relay. The relay unwraps the Relay-Reply and delivers the DHCPv6 Reply to the client. Option D is the most common placement mistake — the relay belongs on the client-side interface, not the server-side interface.

8. In the output of show ipv6 dhcp binding, what does the DUID identify, and why does DHCPv6 use it instead of the MAC address used by DHCPv4?

Correct answer is A. DUID (DHCP Unique Identifier) is defined in RFC 8415 as a persistent, globally unique client identifier. DHCPv6 moved away from MAC addresses for several reasons: (1) a multi-homed device has multiple MACs but should be treated as one client, (2) if a NIC is replaced the MAC changes but the device should ideally retain the same address assignment, (3) privacy — DUIDs are less directly tied to physical hardware. There are three DUID types: DUID-LLT (link-layer address + timestamp, most common), DUID-EN (enterprise number assigned), and DUID-LL (link-layer only). Windows generates a DUID-LLT at first boot and stores it permanently. Option D is incorrect — while DUID-LL is based on the MAC, it is not EUI-64 derived and DUID-LLT includes a timestamp component making it non-predictable.

9. The last line of show ipv6 interface GigabitEthernet0/2 reads: "Hosts use DHCP to get their addresses and configuration." What does this confirm about the RA flags?

Correct answer is D. The last line of show ipv6 interface output is a human-readable summary of the M and O flag combination. IOS translates the raw flag bits into one of three phrases: (1) "Hosts use stateless autoconfig for addresses" = M=0, O=0 or M=0, O not relevant yet = pure SLAAC. (2) "Hosts use stateless autoconfig for addresses. Hosts use DHCP to get other configuration parameters" = M=0, O=1 = SLAAC + stateless DHCPv6. (3) "Hosts use DHCP to get their addresses and configuration" = M=1 = stateful DHCPv6 (O is implied when M=1). Memorising these three phrases as flag indicators is extremely useful for both the exam and real-world troubleshooting — it is the fastest way to confirm the addressing method without running debug commands.

10. An engineer configures a stateful DHCPv6 pool and applies it to an interface but show ipv6 dhcp binding remains empty after several minutes with active clients. show ipv6 interface Gi0/2 shows "Hosts use stateless autoconfig for addresses." What is the problem?

Correct answer is C. The diagnostic clue is in show ipv6 interface — "Hosts use stateless autoconfig for addresses" means M=0. The pool is configured and bound to the interface, but without M=1 in the RA, clients have no instruction to contact DHCPv6 for an address. They receive the RA prefix with A=1 (default), happily self-generate a SLAAC address, and never send a DHCPv6 Solicit. The binding table remains empty not because DHCPv6 is broken, but because no clients attempted to use it. The fix is to add ipv6 nd managed-config-flag on the Gi0/2 interface, which sets M=1 in the RA. After the next RA is sent (or the client sends an RS), clients will recognise M=1 and initiate the DHCPv6 Solicit → Advertise → Request → Reply exchange, creating binding entries.