forked from betawaffle/dhcp4-go
-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathack.go
More file actions
90 lines (72 loc) · 2.03 KB
/
Copy pathack.go
File metadata and controls
90 lines (72 loc) · 2.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package dhcp4
import "encoding/binary"
// Ack is a server to client packet with configuration parameters,
// including committed network address.
type Ack struct {
Packet
msg *Packet
}
func CreateAck(msg *Packet) Ack {
rep := Ack{
Packet: NewReply(msg),
msg: msg,
}
rep.SetMessageType(MessageTypeAck)
return rep
}
// From RFC2131, table 3:
// Option DHCPACK
// ------ -------
// Requested IP address MUST NOT
// IP address lease time MUST (DHCPREQUEST)
// MUST NOT (DHCPINFORM)
// Use 'file'/'sname' fields MAY
// DHCP message type DHCPACK
// Parameter request list MUST NOT
// Message SHOULD
// Client identifier MUST NOT
// Vendor class identifier MAY
// Server identifier MUST
// Maximum message size MUST NOT
// All others MAY
var dhcpAckOnRequestValidation = []Validation{
ValidateMust(OptionAddressTime),
}
var dhcpAckOnInformValidation = []Validation{
ValidateMustNot(OptionAddressTime),
}
var dhcpAckValidation = []Validation{
ValidateMustNot(OptionAddressRequest),
ValidateMustNot(OptionParameterList),
ValidateMustNot(OptionClientID),
ValidateMust(OptionDHCPServerID),
ValidateMustNot(OptionDHCPMaxMsgSize),
}
func (d *Ack) Validate() error {
var err error
// Validation is subtly different based on type of request
switch d.msg.GetMessageType() {
case MessageTypeRequest:
err = Validate(d.Packet, dhcpAckOnRequestValidation)
case MessageTypeInform:
err = Validate(d.Packet, dhcpAckOnInformValidation)
}
if err != nil {
return err
}
return Validate(d.Packet, dhcpAckValidation)
}
func (d *Ack) ToBytes() ([]byte, error) {
opts := packetToBytesOptions{}
// Copy MaxMsgSize if set in the request
if v, ok := d.Message().GetOption(OptionDHCPMaxMsgSize); ok {
opts.maxLen = binary.BigEndian.Uint16(v)
}
return PacketToBytes(d.Packet, &opts)
}
func (d *Ack) Message() *Packet {
return d.msg
}
func (d *Ack) Reply() *Packet {
return &d.Packet
}