68 lines
1.3 KiB
Go
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)
|
|
}
|