aboutsummaryrefslogtreecommitdiffstats
path: root/sys/linux/socket_netlink_route.txt
blob: c22b0665b2a3673310be383f69841ae56aa8d3ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
# Copyright 2018 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.

# AF_NETLINK/NETLINK_ROUTE support.

include <linux/net.h>
include <linux/netdevice.h>
include <uapi/linux/if.h>
include <uapi/linux/ip.h>
include <uapi/linux/if_link.h>
include <uapi/linux/if_addr.h>
include <uapi/linux/if_addrlabel.h>
include <uapi/linux/if_bridge.h>
include <uapi/linux/if_vlan.h>
include <uapi/linux/netlink.h>
include <uapi/linux/netconf.h>
include <uapi/linux/rtnetlink.h>
include <uapi/linux/lwtunnel.h>
include <uapi/linux/neighbour.h>
include <uapi/linux/nexthop.h>
include <uapi/linux/fib_rules.h>
include <uapi/linux/if_tunnel.h>
include <uapi/linux/net_namespace.h>
include <uapi/linux/veth.h>
include <uapi/linux/can/gw.h>
include <uapi/linux/can/vxcan.h>
include <uapi/linux/mpls_iptunnel.h>
include <uapi/linux/ila.h>
include <uapi/linux/seg6_iptunnel.h>
include <uapi/linux/seg6_local.h>
include <uapi/linux/rpl_iptunnel.h>
include <uapi/linux/batman_adv.h>

resource sock_nl_route[sock_netlink]
type netns_id int32[0:4]

socket$nl_route(domain const[AF_NETLINK], type const[SOCK_RAW], proto const[NETLINK_ROUTE]) sock_nl_route

sendmsg$nl_route(fd sock_nl_route, msg ptr[in, msghdr_netlink[netlink_msg_route]], f flags[send_flags])

netlink_msg_route [
	newlink			netlink_msg[RTM_NEWLINK, ifinfomsg[AF_UNSPEC], ifla_policy]
	getlink			netlink_msg[RTM_GETLINK, ifinfomsg[AF_UNSPEC], ifla_policy]
	setlink			netlink_msg[RTM_SETLINK, ifinfomsg[AF_UNSPEC], ifla_policy]
	dellink			netlink_msg[RTM_DELLINK, ifinfomsg[AF_UNSPEC], ifla_policy]
	getaddr			netlink_msg[RTM_GETADDR, rtgenmsg[AF_UNSPEC], void]
	getroute		netlink_msg[RTM_GETROUTE, rtgenmsg[AF_UNSPEC], void]
	getrule			netlink_msg[RTM_GETRULE, rtgenmsg[AF_UNSPEC], void]
	getnetconf		netlink_msg[RTM_GETNETCONF, rtgenmsg[AF_UNSPEC], void]
	getstats		netlink_msg[RTM_GETSTATS, if_stats_msg[AF_UNSPEC], void]
	newneigh		netlink_msg[RTM_NEWNEIGH, ndmsg, nda_policy]
	delneigh		netlink_msg[RTM_DELNEIGH, ndmsg, nda_policy]
	getneigh		netlink_msg[RTM_GETNEIGH, rtgenmsg[AF_UNSPEC], void]
	getneightbl		netlink_msg[RTM_GETNEIGHTBL, rtgenmsg[AF_UNSPEC], void]
	setneightbl		netlink_msg[RTM_SETNEIGHTBL, ndtmsg, nl_neightbl_policy]
	newlinkprop		netlink_msg[RTM_NEWLINKPROP, ifinfomsg[AF_UNSPEC], ifla_policy]
#	RTM_GETLINKPROP is currently not used by the kernel.
	dellinkprop		netlink_msg[RTM_DELLINKPROP, ifinfomsg[AF_UNSPEC], ifla_policy]
	newnexthop		netlink_msg[RTM_NEWNEXTHOP, nhmsg_new[AF_UNSPEC], rtm_nh_policy_new]
	delnexthop		netlink_msg[RTM_DELNEXTHOP, nhmsg_get_del[AF_UNSPEC], rtm_nh_policy_del]
	getnexthop		netlink_msg[RTM_GETNEXTHOP, nhmsg_get_del[AF_UNSPEC], rtm_nh_policy_get]

	ipv4_newaddr		netlink_msg[RTM_NEWADDR, ifaddrmsg[AF_INET], ifa_ipv4_policy]
	ipv4_deladdr		netlink_msg[RTM_DELADDR, ifaddrmsg[AF_INET], ifa_ipv4_policy]
	ipv4_getaddr		netlink_msg[RTM_GETADDR, ifaddrmsg[AF_INET], ifa_ipv4_policy]
	ipv4_newroute		netlink_msg[RTM_NEWROUTE, rtmsg[AF_INET], rtm_ipv4_policy]
	ipv4_delroute		netlink_msg[RTM_DELROUTE, rtmsg[AF_INET], rtm_ipv4_policy]
	ipv4_getroute		netlink_msg[RTM_GETROUTE, rtmsg[AF_INET], void]
	ipv4_getnetconf		netlink_msg[RTM_GETNETCONF, netconfmsg[AF_INET], devconf_ipv4_policy]
	ipv4_newrule		netlink_msg[RTM_NEWRULE, fib_rule_hdr[AF_INET], fib4_rule_policy]
	ipv4_delrule		netlink_msg[RTM_DELRULE, fib_rule_hdr[AF_INET], fib4_rule_policy]
	ipv4_getrule		netlink_msg[RTM_GETRULE, fib_rule_hdr[AF_INET], void]
	ipv4_newnexthop		netlink_msg[RTM_NEWNEXTHOP, nhmsg_new[AF_INET], rtm_nh_policy_new]
	ipv4_getnexthop		netlink_msg[RTM_GETNEXTHOP, nhmsg_get_del[AF_INET], rtm_nh_policy_get]

	ipv6_newaddr		netlink_msg[RTM_NEWADDR, ifaddrmsg[AF_INET6], ifa_ipv6_policy]
	ipv6_deladdr		netlink_msg[RTM_DELADDR, ifaddrmsg[AF_INET6], ifa_ipv6_policy]
	ipv6_getaddr		netlink_msg[RTM_GETADDR, ifaddrmsg[AF_INET6], ifa_ipv6_policy]
	ipv6_newroute		netlink_msg[RTM_NEWROUTE, rtmsg[AF_INET6], rtm_ipv6_policy]
	ipv6_delroute		netlink_msg[RTM_DELROUTE, rtmsg[AF_INET6], rtm_ipv6_policy]
	ipv6_getroute		netlink_msg[RTM_GETROUTE, rtmsg[AF_INET6], rtm_ipv6_policy]
	ipv6_getmulticast	netlink_msg[RTM_GETMULTICAST, rtgenmsg[AF_INET6], void]
	ipv6_getanyicast	netlink_msg[RTM_GETANYCAST, rtgenmsg[AF_INET6], void]
	ipv6_getnetconf		netlink_msg[RTM_GETNETCONF, netconfmsg[AF_INET6], devconf_ipv4_policy]
	ipv6_newrule		netlink_msg[RTM_NEWRULE, fib_rule_hdr[AF_INET6], fib6_rule_policy]
	ipv6_delrule		netlink_msg[RTM_DELRULE, fib_rule_hdr[AF_INET6], fib6_rule_policy]
	ipv6_getrule		netlink_msg[RTM_GETRULE, fib_rule_hdr[AF_INET6], void]
	ipv6_newaddrlabel	netlink_msg[RTM_NEWADDRLABEL, ifaddrlblmsg[AF_INET6], ifal_policy]
	ipv6_deladdrlabel	netlink_msg[RTM_DELADDRLABEL, ifaddrlblmsg[AF_INET6], ifal_policy]
	ipv6_getaddrlabel	netlink_msg[RTM_GETADDRLABEL, ifaddrlblmsg[AF_INET6], ifal_policy]
	ipv6_newnexthop		netlink_msg[RTM_NEWNEXTHOP, nhmsg_new[AF_INET6], rtm_nh_policy_new]
	ipv6_getnexthop		netlink_msg[RTM_GETNEXTHOP, nhmsg_get_del[AF_INET6], rtm_nh_policy_get]

	ipmr_newroute		netlink_msg[RTM_NEWROUTE, rtmsg[RTNL_FAMILY_IPMR], rtm_ipv4_policy]
	ipmr_delroute		netlink_msg[RTM_DELROUTE, rtmsg[RTNL_FAMILY_IPMR], rtm_ipv4_policy]
	ipmr_getroute		netlink_msg[RTM_GETROUTE, rtmsg[RTNL_FAMILY_IPMR], void]

	mpls_newroute		netlink_msg[RTM_NEWROUTE, rtmsg[AF_MPLS], rtm_mpls_policy]
	mpls_delroute		netlink_msg[RTM_DELROUTE, rtmsg[AF_MPLS], rtm_mpls_policy]
	mpls_getroute		netlink_msg[RTM_GETROUTE, rtmsg[AF_MPLS], rtm_mpls_policy]
	mpls_getnetconf		netlink_msg[RTM_GETNETCONF, netconfmsg[AF_MPLS], devconf_mpls_policy]

	bridge_newneigh		netlink_msg[RTM_NEWNEIGH, ndmsg, nda_policy]
	bridge_delneigh		netlink_msg[RTM_DELNEIGH, ndmsg, nda_policy]
	bridge_getneigh		netlink_msg[RTM_GETNEIGH, ifinfomsg[AF_BRIDGE], ifla_policy]
	bridge_getlink		netlink_msg[RTM_GETLINK, ifinfomsg[AF_BRIDGE], ifla_policy]
	bridge_setlink		netlink_msg[RTM_SETLINK, ifinfomsg[AF_BRIDGE], ifla_policy]
	bridge_dellink		netlink_msg[RTM_DELLINK, ifinfomsg[AF_BRIDGE], ifla_policy]
	bridge_getvlan		netlink_msg[RTM_GETVLAN, br_vlan_msg[AF_BRIDGE], br_vlan_db_dump_pol]
	bridge_newvlan		netlink_msg[RTM_NEWVLAN, br_vlan_msg[AF_BRIDGE], br_vlan_db_policy$container]
	bridge_delvlan		netlink_msg[RTM_DELVLAN, br_vlan_msg[AF_BRIDGE], br_vlan_db_policy$container]

	RTM_GETMDB		netlink_msg[RTM_GETMDB, br_port_msg[AF_BRIDGE], void]
	RTM_NEWMDB		netlink_msg[RTM_NEWMDB, br_port_msg[AF_BRIDGE], br_mdb_policy]
	RTM_DELMDB		netlink_msg[RTM_DELMDB, br_port_msg[AF_BRIDGE], br_mdb_policy]

	RTM_NEWNSID		netlink_msg[RTM_NEWNSID, rtgenmsg[AF_UNSPEC], rtnl_net_policy]
	RTM_GETNSID		netlink_msg[RTM_GETNSID, rtgenmsg[AF_UNSPEC], rtnl_net_policy]

	can_newroute		netlink_msg[RTM_NEWROUTE, rtcanmsg, cgw_policy]
	can_delroute		netlink_msg[RTM_DELROUTE, rtcanmsg, cgw_policy]
] [varlen]

type rtgenmsg[FAMILY] {
	rtgen_family	const[FAMILY, int8]
}

type netconfmsg[FAMILY] {
	ncm_family	const[FAMILY, int8]
}

type ifinfomsg[FAMILY] {
	ifi_family	const[FAMILY, int8]
	__ifi_pad	const[0, int8]
	ifi_type	const[0, int16]
	ifi_index	ifindex[opt]
	ifi_flags	flags[net_device_flags, int32]
	ifi_change	flags[net_device_flags, int32]
}

type ifaddrmsg[FAMILY] {
	ifa_family	const[FAMILY, int8]
	ifa_prefixlen	flags[ifa_prefixlen, int8]
	ifa_flags	flags[ifa_flags8, int8]
	ifa_scope	flags[rt_scope_t, int8]
	ifa_index	ifindex
}

type ifaddrlblmsg[FAMILY] {
	ifal_family	const[FAMILY, int8]
	__ifal_reserved	const[0, int8]
	ifal_prefixlen	flags[ifa_prefixlen, int8]
	ifal_flags	const[0, int8]
	ifal_index	ifindex
	ifal_seq	int32
}

type br_vlan_msg[FAMILY] {
	family		const[FAMILY, int8]
	reserved1	const[0, int8]
	reserved2	const[0, int16]
	ifindex		ifindex
}

type br_port_msg[FAMILY] {
	family	const[FAMILY, int8]
	ifindex	ifindex
}

type rtmsg[FAMILY] {
	rtm_family	const[FAMILY, int8]
	rtm_dst_len	flags[rtm_addr_len, int8]
	rtmsrcdst_len	flags[rtm_addr_len, int8]
	rtm_tos		int8
	rtm_table	flags[rt_table_types, int8]
	rtm_protocol	flags[rtm_protocol, int8]
	rtm_scope	flags[rt_scope_t, int8]
	rtm_type	flags[rtm_type, int8]
	rtm_flags	flags[rtm_flags, int32]
}

ndmsg {
	ndm_family	flags[rtnl_af, int8]
	ndm_pad1	const[0, int8]
	ndm_pad2	const[0, int16]
	ndm_ifindex	ifindex
	ndm_state	flags[ndm_state, int16]
	ndm_flags	flags[ndm_flags, int8]
	ndm_type	flags[rtm_type, int8]
}

ndtmsg {
	ndm_family	flags[rtnl_af, int8]
	ndm_pad1	const[0, int8]
	ndm_pad2	const[0, int16]
}

type if_stats_msg[FAMILY] {
	family		const[FAMILY, int8]
	pad1		const[0, int8]
	pad2		const[0, int16]
	ifindex		ifindex
	filter_mask	flags[filter_mask, int32]
}

type nhmsg_get_del[FAMILY] nhmsg[FAMILY, const[0, int8], const[0, int32]]
type nhmsg_new[FAMILY] nhmsg[FAMILY, flags[rtm_protocol, int8], flags[rtnh_flags, int32]]

type nhmsg[FAMILY, PROTOCOL, FLAGS] {
	nh_family	const[FAMILY, int8]
	nh_scope	const[0, int8]
	nh_protocol	PROTOCOL
	resvd		const[0, int8]
	nh_flags	FLAGS
}

ifla_policy [
	IFLA_IFNAME		nlattr[IFLA_IFNAME, devname]
	IFLA_ADDRESS		nlattr[IFLA_ADDRESS, mac_addr]
	IFLA_BROADCAST		nlattr[IFLA_BROADCAST, mac_addr]
	IFLA_MAP		nlattr[IFLA_MAP, rtnl_link_ifmap]
	IFLA_MTU		nlattr[IFLA_MTU, int32]
	IFLA_LINK		nlattr[IFLA_LINK, ifindex]
	IFLA_MASTER		nlattr[IFLA_MASTER, ifindex]
	IFLA_CARRIER		nlattr[IFLA_CARRIER, int8]
	IFLA_TXQLEN		nlattr[IFLA_TXQLEN, int32]
	IFLA_WEIGHT		nlattr[IFLA_WEIGHT, int32]
	IFLA_OPERSTATE		nlattr[IFLA_OPERSTATE, int8]
	IFLA_LINKMODE		nlattr[IFLA_LINKMODE, int8]
	IFLA_LINKINFO		nlnest[IFLA_LINKINFO, ifla_info_policy]
	IFLA_NET_NS_PID		nlattr[IFLA_NET_NS_PID, pid]
	IFLA_NET_NS_FD		nlattr[IFLA_NET_NS_FD, fd_namespace]
	IFLA_IFALIAS		nlattr[IFLA_IFALIAS, devname]
	IFLA_IFALIASn		nlattr[IFLA_IFALIAS, void]
	IFLA_VFINFO_LIST	nlnest[IFLA_VFINFO_LIST, array[nlnest[IFLA_VF_INFO, array[ifla_vf_policy]]]]
	IFLA_VF_PORTS		nlnest[IFLA_VF_PORTS, array[nlnest[IFLA_VF_PORT, array[ifla_port_policy]]]]
	IFLA_PORT_SELF		nlnest[IFLA_PORT_SELF, array[ifla_port_policy]]
	IFLA_AF_SPEC		nlnest[IFLA_AF_SPEC, array[ifla_af_spec_policy]]
	IFLA_EXT_MASK		nlattr[IFLA_EXT_MASK, int32]
	IFLA_PROMISCUITY	nlattr[IFLA_PROMISCUITY, int32]
	IFLA_NUM_TX_QUEUES	nlattr[IFLA_NUM_TX_QUEUES, int32]
	IFLA_NUM_RX_QUEUES	nlattr[IFLA_NUM_RX_QUEUES, int32]
	IFLA_PHYS_PORT_ID	nlattr[IFLA_PHYS_PORT_ID, array[int8, 0:MAX_PHYS_ITEM_ID_LEN]]
	IFLA_CARRIER_CHANGES	nlattr[IFLA_CARRIER_CHANGES, int32]
	IFLA_PHYS_SWITCH_ID	nlattr[IFLA_PHYS_SWITCH_ID, array[int8, 0:MAX_PHYS_ITEM_ID_LEN]]
	IFLA_LINK_NETNSID	nlattr[IFLA_LINK_NETNSID, netns_id]
	IFLA_PROTO_DOWN		nlattr[IFLA_PROTO_DOWN, int8]
	IFLA_XDP		nlnest[IFLA_XDP, array[ifla_xdp_policy]]
	IFLA_EVENT		nlattr[IFLA_EVENT, int32]
	IFLA_GROUP		nlattr[IFLA_GROUP, int32]
	IFLA_TARGET_NETNSID	nlattr[IFLA_TARGET_NETNSID, netns_id]
	IFLA_PROP_LIST		nlnest[IFLA_PROP_LIST, array[nlattr[IFLA_ALT_IFNAME, devname]]]
	IFLA_ALT_IFNAME		nlattr[IFLA_ALT_IFNAME, devname]
	IFLA_GSO_MAX_SEGS	nlattr[IFLA_GSO_MAX_SEGS, int32[0:GSO_MAX_SEGS]]
	IFLA_GSO_MAX_SIZE	nlattr[IFLA_GSO_MAX_SIZE, int32[0:GSO_MAX_SIZE]]
] [varlen]

ifla_af_spec_policy [
	AF_INET		nlnest[AF_INET, nlnest[IFLA_INET_CONF, array[nlattr_tt[int16:14[0:IPV4_DEVCONF_MAX], 0, 0, int32]]]]
	AF_INET6	nlnest[AF_INET6, array[inet6_af_policy]]
	AF_BRIDGE	nlattr[AF_BRIDGE, void]
	AF_MPLS		nlattr[AF_MPLS, void]
] [varlen]

inet6_af_policy [
	IFLA_INET6_ADDR_GEN_MODE	nlattr[IFLA_INET6_ADDR_GEN_MODE, int8]
	IFLA_INET6_TOKEN		nlattr[IFLA_INET6_TOKEN, ipv6_addr]
] [varlen]

ifal_policy [
	IFAL_ADDRESS	nlattr[IFAL_ADDRESS, ipv6_addr]
	IFAL_LABEL	nlattr[IFAL_LABEL, flags[ifal_labels, int32]]
] [varlen]

type ifla_info_policy$t[TYPE, DATA_TYPE, DATA] {
	IFLA_INFO_KIND	nlattr[IFLA_INFO_KIND, string[TYPE]]
	IFLA_INFO_DATA	nlnest[DATA_TYPE, DATA]
}

# TODO: can, dummy, geneve, ifb, netdevsim, nlmon, vrf, vxlan
ifla_info_policy [
	bond		ifla_info_policy$t["bond", IFLA_INFO_DATA, array[bond_policy]]
	bond_slave	ifla_info_policy$t["bond_slave", IFLA_INFO_SLAVE_DATA, bond_slave_policy]
	bridge		ifla_info_policy$t["bridge", IFLA_INFO_DATA, array[br_policy]]
	bridge_slave	ifla_info_policy$t["bridge_slave", IFLA_INFO_SLAVE_DATA, array[br_port_policy]]
	gre		ifla_info_policy$t["gre", IFLA_INFO_DATA, array[ipgre_policy]]
	gretap		ifla_info_policy$t["gretap", IFLA_INFO_DATA, array[ipgre_policy]]
	erspan		ifla_info_policy$t["erspan", IFLA_INFO_DATA, array[ipgre_policy]]
	ip6gre		ifla_info_policy$t["ip6gre", IFLA_INFO_DATA, array[ip6gre_policy]]
	ip6gretap	ifla_info_policy$t["ip6gretap", IFLA_INFO_DATA, array[ip6gre_policy]]
	ip6erspan	ifla_info_policy$t["ip6erspan", IFLA_INFO_DATA, array[ip6gre_policy]]
	ipip		ifla_info_policy$t["ipip", IFLA_INFO_DATA, array[ipip_policy]]
	ipip6		ifla_info_policy$t["ip6tnl", IFLA_INFO_DATA, array[ip6_tnl_policy]]
	sit		ifla_info_policy$t["sit", IFLA_INFO_DATA, array[ipip6_policy]]
	veth		ifla_info_policy$t["veth", IFLA_INFO_DATA, optional[veth_policy]]
	vti		ifla_info_policy$t["vti", IFLA_INFO_DATA, array[vti_policy]]
	ip6vti		ifla_info_policy$t["ip6vti", IFLA_INFO_DATA, array[vti6_policy]]
# TODO: this should be a net device fd. How does one even obtain these?
	ppp		ifla_info_policy$t["ppp", IFLA_INFO_DATA, nlattr[IFLA_PPP_DEV_FD, fd]]
	gtp		ifla_info_policy$t["gtp", IFLA_INFO_DATA, array[gtp_policy]]
	hsr		ifla_info_policy$t["hsr", IFLA_INFO_DATA, array[hsr_policy]]
	xfrm		ifla_info_policy$t["xfrm", IFLA_INFO_DATA, array[xfrmi_policy]]
	vcan		ifla_info_policy$t["vcan", IFLA_INFO_DATA, void]
	vxcan		ifla_info_policy$t["vxcan", IFLA_INFO_DATA, optional[nlattr[VXCAN_INFO_PEER, peer_info]]]
	vlan		ifla_info_policy$t["vlan", IFLA_INFO_DATA, array[vlan_policy]]
	ipvlan		ifla_info_policy$t["ipvlan", IFLA_INFO_DATA, array[ipvlan_nl_policy]]
	macvlan		ifla_info_policy$t["macvlan", IFLA_INFO_DATA, array[macvlan_policy]]
	macvtap		ifla_info_policy$t["macvtap", IFLA_INFO_DATA, void]
	macsec		ifla_info_policy$t["macsec", IFLA_INFO_DATA, array[macsec_rtnl_policy]]
	lowpan		ifla_info_policy$t["lowpan", IFLA_INFO_DATA, void]
	ipoib		ifla_info_policy$t["ipoib", IFLA_INFO_DATA, array[ipoib_policy]]
	geneve		ifla_info_policy$t["geneve", IFLA_INFO_DATA, array[geneve_policy]]
	wireguard	ifla_info_policy$t["wireguard", IFLA_INFO_DATA, void]
	batadv		ifla_info_policy$t["batadv", IFLA_INFO_DATA, array[batadv_policy]]
] [varlen]

batadv_policy [
	IFLA_BATADV_ALGO_NAME	nlattr[IFLA_BATADV_ALGO_NAME, stringnoz[batadv_algo]]
] [varlen]

# See batadv_algo_ops/batadv_algo_register.
batadv_algo = "BATMAN_V", "BATMAN_IV"

geneve_policy [
	IFLA_GENEVE_ID			nlattr[IFLA_GENEVE_ID, int32[0:4]]
	IFLA_GENEVE_REMOTE		nlattr[IFLA_GENEVE_REMOTE, ipv4_addr]
	IFLA_GENEVE_REMOTE6		nlattr[IFLA_GENEVE_REMOTE6, ipv6_addr]
	IFLA_GENEVE_TTL			nlattr[IFLA_GENEVE_TTL, int8]
	IFLA_GENEVE_TOS			nlattr[IFLA_GENEVE_TOS, int8]
	IFLA_GENEVE_LABEL		nlnetw[IFLA_GENEVE_LABEL, int32be]
	IFLA_GENEVE_PORT		nlattr[IFLA_GENEVE_PORT, sock_port]
	IFLA_GENEVE_COLLECT_METADATA	nlattr[IFLA_GENEVE_COLLECT_METADATA, void]
	IFLA_GENEVE_UDP_CSUM		nlattr[IFLA_GENEVE_UDP_CSUM, bool8]
	IFLA_GENEVE_UDP_ZERO_CSUM6_TX	nlattr[IFLA_GENEVE_UDP_ZERO_CSUM6_TX, bool8]
	IFLA_GENEVE_UDP_ZERO_CSUM6_RX	nlattr[IFLA_GENEVE_UDP_ZERO_CSUM6_RX, bool8]
	IFLA_GENEVE_TTL_INHERIT		nlattr[IFLA_GENEVE_TTL_INHERIT, bool8]
	IFLA_GENEVE_DF			nlattr[IFLA_GENEVE_DF, int8]
] [varlen]

ipoib_policy [
	IFLA_IPOIB_PKEY		nlattr[IFLA_IPOIB_PKEY, int16]
	IFLA_IPOIB_MODE		nlattr[IFLA_IPOIB_MODE, bool16]
	IFLA_IPOIB_UMCAST	nlattr[IFLA_IPOIB_UMCAST, bool16]
] [varlen]

macsec_rtnl_policy [
# TODO: all of these need better types.
	IFLA_MACSEC_SCI			nlattr[IFLA_MACSEC_SCI, int64]
	IFLA_MACSEC_PORT		nlnetw[IFLA_MACSEC_PORT, sock_port]
	IFLA_MACSEC_ICV_LEN		nlattr[IFLA_MACSEC_ICV_LEN, int8]
	IFLA_MACSEC_CIPHER_SUITE	nlattr[IFLA_MACSEC_CIPHER_SUITE, int64]
	IFLA_MACSEC_WINDOW		nlattr[IFLA_MACSEC_WINDOW, int32]
	IFLA_MACSEC_ENCODING_SA		nlattr[IFLA_MACSEC_ENCODING_SA, int8]
	IFLA_MACSEC_ENCRYPT		nlattr[IFLA_MACSEC_ENCRYPT, int8]
	IFLA_MACSEC_PROTECT		nlattr[IFLA_MACSEC_PROTECT, int8]
	IFLA_MACSEC_INC_SCI		nlattr[IFLA_MACSEC_INC_SCI, int8]
	IFLA_MACSEC_ES			nlattr[IFLA_MACSEC_ES, int8]
	IFLA_MACSEC_SCB			nlattr[IFLA_MACSEC_SCB, int8]
	IFLA_MACSEC_REPLAY_PROTECT	nlattr[IFLA_MACSEC_REPLAY_PROTECT, int8]
	IFLA_MACSEC_VALIDATION		nlattr[IFLA_MACSEC_VALIDATION, int8]
] [varlen]

ipvlan_nl_policy [
	IFLA_IPVLAN_MODE	nlattr[IFLA_IPVLAN_MODE, flags[ipvlan_mode, int16]]
	IFLA_IPVLAN_FLAGS	nlattr[IFLA_IPVLAN_FLAGS, flags[ipvlan_flags, int16]]
] [varlen]

ipvlan_mode = IPVLAN_MODE_L2, IPVLAN_MODE_L3, IPVLAN_MODE_L3S
ipvlan_flags = IPVLAN_F_PRIVATE, IPVLAN_F_VEPA

macvlan_policy [
	IFLA_MACVLAN_MODE		nlattr[IFLA_MACVLAN_MODE, flags[macvlan_mode, int32]]
	IFLA_MACVLAN_FLAGS		nlattr[IFLA_MACVLAN_FLAGS, bool16]
	IFLA_MACVLAN_MACADDR_MODE	nlattr[IFLA_MACVLAN_MACADDR_MODE, flags[macvlan_macaddr_mode, int32]]
	IFLA_MACVLAN_MACADDR		nlattr[IFLA_MACVLAN_MACADDR, mac_addr]
	IFLA_MACVLAN_MACADDR_DATA	nlnest[IFLA_MACVLAN_MACADDR_DATA, array[nlattr[IFLA_MACVLAN_MACADDR, mac_addr]]]
	IFLA_MACVLAN_BC_QUEUE_LEN	nlattr[IFLA_MACVLAN_BC_QUEUE_LEN, int32]
] [varlen]

macvlan_mode = MACVLAN_MODE_PRIVATE, MACVLAN_MODE_VEPA, MACVLAN_MODE_BRIDGE, MACVLAN_MODE_PASSTHRU, MACVLAN_MODE_SOURCE
macvlan_macaddr_mode = MACVLAN_MACADDR_ADD, MACVLAN_MACADDR_DEL, MACVLAN_MACADDR_FLUSH, MACVLAN_MACADDR_SET

vlan_policy [
	IFLA_VLAN_ID		nlattr[IFLA_VLAN_ID, int16[0:4]]
	IFLA_VLAN_FLAGS		nlattr[IFLA_VLAN_FLAGS, ifla_vlan_flags]
	IFLA_VLAN_EGRESS_QOS	nlnest[IFLA_VLAN_EGRESS_QOS, array[vlan_map_policy]]
	IFLA_VLAN_INGRESS_QOS	nlnest[IFLA_VLAN_INGRESS_QOS, array[vlan_map_policy]]
	IFLA_VLAN_PROTOCOL	nlattr[IFLA_VLAN_PROTOCOL, flags[vlan_proto, int16be]]
] [varlen]

ifla_vlan_flags {
	flags	flags[ifla_vlan_flags, int32]
	mask	flags[ifla_vlan_flags, int32]
}

ifla_vlan_flags = VLAN_FLAG_REORDER_HDR, VLAN_FLAG_GVRP, VLAN_FLAG_LOOSE_BINDING, VLAN_FLAG_MVRP, VLAN_FLAG_BRIDGE_BINDING

vlan_map_policy [
	IFLA_VLAN_QOS_MAPPING	nlattr[IFLA_VLAN_QOS_MAPPING, ifla_vlan_qos_mapping]
] [varlen]

ifla_vlan_qos_mapping {
	from	int32
	to	int32
}

xfrmi_policy [
	IFLA_XFRM_LINK	nlattr[IFLA_XFRM_LINK, int32[0:4]]
	IFLA_XFRM_IF_ID	nlattr[IFLA_XFRM_IF_ID, xfrm_if_id]
] [varlen]

hsr_policy [
	IFLA_HSR_SLAVE1			nlattr[IFLA_HSR_SLAVE1, ifindex]
	IFLA_HSR_SLAVE2			nlattr[IFLA_HSR_SLAVE2, ifindex]
	IFLA_HSR_MULTICAST_SPEC		nlattr[IFLA_HSR_MULTICAST_SPEC, int8]
	IFLA_HSR_VERSION		nlattr[IFLA_HSR_VERSION, int8]
	IFLA_HSR_SUPERVISION_ADDR	nlattr[IFLA_HSR_SUPERVISION_ADDR, mac_addr]
	IFLA_HSR_SEQ_NR			nlattr[IFLA_HSR_SEQ_NR, int16]
	IFLA_HSR_PROTOCOL		nlattr[IFLA_HSR_PROTOCOL, int8[0:HSR_PROTOCOL_MAX]]
] [varlen]

bond_policy [
	IFLA_BOND_MODE			nlattr[IFLA_BOND_MODE, int8[0:6]]
	IFLA_BOND_ACTIVE_SLAVE		nlattr[IFLA_BOND_ACTIVE_SLAVE, ifindex]
	IFLA_BOND_MIIMON		nlattr[IFLA_BOND_MIIMON, int32]
	IFLA_BOND_UPDELAY		nlattr[IFLA_BOND_UPDELAY, int32]
	IFLA_BOND_DOWNDELAY		nlattr[IFLA_BOND_DOWNDELAY, int32]
	IFLA_BOND_USE_CARRIER		nlattr[IFLA_BOND_USE_CARRIER, int8]
	IFLA_BOND_ARP_INTERVAL		nlattr[IFLA_BOND_ARP_INTERVAL, int32]
	IFLA_BOND_ARP_IP_TARGET		nlnest[IFLA_BOND_ARP_IP_TARGET, array[ipv4_addr]]
	IFLA_BOND_ARP_VALIDATE		nlattr[IFLA_BOND_ARP_VALIDATE, int32[0:3]]
	IFLA_BOND_ARP_ALL_TARGETS	nlattr[IFLA_BOND_ARP_ALL_TARGETS, int32[0:1]]
	IFLA_BOND_PRIMARY		nlattr[IFLA_BOND_PRIMARY, ifindex]
	IFLA_BOND_PRIMARY_RESELECT	nlattr[IFLA_BOND_PRIMARY_RESELECT, int8[0:2]]
	IFLA_BOND_FAIL_OVER_MAC		nlattr[IFLA_BOND_FAIL_OVER_MAC, int8[0:2]]
	IFLA_BOND_XMIT_HASH_POLICY	nlattr[IFLA_BOND_XMIT_HASH_POLICY, int8[0:4]]
	IFLA_BOND_RESEND_IGMP		nlattr[IFLA_BOND_RESEND_IGMP, int32]
	IFLA_BOND_NUM_PEER_NOTIF	nlattr[IFLA_BOND_NUM_PEER_NOTIF, int8]
	IFLA_BOND_ALL_SLAVES_ACTIVE	nlattr[IFLA_BOND_ALL_SLAVES_ACTIVE, int8]
	IFLA_BOND_MIN_LINKS		nlattr[IFLA_BOND_MIN_LINKS, int32]
	IFLA_BOND_LP_INTERVAL		nlattr[IFLA_BOND_LP_INTERVAL, int32]
	IFLA_BOND_PACKETS_PER_SLAVE	nlattr[IFLA_BOND_PACKETS_PER_SLAVE, int32]
	IFLA_BOND_AD_LACP_RATE		nlattr[IFLA_BOND_AD_LACP_RATE, int8[0:1]]
	IFLA_BOND_AD_SELECT		nlattr[IFLA_BOND_AD_SELECT, int8[0:2]]
	IFLA_BOND_AD_ACTOR_SYS_PRIO	nlattr[IFLA_BOND_AD_ACTOR_SYS_PRIO, int16]
	IFLA_BOND_AD_USER_PORT_KEY	nlattr[IFLA_BOND_AD_USER_PORT_KEY, int16]
	IFLA_BOND_AD_ACTOR_SYSTEM	nlattr[IFLA_BOND_AD_ACTOR_SYSTEM, ipv4_addr]
	IFLA_BOND_TLB_DYNAMIC_LB	nlattr[IFLA_BOND_TLB_DYNAMIC_LB, int8]
	IFLA_BOND_PEER_NOTIF_DELAY	nlattr[IFLA_BOND_PEER_NOTIF_DELAY, int32]
	IFLA_BOND_AD_LACP_ACTIVE	nlattr[IFLA_BOND_AD_LACP_ACTIVE, int8]
] [varlen]

bond_slave_policy [
	IFLA_BOND_SLAVE_QUEUE_ID	nlattr[IFLA_BOND_SLAVE_QUEUE_ID, int16]
] [varlen]

br_policy [
	IFLA_BR_FORWARD_DELAY			nlattr[IFLA_BR_FORWARD_DELAY, int32[2:30]]
	IFLA_BR_HELLO_TIME			nlattr[IFLA_BR_HELLO_TIME, int32[1:10]]
	IFLA_BR_MAX_AGE				nlattr[IFLA_BR_MAX_AGE, int32[6:40]]
	IFLA_BR_AGEING_TIME			nlattr[IFLA_BR_AGEING_TIME, int32]
	IFLA_BR_STP_STATE			nlattr[IFLA_BR_STP_STATE, int32[0:1]]
	IFLA_BR_PRIORITY			nlattr[IFLA_BR_PRIORITY, int16]
	IFLA_BR_VLAN_FILTERING			nlattr[IFLA_BR_VLAN_FILTERING, int8]
	IFLA_BR_VLAN_PROTOCOL			nlattr[IFLA_BR_VLAN_PROTOCOL, flags[vlan_proto, int16]]
	IFLA_BR_GROUP_FWD_MASK			nlattr[IFLA_BR_GROUP_FWD_MASK, int16]
	IFLA_BR_GROUP_ADDR			nlattr[IFLA_BR_GROUP_ADDR, mac_addr]
	IFLA_BR_MCAST_ROUTER			nlattr[IFLA_BR_MCAST_ROUTER, bool8]
	IFLA_BR_MCAST_SNOOPING			nlattr[IFLA_BR_MCAST_SNOOPING, bool8]
	IFLA_BR_MCAST_QUERY_USE_IFADDR		nlattr[IFLA_BR_MCAST_QUERY_USE_IFADDR, bool8]
	IFLA_BR_MCAST_QUERIER			nlattr[IFLA_BR_MCAST_QUERIER, int8]
	IFLA_BR_MCAST_HASH_ELASTICITY		nlattr[IFLA_BR_MCAST_HASH_ELASTICITY, int32]
	IFLA_BR_MCAST_HASH_MAX			nlattr[IFLA_BR_MCAST_HASH_MAX, int32]
	IFLA_BR_MCAST_LAST_MEMBER_CNT		nlattr[IFLA_BR_MCAST_LAST_MEMBER_CNT, int32]
	IFLA_BR_MCAST_STARTUP_QUERY_CNT		nlattr[IFLA_BR_MCAST_STARTUP_QUERY_CNT, int32]
	IFLA_BR_MCAST_LAST_MEMBER_INTVL		nlattr[IFLA_BR_MCAST_LAST_MEMBER_INTVL, int64]
	IFLA_BR_MCAST_MEMBERSHIP_INTVL		nlattr[IFLA_BR_MCAST_MEMBERSHIP_INTVL, int64]
	IFLA_BR_MCAST_QUERIER_INTVL		nlattr[IFLA_BR_MCAST_QUERIER_INTVL, int64]
	IFLA_BR_MCAST_QUERY_INTVL		nlattr[IFLA_BR_MCAST_QUERY_INTVL, int64]
	IFLA_BR_MCAST_QUERY_RESPONSE_INTVL	nlattr[IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, int64]
	IFLA_BR_MCAST_STARTUP_QUERY_INTVL	nlattr[IFLA_BR_MCAST_STARTUP_QUERY_INTVL, int64]
	IFLA_BR_NF_CALL_IPTABLES		nlattr[IFLA_BR_NF_CALL_IPTABLES, bool8]
	IFLA_BR_NF_CALL_IP6TABLES		nlattr[IFLA_BR_NF_CALL_IP6TABLES, bool8]
	IFLA_BR_NF_CALL_ARPTABLES		nlattr[IFLA_BR_NF_CALL_ARPTABLES, bool8]
	IFLA_BR_VLAN_DEFAULT_PVID		nlattr[IFLA_BR_VLAN_DEFAULT_PVID, int16]
	IFLA_BR_VLAN_STATS_ENABLED		nlattr[IFLA_BR_VLAN_STATS_ENABLED, bool8]
	IFLA_BR_MCAST_STATS_ENABLED		nlattr[IFLA_BR_MCAST_STATS_ENABLED, bool8]
	IFLA_BR_MCAST_IGMP_VERSION		nlattr[IFLA_BR_MCAST_IGMP_VERSION, int8]
	IFLA_BR_MCAST_MLD_VERSION		nlattr[IFLA_BR_MCAST_MLD_VERSION, int8]
	IFLA_BR_VLAN_STATS_PER_PORT		nlattr[IFLA_BR_VLAN_STATS_PER_PORT, bool8]
	IFLA_BR_MULTI_BOOLOPT			nlattr[IFLA_BR_MULTI_BOOLOPT, br_boolopt_multi]
] [varlen]

br_boolopt_multi {
	optval	flags[br_boolopt_id, int32]
	optmask	flags[br_boolopt_id, int32]
}

br_boolopt_id = BR_BOOLOPT_NO_LL_LEARN, BR_BOOLOPT_MCAST_VLAN_SNOOPING

br_port_policy [
	IFLA_BRPORT_STATE			nlattr[IFLA_BRPORT_STATE, int8[0:4]]
	IFLA_BRPORT_COST			nlattr[IFLA_BRPORT_COST, int32]
	IFLA_BRPORT_PRIORITY			nlattr[IFLA_BRPORT_PRIORITY, int16]
	IFLA_BRPORT_MODE			nlattr[IFLA_BRPORT_MODE, int8[0:1]]
	IFLA_BRPORT_GUARD			nlattr[IFLA_BRPORT_GUARD, int8[0:1]]
	IFLA_BRPORT_PROTECT			nlattr[IFLA_BRPORT_PROTECT, int8[0:1]]
	IFLA_BRPORT_FAST_LEAVE			nlattr[IFLA_BRPORT_FAST_LEAVE, int8[0:1]]
	IFLA_BRPORT_LEARNING			nlattr[IFLA_BRPORT_LEARNING, int8[0:1]]
	IFLA_BRPORT_UNICAST_FLOOD		nlattr[IFLA_BRPORT_UNICAST_FLOOD, int8[0:1]]
	IFLA_BRPORT_PROXYARP			nlattr[IFLA_BRPORT_PROXYARP, int8[0:1]]
	IFLA_BRPORT_PROXYARP_WIFI		nlattr[IFLA_BRPORT_PROXYARP_WIFI, int8[0:1]]
	IFLA_BRPORT_MULTICAST_ROUTER		nlattr[IFLA_BRPORT_MULTICAST_ROUTER, int8[0:3]]
	IFLA_BRPORT_MCAST_TO_UCAST		nlattr[IFLA_BRPORT_MCAST_TO_UCAST, int8[0:1]]
	IFLA_BRPORT_MCAST_FLOOD			nlattr[IFLA_BRPORT_MCAST_FLOOD, int8[0:1]]
	IFLA_BRPORT_BCAST_FLOOD			nlattr[IFLA_BRPORT_BCAST_FLOOD, int8[0:1]]
	IFLA_BRPORT_VLAN_TUNNEL			nlattr[IFLA_BRPORT_VLAN_TUNNEL, int8[0:1]]
	IFLA_BRPORT_GROUP_FWD_MASK		nlattr[IFLA_BRPORT_GROUP_FWD_MASK, int16]
	IFLA_BRPORT_NEIGH_SUPPRESS		nlattr[IFLA_BRPORT_NEIGH_SUPPRESS, int8[0:1]]
	IFLA_BRPORT_ISOLATED			nlattr[IFLA_BRPORT_ISOLATED, int8[0:1]]
	IFLA_BRPORT_FLUSH			nlattr[IFLA_BRPORT_FLUSH, void]
	IFLA_BRPORT_BACKUP_PORT			nlattr[IFLA_BRPORT_BACKUP_PORT, ifindex]
	IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT	nlattr[IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT, int32]
] [varlen]

ipgre_policy [
	IFLA_GRE_LINK			nlattr[IFLA_GRE_LINK, ifindex]
	IFLA_GRE_IFLAGS			nlattr[IFLA_GRE_IFLAGS, int16]
	IFLA_GRE_OFLAGS			nlattr[IFLA_GRE_OFLAGS, int16]
	IFLA_GRE_IKEY			nlattr[IFLA_GRE_IKEY, int32]
	IFLA_GRE_OKEY			nlattr[IFLA_GRE_OKEY, int32]
	IFLA_GRE_LOCAL			nlattr[IFLA_GRE_LOCAL, ipv4_addr]
	IFLA_GRE_REMOTE			nlattr[IFLA_GRE_REMOTE, ipv4_addr]
	IFLA_GRE_TTL			nlattr[IFLA_GRE_TTL, int8]
	IFLA_GRE_TOS			nlattr[IFLA_GRE_TOS, int8]
	IFLA_GRE_PMTUDISC		nlattr[IFLA_GRE_PMTUDISC, int8[0:1]]
	IFLA_GRE_ENCAP_TYPE		nlattr[IFLA_GRE_ENCAP_TYPE, flags[tunnel_encap_types, int16]]
	IFLA_GRE_ENCAP_FLAGS		nlattr[IFLA_GRE_ENCAP_FLAGS, int16]
	IFLA_GRE_ENCAP_SPORT		nlattr[IFLA_GRE_ENCAP_SPORT, sock_port]
	IFLA_GRE_ENCAP_DPORT		nlattr[IFLA_GRE_ENCAP_DPORT, sock_port]
	IFLA_GRE_COLLECT_METADATA	nlattr[IFLA_GRE_COLLECT_METADATA, void]
	IFLA_GRE_IGNORE_DF		nlattr[IFLA_GRE_IGNORE_DF, int8[0:1]]
	IFLA_GRE_FWMARK			nlattr[IFLA_GRE_FWMARK, int32]
	IFLA_GRE_ERSPAN_INDEX		nlattr[IFLA_GRE_ERSPAN_INDEX, int32[1:0xfffff]]
	IFLA_GRE_ERSPAN_VER		nlattr[IFLA_GRE_ERSPAN_VER, int8[1:2]]
	IFLA_GRE_ERSPAN_DIR		nlattr[IFLA_GRE_ERSPAN_DIR, int8[0:1]]
	IFLA_GRE_ERSPAN_HWID		nlattr[IFLA_GRE_ERSPAN_HWID, int16]
] [varlen]

ip6gre_policy [
	IFLA_GRE_LINK			nlattr[IFLA_GRE_LINK, ifindex]
	IFLA_GRE_IFLAGS			nlattr[IFLA_GRE_IFLAGS, int16]
	IFLA_GRE_OFLAGS			nlattr[IFLA_GRE_OFLAGS, int16]
	IFLA_GRE_IKEY			nlattr[IFLA_GRE_IKEY, int32]
	IFLA_GRE_OKEY			nlattr[IFLA_GRE_OKEY, int32]
	IFLA_GRE_LOCAL			nlattr[IFLA_GRE_LOCAL, ipv6_addr]
	IFLA_GRE_REMOTE			nlattr[IFLA_GRE_REMOTE, ipv6_addr]
	IFLA_GRE_TTL			nlattr[IFLA_GRE_TTL, int8]
	IFLA_GRE_ENCAP_LIMIT		nlattr[IFLA_GRE_ENCAP_LIMIT, int8]
	IFLA_GRE_FLOWINFO		nlattr[IFLA_GRE_FLOWINFO, int32]
	IFLA_GRE_FLAGS			nlattr[IFLA_GRE_FLAGS, int32]
	IFLA_GRE_ENCAP_TYPE		nlattr[IFLA_GRE_ENCAP_TYPE, flags[tunnel_encap_types, int16]]
	IFLA_GRE_ENCAP_FLAGS		nlattr[IFLA_GRE_ENCAP_FLAGS, int16]
	IFLA_GRE_ENCAP_SPORT		nlattr[IFLA_GRE_ENCAP_SPORT, sock_port]
	IFLA_GRE_ENCAP_DPORT		nlattr[IFLA_GRE_ENCAP_DPORT, sock_port]
	IFLA_GRE_COLLECT_METADATA	nlattr[IFLA_GRE_COLLECT_METADATA, void]
	IFLA_GRE_FWMARK			nlattr[IFLA_GRE_FWMARK, int32]
	IFLA_GRE_ERSPAN_INDEX		nlattr[IFLA_GRE_ERSPAN_INDEX, int32[1:0xfffff]]
	IFLA_GRE_ERSPAN_VER		nlattr[IFLA_GRE_ERSPAN_VER, int8[1:2]]
	IFLA_GRE_ERSPAN_DIR		nlattr[IFLA_GRE_ERSPAN_DIR, int8[0:1]]
	IFLA_GRE_ERSPAN_HWID		nlattr[IFLA_GRE_ERSPAN_HWID, int16]
] [varlen]

veth_policy [
	VETH_INFO_PEER	nlattr[VETH_INFO_PEER, peer_info]
] [varlen]

peer_info {
	hdr	ifinfomsg[AF_UNSPEC]
# This may be followed by ifla_policy for the peer, but adding it causes recursion.
#	policy optional[ifla_policy]
}

vti_policy$common [
	IFLA_VTI_LINK	nlattr[IFLA_VTI_LINK, ifindex]
	IFLA_VTI_IKEY	nlattr[IFLA_VTI_IKEY, int32]
	IFLA_VTI_OKEY	nlattr[IFLA_VTI_OKEY, int32]
	IFLA_VTI_FWMARK	nlattr[IFLA_VTI_FWMARK, int32]
] [varlen]

vti_policy [
	IFLA_VTI_LOCAL		nlattr[IFLA_VTI_LOCAL, ipv4_addr]
	IFLA_VTI_REMOTE		nlattr[IFLA_VTI_REMOTE, ipv4_addr]
	vti_common_policy	array[vti_policy$common]
] [varlen]

vti6_policy [
	IFLA_VTI_LOCAL		nlattr[IFLA_VTI_LOCAL, ipv6_addr]
	IFLA_VTI_REMOTE		nlattr[IFLA_VTI_REMOTE, ipv6_addr]
	vti_common_policy	array[vti_policy$common]
] [varlen]

ipip_policy [
	IFLA_IPTUN_LINK			nlattr[IFLA_IPTUN_LINK, ifindex]
	IFLA_IPTUN_LOCAL		nlattr[IFLA_IPTUN_LOCAL, ipv4_addr]
	IFLA_IPTUN_REMOTE		nlattr[IFLA_IPTUN_REMOTE, ipv4_addr]
	IFLA_IPTUN_TTL			nlattr[IFLA_IPTUN_TTL, int8]
	IFLA_IPTUN_TOS			nlattr[IFLA_IPTUN_TOS, int8]
	IFLA_IPTUN_PROTO		nlattr[IFLA_IPTUN_PROTO, flags[ipip6_ip_proto, int8]]
	IFLA_IPTUN_PMTUDISC		nlattr[IFLA_IPTUN_PMTUDISC, int8[0:1]]
	IFLA_IPTUN_ENCAP_TYPE		nlattr[IFLA_IPTUN_ENCAP_TYPE, flags[tunnel_encap_types, int16]]
	IFLA_IPTUN_ENCAP_FLAGS		nlattr[IFLA_IPTUN_ENCAP_FLAGS, int16]
	IFLA_IPTUN_ENCAP_SPORT		nlattr[IFLA_IPTUN_ENCAP_SPORT, sock_port]
	IFLA_IPTUN_ENCAP_DPORT		nlattr[IFLA_IPTUN_ENCAP_DPORT, sock_port]
	IFLA_IPTUN_COLLECT_METADATA	nlattr[IFLA_IPTUN_COLLECT_METADATA, void]
	IFLA_IPTUN_FWMARK		nlattr[IFLA_IPTUN_FWMARK, int32]
] [varlen]

ipip6_policy [
	IFLA_IPTUN_LINK			nlattr[IFLA_IPTUN_LINK, ifindex]
	IFLA_IPTUN_LOCAL		nlattr[IFLA_IPTUN_LOCAL, ipv4_addr]
	IFLA_IPTUN_REMOTE		nlattr[IFLA_IPTUN_REMOTE, ipv4_addr]
	IFLA_IPTUN_TTL			nlattr[IFLA_IPTUN_TTL, int8]
	IFLA_IPTUN_TOS			nlattr[IFLA_IPTUN_TOS, int8]
	IFLA_IPTUN_PMTUDISC		nlattr[IFLA_IPTUN_PMTUDISC, int8[0:1]]
	IFLA_IPTUN_FLAGS		nlattr[IFLA_IPTUN_FLAGS, int16[0:0x40]]
	IFLA_IPTUN_PROTO		nlattr[IFLA_IPTUN_PROTO, flags[ipip6_ip_proto, int8]]
	IFLA_IPTUN_6RD_PREFIX		nlattr[IFLA_IPTUN_6RD_PREFIX, ipv6_addr]
	IFLA_IPTUN_6RD_RELAY_PREFIX	nlattr[IFLA_IPTUN_6RD_RELAY_PREFIX, int32]
	IFLA_IPTUN_6RD_PREFIXLEN	nlattr[IFLA_IPTUN_6RD_PREFIXLEN, int16]
	IFLA_IPTUN_6RD_RELAY_PREFIXLEN	nlattr[IFLA_IPTUN_6RD_RELAY_PREFIXLEN, int16]
	IFLA_IPTUN_ENCAP_TYPE		nlattr[IFLA_IPTUN_ENCAP_TYPE, flags[tunnel_encap_types, int16]]
	IFLA_IPTUN_ENCAP_FLAGS		nlattr[IFLA_IPTUN_ENCAP_FLAGS, int16]
	IFLA_IPTUN_ENCAP_SPORT		nlattr[IFLA_IPTUN_ENCAP_SPORT, sock_port]
	IFLA_IPTUN_ENCAP_DPORT		nlattr[IFLA_IPTUN_ENCAP_DPORT, sock_port]
	IFLA_IPTUN_FWMARK		nlattr[IFLA_IPTUN_FWMARK, int32]
] [varlen]

ip6_tnl_policy [
	IFLA_IPTUN_LINK			nlattr[IFLA_IPTUN_LINK, ifindex]
	IFLA_IPTUN_LOCAL		nlattr[IFLA_IPTUN_LOCAL, ipv6_addr]
	IFLA_IPTUN_REMOTE		nlattr[IFLA_IPTUN_REMOTE, ipv6_addr]
	IFLA_IPTUN_TTL			nlattr[IFLA_IPTUN_TTL, int8]
	IFLA_IPTUN_ENCAP_LIMIT		nlattr[IFLA_IPTUN_ENCAP_LIMIT, int8]
	IFLA_IPTUN_FLOWINFO		nlattr[IFLA_IPTUN_FLOWINFO, int32]
	IFLA_IPTUN_FLAGS		nlattr[IFLA_IPTUN_FLAGS, int32[0:0x40]]
	IFLA_IPTUN_PROTO		nlattr[IFLA_IPTUN_PROTO, flags[ipip6_ip_proto, int8]]
	IFLA_IPTUN_ENCAP_TYPE		nlattr[IFLA_IPTUN_ENCAP_TYPE, flags[tunnel_encap_types, int16]]
	IFLA_IPTUN_ENCAP_FLAGS		nlattr[IFLA_IPTUN_ENCAP_FLAGS, int16]
	IFLA_IPTUN_ENCAP_SPORT		nlattr[IFLA_IPTUN_ENCAP_SPORT, sock_port]
	IFLA_IPTUN_ENCAP_DPORT		nlattr[IFLA_IPTUN_ENCAP_DPORT, sock_port]
	IFLA_IPTUN_COLLECT_METADATA	nlattr[IFLA_IPTUN_COLLECT_METADATA, void]
	IFLA_IPTUN_FWMARK		nlattr[IFLA_IPTUN_FWMARK, int32]
] [varlen]

ipip6_ip_proto = IPPROTO_IPV6, IPPROTO_IPIP, IPPROTO_MPLS

ifa_ipv4_policy [
	IFA_LOCAL		nlattr[IFA_LOCAL, ipv4_addr]
	IFA_ADDRESS		nlattr[IFA_ADDRESS, ipv4_addr]
	IFA_BROADCAST		nlattr[IFA_BROADCAST, ipv4_addr]
	IFA_LABEL		nlattr[IFA_LABEL, devname]
	IFA_CACHEINFO		nlattr[IFA_CACHEINFO, ifa_cacheinfo]
	IFA_FLAGS		nlattr[IFA_FLAGS, flags[ifa_flags, int32]]
	IFA_RT_PRIORITY		nlattr[IFA_RT_PRIORITY, int32]
	IFA_TARGET_NETNSID	nlattr[IFA_TARGET_NETNSID, netns_id]
] [varlen]

ifa_ipv6_policy [
	IFA_ADDRESS		nlattr[IFA_ADDRESS, ipv6_addr]
	IFA_LOCAL		nlattr[IFA_LOCAL, ipv6_addr]
	IFA_CACHEINFO		nlattr[IFA_CACHEINFO, ifa_cacheinfo]
	IFA_FLAGS		nlattr[IFA_FLAGS, flags[ifa_flags, int32]]
	IFA_RT_PRIORITY		nlattr[IFA_RT_PRIORITY, int32]
	IFA_TARGET_NETNSID	nlattr[IFA_TARGET_NETNSID, netns_id]
] [varlen]

rtm_ipv4_policy [
	RTA_DST		nlattr[RTA_DST, ipv4_addr]
	RTA_SRC		nlattr[RTA_SRC, ipv4_addr]
	RTA_IIF		nlattr[RTA_IIF, ifindex]
	RTA_OIF		nlattr[RTA_OIF, ifindex]
	RTA_GATEWAY	nlattr[RTA_GATEWAY, ipv4_addr]
	RTA_PRIORITY	nlattr[RTA_PRIORITY, int32]
	RTA_PREFSRC	nlattr[RTA_PREFSRC, ipv4_addr]
# TODO: what's this? is this interesting?
	RTA_METRICS	nlnest[RTA_METRICS, array[int8]]
	RTA_MULTIPATH	nlattr[RTA_MULTIPATH, rtnexthop]
	RTA_FLOW	nlattr[RTA_FLOW, int32]
	RTA_ENCAP_TYPE	nlattr[RTA_ENCAP_TYPE, flags[lwtunnel_encap_types, int16]]
	RTA_ENCAP	nlnest[RTA_ENCAP, lwtunnel_policy]
	RTA_UID		nlattr[RTA_UID, uid]
	RTA_MARK	nlattr[RTA_MARK, int32]
	RTA_TABLE	nlattr[RTA_TABLE, int32]
	RTA_IP_PROTO	nlattr[RTA_IP_PROTO, flags[rta_ip_protos, int8]]
	RTA_SPORT	nlattr[RTA_SPORT, sock_port]
	RTA_DPORT	nlattr[RTA_DPORT, sock_port]
	RTA_NH_ID	nlattr[RTA_NH_ID, int32]
] [varlen]

rta_ip_protos = IPPROTO_TCP, IPPROTO_UDP, IPPROTO_ICMP, IPPROTO_ICMPV6

rtm_ipv6_policy [
	RTA_GATEWAY	nlattr[RTA_GATEWAY, ipv6_addr]
	RTA_IIF		nlattr[RTA_IIF, ifindex]
	RTA_OIF		nlattr[RTA_OIF, ifindex]
	RTA_PRIORITY	nlattr[RTA_PRIORITY, int32]
# TODO: what's this? is this interesting?
	RTA_METRICS	nlnest[RTA_METRICS, array[int8]]
	RTA_MULTIPATH	nlattr[RTA_MULTIPATH, rtnexthop]
	RTA_PREF	nlattr[RTA_PREF, int8]
	RTA_ENCAP_TYPE	nlattr[RTA_ENCAP_TYPE, flags[lwtunnel_encap_types, int16]]
	RTA_ENCAP	nlnest[RTA_ENCAP, lwtunnel_policy]
	RTA_EXPIRES	nlattr[RTA_EXPIRES, int32]
	RTA_UID		nlattr[RTA_UID, uid]
	RTA_MARK	nlattr[RTA_MARK, int32]
] [varlen]

rtm_mpls_policy [
	RTA_DST			nlattr[RTA_DST, mpls_label]
	RTA_MULTIPATH		nlattr[RTA_MULTIPATH, rtnexthop]
	RTA_NEWDST		nlattr[RTA_NEWDST, array[mpls_label, 32]]
	RTA_OIF			nlattr[RTA_OIF, ifindex]
	RTA_TTL_PROPAGATE	nlattr[RTA_TTL_PROPAGATE, int8]
	RTA_VIA			nlattr[RTA_VIA, sockaddr_generic]
] [varlen]

type fib_rule_hdr[FAMILY] {
	family		const[FAMILY, int8]
	dst_len		flags[rtm_addr_len, int8]
	rcdst_len	flags[rtm_addr_len, int8]
	tos		int8
	table		int8
	res1		const[0, int8]
	res2		const[0, int8]
	action		flags[fr_actions, int8]
	flags		flags[fr_flags, int32]
}

fib_rule_uid_range {
	start	uid
	end	uid
}

fib_rule_port_range {
	start	sock_port
	end	sock_port
}

fib4_rule_policy_generic [
	FRA_IIFNAME		nlattr[FRA_IIFNAME, devname]
	FRA_OIFNAME		nlattr[FRA_OIFNAME, devname]
	FRA_PRIORITY		nlattr[FRA_PRIORITY, int32]
	FRA_FWMARK		nlattr[FRA_FWMARK, int32]
	FRA_FWMASK		nlattr[FRA_FWMASK, int32]
	FRA_TABLE		nlattr[FRA_TABLE, int32]
	FRA_SUPPRESS_PREFIXLEN	nlattr[FRA_SUPPRESS_PREFIXLEN, int32]
	FRA_SUPPRESS_IFGROUP	nlattr[FRA_SUPPRESS_IFGROUP, int32]
	FRA_GOTO		nlattr[FRA_GOTO, int32]
	FRA_L3MDEV		nlattr[FRA_L3MDEV, int8]
	FRA_UID_RANGE		nlattr[FRA_UID_RANGE, fib_rule_uid_range]
	FRA_PROTOCOL		nlattr[FRA_PROTOCOL, flags[rtm_protocol, int8]]
	FRA_IP_PROTO		nlattr[FRA_IP_PROTO, flags[ipv6_types, int8]]
	FRA_SPORT_RANGE		nlattr[FRA_SPORT_RANGE, fib_rule_port_range]
	FRA_DPORT_RANGE		nlattr[FRA_DPORT_RANGE, fib_rule_port_range]
] [varlen]

# FRA_DST/SRC are not in fib4/6_rule_policy. But fib4/6 still need them.
# So I add them here.
fib4_rule_policy [
	FRA_DST			nlattr[RTA_DST, ipv4_addr]
	FRA_SRC			nlattr[RTA_SRC, ipv4_addr]
	FRA_GENERIC_POLICY	fib4_rule_policy_generic
	FRA_FLOW		nlattr[FRA_FLOW, int32]
	FRA_TUN_ID		nlnetw[FRA_TUN_ID, int64be]
] [varlen]

fib6_rule_policy [
	FRA_DST		nlattr[RTA_DST, ipv6_addr]
	FRA_SRC		nlattr[RTA_SRC, ipv6_addr]
	FIB_RULE_POLICY	fib4_rule_policy_generic
] [varlen]

nl_neightbl_policy [
	NDTA_NAME		nlattr[NDTA_NAME, string]
	NDTA_THRESH1		nlattr[NDTA_THRESH1, int32]
	NDTA_THRESH2		nlattr[NDTA_THRESH2, int32]
	NDTA_THRESH3		nlattr[NDTA_THRESH3, int32]
	NDTA_GC_INTERVAL	nlattr[NDTA_GC_INTERVAL, int64]
	NDTA_PARMS		nlnest[NDTA_PARMS, array[nl_ntbl_parm_policy]]
] [varlen]

nl_ntbl_parm_policy [
	NDTPA_IFINDEX			nlattr[NDTPA_IFINDEX, ifindex]
	NDTPA_QUEUE_LEN			nlattr[NDTPA_QUEUE_LEN, int32]
	NDTPA_PROXY_QLEN		nlattr[NDTPA_PROXY_QLEN, int32]
	NDTPA_APP_PROBES		nlattr[NDTPA_APP_PROBES, int32]
	NDTPA_UCAST_PROBES		nlattr[NDTPA_UCAST_PROBES, int32]
	NDTPA_MCAST_PROBES		nlattr[NDTPA_MCAST_PROBES, int32]
	NDTPA_MCAST_REPROBES		nlattr[NDTPA_MCAST_REPROBES, int32]
	NDTPA_BASE_REACHABLE_TIME	nlattr[NDTPA_BASE_REACHABLE_TIME, int64]
	NDTPA_GC_STALETIME		nlattr[NDTPA_GC_STALETIME, int64]
	NDTPA_DELAY_PROBE_TIME		nlattr[NDTPA_DELAY_PROBE_TIME, int64]
	NDTPA_RETRANS_TIME		nlattr[NDTPA_RETRANS_TIME, int64]
	NDTPA_ANYCAST_DELAY		nlattr[NDTPA_ANYCAST_DELAY, int64]
	NDTPA_PROXY_DELAY		nlattr[NDTPA_PROXY_DELAY, int64]
	NDTPA_LOCKTIME			nlattr[NDTPA_LOCKTIME, int64]
] [varlen]

nda_policy [
	NDA_DST_IPV4		nlattr[NDA_DST, ipv4_addr]
	NDA_DST_IPV6		nlattr[NDA_DST, ipv6_addr]
	NDA_DST_MAC		nlattr[NDA_DST, mac_addr]
	NDA_LLADDR		nlattr[NDA_LLADDR, mac_addr]
	NDA_CACHEINFO		nlattr[NDA_CACHEINFO, nda_cacheinfo]
	NDA_PROBES		nlattr[NDA_PROBES, int32]
	NDA_VLAN		nlattr[NDA_VLAN, int16[0:4]]
	NDA_PORT		nlattr[NDA_PORT, sock_port]
	NDA_VNI			nlattr[NDA_VNI, int32]
	NDA_IFINDEX		nlattr[NDA_IFINDEX, ifindex]
	NDA_MASTER		nlattr[NDA_MASTER, int32]
	NDA_LINK_NETNSID	nlattr[NDA_LINK_NETNSID, int32]
	NDA_SRC_VNI		nlattr[NDA_SRC_VNI, int32]
	NDA_FLAGS_EXT		nlattr[NDA_FLAGS_EXT, flags[ndm_ext_flags, int32]]
	NDA_PROTOCOL		nlattr[NDA_PROTOCOL, int8]
	NDA_NH_ID		nlattr[NDA_NH_ID, int32]
	NDA_FDB_EXT_ATTRS	nlnest[NDA_FDB_EXT_ATTRS, array[br_nda_fdb_pol]]
] [varlen]

br_nda_fdb_pol [
	NFEA_ACTIVITY_NOTIFY	nlattr[NFEA_ACTIVITY_NOTIFY, int8]
	NFEA_DONT_REFRESH	nlattr[NFEA_DONT_REFRESH, void]
] [varlen]

nda_cacheinfo {
	ndm_confirmed	int32
	ndm_used	int32
	ndm_updated	int32
	ndm_refcnt	int32
}

rtnexthop {
	rtnh_len	int16
	rtnh_flags	flags[rtnh_flags, int8]
	rtnh_hops	int8
	rtnh_ifindex	ifindex
}

ifa_cacheinfo {
	ifa_prefered	int32
	ifa_valid	int32
	cstamp		int32
	tstamp		int32
}

br_vlan_db_dump_pol [
	BRIDGE_VLANDB_DUMP_FLAGS	nlattr[BRIDGE_VLANDB_DUMP_FLAGS, flags[br_vlan_dumpflags, int32]]
]

br_vlan_db_policy$container [
	BRIDGE_VLANDB_ENTRY	nlnest[BRIDGE_VLANDB_ENTRY, br_vlan_db_policy]
] [varlen]

br_vlan_db_policy [
	BRIDGE_VLANDB_ENTRY_INFO		nlattr[BRIDGE_VLANDB_ENTRY_INFO, bridge_vlan_info]
	BRIDGE_VLANDB_ENTRY_RANGE		nlattr[BRIDGE_VLANDB_ENTRY_RANGE, int16[BRIDGE_VLAN_INFO_RANGE_BEGIN:BRIDGE_VLAN_INFO_RANGE_END]]
	BRIDGE_VLANDB_ENTRY_STATE		nlattr[BRIDGE_VLANDB_ENTRY_STATE, flags[br_vlan_state_options, int8]]
	BRIDGE_VLANDB_ENTRY_TUNNEL_INFO		nlnest[BRIDGE_VLANDB_ENTRY_TUNNEL_INFO, br_vlandb_tinfo_pol]
	BRIDGE_VLANDB_ENTRY_MCAST_ROUTER	nlattr[BRIDGE_VLANDB_ENTRY_MCAST_ROUTER, int8]
] [varlen]

bridge_vlan_info {
	flags	flags[br_vlan_info_flags, int16]
	vid	int16[0:4]
}

br_vlandb_tinfo_pol [
	BRIDGE_VLANDB_TINFO_ID	nlattr[BRIDGE_VLANDB_TINFO_ID, int32]
	BRIDGE_VLANDB_TINFO_CMD	nlattr[BRIDGE_VLANDB_TINFO_CMD, flags[br_vlan_tinfo_cmd, int32]]
] [varlen]

br_mdb_policy [
	MDBA_SET_ENTRY	nlattr[MDBA_SET_ENTRY, br_mdb_entry]
]

br_mdb_entry {
	ifindex	ifindex
	state	flags[br_mdb_entry_state, int8]
	flags	flags[br_mdb_entry_flags, int8]
	vid	int16[0:4]
	addr	br_mdb_entry_sub
}

br_mdb_entry_sub {
	u	br_mdb_entry_sub_u
	proto	flags[br_mdb_entry_sub_proto, int16be]
}

br_mdb_entry_sub_u [
	ip4		ipv4_addr
	in6_addr	ipv6_addr
]

type rtm_nh_id int32[0:2]

rtm_nh_policy_get [
	NHA_ID		nlattr[NHA_ID, rtm_nh_id]
	NHA_OIF		nlattr[NHA_OIF, ifindex]
	NHA_GROUPS	nlattr[NHA_GROUPS, void]
	NHA_MASTER	nlattr[NHA_MASTER, rtm_nh_id]
	NHA_FDB		nlattr[NHA_FDB, void]
] [varlen]

rtm_nh_policy_new [
	NHA_ID		nlattr[NHA_ID, rtm_nh_id]
	NHA_GROUP	nlattr[NHA_GROUP, array[nexthop_grp]]
	NHA_GROUP_TYPE	nlattr[NHA_GROUP_TYPE, flags[nha_group_types, int16]]
	NHA_BLACKHOLE	nlattr[NHA_BLACKHOLE, void]
	NHA_OIF		nlattr[NHA_OIF, ifindex]
	NHA_GATEWAY	nlattr[NHA_GATEWAY, nha_gateway]
	NHA_ENCAP_TYPE	nlattr[NHA_ENCAP_TYPE, flags[lwtunnel_encap_types, int16]]
	NHA_ENCAP	nlnest[NHA_ENCAP, lwtunnel_policy]
	NHA_FDB		nlattr[NHA_FDB, void]
	NHA_RES_GROUP	nlnest[NHA_RES_GROUP, array[rtm_nh_res_policy_new]]
] [varlen]

type rtm_nh_policy_del nlattr[NHA_ID, rtm_nh_id]

rtm_nh_res_policy_new [
	NHA_RES_GROUP_BUCKETS		nlattr[NHA_RES_GROUP_BUCKETS, int16]
	NHA_RES_GROUP_IDLE_TIMER	nlattr[NHA_RES_GROUP_IDLE_TIMER, int32]
	NHA_RES_GROUP_UNBALANCED_TIMER	nlattr[NHA_RES_GROUP_UNBALANCED_TIMER, int32]
] [varlen]

nexthop_grp {
	id	int32[0:2]
	weight	int8
	resvd1	const[0, int8]
	resvd2	const[0, int16]
}

nha_gateway [
	ip4		ipv4_addr
	in6_addr	ipv6_addr
]

devconf_ipv4_policy [
	NETCONFA_IFINDEX		nlattr[NETCONFA_IFINDEX, ifindex]
	NETCONFA_FORWARDING		nlattr[NETCONFA_FORWARDING, int32]
	NETCONFA_RP_FILTER		nlattr[NETCONFA_RP_FILTER, int32]
	NETCONFA_PROXY_NEIGH		nlattr[NETCONFA_PROXY_NEIGH, int32]
	IGNORE_ROUTES_WITH_LINKDOWN	nlattr[NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, int32]
] [varlen]

devconf_mpls_policy [
	NETCONFA_IFINDEX		nlattr[NETCONFA_IFINDEX, ifindex]
	IGNORE_ROUTES_WITH_LINKDOWN	nlattr[NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, int32]
] [varlen]

ifla_vf_policy [
	IFLA_VF_MAC		nlattr[IFLA_VF_MAC, ifla_vf_mac]
	IFLA_VF_VLAN		nlattr[IFLA_VF_VLAN, ifla_vf_vlan]
	IFLA_VF_VLAN_LIST	nlnest[IFLA_VF_VLAN_LIST, array[nlattr[IFLA_VF_VLAN_INFO, ifla_vf_vlan_info]]]
	IFLA_VF_TX_RATE		nlattr[IFLA_VF_TX_RATE, ifla_vf_tx_rate]
	IFLA_VF_SPOOFCHK	nlattr[IFLA_VF_SPOOFCHK, ifla_vf_spoofchk]
	IFLA_VF_RATE		nlattr[IFLA_VF_RATE, ifla_vf_rate]
	IFLA_VF_LINK_STATE	nlattr[IFLA_VF_LINK_STATE, ifla_vf_link_state]
	IFLA_VF_RSS_QUERY_EN	nlattr[IFLA_VF_RSS_QUERY_EN, ifla_vf_rss_query_en]
	IFLA_VF_TRUST		nlattr[IFLA_VF_TRUST, ifla_vf_trust]
	IFLA_VF_IB_NODE_GUID	nlattr[IFLA_VF_IB_NODE_GUID, ifla_vf_guid]
	IFLA_VF_IB_PORT_GUID	nlattr[IFLA_VF_IB_PORT_GUID, ifla_vf_guid]
] [varlen]

ifla_vf_mac {
	vf	int32
	mac	mac_addr
	pad	array[const[0, int8], 26]
}

ifla_vf_vlan {
	vf	int32
	vlan	int32[0:4095]
	qos	int32
}

ifla_vf_tx_rate {
	vf	int32
	rate	int32
}

ifla_vf_rate {
	vf		int32
	min_tx_rate	int32
	max_tx_rate	int32
}

ifla_vf_spoofchk {
	vf	int32
	setting	int32
}

ifla_vf_guid {
	vf	int32
	guid	int64
}

ifla_vf_link_state {
	vf		int32
	link_state	int32
}

ifla_vf_rss_query_en {
	vf	int32
	setting	int32
}

ifla_vf_trust {
	vf	int32
	setting	int32
}

ifla_vf_vlan_info {
	vf		int32
	vlan		int32[0:4095]
	qos		int32
	vlan_proto	flags[vlan_proto, int16be]
}

ifla_port_policy [
	IFLA_PORT_VF		nlattr[IFLA_PORT_VF, int32]
	IFLA_PORT_PROFILE	nlattr[IFLA_PORT_PROFILE, string]
	IFLA_PORT_INSTANCE_UUID	nlattr[IFLA_PORT_INSTANCE_UUID, uuid_t]
	IFLA_PORT_HOST_UUID	nlattr[IFLA_PORT_HOST_UUID, uuid_t]
	IFLA_PORT_REQUEST	nlattr[IFLA_PORT_REQUEST, int8]
] [varlen]

ifla_xdp_policy [
	IFLA_XDP_FD		nlattr[IFLA_XDP_FD, fd_bpf_prog]
	IFLA_XDP_FLAGS		nlattr[IFLA_XDP_FLAGS, flags[ifla_xdp_flags, int32]]
	IFLA_XDP_EXPECTED_FD	nlattr[IFLA_XDP_EXPECTED_FD, fd_bpf_prog]
] [varlen]

ifla_xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST, XDP_FLAGS_SKB_MODE, XDP_FLAGS_DRV_MODE, XDP_FLAGS_HW_MODE

rtnl_link_ifmap {
	mem_start	int64
	mem_end		int64
	base_addr	int64
	irq		int16
	dma		int8
	port		int8
}

rtnl_net_policy [
	NETNSA_NSID	nlattr[NETNSA_NSID, netns_id]
	NETNSA_PID	nlattr[NETNSA_PID, pid]
	NETNSA_FD	nlattr[NETNSA_FD, fd_namespace]
] [varlen]

rtcanmsg {
	can_family	const[AF_CAN, int8]
	gwtype		const[CGW_TYPE_CAN_CAN, int8]
	flags		flags[rtcanmsg_flags, int16]
}

rtcanmsg_flags = CGW_FLAGS_CAN_ECHO, CGW_FLAGS_CAN_SRC_TSTAMP, CGW_FLAGS_CAN_IIF_TX_OK

lwtunnel_policy [
	MPLS_IPTUNNEL_DST	nlattr[MPLS_IPTUNNEL_DST, array[mpls_label]]
	MPLS_IPTUNNEL_TTL	nlattr[MPLS_IPTUNNEL_TTL, int8]

	LWTUNNEL_IP_ID		nlattr[LWTUNNEL_IP_ID, int64be]
	LWTUNNEL_IP_DST		nlattr[LWTUNNEL_IP_DST, ipv4_addr]
	LWTUNNEL_IP_SRC		nlattr[LWTUNNEL_IP_SRC, ipv4_addr]
	LWTUNNEL_IP_TTL		nlattr[LWTUNNEL_IP_TTL, int8]
	LWTUNNEL_IP_TOS		nlattr[LWTUNNEL_IP_TOS, int8]
	LWTUNNEL_IP_FLAGS	nlattr[LWTUNNEL_IP_FLAGS, flags[lwtunnel_ip_flags, int16be]]
	LWTUNNEL_IP_OPTS	nlnest[LWTUNNEL_IP_OPTS, ip_opts_policy]

	ILA_ATTR_LOCATOR	nlattr[ILA_ATTR_LOCATOR, int64be]
	ILA_ATTR_CSUM_MODE	nlattr[ILA_ATTR_CSUM_MODE, flags[ila_attr_csum_mode, int8]]
	ILA_ATTR_IDENT_TYPE	nlattr[ILA_ATTR_IDENT_TYPE, flags[ila_attr_ident_type, int8]]
	ILA_ATTR_HOOK_TYPE	nlattr[ILA_ATTR_HOOK_TYPE, flags[ila_attr_hook_type, int8]]

	LWTUNNEL_IP6_ID		nlattr[LWTUNNEL_IP6_ID, int64be]
	LWTUNNEL_IP6_DST	nlattr[LWTUNNEL_IP6_DST, ipv6_addr]
	LWTUNNEL_IP6_SRC	nlattr[LWTUNNEL_IP6_SRC, ipv6_addr]
	LWTUNNEL_IP6_HOPLIMIT	nlattr[LWTUNNEL_IP6_HOPLIMIT, int8]
	LWTUNNEL_IP6_TC		nlattr[LWTUNNEL_IP6_TC, int8]
	LWTUNNEL_IP6_FLAGS	nlattr[LWTUNNEL_IP6_FLAGS, flags[lwtunnel_ip_flags, int16be]]
	LWTUNNEL_IP6_OPTS	nlattr[LWTUNNEL_IP6_OPTS, ip_opts_policy]

	SEG6_IPTUNNEL_SRH	nlattr[SEG6_IPTUNNEL_SRH, seg6_tuninfo]

	LWT_BPF_IN		nlnest[LWT_BPF_IN, bpf_prog_policy]
	LWT_BPF_OUT		nlnest[LWT_BPF_OUT, bpf_prog_policy]
	LWT_BPF_XMIT		nlnest[LWT_BPF_XMIT, bpf_prog_policy]
	LWT_BPF_XMIT_HEADROOM	nlattr[LWT_BPF_XMIT_HEADROOM, int32[0:LWT_BPF_MAX_HEADROOM]]

	SEG6_LOCAL_ACTION	nlattr[SEG6_LOCAL_ACTION, int32[SEG6_LOCAL_ACTION_END:SEG6_LOCAL_ACTION_END_BPF]]
	SEG6_LOCAL_SRH		nlattr[SEG6_LOCAL_SRH, ipv6_sr_hdr]
	SEG6_LOCAL_TABLE	nlattr[SEG6_LOCAL_TABLE, int32]
	SEG6_LOCAL_NH4		nlattr[SEG6_LOCAL_NH4, ipv4_addr]
	SEG6_LOCAL_NH6		nlattr[SEG6_LOCAL_NH6, ipv6_addr]
	SEG6_LOCAL_IIF		nlattr[SEG6_LOCAL_IIF, int32]
	SEG6_LOCAL_OIF		nlattr[SEG6_LOCAL_OIF, int32]
	SEG6_LOCAL_BPF		nlnest[SEG6_LOCAL_BPF, bpf_prog_policy$seg6_local]

	RPL_IPTUNNEL_SRH	nlattr[RPL_IPTUNNEL_SRH, ipv6_rpl_sr_hdr]
] [varlen]

# 5832c4a77d693 ("ip_tunnel: convert __be16 tunnel flags to bitmaps") put the constants below
# behind #ifndef __KERNEL__, so they cannot be extracted anymore.
define TUNNEL_GENEVE_OPT	__cpu_to_be16(0x0800)
define TUNNEL_VXLAN_OPT	__cpu_to_be16(0x1000)
define TUNNEL_ERSPAN_OPT	__cpu_to_be16(0x4000)

lwtunnel_ip_flags = TUNNEL_GENEVE_OPT, TUNNEL_VXLAN_OPT, TUNNEL_ERSPAN_OPT

ip_opts_policy [
	LWTUNNEL_IP_OPTS_GENEVE	nlnest[LWTUNNEL_IP_OPTS_GENEVE, geneve_opt_policy$lwt]
	LWTUNNEL_IP_OPTS_VXLAN	nlnest[LWTUNNEL_IP_OPTS_VXLAN, vxlan_opt_policy$lwt]
	LWTUNNEL_IP_OPTS_ERSPAN	nlnest[LWTUNNEL_IP_OPTS_ERSPAN, erspan_opt_policy$lwt]
] [varlen]

geneve_opt_policy$lwt [
	LWTUNNEL_IP_OPT_GENEVE_CLASS	nlattr[LWTUNNEL_IP_OPT_GENEVE_CLASS, int16be]
	LWTUNNEL_IP_OPT_GENEVE_TYPE	nlattr[LWTUNNEL_IP_OPT_GENEVE_TYPE, int8]
	LWTUNNEL_IP_OPT_GENEVE_DATA	nlattr[LWTUNNEL_IP_OPT_GENEVE_DATA, array[int8, 0:128]]
] [varlen]

vxlan_opt_policy$lwt [
	LWTUNNEL_IP_OPT_VXLAN_GBP	nlattr[LWTUNNEL_IP_OPT_VXLAN_GBP, int32]
] [varlen]

erspan_opt_policy$lwt [
	LWTUNNEL_IP_OPT_ERSPAN_VER	nlattr[LWTUNNEL_IP_OPT_ERSPAN_VER, int8[1:2]]
	LWTUNNEL_IP_OPT_ERSPAN_INDEX	nlattr[LWTUNNEL_IP_OPT_ERSPAN_INDEX, int32be]
	LWTUNNEL_IP_OPT_ERSPAN_DIR	nlattr[LWTUNNEL_IP_OPT_ERSPAN_DIR, int8]
	LWTUNNEL_IP_OPT_ERSPAN_HWID	nlattr[LWTUNNEL_IP_OPT_ERSPAN_HWID, int8]
] [varlen]

bpf_prog_policy [
	LWT_BPF_PROG_FD		nlattr[LWT_BPF_PROG_FD, fd_bpf_prog]
	LWT_BPF_PROG_NAME	nlattr[LWT_BPF_PROG_NAME, string]
] [varlen]

bpf_prog_policy$seg6_local [
	SEG6_LOCAL_BPF_PROG		nlattr[SEG6_LOCAL_BPF_PROG, fd_bpf_prog]
	SEG6_LOCAL_BPF_PROG_NAME	nlattr[SEG6_LOCAL_BPF_PROG_NAME, string]
] [varlen]

ipv6_rpl_sr_hdr {
	nexthdr		int8
	hdrlen		len[parent, int8]
	type		const[RPL_IPTUNNEL_SRH, int8]
	segments_left	int8
	control		int32
	address		array[ipv6_addr]
} [packed]

ila_attr_csum_mode = ILA_CSUM_ADJUST_TRANSPORT, ILA_CSUM_NEUTRAL_MAP, ILA_CSUM_NO_ACTION, ILA_CSUM_NEUTRAL_MAP_AUTO

# TODO: describe remaining when supported
ila_attr_ident_type = ILA_ATYPE_IID, ILA_ATYPE_LUID, ILA_ATYPE_USE_FORMAT

ila_attr_hook_type = ILA_HOOK_ROUTE_INPUT, ILA_HOOK_ROUTE_OUTPUT

seg6_tuninfo {
	tuninfo		seg6_iptunnel_encap
	segments	array[ipv6_addr, 0:128]
} [packed]

seg6_iptunnel_encap {
	mode	flags[seg6_iptun_mode, int32]
	srh	ipv6_sr_hdr
}

seg6_iptun_mode = SEG6_IPTUN_MODE_INLINE, SEG6_IPTUN_MODE_ENCAP, SEG6_IPTUN_MODE_L2ENCAP

cgw_policy [
	CGW_MOD_AND	nlattr[CGW_MOD_AND, cgw_frame_mod]
	CGW_MOD_OR	nlattr[CGW_MOD_OR, cgw_frame_mod]
	CGW_MOD_XOR	nlattr[CGW_MOD_XOR, cgw_frame_mod]
	CGW_MOD_SET	nlattr[CGW_MOD_SET, cgw_frame_mod]
	CGW_CS_XOR	nlattr[CGW_CS_XOR, cgw_csum_xor]
	CGW_CS_CRC8	nlattr[CGW_CS_CRC8, cgw_csum_crc8]
	CGW_SRC_IF	nlattr[CGW_SRC_IF, ifindex_vcan]
	CGW_DST_IF	nlattr[CGW_DST_IF, ifindex_vcan]
	CGW_FILTER	nlattr[CGW_FILTER, can_filter]
	CGW_LIM_HOPS	nlattr[CGW_LIM_HOPS, int8]
	CGW_MOD_UID	nlattr[CGW_MOD_UID, uid]
] [varlen]

cgw_frame_mod {
	cf	can_frame
	modtype	flags[cgw_frame_modtype, int8]
} [packed]

cgw_frame_modtype = CGW_MOD_ID, CGW_MOD_DLC, CGW_MOD_DATA

cgw_csum_xor {
	from_idx	int8[-9:8]
	to_idx		int8[-9:8]
	result_idx	int8[-9:8]
	init_xor_val	int8
} [packed]

cgw_csum_crc8 {
	from_idx	int8[0:127]
	to_idx		int8[0:127]
	result_idx	int8[0:127]
	init_crc_val	int8
	final_xor_val	int8
	crctab		array[int8, 256]
	profile		flags[cgw_csum_crc8_profile, int8]
	profile_data	array[int8, 20]
} [packed]

cgw_csum_crc8_profile = CGW_CRC8PRF_UNSPEC, CGW_CRC8PRF_1U8, CGW_CRC8PRF_16U8, CGW_CRC8PRF_SFFID_XOR

rtnl_af = AF_INET, AF_INET6, AF_BRIDGE, AF_MPLS
net_device_flags = IFF_UP, IFF_BROADCAST, IFF_DEBUG, IFF_LOOPBACK, IFF_POINTOPOINT, IFF_NOTRAILERS, IFF_RUNNING, IFF_NOARP, IFF_PROMISC, IFF_ALLMULTI, IFF_MASTER, IFF_SLAVE, IFF_MULTICAST, IFF_PORTSEL, IFF_AUTOMEDIA, IFF_DYNAMIC, IFF_LOWER_UP, IFF_DORMANT, IFF_ECHO
ifa_flags = IFA_F_MANAGETEMPADDR, IFA_F_NOPREFIXROUTE, IFA_F_MCAUTOJOIN, ifa_flags8
ifa_flags8 = IFA_F_SECONDARY, IFA_F_NODAD, IFA_F_OPTIMISTIC, IFA_F_DADFAILED, IFA_F_HOMEADDRESS, IFA_F_DEPRECATED, IFA_F_TENTATIVE, IFA_F_PERMANENT
rt_scope_t = RT_SCOPE_UNIVERSE, RT_SCOPE_SITE, RT_SCOPE_LINK, RT_SCOPE_HOST, RT_SCOPE_NOWHERE
rtm_protocol = RTPROT_UNSPEC, RTPROT_REDIRECT, RTPROT_KERNEL, RTPROT_BOOT, RTPROT_STATIC
rtm_type = RTN_UNSPEC, RTN_UNICAST, RTN_LOCAL, RTN_BROADCAST, RTN_ANYCAST, RTN_MULTICAST, RTN_BLACKHOLE, RTN_UNREACHABLE, RTN_PROHIBIT, RTN_THROW, RTN_NAT, RTN_XRESOLVE
rtm_flags = RTM_F_NOTIFY, RTM_F_CLONED, RTM_F_EQUALIZE, RTM_F_PREFIX, RTM_F_LOOKUP_TABLE, RTM_F_FIB_MATCH
fr_actions = FR_ACT_UNSPEC, FR_ACT_TO_TBL, FR_ACT_GOTO, FR_ACT_NOP, FR_ACT_RES3, FR_ACT_RES4, FR_ACT_BLACKHOLE, FR_ACT_UNREACHABLE, FR_ACT_PROHIBIT
fr_flags = FIB_RULE_PERMANENT, FIB_RULE_INVERT, FIB_RULE_UNRESOLVED, FIB_RULE_IIF_DETACHED, FIB_RULE_OIF_DETACHED, FIB_RULE_FIND_SADDR
lwtunnel_encap_types = LWTUNNEL_ENCAP_NONE, LWTUNNEL_ENCAP_MPLS, LWTUNNEL_ENCAP_IP, LWTUNNEL_ENCAP_ILA, LWTUNNEL_ENCAP_IP6, LWTUNNEL_ENCAP_SEG6, LWTUNNEL_ENCAP_BPF, LWTUNNEL_ENCAP_SEG6_LOCAL, LWTUNNEL_ENCAP_RPL
rt_table_types = RT_TABLE_UNSPEC, RT_TABLE_COMPAT, RT_TABLE_DEFAULT, RT_TABLE_MAIN, RT_TABLE_LOCAL
ndm_state = NUD_INCOMPLETE, NUD_REACHABLE, NUD_STALE, NUD_DELAY, NUD_PROBE, NUD_FAILED, NUD_NOARP, NUD_PERMANENT, NUD_NONE
ndm_flags = NTF_USE, NTF_SELF, NTF_MASTER, NTF_PROXY, NTF_EXT_LEARNED, NTF_OFFLOADED, NTF_STICKY, NTF_ROUTER
ndm_ext_flags = NTF_EXT_MANAGED
ifa_prefixlen = 0, 1, 8, 16, 24, 31, 32, 56, 63, 64, 120, 128
rtm_addr_len = 0, 16, 20, 32, 128
filter_mask = IFLA_STATS_UNSPEC, IFLA_STATS_LINK_64, IFLA_STATS_LINK_XSTATS, IFLA_STATS_LINK_XSTATS_SLAVE, IFLA_STATS_LINK_OFFLOAD_XSTATS, IFLA_STATS_AF_SPEC
tunnel_encap_types = TUNNEL_ENCAP_NONE, TUNNEL_ENCAP_FOU, TUNNEL_ENCAP_GUE, TUNNEL_ENCAP_MPLS
ifal_labels = 0, 1, 2, 3, 4, 5, 6, 7, 11, 12
br_vlan_dumpflags = BRIDGE_VLANDB_DUMPF_STATS
br_vlan_state_options = BR_STATE_DISABLED, BR_STATE_LISTENING, BR_STATE_LEARNING, BR_STATE_FORWARDING, BR_STATE_BLOCKING
br_vlan_info_flags = BRIDGE_VLAN_INFO_MASTER, BRIDGE_VLAN_INFO_PVID, BRIDGE_VLAN_INFO_UNTAGGED, BRIDGE_VLAN_INFO_RANGE_BEGIN, BRIDGE_VLAN_INFO_RANGE_END, BRIDGE_VLAN_INFO_BRENTRY, BRIDGE_VLAN_INFO_ONLY_OPTS
br_vlan_tinfo_cmd = RTM_SETLINK, RTM_DELLINK
br_mdb_entry_state = MDB_TEMPORARY, MDB_PERMANENT
br_mdb_entry_flags = MDB_FLAGS_OFFLOAD, MDB_FLAGS_FAST_LEAVE
br_mdb_entry_sub_proto = ETH_P_IP, ETH_P_IPV6
rtnh_flags = RTNH_F_DEAD, RTNH_F_PERVASIVE, RTNH_F_ONLINK, RTNH_F_OFFLOAD, RTNH_F_LINKDOWN, RTNH_F_UNRESOLVED
nha_group_types = NEXTHOP_GRP_TYPE_MPATH, NEXTHOP_GRP_TYPE_RES