summaryrefslogtreecommitdiffstats
path: root/docs/aboutvpp/releasenotes/v21.06.rst
blob: 0c5820d868c4310ce493b518e14d8cd6620682e9 (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
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
Release notes for VPP 21.06
===========================

More than 787 commits since the previous release, including 364 fixes.

Release Highlights
------------------

There are many excellent new features in this release, however a few of
them deserve a special mention.

Linux Control Plane Plugin (linux-cp)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

One of the more significant new features included in this release is a
linux control plane (linux-cp) plugin. It enables the near-seamless
integration of VPP with the host control plane, by mirroring the VPP
interfaces into a TUN or TAP device created in the linux kernel. All of
the punted packets received on the VPP interface will be sent to the
linux counterpart, and in the reverse direction, packets sent by linux
kernel will be transmitted out the VPP interface. This plugin lays the
foundation for the much easier integration of external software with
VPP.

Performance Monitor Plugin (perfmon)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Another interesting feature is the performance monitor (perfmon) plugin.
It allows collection of detailed low-level CPU statistics on a per-node
basis. It provides a useful advanced troubleshooting tool, should you
encounter that a specific node’s performance is not on par with what it
should be. Note, that the correct functioning of this plugin may require
changing the /proc/sys/kernel/perf_event_paranoid setting to enable
access to the performance counters.

API CRC Substitution Table Removal
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

And finally a clarification, not a feature per se. Some messages in the
API changes table for this release have a new marking: “message CRC32
fix”. The history of this issue goes back to summer of 2020, when it was
discovered that for a considerable amount of time (several months) the
calculation of the CRC of API messages was incorrect. Specifically, all
but the first user-defined types in the message failed to be included in
the CRC calculation. In plain words, this means that one might end up
with a situation where client and VPP layout of message in memory could
be quite different.

At the time of discovery, there were no API changes that were affected
by that bug. However, simply fixing it meant the CRC of about half of
the VPP API messages would be altered for no reason which would result
in a significant amount of pain to the consumers of VPP. A message CRC
is just an opague number for anyone using it, and the only property of
it for the user is that the messages with the same value of CRC have the
same layout on the wire with a sufficiently high certainty.

Therefore a fix
(`9f84e70c6 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=9f84e70c6>`__)
was merged that also contained a “band-aid” to avoid this pain. In
addition to fixing the CRC generation algorithm, the fix captured the
“new” CRC values for those messages that had their CRCs arbitrarily
changed by this fix and created a substituion table with [message name,
new CRC, old CRC] triplets. For a given message, if the CRC matched the
recorded new value, the code would substitute it with the old value,
thus trading in a reduction in collision resistance (two values of CRC
out of 2^32 space) for not forcing users to adapt to several hundred of
messages which changed the CRCs.

This band-aid also had the property that whenever a message did change
the definition, it would automatically get a “correct” calculation of
CRC32 and no longer use the slot in the table. The table naturally
shrinks over time, thus allowing a painless transition, while also
preserving the integrity check for the affected messages. If any fields
changed, the CRC would no longer match the “new” value thus no
substitution would be made. Since the choice of CRC32 is just an
implementation detail which is supposed to be opaque to the user, the
band-aid was deemed a reasonable approach to avoid a major burden on VPP
consumers.

However, in practice this solution was not accepted well. After a
notification period, the API CRC Substitution table was removed by the
patch
(`da1b76aa8 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=da1b76aa8>`__).
Thus all of the API CRC changes that did not happen in 9f84e70c6,
happened in da1b76aa8. Hopefully the notification of these changes has
reduced the inconvenience. VPP users are asked to not rely on any other
property of the message CRC other than changes to its value when the
message layout changes.

Features
--------

-  Binary API Compiler for Python

   -  Support an ‘autoendian’ keyword for message definitions in .api
      files
      (`9302cfea9 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=9302cfea9>`__)

-  Build System

   -  Make rpath optional
      (`2c91922eb <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=2c91922eb>`__)

-  Infrastructure Library

   -  Add option to use libexecinfo
      (`67d7acd05 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=67d7acd05>`__)
   -  Add bihash with 32 byte key
      (`f613a4402 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=f613a4402>`__)
   -  Add missing %o
      (`04a14133c <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=04a14133c>`__)

-  Plugins

   -  ARPing CLI

      -  Add arping command
         (`a77ae4708 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=a77ae4708>`__)

   -  AVF Device driver

      -  Add avf flow framework
         (`ffe9a5489 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=ffe9a5489>`__)

   -  CNat

      -  Add maglev support
         (`4d237874e <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=4d237874e>`__)
      -  Add input feature node
         (`cc9a1a0d3 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=cc9a1a0d3>`__)
      -  Add calico/k8s src policy
         (`516b0adf6 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=516b0adf6>`__)

   -  Crypto - ipsecmb

      -  Add support for AES CTR
         (`fe7ff320b <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=fe7ff320b>`__)

   -  DPDK

      -  Rebase cryptodev engine for DPDK 20.11
         (`25f371ee0 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=25f371ee0>`__)
      -  Allow configure individual VMBUS devices
         (`982272974 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=982272974>`__)
      -  Implement interrupt mode
         (`19ff0c369 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=19ff0c369>`__)

   -  IPv6 Segment Routing Flow-Based Dynamic Proxy

      -  SRv6 Per-Flow Dynamic Proxy
         (`ed7c62a30 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=ed7c62a30>`__)

   -  Internet Key Exchange (IKEv2) Protocol

      -  Use new counters data model & add more counters
         (`fab5e7f39 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=fab5e7f39>`__)
      -  Add per SA stats
         (`68d275356 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=68d275356>`__)
      -  Support responder hostname
         (`af2cc6425 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=af2cc6425>`__)

   -  NAT

      -  1:1 policy NAT
         (`18327be5d <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=18327be5d>`__)
      -  Pnat copy and clear byte instructions
         (`ab3151c52 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=ab3151c52>`__)

   -  QUIC protocol

      -  Quicly v0.1.2 update
         (`2e4523816 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=2e4523816>`__)
      -  Update quicly to v0.1.3
         (`db36fda74 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=db36fda74>`__)

   -  RDMA (ibverb) driver

      -  Add support for RSS configuration
         (`f5a45680e <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=f5a45680e>`__)

   -  SRTP

      -  Basic implementation based on libsrtp2
         (`6621abf49 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=6621abf49>`__)

   -  TCP MSS Clamping

      -  TCP MSS clamping plugin
         (`bf55e9931 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=bf55e9931>`__)

   -  Linux-cp

      -  Linux Interface Mirroring for Control Plane Integration
         (`44db1caef <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=44db1caef>`__)

   -  Memif device driver

      -  Adapt to new rxq framework
         (`755941865 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=755941865>`__)

   -  Performance counter

      -  New perfmon plugin
         (`8b60fb0fe <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=8b60fb0fe>`__)

-  Python binding for the VPP API

   -  Expose vpp_papi version to client
      (`b552ff2e9 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=b552ff2e9>`__)

-  SVM Library

   -  Allow mq attachments at random offsets
      (`b46241889 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=b46241889>`__)
   -  Per app rx message queues
      (`41d5f541d <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=41d5f541d>`__)

-  Statistics Segment

   -  Adding symlinks for nodes and interfaces in the stat segment
      (`db0238090 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=db0238090>`__)
   -  Memory heap counters
      (`a606d9210 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=a606d9210>`__)

-  VNET

   -  Crypto Infra

      -  Add support for aes-ctr+sha-1 chains
         (`40ee2003b <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=40ee2003b>`__)
      -  Support hashing operations
         (`06111a837 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=06111a837>`__)
      -  Add chacha20-poly1305 support to ipsecmb
         (`106e24bd9 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=106e24bd9>`__)

   -  FIB

      -  Allow the creation of new source on the API
         (`976b259be <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=976b259be>`__)

   -  FLOW

      -  Add API implementation of IP4/IP6, IP4_VXLAN/IP6_VXLAN
         (`c7e7819ad <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=c7e7819ad>`__)

   -  IPIP

      -  Support MPLS over IP
         (`e294de6f8 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=e294de6f8>`__)

   -  IPSec

      -  Support MPLS over IPSec[46] interface
         (`4a58e49cf <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=4a58e49cf>`__)
      -  Add support for AES CTR
         (`490b92738 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=490b92738>`__)
      -  CLI improvement for udp port encap
         (`048189e7a <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=048189e7a>`__)
      -  Use the new tunnel API types to add flow label and TTL copy
         support
         (`c7eaa711f <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=c7eaa711f>`__)
      -  Use the new tunnel API types to add flow label and TTL copy
         support
         (`9ec846c26 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=9ec846c26>`__)
      -  Support async mode per-SA
         (`f16e9a550 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=f16e9a550>`__)

   -  IPv4 LPM

      -  Add API to retrieve IPv6 link-layer address
         (`58a1915b5 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=58a1915b5>`__)
      -  Router ID included in flow hash
         (`3d5f08a82 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=3d5f08a82>`__)
      -  Path MTU
         (`8f5fef2c7 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=8f5fef2c7>`__)
      -  Extend punt CLI for exception packets
         (`45723b8d3 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=45723b8d3>`__)
      -  Extend show cmd of ip reassembly configuration
         (`74a4a70ef <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=74a4a70ef>`__)

   -  Interface Common

      -  RX/TX direction type in API
         (`6a999d67d <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=6a999d67d>`__)
      -  Add promisc on/off in api
         (`fd0b399ff <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=fd0b399ff>`__)

   -  L2

      -  Add per bridge domain learn limit
         (`5f93e3b7f <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=5f93e3b7f>`__)
      -  Separating scan-delay and learn-limit into a separate API from
         want_l2_macs_events
         (`0f8d10035 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=0f8d10035>`__)

   -  Session Layer

      -  Basic support for interrupt mode
         (`7da8829d8 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=7da8829d8>`__)
      -  Api to update connection attributes
         (`04ae8273f <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=04ae8273f>`__)

   -  TLS and TLS engine plugins

      -  Dtls initial implementation
         (`4b47ee26c <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=4b47ee26c>`__)

   -  Vhost User Driver

      -  Add event index for interrupt notification to driver
         (`27ba5008a <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=27ba5008a>`__)

   -  Tunnel

      -  Support copying TTL and flow label from inner to outer
         (`a91cb4590 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=a91cb4590>`__)

-  VPP Comms Library

   -  Extended connect/listen configuration
      (`4ac258497 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=4ac258497>`__)

-  Libmemif

   -  Set next free buffer
      (`47e68de22 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=47e68de22>`__)
   -  Set data offset for memif buffer
      (`1421748e3 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=1421748e3>`__)

Known issues
------------

Coverity Issues
~~~~~~~~~~~~~~~

Starting with this release, we add the section about the section with
the unresolved Coverity Issues into the Release Notes. In order to view
the issues, visit https://scan.coverity.com/, add yourself to fd.io VPP
project and click on the matching IDs.

Plugin - PPPoE:
^^^^^^^^^^^^^^^

-  BUG 218437 in function: pppoe_input_node_fn, file:
   /src/plugins/pppoe/pppoe_decap.c
-  BUG 218401 in function: pppoe_input_node_fn, file:
   /src/plugins/pppoe/pppoe_decap.c #### VNET - IP6 Neighbor Discovery:
-  BUG 218382 in function: set_ip6_nd_proxy_cmd, file:
   /src/vnet/ip6-nd/ip6_nd_proxy.c #### Plugin - TCP MSS Clamping:
-  BUG 219550 in function: vl_api_mss_clamp_enable_disable_t_handler,
   file: /src/plugins/mss_clamp/mss_clamp_api.c #### Plugin -
   performance counter:
-  BUG 216295 in function: format_text_cell, file:
   /src/plugins/perfmon/table.c
-  BUG 218459 in function: intel_uncore_init, file:
   /src/plugins/perfmon/intel/uncore.c
-  BUG 216249 in function: perfmon_reset, file:
   /src/plugins/perfmon/perfmon.c #### Plugin - DPDK:
-  BUG 220290 in function: dpdk_lib_init, file:
   /src/plugins/dpdk/device/init.c
-  BUG 220289 in function: dpdk_lib_init, file:
   /src/plugins/dpdk/device/init.c
-  BUG 220105 in function: cryptodev_get_common_capabilities, file:
   /src/plugins/dpdk/cryptodev/cryptodev.c #### VNET IPv4 LPM:
-  BUG 216981 in function: icmp_to_icmp6, file:
   /src/vnet/ip/ip4_to_ip6.h
-  BUG 214755 in function: ip_in_out_acl_inline, file:
   /src/vnet/ip/ip_in_out_acl.c
-  BUG 220099 in function: vl_api_ip_route_lookup_v2_t_handler, file:
   /src/vnet/ip/ip_api.c #### Plugin - Unit Tests:
-  BUG 218446 in function: test_crypto_perf, file:
   /src/plugins/unittest/crypto_test.c #### Plugin - NSH:
-  BUG 218432 in function: nsh_add_del_entry, file:
   /src/plugins/nsh/nsh_api.c #### Vector Library - PCI:
-  BUG 218391 in function: vlib_pci_device_open, file:
   /src/vlib/linux/pci.c
-  BUG 218396 in function: linux_pci_init, file: /src/vlib/linux/pci.c
   #### VNET Segment Routing (IPv6 and MPLS):
-  BUG 218375 in function: sr_policy_del, file:
   /src/vnet/srv6/sr_policy_rewrite.c
-  BUG 218409 in function: sr_steering_policy, file:
   /src/vnet/srv6/sr_steering.c
-  BUG 218427 in function: sr_policy_mod, file:
   /src/vnet/srv6/sr_policy_rewrite.c
-  BUG 180995 in function: sr_mpls_policy_assign_endpoint_color, file:
   /src/vnet/srmpls/sr_mpls_policy.c #### Vector Library:
-  BUG 218552 in function: add_sub_command, file: /src/vlib/cli.c ####
   VNET FIB:
-  BUG 216057 in function: fib_sas6_get, file: /src/vnet/fib/fib_sas.c
   #### VNET Ethernet:
-  BUG 214973 in function: ethernet_input_inline, file:
   /src/vnet/ethernet/node.c
-  BUG 218549 in function: identify_subint, file:
   /src/vnet/ethernet/node.c #### Infrastructure Library:
-  BUG 236112 in function: extract_bits, file: /src/vppinfra/clib.h ####
   Binary API Compiler for C and C++:
-  BUG 236138 in function: test_loopbacks_2, file:
   /src/vpp-api/vapi/vapi_cpp_test.cpp
-  BUG 236140 in function: test_loopbacks_1, file:
   /src/vpp-api/vapi/vapi_cpp_test.cpp
-  BUG 236139 in function: Create_loopback_cb, file:
   /src/vpp-api/vapi/vapi_cpp_test.cpp
-  BUG 236136 in function: test_api_strings, file:
   /src/vpp-api/vapi/vapi_c_test.c
-  BUG 236137 in function: Delete_loopback_cb, file:
   /src/vpp-api/vapi/vapi_cpp_test.cpp #### Plugin - IPv6 Segment
   Routing Masquerading Proxy:
-  BUG 218441 in function: srv6_am_localsid_removal_fn, file:
   /src/plugins/srv6-am/am.c #### VNET Policer:
-  BUG 218398 in function: show_policer_command_fn, file:
   /src/vnet/policer/policer.c #### Plugin - DHCP:
-  BUG 218381 in function: dhcpv6_proxy_to_client_input, file:
   /src/plugins/dhcp/dhcp6_proxy_node.c #### Plugin - IOAM:
-  BUG 216232 in function: ioam_cache_ts_table_destroy, file:
   /src/plugins/ioam/ip6/ioam_cache.h #### VNET IPv6 LPM:
-  BUG 216981 in function: icmp_to_icmp6, file:
   /src/vnet/ip/ip4_to_ip6.h
-  BUG 214755 in function: ip_in_out_acl_inline, file:
   /src/vnet/ip/ip_in_out_acl.c
-  BUG 220099 in function: vl_api_ip_route_lookup_v2_t_handler, file:
   /src/vnet/ip/ip_api.c

Jira Issues
~~~~~~~~~~~

For the full list of issues please refer to fd.io
`JIRA <https://jira.fd.io>`__.

Fixed issues
------------

For the full list of fixed issues please refer to:

- fd.io `JIRA <https://jira.fd.io>`__
- git `commit log <https://git.fd.io/vpp/log/?h=stable/2106>`__


API changes
-----------

Description of results:

-  *Definition changed*: indicates that the API file was modified
   between releases.
-  *Only in image*: indicates the API is new for this release.
-  *Only in file*: indicates the API has been removed in this release.
-  *Message CRC32 fix*: please refer to release highlights for
   description.

=============================================== ==================
Message Name                                    Result
=============================================== ==================
abf_policy_add_del                              message CRC32 fix
abf_policy_details                              message CRC32 fix
acl_add_replace                                 message CRC32 fix
acl_details                                     message CRC32 fix
af_xdp_create                                   definition changed
arping                                          only in image
arping_reply                                    only in image
bd_ip_mac_add_del                               message CRC32 fix
bd_ip_mac_details                               message CRC32 fix
bfd_udp_add                                     message CRC32 fix
bfd_udp_auth_activate                           message CRC32 fix
bfd_udp_auth_deactivate                         message CRC32 fix
bfd_udp_del                                     message CRC32 fix
bfd_udp_get_echo_source_reply                   message CRC32 fix
bfd_udp_mod                                     message CRC32 fix
bfd_udp_session_details                         message CRC32 fix
bfd_udp_session_event                           only in image
bfd_udp_session_set_flags                       message CRC32 fix
bier_disp_entry_add_del                         message CRC32 fix
bier_disp_entry_details                         message CRC32 fix
bier_route_add_del                              message CRC32 fix
bier_route_details                              message CRC32 fix
bond_create                                     message CRC32 fix
bond_enslave                                    message CRC32 fix
bridge_domain_details                           message CRC32 fix
bridge_domain_set_default_learn_limit           only in image
bridge_domain_set_default_learn_limit_reply     only in image
bridge_domain_set_learn_limit                   only in image
bridge_domain_set_learn_limit_reply             only in image
cnat_add_del_snat_prefix                        only in file
cnat_add_del_snat_prefix_reply                  only in file
cnat_session_details                            definition changed
cnat_set_snat_policy                            only in image
cnat_set_snat_policy_reply                      only in image
cnat_snat_policy_add_del_exclude_pfx            only in image
cnat_snat_policy_add_del_exclude_pfx_reply      only in image
cnat_snat_policy_add_del_if                     only in image
cnat_snat_policy_add_del_if_reply               only in image
cnat_translation_details                        definition changed
cnat_translation_update                         definition changed
cop_interface_enable_disable                    only in file
cop_interface_enable_disable_reply              only in file
cop_whitelist_enable_disable                    only in file
cop_whitelist_enable_disable_reply              only in file
create_subif                                    message CRC32 fix
create_vhost_user_if_v2                         only in image
create_vhost_user_if_v2_reply                   only in image
dhcp6_pd_reply_event                            message CRC32 fix
dhcp6_pd_send_client_message                    message CRC32 fix
dhcp6_reply_event                               message CRC32 fix
dhcp6_send_client_message                       message CRC32 fix
dhcp_client_config                              message CRC32 fix
dhcp_client_details                             message CRC32 fix
dhcp_compl_event                                message CRC32 fix
dhcp_proxy_config                               message CRC32 fix
dhcp_proxy_details                              message CRC32 fix
dslite_add_del_pool_addr_range                  message CRC32 fix
dslite_get_aftr_addr_reply                      message CRC32 fix
dslite_get_b4_addr_reply                        message CRC32 fix
dslite_set_aftr_addr                            message CRC32 fix
dslite_set_b4_addr                              message CRC32 fix
fib_source_add                                  only in image
fib_source_add_reply                            only in image
fib_source_details                              only in image
fib_source_dump                                 only in image
flow_add                                        definition changed
gbp_bridge_domain_add                           message CRC32 fix
gbp_bridge_domain_details                       message CRC32 fix
gbp_contract_add_del                            message CRC32 fix
gbp_contract_details                            message CRC32 fix
gbp_endpoint_add                                message CRC32 fix
gbp_endpoint_details                            message CRC32 fix
gbp_endpoint_group_add                          message CRC32 fix
gbp_endpoint_group_details                      message CRC32 fix
gbp_ext_itf_add_del                             message CRC32 fix
gbp_ext_itf_details                             message CRC32 fix
gbp_route_domain_add                            message CRC32 fix
gbp_route_domain_details                        message CRC32 fix
gbp_subnet_add_del                              message CRC32 fix
gbp_subnet_details                              message CRC32 fix
geneve_add_del_tunnel                           message CRC32 fix
geneve_tunnel_details                           message CRC32 fix
gpe_add_del_fwd_entry                           message CRC32 fix
gpe_add_del_native_fwd_rpath                    message CRC32 fix
gpe_fwd_entries_get_reply                       message CRC32 fix
gpe_fwd_entry_path_details                      message CRC32 fix
gpe_native_fwd_rpaths_get_reply                 message CRC32 fix
gre_tunnel_add_del                              message CRC32 fix
gre_tunnel_details                              message CRC32 fix
gtpu_add_del_tunnel                             message CRC32 fix
gtpu_tunnel_details                             message CRC32 fix
gtpu_tunnel_update_tteid                        message CRC32 fix
igmp_details                                    message CRC32 fix
igmp_event                                      message CRC32 fix
igmp_group_prefix_details                       message CRC32 fix
igmp_group_prefix_set                           message CRC32 fix
igmp_listen                                     message CRC32 fix
ikev2_sa_details                                definition changed
ikev2_set_responder_hostname                    only in image
ikev2_set_responder_hostname_reply              only in image
ioam_export_ip6_enable_disable                  message CRC32 fix
ip6_add_del_address_using_prefix                message CRC32 fix
ip6_ra_event                                    message CRC32 fix
ip6nd_proxy_add_del                             message CRC32 fix
ip6nd_proxy_details                             message CRC32 fix
ip_address_details                              message CRC32 fix
ip_container_proxy_add_del                      message CRC32 fix
ip_container_proxy_details                      message CRC32 fix
ip_neighbor_add_del                             message CRC32 fix
ip_neighbor_details                             message CRC32 fix
ip_neighbor_dump                                message CRC32 fix
ip_neighbor_event                               message CRC32 fix
ip_path_mtu_details                             only in image
ip_path_mtu_get                                 only in image
ip_path_mtu_get_reply                           only in image
ip_path_mtu_replace_begin                       only in image
ip_path_mtu_replace_begin_reply                 only in image
ip_path_mtu_replace_end                         only in image
ip_path_mtu_replace_end_reply                   only in image
ip_path_mtu_update                              only in image
ip_path_mtu_update_reply                        only in image
ip_punt_redirect                                message CRC32 fix
ip_punt_redirect_details                        message CRC32 fix
ip_reassembly_enable_disable                    message CRC32 fix
ip_route_add_del                                message CRC32 fix
ip_route_add_del_v2                             only in image
ip_route_add_del_v2_reply                       only in image
ip_route_details                                message CRC32 fix
ip_route_lookup                                 message CRC32 fix
ip_route_lookup_reply                           message CRC32 fix
ip_route_lookup_v2                              only in image
ip_route_lookup_v2_reply                        only in image
ip_route_v2_details                             only in image
ip_route_v2_dump                                only in image
ip_source_and_port_range_check_add_del          message CRC32 fix
ip_unnumbered_details                           message CRC32 fix
ipfix_exporter_details                          message CRC32 fix
ipip_6rd_add_tunnel                             message CRC32 fix
ipip_add_tunnel                                 message CRC32 fix
ipip_tunnel_details                             message CRC32 fix
ipsec_sa_details                                message CRC32 fix
ipsec_sa_v3_details                             only in image
ipsec_sa_v3_dump                                only in image
ipsec_sad_entry_add_del                         message CRC32 fix
ipsec_sad_entry_add_del_v3                      only in image
ipsec_sad_entry_add_del_v3_reply                only in image
ipsec_spd_details                               message CRC32 fix
ipsec_spd_entry_add_del                         message CRC32 fix
ipsec_tunnel_if_add_del                         only in file
ipsec_tunnel_if_add_del_reply                   only in file
ipsec_tunnel_if_set_sa                          only in file
ipsec_tunnel_if_set_sa_reply                    only in file
ipsec_tunnel_protect_del                        message CRC32 fix
ipsec_tunnel_protect_details                    message CRC32 fix
ipsec_tunnel_protect_update                     message CRC32 fix
l2_arp_term_event                               message CRC32 fix
l2_fib_table_details                            message CRC32 fix
l2_interface_pbb_tag_rewrite                    message CRC32 fix
l2_macs_event                                   message CRC32 fix
l2_patch_add_del                                message CRC32 fix
l2_xconnect_details                             message CRC32 fix
l2fib_add_del                                   message CRC32 fix
l2fib_set_scan_delay                            only in image
l2fib_set_scan_delay_reply                      only in image
l2tpv3_create_tunnel                            message CRC32 fix
l3xc_details                                    message CRC32 fix
l3xc_update                                     message CRC32 fix
lb_add_del_as                                   message CRC32 fix
lb_add_del_vip                                  message CRC32 fix
lb_as_details                                   message CRC32 fix
lb_conf                                         message CRC32 fix
lb_vip_details                                  message CRC32 fix
lb_vip_dump                                     message CRC32 fix
lisp_add_del_adjacency                          message CRC32 fix
lisp_add_del_local_eid                          message CRC32 fix
lisp_add_del_map_resolver                       message CRC32 fix
lisp_add_del_map_server                         message CRC32 fix
lisp_add_del_remote_mapping                     message CRC32 fix
lisp_adjacencies_get_reply                      message CRC32 fix
lisp_eid_table_details                          message CRC32 fix
lisp_eid_table_dump                             message CRC32 fix
lisp_locator_details                            message CRC32 fix
lisp_map_resolver_details                       message CRC32 fix
lisp_map_server_details                         message CRC32 fix
lisp_use_petr                                   message CRC32 fix
log_details                                     message CRC32 fix
macip_acl_add                                   message CRC32 fix
macip_acl_add_replace                           message CRC32 fix
macip_acl_details                               message CRC32 fix
mactime_add_del_range                           message CRC32 fix
mactime_details                                 message CRC32 fix
map_add_domain                                  message CRC32 fix
map_domain_details                              message CRC32 fix
map_param_add_del_pre_resolve                   message CRC32 fix
map_param_get_reply                             message CRC32 fix
memif_details                                   message CRC32 fix
mfib_signal_details                             message CRC32 fix
modify_vhost_user_if_v2                         only in image
modify_vhost_user_if_v2_reply                   only in image
mpls_ip_bind_unbind                             message CRC32 fix
mpls_route_add_del                              message CRC32 fix
mpls_route_details                              message CRC32 fix
mpls_tunnel_add_del                             message CRC32 fix
mpls_tunnel_details                             message CRC32 fix
mss_clamp_details                               only in image
mss_clamp_enable_disable                        only in image
mss_clamp_enable_disable_reply                  only in image
mss_clamp_get                                   only in image
mss_clamp_get_reply                             only in image
nat44_add_del_address_range                     message CRC32 fix
nat44_add_del_identity_mapping                  message CRC32 fix
nat44_add_del_interface_addr                    message CRC32 fix
nat44_add_del_lb_static_mapping                 message CRC32 fix
nat44_add_del_static_mapping                    message CRC32 fix
nat44_address_details                           message CRC32 fix
nat44_del_session                               message CRC32 fix
nat44_ed_plugin_enable_disable                  only in image
nat44_ed_plugin_enable_disable_reply            only in image
nat44_ed_set_fq_options                         only in image
nat44_ed_set_fq_options_reply                   only in image
nat44_ed_show_fq_options                        only in image
nat44_ed_show_fq_options_reply                  only in image
nat44_ei_add_del_address_range                  only in image
nat44_ei_add_del_address_range_reply            only in image
nat44_ei_add_del_identity_mapping               only in image
nat44_ei_add_del_identity_mapping_reply         only in image
nat44_ei_add_del_interface_addr                 only in image
nat44_ei_add_del_interface_addr_reply           only in image
nat44_ei_add_del_static_mapping                 only in image
nat44_ei_add_del_static_mapping_reply           only in image
nat44_ei_address_details                        only in image
nat44_ei_address_dump                           only in image
nat44_ei_del_session                            only in image
nat44_ei_del_session_reply                      only in image
nat44_ei_del_user                               only in image
nat44_ei_del_user_reply                         only in image
nat44_ei_forwarding_enable_disable              only in image
nat44_ei_forwarding_enable_disable_reply        only in image
nat44_ei_get_addr_and_port_alloc_alg            only in image
nat44_ei_get_addr_and_port_alloc_alg_reply      only in image
nat44_ei_get_mss_clamping                       only in image
nat44_ei_get_mss_clamping_reply                 only in image
nat44_ei_ha_flush                               only in image
nat44_ei_ha_flush_reply                         only in image
nat44_ei_ha_get_failover                        only in image
nat44_ei_ha_get_failover_reply                  only in image
nat44_ei_ha_get_listener                        only in image
nat44_ei_ha_get_listener_reply                  only in image
nat44_ei_ha_resync                              only in image
nat44_ei_ha_resync_completed_event              only in image
nat44_ei_ha_resync_reply                        only in image
nat44_ei_ha_set_failover                        only in image
nat44_ei_ha_set_failover_reply                  only in image
nat44_ei_ha_set_listener                        only in image
nat44_ei_ha_set_listener_reply                  only in image
nat44_ei_identity_mapping_details               only in image
nat44_ei_identity_mapping_dump                  only in image
nat44_ei_interface_add_del_feature              only in image
nat44_ei_interface_add_del_feature_reply        only in image
nat44_ei_interface_add_del_output_feature       only in image
nat44_ei_interface_add_del_output_feature_reply only in image
nat44_ei_interface_addr_details                 only in image
nat44_ei_interface_addr_dump                    only in image
nat44_ei_interface_details                      only in image
nat44_ei_interface_dump                         only in image
nat44_ei_interface_output_feature_details       only in image
nat44_ei_interface_output_feature_dump          only in image
nat44_ei_ipfix_enable_disable                   only in image
nat44_ei_ipfix_enable_disable_reply             only in image
nat44_ei_plugin_enable_disable                  only in image
nat44_ei_plugin_enable_disable_reply            only in image
nat44_ei_set_addr_and_port_alloc_alg            only in image
nat44_ei_set_addr_and_port_alloc_alg_reply      only in image
nat44_ei_set_fq_options                         only in image
nat44_ei_set_fq_options_reply                   only in image
nat44_ei_set_log_level                          only in image
nat44_ei_set_log_level_reply                    only in image
nat44_ei_set_mss_clamping                       only in image
nat44_ei_set_mss_clamping_reply                 only in image
nat44_ei_set_timeouts                           only in image
nat44_ei_set_timeouts_reply                     only in image
nat44_ei_set_workers                            only in image
nat44_ei_set_workers_reply                      only in image
nat44_ei_show_fq_options                        only in image
nat44_ei_show_fq_options_reply                  only in image
nat44_ei_show_running_config                    only in image
nat44_ei_show_running_config_reply              only in image
nat44_ei_static_mapping_details                 only in image
nat44_ei_static_mapping_dump                    only in image
nat44_ei_user_details                           only in image
nat44_ei_user_dump                              only in image
nat44_ei_user_session_details                   only in image
nat44_ei_user_session_dump                      only in image
nat44_ei_worker_details                         only in image
nat44_ei_worker_dump                            only in image
nat44_identity_mapping_details                  message CRC32 fix
nat44_interface_addr_details                    message CRC32 fix
nat44_lb_static_mapping_add_del_local           message CRC32 fix
nat44_lb_static_mapping_details                 message CRC32 fix
nat44_static_mapping_details                    message CRC32 fix
nat44_user_session_details                      message CRC32 fix
nat64_add_del_pool_addr_range                   message CRC32 fix
nat64_add_del_static_bib                        message CRC32 fix
nat64_bib_details                               message CRC32 fix
nat64_st_details                                message CRC32 fix
nat66_add_del_static_mapping                    message CRC32 fix
nat66_plugin_enable_disable                     only in image
nat66_plugin_enable_disable_reply               only in image
nat66_static_mapping_details                    message CRC32 fix
nat_det_add_del_map                             message CRC32 fix
nat_det_close_session_in                        message CRC32 fix
nat_det_close_session_out                       message CRC32 fix
nat_det_map_details                             message CRC32 fix
nsh_add_del_map                                 message CRC32 fix
nsh_map_details                                 message CRC32 fix
nsim_cross_connect_enable_disable               message CRC32 fix
one_add_del_adjacency                           message CRC32 fix
one_add_del_l2_arp_entry                        message CRC32 fix
one_add_del_local_eid                           message CRC32 fix
one_add_del_map_resolver                        message CRC32 fix
one_add_del_map_server                          message CRC32 fix
one_add_del_ndp_entry                           message CRC32 fix
one_add_del_remote_mapping                      message CRC32 fix
one_adjacencies_get_reply                       message CRC32 fix
one_eid_table_details                           message CRC32 fix
one_eid_table_dump                              message CRC32 fix
one_l2_arp_entries_get_reply                    message CRC32 fix
one_locator_details                             message CRC32 fix
one_map_resolver_details                        message CRC32 fix
one_map_server_details                          message CRC32 fix
one_ndp_entries_get_reply                       message CRC32 fix
one_stats_details                               message CRC32 fix
one_use_petr                                    message CRC32 fix
p2p_ethernet_add                                message CRC32 fix
p2p_ethernet_del                                message CRC32 fix
pipe_create_reply                               message CRC32 fix
pipe_details                                    message CRC32 fix
pnat_binding_add                                only in image
pnat_binding_add_reply                          only in image
pnat_binding_attach                             only in image
pnat_binding_attach_reply                       only in image
pnat_binding_del                                only in image
pnat_binding_del_reply                          only in image
pnat_binding_detach                             only in image
pnat_binding_detach_reply                       only in image
pnat_bindings_details                           only in image
pnat_bindings_get                               only in image
pnat_bindings_get_reply                         only in image
pnat_interfaces_details                         only in image
pnat_interfaces_get                             only in image
pnat_interfaces_get_reply                       only in image
policer_add_del                                 message CRC32 fix
policer_bind                                    only in image
policer_bind_reply                              only in image
policer_details                                 message CRC32 fix
policer_input                                   only in image
policer_input_reply                             only in image
pppoe_add_del_session                           message CRC32 fix
pppoe_session_details                           message CRC32 fix
proxy_arp_add_del                               message CRC32 fix
proxy_arp_details                               message CRC32 fix
punt_socket_deregister                          message CRC32 fix
punt_socket_details                             message CRC32 fix
punt_socket_register                            message CRC32 fix
qos_record_details                              message CRC32 fix
qos_record_enable_disable                       message CRC32 fix
qos_store_details                               message CRC32 fix
qos_store_enable_disable                        message CRC32 fix
rdma_create_v3                                  only in image
rdma_create_v3_reply                            only in image
session_rule_add_del                            message CRC32 fix
session_rules_details                           message CRC32 fix
set_ip_flow_hash_router_id                      only in image
set_ip_flow_hash_router_id_reply                only in image
set_ip_flow_hash_v2                             only in image
set_ip_flow_hash_v2_reply                       only in image
set_ipfix_exporter                              message CRC32 fix
set_punt                                        message CRC32 fix
show_lisp_use_petr_reply                        message CRC32 fix
show_one_use_petr_reply                         message CRC32 fix
sr_localsid_add_del                             message CRC32 fix
sr_localsids_details                            message CRC32 fix
sr_mpls_policy_assign_endpoint_color            message CRC32 fix
sr_mpls_steering_add_del                        message CRC32 fix
sr_policies_details                             message CRC32 fix
sr_policy_add                                   message CRC32 fix
sr_policy_mod                                   message CRC32 fix
sr_steering_add_del                             message CRC32 fix
sr_steering_pol_details                         message CRC32 fix
stn_add_del_rule                                message CRC32 fix
stn_rules_details                               message CRC32 fix
svs_details                                     message CRC32 fix
svs_route_add_del                               message CRC32 fix
sw_if_l2tpv3_tunnel_details                     message CRC32 fix
sw_interface_add_del_address                    message CRC32 fix
sw_interface_bond_details                       message CRC32 fix
sw_interface_details                            message CRC32 fix
sw_interface_event                              message CRC32 fix
sw_interface_ip6_get_link_local_address         only in image
sw_interface_ip6_get_link_local_address_reply   only in image
sw_interface_ip6_set_link_local_address         message CRC32 fix
sw_interface_ip6nd_ra_prefix                    message CRC32 fix
sw_interface_lacp_details                       message CRC32 fix
sw_interface_rx_placement_details               message CRC32 fix
sw_interface_set_flags                          message CRC32 fix
sw_interface_set_l2_bridge                      message CRC32 fix
sw_interface_set_l2_xconnect                    message CRC32 fix
sw_interface_set_lldp                           message CRC32 fix
sw_interface_set_mac_address                    message CRC32 fix
sw_interface_set_promisc                        only in image
sw_interface_set_promisc_reply                  only in image
sw_interface_set_rx_mode                        message CRC32 fix
sw_interface_set_unnumbered                     message CRC32 fix
sw_interface_span_details                       message CRC32 fix
sw_interface_span_enable_disable                message CRC32 fix
sw_interface_tap_v2_details                     message CRC32 fix
sw_interface_vhost_user_details                 message CRC32 fix
sw_interface_virtio_pci_details                 message CRC32 fix
syslog_get_sender_reply                         message CRC32 fix
syslog_set_sender                               message CRC32 fix
tap_create_v2                                   message CRC32 fix
tcp_configure_src_addresses                     message CRC32 fix
teib_details                                    message CRC32 fix
teib_entry_add_del                              message CRC32 fix
udp_encap_add                                   message CRC32 fix
udp_encap_details                               message CRC32 fix
udp_ping_add_del                                message CRC32 fix
virtio_pci_create                               message CRC32 fix
vmxnet3_details                                 message CRC32 fix
vrrp_vr_add_del                                 message CRC32 fix
vrrp_vr_details                                 message CRC32 fix
vrrp_vr_peer_details                            message CRC32 fix
vrrp_vr_set_peers                               message CRC32 fix
vrrp_vr_track_if_add_del                        message CRC32 fix
vrrp_vr_track_if_details                        message CRC32 fix
vxlan_add_del_tunnel                            message CRC32 fix
vxlan_add_del_tunnel_v2                         only in image
vxlan_add_del_tunnel_v2_reply                   only in image
vxlan_add_del_tunnel_v3                         only in image
vxlan_add_del_tunnel_v3_reply                   only in image
vxlan_gbp_tunnel_add_del                        message CRC32 fix
vxlan_gbp_tunnel_details                        message CRC32 fix
vxlan_gpe_add_del_tunnel                        message CRC32 fix
vxlan_gpe_ioam_export_enable_disable            message CRC32 fix
vxlan_gpe_ioam_transit_disable                  message CRC32 fix
vxlan_gpe_ioam_transit_enable                   message CRC32 fix
vxlan_gpe_ioam_vni_disable                      message CRC32 fix
vxlan_gpe_ioam_vni_enable                       message CRC32 fix
vxlan_gpe_tunnel_details                        message CRC32 fix
vxlan_offload_rx                                message CRC32 fix
vxlan_tunnel_details                            message CRC32 fix
vxlan_tunnel_v2_details                         only in image
vxlan_tunnel_v2_dump                            only in image
want_ip_neighbor_events                         message CRC32 fix
want_l2_macs_events2                            only in image
want_l2_macs_events2_reply                      only in image
=============================================== ==================

Found 456 api message signature differences

Newly deprecated API messages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

These messages are still there in the API, but can and probably will
disappear in the next release.

-  application_tls_cert_add
-  application_tls_cert_add_reply
-  application_tls_key_add
-  application_tls_key_add_reply
-  create_vhost_user_if
-  create_vhost_user_if_reply
-  ipsec_sa_details
-  ipsec_sa_dump
-  ipsec_sad_entry_add_del
-  ipsec_sad_entry_add_del_reply
-  modify_vhost_user_if
-  modify_vhost_user_if_reply
-  nat44_ei_add_del_identity_mapping
-  nat44_ei_add_del_identity_mapping_reply
-  nat44_ei_add_del_interface_addr
-  nat44_ei_add_del_interface_addr_reply
-  nat44_ei_get_addr_and_port_alloc_alg
-  nat44_ei_get_addr_and_port_alloc_alg_reply
-  nat44_ei_get_mss_clamping
-  nat44_ei_get_mss_clamping_reply
-  nat44_ei_ha_get_failover
-  nat44_ei_ha_get_failover_reply
-  nat44_ei_ha_get_listener
-  nat44_ei_ha_get_listener_reply
-  nat44_ei_identity_mapping_details
-  nat44_ei_identity_mapping_dump
-  nat44_ei_interface_add_del_output_feature
-  nat44_ei_interface_add_del_output_feature_reply
-  nat44_ei_interface_addr_details
-  nat44_ei_interface_addr_dump
-  nat44_ei_interface_output_feature_details
-  nat44_ei_interface_output_feature_dump
-  nat44_ei_set_log_level
-  nat44_ei_set_log_level_reply
-  nat44_forwarding_enable_disable
-  nat44_forwarding_enable_disable_reply
-  nat44_forwarding_is_enabled
-  nat44_forwarding_is_enabled_reply
-  nat44_plugin_enable_disable
-  nat44_plugin_enable_disable_reply
-  nat44_session_cleanup
-  nat44_session_cleanup_reply
-  nat_control_ping
-  nat_control_ping_reply
-  nat_get_timeouts
-  nat_get_timeouts_reply
-  nat_ipfix_enable_disable
-  nat_ipfix_enable_disable_reply
-  nat_set_log_level
-  nat_set_log_level_reply
-  nat_set_timeouts
-  nat_set_timeouts_reply
-  nat_show_config
-  nat_show_config_2
-  nat_show_config_2_reply
-  nat_show_config_reply
-  rdma_create_v2
-  set_ip_flow_hash
-  set_ip_flow_hash_reply
-  want_l2_macs_events
-  want_l2_macs_events_reply

In-progress API messages
~~~~~~~~~~~~~~~~~~~~~~~~

These messages are provided for testing and experimentation only. They
are *not* subject to any compatibility process, and therefore can
arbitrarily change or disappear at *any* moment. Also they may have less
than satisfactory testing, making them unsuitable for other use than the
technology preview. If you are intending to use these messages in
production projects, please collaborate with the feature maintainer on
their productization.

-  abf_itf_attach_add_del
-  abf_itf_attach_add_del_reply
-  abf_itf_attach_details
-  abf_itf_attach_dump
-  abf_plugin_get_version
-  abf_plugin_get_version_reply
-  abf_policy_add_del
-  abf_policy_add_del_reply
-  abf_policy_details
-  abf_policy_dump
-  adl_allowlist_enable_disable
-  adl_allowlist_enable_disable_reply
-  adl_interface_enable_disable
-  adl_interface_enable_disable_reply
-  af_xdp_create
-  af_xdp_create_reply
-  af_xdp_delete
-  af_xdp_delete_reply
-  cnat_get_snat_addresses
-  cnat_get_snat_addresses_reply
-  cnat_session_details
-  cnat_session_dump
-  cnat_session_purge
-  cnat_session_purge_reply
-  cnat_set_snat_addresses
-  cnat_set_snat_addresses_reply
-  cnat_set_snat_policy
-  cnat_set_snat_policy_reply
-  cnat_snat_policy_add_del_exclude_pfx
-  cnat_snat_policy_add_del_exclude_pfx_reply
-  cnat_snat_policy_add_del_if
-  cnat_snat_policy_add_del_if_reply
-  cnat_translation_del
-  cnat_translation_del_reply
-  cnat_translation_details
-  cnat_translation_dump
-  cnat_translation_update
-  cnat_translation_update_reply
-  crypto_sw_scheduler_set_worker
-  crypto_sw_scheduler_set_worker_reply
-  det44_get_timeouts_reply
-  det44_interface_add_del_feature
-  det44_interface_add_del_feature_reply
-  det44_interface_details
-  det44_interface_dump
-  det44_plugin_enable_disable
-  det44_plugin_enable_disable_reply
-  det44_set_timeouts
-  det44_set_timeouts_reply
-  flow_add
-  flow_add_reply
-  flow_del
-  flow_del_reply
-  flow_disable
-  flow_disable_reply
-  flow_enable
-  flow_enable_reply
-  gbp_bridge_domain_add
-  gbp_bridge_domain_add_reply
-  gbp_bridge_domain_del
-  gbp_bridge_domain_del_reply
-  gbp_bridge_domain_details
-  gbp_bridge_domain_dump
-  gbp_bridge_domain_dump_reply
-  gbp_contract_add_del
-  gbp_contract_add_del_reply
-  gbp_contract_details
-  gbp_contract_dump
-  gbp_endpoint_add
-  gbp_endpoint_add_reply
-  gbp_endpoint_del
-  gbp_endpoint_del_reply
-  gbp_endpoint_details
-  gbp_endpoint_dump
-  gbp_endpoint_group_add
-  gbp_endpoint_group_add_reply
-  gbp_endpoint_group_del
-  gbp_endpoint_group_del_reply
-  gbp_endpoint_group_details
-  gbp_endpoint_group_dump
-  gbp_ext_itf_add_del
-  gbp_ext_itf_add_del_reply
-  gbp_ext_itf_details
-  gbp_ext_itf_dump
-  gbp_recirc_add_del
-  gbp_recirc_add_del_reply
-  gbp_recirc_details
-  gbp_recirc_dump
-  gbp_route_domain_add
-  gbp_route_domain_add_reply
-  gbp_route_domain_del
-  gbp_route_domain_del_reply
-  gbp_route_domain_details
-  gbp_route_domain_dump
-  gbp_route_domain_dump_reply
-  gbp_subnet_add_del
-  gbp_subnet_add_del_reply
-  gbp_subnet_details
-  gbp_subnet_dump
-  gbp_vxlan_tunnel_add
-  gbp_vxlan_tunnel_add_reply
-  gbp_vxlan_tunnel_del
-  gbp_vxlan_tunnel_del_reply
-  gbp_vxlan_tunnel_details
-  gbp_vxlan_tunnel_dump
-  ikev2_child_sa_details
-  ikev2_child_sa_dump
-  ikev2_initiate_del_child_sa
-  ikev2_initiate_del_child_sa_reply
-  ikev2_initiate_del_ike_sa
-  ikev2_initiate_del_ike_sa_reply
-  ikev2_initiate_rekey_child_sa
-  ikev2_initiate_rekey_child_sa_reply
-  ikev2_initiate_sa_init
-  ikev2_initiate_sa_init_reply
-  ikev2_nonce_get
-  ikev2_nonce_get_reply
-  ikev2_profile_add_del
-  ikev2_profile_add_del_reply
-  ikev2_profile_details
-  ikev2_profile_disable_natt
-  ikev2_profile_disable_natt_reply
-  ikev2_profile_dump
-  ikev2_profile_set_auth
-  ikev2_profile_set_auth_reply
-  ikev2_profile_set_id
-  ikev2_profile_set_id_reply
-  ikev2_profile_set_ipsec_udp_port
-  ikev2_profile_set_ipsec_udp_port_reply
-  ikev2_profile_set_liveness
-  ikev2_profile_set_liveness_reply
-  ikev2_profile_set_ts
-  ikev2_profile_set_ts_reply
-  ikev2_profile_set_udp_encap
-  ikev2_profile_set_udp_encap_reply
-  ikev2_sa_details
-  ikev2_sa_dump
-  ikev2_set_esp_transforms
-  ikev2_set_esp_transforms_reply
-  ikev2_set_ike_transforms
-  ikev2_set_ike_transforms_reply
-  ikev2_set_local_key
-  ikev2_set_local_key_reply
-  ikev2_set_responder
-  ikev2_set_responder_hostname
-  ikev2_set_responder_hostname_reply
-  ikev2_set_responder_reply
-  ikev2_set_sa_lifetime
-  ikev2_set_sa_lifetime_reply
-  ikev2_set_tunnel_interface
-  ikev2_set_tunnel_interface_reply
-  ikev2_traffic_selector_details
-  ikev2_traffic_selector_dump
-  ip_route_add_del_v2
-  ip_route_add_del_v2_reply
-  ip_route_lookup_v2
-  ip_route_lookup_v2_reply
-  ip_route_v2_details
-  ip_route_v2_dump
-  l2_emulation
-  l2_emulation_reply
-  mdata_enable_disable
-  mdata_enable_disable_reply
-  nat44_add_del_static_mapping_v2
-  nat44_add_del_static_mapping_v2_reply
-  nat44_ed_plugin_enable_disable
-  nat44_ed_plugin_enable_disable_reply
-  nat44_ed_set_fq_options
-  nat44_ed_set_fq_options_reply
-  nat44_ed_show_fq_options
-  nat44_ed_show_fq_options_reply
-  nat44_ei_add_del_address_range
-  nat44_ei_add_del_address_range_reply
-  nat44_ei_add_del_static_mapping
-  nat44_ei_add_del_static_mapping_reply
-  nat44_ei_address_details
-  nat44_ei_address_dump
-  nat44_ei_del_session
-  nat44_ei_del_session_reply
-  nat44_ei_del_user
-  nat44_ei_del_user_reply
-  nat44_ei_forwarding_enable_disable
-  nat44_ei_forwarding_enable_disable_reply
-  nat44_ei_ha_flush
-  nat44_ei_ha_flush_reply
-  nat44_ei_ha_resync
-  nat44_ei_ha_resync_completed_event
-  nat44_ei_ha_resync_reply
-  nat44_ei_ha_set_failover
-  nat44_ei_ha_set_failover_reply
-  nat44_ei_ha_set_listener
-  nat44_ei_ha_set_listener_reply
-  nat44_ei_interface_add_del_feature
-  nat44_ei_interface_add_del_feature_reply
-  nat44_ei_interface_details
-  nat44_ei_interface_dump
-  nat44_ei_ipfix_enable_disable
-  nat44_ei_ipfix_enable_disable_reply
-  nat44_ei_plugin_enable_disable
-  nat44_ei_plugin_enable_disable_reply
-  nat44_ei_set_addr_and_port_alloc_alg
-  nat44_ei_set_addr_and_port_alloc_alg_reply
-  nat44_ei_set_fq_options
-  nat44_ei_set_fq_options_reply
-  nat44_ei_set_mss_clamping
-  nat44_ei_set_mss_clamping_reply
-  nat44_ei_set_timeouts
-  nat44_ei_set_timeouts_reply
-  nat44_ei_set_workers
-  nat44_ei_set_workers_reply
-  nat44_ei_show_fq_options
-  nat44_ei_show_fq_options_reply
-  nat44_ei_show_running_config
-  nat44_ei_show_running_config_reply
-  nat44_ei_static_mapping_details
-  nat44_ei_static_mapping_dump
-  nat44_ei_user_details
-  nat44_ei_user_dump
-  nat44_ei_user_session_details
-  nat44_ei_user_session_dump
-  nat44_ei_worker_details
-  nat44_ei_worker_dump
-  nat44_show_running_config
-  nat44_show_running_config_reply
-  nat64_plugin_enable_disable
-  nat64_plugin_enable_disable_reply
-  oddbuf_enable_disable
-  oddbuf_enable_disable_reply
-  pg_interface_enable_disable_coalesce
-  pg_interface_enable_disable_coalesce_reply
-  pnat_binding_add
-  pnat_binding_add_reply
-  pnat_binding_attach
-  pnat_binding_attach_reply
-  pnat_binding_del
-  pnat_binding_del_reply
-  pnat_binding_detach
-  pnat_binding_detach_reply
-  pnat_bindings_details
-  pnat_bindings_get
-  pnat_bindings_get_reply
-  pnat_interfaces_details
-  pnat_interfaces_get
-  pnat_interfaces_get_reply
-  sample_macswap_enable_disable
-  sample_macswap_enable_disable_reply
-  sr_policies_with_sl_index_details
-  sr_policies_with_sl_index_dump
-  sw_interface_set_vxlan_gbp_bypass
-  sw_interface_set_vxlan_gbp_bypass_reply
-  test_addresses
-  test_addresses2
-  test_addresses2_reply
-  test_addresses3
-  test_addresses3_reply
-  test_addresses_reply
-  test_empty
-  test_empty_reply
-  test_enum
-  test_enum_reply
-  test_interface
-  test_interface_reply
-  test_prefix
-  test_prefix_reply
-  test_string
-  test_string2
-  test_string2_reply
-  test_string_reply
-  test_vla
-  test_vla2
-  test_vla2_reply
-  test_vla3
-  test_vla3_reply
-  test_vla4
-  test_vla4_reply
-  test_vla5
-  test_vla5_reply
-  test_vla_reply
-  trace_capture_packets
-  trace_capture_packets_reply
-  trace_clear_capture
-  trace_clear_capture_reply
-  trace_details
-  trace_dump
-  trace_dump_reply
-  trace_set_filters
-  trace_set_filters_reply
-  vxlan_gbp_tunnel_add_del
-  vxlan_gbp_tunnel_add_del_reply
-  vxlan_gbp_tunnel_details
-  vxlan_gbp_tunnel_dump
-  wireguard_interface_create
-  wireguard_interface_create_reply
-  wireguard_interface_delete
-  wireguard_interface_delete_reply
-  wireguard_interface_details
-  wireguard_interface_dump
-  wireguard_peer_add
-  wireguard_peer_add_reply
-  wireguard_peer_remove
-  wireguard_peer_remove_reply
-  wireguard_peers_details
-  wireguard_peers_dump

Patches that changed API definitions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. |clk| replace:: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=

``src/vnet/policer/policer_types.api``

* `c5299ff30 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=c5299ff30>`_  policer: remove SSE2 prefix

``src/vnet/policer/policer.api``

* `b04683017 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=b04683017>`_  policer: add api to configure input policing
* `48e26367c <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=48e26367c>`_  policer: add api to bind policer to worker

``src/vnet/session/session.api``

* `a5a9efd4d <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=a5a9efd4d>`_  vcl session: switch to generic cert key apis

``src/vnet/ipfix-export/ipfix_export.api``

* `baa18701b <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=baa18701b>`_  misc: ipfix process node wait time adjustment

``src/vnet/ipsec/ipsec_types.api``

* `f16e9a550 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=f16e9a550>`_  ipsec: Support async mode per-SA
* `9ec846c26 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=9ec846c26>`_  ipsec: Use the new tunnel API types to add flow label and TTL copy support
* `751bb131e <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=751bb131e>`_  Revert "ipsec: Use the new tunnel API types to add flow label and TTL copy"
* `c7eaa711f <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=c7eaa711f>`_  ipsec: Use the new tunnel API types to add flow label and TTL copsupport

``src/vnet/ipsec/ipsec.api``

* `9ec846c26 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=9ec846c26>`_  ipsec: Use the new tunnel API types to add flow label and TTL copsupport
* `751bb131e <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=751bb131e>`_  Revert "ipsec: Use the new tunnel API types to add flow label and TTL copy"
* `c7eaa711f <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=c7eaa711f>`_  ipsec: Use the new tunnel API types to add flow label and TTL copy support
* `a9e2774f5 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=a9e2774f5>`_  ipsec: Deprecated the old IPsec Tunnel interface
* `95f59f380 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=95f59f380>`_  ipsec: Mark the interface create reply deprecated

``src/vnet/devices/virtio/vhost_user.api``

* `27ba5008a <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=27ba5008a>`_  vhost: Add event index for interrupt notification to driver

``src/vnet/ip/ip.api``

* `976b259be <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=976b259be>`_  fib: Allow the creation of new source on the API
* `8f5fef2c7 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=8f5fef2c7>`_  ip: Path MTU
* `3d5f08a82 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=3d5f08a82>`_  ip: Router ID included in flow hash
* `f2984bbb0 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=f2984bbb0>`_  ip: use IPv6 flowlabel in flow hash computation
* `58a1915b5 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=58a1915b5>`_  ip: add API to retrieve IPv6 link-layer address

``src/vnet/l2/l2.api``

* `0f8d10035 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=0f8d10035>`_  l2: Separating scan-delay and learn-limit into a separate API from want_l2_macs_events
* `5f93e3b7f <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=5f93e3b7f>`_  l2: add per bridge domain learn limit

``src/vnet/flow/flow_types.api``

* `91f102ed8 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=91f102ed8>`_  flow: The type of vni in VxLAN flow should be u32

``src/vnet/flow/flow.api``

* `c7e7819ad <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=c7e7819ad>`_  flow: Add API implementation of IP4/IP6, IP4_VXLAN/IP6_VXLAN

``src/vnet/fib/fib_types.api``

* `976b259be <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=976b259be>`_  fib: Allow the creation of new source on the API

``src/vnet/fib/fib.api``

* `976b259be <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=976b259be>`_  fib: Allow the creation of new source on the API

``src/vnet/vxlan/vxlan.api``

* `3e38422ab <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=3e38422ab>`_  vxlan: Fix L3 mode
* `839dcc0fb <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=839dcc0fb>`_  vxlan: add udp-port configuration support

``src/vnet/bfd/bfd.api``

* `4376ab2a9 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=4376ab2a9>`_  tests: use socket transport instead of shared memory

``src/vnet/interface.api``

* `fd0b399ff <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=fd0b399ff>`_  interface: Add promisc on/off in api

``src/vnet/tunnel/tunnel_types.api``

* `a91cb4590 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=a91cb4590>`_  tunnel: support copying TTL and flow label from inner to outer

``src/vnet/interface_types.api``

* `6a999d67d <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=6a999d67d>`_  interface: RX/TX direction type in API

``src/vat2/test/vat2_test.api``

* `ab9f57355 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=ab9f57355>`_  api: crchcecker ignore version < 1.0.0 and outside of src directory
* `71134f26a <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=71134f26a>`_  vat2: jsonconvert return checking - coverity
* `93c4b1bb3 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=93c4b1bb3>`_  vppapigen: more _fromjson autogeneration coverity fixes
* `316967cfa <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=316967cfa>`_  vppapigen: fix coverity issues in jsonconvert
* `cf0102b3b <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=cf0102b3b>`_  vppapigen: coverity issues in autogenerated code pass 3.
* `fb0afab7f <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=fb0afab7f>`_  vppapigen: fix fromjson coverity errors in generation

``src/plugins/gbp/gbp.api``

* `dc22c839f <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=dc22c839f>`_  tests: clean up gbp calls from vpp_papi_provider

``src/plugins/map/map.api``

* `9302cfea9 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=9302cfea9>`_  vppapigen: Support an 'autoendian' keyword for message definitions i.api files |

``src/plugins/arping/arping.api``

* `a77ae4708 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=a77ae4708>`_  arping: add arping command

``src/plugins/linux-cp/lcp.api``

* `6bb77dec7 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=6bb77dec7>`_  linux-cp: A V2 variant of pair create API that returns the hosinterface created |
* `4376ab2a9 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=4376ab2a9>`_  tests: use socket transport instead of shared memory
* `44db1caef <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=44db1caef>`_  linux-cp: Linux Interface Mirroring for Control Plane Integration

``src/plugins/ikev2/ikev2_types.api``

* `68d275356 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=68d275356>`_  ikev2: add per SA stats

``src/plugins/ikev2/ikev2.api``

* `af2cc6425 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=af2cc6425>`_  ikev2: support responder hostname
* `68d275356 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=68d275356>`_  ikev2: add per SA stats
* `fab5e7f39 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=fab5e7f39>`_  ikev2: use new counters data model & add more counters

``src/plugins/nat/det44/det44.api``

* `0eaf4e678 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=0eaf4e678>`_  nat: Final NAT44 EI/ED split patch

``src/plugins/nat/nat44-ed/nat44_ed.api``

* `e3f078fcf <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=e3f078fcf>`_  nat: fix byte order on ipfix message fields
* `e7a80a98b <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=e7a80a98b>`_  nat: NAT44ED fail if using old plugin option
* `0eaf4e678 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=0eaf4e678>`_  nat: Final NAT44 EI/ED split patch

``src/plugins/nat/nat64/nat64.api``

* `0eaf4e678 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=0eaf4e678>`_  nat: Final NAT44 EI/ED split patch

``src/plugins/nat/nat66/nat66.api``

* `ed2ee5e57 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=ed2ee5e57>`_  nat: NAT66 plugin enable&disable calls update
* `0eaf4e678 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=0eaf4e678>`_  nat: Final NAT44 EI/ED split patch

``src/plugins/nat/pnat/pnat.api``

* `ec34fb772 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=ec34fb772>`_  pnat: coverity errors
* `ab3151c52 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=ab3151c52>`_  nat: pnat copy and clear byte instructions
* `18327be5d <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=18327be5d>`_  nat: 1:1 policy NAT

``src/plugins/nat/lib/nat_types.api``

* `0eaf4e678 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=0eaf4e678>`_  nat: Final NAT44 EI/ED split patch

``src/plugins/nat/nat44-ei/nat44_ei.api``

* `01930f568 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=01930f568>`_  nat: report correct EI per-user session limit
* `e3f078fcf <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=e3f078fcf>`_  nat: fix byte order on ipfix message fields
* `0eaf4e678 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=0eaf4e678>`_  nat: Final NAT44 EI/ED split patch

``src/plugins/af_xdp/af_xdp.api``

* `a42c41be4 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=a42c41be4>`_  af_xdp: workaround kernel race between poll() and sendmsg()

``src/plugins/mss_clamp/mss_clamp.api``

* `bf55e9931 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=bf55e9931>`_  mss_clamp: TCP MSS clamping plugin

``src/plugins/rdma/rdma.api``

* `f5a45680e <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=f5a45680e>`_  rdma: add support for RSS configuration

``src/plugins/cnat/cnat.api``

* `516b0adf6 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=516b0adf6>`_  cnat: Add calico/k8s src policy
* `3fd77f7de <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=3fd77f7de>`_  cnat: Prepare extended snat policies
* `cc9a1a0d3 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=cc9a1a0d3>`_  cnat: add input feature node
* `4d237874e <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=4d237874e>`_  cnat: Add maglev support
* `27647a27c <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=27647a27c>`_  cnat: fixes & prepare maglev
/span> = self.vapi.ip_fib_dump() self.verify_not_in_route_dump(fib_dump, self.deleted_routes) class TestIPNull(VppTestCase): """ IPv4 routes via NULL """ def setUp(self): super(TestIPNull, self).setUp() # create 2 pg interfaces self.create_pg_interfaces(range(2)) for i in self.pg_interfaces: i.admin_up() i.config_ip4() i.resolve_arp() def tearDown(self): super(TestIPNull, self).tearDown() for i in self.pg_interfaces: i.unconfig_ip4() i.admin_down() def test_ip_null(self): """ IP NULL route """ # # A route via IP NULL that will reply with ICMP unreachables # ip_unreach = VppIpRoute(self, "10.0.0.1", 32, [], is_unreach=1) ip_unreach.add_vpp_config() p_unreach = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst="10.0.0.1") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) self.pg0.add_stream(p_unreach) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx = self.pg0.get_capture(1) rx = rx[0] icmp = rx[ICMP] self.assertEqual(icmptypes[icmp.type], "dest-unreach") self.assertEqual(icmpcodes[icmp.type][icmp.code], "host-unreachable") self.assertEqual(icmp.src, self.pg0.remote_ip4) self.assertEqual(icmp.dst, "10.0.0.1") # # ICMP replies are rate limited. so sit and spin. # self.sleep(1) # # A route via IP NULL that will reply with ICMP prohibited # ip_prohibit = VppIpRoute(self, "10.0.0.2", 32, [], is_prohibit=1) ip_prohibit.add_vpp_config() p_prohibit = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst="10.0.0.2") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) self.pg0.add_stream(p_prohibit) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx = self.pg0.get_capture(1) rx = rx[0] icmp = rx[ICMP] self.assertEqual(icmptypes[icmp.type], "dest-unreach") self.assertEqual(icmpcodes[icmp.type][icmp.code], "host-prohibited") self.assertEqual(icmp.src, self.pg0.remote_ip4) self.assertEqual(icmp.dst, "10.0.0.2") def test_ip_drop(self): """ IP Drop Routes """ p = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst="1.1.1.1") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) r1 = VppIpRoute(self, "1.1.1.0", 24, [VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index)]) r1.add_vpp_config() rx = self.send_and_expect(self.pg0, p * 65, self.pg1) # # insert a more specific as a drop # r2 = VppIpRoute(self, "1.1.1.1", 32, [], is_drop=1) r2.add_vpp_config() self.send_and_assert_no_replies(self.pg0, p * 65, "Drop Route") r2.remove_vpp_config() rx = self.send_and_expect(self.pg0, p * 65, self.pg1) class TestIPDisabled(VppTestCase): """ IPv4 disabled """ def setUp(self): super(TestIPDisabled, self).setUp() # create 2 pg interfaces self.create_pg_interfaces(range(2)) # PG0 is IP enalbed self.pg0.admin_up() self.pg0.config_ip4() self.pg0.resolve_arp() # PG 1 is not IP enabled self.pg1.admin_up() def tearDown(self): super(TestIPDisabled, self).tearDown() for i in self.pg_interfaces: i.unconfig_ip4() i.admin_down() def test_ip_disabled(self): """ IP Disabled """ # # An (S,G). # one accepting interface, pg0, 2 forwarding interfaces # route_232_1_1_1 = VppIpMRoute( self, "0.0.0.0", "232.1.1.1", 32, MRouteEntryFlags.MFIB_ENTRY_FLAG_NONE, [VppMRoutePath(self.pg1.sw_if_index, MRouteItfFlags.MFIB_ITF_FLAG_ACCEPT), VppMRoutePath(self.pg0.sw_if_index, MRouteItfFlags.MFIB_ITF_FLAG_FORWARD)]) route_232_1_1_1.add_vpp_config() pu = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / IP(src="10.10.10.10", dst=self.pg0.remote_ip4) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) pm = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / IP(src="10.10.10.10", dst="232.1.1.1") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) # # PG1 does not forward IP traffic # self.send_and_assert_no_replies(self.pg1, pu, "IP disabled") self.send_and_assert_no_replies(self.pg1, pm, "IP disabled") # # IP enable PG1 # self.pg1.config_ip4() # # Now we get packets through # self.pg1.add_stream(pu) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx = self.pg0.get_capture(1) self.pg1.add_stream(pm) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx = self.pg0.get_capture(1) # # Disable PG1 # self.pg1.unconfig_ip4() # # PG1 does not forward IP traffic # self.send_and_assert_no_replies(self.pg1, pu, "IP disabled") self.send_and_assert_no_replies(self.pg1, pm, "IP disabled") class TestIPSubNets(VppTestCase): """ IPv4 Subnets """ def setUp(self): super(TestIPSubNets, self).setUp() # create a 2 pg interfaces self.create_pg_interfaces(range(2)) # pg0 we will use to experiemnt self.pg0.admin_up() # pg1 is setup normally self.pg1.admin_up() self.pg1.config_ip4() self.pg1.resolve_arp() def tearDown(self): super(TestIPSubNets, self).tearDown() for i in self.pg_interfaces: i.admin_down() def test_ip_sub_nets(self): """ IP Sub Nets """ # # Configure a covering route to forward so we know # when we are dropping # cover_route = VppIpRoute(self, "10.0.0.0", 8, [VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index)]) cover_route.add_vpp_config() p = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / IP(dst="10.10.10.10", src=self.pg0.local_ip4) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) self.pg1.add_stream(p) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx = self.pg1.get_capture(1) # # Configure some non-/24 subnets on an IP interface # ip_addr_n = socket.inet_pton(socket.AF_INET, "10.10.10.10") self.vapi.sw_interface_add_del_address(self.pg0.sw_if_index, ip_addr_n, 16) pn = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / IP(dst="10.10.0.0", src=self.pg0.local_ip4) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) pb = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / IP(dst="10.10.255.255", src=self.pg0.local_ip4) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) self.send_and_assert_no_replies(self.pg1, pn, "IP Network address") self.send_and_assert_no_replies(self.pg1, pb, "IP Broadcast address") # remove the sub-net and we are forwarding via the cover again self.vapi.sw_interface_add_del_address(self.pg0.sw_if_index, ip_addr_n, 16, is_add=0) self.pg1.add_stream(pn) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx = self.pg1.get_capture(1) self.pg1.add_stream(pb) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx = self.pg1.get_capture(1) # # A /31 is a special case where the 'other-side' is an attached host # packets to that peer generate ARP requests # ip_addr_n = socket.inet_pton(socket.AF_INET, "10.10.10.10") self.vapi.sw_interface_add_del_address(self.pg0.sw_if_index, ip_addr_n, 31) pn = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / IP(dst="10.10.10.11", src=self.pg0.local_ip4) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) self.pg1.add_stream(pn) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx = self.pg0.get_capture(1) rx[ARP] # remove the sub-net and we are forwarding via the cover again self.vapi.sw_interface_add_del_address(self.pg0.sw_if_index, ip_addr_n, 31, is_add=0) self.pg1.add_stream(pn) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx = self.pg1.get_capture(1) class TestIPLoadBalance(VppTestCase): """ IPv4 Load-Balancing """ def setUp(self): super(TestIPLoadBalance, self).setUp() self.create_pg_interfaces(range(5)) mpls_tbl = VppMplsTable(self, 0) mpls_tbl.add_vpp_config() for i in self.pg_interfaces: i.admin_up() i.config_ip4() i.resolve_arp() i.enable_mpls() def tearDown(self): for i in self.pg_interfaces: i.disable_mpls() i.unconfig_ip4() i.admin_down() super(TestIPLoadBalance, self).tearDown() def send_and_expect_load_balancing(self, input, pkts, outputs): input.add_stream(pkts) self.pg_enable_capture(self.pg_interfaces) self.pg_start() for oo in outputs: rx = oo._get_capture(1) self.assertNotEqual(0, len(rx)) def send_and_expect_one_itf(self, input, pkts, itf): input.add_stream(pkts) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx = itf.get_capture(len(pkts)) def test_ip_load_balance(self): """ IP Load-Balancing """ # # An array of packets that differ only in the destination port # port_ip_pkts = [] port_mpls_pkts = [] # # An array of packets that differ only in the source address # src_ip_pkts = [] src_mpls_pkts = [] for ii in range(65): port_ip_hdr = (IP(dst="10.0.0.1", src="20.0.0.1") / UDP(sport=1234, dport=1234 + ii) / Raw('\xa5' * 100)) port_ip_pkts.append((Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / port_ip_hdr)) port_mpls_pkts.append((Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / MPLS(label=66, ttl=2) / port_ip_hdr)) src_ip_hdr = (IP(dst="10.0.0.1", src="20.0.0.%d" % ii) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) src_ip_pkts.append((Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / src_ip_hdr)) src_mpls_pkts.append((Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / MPLS(label=66, ttl=2) / src_ip_hdr)) route_10_0_0_1 = VppIpRoute(self, "10.0.0.1", 32, [VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index), VppRoutePath(self.pg2.remote_ip4, self.pg2.sw_if_index)]) route_10_0_0_1.add_vpp_config() binding = VppMplsIpBind(self, 66, "10.0.0.1", 32) binding.add_vpp_config() # # inject the packet on pg0 - expect load-balancing across the 2 paths # - since the default hash config is to use IP src,dst and port # src,dst # We are not going to ensure equal amounts of packets across each link, # since the hash algorithm is statistical and therefore this can never # be guaranteed. But wuth 64 different packets we do expect some # balancing. So instead just ensure there is traffic on each link. # self.send_and_expect_load_balancing(self.pg0, port_ip_pkts, [self.pg1, self.pg2]) self.send_and_expect_load_balancing(self.pg0, src_ip_pkts, [self.pg1, self.pg2]) self.send_and_expect_load_balancing(self.pg0, port_mpls_pkts, [self.pg1, self.pg2]) self.send_and_expect_load_balancing(self.pg0, src_mpls_pkts, [self.pg1, self.pg2]) # # change the flow hash config so it's only IP src,dst # - now only the stream with differing source address will # load-balance # self.vapi.set_ip_flow_hash(0, src=1, dst=1, sport=0, dport=0) self.send_and_expect_load_balancing(self.pg0, src_ip_pkts, [self.pg1, self.pg2]) self.send_and_expect_load_balancing(self.pg0, src_mpls_pkts, [self.pg1, self.pg2]) self.send_and_expect_one_itf(self.pg0, port_ip_pkts, self.pg2) # # change the flow hash config back to defaults # self.vapi.set_ip_flow_hash(0, src=1, dst=1, sport=1, dport=1) # # Recursive prefixes # - testing that 2 stages of load-balancing occurs and there is no # polarisation (i.e. only 2 of 4 paths are used) # port_pkts = [] src_pkts = [] for ii in range(257): port_pkts.append((Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(dst="1.1.1.1", src="20.0.0.1") / UDP(sport=1234, dport=1234 + ii) / Raw('\xa5' * 100))) src_pkts.append((Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(dst="1.1.1.1", src="20.0.0.%d" % ii) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100))) route_10_0_0_2 = VppIpRoute(self, "10.0.0.2", 32, [VppRoutePath(self.pg3.remote_ip4, self.pg3.sw_if_index), VppRoutePath(self.pg4.remote_ip4, self.pg4.sw_if_index)]) route_10_0_0_2.add_vpp_config() route_1_1_1_1 = VppIpRoute(self, "1.1.1.1", 32, [VppRoutePath("10.0.0.2", 0xffffffff), VppRoutePath("10.0.0.1", 0xffffffff)]) route_1_1_1_1.add_vpp_config() # # inject the packet on pg0 - expect load-balancing across all 4 paths # self.vapi.cli("clear trace") self.send_and_expect_load_balancing(self.pg0, port_pkts, [self.pg1, self.pg2, self.pg3, self.pg4]) self.send_and_expect_load_balancing(self.pg0, src_pkts, [self.pg1, self.pg2, self.pg3, self.pg4]) # # Recursive prefixes # - testing that 2 stages of load-balancing, no choices # port_pkts = [] for ii in range(257): port_pkts.append((Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(dst="1.1.1.2", src="20.0.0.2") / UDP(sport=1234, dport=1234 + ii) / Raw('\xa5' * 100))) route_10_0_0_3 = VppIpRoute(self, "10.0.0.3", 32, [VppRoutePath(self.pg3.remote_ip4, self.pg3.sw_if_index)]) route_10_0_0_3.add_vpp_config() route_1_1_1_2 = VppIpRoute(self, "1.1.1.2", 32, [VppRoutePath("10.0.0.3", 0xffffffff)]) route_1_1_1_2.add_vpp_config() # # inject the packet on pg0 - expect load-balancing across all 4 paths # self.vapi.cli("clear trace") self.send_and_expect_one_itf(self.pg0, port_pkts, self.pg3) class TestIPVlan0(VppTestCase): """ IPv4 VLAN-0 """ def setUp(self): super(TestIPVlan0, self).setUp() self.create_pg_interfaces(range(2)) mpls_tbl = VppMplsTable(self, 0) mpls_tbl.add_vpp_config() for i in self.pg_interfaces: i.admin_up() i.config_ip4() i.resolve_arp() i.enable_mpls() def tearDown(self): for i in self.pg_interfaces: i.disable_mpls() i.unconfig_ip4() i.admin_down() super(TestIPVlan0, self).tearDown() def test_ip_vlan_0(self): """ IP VLAN-0 """ pkts = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / Dot1Q(vlan=0) / IP(dst=self.pg1.remote_ip4, src=self.pg0.remote_ip4) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) * 65 # # Expect that packets sent on VLAN-0 are forwarded on the # main interface. # self.send_and_expect(self.pg0, pkts, self.pg1) class TestIPPunt(VppTestCase): """ IPv4 Punt Police/Redirect """ def setUp(self): super(TestIPPunt, self).setUp() self.create_pg_interfaces(range(4)) for i in self.pg_interfaces: i.admin_up() i.config_ip4() i.resolve_arp() def tearDown(self): super(TestIPPunt, self).tearDown() for i in self.pg_interfaces: i.unconfig_ip4() i.admin_down() def test_ip_punt(self): """ IP punt police and redirect """ p = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg0.local_ip4) / TCP(sport=1234, dport=1234) / Raw('\xa5' * 100)) pkts = p * 1025 # # Configure a punt redirect via pg1. # nh_addr = VppIpAddress(self.pg1.remote_ip4).encode() self.vapi.ip_punt_redirect(self.pg0.sw_if_index, self.pg1.sw_if_index, nh_addr) self.send_and_expect(self.pg0, pkts, self.pg1) # # add a policer # policer = self.vapi.policer_add_del("ip4-punt", 400, 0, 10, 0, rate_type=1) self.vapi.ip_punt_police(policer.policer_index) self.vapi.cli("clear trace") self.pg0.add_stream(pkts) self.pg_enable_capture(self.pg_interfaces) self.pg_start() # # the number of packet recieved should be greater than 0, # but not equal to the number sent, since some were policed # rx = self.pg1._get_capture(1) self.assertGreater(len(rx), 0) self.assertLess(len(rx), len(pkts)) # # remove the poilcer. back to full rx # self.vapi.ip_punt_police(policer.policer_index, is_add=0) self.vapi.policer_add_del("ip4-punt", 400, 0, 10, 0, rate_type=1, is_add=0) self.send_and_expect(self.pg0, pkts, self.pg1) # # remove the redirect. expect full drop. # self.vapi.ip_punt_redirect(self.pg0.sw_if_index, self.pg1.sw_if_index, nh_addr, is_add=0) self.send_and_assert_no_replies(self.pg0, pkts, "IP no punt config") # # Add a redirect that is not input port selective # self.vapi.ip_punt_redirect(0xffffffff, self.pg1.sw_if_index, nh_addr) self.send_and_expect(self.pg0, pkts, self.pg1) self.vapi.ip_punt_redirect(0xffffffff, self.pg1.sw_if_index, nh_addr, is_add=0) def test_ip_punt_dump(self): """ IP4 punt redirect dump""" # # Configure a punt redirects # nh_address = VppIpAddress(self.pg3.remote_ip4).encode() self.vapi.ip_punt_redirect(self.pg0.sw_if_index, self.pg3.sw_if_index, nh_address) self.vapi.ip_punt_redirect(self.pg1.sw_if_index, self.pg3.sw_if_index, nh_address) self.vapi.ip_punt_redirect(self.pg2.sw_if_index, self.pg3.sw_if_index, VppIpAddress('0.0.0.0').encode()) # # Dump pg0 punt redirects # punts = self.vapi.ip_punt_redirect_dump(self.pg0.sw_if_index) for p in punts: self.assertEqual(p.punt.rx_sw_if_index, self.pg0.sw_if_index) # # Dump punt redirects for all interfaces # punts = self.vapi.ip_punt_redirect_dump(0xffffffff) self.assertEqual(len(punts), 3) for p in punts: self.assertEqual(p.punt.tx_sw_if_index, self.pg3.sw_if_index) self.assertNotEqual(punts[1].punt.nh.un.ip4, self.pg3.remote_ip4) self.assertEqual(punts[2].punt.nh.un.ip4, '\x00'*4) class TestIPDeag(VppTestCase): """ IPv4 Deaggregate Routes """ def setUp(self): super(TestIPDeag, self).setUp() self.create_pg_interfaces(range(3)) for i in self.pg_interfaces: i.admin_up() i.config_ip4() i.resolve_arp() def tearDown(self): super(TestIPDeag, self).tearDown() for i in self.pg_interfaces: i.unconfig_ip4() i.admin_down() def test_ip_deag(self): """ IP Deag Routes """ # # Create a table to be used for: # 1 - another destination address lookup # 2 - a source address lookup # table_dst = VppIpTable(self, 1) table_src = VppIpTable(self, 2) table_dst.add_vpp_config() table_src.add_vpp_config() # # Add a route in the default table to point to a deag/ # second lookup in each of these tables # route_to_dst = VppIpRoute(self, "1.1.1.1", 32, [VppRoutePath("0.0.0.0", 0xffffffff, nh_table_id=1)]) route_to_src = VppIpRoute(self, "1.1.1.2", 32, [VppRoutePath("0.0.0.0", 0xffffffff, nh_table_id=2, is_source_lookup=1)]) route_to_dst.add_vpp_config() route_to_src.add_vpp_config() # # packets to these destination are dropped, since they'll # hit the respective default routes in the second table # p_dst = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src="5.5.5.5", dst="1.1.1.1") / TCP(sport=1234, dport=1234) / Raw('\xa5' * 100)) p_src = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src="2.2.2.2", dst="1.1.1.2") / TCP(sport=1234, dport=1234) / Raw('\xa5' * 100)) pkts_dst = p_dst * 257 pkts_src = p_src * 257 self.send_and_assert_no_replies(self.pg0, pkts_dst, "IP in dst table") self.send_and_assert_no_replies(self.pg0, pkts_src, "IP in src table") # # add a route in the dst table to forward via pg1 # route_in_dst = VppIpRoute(self, "1.1.1.1", 32, [VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index)], table_id=1) route_in_dst.add_vpp_config() self.send_and_expect(self.pg0, pkts_dst, self.pg1) # # add a route in the src table to forward via pg2 # route_in_src = VppIpRoute(self, "2.2.2.2", 32, [VppRoutePath(self.pg2.remote_ip4, self.pg2.sw_if_index)], table_id=2) route_in_src.add_vpp_config() self.send_and_expect(self.pg0, pkts_src, self.pg2) # # loop in the lookup DP # route_loop = VppIpRoute(self, "2.2.2.3", 32, [VppRoutePath("0.0.0.0", 0xffffffff, nh_table_id=0)]) route_loop.add_vpp_config() p_l = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src="2.2.2.4", dst="2.2.2.3") / TCP(sport=1234, dport=1234) / Raw('\xa5' * 100)) self.send_and_assert_no_replies(self.pg0, p_l * 257, "IP lookup loop") class TestIPInput(VppTestCase): """ IPv4 Input Exceptions """ def setUp(self): super(TestIPInput, self).setUp() self.create_pg_interfaces(range(2)) for i in self.pg_interfaces: i.admin_up() i.config_ip4() i.resolve_arp() def tearDown(self): super(TestIPInput, self).tearDown() for i in self.pg_interfaces: i.unconfig_ip4() i.admin_down() def test_ip_input(self): """ IP Input Exceptions """ # i can't find a way in scapy to construct an IP packet # with a length less than the IP header length # # Packet too short - this is forwarded # p_short = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg1.remote_ip4, len=40) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) rx = self.send_and_expect(self.pg0, p_short * 65, self.pg1) # # Packet too long - this is dropped # p_long = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg1.remote_ip4, len=400) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) rx = self.send_and_assert_no_replies(self.pg0, p_long * 65, "too long") # # bad chksum - this is dropped # p_chksum = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg1.remote_ip4, chksum=400) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) rx = self.send_and_assert_no_replies(self.pg0, p_chksum * 65, "bad checksum") # # bad version - this is dropped # p_ver = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg1.remote_ip4, version=3) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) rx = self.send_and_assert_no_replies(self.pg0, p_ver * 65, "funky version") # # fragment offset 1 - this is dropped # p_frag = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg1.remote_ip4, frag=1) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) rx = self.send_and_assert_no_replies(self.pg0, p_frag * 65, "frag offset") # # TTL expired packet # p_ttl = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg1.remote_ip4, ttl=1) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) rx = self.send_and_expect(self.pg0, p_ttl * 65, self.pg0) rx = rx[0] icmp = rx[ICMP] self.assertEqual(icmptypes[icmp.type], "time-exceeded") self.assertEqual(icmpcodes[icmp.type][icmp.code], "ttl-zero-during-transit") self.assertEqual(icmp.src, self.pg0.remote_ip4) self.assertEqual(icmp.dst, self.pg1.remote_ip4) # # MTU exceeded # p_mtu = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg1.remote_ip4, ttl=10, flags='DF') / UDP(sport=1234, dport=1234) / Raw('\xa5' * 2000)) self.vapi.sw_interface_set_mtu(self.pg1.sw_if_index, [1500, 0, 0, 0]) rx = self.send_and_expect(self.pg0, p_mtu * 65, self.pg0) rx = rx[0] icmp = rx[ICMP] self.assertEqual(icmptypes[icmp.type], "dest-unreach") self.assertEqual(icmpcodes[icmp.type][icmp.code], "fragmentation-needed") self.assertEqual(icmp.src, self.pg0.remote_ip4) self.assertEqual(icmp.dst, self.pg1.remote_ip4) self.vapi.sw_interface_set_mtu(self.pg1.sw_if_index, [2500, 0, 0, 0]) rx = self.send_and_expect(self.pg0, p_mtu * 65, self.pg1) # Reset MTU for subsequent tests self.vapi.sw_interface_set_mtu(self.pg1.sw_if_index, [9000, 0, 0, 0]) # # source address 0.0.0.0 and 25.255.255.255 and for-us # p_s0 = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src="0.0.0.0", dst=self.pg0.local_ip4) / ICMP(id=4, seq=4) / Raw(load='\x0a' * 18)) rx = self.send_and_assert_no_replies(self.pg0, p_s0 * 17) p_s0 = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src="255.255.255.255", dst=self.pg0.local_ip4) / ICMP(id=4, seq=4) / Raw(load='\x0a' * 18)) rx = self.send_and_assert_no_replies(self.pg0, p_s0 * 17) class TestIPDirectedBroadcast(VppTestCase): """ IPv4 Directed Broadcast """ def setUp(self): super(TestIPDirectedBroadcast, self).setUp() self.create_pg_interfaces(range(2)) for i in self.pg_interfaces: i.admin_up() def tearDown(self): super(TestIPDirectedBroadcast, self).tearDown() for i in self.pg_interfaces: i.admin_down() def test_ip_input(self): """ IP Directed Broadcast """ # # set the directed broadcast on pg0 first, then config IP4 addresses # for pg1 directed broadcast is always disabled self.vapi.sw_interface_set_ip_directed_broadcast( self.pg0.sw_if_index, 1) p0 = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / IP(src="1.1.1.1", dst=self.pg0._local_ip4_bcast) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 2000)) p1 = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src="1.1.1.1", dst=self.pg1._local_ip4_bcast) / UDP(sport=1234, dport=1234) / Raw('\xa5' * 2000)) self.pg0.config_ip4() self.pg0.resolve_arp() self.pg1.config_ip4() self.pg1.resolve_arp() # # test packet is L2 broadcast # rx = self.send_and_expect(self.pg1, p0 * 65, self.pg0) self.assertTrue(rx[0][Ether].dst, "ff:ff:ff:ff:ff:ff") self.send_and_assert_no_replies(self.pg0, p1 * 65, "directed broadcast disabled") # # toggle directed broadcast on pg0 # self.vapi.sw_interface_set_ip_directed_broadcast( self.pg0.sw_if_index, 0) self.send_and_assert_no_replies(self.pg1, p0 * 65, "directed broadcast disabled") self.vapi.sw_interface_set_ip_directed_broadcast( self.pg0.sw_if_index, 1) rx = self.send_and_expect(self.pg1, p0 * 65, self.pg0) self.pg0.unconfig_ip4() self.pg1.unconfig_ip4() class TestIPLPM(VppTestCase): """ IPv4 longest Prefix Match """ def setUp(self): super(TestIPLPM, self).setUp() self.create_pg_interfaces(range(4)) for i in self.pg_interfaces: i.admin_up() i.config_ip4() i.resolve_arp() def tearDown(self): super(TestIPLPM, self).tearDown() for i in self.pg_interfaces: i.admin_down() i.unconfig_ip4() def test_ip_lpm(self): """ IP longest Prefix Match """ s_24 = VppIpRoute(self, "10.1.2.0", 24, [VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index)]) s_24.add_vpp_config() s_8 = VppIpRoute(self, "10.0.0.0", 8, [VppRoutePath(self.pg2.remote_ip4, self.pg2.sw_if_index)]) s_8.add_vpp_config() p_8 = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src="1.1.1.1", dst="10.1.1.1") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 2000)) p_24 = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src="1.1.1.1", dst="10.1.2.1") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 2000)) self.logger.info(self.vapi.cli("sh ip fib mtrie")) rx = self.send_and_expect(self.pg0, p_8 * 65, self.pg2) rx = self.send_and_expect(self.pg0, p_24 * 65, self.pg1) class TestIPv4Frag(VppTestCase): """ IPv4 fragmentation """ @classmethod def setUpClass(cls): super(TestIPv4Frag, cls).setUpClass() cls.create_pg_interfaces([0, 1]) cls.src_if = cls.pg0 cls.dst_if = cls.pg1 # setup all interfaces for i in cls.pg_interfaces: i.admin_up() i.config_ip4() i.resolve_arp() def test_frag_large_packets(self): """ Fragmentation of large packets """ p = (Ether(dst=self.src_if.local_mac, src=self.src_if.remote_mac) / IP(src=self.src_if.remote_ip4, dst=self.dst_if.remote_ip4) / UDP(sport=1234, dport=5678) / Raw()) self.extend_packet(p, 6000, "abcde") saved_payload = p[Raw].load # Force fragmentation by setting MTU of output interface # lower than packet size self.vapi.sw_interface_set_mtu(self.dst_if.sw_if_index, [5000, 0, 0, 0]) self.pg_enable_capture() self.src_if.add_stream(p) self.pg_start() # Expecting 3 fragments because size of created fragments currently # cannot be larger then VPP buffer size (which is 2048) packets = self.dst_if.get_capture(3) # Assume VPP sends the fragments in order payload = '' for p in packets: payload_offset = p.frag * 8 if payload_offset > 0: payload_offset -= 8 # UDP header is not in payload self.assert_equal(payload_offset, len(payload)) payload += p[Raw].load self.assert_equal(payload, saved_payload, "payload") if __name__ == '__main__': unittest.main(testRunner=VppTestRunner)