func (c *client) request(cl *dhcp4client.Client) (bool, dhcp4.Packet, error) { defer trace.End(trace.Begin("")) dp, err := c.discoverPacket(cl) if err != nil { return false, nil, err } dp.PadToMinSize() if err = cl.SendPacket(dp); err != nil { return false, nil, err } var op dhcp4.Packet for { op, err = cl.GetOffer(&dp) if err != nil { return false, nil, err } if c.isCompletePacket(dhcp.NewPacket([]byte(op))) { break } } rp, err := c.requestPacket(cl, &op) if err != nil { return false, nil, err } rp.PadToMinSize() if err = cl.SendPacket(rp); err != nil { return false, nil, err } ack, err := cl.GetAcknowledgement(&rp) if err != nil { return false, nil, err } opts := ack.ParseOptions() if dhcp4.MessageType(opts[dhcp4.OptionDHCPMessageType][0]) == dhcp4.NAK { return false, nil, fmt.Errorf("Got NAK from DHCP server") } return true, ack, nil }