func (l *DHCPLease) commit(ack *dhcp4.Packet) error { opts := ack.ParseOptions() leaseTime, err := parseLeaseTime(opts) if err != nil { return err } rebindingTime, err := parseRebindingTime(opts) if err != nil || rebindingTime > leaseTime { // Per RFC 2131 Section 4.4.5, it should default to 85% of lease time rebindingTime = leaseTime * 85 / 100 } renewalTime, err := parseRenewalTime(opts) if err != nil || renewalTime > rebindingTime { // Per RFC 2131 Section 4.4.5, it should default to 50% of lease time renewalTime = leaseTime / 2 } now := time.Now() l.expireTime = now.Add(leaseTime) l.renewalTime = now.Add(renewalTime) l.rebindingTime = now.Add(rebindingTime) l.ack = ack l.opts = opts return nil }
/* * Create Request Packet */ func (c *Client) RequestPacket(offerPacket *dhcp4.Packet) dhcp4.Packet { offerOptions := offerPacket.ParseOptions() packet := dhcp4.NewPacket(dhcp4.BootRequest) packet.SetCHAddr(c.hardwareAddr) packet.SetXId(offerPacket.XId()) packet.SetCIAddr(offerPacket.CIAddr()) packet.SetSIAddr(offerPacket.SIAddr()) packet.SetBroadcast(c.broadcast) packet.AddOption(dhcp4.OptionDHCPMessageType, []byte{byte(dhcp4.Request)}) packet.AddOption(dhcp4.OptionRequestedIPAddress, (offerPacket.YIAddr()).To4()) packet.AddOption(dhcp4.OptionServerIdentifier, offerOptions[dhcp4.OptionServerIdentifier]) //packet.PadToMinSize() return packet }
/* * Create Release Packet For a Release */ func (c *Client) ReleasePacket(acknowledgement *dhcp4.Packet) dhcp4.Packet { messageid := make([]byte, 4) if _, err := rand.Read(messageid); err != nil { panic(err) } acknowledgementOptions := acknowledgement.ParseOptions() packet := dhcp4.NewPacket(dhcp4.BootRequest) packet.SetCHAddr(acknowledgement.CHAddr()) packet.SetXId(messageid) packet.SetCIAddr(acknowledgement.YIAddr()) packet.AddOption(dhcp4.OptionDHCPMessageType, []byte{byte(dhcp4.Release)}) packet.AddOption(dhcp4.OptionServerIdentifier, acknowledgementOptions[dhcp4.OptionServerIdentifier]) //packet.PadToMinSize() return packet }