-
Notifications
You must be signed in to change notification settings - Fork 16
/
entry.go
192 lines (174 loc) · 5.78 KB
/
entry.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
package ipset
import (
"net"
"time"
"github.com/ti-mo/netfilter"
)
type Entry struct {
Bytes *UInt64Box
CadtFlags *UInt32Box
Cidr2 *UInt8Box
Cidr *UInt8Box
Comment *NullStringBox
Ether *HardwareAddrBox
Iface *NullStringBox
IP2To *IPAddrBox
IP2 *IPAddrBox
IPTo *IPAddrBox
IP *IPAddrBox
Lineno *NetUInt32Box
Mark *UInt32Box
Packets *UInt64Box
PortTo *UInt16Box
Port *UInt16Box
Proto *UInt8Box
Skbmark *UInt64Box
Skbprio *UInt32Box
Skbqueue *UInt16Box
Timeout *UInt32SecondsDurationBox
}
type EntryOption func(*Entry)
func EntryBytes(v uint64) EntryOption { return func(e *Entry) { e.Bytes = NewUInt64Box(v) } }
func EntryCadtFlags(v uint32) EntryOption { return func(e *Entry) { e.CadtFlags = NewUInt32Box(v) } }
func EntryCidr2(v uint8) EntryOption { return func(e *Entry) { e.Cidr2 = NewUInt8Box(v) } }
func EntryCidr(v uint8) EntryOption { return func(e *Entry) { e.Cidr = NewUInt8Box(v) } }
func EntryComment(v string) EntryOption { return func(e *Entry) { e.Comment = NewNullStringBox(v) } }
func EntryEther(v net.HardwareAddr) EntryOption {
return func(e *Entry) { e.Ether = NewHardwareAddrBox(v) }
}
func EntryIface(v string) EntryOption { return func(e *Entry) { e.Iface = NewNullStringBox(v) } }
func EntryIP2To(v net.IP) EntryOption { return func(e *Entry) { e.IP2To = NewIPAddrBox(v) } }
func EntryIP2(v net.IP) EntryOption { return func(e *Entry) { e.IP2 = NewIPAddrBox(v) } }
func EntryIPTo(v net.IP) EntryOption { return func(e *Entry) { e.IPTo = NewIPAddrBox(v) } }
func EntryIP(v net.IP) EntryOption { return func(e *Entry) { e.IP = NewIPAddrBox(v) } }
func EntryLineno(v uint32) EntryOption { return func(e *Entry) { e.Lineno = NewNetUInt32Box(v) } }
func EntryMark(v uint32) EntryOption { return func(e *Entry) { e.Mark = NewUInt32Box(v) } }
func EntryPackets(v uint64) EntryOption { return func(e *Entry) { e.Packets = NewUInt64Box(v) } }
func EntryPortTo(v uint16) EntryOption { return func(e *Entry) { e.PortTo = NewUInt16Box(v) } }
func EntryPort(v uint16) EntryOption { return func(e *Entry) { e.Port = NewUInt16Box(v) } }
func EntryProto(v uint8) EntryOption { return func(e *Entry) { e.Proto = NewUInt8Box(v) } }
func EntrySkbMark(v uint64) EntryOption { return func(e *Entry) { e.Skbmark = NewUInt64Box(v) } }
func EntrySkbPrio(v uint32) EntryOption { return func(e *Entry) { e.Skbprio = NewUInt32Box(v) } }
func EntrySkbQueue(v uint16) EntryOption { return func(e *Entry) { e.Skbqueue = NewUInt16Box(v) } }
func EntryTimeout(v time.Duration) EntryOption {
return func(e *Entry) { e.Timeout = NewUInt32SecondsDurationBox(v) }
}
func NewEntry(setters ...EntryOption) *Entry {
e := &Entry{}
for _, setter := range setters {
e.set(setter)
}
return e
}
func unmarshalEntry(nfa netfilter.Attribute) *Entry {
e := &Entry{}
unmarshalAttributes(nfa.Children, e)
return e
}
func (e *Entry) set(option EntryOption) {
option(e)
}
func (e *Entry) unmarshalAttribute(nfa netfilter.Attribute) {
switch at := AttributeType(nfa.Type); at {
case AttrBytes:
e.Bytes = unmarshalUInt64Box(nfa)
case AttrCadtFlags:
e.CadtFlags = unmarshalUInt32Box(nfa)
case AttrCidr2:
e.Cidr2 = unmarshalUInt8Box(nfa)
case AttrCidr:
e.Cidr = unmarshalUInt8Box(nfa)
case AttrComment:
e.Comment = unmarshalNullStringBox(nfa)
case AttrEther:
e.Ether = unmarshalHardwareAddrBox(nfa)
case AttrIface:
e.Iface = unmarshalNullStringBox(nfa)
case AttrIP2To:
e.IP2To = unmarshalIPAddrBox(nfa)
case AttrIP2:
e.IP2 = unmarshalIPAddrBox(nfa)
case AttrIPTo:
e.IPTo = unmarshalIPAddrBox(nfa)
case AttrIP:
e.IP = unmarshalIPAddrBox(nfa)
case AttrLineNo:
e.Lineno = unmarshalNetUInt32Box(nfa)
case AttrMark:
e.Mark = unmarshalUInt32Box(nfa)
case AttrPackets:
e.Packets = unmarshalUInt64Box(nfa)
case AttrPortTo:
e.PortTo = unmarshalUInt16Box(nfa)
case AttrPort:
e.Port = unmarshalUInt16Box(nfa)
case AttrProto:
e.Proto = unmarshalUInt8Box(nfa)
case AttrSkbMark:
e.Skbmark = unmarshalUInt64Box(nfa)
case AttrSkbPrio:
e.Skbprio = unmarshalUInt32Box(nfa)
case AttrSkbQueue:
e.Skbqueue = unmarshalUInt16Box(nfa)
case AttrTimeout:
e.Timeout = unmarshalUInt32SecondsDurationBox(nfa)
}
}
func (e *Entry) marshal(t AttributeType) netfilter.Attribute {
attrs := newAttributes()
attrs.append(AttrBytes, e.Bytes)
attrs.append(AttrCadtFlags, e.CadtFlags)
attrs.append(AttrCidr2, e.Cidr2)
attrs.append(AttrCidr, e.Cidr)
attrs.append(AttrComment, e.Comment)
attrs.append(AttrEther, e.Ether)
attrs.append(AttrIface, e.Iface)
attrs.append(AttrIP2To, e.IP2To)
attrs.append(AttrIP2, e.IP2)
attrs.append(AttrIPTo, e.IPTo)
attrs.append(AttrIP, e.IP)
attrs.append(AttrLineNo, e.Lineno)
attrs.append(AttrMark, e.Mark)
attrs.append(AttrPackets, e.Packets)
attrs.append(AttrPortTo, e.PortTo)
attrs.append(AttrPort, e.Port)
attrs.append(AttrProto, e.Proto)
attrs.append(AttrSkbMark, e.Skbmark)
attrs.append(AttrSkbPrio, e.Skbprio)
attrs.append(AttrSkbQueue, e.Skbqueue)
attrs.append(AttrTimeout, e.Timeout)
return netfilter.Attribute{
Type: uint16(t),
Nested: true,
Children: attrs,
}
}
func (e *Entry) IsSet() bool {
return e != nil
}
type Entries []*Entry
func unmarshalEntries(nfa netfilter.Attribute) Entries {
e := make(Entries, 0, len(nfa.Children))
e.unmarshalAttribute(nfa)
return e
}
func (e Entries) IsSet() bool {
return e != nil
}
func (e Entries) marshal(t AttributeType) netfilter.Attribute {
children := newAttributes()
for i, item := range e {
item.set(EntryLineno(uint32(i)))
children.append(AttrData, item)
}
return netfilter.Attribute{
Type: uint16(t),
Nested: true,
Children: children,
}
}
func (e *Entries) unmarshalAttribute(nfa netfilter.Attribute) {
for i := range nfa.Children {
*e = append(*e, unmarshalEntry(nfa.Children[i]))
}
}