/* * Create Discover Packet */ func (c *Client) DiscoverPacket() dhcp4.Packet { messageid := make([]byte, 4) if _, err := rand.Read(messageid); err != nil { panic(err) } packet := dhcp4.NewPacket(dhcp4.BootRequest) packet.SetCHAddr(c.hardwareAddr) packet.SetXId(messageid) packet.SetBroadcast(c.broadcast) packet.AddOption(dhcp4.OptionDHCPMessageType, []byte{byte(dhcp4.Discover)}) //packet.PadToMinSize() return packet }
/* * Create DHCP Offer Packet */ func (s *Server) OfferPacket(discoverPacket dhcp4.Packet) dhcp4.Packet { offerPacket := dhcp4.NewPacket(dhcp4.BootReply) offerPacket.SetXId(discoverPacket.XId()) offerPacket.SetFlags(discoverPacket.Flags()) offerPacket.SetCHAddr(discoverPacket.CHAddr()) offerPacket.SetGIAddr(discoverPacket.GIAddr()) offerPacket.SetSecs(discoverPacket.Secs()) //53 offerPacket.AddOption(dhcp4.OptionDHCPMessageType, []byte{byte(dhcp4.Offer)}) //54 offerPacket.AddOption(dhcp4.OptionServerIdentifier, s.ip.To4()) //51 offerPacket.AddOption(dhcp4.OptionIPAddressLeaseTime, dhcp4.OptionsLeaseTime(s.leaseDuration)) //Other options go in requested order... discoverPacketOptions := discoverPacket.ParseOptions() ourOptions := make(dhcp4.Options) //1 ourOptions[dhcp4.OptionSubnetMask] = s.subnetMask.To4() //3 ourOptions[dhcp4.OptionRouter] = s.defaultGateway.To4() //6 ourOptions[dhcp4.OptionDomainNameServer] = dhcp4.JoinIPs(s.dnsServers) if discoverPacketOptions[dhcp4.OptionParameterRequestList] != nil { //Loop through the requested options and if we have them add them. for _, optionCode := range discoverPacketOptions[dhcp4.OptionParameterRequestList] { if !bytes.Equal(ourOptions[dhcp4.OptionCode(optionCode)], []byte{}) { offerPacket.AddOption(dhcp4.OptionCode(optionCode), ourOptions[dhcp4.OptionCode(optionCode)]) delete(ourOptions, dhcp4.OptionCode(optionCode)) } } } //Add all the options not requested. for optionCode, optionValue := range ourOptions { offerPacket.AddOption(optionCode, optionValue) } return offerPacket }
/* * Create DHCP Decline */ func (s *Server) DeclinePacket(requestPacket dhcp4.Packet) dhcp4.Packet { declinePacket := dhcp4.NewPacket(dhcp4.BootReply) declinePacket.SetXId(requestPacket.XId()) declinePacket.SetFlags(requestPacket.Flags()) declinePacket.SetGIAddr(requestPacket.GIAddr()) declinePacket.SetCHAddr(requestPacket.CHAddr()) declinePacket.SetSecs(requestPacket.Secs()) declinePacket.AddOption(dhcp4.OptionDHCPMessageType, []byte{byte(dhcp4.NAK)}) declinePacket.AddOption(dhcp4.OptionSubnetMask, s.subnetMask.To4()) declinePacket.AddOption(dhcp4.OptionRouter, s.defaultGateway.To4()) declinePacket.AddOption(dhcp4.OptionDomainNameServer, dhcp4.JoinIPs(s.dnsServers)) declinePacket.AddOption(dhcp4.OptionServerIdentifier, s.ip.To4()) return declinePacket }
/* * 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 }
func TestSetOptions(t *testing.T) { id, err := NewID(0, dummyHWAddr) assert.NoError(t, err) c := &client{ id: id, } p := dhcp4.NewPacket(dhcp4.BootRequest) var tests = []struct { prl []byte }{ { prl: []byte{ byte(dhcp4.OptionSubnetMask), byte(dhcp4.OptionRouter), }, }, { prl: []byte{ byte(dhcp4.OptionSubnetMask), byte(dhcp4.OptionRouter), byte(dhcp4.OptionNameServer), }, }, } for _, te := range tests { c.SetParameterRequestList(te.prl...) p, err := c.setOptions(p) assert.NoError(t, err) assert.NotEmpty(t, p) opts := p.ParseOptions() prl := opts[dhcp4.OptionParameterRequestList] assert.NotNil(t, prl) assert.EqualValues(t, te.prl, prl) // packet should have client id set cid := opts[dhcp4.OptionClientIdentifier] assert.NotNil(t, cid) b, _ := id.MarshalBinary() assert.EqualValues(t, cid, b) } }
func DHCPDeclinePacket(hw net.HardwareAddr, ip net.IP, 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(hw) packet.SetCIAddr(ip) packet.SetXId(messageid) packet.SetBroadcast(false) packet.AddOption(dhcp4.OptionDHCPMessageType, []byte{byte(dhcp4.Decline)}) packet.AddOption(dhcp4.OptionServerIdentifier, acknowledgementOptions[dhcp4.OptionServerIdentifier]) 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 }