xref: /freebsd/tests/atf_python/sys/netlink/netlink_route.py (revision d91f8db5f1822c43cd256f19aae1d059e4b25a26)
1fee65b7eSAlexander V. Chernikovimport socket
2fee65b7eSAlexander V. Chernikovimport struct
3fee65b7eSAlexander V. Chernikovfrom ctypes import c_int
4fee65b7eSAlexander V. Chernikovfrom ctypes import c_ubyte
5fee65b7eSAlexander V. Chernikovfrom ctypes import c_uint
6fee65b7eSAlexander V. Chernikovfrom ctypes import c_ushort
7fee65b7eSAlexander V. Chernikovfrom ctypes import sizeof
8fee65b7eSAlexander V. Chernikovfrom ctypes import Structure
9fee65b7eSAlexander V. Chernikovfrom enum import auto
10fee65b7eSAlexander V. Chernikovfrom enum import Enum
11fee65b7eSAlexander V. Chernikov
12fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttr
13fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrIp
14fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrNested
15fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrStr
16fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrU32
17fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.attrs import NlAttrU8
18fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.message import StdNetlinkMessage
19fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.message import NlMsgProps
20fc2538cbSAlexander V. Chernikovfrom atf_python.sys.netlink.message import NlMsgCategory
21fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.utils import AttrDescr
22fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.utils import get_bitmask_str
23fee65b7eSAlexander V. Chernikovfrom atf_python.sys.netlink.utils import prepare_attrs_map
24fee65b7eSAlexander V. Chernikov
25fee65b7eSAlexander V. Chernikov
26fee65b7eSAlexander V. Chernikovclass RtattrType(Enum):
27fee65b7eSAlexander V. Chernikov    RTA_UNSPEC = 0
28fee65b7eSAlexander V. Chernikov    RTA_DST = 1
29fee65b7eSAlexander V. Chernikov    RTA_SRC = 2
30fee65b7eSAlexander V. Chernikov    RTA_IIF = 3
31fee65b7eSAlexander V. Chernikov    RTA_OIF = 4
32fee65b7eSAlexander V. Chernikov    RTA_GATEWAY = 5
33fee65b7eSAlexander V. Chernikov    RTA_PRIORITY = 6
34fee65b7eSAlexander V. Chernikov    RTA_PREFSRC = 7
35fee65b7eSAlexander V. Chernikov    RTA_METRICS = 8
36fee65b7eSAlexander V. Chernikov    RTA_MULTIPATH = 9
37fee65b7eSAlexander V. Chernikov    # RTA_PROTOINFO = 10
38fee65b7eSAlexander V. Chernikov    RTA_KNH_ID = 10
39fee65b7eSAlexander V. Chernikov    RTA_FLOW = 11
40fee65b7eSAlexander V. Chernikov    RTA_CACHEINFO = 12
41fee65b7eSAlexander V. Chernikov    RTA_SESSION = 13
42fee65b7eSAlexander V. Chernikov    # RTA_MP_ALGO = 14
43fee65b7eSAlexander V. Chernikov    RTA_RTFLAGS = 14
44fee65b7eSAlexander V. Chernikov    RTA_TABLE = 15
45fee65b7eSAlexander V. Chernikov    RTA_MARK = 16
46fee65b7eSAlexander V. Chernikov    RTA_MFC_STATS = 17
47fee65b7eSAlexander V. Chernikov    RTA_VIA = 18
48fee65b7eSAlexander V. Chernikov    RTA_NEWDST = 19
49fee65b7eSAlexander V. Chernikov    RTA_PREF = 20
50fee65b7eSAlexander V. Chernikov    RTA_ENCAP_TYPE = 21
51fee65b7eSAlexander V. Chernikov    RTA_ENCAP = 22
52fee65b7eSAlexander V. Chernikov    RTA_EXPIRES = 23
53fee65b7eSAlexander V. Chernikov    RTA_PAD = 24
54fee65b7eSAlexander V. Chernikov    RTA_UID = 25
55fee65b7eSAlexander V. Chernikov    RTA_TTL_PROPAGATE = 26
56fee65b7eSAlexander V. Chernikov    RTA_IP_PROTO = 27
57fee65b7eSAlexander V. Chernikov    RTA_SPORT = 28
58fee65b7eSAlexander V. Chernikov    RTA_DPORT = 29
59fee65b7eSAlexander V. Chernikov    RTA_NH_ID = 30
60fee65b7eSAlexander V. Chernikov
61fee65b7eSAlexander V. Chernikov
62fee65b7eSAlexander V. Chernikovclass NlRtMsgType(Enum):
63fee65b7eSAlexander V. Chernikov    RTM_NEWLINK = 16
64fee65b7eSAlexander V. Chernikov    RTM_DELLINK = 17
65fee65b7eSAlexander V. Chernikov    RTM_GETLINK = 18
66fee65b7eSAlexander V. Chernikov    RTM_SETLINK = 19
67fee65b7eSAlexander V. Chernikov    RTM_NEWADDR = 20
68fee65b7eSAlexander V. Chernikov    RTM_DELADDR = 21
69fee65b7eSAlexander V. Chernikov    RTM_GETADDR = 22
70fee65b7eSAlexander V. Chernikov    RTM_NEWROUTE = 24
71fee65b7eSAlexander V. Chernikov    RTM_DELROUTE = 25
72fee65b7eSAlexander V. Chernikov    RTM_GETROUTE = 26
73fee65b7eSAlexander V. Chernikov    RTM_NEWNEIGH = 28
74fee65b7eSAlexander V. Chernikov    RTM_DELNEIGH = 29
75fee65b7eSAlexander V. Chernikov    RTM_GETNEIGH = 30
76fee65b7eSAlexander V. Chernikov    RTM_NEWRULE = 32
77fee65b7eSAlexander V. Chernikov    RTM_DELRULE = 33
78fee65b7eSAlexander V. Chernikov    RTM_GETRULE = 34
79fee65b7eSAlexander V. Chernikov    RTM_NEWQDISC = 36
80fee65b7eSAlexander V. Chernikov    RTM_DELQDISC = 37
81fee65b7eSAlexander V. Chernikov    RTM_GETQDISC = 38
82fee65b7eSAlexander V. Chernikov    RTM_NEWTCLASS = 40
83fee65b7eSAlexander V. Chernikov    RTM_DELTCLASS = 41
84fee65b7eSAlexander V. Chernikov    RTM_GETTCLASS = 42
85fee65b7eSAlexander V. Chernikov    RTM_NEWTFILTER = 44
86fee65b7eSAlexander V. Chernikov    RTM_DELTFILTER = 45
87fee65b7eSAlexander V. Chernikov    RTM_GETTFILTER = 46
88fee65b7eSAlexander V. Chernikov    RTM_NEWACTION = 48
89fee65b7eSAlexander V. Chernikov    RTM_DELACTION = 49
90fee65b7eSAlexander V. Chernikov    RTM_GETACTION = 50
91fee65b7eSAlexander V. Chernikov    RTM_NEWPREFIX = 52
92fee65b7eSAlexander V. Chernikov    RTM_GETMULTICAST = 58
93fee65b7eSAlexander V. Chernikov    RTM_GETANYCAST = 62
94fee65b7eSAlexander V. Chernikov    RTM_NEWNEIGHTBL = 64
95fee65b7eSAlexander V. Chernikov    RTM_GETNEIGHTBL = 66
96fee65b7eSAlexander V. Chernikov    RTM_SETNEIGHTBL = 67
97fee65b7eSAlexander V. Chernikov    RTM_NEWNDUSEROPT = 68
98fee65b7eSAlexander V. Chernikov    RTM_NEWADDRLABEL = 72
99fee65b7eSAlexander V. Chernikov    RTM_DELADDRLABEL = 73
100fee65b7eSAlexander V. Chernikov    RTM_GETADDRLABEL = 74
101fee65b7eSAlexander V. Chernikov    RTM_GETDCB = 78
102fee65b7eSAlexander V. Chernikov    RTM_SETDCB = 79
103fee65b7eSAlexander V. Chernikov    RTM_NEWNETCONF = 80
104fee65b7eSAlexander V. Chernikov    RTM_GETNETCONF = 82
105fee65b7eSAlexander V. Chernikov    RTM_NEWMDB = 84
106fee65b7eSAlexander V. Chernikov    RTM_DELMDB = 85
107fee65b7eSAlexander V. Chernikov    RTM_GETMDB = 86
108fee65b7eSAlexander V. Chernikov    RTM_NEWNSID = 88
109fee65b7eSAlexander V. Chernikov    RTM_DELNSID = 89
110fee65b7eSAlexander V. Chernikov    RTM_GETNSID = 90
111fee65b7eSAlexander V. Chernikov    RTM_NEWSTATS = 92
112fee65b7eSAlexander V. Chernikov    RTM_GETSTATS = 94
113fee65b7eSAlexander V. Chernikov
114fee65b7eSAlexander V. Chernikov
115fee65b7eSAlexander V. Chernikovclass RtAttr(Structure):
116fee65b7eSAlexander V. Chernikov    _fields_ = [
117fee65b7eSAlexander V. Chernikov        ("rta_len", c_ushort),
118fee65b7eSAlexander V. Chernikov        ("rta_type", c_ushort),
119fee65b7eSAlexander V. Chernikov    ]
120fee65b7eSAlexander V. Chernikov
121fee65b7eSAlexander V. Chernikov
122fee65b7eSAlexander V. Chernikovclass RtMsgHdr(Structure):
123fee65b7eSAlexander V. Chernikov    _fields_ = [
124fee65b7eSAlexander V. Chernikov        ("rtm_family", c_ubyte),
125fee65b7eSAlexander V. Chernikov        ("rtm_dst_len", c_ubyte),
126fee65b7eSAlexander V. Chernikov        ("rtm_src_len", c_ubyte),
127fee65b7eSAlexander V. Chernikov        ("rtm_tos", c_ubyte),
128fee65b7eSAlexander V. Chernikov        ("rtm_table", c_ubyte),
129fee65b7eSAlexander V. Chernikov        ("rtm_protocol", c_ubyte),
130fee65b7eSAlexander V. Chernikov        ("rtm_scope", c_ubyte),
131fee65b7eSAlexander V. Chernikov        ("rtm_type", c_ubyte),
132fee65b7eSAlexander V. Chernikov        ("rtm_flags", c_uint),
133fee65b7eSAlexander V. Chernikov    ]
134fee65b7eSAlexander V. Chernikov
135fee65b7eSAlexander V. Chernikov
136fee65b7eSAlexander V. Chernikovclass RtMsgFlags(Enum):
137fee65b7eSAlexander V. Chernikov    RTM_F_NOTIFY = 0x100
138fee65b7eSAlexander V. Chernikov    RTM_F_CLONED = 0x200
139fee65b7eSAlexander V. Chernikov    RTM_F_EQUALIZE = 0x400
140fee65b7eSAlexander V. Chernikov    RTM_F_PREFIX = 0x800
141fee65b7eSAlexander V. Chernikov    RTM_F_LOOKUP_TABLE = 0x1000
142fee65b7eSAlexander V. Chernikov    RTM_F_FIB_MATCH = 0x2000
143fee65b7eSAlexander V. Chernikov    RTM_F_OFFLOAD = 0x4000
144fee65b7eSAlexander V. Chernikov    RTM_F_TRAP = 0x8000
145fee65b7eSAlexander V. Chernikov    RTM_F_OFFLOAD_FAILED = 0x20000000
146fee65b7eSAlexander V. Chernikov
147fee65b7eSAlexander V. Chernikov
148fee65b7eSAlexander V. Chernikovclass RtScope(Enum):
149fee65b7eSAlexander V. Chernikov    RT_SCOPE_UNIVERSE = 0
150fee65b7eSAlexander V. Chernikov    RT_SCOPE_SITE = 200
151fee65b7eSAlexander V. Chernikov    RT_SCOPE_LINK = 253
152fee65b7eSAlexander V. Chernikov    RT_SCOPE_HOST = 254
153fee65b7eSAlexander V. Chernikov    RT_SCOPE_NOWHERE = 255
154fee65b7eSAlexander V. Chernikov
155fee65b7eSAlexander V. Chernikov
156fee65b7eSAlexander V. Chernikovclass RtType(Enum):
157fee65b7eSAlexander V. Chernikov    RTN_UNSPEC = 0
158fee65b7eSAlexander V. Chernikov    RTN_UNICAST = auto()
159fee65b7eSAlexander V. Chernikov    RTN_LOCAL = auto()
160fee65b7eSAlexander V. Chernikov    RTN_BROADCAST = auto()
161fee65b7eSAlexander V. Chernikov    RTN_ANYCAST = auto()
162fee65b7eSAlexander V. Chernikov    RTN_MULTICAST = auto()
163fee65b7eSAlexander V. Chernikov    RTN_BLACKHOLE = auto()
164fee65b7eSAlexander V. Chernikov    RTN_UNREACHABLE = auto()
165fee65b7eSAlexander V. Chernikov    RTN_PROHIBIT = auto()
166fee65b7eSAlexander V. Chernikov    RTN_THROW = auto()
167fee65b7eSAlexander V. Chernikov    RTN_NAT = auto()
168fee65b7eSAlexander V. Chernikov    RTN_XRESOLVE = auto()
169fee65b7eSAlexander V. Chernikov
170fee65b7eSAlexander V. Chernikov
171fee65b7eSAlexander V. Chernikovclass RtProto(Enum):
172fee65b7eSAlexander V. Chernikov    RTPROT_UNSPEC = 0
173fee65b7eSAlexander V. Chernikov    RTPROT_REDIRECT = 1
174fee65b7eSAlexander V. Chernikov    RTPROT_KERNEL = 2
175fee65b7eSAlexander V. Chernikov    RTPROT_BOOT = 3
176fee65b7eSAlexander V. Chernikov    RTPROT_STATIC = 4
177fee65b7eSAlexander V. Chernikov    RTPROT_GATED = 8
178fee65b7eSAlexander V. Chernikov    RTPROT_RA = 9
179fee65b7eSAlexander V. Chernikov    RTPROT_MRT = 10
180fee65b7eSAlexander V. Chernikov    RTPROT_ZEBRA = 11
181fee65b7eSAlexander V. Chernikov    RTPROT_BIRD = 12
182fee65b7eSAlexander V. Chernikov    RTPROT_DNROUTED = 13
183fee65b7eSAlexander V. Chernikov    RTPROT_XORP = 14
184fee65b7eSAlexander V. Chernikov    RTPROT_NTK = 15
185fee65b7eSAlexander V. Chernikov    RTPROT_DHCP = 16
186fee65b7eSAlexander V. Chernikov    RTPROT_MROUTED = 17
187fee65b7eSAlexander V. Chernikov    RTPROT_KEEPALIVED = 18
188fee65b7eSAlexander V. Chernikov    RTPROT_BABEL = 42
189fee65b7eSAlexander V. Chernikov    RTPROT_OPENR = 99
190fee65b7eSAlexander V. Chernikov    RTPROT_BGP = 186
191fee65b7eSAlexander V. Chernikov    RTPROT_ISIS = 187
192fee65b7eSAlexander V. Chernikov    RTPROT_OSPF = 188
193fee65b7eSAlexander V. Chernikov    RTPROT_RIP = 189
194fee65b7eSAlexander V. Chernikov    RTPROT_EIGRP = 192
195fee65b7eSAlexander V. Chernikov
196fee65b7eSAlexander V. Chernikov
197fee65b7eSAlexander V. Chernikovclass NlRtaxType(Enum):
198fee65b7eSAlexander V. Chernikov    RTAX_UNSPEC = 0
199fee65b7eSAlexander V. Chernikov    RTAX_LOCK = auto()
200fee65b7eSAlexander V. Chernikov    RTAX_MTU = auto()
201fee65b7eSAlexander V. Chernikov    RTAX_WINDOW = auto()
202fee65b7eSAlexander V. Chernikov    RTAX_RTT = auto()
203fee65b7eSAlexander V. Chernikov    RTAX_RTTVAR = auto()
204fee65b7eSAlexander V. Chernikov    RTAX_SSTHRESH = auto()
205fee65b7eSAlexander V. Chernikov    RTAX_CWND = auto()
206fee65b7eSAlexander V. Chernikov    RTAX_ADVMSS = auto()
207fee65b7eSAlexander V. Chernikov    RTAX_REORDERING = auto()
208fee65b7eSAlexander V. Chernikov    RTAX_HOPLIMIT = auto()
209fee65b7eSAlexander V. Chernikov    RTAX_INITCWND = auto()
210fee65b7eSAlexander V. Chernikov    RTAX_FEATURES = auto()
211fee65b7eSAlexander V. Chernikov    RTAX_RTO_MIN = auto()
212fee65b7eSAlexander V. Chernikov    RTAX_INITRWND = auto()
213fee65b7eSAlexander V. Chernikov    RTAX_QUICKACK = auto()
214fee65b7eSAlexander V. Chernikov    RTAX_CC_ALGO = auto()
215fee65b7eSAlexander V. Chernikov    RTAX_FASTOPEN_NO_COOKIE = auto()
216fee65b7eSAlexander V. Chernikov
217fee65b7eSAlexander V. Chernikov
218fee65b7eSAlexander V. Chernikovclass RtFlagsBSD(Enum):
219fee65b7eSAlexander V. Chernikov    RTF_UP = 0x1
220fee65b7eSAlexander V. Chernikov    RTF_GATEWAY = 0x2
221fee65b7eSAlexander V. Chernikov    RTF_HOST = 0x4
222fee65b7eSAlexander V. Chernikov    RTF_REJECT = 0x8
223fee65b7eSAlexander V. Chernikov    RTF_DYNAMIC = 0x10
224fee65b7eSAlexander V. Chernikov    RTF_MODIFIED = 0x20
225fee65b7eSAlexander V. Chernikov    RTF_DONE = 0x40
226fee65b7eSAlexander V. Chernikov    RTF_XRESOLVE = 0x200
227fee65b7eSAlexander V. Chernikov    RTF_LLINFO = 0x400
228fee65b7eSAlexander V. Chernikov    RTF_LLDATA = 0x400
229fee65b7eSAlexander V. Chernikov    RTF_STATIC = 0x800
230fee65b7eSAlexander V. Chernikov    RTF_BLACKHOLE = 0x1000
231fee65b7eSAlexander V. Chernikov    RTF_PROTO2 = 0x4000
232fee65b7eSAlexander V. Chernikov    RTF_PROTO1 = 0x8000
233fee65b7eSAlexander V. Chernikov    RTF_PROTO3 = 0x40000
234fee65b7eSAlexander V. Chernikov    RTF_FIXEDMTU = 0x80000
235fee65b7eSAlexander V. Chernikov    RTF_PINNED = 0x100000
236fee65b7eSAlexander V. Chernikov    RTF_LOCAL = 0x200000
237fee65b7eSAlexander V. Chernikov    RTF_BROADCAST = 0x400000
238fee65b7eSAlexander V. Chernikov    RTF_MULTICAST = 0x800000
239fee65b7eSAlexander V. Chernikov    RTF_STICKY = 0x10000000
240fee65b7eSAlexander V. Chernikov    RTF_RNH_LOCKED = 0x40000000
241fee65b7eSAlexander V. Chernikov    RTF_GWFLAG_COMPAT = 0x80000000
242fee65b7eSAlexander V. Chernikov
243fee65b7eSAlexander V. Chernikov
244fee65b7eSAlexander V. Chernikovclass NlRtGroup(Enum):
245fee65b7eSAlexander V. Chernikov    RTNLGRP_NONE = 0
246fee65b7eSAlexander V. Chernikov    RTNLGRP_LINK = auto()
247fee65b7eSAlexander V. Chernikov    RTNLGRP_NOTIFY = auto()
248fee65b7eSAlexander V. Chernikov    RTNLGRP_NEIGH = auto()
249fee65b7eSAlexander V. Chernikov    RTNLGRP_TC = auto()
250fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV4_IFADDR = auto()
251fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV4_MROUTE = auto()
252fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV4_ROUTE = auto()
253fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV4_RULE = auto()
254fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV6_IFADDR = auto()
255fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV6_MROUTE = auto()
256fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV6_ROUTE = auto()
257fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV6_IFINFO = auto()
258fee65b7eSAlexander V. Chernikov    RTNLGRP_DECnet_IFADDR = auto()
259fee65b7eSAlexander V. Chernikov    RTNLGRP_NOP2 = auto()
260fee65b7eSAlexander V. Chernikov    RTNLGRP_DECnet_ROUTE = auto()
261fee65b7eSAlexander V. Chernikov    RTNLGRP_DECnet_RULE = auto()
262fee65b7eSAlexander V. Chernikov    RTNLGRP_NOP4 = auto()
263fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV6_PREFIX = auto()
264fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV6_RULE = auto()
265fee65b7eSAlexander V. Chernikov    RTNLGRP_ND_USEROPT = auto()
266fee65b7eSAlexander V. Chernikov    RTNLGRP_PHONET_IFADDR = auto()
267fee65b7eSAlexander V. Chernikov    RTNLGRP_PHONET_ROUTE = auto()
268fee65b7eSAlexander V. Chernikov    RTNLGRP_DCB = auto()
269fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV4_NETCONF = auto()
270fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV6_NETCONF = auto()
271fee65b7eSAlexander V. Chernikov    RTNLGRP_MDB = auto()
272fee65b7eSAlexander V. Chernikov    RTNLGRP_MPLS_ROUTE = auto()
273fee65b7eSAlexander V. Chernikov    RTNLGRP_NSID = auto()
274fee65b7eSAlexander V. Chernikov    RTNLGRP_MPLS_NETCONF = auto()
275fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV4_MROUTE_R = auto()
276fee65b7eSAlexander V. Chernikov    RTNLGRP_IPV6_MROUTE_R = auto()
277fee65b7eSAlexander V. Chernikov    RTNLGRP_NEXTHOP = auto()
278fee65b7eSAlexander V. Chernikov    RTNLGRP_BRVLAN = auto()
279fee65b7eSAlexander V. Chernikov
280fee65b7eSAlexander V. Chernikov
281fee65b7eSAlexander V. Chernikovclass IfinfoMsg(Structure):
282fee65b7eSAlexander V. Chernikov    _fields_ = [
283fee65b7eSAlexander V. Chernikov        ("ifi_family", c_ubyte),
284fee65b7eSAlexander V. Chernikov        ("__ifi_pad", c_ubyte),
285fee65b7eSAlexander V. Chernikov        ("ifi_type", c_ushort),
286fee65b7eSAlexander V. Chernikov        ("ifi_index", c_int),
287fee65b7eSAlexander V. Chernikov        ("ifi_flags", c_uint),
288fee65b7eSAlexander V. Chernikov        ("ifi_change", c_uint),
289fee65b7eSAlexander V. Chernikov    ]
290fee65b7eSAlexander V. Chernikov
291fee65b7eSAlexander V. Chernikov
292fee65b7eSAlexander V. Chernikovclass IflattrType(Enum):
293fee65b7eSAlexander V. Chernikov    IFLA_UNSPEC = 0
294fee65b7eSAlexander V. Chernikov    IFLA_ADDRESS = auto()
295fee65b7eSAlexander V. Chernikov    IFLA_BROADCAST = auto()
296fee65b7eSAlexander V. Chernikov    IFLA_IFNAME = auto()
297fee65b7eSAlexander V. Chernikov    IFLA_MTU = auto()
298fee65b7eSAlexander V. Chernikov    IFLA_LINK = auto()
299fee65b7eSAlexander V. Chernikov    IFLA_QDISC = auto()
300fee65b7eSAlexander V. Chernikov    IFLA_STATS = auto()
301fee65b7eSAlexander V. Chernikov    IFLA_COST = auto()
302fee65b7eSAlexander V. Chernikov    IFLA_PRIORITY = auto()
303fee65b7eSAlexander V. Chernikov    IFLA_MASTER = auto()
304fee65b7eSAlexander V. Chernikov    IFLA_WIRELESS = auto()
305fee65b7eSAlexander V. Chernikov    IFLA_PROTINFO = auto()
306fee65b7eSAlexander V. Chernikov    IFLA_TXQLEN = auto()
307fee65b7eSAlexander V. Chernikov    IFLA_MAP = auto()
308fee65b7eSAlexander V. Chernikov    IFLA_WEIGHT = auto()
309fee65b7eSAlexander V. Chernikov    IFLA_OPERSTATE = auto()
310fee65b7eSAlexander V. Chernikov    IFLA_LINKMODE = auto()
311fee65b7eSAlexander V. Chernikov    IFLA_LINKINFO = auto()
312fee65b7eSAlexander V. Chernikov    IFLA_NET_NS_PID = auto()
313fee65b7eSAlexander V. Chernikov    IFLA_IFALIAS = auto()
314fee65b7eSAlexander V. Chernikov    IFLA_NUM_VF = auto()
315fee65b7eSAlexander V. Chernikov    IFLA_VFINFO_LIST = auto()
316fee65b7eSAlexander V. Chernikov    IFLA_STATS64 = auto()
317fee65b7eSAlexander V. Chernikov    IFLA_VF_PORTS = auto()
318fee65b7eSAlexander V. Chernikov    IFLA_PORT_SELF = auto()
319fee65b7eSAlexander V. Chernikov    IFLA_AF_SPEC = auto()
320fee65b7eSAlexander V. Chernikov    IFLA_GROUP = auto()
321fee65b7eSAlexander V. Chernikov    IFLA_NET_NS_FD = auto()
322fee65b7eSAlexander V. Chernikov    IFLA_EXT_MASK = auto()
323fee65b7eSAlexander V. Chernikov    IFLA_PROMISCUITY = auto()
324fee65b7eSAlexander V. Chernikov    IFLA_NUM_TX_QUEUES = auto()
325fee65b7eSAlexander V. Chernikov    IFLA_NUM_RX_QUEUES = auto()
326fee65b7eSAlexander V. Chernikov    IFLA_CARRIER = auto()
327fee65b7eSAlexander V. Chernikov    IFLA_PHYS_PORT_ID = auto()
328fee65b7eSAlexander V. Chernikov    IFLA_CARRIER_CHANGES = auto()
329fee65b7eSAlexander V. Chernikov    IFLA_PHYS_SWITCH_ID = auto()
330fee65b7eSAlexander V. Chernikov    IFLA_LINK_NETNSID = auto()
331fee65b7eSAlexander V. Chernikov    IFLA_PHYS_PORT_NAME = auto()
332fee65b7eSAlexander V. Chernikov    IFLA_PROTO_DOWN = auto()
333fee65b7eSAlexander V. Chernikov    IFLA_GSO_MAX_SEGS = auto()
334fee65b7eSAlexander V. Chernikov    IFLA_GSO_MAX_SIZE = auto()
335fee65b7eSAlexander V. Chernikov    IFLA_PAD = auto()
336fee65b7eSAlexander V. Chernikov    IFLA_XDP = auto()
337fee65b7eSAlexander V. Chernikov    IFLA_EVENT = auto()
338fee65b7eSAlexander V. Chernikov    IFLA_NEW_NETNSID = auto()
339fee65b7eSAlexander V. Chernikov    IFLA_IF_NETNSID = auto()
340fee65b7eSAlexander V. Chernikov    IFLA_CARRIER_UP_COUNT = auto()
341fee65b7eSAlexander V. Chernikov    IFLA_CARRIER_DOWN_COUNT = auto()
342fee65b7eSAlexander V. Chernikov    IFLA_NEW_IFINDEX = auto()
343fee65b7eSAlexander V. Chernikov    IFLA_MIN_MTU = auto()
344fee65b7eSAlexander V. Chernikov    IFLA_MAX_MTU = auto()
345fee65b7eSAlexander V. Chernikov    IFLA_PROP_LIST = auto()
346fee65b7eSAlexander V. Chernikov    IFLA_ALT_IFNAME = auto()
347fee65b7eSAlexander V. Chernikov    IFLA_PERM_ADDRESS = auto()
348fee65b7eSAlexander V. Chernikov    IFLA_PROTO_DOWN_REASON = auto()
349fee65b7eSAlexander V. Chernikov
350fee65b7eSAlexander V. Chernikov
351fee65b7eSAlexander V. Chernikovclass IflinkInfo(Enum):
352fee65b7eSAlexander V. Chernikov    IFLA_INFO_UNSPEC = 0
353fee65b7eSAlexander V. Chernikov    IFLA_INFO_KIND = auto()
354fee65b7eSAlexander V. Chernikov    IFLA_INFO_DATA = auto()
355fee65b7eSAlexander V. Chernikov    IFLA_INFO_XSTATS = auto()
356fee65b7eSAlexander V. Chernikov    IFLA_INFO_SLAVE_KIND = auto()
357fee65b7eSAlexander V. Chernikov    IFLA_INFO_SLAVE_DATA = auto()
358fee65b7eSAlexander V. Chernikov
359fee65b7eSAlexander V. Chernikov
360fee65b7eSAlexander V. Chernikovclass IfLinkInfoDataVlan(Enum):
361fee65b7eSAlexander V. Chernikov    IFLA_VLAN_UNSPEC = 0
362fee65b7eSAlexander V. Chernikov    IFLA_VLAN_ID = auto()
363fee65b7eSAlexander V. Chernikov    IFLA_VLAN_FLAGS = auto()
364fee65b7eSAlexander V. Chernikov    IFLA_VLAN_EGRESS_QOS = auto()
365fee65b7eSAlexander V. Chernikov    IFLA_VLAN_INGRESS_QOS = auto()
366fee65b7eSAlexander V. Chernikov    IFLA_VLAN_PROTOCOL = auto()
367fee65b7eSAlexander V. Chernikov
368fee65b7eSAlexander V. Chernikov
369fee65b7eSAlexander V. Chernikovclass IfaddrMsg(Structure):
370fee65b7eSAlexander V. Chernikov    _fields_ = [
371fee65b7eSAlexander V. Chernikov        ("ifa_family", c_ubyte),
372fee65b7eSAlexander V. Chernikov        ("ifa_prefixlen", c_ubyte),
373fee65b7eSAlexander V. Chernikov        ("ifa_flags", c_ubyte),
374fee65b7eSAlexander V. Chernikov        ("ifa_scope", c_ubyte),
375fee65b7eSAlexander V. Chernikov        ("ifa_index", c_uint),
376fee65b7eSAlexander V. Chernikov    ]
377fee65b7eSAlexander V. Chernikov
378fee65b7eSAlexander V. Chernikov
379*d91f8db5SAlexander V. Chernikovclass IfaAttrType(Enum):
380fee65b7eSAlexander V. Chernikov    IFA_UNSPEC = 0
381fee65b7eSAlexander V. Chernikov    IFA_ADDRESS = auto()
382fee65b7eSAlexander V. Chernikov    IFA_LOCAL = auto()
383fee65b7eSAlexander V. Chernikov    IFA_LABEL = auto()
384fee65b7eSAlexander V. Chernikov    IFA_BROADCAST = auto()
385fee65b7eSAlexander V. Chernikov    IFA_ANYCAST = auto()
386fee65b7eSAlexander V. Chernikov    IFA_CACHEINFO = auto()
387fee65b7eSAlexander V. Chernikov    IFA_MULTICAST = auto()
388fee65b7eSAlexander V. Chernikov    IFA_FLAGS = auto()
389fee65b7eSAlexander V. Chernikov    IFA_RT_PRIORITY = auto()
390fee65b7eSAlexander V. Chernikov    IFA_TARGET_NETNSID = auto()
391fee65b7eSAlexander V. Chernikov
392fee65b7eSAlexander V. Chernikov
393fee65b7eSAlexander V. Chernikovclass NdMsg(Structure):
394fee65b7eSAlexander V. Chernikov    _fields_ = [
395fee65b7eSAlexander V. Chernikov        ("ndm_family", c_ubyte),
396fee65b7eSAlexander V. Chernikov        ("ndm_pad1", c_ubyte),
397fee65b7eSAlexander V. Chernikov        ("ndm_pad2", c_ubyte),
398fee65b7eSAlexander V. Chernikov        ("ndm_ifindex", c_uint),
399fee65b7eSAlexander V. Chernikov        ("ndm_state", c_ushort),
400fee65b7eSAlexander V. Chernikov        ("ndm_flags", c_ubyte),
401fee65b7eSAlexander V. Chernikov        ("ndm_type", c_ubyte),
402fee65b7eSAlexander V. Chernikov    ]
403fee65b7eSAlexander V. Chernikov
404fee65b7eSAlexander V. Chernikov
405fee65b7eSAlexander V. Chernikovclass NdAttrType(Enum):
406fee65b7eSAlexander V. Chernikov    NDA_UNSPEC = 0
407fee65b7eSAlexander V. Chernikov    NDA_DST = 1
408fee65b7eSAlexander V. Chernikov    NDA_LLADDR = 2
409fee65b7eSAlexander V. Chernikov    NDA_CACHEINFO = 3
410fee65b7eSAlexander V. Chernikov    NDA_PROBES = 4
411fee65b7eSAlexander V. Chernikov    NDA_VLAN = 5
412fee65b7eSAlexander V. Chernikov    NDA_PORT = 6
413fee65b7eSAlexander V. Chernikov    NDA_VNI = 7
414fee65b7eSAlexander V. Chernikov    NDA_IFINDEX = 8
415fee65b7eSAlexander V. Chernikov    NDA_MASTER = 9
416fee65b7eSAlexander V. Chernikov    NDA_LINK_NETNSID = 10
417fee65b7eSAlexander V. Chernikov    NDA_SRC_VNI = 11
418fee65b7eSAlexander V. Chernikov    NDA_PROTOCOL = 12
419fee65b7eSAlexander V. Chernikov    NDA_NH_ID = 13
420fee65b7eSAlexander V. Chernikov    NDA_FDB_EXT_ATTRS = 14
421fee65b7eSAlexander V. Chernikov    NDA_FLAGS_EXT = 15
422fee65b7eSAlexander V. Chernikov    NDA_NDM_STATE_MASK = 16
423fee65b7eSAlexander V. Chernikov    NDA_NDM_FLAGS_MASK = 17
424fee65b7eSAlexander V. Chernikov
425fee65b7eSAlexander V. Chernikov
426fee65b7eSAlexander V. Chernikovclass NlAttrRtFlags(NlAttrU32):
427fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
428fee65b7eSAlexander V. Chernikov        s = get_bitmask_str(RtFlagsBSD, self.u32)
429fee65b7eSAlexander V. Chernikov        return " rtflags={}".format(s)
430fee65b7eSAlexander V. Chernikov
431fee65b7eSAlexander V. Chernikov
432fee65b7eSAlexander V. Chernikovclass NlAttrIfindex(NlAttrU32):
433fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
434fee65b7eSAlexander V. Chernikov        try:
435fee65b7eSAlexander V. Chernikov            ifname = socket.if_indextoname(self.u32)
436fee65b7eSAlexander V. Chernikov            return " iface={}(#{})".format(ifname, self.u32)
437fee65b7eSAlexander V. Chernikov        except OSError:
438fee65b7eSAlexander V. Chernikov            pass
439fee65b7eSAlexander V. Chernikov        return " iface=if#{}".format(self.u32)
440fee65b7eSAlexander V. Chernikov
441fee65b7eSAlexander V. Chernikov
442fee65b7eSAlexander V. Chernikovclass NlAttrTable(NlAttrU32):
443fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
444fee65b7eSAlexander V. Chernikov        return " rtable={}".format(self.u32)
445fee65b7eSAlexander V. Chernikov
446fee65b7eSAlexander V. Chernikov
447fee65b7eSAlexander V. Chernikovclass NlAttrNhId(NlAttrU32):
448fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
449fee65b7eSAlexander V. Chernikov        return " nh_id={}".format(self.u32)
450fee65b7eSAlexander V. Chernikov
451fee65b7eSAlexander V. Chernikov
452fee65b7eSAlexander V. Chernikovclass NlAttrKNhId(NlAttrU32):
453fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
454fee65b7eSAlexander V. Chernikov        return " knh_id={}".format(self.u32)
455fee65b7eSAlexander V. Chernikov
456fee65b7eSAlexander V. Chernikov
457fee65b7eSAlexander V. Chernikovclass NlAttrMac(NlAttr):
458fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
459fee65b7eSAlexander V. Chernikov        return ' mac="' + ":".join(["{:02X}".format(b) for b in self._data]) + '"'
460fee65b7eSAlexander V. Chernikov
461fee65b7eSAlexander V. Chernikov
462fee65b7eSAlexander V. Chernikovclass NlAttrIfStats(NlAttr):
463fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
464fee65b7eSAlexander V. Chernikov        return " stats={...}"
465fee65b7eSAlexander V. Chernikov
466fee65b7eSAlexander V. Chernikov
467fee65b7eSAlexander V. Chernikovclass NlAttrVia(NlAttr):
468fee65b7eSAlexander V. Chernikov    def __init__(self, nla_type, family, addr: str):
469fee65b7eSAlexander V. Chernikov        super().__init__(nla_type, b"")
470fee65b7eSAlexander V. Chernikov        self.addr = addr
471fee65b7eSAlexander V. Chernikov        self.family = family
472fee65b7eSAlexander V. Chernikov
473fee65b7eSAlexander V. Chernikov    @staticmethod
474fee65b7eSAlexander V. Chernikov    def _validate(data):
475fee65b7eSAlexander V. Chernikov        nla_len, nla_type = struct.unpack("@HH", data[:4])
476fee65b7eSAlexander V. Chernikov        data_len = nla_len - 4
477fee65b7eSAlexander V. Chernikov        if data_len == 0:
478fee65b7eSAlexander V. Chernikov            raise ValueError(
479fee65b7eSAlexander V. Chernikov                "Error validating attr {}: empty data".format(nla_type)
480fee65b7eSAlexander V. Chernikov            )  # noqa: E501
481fee65b7eSAlexander V. Chernikov        family = int(data_len[0])
482fee65b7eSAlexander V. Chernikov        if family not in (socket.AF_INET, socket.AF_INET6):
483fee65b7eSAlexander V. Chernikov            raise ValueError(
484fee65b7eSAlexander V. Chernikov                "Error validating attr {}: unsupported AF {}".format(  # noqa: E501
485fee65b7eSAlexander V. Chernikov                    nla_type, family
486fee65b7eSAlexander V. Chernikov                )
487fee65b7eSAlexander V. Chernikov            )
488fee65b7eSAlexander V. Chernikov        if family == socket.AF_INET:
489fee65b7eSAlexander V. Chernikov            expected_len = 1 + 4
490fee65b7eSAlexander V. Chernikov        else:
491fee65b7eSAlexander V. Chernikov            expected_len = 1 + 16
492fee65b7eSAlexander V. Chernikov        if data_len != expected_len:
493fee65b7eSAlexander V. Chernikov            raise ValueError(
494fee65b7eSAlexander V. Chernikov                "Error validating attr {}: expected len {} got {}".format(  # noqa: E501
495fee65b7eSAlexander V. Chernikov                    nla_type, expected_len, data_len
496fee65b7eSAlexander V. Chernikov                )
497fee65b7eSAlexander V. Chernikov            )
498fee65b7eSAlexander V. Chernikov
499fee65b7eSAlexander V. Chernikov    @property
500fee65b7eSAlexander V. Chernikov    def nla_len(self):
501fee65b7eSAlexander V. Chernikov        if self.family == socket.AF_INET6:
502fee65b7eSAlexander V. Chernikov            return 21
503fee65b7eSAlexander V. Chernikov        else:
504fee65b7eSAlexander V. Chernikov            return 9
505fee65b7eSAlexander V. Chernikov
506fee65b7eSAlexander V. Chernikov    @classmethod
507fee65b7eSAlexander V. Chernikov    def _parse(cls, data):
508fee65b7eSAlexander V. Chernikov        nla_len, nla_type, family = struct.unpack("@HHB", data[:5])
509fee65b7eSAlexander V. Chernikov        off = 5
510fee65b7eSAlexander V. Chernikov        if family == socket.AF_INET:
511fee65b7eSAlexander V. Chernikov            addr = socket.inet_ntop(family, data[off:off + 4])
512fee65b7eSAlexander V. Chernikov        else:
513fee65b7eSAlexander V. Chernikov            addr = socket.inet_ntop(family, data[off:off + 16])
514fee65b7eSAlexander V. Chernikov        return cls(nla_type, family, addr)
515fee65b7eSAlexander V. Chernikov
516fee65b7eSAlexander V. Chernikov    def __bytes__(self):
517fee65b7eSAlexander V. Chernikov        addr = socket.inet_pton(self.family, self.addr)
518fee65b7eSAlexander V. Chernikov        return self._to_bytes(struct.pack("@B", self.family) + addr)
519fee65b7eSAlexander V. Chernikov
520fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
521fee65b7eSAlexander V. Chernikov        return " via={}".format(self.addr)
522fee65b7eSAlexander V. Chernikov
523fee65b7eSAlexander V. Chernikov
524fee65b7eSAlexander V. Chernikovrtnl_route_attrs = prepare_attrs_map(
525fee65b7eSAlexander V. Chernikov    [
526fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_DST, NlAttrIp),
527fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_SRC, NlAttrIp),
528fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_IIF, NlAttrIfindex),
529fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_OIF, NlAttrIfindex),
530fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_GATEWAY, NlAttrIp),
531fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_TABLE, NlAttrTable),
532fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_PRIORITY, NlAttrU32),
533fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_VIA, NlAttrVia),
534fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_NH_ID, NlAttrNhId),
535fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_KNH_ID, NlAttrKNhId),
536fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_RTFLAGS, NlAttrRtFlags),
537fee65b7eSAlexander V. Chernikov        AttrDescr(
538fee65b7eSAlexander V. Chernikov            RtattrType.RTA_METRICS,
539fee65b7eSAlexander V. Chernikov            NlAttrNested,
540fee65b7eSAlexander V. Chernikov            [
541fee65b7eSAlexander V. Chernikov                AttrDescr(NlRtaxType.RTAX_MTU, NlAttrU32),
542fee65b7eSAlexander V. Chernikov            ],
543fee65b7eSAlexander V. Chernikov        ),
544fee65b7eSAlexander V. Chernikov    ]
545fee65b7eSAlexander V. Chernikov)
546fee65b7eSAlexander V. Chernikov
547fee65b7eSAlexander V. Chernikovrtnl_ifla_attrs = prepare_attrs_map(
548fee65b7eSAlexander V. Chernikov    [
549fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_ADDRESS, NlAttrMac),
550fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_BROADCAST, NlAttrMac),
551fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_IFNAME, NlAttrStr),
552fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_MTU, NlAttrU32),
553fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_LINK, NlAttrU32),
554fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_PROMISCUITY, NlAttrU32),
555fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_OPERSTATE, NlAttrU8),
556fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_CARRIER, NlAttrU8),
557fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_IFALIAS, NlAttrStr),
558fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_STATS64, NlAttrIfStats),
559fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_NEW_IFINDEX, NlAttrU32),
560fee65b7eSAlexander V. Chernikov        AttrDescr(
561fee65b7eSAlexander V. Chernikov            IflattrType.IFLA_LINKINFO,
562fee65b7eSAlexander V. Chernikov            NlAttrNested,
563fee65b7eSAlexander V. Chernikov            [
564fee65b7eSAlexander V. Chernikov                AttrDescr(IflinkInfo.IFLA_INFO_KIND, NlAttrStr),
565fee65b7eSAlexander V. Chernikov                AttrDescr(IflinkInfo.IFLA_INFO_DATA, NlAttr),
566fee65b7eSAlexander V. Chernikov            ],
567fee65b7eSAlexander V. Chernikov        ),
568fee65b7eSAlexander V. Chernikov    ]
569fee65b7eSAlexander V. Chernikov)
570fee65b7eSAlexander V. Chernikov
571fee65b7eSAlexander V. Chernikovrtnl_ifa_attrs = prepare_attrs_map(
572fee65b7eSAlexander V. Chernikov    [
573*d91f8db5SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_ADDRESS, NlAttrIp),
574*d91f8db5SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_LOCAL, NlAttrIp),
575*d91f8db5SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_LABEL, NlAttrStr),
576*d91f8db5SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_BROADCAST, NlAttrIp),
577*d91f8db5SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_ANYCAST, NlAttrIp),
578*d91f8db5SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_FLAGS, NlAttrU32),
579fee65b7eSAlexander V. Chernikov    ]
580fee65b7eSAlexander V. Chernikov)
581fee65b7eSAlexander V. Chernikov
582fee65b7eSAlexander V. Chernikov
583fee65b7eSAlexander V. Chernikovrtnl_nd_attrs = prepare_attrs_map(
584fee65b7eSAlexander V. Chernikov    [
585fee65b7eSAlexander V. Chernikov        AttrDescr(NdAttrType.NDA_DST, NlAttrIp),
586fee65b7eSAlexander V. Chernikov        AttrDescr(NdAttrType.NDA_IFINDEX, NlAttrIfindex),
587fee65b7eSAlexander V. Chernikov        AttrDescr(NdAttrType.NDA_FLAGS_EXT, NlAttrU32),
588fee65b7eSAlexander V. Chernikov        AttrDescr(NdAttrType.NDA_LLADDR, NlAttrMac),
589fee65b7eSAlexander V. Chernikov    ]
590fee65b7eSAlexander V. Chernikov)
591fee65b7eSAlexander V. Chernikov
592fee65b7eSAlexander V. Chernikov
593fee65b7eSAlexander V. Chernikovclass BaseNetlinkRtMessage(StdNetlinkMessage):
594fee65b7eSAlexander V. Chernikov    pass
595fee65b7eSAlexander V. Chernikov
596fee65b7eSAlexander V. Chernikov
597fee65b7eSAlexander V. Chernikovclass NetlinkRtMessage(BaseNetlinkRtMessage):
598fee65b7eSAlexander V. Chernikov    messages = [
599fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_NEWROUTE, NlMsgCategory.NEW),
600fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_DELROUTE, NlMsgCategory.DELETE),
601fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_GETROUTE, NlMsgCategory.GET),
602fee65b7eSAlexander V. Chernikov    ]
603fee65b7eSAlexander V. Chernikov    nl_attrs_map = rtnl_route_attrs
604fee65b7eSAlexander V. Chernikov
605fee65b7eSAlexander V. Chernikov    def __init__(self, helper, nlm_type):
606fee65b7eSAlexander V. Chernikov        super().__init__(helper, nlm_type)
607fee65b7eSAlexander V. Chernikov        self.base_hdr = RtMsgHdr()
608fee65b7eSAlexander V. Chernikov
609fee65b7eSAlexander V. Chernikov    def parse_base_header(self, data):
610fee65b7eSAlexander V. Chernikov        if len(data) < sizeof(RtMsgHdr):
611fee65b7eSAlexander V. Chernikov            raise ValueError("length less than rtmsg header")
612fee65b7eSAlexander V. Chernikov        rtm_hdr = RtMsgHdr.from_buffer_copy(data)
613fee65b7eSAlexander V. Chernikov        return (rtm_hdr, sizeof(RtMsgHdr))
614fee65b7eSAlexander V. Chernikov
615fee65b7eSAlexander V. Chernikov    def print_base_header(self, hdr, prepend=""):
616fee65b7eSAlexander V. Chernikov        family = self.helper.get_af_name(hdr.rtm_family)
617fee65b7eSAlexander V. Chernikov        print(
618fee65b7eSAlexander V. Chernikov            "{}family={}, dst_len={}, src_len={}, tos={}, table={}, protocol={}({}), scope={}({}), type={}({}), flags={}({})".format(  # noqa: E501
619fee65b7eSAlexander V. Chernikov                prepend,
620fee65b7eSAlexander V. Chernikov                family,
621fee65b7eSAlexander V. Chernikov                hdr.rtm_dst_len,
622fee65b7eSAlexander V. Chernikov                hdr.rtm_src_len,
623fee65b7eSAlexander V. Chernikov                hdr.rtm_tos,
624fee65b7eSAlexander V. Chernikov                hdr.rtm_table,
625fee65b7eSAlexander V. Chernikov                self.helper.get_attr_byval(RtProto, hdr.rtm_protocol),
626fee65b7eSAlexander V. Chernikov                hdr.rtm_protocol,
627fee65b7eSAlexander V. Chernikov                self.helper.get_attr_byval(RtScope, hdr.rtm_scope),
628fee65b7eSAlexander V. Chernikov                hdr.rtm_scope,
629fee65b7eSAlexander V. Chernikov                self.helper.get_attr_byval(RtType, hdr.rtm_type),
630fee65b7eSAlexander V. Chernikov                hdr.rtm_type,
631fee65b7eSAlexander V. Chernikov                self.helper.get_bitmask_str(RtMsgFlags, hdr.rtm_flags),
632fee65b7eSAlexander V. Chernikov                hdr.rtm_flags,
633fee65b7eSAlexander V. Chernikov            )
634fee65b7eSAlexander V. Chernikov        )
635fee65b7eSAlexander V. Chernikov
636fee65b7eSAlexander V. Chernikov
637fee65b7eSAlexander V. Chernikovclass NetlinkIflaMessage(BaseNetlinkRtMessage):
638fee65b7eSAlexander V. Chernikov    messages = [
639fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_NEWLINK, NlMsgCategory.NEW),
640fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_DELLINK, NlMsgCategory.DELETE),
641fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_GETLINK, NlMsgCategory.GET),
642fee65b7eSAlexander V. Chernikov    ]
643fee65b7eSAlexander V. Chernikov    nl_attrs_map = rtnl_ifla_attrs
644fee65b7eSAlexander V. Chernikov
645fee65b7eSAlexander V. Chernikov    def __init__(self, helper, nlm_type):
646fee65b7eSAlexander V. Chernikov        super().__init__(helper, nlm_type)
647fee65b7eSAlexander V. Chernikov        self.base_hdr = IfinfoMsg()
648fee65b7eSAlexander V. Chernikov
649fee65b7eSAlexander V. Chernikov    def parse_base_header(self, data):
650fee65b7eSAlexander V. Chernikov        if len(data) < sizeof(IfinfoMsg):
651fee65b7eSAlexander V. Chernikov            raise ValueError("length less than IfinfoMsg header")
652fee65b7eSAlexander V. Chernikov        rtm_hdr = IfinfoMsg.from_buffer_copy(data)
653fee65b7eSAlexander V. Chernikov        return (rtm_hdr, sizeof(IfinfoMsg))
654fee65b7eSAlexander V. Chernikov
655fee65b7eSAlexander V. Chernikov    def print_base_header(self, hdr, prepend=""):
656fee65b7eSAlexander V. Chernikov        family = self.helper.get_af_name(hdr.ifi_family)
657fee65b7eSAlexander V. Chernikov        print(
658fee65b7eSAlexander V. Chernikov            "{}family={}, ifi_type={}, ifi_index={}, ifi_flags={}, ifi_change={}".format(  # noqa: E501
659fee65b7eSAlexander V. Chernikov                prepend,
660fee65b7eSAlexander V. Chernikov                family,
661fee65b7eSAlexander V. Chernikov                hdr.ifi_type,
662fee65b7eSAlexander V. Chernikov                hdr.ifi_index,
663fee65b7eSAlexander V. Chernikov                hdr.ifi_flags,
664fee65b7eSAlexander V. Chernikov                hdr.ifi_change,
665fee65b7eSAlexander V. Chernikov            )
666fee65b7eSAlexander V. Chernikov        )
667fee65b7eSAlexander V. Chernikov
668fee65b7eSAlexander V. Chernikov
669fee65b7eSAlexander V. Chernikovclass NetlinkIfaMessage(BaseNetlinkRtMessage):
670fee65b7eSAlexander V. Chernikov    messages = [
671fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_NEWADDR, NlMsgCategory.NEW),
672fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_DELADDR, NlMsgCategory.DELETE),
673fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_GETADDR, NlMsgCategory.GET),
674fee65b7eSAlexander V. Chernikov    ]
675fee65b7eSAlexander V. Chernikov    nl_attrs_map = rtnl_ifa_attrs
676fee65b7eSAlexander V. Chernikov
677fee65b7eSAlexander V. Chernikov    def __init__(self, helper, nlm_type):
678fee65b7eSAlexander V. Chernikov        super().__init__(helper, nlm_type)
679fee65b7eSAlexander V. Chernikov        self.base_hdr = IfaddrMsg()
680fee65b7eSAlexander V. Chernikov
681fee65b7eSAlexander V. Chernikov    def parse_base_header(self, data):
682fee65b7eSAlexander V. Chernikov        if len(data) < sizeof(IfaddrMsg):
683fee65b7eSAlexander V. Chernikov            raise ValueError("length less than IfaddrMsg header")
684fee65b7eSAlexander V. Chernikov        rtm_hdr = IfaddrMsg.from_buffer_copy(data)
685fee65b7eSAlexander V. Chernikov        return (rtm_hdr, sizeof(IfaddrMsg))
686fee65b7eSAlexander V. Chernikov
687fee65b7eSAlexander V. Chernikov    def print_base_header(self, hdr, prepend=""):
688fee65b7eSAlexander V. Chernikov        family = self.helper.get_af_name(hdr.ifa_family)
689fee65b7eSAlexander V. Chernikov        print(
690fee65b7eSAlexander V. Chernikov            "{}family={}, ifa_prefixlen={}, ifa_flags={}, ifa_scope={}, ifa_index={}".format(  # noqa: E501
691fee65b7eSAlexander V. Chernikov                prepend,
692fee65b7eSAlexander V. Chernikov                family,
693fee65b7eSAlexander V. Chernikov                hdr.ifa_prefixlen,
694fee65b7eSAlexander V. Chernikov                hdr.ifa_flags,
695fee65b7eSAlexander V. Chernikov                hdr.ifa_scope,
696fee65b7eSAlexander V. Chernikov                hdr.ifa_index,
697fee65b7eSAlexander V. Chernikov            )
698fee65b7eSAlexander V. Chernikov        )
699fee65b7eSAlexander V. Chernikov
700fee65b7eSAlexander V. Chernikov
701fee65b7eSAlexander V. Chernikovclass NetlinkNdMessage(BaseNetlinkRtMessage):
702fee65b7eSAlexander V. Chernikov    messages = [
703fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_NEWNEIGH, NlMsgCategory.NEW),
704fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_DELNEIGH, NlMsgCategory.DELETE),
705fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_GETNEIGH, NlMsgCategory.GET),
706fee65b7eSAlexander V. Chernikov    ]
707fee65b7eSAlexander V. Chernikov    nl_attrs_map = rtnl_nd_attrs
708fee65b7eSAlexander V. Chernikov
709fee65b7eSAlexander V. Chernikov    def __init__(self, helper, nlm_type):
710fee65b7eSAlexander V. Chernikov        super().__init__(helper, nlm_type)
711fee65b7eSAlexander V. Chernikov        self.base_hdr = NdMsg()
712fee65b7eSAlexander V. Chernikov
713fee65b7eSAlexander V. Chernikov    def parse_base_header(self, data):
714fee65b7eSAlexander V. Chernikov        if len(data) < sizeof(NdMsg):
715fee65b7eSAlexander V. Chernikov            raise ValueError("length less than NdMsg header")
716fee65b7eSAlexander V. Chernikov        nd_hdr = NdMsg.from_buffer_copy(data)
717fee65b7eSAlexander V. Chernikov        return (nd_hdr, sizeof(NdMsg))
718fee65b7eSAlexander V. Chernikov
719fee65b7eSAlexander V. Chernikov    def print_base_header(self, hdr, prepend=""):
720fee65b7eSAlexander V. Chernikov        family = self.helper.get_af_name(hdr.ndm_family)
721fee65b7eSAlexander V. Chernikov        print(
722fee65b7eSAlexander V. Chernikov            "{}family={}, ndm_ifindex={}, ndm_state={}, ndm_flags={}".format(  # noqa: E501
723fee65b7eSAlexander V. Chernikov                prepend,
724fee65b7eSAlexander V. Chernikov                family,
725fee65b7eSAlexander V. Chernikov                hdr.ndm_ifindex,
726fee65b7eSAlexander V. Chernikov                hdr.ndm_state,
727fee65b7eSAlexander V. Chernikov                hdr.ndm_flags,
728fee65b7eSAlexander V. Chernikov            )
729fee65b7eSAlexander V. Chernikov        )
730fc2538cbSAlexander V. Chernikov
731fc2538cbSAlexander V. Chernikov
732fc2538cbSAlexander V. Chernikovhandler_classes = {
733fc2538cbSAlexander V. Chernikov    "netlink_route": [
734fc2538cbSAlexander V. Chernikov        NetlinkRtMessage,
735fc2538cbSAlexander V. Chernikov        NetlinkIflaMessage,
736fc2538cbSAlexander V. Chernikov        NetlinkIfaMessage,
737fc2538cbSAlexander V. Chernikov        NetlinkNdMessage,
738fc2538cbSAlexander V. Chernikov    ],
739fc2538cbSAlexander V. Chernikov}
740