Files
haza/pkt.go

149 lines
2.6 KiB
Go

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
}