fix uppercase naming and rename Event related types to MonitorEvent

This commit is contained in:
Auztin Zhai 2023-12-12 21:29:42 -05:00
parent 8ebaf8696d
commit 0391c13f1e
2 changed files with 43 additions and 42 deletions

View File

@ -92,26 +92,26 @@ var (
monitorFlagsInitOnce sync.Once monitorFlagsInitOnce sync.Once
) )
type EventType int type MonitorEventType int
const ( const (
EventTypeNewTable EventType = unix.NFT_MSG_NEWTABLE MonitorEventTypeNewTable MonitorEventType = unix.NFT_MSG_NEWTABLE
EventTypeDelTable EventType = unix.NFT_MSG_DELTABLE MonitorEventTypeDelTable MonitorEventType = unix.NFT_MSG_DELTABLE
EventTypeNewChain EventType = unix.NFT_MSG_NEWCHAIN MonitorEventTypeNewChain MonitorEventType = unix.NFT_MSG_NEWCHAIN
EventTypeDELChain EventType = unix.NFT_MSG_DELCHAIN MonitorEventTypeDelChain MonitorEventType = unix.NFT_MSG_DELCHAIN
EventTypeNewRule EventType = unix.NFT_MSG_NEWRULE MonitorEventTypeNewRule MonitorEventType = unix.NFT_MSG_NEWRULE
EventTypeDelRule EventType = unix.NFT_MSG_DELRULE MonitorEventTypeDelRule MonitorEventType = unix.NFT_MSG_DELRULE
EventTypeNewSet EventType = unix.NFT_MSG_NEWSET MonitorEventTypeNewSet MonitorEventType = unix.NFT_MSG_NEWSET
EventTypeDelSet EventType = unix.NFT_MSG_DELSET MonitorEventTypeDelSet MonitorEventType = unix.NFT_MSG_DELSET
EventTypeNewSetElem EventType = unix.NFT_MSG_NEWSETELEM MonitorEventTypeNewSetElem MonitorEventType = unix.NFT_MSG_NEWSETELEM
EventTypeDelSetElem EventType = unix.NFT_MSG_DELSETELEM MonitorEventTypeDelSetElem MonitorEventType = unix.NFT_MSG_DELSETELEM
EventTypeNewObj EventType = unix.NFT_MSG_NEWOBJ MonitorEventTypeNewObj MonitorEventType = unix.NFT_MSG_NEWOBJ
EventTypeDelObj EventType = unix.NFT_MSG_DELOBJ MonitorEventTypeDelObj MonitorEventType = unix.NFT_MSG_DELOBJ
EventTypeOOB EventType = math.MaxInt MonitorEventTypeOOB MonitorEventType = math.MaxInt // out of band event
) )
type Event struct { type MonitorEvent struct {
Type EventType Type MonitorEventType
Data any Data any
Error error Error error
} }
@ -132,7 +132,7 @@ type Monitor struct {
// mu covers eventCh and status // mu covers eventCh and status
mu sync.Mutex mu sync.Mutex
eventCh chan *Event eventCh chan *MonitorEvent
status int status int
} }
@ -140,7 +140,7 @@ type MonitorOption func(*Monitor)
func WithMonitorEventBuffer(size int) MonitorOption { func WithMonitorEventBuffer(size int) MonitorOption {
return func(monitor *Monitor) { return func(monitor *Monitor) {
monitor.eventCh = make(chan *Event, size) monitor.eventCh = make(chan *MonitorEvent, size)
} }
} }
@ -167,7 +167,7 @@ func NewMonitor(opts ...MonitorOption) *Monitor {
opt(monitor) opt(monitor)
} }
if monitor.eventCh == nil { if monitor.eventCh == nil {
monitor.eventCh = make(chan *Event) monitor.eventCh = make(chan *MonitorEvent)
} }
objects, ok := monitorFlags[monitor.action] objects, ok := monitorFlags[monitor.action]
if !ok { if !ok {
@ -190,8 +190,8 @@ func (monitor *Monitor) monitor() {
break break
} else { } else {
// any other errors will be send to user, and then to close eventCh // any other errors will be send to user, and then to close eventCh
event := &Event{ event := &MonitorEvent{
Type: EventTypeOOB, Type: MonitorEventTypeOOB,
Data: nil, Data: nil,
Error: err, Error: err,
} }
@ -210,48 +210,48 @@ func (monitor *Monitor) monitor() {
switch msgType { switch msgType {
case unix.NFT_MSG_NEWTABLE, unix.NFT_MSG_DELTABLE: case unix.NFT_MSG_NEWTABLE, unix.NFT_MSG_DELTABLE:
table, err := tableFromMsg(msg) table, err := tableFromMsg(msg)
event := &Event{ event := &MonitorEvent{
Type: EventType(msgType), Type: MonitorEventType(msgType),
Data: table, Data: table,
Error: err, Error: err,
} }
monitor.eventCh <- event monitor.eventCh <- event
case unix.NFT_MSG_NEWCHAIN, unix.NFT_MSG_DELCHAIN: case unix.NFT_MSG_NEWCHAIN, unix.NFT_MSG_DELCHAIN:
chain, err := chainFromMsg(msg) chain, err := chainFromMsg(msg)
event := &Event{ event := &MonitorEvent{
Type: EventType(msgType), Type: MonitorEventType(msgType),
Data: chain, Data: chain,
Error: err, Error: err,
} }
monitor.eventCh <- event monitor.eventCh <- event
case unix.NFT_MSG_NEWRULE, unix.NFT_MSG_DELRULE: case unix.NFT_MSG_NEWRULE, unix.NFT_MSG_DELRULE:
rule, err := parseRuleFromMsg(msg) rule, err := parseRuleFromMsg(msg)
event := &Event{ event := &MonitorEvent{
Type: EventType(msgType), Type: MonitorEventType(msgType),
Data: rule, Data: rule,
Error: err, Error: err,
} }
monitor.eventCh <- event monitor.eventCh <- event
case unix.NFT_MSG_NEWSET, unix.NFT_MSG_DELSET: case unix.NFT_MSG_NEWSET, unix.NFT_MSG_DELSET:
set, err := setsFromMsg(msg) set, err := setsFromMsg(msg)
event := &Event{ event := &MonitorEvent{
Type: EventType(msgType), Type: MonitorEventType(msgType),
Data: set, Data: set,
Error: err, Error: err,
} }
monitor.eventCh <- event monitor.eventCh <- event
case unix.NFT_MSG_NEWSETELEM, unix.NFT_MSG_DELSETELEM: case unix.NFT_MSG_NEWSETELEM, unix.NFT_MSG_DELSETELEM:
elems, err := elementsFromMsg(uint8(TableFamilyUnspecified), msg) elems, err := elementsFromMsg(uint8(TableFamilyUnspecified), msg)
event := &Event{ event := &MonitorEvent{
Type: EventType(msgType), Type: MonitorEventType(msgType),
Data: elems, Data: elems,
Error: err, Error: err,
} }
monitor.eventCh <- event monitor.eventCh <- event
case unix.NFT_MSG_NEWOBJ, unix.NFT_MSG_DELOBJ: case unix.NFT_MSG_NEWOBJ, unix.NFT_MSG_DELOBJ:
obj, err := objFromMsg(msg) obj, err := objFromMsg(msg)
event := &Event{ event := &MonitorEvent{
Type: EventType(msgType), Type: MonitorEventType(msgType),
Data: obj, Data: obj,
Error: err, Error: err,
} }
@ -264,25 +264,26 @@ func (monitor *Monitor) monitor() {
if monitor.status != monitorClosed { if monitor.status != monitorClosed {
monitor.status = monitorClosed monitor.status = monitorClosed
monitor.closer() }
close(monitor.eventCh) close(monitor.eventCh)
} }
}
func (monitor *Monitor) Close() { func (monitor *Monitor) Close() error {
monitor.mu.Lock() monitor.mu.Lock()
defer monitor.mu.Unlock() defer monitor.mu.Unlock()
if monitor.status != monitorClosed { if monitor.status != monitorClosed {
monitor.status = monitorClosed monitor.status = monitorClosed
monitor.closer() return monitor.closer()
close(monitor.eventCh)
} }
return nil
} }
// AddMonitor to perform the monitor immediately. The channel will be closed after // AddMonitor to perform the monitor immediately. The channel will be closed after
// calling Close on Monitor or encountering a netlink conn error while Receive. // calling Close on Monitor or encountering a netlink conn error while Receive.
func (cc *Conn) AddMonitor(monitor *Monitor) (chan *Event, error) { // Caller may receive a MonitorEventTypeOOB event which contains an error we didn't
// handle, for now.
func (cc *Conn) AddMonitor(monitor *Monitor) (chan *MonitorEvent, error) {
conn, closer, err := cc.netlinkConn() conn, closer, err := cc.netlinkConn()
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -48,13 +48,13 @@ func TestMonitor(t *testing.T) {
return return
} }
switch event.Type { switch event.Type {
case nftables.EventTypeNewTable: case nftables.MonitorEventTypeNewTable:
gotTable = event.Data.(*nftables.Table) gotTable = event.Data.(*nftables.Table)
atomic.AddInt32(&count, 1) atomic.AddInt32(&count, 1)
case nftables.EventTypeNewChain: case nftables.MonitorEventTypeNewChain:
gotChain = event.Data.(*nftables.Chain) gotChain = event.Data.(*nftables.Chain)
atomic.AddInt32(&count, 1) atomic.AddInt32(&count, 1)
case nftables.EventTypeNewRule: case nftables.MonitorEventTypeNewRule:
gotRule = event.Data.(*nftables.Rule) gotRule = event.Data.(*nftables.Rule)
atomic.AddInt32(&count, 1) atomic.AddInt32(&count, 1)
} }