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