package haza import "net" type Dhcp4Op = uint8 type Dhcp4Htype = uint8 type Dhcp4Msg = uint8 const ( _ Dhcp4Op = iota DHCP4_OP_BOOTREQUEST = 1 DHCP4_OP_BOOTREPLY = 2 ) const ( _ Dhcp4Htype = iota DHCP4_HTYPE_ETHER = 1 DHCP4_HTYPE_IEEE802 = 6 DHCP4_HTYPE_ARCNET = 7 DHCP4_HTYPE_APPLETALK = 8 DHCP4_HTYPE_HDLC = 17 DHCP4_HTYPE_ATM = 19 DHCP4_HTYPE_ARPSEC = 30 DHCP4_HTYPE_IPSEC = 31 DHCP4_HTYPE_INFINIBAND = 32 DHCP4_HTYPE_PUREIP = 35 ) const ( _ Dhcp4Msg = iota DHCP4_MSG_DISCOVER = 1 DHCP4_MSG_OFFER = 2 DHCP4_MSG_REQUEST = 3 DHCP4_MSG_DECLINE = 4 DHCP4_MSG_ACK = 5 DHCP4_MSG_NAK = 6 DHCP4_MSG_RELEASE = 7 DHCP4_MSG_INFORM = 8 DHCP4_MSG_FORCE_RENEW = 9 DHCP4_MSG_LEASE_QUERY = 10 DHCP4_MSG_LEASE_UNASSIGNED = 11 DHCP4_MSG_LEASE_UNKNOWN = 12 DHCP4_MSG_LEASE_ACTIVE = 13 DHCP4_MSG_BULK_LEASE_QUERY = 14 DHCP4_MSG_LEASE_QUERY_DONE = 15 DHCP4_MSG_ACTIVE_LEASE_QUERY = 16 DHCP4_MSG_LEASE_QUERY_STATUS = 17 DHCP4_MSG_TLS = 18 ) type Dhcp4Pkt struct { Op Dhcp4Op Htype Dhcp4Htype Hlen uint8 // length of Chaddr Hops uint8 Xid uint32 Secs uint16 Flags uint16 Ciaddr net.IP // uint32 Yiaddr net.IP // uint32 Siaddr net.IP // uint32 Gwaddr net.IP // uint32 Chaddr [16]byte Sname [64]byte // server host name File [128]byte // boot file name // options are placed after the header. // the first four bytes of the options compose a magic cookie // 0x63 0x82 0x53 0x63 } func (pkt *Dhcp4Pkt) Decode(b []byte) error { // fill the packet with data from the bytes var r *ByteReader var u8 byte var u16 uint16 var u32 uint32 var p Dhcp4Pkt var err error r = NewByteReader(b) u8, err = r.ReadByte() if err != nil { return err } p.Op = Dhcp4Op(u8) u8, err = r.ReadByte() if err != nil { return err } p.Htype = Dhcp4Htype(u8) u8, err = r.ReadByte() if err != nil { return err } p.Hlen = u8 u8, err = r.ReadByte() if err != nil { return err } p.Hops = u8 u32, err = r.ReadUint32() if err != nil { return err } p.Xid = u32 u16, err = r.ReadUint16() if err != nil { return err } p.Secs = u16 u16, err = r.ReadUint16() if err != nil { return err } p.Flags = u16 p.Ciaddr, err = r.ReadIp4() if err != nil { return err } p.Yiaddr, err = r.ReadIp4() if err != nil { return err } p.Siaddr, err = r.ReadIp4() if err != nil { return err } p.Gwaddr, err = r.ReadIp4() if err != nil { return err } err = r.ReadAllBytes(p.Chaddr[:]) if err != nil { return err } err = r.ReadAllBytes(p.Sname[:]) if err != nil { return err } err = r.ReadAllBytes(p.File[:]) if err != nil { return err } // magic // options.. *pkt = p return nil } func (pkt *Dhcp4Pkt) Encode() []byte { return nil }