cmd/dhcpv4/dhcpv4.go (53 lines of code) (raw):
/*
Copyright (c) Facebook, Inc. and its affiliates.
All rights reserved.
This source code is licensed under the BSD-style license found in the
LICENSE file in the root directory of this source tree.
*/
package dhcpv4
import (
"net"
"github.com/facebookincubator/fbender/cmd/core/input"
"github.com/facebookincubator/fbender/cmd/core/options"
"github.com/facebookincubator/fbender/cmd/core/runner"
tester "github.com/facebookincubator/fbender/tester/dhcpv4"
"github.com/facebookincubator/fbender/utils"
"github.com/insomniacslk/dhcp/dhcpv4"
"github.com/insomniacslk/dhcp/dhcpv4/async"
"github.com/insomniacslk/dhcp/iana"
"github.com/spf13/cobra"
)
func params(cmd *cobra.Command, o *options.Options) (*runner.Params, error) {
optionCodes, err := GetOptionCodes(cmd.Flags(), "oro")
if err != nil {
return nil, err
}
r, err := input.NewRequestGenerator(o.Input, inputTransformer(optionCodes))
if err != nil {
//nolint:wrapcheck
return nil, err
}
t := &tester.Tester{
Target: utils.WithDefaultPort(o.Target, async.DefaultServerPort),
Timeout: o.Timeout,
BufferSize: o.BufferSize,
}
return &runner.Params{Tester: t, RequestGenerator: r}, nil
}
func inputTransformer(optionCodes []dhcpv4.OptionCode) input.Transformer {
defaultCodes := []dhcpv4.OptionCode{
dhcpv4.OptionSubnetMask,
dhcpv4.OptionRouter,
dhcpv4.OptionDomainName,
dhcpv4.OptionDomainNameServer,
}
return func(input string) (interface{}, error) {
mac, err := net.ParseMAC(input)
if err != nil {
//nolint:wrapcheck
return nil, err
}
discover, err := dhcpv4.New()
if err != nil {
//nolint:wrapcheck
return nil, err
}
discover.HWType = iana.HWTypeEthernet
discover.ClientHWAddr = mac
discover.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeDiscover))
optionCodes = append(optionCodes, defaultCodes...)
dhcpv4.WithRequestedOptions(optionCodes...)(discover)
return discover, nil
}
}