summaryrefslogtreecommitdiffhomepage
path: root/dhcpv4/options.go
diff options
context:
space:
mode:
Diffstat (limited to 'dhcpv4/options.go')
-rw-r--r--dhcpv4/options.go43
1 files changed, 17 insertions, 26 deletions
diff --git a/dhcpv4/options.go b/dhcpv4/options.go
index 989a93b..6576c05 100644
--- a/dhcpv4/options.go
+++ b/dhcpv4/options.go
@@ -10,6 +10,7 @@ type OptionCode byte
var MagicCookie = []byte{99, 130, 83, 99}
+// TODO: implement Option as an interface similar to dhcpv6.
type Option struct {
Code OptionCode
Data []byte
@@ -38,27 +39,27 @@ func ParseOption(dataStart []byte) (*Option, error) {
}
}
-// OptionsFromBytesWithMagicCookie parses a sequence of bytes until the end and
-// builds a list of options from it. The sequence must contain the Magic Cookie.
-// Returns an error if any invalid option or length is found.
-func OptionsFromBytesWithMagicCookie(data []byte) ([]Option, error) {
+// OptionsFromBytes parses a sequence of bytes until the end and builds a list
+// of options from it. The sequence must contain the Magic Cookie. Returns an
+// error if any invalid option or length is found.
+func OptionsFromBytes(data []byte) ([]Option, error) {
if len(data) < len(MagicCookie) {
return nil, errors.New("Invalid options: shorter than 4 bytes")
}
if !bytes.Equal(data[:len(MagicCookie)], MagicCookie) {
return nil, fmt.Errorf("Invalid Magic Cookie: %v", data[:len(MagicCookie)])
}
- opts, err := OptionsFromBytes(data[len(MagicCookie):])
+ opts, err := OptionsFromBytesWithoutMagicCookie(data[len(MagicCookie):])
if err != nil {
return nil, err
}
return opts, nil
}
-// OptionsFromBytes parses a sequence of bytes until the end and builds a list
-// of options from it. The sequence should not contain the DHCP magic cookie.
-// Returns an error if any invalid option or length is found.
-func OptionsFromBytes(data []byte) ([]Option, error) {
+// OptionsFromBytesWithoutMagicCookie parses a sequence of bytes until the end
+// and builds a list of options from it. The sequence should not contain the
+// DHCP magic cookie. Returns an error if any invalid option or length is found.
+func OptionsFromBytesWithoutMagicCookie(data []byte) ([]Option, error) {
options := make([]Option, 0, 10)
idx := 0
for {
@@ -86,15 +87,15 @@ func OptionsFromBytes(data []byte) ([]Option, error) {
return options, nil
}
-// OptionsToBytesWithMagicCookie converts a list of options to a wire-format
-// representation with the DHCP magic cookie prepended.
-func OptionsToBytesWithMagicCookie(options []Option) []byte {
- ret := MagicCookie
- return append(ret, OptionsToBytes(options)...)
+// OptionsToBytes converts a list of options to a wire-format representation
+// with the DHCP magic cookie prepended.
+func OptionsToBytes(options []Option) []byte {
+ return append(MagicCookie, OptionsToBytesWithoutMagicCookie(options)...)
}
-// OptionsToBytes converts a list of options to a wire-format representation.
-func OptionsToBytes(options []Option) []byte {
+// OptionsToBytesWithoutMagicCookie converts a list of options to a wire-format
+// representation.
+func OptionsToBytesWithoutMagicCookie(options []Option) []byte {
ret := []byte{}
for _, opt := range options {
ret = append(ret, opt.ToBytes()...)
@@ -110,16 +111,6 @@ func (o *Option) String() string {
return fmt.Sprintf("%v -> %v", code, o.Data)
}
-// BSDPString converts a BSDP-specific option embedded in
-// vendor-specific information to a human-readable string.
-func (o *Option) BSDPString() string {
- code, ok := BSDPOptionCodeToString[o.Code]
- if !ok {
- code = "Unknown"
- }
- return fmt.Sprintf("%v -> %v", code, o.Data)
-}
-
func (o *Option) ToBytes() []byte {
// Convert a single option to its wire-format representation
ret := []byte{byte(o.Code)}