github.com/mem/u-root@v2.0.1-0.20181004165302-9b18b4636a33+incompatible/pkg/dhclient/dhcp6.go (about)

     1  // Copyright 2017-2018 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package dhclient
     6  
     7  import (
     8  	"net"
     9  	"net/url"
    10  	"strings"
    11  
    12  	"github.com/mdlayher/dhcp6"
    13  	"github.com/mdlayher/dhcp6/dhcp6opts"
    14  )
    15  
    16  // Packet6 implements Packet for IPv6 DHCP.
    17  type Packet6 struct {
    18  	p    *dhcp6.Packet
    19  	iana *dhcp6opts.IANA
    20  }
    21  
    22  // NewPacket6 wraps a DHCPv6 packet with some convenience methods.
    23  func NewPacket6(p *dhcp6.Packet, ianaLease *dhcp6opts.IANA) *Packet6 {
    24  	return &Packet6{
    25  		p:    p,
    26  		iana: ianaLease,
    27  	}
    28  }
    29  
    30  // Lease returns lease information assigned.
    31  func (p *Packet6) Lease() *dhcp6opts.IAAddr {
    32  	// TODO: Can a DHCPv6 server return multiple IAAddrs for one IANA?
    33  	// There certainly doesn't seem to be a way to request multiple other
    34  	// than requesting multiple IANAs.
    35  	iaAddrs, err := dhcp6opts.GetIAAddr(p.iana.Options)
    36  	if err != nil || len(iaAddrs) == 0 {
    37  		return nil
    38  	}
    39  
    40  	return iaAddrs[0]
    41  }
    42  
    43  // DNS returns DNS servers assigned.
    44  func (p *Packet6) DNS() []net.IP {
    45  	// TODO: Would the IANA contain this, or the packet?
    46  	ips, err := dhcp6opts.GetDNSServers(p.p.Options)
    47  	if err != nil {
    48  		return nil
    49  	}
    50  	return []net.IP(ips)
    51  }
    52  
    53  // Boot returns the boot file URL and parameters assigned.
    54  //
    55  // TODO: RFC 5970 is helpfully avoidant of where these options are used. Are
    56  // they added to the packet? Are they added to an IANA?  It *seems* like it's
    57  // in the packet.
    58  func (p *Packet6) Boot() (url.URL, string, error) {
    59  	uri, err := dhcp6opts.GetBootFileURL(p.p.Options)
    60  	if err != nil {
    61  		return url.URL{}, "", err
    62  	}
    63  
    64  	// Having this value is optional.
    65  	bfp, err := dhcp6opts.GetBootFileParam(p.p.Options)
    66  	if err != dhcp6.ErrOptionNotPresent {
    67  		return url.URL{}, "", err
    68  	}
    69  
    70  	var cmdline string
    71  	if bfp != nil {
    72  		cmdline = strings.Join(bfp, " ")
    73  	}
    74  	return url.URL(*uri), cmdline, nil
    75  }