feat: Working lease manager
This commit is contained in:
50
main.go
50
main.go
@@ -4,12 +4,13 @@ import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"net"
|
||||
"time"
|
||||
"unsafe"
|
||||
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
var manager = NewLeaseManager()
|
||||
|
||||
var leases []Lease = make([]Lease, 0)
|
||||
|
||||
func (dhcp DhcpMessage) Debug(s *zap.SugaredLogger) {
|
||||
@@ -59,10 +60,12 @@ out:
|
||||
return options
|
||||
}
|
||||
|
||||
func prepareOffer(request DhcpMessage) DhcpMessage {
|
||||
func prepareOffer(request DhcpMessage, lease Lease) DhcpMessage {
|
||||
var sname [64]byte
|
||||
var file [128]byte
|
||||
var siaddr Ipv4Addr
|
||||
copy(sname[:], "go-dhcp-server")
|
||||
copy(siaddr[:], net.IPv4(10, 0, 0, 1).To4())
|
||||
|
||||
dhcp := DhcpMessage{
|
||||
Op: BOOTREPLY,
|
||||
@@ -71,20 +74,20 @@ func prepareOffer(request DhcpMessage) DhcpMessage {
|
||||
Hops: 0,
|
||||
Secs: 0,
|
||||
Flags: request.Flags,
|
||||
Xid: request.Xid,
|
||||
Siaddr: binary.BigEndian.Uint32(net.IPv4(10, 0, 0, 1).To4()),
|
||||
Ciaddr: 0,
|
||||
Yiaddr: binary.BigEndian.Uint32(net.IPv4(10, 0, 0, 2).To4()),
|
||||
Xid: lease.TransactionId,
|
||||
Siaddr: siaddr,
|
||||
Ciaddr: [4]byte{0, 0, 0, 0},
|
||||
Yiaddr: lease.Address,
|
||||
Giaddr: request.Giaddr,
|
||||
Chaddr: request.Chaddr,
|
||||
Magic: [4]byte{0x63, 0x82, 0x53, 0x63},
|
||||
Magic: magic,
|
||||
Sname: sname,
|
||||
File: file,
|
||||
}
|
||||
return dhcp
|
||||
}
|
||||
|
||||
func prepareAck(request DhcpMessage) DhcpMessage {
|
||||
func prepareAck(request DhcpMessage, lease Lease) DhcpMessage {
|
||||
var sname [64]byte
|
||||
var file [128]byte
|
||||
copy(sname[:], "go-dhcp-server")
|
||||
@@ -97,12 +100,12 @@ func prepareAck(request DhcpMessage) DhcpMessage {
|
||||
Secs: 0,
|
||||
Flags: 0,
|
||||
Xid: request.Xid,
|
||||
Siaddr: binary.BigEndian.Uint32(net.IPv4(10, 0, 0, 1).To4()),
|
||||
Siaddr: lease.Address,
|
||||
Ciaddr: request.Ciaddr,
|
||||
Yiaddr: binary.BigEndian.Uint32(net.IPv4(10, 0, 0, 2).To4()),
|
||||
Yiaddr: lease.Address,
|
||||
Giaddr: request.Giaddr,
|
||||
Chaddr: request.Chaddr,
|
||||
Magic: [4]byte{0x63, 0x82, 0x53, 0x63},
|
||||
Magic: magic,
|
||||
Sname: sname,
|
||||
File: file,
|
||||
}
|
||||
@@ -151,7 +154,11 @@ func sendMessage(conn *net.UDPConn, message DhcpMessage, options []Option) error
|
||||
func handleOffer(dhcp DhcpMessage, remote *net.UDPAddr) error {
|
||||
s := zap.S()
|
||||
|
||||
offer := prepareOffer(dhcp)
|
||||
lease, err := manager.Request(dhcp.Xid, dhcp.Chaddr)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
offer := prepareOffer(dhcp, *lease)
|
||||
localAddr, _ := net.ResolveUDPAddr("udp", "172.17.0.1:68")
|
||||
clientAddr, _ := net.ResolveUDPAddr("udp", "255.255.255.255:68")
|
||||
conn, err := net.DialUDP("udp", localAddr, clientAddr)
|
||||
@@ -174,7 +181,12 @@ func handleOffer(dhcp DhcpMessage, remote *net.UDPAddr) error {
|
||||
func handleAck(dhcp DhcpMessage, remote *net.UDPAddr) error {
|
||||
s := zap.S()
|
||||
|
||||
ack := prepareAck(dhcp)
|
||||
lease, err := manager.Lookup(dhcp.Xid)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
ack := prepareAck(dhcp, *lease)
|
||||
|
||||
options := []Option{
|
||||
{
|
||||
@@ -199,15 +211,11 @@ func handleAck(dhcp DhcpMessage, remote *net.UDPAddr) error {
|
||||
s.Info("Sending DHCPACK")
|
||||
sendMessage(conn, ack, options)
|
||||
|
||||
lease := Lease{
|
||||
TransactionId: ack.Xid,
|
||||
TTL: time.Now().Add(1 * time.Hour),
|
||||
State: Requested,
|
||||
ClientAddr: ack.Chaddr,
|
||||
Address: int2ip(ack.Yiaddr),
|
||||
lease, err = manager.Request(dhcp.Xid, dhcp.Chaddr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
leases = append(leases, lease)
|
||||
|
||||
s.Debug("Found lease", lease)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user