summaryrefslogtreecommitdiffhomepage
path: root/dhcpv6/client.go
diff options
context:
space:
mode:
authorAndrea Barberio <insomniac@slackware.it>2017-12-11 09:08:55 +0000
committerAndrea Barberio <insomniac@slackware.it>2017-12-11 09:08:55 +0000
commit5db858ce8450757dd7dff589c7d258213c3b7baa (patch)
treea7453167ff5466032aca36e762f55a15c7052891 /dhcpv6/client.go
parent4877803635767fc1481e747921563cfeff6a1212 (diff)
Refactored REQUEST code into NewRequestFromAdvertise
Diffstat (limited to 'dhcpv6/client.go')
-rw-r--r--dhcpv6/client.go71
1 files changed, 4 insertions, 67 deletions
diff --git a/dhcpv6/client.go b/dhcpv6/client.go
index 7d53334..e261688 100644
--- a/dhcpv6/client.go
+++ b/dhcpv6/client.go
@@ -141,74 +141,11 @@ func (c *Client) Solicit(ifname string, solicit DHCPv6) (DHCPv6, DHCPv6, error)
// the request, a reply if not nil, and an error if any
func (c *Client) Request(ifname string, advertise, request DHCPv6) (DHCPv6, DHCPv6, error) {
if request == nil {
- if advertise == nil {
- return nil, nil, fmt.Errorf("ADVERTISE and REQUEST cannot be both nil")
- }
- if advertise.Type() != ADVERTISE {
- return nil, nil, fmt.Errorf("The passed ADVERTISE must have ADVERTISE type set")
- }
- adv, ok := advertise.(*DHCPv6Message)
- if !ok {
- return nil, nil, fmt.Errorf("The passed ADVERTISE must be of DHCPv6Message type")
- }
- // build REQUEST from ADVERTISE
- req := DHCPv6Message{}
- req.SetMessage(REQUEST)
- req.SetTransactionID(adv.TransactionID())
- // add Client ID
- cid := adv.GetOneOption(OPTION_CLIENTID)
- if cid == nil {
- return nil, nil, fmt.Errorf("Client ID cannot be nil in ADVERTISE when building REQUEST")
- }
- req.AddOption(cid)
- // add Server ID
- sid := adv.GetOneOption(OPTION_SERVERID)
- if sid == nil {
- return nil, nil, fmt.Errorf("Server ID cannot be nil in ADVERTISE when building REQUEST")
- }
- req.AddOption(sid)
- // add Elapsed Time
- req.AddOption(&OptElapsedTime{})
- // add IA_NA
- iaNa := adv.GetOneOption(OPTION_IA_NA)
- if iaNa == nil {
- return nil, nil, fmt.Errorf("IA_NA cannot be nil in ADVERTISE when building REQUEST")
- }
- req.AddOption(iaNa)
- // add OptRequestedOption
- oro := OptRequestedOption{}
- oro.SetRequestedOptions([]OptionCode{
- OPT_BOOTFILE_URL,
- OPT_BOOTFILE_PARAM,
- })
- req.AddOption(&oro)
- // add OPTION_NII
- // TODO implement OptionNetworkInterfaceIdentifier
- nii := OptionGeneric{
- OptionCode: OPTION_NII,
- OptionData: []byte{
- 1, // UNDI - Universal Network Device Interface
- 3, 2, // UNDI rev. 3.2 - second generation EFI runtime driver support, see rfc4578
- },
- }
- req.AddOption(&nii)
- // add OPTION_CLIENT_ARCH_TYPE
- // TODO implement OptionClientArchType
- cat := OptionGeneric{
- OptionCode: OPTION_CLIENT_ARCH_TYPE,
- OptionData: []byte{
- 0, // Intel - see rfc4578
- 7, // EFI BC
- },
- }
- req.AddOption(&cat)
- // add OPTION_VENDOR_CLASS, only if present in the original request
- // TODO implement OptionVendorClass
- vClass := adv.GetOneOption(OPTION_VENDOR_CLASS)
- if vClass != nil {
- req.AddOption(vClass)
+ var err error
+ request, err = NewRequestFromAdvertise(advertise)
+ if err != nil {
+ return nil, nil, err
}
- request = &req
}
reply, err := c.sendReceive(ifname, request)
return request, reply, err