added some dhcp4 packet functions and generic byte reading functions
This commit is contained in:
148
pkt.go
Normal file
148
pkt.go
Normal file
@ -0,0 +1,148 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user