xref: /freebsd/tests/atf_python/sys/netlink/netlink_route.py (revision 10b94e406444d65af99d344f87d1de320b6cd87e)
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
294*10b94e40SAlexander V. Chernikov    IFLA_ADDRESS = 1
295*10b94e40SAlexander V. Chernikov    IFLA_BROADCAST = 2
296*10b94e40SAlexander V. Chernikov    IFLA_IFNAME = 3
297*10b94e40SAlexander V. Chernikov    IFLA_MTU = 4
298*10b94e40SAlexander V. Chernikov    IFLA_LINK = 5
299*10b94e40SAlexander V. Chernikov    IFLA_QDISC = 6
300*10b94e40SAlexander V. Chernikov    IFLA_STATS = 7
301*10b94e40SAlexander V. Chernikov    IFLA_COST = 8
302*10b94e40SAlexander V. Chernikov    IFLA_PRIORITY = 9
303*10b94e40SAlexander V. Chernikov    IFLA_MASTER = 10
304*10b94e40SAlexander V. Chernikov    IFLA_WIRELESS = 11
305*10b94e40SAlexander V. Chernikov    IFLA_PROTINFO = 12
306*10b94e40SAlexander V. Chernikov    IFLA_TXQLEN = 13
307*10b94e40SAlexander V. Chernikov    IFLA_MAP = 14
308*10b94e40SAlexander V. Chernikov    IFLA_WEIGHT = 15
309*10b94e40SAlexander V. Chernikov    IFLA_OPERSTATE = 16
310*10b94e40SAlexander V. Chernikov    IFLA_LINKMODE = 17
311*10b94e40SAlexander V. Chernikov    IFLA_LINKINFO = 18
312*10b94e40SAlexander V. Chernikov    IFLA_NET_NS_PID = 19
313*10b94e40SAlexander V. Chernikov    IFLA_IFALIAS = 20
314*10b94e40SAlexander V. Chernikov    IFLA_NUM_VF = 21
315*10b94e40SAlexander V. Chernikov    IFLA_VFINFO_LIST = 22
316*10b94e40SAlexander V. Chernikov    IFLA_STATS64 = 23
317*10b94e40SAlexander V. Chernikov    IFLA_VF_PORTS = 24
318*10b94e40SAlexander V. Chernikov    IFLA_PORT_SELF = 25
319*10b94e40SAlexander V. Chernikov    IFLA_AF_SPEC = 26
320*10b94e40SAlexander V. Chernikov    IFLA_GROUP = 27
321*10b94e40SAlexander V. Chernikov    IFLA_NET_NS_FD = 28
322*10b94e40SAlexander V. Chernikov    IFLA_EXT_MASK = 29
323*10b94e40SAlexander V. Chernikov    IFLA_PROMISCUITY = 30
324*10b94e40SAlexander V. Chernikov    IFLA_NUM_TX_QUEUES = 31
325*10b94e40SAlexander V. Chernikov    IFLA_NUM_RX_QUEUES = 32
326*10b94e40SAlexander V. Chernikov    IFLA_CARRIER = 33
327*10b94e40SAlexander V. Chernikov    IFLA_PHYS_PORT_ID = 34
328*10b94e40SAlexander V. Chernikov    IFLA_CARRIER_CHANGES = 35
329*10b94e40SAlexander V. Chernikov    IFLA_PHYS_SWITCH_ID = 36
330*10b94e40SAlexander V. Chernikov    IFLA_LINK_NETNSID = 37
331*10b94e40SAlexander V. Chernikov    IFLA_PHYS_PORT_NAME = 38
332*10b94e40SAlexander V. Chernikov    IFLA_PROTO_DOWN = 39
333*10b94e40SAlexander V. Chernikov    IFLA_GSO_MAX_SEGS = 40
334*10b94e40SAlexander V. Chernikov    IFLA_GSO_MAX_SIZE = 41
335*10b94e40SAlexander V. Chernikov    IFLA_PAD = 42
336*10b94e40SAlexander V. Chernikov    IFLA_XDP = 43
337*10b94e40SAlexander V. Chernikov    IFLA_EVENT = 44
338*10b94e40SAlexander V. Chernikov    IFLA_NEW_NETNSID = 45
339*10b94e40SAlexander V. Chernikov    IFLA_IF_NETNSID = 46
340*10b94e40SAlexander V. Chernikov    IFLA_CARRIER_UP_COUNT = 47
341*10b94e40SAlexander V. Chernikov    IFLA_CARRIER_DOWN_COUNT = 48
342*10b94e40SAlexander V. Chernikov    IFLA_NEW_IFINDEX = 49
343*10b94e40SAlexander V. Chernikov    IFLA_MIN_MTU = 50
344*10b94e40SAlexander V. Chernikov    IFLA_MAX_MTU = 51
345*10b94e40SAlexander V. Chernikov    IFLA_PROP_LIST = 52
346*10b94e40SAlexander V. Chernikov    IFLA_ALT_IFNAME = 53
347*10b94e40SAlexander V. Chernikov    IFLA_PERM_ADDRESS = 54
348*10b94e40SAlexander V. Chernikov    IFLA_PROTO_DOWN_REASON = 55
349*10b94e40SAlexander V. Chernikov    IFLA_PARENT_DEV_NAME = 56
350*10b94e40SAlexander V. Chernikov    IFLA_PARENT_DEV_BUS_NAME = 57
351*10b94e40SAlexander V. Chernikov    IFLA_GRO_MAX_SIZE = 58
352*10b94e40SAlexander V. Chernikov    IFLA_TSO_MAX_SEGS = 59
353*10b94e40SAlexander V. Chernikov    IFLA_ALLMULTI = 60
354*10b94e40SAlexander V. Chernikov    IFLA_DEVLINK_PORT = 61
355*10b94e40SAlexander V. Chernikov    IFLA_GSO_IPV4_MAX_SIZE = 62
356*10b94e40SAlexander V. Chernikov    IFLA_GRO_IPV4_MAX_SIZE = 63
357*10b94e40SAlexander V. Chernikov    IFLA_FREEBSD = 64
358*10b94e40SAlexander V. Chernikov
359*10b94e40SAlexander V. Chernikov
360*10b94e40SAlexander V. Chernikovclass IflafAttrType(Enum):
361*10b94e40SAlexander V. Chernikov    IFLAF_UNSPEC = 0
362*10b94e40SAlexander V. Chernikov    IFLAF_ORIG_IFNAME = 1
363*10b94e40SAlexander V. Chernikov    IFLAF_ORIG_HWADDR = 2
364fee65b7eSAlexander V. Chernikov
365fee65b7eSAlexander V. Chernikov
366fee65b7eSAlexander V. Chernikovclass IflinkInfo(Enum):
367fee65b7eSAlexander V. Chernikov    IFLA_INFO_UNSPEC = 0
368fee65b7eSAlexander V. Chernikov    IFLA_INFO_KIND = auto()
369fee65b7eSAlexander V. Chernikov    IFLA_INFO_DATA = auto()
370fee65b7eSAlexander V. Chernikov    IFLA_INFO_XSTATS = auto()
371fee65b7eSAlexander V. Chernikov    IFLA_INFO_SLAVE_KIND = auto()
372fee65b7eSAlexander V. Chernikov    IFLA_INFO_SLAVE_DATA = auto()
373fee65b7eSAlexander V. Chernikov
374fee65b7eSAlexander V. Chernikov
375fee65b7eSAlexander V. Chernikovclass IfLinkInfoDataVlan(Enum):
376fee65b7eSAlexander V. Chernikov    IFLA_VLAN_UNSPEC = 0
377fee65b7eSAlexander V. Chernikov    IFLA_VLAN_ID = auto()
378fee65b7eSAlexander V. Chernikov    IFLA_VLAN_FLAGS = auto()
379fee65b7eSAlexander V. Chernikov    IFLA_VLAN_EGRESS_QOS = auto()
380fee65b7eSAlexander V. Chernikov    IFLA_VLAN_INGRESS_QOS = auto()
381fee65b7eSAlexander V. Chernikov    IFLA_VLAN_PROTOCOL = auto()
382fee65b7eSAlexander V. Chernikov
383fee65b7eSAlexander V. Chernikov
384fee65b7eSAlexander V. Chernikovclass IfaddrMsg(Structure):
385fee65b7eSAlexander V. Chernikov    _fields_ = [
386fee65b7eSAlexander V. Chernikov        ("ifa_family", c_ubyte),
387fee65b7eSAlexander V. Chernikov        ("ifa_prefixlen", c_ubyte),
388fee65b7eSAlexander V. Chernikov        ("ifa_flags", c_ubyte),
389fee65b7eSAlexander V. Chernikov        ("ifa_scope", c_ubyte),
390fee65b7eSAlexander V. Chernikov        ("ifa_index", c_uint),
391fee65b7eSAlexander V. Chernikov    ]
392fee65b7eSAlexander V. Chernikov
393fee65b7eSAlexander V. Chernikov
394d91f8db5SAlexander V. Chernikovclass IfaAttrType(Enum):
395fee65b7eSAlexander V. Chernikov    IFA_UNSPEC = 0
396*10b94e40SAlexander V. Chernikov    IFA_ADDRESS = 1
397*10b94e40SAlexander V. Chernikov    IFA_LOCAL = 2
398*10b94e40SAlexander V. Chernikov    IFA_LABEL = 3
399*10b94e40SAlexander V. Chernikov    IFA_BROADCAST = 4
400*10b94e40SAlexander V. Chernikov    IFA_ANYCAST = 5
401*10b94e40SAlexander V. Chernikov    IFA_CACHEINFO = 6
402*10b94e40SAlexander V. Chernikov    IFA_MULTICAST = 7
403*10b94e40SAlexander V. Chernikov    IFA_FLAGS = 8
404*10b94e40SAlexander V. Chernikov    IFA_RT_PRIORITY = 9
405*10b94e40SAlexander V. Chernikov    IFA_TARGET_NETNSID = 10
406*10b94e40SAlexander V. Chernikov    IFA_FREEBSD = 11
407*10b94e40SAlexander V. Chernikov
408*10b94e40SAlexander V. Chernikov
409*10b94e40SAlexander V. Chernikovclass IfafAttrType(Enum):
410*10b94e40SAlexander V. Chernikov    IFAF_UNSPEC = 0
411*10b94e40SAlexander V. Chernikov    IFAF_VHID = 1
412*10b94e40SAlexander V. Chernikov    IFAF_FLAGS = 2
413*10b94e40SAlexander V. Chernikov
414*10b94e40SAlexander V. Chernikov
415*10b94e40SAlexander V. Chernikovclass IfaCacheInfo(Structure):
416*10b94e40SAlexander V. Chernikov    _fields_ = [
417*10b94e40SAlexander V. Chernikov        ("ifa_prefered", c_uint),   # seconds till the end of the prefix considered preferred
418*10b94e40SAlexander V. Chernikov        ("ifa_valid", c_uint),      # seconds till the end of the prefix considered valid
419*10b94e40SAlexander V. Chernikov        ("cstamp", c_uint),         # creation time in 1ms intervals from the boot time
420*10b94e40SAlexander V. Chernikov        ("tstamp", c_uint),         # update time in 1ms intervals from the boot time
421*10b94e40SAlexander V. Chernikov    ]
422*10b94e40SAlexander V. Chernikov
423*10b94e40SAlexander V. Chernikov
424*10b94e40SAlexander V. Chernikovclass IfaFlags(Enum):
425*10b94e40SAlexander V. Chernikov    IFA_F_TEMPORARY = 0x01
426*10b94e40SAlexander V. Chernikov    IFA_F_NODAD = 0x02
427*10b94e40SAlexander V. Chernikov    IFA_F_OPTIMISTIC = 0x04
428*10b94e40SAlexander V. Chernikov    IFA_F_DADFAILED = 0x08
429*10b94e40SAlexander V. Chernikov    IFA_F_HOMEADDRESS = 0x10
430*10b94e40SAlexander V. Chernikov    IFA_F_DEPRECATED = 0x20
431*10b94e40SAlexander V. Chernikov    IFA_F_TENTATIVE = 0x40
432*10b94e40SAlexander V. Chernikov    IFA_F_PERMANENT = 0x80
433*10b94e40SAlexander V. Chernikov    IFA_F_MANAGETEMPADDR = 0x100
434*10b94e40SAlexander V. Chernikov    IFA_F_NOPREFIXROUTE = 0x200
435*10b94e40SAlexander V. Chernikov    IFA_F_MCAUTOJOIN = 0x400
436*10b94e40SAlexander V. Chernikov    IFA_F_STABLE_PRIVACY = 0x800
437*10b94e40SAlexander V. Chernikov
438*10b94e40SAlexander V. Chernikov
439*10b94e40SAlexander V. Chernikovclass IfafFlags6(Enum):
440*10b94e40SAlexander V. Chernikov    IN6_IFF_ANYCAST = 0x01
441*10b94e40SAlexander V. Chernikov    IN6_IFF_TENTATIVE = 0x02
442*10b94e40SAlexander V. Chernikov    IN6_IFF_DUPLICATED = 0x04
443*10b94e40SAlexander V. Chernikov    IN6_IFF_DETACHED = 0x08
444*10b94e40SAlexander V. Chernikov    IN6_IFF_DEPRECATED = 0x10
445*10b94e40SAlexander V. Chernikov    IN6_IFF_NODAD = 0x20
446*10b94e40SAlexander V. Chernikov    IN6_IFF_AUTOCONF = 0x40
447*10b94e40SAlexander V. Chernikov    IN6_IFF_TEMPORARY = 0x80
448*10b94e40SAlexander V. Chernikov    IN6_IFF_PREFER_SOURCE = 0x100
449fee65b7eSAlexander V. Chernikov
450fee65b7eSAlexander V. Chernikov
451fee65b7eSAlexander V. Chernikovclass NdMsg(Structure):
452fee65b7eSAlexander V. Chernikov    _fields_ = [
453fee65b7eSAlexander V. Chernikov        ("ndm_family", c_ubyte),
454fee65b7eSAlexander V. Chernikov        ("ndm_pad1", c_ubyte),
455fee65b7eSAlexander V. Chernikov        ("ndm_pad2", c_ubyte),
456fee65b7eSAlexander V. Chernikov        ("ndm_ifindex", c_uint),
457fee65b7eSAlexander V. Chernikov        ("ndm_state", c_ushort),
458fee65b7eSAlexander V. Chernikov        ("ndm_flags", c_ubyte),
459fee65b7eSAlexander V. Chernikov        ("ndm_type", c_ubyte),
460fee65b7eSAlexander V. Chernikov    ]
461fee65b7eSAlexander V. Chernikov
462fee65b7eSAlexander V. Chernikov
463fee65b7eSAlexander V. Chernikovclass NdAttrType(Enum):
464fee65b7eSAlexander V. Chernikov    NDA_UNSPEC = 0
465fee65b7eSAlexander V. Chernikov    NDA_DST = 1
466fee65b7eSAlexander V. Chernikov    NDA_LLADDR = 2
467fee65b7eSAlexander V. Chernikov    NDA_CACHEINFO = 3
468fee65b7eSAlexander V. Chernikov    NDA_PROBES = 4
469fee65b7eSAlexander V. Chernikov    NDA_VLAN = 5
470fee65b7eSAlexander V. Chernikov    NDA_PORT = 6
471fee65b7eSAlexander V. Chernikov    NDA_VNI = 7
472fee65b7eSAlexander V. Chernikov    NDA_IFINDEX = 8
473fee65b7eSAlexander V. Chernikov    NDA_MASTER = 9
474fee65b7eSAlexander V. Chernikov    NDA_LINK_NETNSID = 10
475fee65b7eSAlexander V. Chernikov    NDA_SRC_VNI = 11
476fee65b7eSAlexander V. Chernikov    NDA_PROTOCOL = 12
477fee65b7eSAlexander V. Chernikov    NDA_NH_ID = 13
478fee65b7eSAlexander V. Chernikov    NDA_FDB_EXT_ATTRS = 14
479fee65b7eSAlexander V. Chernikov    NDA_FLAGS_EXT = 15
480fee65b7eSAlexander V. Chernikov    NDA_NDM_STATE_MASK = 16
481fee65b7eSAlexander V. Chernikov    NDA_NDM_FLAGS_MASK = 17
482fee65b7eSAlexander V. Chernikov
483fee65b7eSAlexander V. Chernikov
484fee65b7eSAlexander V. Chernikovclass NlAttrRtFlags(NlAttrU32):
485fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
486fee65b7eSAlexander V. Chernikov        s = get_bitmask_str(RtFlagsBSD, self.u32)
487fee65b7eSAlexander V. Chernikov        return " rtflags={}".format(s)
488fee65b7eSAlexander V. Chernikov
489fee65b7eSAlexander V. Chernikov
490fee65b7eSAlexander V. Chernikovclass NlAttrIfindex(NlAttrU32):
491fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
492fee65b7eSAlexander V. Chernikov        try:
493fee65b7eSAlexander V. Chernikov            ifname = socket.if_indextoname(self.u32)
494fee65b7eSAlexander V. Chernikov            return " iface={}(#{})".format(ifname, self.u32)
495fee65b7eSAlexander V. Chernikov        except OSError:
496fee65b7eSAlexander V. Chernikov            pass
497fee65b7eSAlexander V. Chernikov        return " iface=if#{}".format(self.u32)
498fee65b7eSAlexander V. Chernikov
499fee65b7eSAlexander V. Chernikov
500fee65b7eSAlexander V. Chernikovclass NlAttrTable(NlAttrU32):
501fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
502fee65b7eSAlexander V. Chernikov        return " rtable={}".format(self.u32)
503fee65b7eSAlexander V. Chernikov
504fee65b7eSAlexander V. Chernikov
505fee65b7eSAlexander V. Chernikovclass NlAttrNhId(NlAttrU32):
506fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
507fee65b7eSAlexander V. Chernikov        return " nh_id={}".format(self.u32)
508fee65b7eSAlexander V. Chernikov
509fee65b7eSAlexander V. Chernikov
510fee65b7eSAlexander V. Chernikovclass NlAttrKNhId(NlAttrU32):
511fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
512fee65b7eSAlexander V. Chernikov        return " knh_id={}".format(self.u32)
513fee65b7eSAlexander V. Chernikov
514fee65b7eSAlexander V. Chernikov
515fee65b7eSAlexander V. Chernikovclass NlAttrMac(NlAttr):
516fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
517fee65b7eSAlexander V. Chernikov        return ' mac="' + ":".join(["{:02X}".format(b) for b in self._data]) + '"'
518fee65b7eSAlexander V. Chernikov
519fee65b7eSAlexander V. Chernikov
520fee65b7eSAlexander V. Chernikovclass NlAttrIfStats(NlAttr):
521fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
522fee65b7eSAlexander V. Chernikov        return " stats={...}"
523fee65b7eSAlexander V. Chernikov
524fee65b7eSAlexander V. Chernikov
525*10b94e40SAlexander V. Chernikovclass NlAttrCacheInfo(NlAttr):
526*10b94e40SAlexander V. Chernikov    def __init__(self, nla_type, data):
527*10b94e40SAlexander V. Chernikov        super().__init__(nla_type, data)
528*10b94e40SAlexander V. Chernikov        self.ci = IfaCacheInfo.from_buffer_copy(data)
529*10b94e40SAlexander V. Chernikov
530*10b94e40SAlexander V. Chernikov    @staticmethod
531*10b94e40SAlexander V. Chernikov    def _validate(data):
532*10b94e40SAlexander V. Chernikov        nla_len, nla_type = struct.unpack("@HH", data[:4])
533*10b94e40SAlexander V. Chernikov        data_len = nla_len - 4
534*10b94e40SAlexander V. Chernikov        if data_len != sizeof(IfaCacheInfo):
535*10b94e40SAlexander V. Chernikov            raise ValueError(
536*10b94e40SAlexander V. Chernikov                "Error validating attr {}: wrong size".format(nla_type)
537*10b94e40SAlexander V. Chernikov            )  # noqa: E501
538*10b94e40SAlexander V. Chernikov
539*10b94e40SAlexander V. Chernikov    def _print_attr_value(self):
540*10b94e40SAlexander V. Chernikov        return " ifa_prefered={} ifa_valid={} cstamp={} tstamp={}".format(
541*10b94e40SAlexander V. Chernikov                self.ci.ifa_prefered, self.ci.ifa_valid, self.ci.cstamp, self.ci.tstamp)
542*10b94e40SAlexander V. Chernikov
543*10b94e40SAlexander V. Chernikov
544fee65b7eSAlexander V. Chernikovclass NlAttrVia(NlAttr):
545fee65b7eSAlexander V. Chernikov    def __init__(self, nla_type, family, addr: str):
546fee65b7eSAlexander V. Chernikov        super().__init__(nla_type, b"")
547fee65b7eSAlexander V. Chernikov        self.addr = addr
548fee65b7eSAlexander V. Chernikov        self.family = family
549fee65b7eSAlexander V. Chernikov
550fee65b7eSAlexander V. Chernikov    @staticmethod
551fee65b7eSAlexander V. Chernikov    def _validate(data):
552fee65b7eSAlexander V. Chernikov        nla_len, nla_type = struct.unpack("@HH", data[:4])
553fee65b7eSAlexander V. Chernikov        data_len = nla_len - 4
554fee65b7eSAlexander V. Chernikov        if data_len == 0:
555fee65b7eSAlexander V. Chernikov            raise ValueError(
556fee65b7eSAlexander V. Chernikov                "Error validating attr {}: empty data".format(nla_type)
557fee65b7eSAlexander V. Chernikov            )  # noqa: E501
558fee65b7eSAlexander V. Chernikov        family = int(data_len[0])
559fee65b7eSAlexander V. Chernikov        if family not in (socket.AF_INET, socket.AF_INET6):
560fee65b7eSAlexander V. Chernikov            raise ValueError(
561fee65b7eSAlexander V. Chernikov                "Error validating attr {}: unsupported AF {}".format(  # noqa: E501
562fee65b7eSAlexander V. Chernikov                    nla_type, family
563fee65b7eSAlexander V. Chernikov                )
564fee65b7eSAlexander V. Chernikov            )
565fee65b7eSAlexander V. Chernikov        if family == socket.AF_INET:
566fee65b7eSAlexander V. Chernikov            expected_len = 1 + 4
567fee65b7eSAlexander V. Chernikov        else:
568fee65b7eSAlexander V. Chernikov            expected_len = 1 + 16
569fee65b7eSAlexander V. Chernikov        if data_len != expected_len:
570fee65b7eSAlexander V. Chernikov            raise ValueError(
571fee65b7eSAlexander V. Chernikov                "Error validating attr {}: expected len {} got {}".format(  # noqa: E501
572fee65b7eSAlexander V. Chernikov                    nla_type, expected_len, data_len
573fee65b7eSAlexander V. Chernikov                )
574fee65b7eSAlexander V. Chernikov            )
575fee65b7eSAlexander V. Chernikov
576fee65b7eSAlexander V. Chernikov    @property
577fee65b7eSAlexander V. Chernikov    def nla_len(self):
578fee65b7eSAlexander V. Chernikov        if self.family == socket.AF_INET6:
579fee65b7eSAlexander V. Chernikov            return 21
580fee65b7eSAlexander V. Chernikov        else:
581fee65b7eSAlexander V. Chernikov            return 9
582fee65b7eSAlexander V. Chernikov
583fee65b7eSAlexander V. Chernikov    @classmethod
584fee65b7eSAlexander V. Chernikov    def _parse(cls, data):
585fee65b7eSAlexander V. Chernikov        nla_len, nla_type, family = struct.unpack("@HHB", data[:5])
586fee65b7eSAlexander V. Chernikov        off = 5
587fee65b7eSAlexander V. Chernikov        if family == socket.AF_INET:
588fee65b7eSAlexander V. Chernikov            addr = socket.inet_ntop(family, data[off:off + 4])
589fee65b7eSAlexander V. Chernikov        else:
590fee65b7eSAlexander V. Chernikov            addr = socket.inet_ntop(family, data[off:off + 16])
591fee65b7eSAlexander V. Chernikov        return cls(nla_type, family, addr)
592fee65b7eSAlexander V. Chernikov
593fee65b7eSAlexander V. Chernikov    def __bytes__(self):
594fee65b7eSAlexander V. Chernikov        addr = socket.inet_pton(self.family, self.addr)
595fee65b7eSAlexander V. Chernikov        return self._to_bytes(struct.pack("@B", self.family) + addr)
596fee65b7eSAlexander V. Chernikov
597fee65b7eSAlexander V. Chernikov    def _print_attr_value(self):
598fee65b7eSAlexander V. Chernikov        return " via={}".format(self.addr)
599fee65b7eSAlexander V. Chernikov
600fee65b7eSAlexander V. Chernikov
601fee65b7eSAlexander V. Chernikovrtnl_route_attrs = prepare_attrs_map(
602fee65b7eSAlexander V. Chernikov    [
603fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_DST, NlAttrIp),
604fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_SRC, NlAttrIp),
605fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_IIF, NlAttrIfindex),
606fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_OIF, NlAttrIfindex),
607fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_GATEWAY, NlAttrIp),
608fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_TABLE, NlAttrTable),
609fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_PRIORITY, NlAttrU32),
610fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_VIA, NlAttrVia),
611fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_NH_ID, NlAttrNhId),
612fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_KNH_ID, NlAttrKNhId),
613fee65b7eSAlexander V. Chernikov        AttrDescr(RtattrType.RTA_RTFLAGS, NlAttrRtFlags),
614fee65b7eSAlexander V. Chernikov        AttrDescr(
615fee65b7eSAlexander V. Chernikov            RtattrType.RTA_METRICS,
616fee65b7eSAlexander V. Chernikov            NlAttrNested,
617fee65b7eSAlexander V. Chernikov            [
618fee65b7eSAlexander V. Chernikov                AttrDescr(NlRtaxType.RTAX_MTU, NlAttrU32),
619fee65b7eSAlexander V. Chernikov            ],
620fee65b7eSAlexander V. Chernikov        ),
621fee65b7eSAlexander V. Chernikov    ]
622fee65b7eSAlexander V. Chernikov)
623fee65b7eSAlexander V. Chernikov
624fee65b7eSAlexander V. Chernikovrtnl_ifla_attrs = prepare_attrs_map(
625fee65b7eSAlexander V. Chernikov    [
626fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_ADDRESS, NlAttrMac),
627fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_BROADCAST, NlAttrMac),
628fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_IFNAME, NlAttrStr),
629fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_MTU, NlAttrU32),
630fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_LINK, NlAttrU32),
631fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_PROMISCUITY, NlAttrU32),
632fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_OPERSTATE, NlAttrU8),
633fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_CARRIER, NlAttrU8),
634fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_IFALIAS, NlAttrStr),
635fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_STATS64, NlAttrIfStats),
636fee65b7eSAlexander V. Chernikov        AttrDescr(IflattrType.IFLA_NEW_IFINDEX, NlAttrU32),
637fee65b7eSAlexander V. Chernikov        AttrDescr(
638fee65b7eSAlexander V. Chernikov            IflattrType.IFLA_LINKINFO,
639fee65b7eSAlexander V. Chernikov            NlAttrNested,
640fee65b7eSAlexander V. Chernikov            [
641fee65b7eSAlexander V. Chernikov                AttrDescr(IflinkInfo.IFLA_INFO_KIND, NlAttrStr),
642fee65b7eSAlexander V. Chernikov                AttrDescr(IflinkInfo.IFLA_INFO_DATA, NlAttr),
643fee65b7eSAlexander V. Chernikov            ],
644fee65b7eSAlexander V. Chernikov        ),
645*10b94e40SAlexander V. Chernikov        AttrDescr(
646*10b94e40SAlexander V. Chernikov            IflattrType.IFLA_FREEBSD,
647*10b94e40SAlexander V. Chernikov            NlAttrNested,
648*10b94e40SAlexander V. Chernikov            [
649*10b94e40SAlexander V. Chernikov                AttrDescr(IflafAttrType.IFLAF_ORIG_HWADDR, NlAttrMac),
650*10b94e40SAlexander V. Chernikov            ],
651*10b94e40SAlexander V. Chernikov        ),
652fee65b7eSAlexander V. Chernikov    ]
653fee65b7eSAlexander V. Chernikov)
654fee65b7eSAlexander V. Chernikov
655fee65b7eSAlexander V. Chernikovrtnl_ifa_attrs = prepare_attrs_map(
656fee65b7eSAlexander V. Chernikov    [
657d91f8db5SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_ADDRESS, NlAttrIp),
658d91f8db5SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_LOCAL, NlAttrIp),
659d91f8db5SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_LABEL, NlAttrStr),
660d91f8db5SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_BROADCAST, NlAttrIp),
661d91f8db5SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_ANYCAST, NlAttrIp),
662d91f8db5SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_FLAGS, NlAttrU32),
663*10b94e40SAlexander V. Chernikov        AttrDescr(IfaAttrType.IFA_CACHEINFO, NlAttrCacheInfo),
664*10b94e40SAlexander V. Chernikov        AttrDescr(
665*10b94e40SAlexander V. Chernikov            IfaAttrType.IFA_FREEBSD,
666*10b94e40SAlexander V. Chernikov            NlAttrNested,
667*10b94e40SAlexander V. Chernikov            [
668*10b94e40SAlexander V. Chernikov                AttrDescr(IfafAttrType.IFAF_VHID, NlAttrU32),
669*10b94e40SAlexander V. Chernikov                AttrDescr(IfafAttrType.IFAF_FLAGS, NlAttrU32),
670*10b94e40SAlexander V. Chernikov            ],
671*10b94e40SAlexander V. Chernikov        ),
672fee65b7eSAlexander V. Chernikov    ]
673fee65b7eSAlexander V. Chernikov)
674fee65b7eSAlexander V. Chernikov
675fee65b7eSAlexander V. Chernikov
676fee65b7eSAlexander V. Chernikovrtnl_nd_attrs = prepare_attrs_map(
677fee65b7eSAlexander V. Chernikov    [
678fee65b7eSAlexander V. Chernikov        AttrDescr(NdAttrType.NDA_DST, NlAttrIp),
679fee65b7eSAlexander V. Chernikov        AttrDescr(NdAttrType.NDA_IFINDEX, NlAttrIfindex),
680fee65b7eSAlexander V. Chernikov        AttrDescr(NdAttrType.NDA_FLAGS_EXT, NlAttrU32),
681fee65b7eSAlexander V. Chernikov        AttrDescr(NdAttrType.NDA_LLADDR, NlAttrMac),
682fee65b7eSAlexander V. Chernikov    ]
683fee65b7eSAlexander V. Chernikov)
684fee65b7eSAlexander V. Chernikov
685fee65b7eSAlexander V. Chernikov
686fee65b7eSAlexander V. Chernikovclass BaseNetlinkRtMessage(StdNetlinkMessage):
687fee65b7eSAlexander V. Chernikov    pass
688fee65b7eSAlexander V. Chernikov
689fee65b7eSAlexander V. Chernikov
690fee65b7eSAlexander V. Chernikovclass NetlinkRtMessage(BaseNetlinkRtMessage):
691fee65b7eSAlexander V. Chernikov    messages = [
692fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_NEWROUTE, NlMsgCategory.NEW),
693fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_DELROUTE, NlMsgCategory.DELETE),
694fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_GETROUTE, NlMsgCategory.GET),
695fee65b7eSAlexander V. Chernikov    ]
696fee65b7eSAlexander V. Chernikov    nl_attrs_map = rtnl_route_attrs
697fee65b7eSAlexander V. Chernikov
698fee65b7eSAlexander V. Chernikov    def __init__(self, helper, nlm_type):
699fee65b7eSAlexander V. Chernikov        super().__init__(helper, nlm_type)
700fee65b7eSAlexander V. Chernikov        self.base_hdr = RtMsgHdr()
701fee65b7eSAlexander V. Chernikov
702fee65b7eSAlexander V. Chernikov    def parse_base_header(self, data):
703fee65b7eSAlexander V. Chernikov        if len(data) < sizeof(RtMsgHdr):
704fee65b7eSAlexander V. Chernikov            raise ValueError("length less than rtmsg header")
705fee65b7eSAlexander V. Chernikov        rtm_hdr = RtMsgHdr.from_buffer_copy(data)
706fee65b7eSAlexander V. Chernikov        return (rtm_hdr, sizeof(RtMsgHdr))
707fee65b7eSAlexander V. Chernikov
708fee65b7eSAlexander V. Chernikov    def print_base_header(self, hdr, prepend=""):
709fee65b7eSAlexander V. Chernikov        family = self.helper.get_af_name(hdr.rtm_family)
710fee65b7eSAlexander V. Chernikov        print(
711fee65b7eSAlexander V. Chernikov            "{}family={}, dst_len={}, src_len={}, tos={}, table={}, protocol={}({}), scope={}({}), type={}({}), flags={}({})".format(  # noqa: E501
712fee65b7eSAlexander V. Chernikov                prepend,
713fee65b7eSAlexander V. Chernikov                family,
714fee65b7eSAlexander V. Chernikov                hdr.rtm_dst_len,
715fee65b7eSAlexander V. Chernikov                hdr.rtm_src_len,
716fee65b7eSAlexander V. Chernikov                hdr.rtm_tos,
717fee65b7eSAlexander V. Chernikov                hdr.rtm_table,
718fee65b7eSAlexander V. Chernikov                self.helper.get_attr_byval(RtProto, hdr.rtm_protocol),
719fee65b7eSAlexander V. Chernikov                hdr.rtm_protocol,
720fee65b7eSAlexander V. Chernikov                self.helper.get_attr_byval(RtScope, hdr.rtm_scope),
721fee65b7eSAlexander V. Chernikov                hdr.rtm_scope,
722fee65b7eSAlexander V. Chernikov                self.helper.get_attr_byval(RtType, hdr.rtm_type),
723fee65b7eSAlexander V. Chernikov                hdr.rtm_type,
724fee65b7eSAlexander V. Chernikov                self.helper.get_bitmask_str(RtMsgFlags, hdr.rtm_flags),
725fee65b7eSAlexander V. Chernikov                hdr.rtm_flags,
726fee65b7eSAlexander V. Chernikov            )
727fee65b7eSAlexander V. Chernikov        )
728fee65b7eSAlexander V. Chernikov
729fee65b7eSAlexander V. Chernikov
730fee65b7eSAlexander V. Chernikovclass NetlinkIflaMessage(BaseNetlinkRtMessage):
731fee65b7eSAlexander V. Chernikov    messages = [
732fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_NEWLINK, NlMsgCategory.NEW),
733fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_DELLINK, NlMsgCategory.DELETE),
734fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_GETLINK, NlMsgCategory.GET),
735fee65b7eSAlexander V. Chernikov    ]
736fee65b7eSAlexander V. Chernikov    nl_attrs_map = rtnl_ifla_attrs
737fee65b7eSAlexander V. Chernikov
738fee65b7eSAlexander V. Chernikov    def __init__(self, helper, nlm_type):
739fee65b7eSAlexander V. Chernikov        super().__init__(helper, nlm_type)
740fee65b7eSAlexander V. Chernikov        self.base_hdr = IfinfoMsg()
741fee65b7eSAlexander V. Chernikov
742fee65b7eSAlexander V. Chernikov    def parse_base_header(self, data):
743fee65b7eSAlexander V. Chernikov        if len(data) < sizeof(IfinfoMsg):
744fee65b7eSAlexander V. Chernikov            raise ValueError("length less than IfinfoMsg header")
745fee65b7eSAlexander V. Chernikov        rtm_hdr = IfinfoMsg.from_buffer_copy(data)
746fee65b7eSAlexander V. Chernikov        return (rtm_hdr, sizeof(IfinfoMsg))
747fee65b7eSAlexander V. Chernikov
748fee65b7eSAlexander V. Chernikov    def print_base_header(self, hdr, prepend=""):
749fee65b7eSAlexander V. Chernikov        family = self.helper.get_af_name(hdr.ifi_family)
750fee65b7eSAlexander V. Chernikov        print(
751fee65b7eSAlexander V. Chernikov            "{}family={}, ifi_type={}, ifi_index={}, ifi_flags={}, ifi_change={}".format(  # noqa: E501
752fee65b7eSAlexander V. Chernikov                prepend,
753fee65b7eSAlexander V. Chernikov                family,
754fee65b7eSAlexander V. Chernikov                hdr.ifi_type,
755fee65b7eSAlexander V. Chernikov                hdr.ifi_index,
756fee65b7eSAlexander V. Chernikov                hdr.ifi_flags,
757fee65b7eSAlexander V. Chernikov                hdr.ifi_change,
758fee65b7eSAlexander V. Chernikov            )
759fee65b7eSAlexander V. Chernikov        )
760fee65b7eSAlexander V. Chernikov
761fee65b7eSAlexander V. Chernikov
762fee65b7eSAlexander V. Chernikovclass NetlinkIfaMessage(BaseNetlinkRtMessage):
763fee65b7eSAlexander V. Chernikov    messages = [
764fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_NEWADDR, NlMsgCategory.NEW),
765fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_DELADDR, NlMsgCategory.DELETE),
766fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_GETADDR, NlMsgCategory.GET),
767fee65b7eSAlexander V. Chernikov    ]
768fee65b7eSAlexander V. Chernikov    nl_attrs_map = rtnl_ifa_attrs
769fee65b7eSAlexander V. Chernikov
770fee65b7eSAlexander V. Chernikov    def __init__(self, helper, nlm_type):
771fee65b7eSAlexander V. Chernikov        super().__init__(helper, nlm_type)
772fee65b7eSAlexander V. Chernikov        self.base_hdr = IfaddrMsg()
773fee65b7eSAlexander V. Chernikov
774fee65b7eSAlexander V. Chernikov    def parse_base_header(self, data):
775fee65b7eSAlexander V. Chernikov        if len(data) < sizeof(IfaddrMsg):
776fee65b7eSAlexander V. Chernikov            raise ValueError("length less than IfaddrMsg header")
777fee65b7eSAlexander V. Chernikov        rtm_hdr = IfaddrMsg.from_buffer_copy(data)
778fee65b7eSAlexander V. Chernikov        return (rtm_hdr, sizeof(IfaddrMsg))
779fee65b7eSAlexander V. Chernikov
780fee65b7eSAlexander V. Chernikov    def print_base_header(self, hdr, prepend=""):
781fee65b7eSAlexander V. Chernikov        family = self.helper.get_af_name(hdr.ifa_family)
782fee65b7eSAlexander V. Chernikov        print(
783fee65b7eSAlexander V. Chernikov            "{}family={}, ifa_prefixlen={}, ifa_flags={}, ifa_scope={}, ifa_index={}".format(  # noqa: E501
784fee65b7eSAlexander V. Chernikov                prepend,
785fee65b7eSAlexander V. Chernikov                family,
786fee65b7eSAlexander V. Chernikov                hdr.ifa_prefixlen,
787fee65b7eSAlexander V. Chernikov                hdr.ifa_flags,
788fee65b7eSAlexander V. Chernikov                hdr.ifa_scope,
789fee65b7eSAlexander V. Chernikov                hdr.ifa_index,
790fee65b7eSAlexander V. Chernikov            )
791fee65b7eSAlexander V. Chernikov        )
792fee65b7eSAlexander V. Chernikov
793fee65b7eSAlexander V. Chernikov
794fee65b7eSAlexander V. Chernikovclass NetlinkNdMessage(BaseNetlinkRtMessage):
795fee65b7eSAlexander V. Chernikov    messages = [
796fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_NEWNEIGH, NlMsgCategory.NEW),
797fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_DELNEIGH, NlMsgCategory.DELETE),
798fc2538cbSAlexander V. Chernikov        NlMsgProps(NlRtMsgType.RTM_GETNEIGH, NlMsgCategory.GET),
799fee65b7eSAlexander V. Chernikov    ]
800fee65b7eSAlexander V. Chernikov    nl_attrs_map = rtnl_nd_attrs
801fee65b7eSAlexander V. Chernikov
802fee65b7eSAlexander V. Chernikov    def __init__(self, helper, nlm_type):
803fee65b7eSAlexander V. Chernikov        super().__init__(helper, nlm_type)
804fee65b7eSAlexander V. Chernikov        self.base_hdr = NdMsg()
805fee65b7eSAlexander V. Chernikov
806fee65b7eSAlexander V. Chernikov    def parse_base_header(self, data):
807fee65b7eSAlexander V. Chernikov        if len(data) < sizeof(NdMsg):
808fee65b7eSAlexander V. Chernikov            raise ValueError("length less than NdMsg header")
809fee65b7eSAlexander V. Chernikov        nd_hdr = NdMsg.from_buffer_copy(data)
810fee65b7eSAlexander V. Chernikov        return (nd_hdr, sizeof(NdMsg))
811fee65b7eSAlexander V. Chernikov
812fee65b7eSAlexander V. Chernikov    def print_base_header(self, hdr, prepend=""):
813fee65b7eSAlexander V. Chernikov        family = self.helper.get_af_name(hdr.ndm_family)
814fee65b7eSAlexander V. Chernikov        print(
815fee65b7eSAlexander V. Chernikov            "{}family={}, ndm_ifindex={}, ndm_state={}, ndm_flags={}".format(  # noqa: E501
816fee65b7eSAlexander V. Chernikov                prepend,
817fee65b7eSAlexander V. Chernikov                family,
818fee65b7eSAlexander V. Chernikov                hdr.ndm_ifindex,
819fee65b7eSAlexander V. Chernikov                hdr.ndm_state,
820fee65b7eSAlexander V. Chernikov                hdr.ndm_flags,
821fee65b7eSAlexander V. Chernikov            )
822fee65b7eSAlexander V. Chernikov        )
823fc2538cbSAlexander V. Chernikov
824fc2538cbSAlexander V. Chernikov
825fc2538cbSAlexander V. Chernikovhandler_classes = {
826fc2538cbSAlexander V. Chernikov    "netlink_route": [
827fc2538cbSAlexander V. Chernikov        NetlinkRtMessage,
828fc2538cbSAlexander V. Chernikov        NetlinkIflaMessage,
829fc2538cbSAlexander V. Chernikov        NetlinkIfaMessage,
830fc2538cbSAlexander V. Chernikov        NetlinkNdMessage,
831fc2538cbSAlexander V. Chernikov    ],
832fc2538cbSAlexander V. Chernikov}
833