summaryrefslogtreecommitdiffhomepage
path: root/dhcpv4/bsdp/bsdp.go
diff options
context:
space:
mode:
authorSean Karlage <skarlage@get9.io>2018-07-27 05:08:54 -0500
committerinsomniac <insomniacslk@users.noreply.github.com>2018-07-27 11:08:54 +0100
commit2a351e5524c5bbeb4a0a739e9b18da82959c12c9 (patch)
tree7981548c1e6b6e0fa77c2f0e81cc30e1f26a1690 /dhcpv4/bsdp/bsdp.go
parentf30a11ae5ebae448845298738868750e1b65f791 (diff)
BSDP: Refactor to use dhcpv4.GetOneOption (#94)
Refactors BSDP code to use `dhcpv4.GetOneOption` instead of manually searching through the list of options.
Diffstat (limited to 'dhcpv4/bsdp/bsdp.go')
-rw-r--r--dhcpv4/bsdp/bsdp.go29
1 files changed, 13 insertions, 16 deletions
diff --git a/dhcpv4/bsdp/bsdp.go b/dhcpv4/bsdp/bsdp.go
index bb5166e..51ec20c 100644
--- a/dhcpv4/bsdp/bsdp.go
+++ b/dhcpv4/bsdp/bsdp.go
@@ -18,17 +18,17 @@ const MaxDHCPMessageSize = 1500
// ACK[LIST] packet and returns them as a list of BootImages.
func ParseBootImageListFromAck(ack dhcpv4.DHCPv4) ([]BootImage, error) {
var images []BootImage
- for _, opt := range ack.Options() {
- if opt.Code() == dhcpv4.OptionVendorSpecificInformation {
- vendorOpt, err := ParseOptVendorSpecificInformation(opt.ToBytes())
- if err != nil {
- return nil, err
- }
- bootImageOpts := vendorOpt.GetOptions(OptionBootImageList)
- for _, opt := range bootImageOpts {
- images = append(images, opt.(*OptBootImageList).Images...)
- }
- }
+ opt := ack.GetOneOption(dhcpv4.OptionVendorSpecificInformation)
+ if opt == nil {
+ return nil, errors.New("ParseBootImageListFromAck: could not find vendor-specific option")
+ }
+ vendorOpt, err := ParseOptVendorSpecificInformation(opt.ToBytes())
+ if err != nil {
+ return nil, err
+ }
+ bootImageOpts := vendorOpt.GetOptions(OptionBootImageList)
+ for _, opt := range bootImageOpts {
+ images = append(images, opt.(*OptBootImageList).Images...)
}
return images, nil
}
@@ -109,11 +109,8 @@ func InformSelectForAck(ack dhcpv4.DHCPv4, replyPort uint16, selectedImage BootI
// Find server IP address
var serverIP net.IP
- // TODO replace this loop with `ack.GetOneOption(OptionBootImageList)`
- for _, opt := range ack.Options() {
- if opt.Code() == dhcpv4.OptionServerIdentifier {
- serverIP = opt.(*dhcpv4.OptServerIdentifier).ServerID
- }
+ if opt := ack.GetOneOption(dhcpv4.OptionServerIdentifier); opt != nil {
+ serverIP = opt.(*dhcpv4.OptServerIdentifier).ServerID
}
if serverIP.To4() == nil {
return nil, fmt.Errorf("could not parse server identifier from ACK")