Files
go-dhcp/lease.go
2022-02-20 12:47:29 +01:00

68 lines
1.3 KiB
Go

package main
import (
"errors"
"fmt"
"time"
"go.uber.org/zap"
)
type ILeaseManager interface {
Request(xid TxId, clientAddr HwAddr) (*Lease, error)
Release(l Lease) error
Lookup(xid TxId) error
}
type LeaseManager struct {
leases map[TxId]Lease
count byte
}
func NewLeaseManager() *LeaseManager {
m := &LeaseManager{
leases: make(map[TxId]Lease),
}
return m
}
func (m *LeaseManager) Request(xid TxId, clientAddr HwAddr) (*Lease, error) {
zap.S().Debugf("LeaseManager.Request(%v, %v)", xid, clientAddr)
if m.count > 254 {
return nil, errors.New("lease address pool exhausted")
}
assigned := [4]byte{10, 0, 0, m.count + 2}
lease := Lease{
TransactionId: xid,
TTL: time.Now().Add(1 * time.Hour),
State: Requested,
ClientAddr: clientAddr,
Address: assigned,
}
m.leases[xid] = lease
m.count += 1
zap.S().Debug("lease=", lease)
return &lease, nil
}
func (m LeaseManager) Release(l Lease) error {
_, found := m.leases[l.TransactionId]
if !found {
return fmt.Errorf("invalid lease %v", l)
}
delete(m.leases, l.TransactionId)
return nil
}
func (m LeaseManager) Lookup(xid TxId) (*Lease, error) {
lease, found := m.leases[xid]
if found {
return &lease, nil
}
return nil, fmt.Errorf("no lease found for xid %v", xid)
}