aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSachin Saxena <sachin.saxena@freescale.com>2018-02-28 20:28:52 +0530
committerSachin Saxena <sachin.saxena@nxp.com>2018-02-28 20:34:56 +0530
commit0689fce93ba269c48f83a2f70f971b3976d04c90 (patch)
tree4cc2908df3598507cc1828ac19d8c43b22450ffa
parent746b57564deede624261ab8a96c94f562f24d22c (diff)
parentd594711a5d79859a7d0bde83a516f7ab52051d9b (diff)
Merge branch 'stable/1710' of https://gerrit.fd.io/r/vpp into 17101710
-rw-r--r--.clang-format38
-rw-r--r--.gitignore99
-rw-r--r--.gitreview5
-rw-r--r--LICENSE202
-rw-r--r--MAINTAINERS188
-rw-r--r--Makefile516
-rw-r--r--README.md107
-rw-r--r--RELEASE.md726
-rw-r--r--build-data/packages/dpdk.mk32
-rw-r--r--build-data/packages/g2.mk3
-rw-r--r--build-data/packages/gmod.mk9
-rw-r--r--build-data/packages/perftool.mk4
-rw-r--r--build-data/packages/sample-plugin.mk5
-rw-r--r--build-data/packages/src.mk0
-rw-r--r--build-data/packages/vpp-platform-scripts.mk1
-rw-r--r--build-data/packages/vpp.mk35
-rw-r--r--build-data/platforms.mk96
-rw-r--r--build-data/platforms/arm32.mk45
-rw-r--r--build-data/platforms/dpaa2.mk66
-rw-r--r--build-data/platforms/qppc.mk34
-rw-r--r--build-data/platforms/vpp.mk77
-rw-r--r--build-root/Makefile1170
-rwxr-xr-xbuild-root/autowank307
-rwxr-xr-xbuild-root/bootstrap.sh52
-rw-r--r--build-root/build-config.mk.README3
-rw-r--r--build-root/config.site105
-rwxr-xr-xbuild-root/copyimg83
-rw-r--r--build-root/deb/debian/.gitignore13
-rwxr-xr-xbuild-root/deb/debian/README.vpp56
-rwxr-xr-xbuild-root/deb/debian/compat1
-rw-r--r--build-root/deb/debian/control67
-rw-r--r--build-root/deb/debian/copyright9
-rwxr-xr-xbuild-root/deb/debian/rules39
-rwxr-xr-xbuild-root/deb/debian/source/format1
-rw-r--r--build-root/deb/debian/vpp-bin.README.Debian53
-rw-r--r--build-root/deb/debian/vpp.postinst8
-rw-r--r--build-root/deb/debian/vpp.postrm21
-rw-r--r--build-root/deb/debian/vpp.preinst4
-rw-r--r--build-root/deb/debian/vpp.service14
-rw-r--r--build-root/deb/debian/vpp.upstart21
-rw-r--r--build-root/packages/src.mk4
-rw-r--r--build-root/packages/tools.mk3
-rw-r--r--build-root/packages/vppinfra.mk4
-rw-r--r--build-root/platforms.mk50
-rwxr-xr-xbuild-root/scripts/checkstyle.sh137
-rwxr-xr-xbuild-root/scripts/csit-test-branch2
-rwxr-xr-xbuild-root/scripts/find-api-core-contents9
-rwxr-xr-xbuild-root/scripts/find-api-lib-contents6
-rwxr-xr-xbuild-root/scripts/find-dev-contents31
-rwxr-xr-xbuild-root/scripts/find-plugins-contents15
-rwxr-xr-xbuild-root/scripts/find-vpp-api-java-contents8
-rwxr-xr-xbuild-root/scripts/find-vpp-api-lua-contents6
-rwxr-xr-xbuild-root/scripts/find-vpp-api-python-contents8
-rwxr-xr-xbuild-root/scripts/generate-deb-changelog37
-rwxr-xr-xbuild-root/scripts/remove-rpath24
l---------build-root/scripts/version1
l---------build-root/vagrant1
-rw-r--r--doxygen/Makefile270
-rw-r--r--doxygen/assets/doxy-vpp.css53
-rw-r--r--doxygen/assets/logo_fdio.pngbin0 -> 3092 bytes
-rw-r--r--doxygen/dev_doc.md12
-rw-r--r--doxygen/dir.dox.sample30
-rw-r--r--doxygen/doxygen.cfg2457
-rwxr-xr-xdoxygen/filter_api.py45
-rwxr-xr-xdoxygen/filter_c.py87
-rwxr-xr-xdoxygen/filter_h.py53
-rw-r--r--doxygen/layout.xml194
-rwxr-xr-xdoxygen/siphon-generate74
-rwxr-xr-xdoxygen/siphon-process71
-rw-r--r--doxygen/siphon/__init__.py24
-rw-r--r--doxygen/siphon/generate.py304
-rw-r--r--doxygen/siphon/generate_clicmd.py22
-rw-r--r--doxygen/siphon/generate_syscfg.py22
-rw-r--r--doxygen/siphon/parsers.py149
-rw-r--r--doxygen/siphon/process.py311
-rw-r--r--doxygen/siphon/process_clicmd.py56
-rw-r--r--doxygen/siphon/process_syscfg.py30
-rw-r--r--doxygen/siphon_templates/itemlist/clicmd/item_format.itemlist17
-rw-r--r--doxygen/siphon_templates/itemlist/default/index_entry.itemlist15
-rw-r--r--doxygen/siphon_templates/itemlist/default/index_header.itemlist15
-rw-r--r--doxygen/siphon_templates/itemlist/default/index_section.itemlist15
-rw-r--r--doxygen/siphon_templates/itemlist/default/item_format.itemlist16
-rw-r--r--doxygen/siphon_templates/itemlist/default/item_header.itemlist15
-rw-r--r--doxygen/siphon_templates/itemlist/syscfg/item_format.itemlist17
-rw-r--r--doxygen/siphon_templates/markdown/clicmd/index_entry.md17
-rw-r--r--doxygen/siphon_templates/markdown/clicmd/index_header.md130
-rw-r--r--doxygen/siphon_templates/markdown/clicmd/item_format.md59
-rw-r--r--doxygen/siphon_templates/markdown/default/index_entry.md16
-rw-r--r--doxygen/siphon_templates/markdown/default/index_section.md18
-rw-r--r--doxygen/siphon_templates/markdown/default/item_format.md16
-rw-r--r--doxygen/siphon_templates/markdown/default/item_header.md18
-rw-r--r--doxygen/siphon_templates/markdown/syscfg/index_header.md111
-rw-r--r--doxygen/siphon_templates/markdown/syscfg/item_format.md42
-rw-r--r--doxygen/test_framework_doc.md8
-rw-r--r--doxygen/user_doc.md19
-rw-r--r--dpdk/Makefile453
-rw-r--r--dpdk/README34
-rwxr-xr-xdpdk/deb/debian/compat1
-rw-r--r--dpdk/deb/debian/control18
-rw-r--r--dpdk/deb/debian/dkms/Makefile10
-rwxr-xr-xdpdk/deb/debian/rules38
-rw-r--r--dpdk/deb/debian/vpp-dpdk-dkms.dkms8
-rw-r--r--dpdk/dpdk-17.02_patches/0001-dpdk-dev-net-mlx5-add-out-of-buffer-counter-to-extended-statistic.patch135
-rw-r--r--dpdk/dpdk-17.02_patches/0002-dpdk-dev-1-2-net-mlx5-remove-unused-interface-name-query.patch22
-rw-r--r--dpdk/dpdk-17.02_patches/0003-dpdk-dev-2-2-net-mlx5-fix-extended-statistics-wrong-number.patch87
-rw-r--r--dpdk/dpdk-17.02_patches/0004-dpdk-dev-net-mlx5-fix-extended-statistics-counters-identification.patch13
-rw-r--r--dpdk/dpdk-17.02_patches/0005-net-mlx5-fix-startup-when-flow-cannot-be-applied.patch57
-rw-r--r--dpdk/dpdk-17.02_patches/0006-net-mlx5-add-hardware-TSO-support.patch385
-rw-r--r--dpdk/dpdk-17.02_patches/0007-add-hardware-checksum-offload-for-tunnel-pa.patch194
-rw-r--r--dpdk/dpdk-17.02_patches/0008-net-mlx5-add-enhanced-multi-packet-send-for-ConnectX.patch809
-rw-r--r--dpdk/dpdk-17.05_patches/0001-Revert-net-virtio-remove-redundant-MSI-X-detection.patch58
-rw-r--r--dpdk/dpdk-17.08_patches/0001-net-bonding-support-for-mlx.patch63
-rw-r--r--dpdk/rpm/vpp-dpdk.spec26
-rw-r--r--extras/emacs/README86
-rw-r--r--extras/emacs/all-skel.el40
-rw-r--r--extras/emacs/cli-cmd-skel.el32
-rw-r--r--extras/emacs/config-skel.el28
-rw-r--r--extras/emacs/dual-loop-skel.el302
-rw-r--r--extras/emacs/elog-4-int-skel.el31
-rw-r--r--extras/emacs/elog-4-int-track-skel.el34
-rw-r--r--extras/emacs/elog-enum-skel.el35
-rw-r--r--extras/emacs/elog-one-datum-skel.el28
-rwxr-xr-xextras/emacs/fix-coding-style.el162
-rwxr-xr-xextras/emacs/make-plugin.sh4
-rw-r--r--extras/emacs/periodic-skel.el86
-rw-r--r--extras/emacs/pipe-skel.el132
-rw-r--r--extras/emacs/plugin-all-apih-skel.el43
-rw-r--r--extras/emacs/plugin-am-skel.el60
-rw-r--r--extras/emacs/plugin-api-skel.el48
-rw-r--r--extras/emacs/plugin-h-skel.el66
-rw-r--r--extras/emacs/plugin-main-skel.el280
-rw-r--r--extras/emacs/plugin-msg-enum-skel.el55
-rw-r--r--extras/emacs/plugin-node-skel.el330
-rw-r--r--extras/emacs/plugin-test-skel.el212
-rw-r--r--extras/emacs/plugin.el32
-rw-r--r--extras/emacs/tunnel-c-skel.el452
-rw-r--r--extras/emacs/tunnel-decap-skel.el299
-rw-r--r--extras/emacs/tunnel-encap-skel.el245
-rw-r--r--extras/emacs/tunnel-h-skel.el128
-rw-r--r--extras/gdb/gdb_cmdfile.vcl_client10
-rw-r--r--extras/gdb/gdb_cmdfile.vcl_server10
-rw-r--r--extras/gdb/gdb_cmdfile.vpp7
-rw-r--r--extras/libmemif/Makefile.am89
-rwxr-xr-xextras/libmemif/bootstrap3
-rw-r--r--extras/libmemif/configure.ac13
-rw-r--r--extras/libmemif/dockerfile19
-rw-r--r--extras/libmemif/docs/architecture.pngbin0 -> 18805 bytes
-rw-r--r--extras/libmemif/docs/buildinstructions_doc.md55
-rw-r--r--extras/libmemif/docs/gettingstarted_doc.md219
-rw-r--r--extras/libmemif/doxygen.conf2427
-rw-r--r--extras/libmemif/examples/example_setup_doc.md207
-rw-r--r--extras/libmemif/examples/examples_doc.md18
-rw-r--r--extras/libmemif/examples/icmp_responder-epoll/main.c791
-rw-r--r--extras/libmemif/examples/icmp_responder-mt/main.c921
-rw-r--r--extras/libmemif/examples/icmp_responder/icmp_proto.c246
-rw-r--r--extras/libmemif/examples/icmp_responder/icmp_proto.h26
-rw-r--r--extras/libmemif/examples/icmp_responder/main.c416
-rw-r--r--extras/libmemif/libmemif_doc.md74
-rw-r--r--extras/libmemif/src/libmemif.h443
-rw-r--r--extras/libmemif/src/main.c2095
-rw-r--r--extras/libmemif/src/memif.h185
-rw-r--r--extras/libmemif/src/memif_private.h266
-rw-r--r--extras/libmemif/src/socket.c881
-rw-r--r--extras/libmemif/src/socket.h89
-rw-r--r--extras/libmemif/test/main_test.c1079
-rw-r--r--extras/libmemif/test/main_test.h25
-rw-r--r--extras/libmemif/test/socket_test.c625
-rw-r--r--extras/libmemif/test/socket_test.h25
-rw-r--r--extras/libmemif/test/unit_test.c63
-rw-r--r--extras/libmemif/test/unit_test.h38
-rw-r--r--extras/rpm/Makefile46
-rw-r--r--extras/rpm/vpp.service14
-rw-r--r--extras/rpm/vpp.spec349
-rwxr-xr-xextras/scripts/coverity-blame36
-rwxr-xr-xextras/scripts/coverity-build70
-rwxr-xr-xextras/scripts/lsnet20
-rwxr-xr-xextras/scripts/pci-nic-bind94
-rwxr-xr-xextras/scripts/pci-nic-bind-to-kernel19
-rw-r--r--extras/vagrant/.gitignore1
-rw-r--r--extras/vagrant/README43
-rw-r--r--extras/vagrant/Vagrantfile112
-rw-r--r--extras/vagrant/Vagrantfile.vcl_test111
-rw-r--r--extras/vagrant/WELCOME61
-rwxr-xr-xextras/vagrant/build.sh85
-rwxr-xr-xextras/vagrant/clearinterfaces.sh17
-rw-r--r--extras/vagrant/env.sh6
-rw-r--r--extras/vagrant/install.sh30
-rwxr-xr-xextras/vagrant/run.sh23
-rwxr-xr-xextras/vagrant/update.sh53
-rwxr-xr-xextras/vagrant/vcl_test.sh25
-rw-r--r--gmod/Makefile.am27
-rw-r--r--gmod/configure.ac8
-rw-r--r--gmod/gmod/mod_vpp.c156
-rw-r--r--gmod/gmod/vpp.conf31
-rw-r--r--src/Makefile.am103
-rw-r--r--src/configure.ac347
-rw-r--r--src/examples/sample-plugin/Makefile.am59
-rw-r--r--src/examples/sample-plugin/configure.ac11
-rw-r--r--src/examples/sample-plugin/sample.am31
-rw-r--r--src/examples/sample-plugin/sample/node.c295
-rw-r--r--src/examples/sample-plugin/sample/sample.api31
-rw-r--r--src/examples/sample-plugin/sample/sample.c238
-rw-r--r--src/examples/sample-plugin/sample/sample.h40
-rw-r--r--src/examples/sample-plugin/sample/sample_all_api_h.h16
-rw-r--r--src/examples/sample-plugin/sample/sample_msg_enum.h28
-rw-r--r--src/examples/sample-plugin/sample/sample_test.c180
-rw-r--r--src/examples/sample-plugin/sample_plugin_doc.md66
-rw-r--r--src/examples/srv6-sample-localsid/node.c261
-rwxr-xr-xsrc/examples/srv6-sample-localsid/srv6_localsid_sample.c179
-rw-r--r--src/examples/srv6-sample-localsid/srv6_localsid_sample.h61
-rw-r--r--src/examples/srv6-sample-localsid/srv6_sample_localsid_doc.md30
-rw-r--r--src/examples/vlib/dir.dox22
-rw-r--r--src/examples/vlib/main_stub.c417
-rw-r--r--src/examples/vlib/mc_test.c384
-rw-r--r--src/examples/vlib/plex_test.c527
-rw-r--r--src/g2.am32
-rw-r--r--src/m4/ax_vpp_find_jdk8.m443
-rw-r--r--src/perftool.am44
-rw-r--r--src/plugins/Makefile.am101
-rw-r--r--src/plugins/acl.am35
-rw-r--r--src/plugins/acl/acl.api477
-rw-r--r--src/plugins/acl/acl.c2709
-rw-r--r--src/plugins/acl/acl.h316
-rw-r--r--src/plugins/acl/acl_all_api_h.h21
-rw-r--r--src/plugins/acl/acl_hash_lookup_doc.md241
-rw-r--r--src/plugins/acl/acl_msg_enum.h28
-rw-r--r--src/plugins/acl/acl_multicore_doc.md349
-rw-r--r--src/plugins/acl/acl_test.c1219
-rw-r--r--src/plugins/acl/fa_node.c1874
-rw-r--r--src/plugins/acl/fa_node.h174
-rw-r--r--src/plugins/acl/hash_lookup.c894
-rw-r--r--src/plugins/acl/hash_lookup.h64
-rw-r--r--src/plugins/acl/hash_lookup_private.h33
-rw-r--r--src/plugins/acl/hash_lookup_types.h107
-rw-r--r--src/plugins/acl/manual_fns.h408
-rw-r--r--src/plugins/dpdk.am73
-rw-r--r--src/plugins/dpdk/api/dpdk.api76
-rw-r--r--src/plugins/dpdk/api/dpdk_all_api_h.h19
-rwxr-xr-xsrc/plugins/dpdk/api/dpdk_api.c332
-rw-r--r--src/plugins/dpdk/api/dpdk_msg_enum.h31
-rw-r--r--src/plugins/dpdk/api/dpdk_test.c397
-rw-r--r--src/plugins/dpdk/buffer.c575
-rw-r--r--src/plugins/dpdk/device/cli.c1955
-rw-r--r--src/plugins/dpdk/device/common.c315
-rw-r--r--src/plugins/dpdk/device/device.c856
-rw-r--r--src/plugins/dpdk/device/dir.dox27
-rw-r--r--src/plugins/dpdk/device/dpdk.h483
-rw-r--r--src/plugins/dpdk/device/dpdk_priv.h135
-rw-r--r--src/plugins/dpdk/device/format.c804
-rwxr-xr-xsrc/plugins/dpdk/device/init.c1589
-rw-r--r--src/plugins/dpdk/device/node.c704
-rw-r--r--src/plugins/dpdk/hqos/hqos.c772
-rw-r--r--src/plugins/dpdk/hqos/qos_doc.md411
-rw-r--r--src/plugins/dpdk/ipsec/cli.c229
-rw-r--r--src/plugins/dpdk/ipsec/crypto_node.c215
-rw-r--r--src/plugins/dpdk/ipsec/dir.dox27
-rw-r--r--src/plugins/dpdk/ipsec/dpdk_crypto_ipsec_doc.md87
-rw-r--r--src/plugins/dpdk/ipsec/esp.h399
-rw-r--r--src/plugins/dpdk/ipsec/esp_decrypt.c569
-rw-r--r--src/plugins/dpdk/ipsec/esp_encrypt.c592
-rw-r--r--src/plugins/dpdk/ipsec/ipsec.c501
-rw-r--r--src/plugins/dpdk/ipsec/ipsec.h242
-rw-r--r--src/plugins/dpdk/main.c96
-rw-r--r--src/plugins/dpdk/thread.c85
-rw-r--r--src/plugins/flowprobe.am37
-rw-r--r--src/plugins/flowprobe/flowprobe.api40
-rw-r--r--src/plugins/flowprobe/flowprobe.c1137
-rw-r--r--src/plugins/flowprobe/flowprobe.h174
-rw-r--r--src/plugins/flowprobe/flowprobe_all_api_h.h18
-rw-r--r--src/plugins/flowprobe/flowprobe_msg_enum.h31
-rw-r--r--src/plugins/flowprobe/flowprobe_plugin_doc.md13
-rw-r--r--src/plugins/flowprobe/flowprobe_test.c263
-rw-r--r--src/plugins/flowprobe/node.c1053
-rw-r--r--src/plugins/gtpu.am38
-rw-r--r--src/plugins/gtpu/gtpu.api120
-rwxr-xr-xsrc/plugins/gtpu/gtpu.c1151
-rw-r--r--src/plugins/gtpu/gtpu.h264
-rw-r--r--src/plugins/gtpu/gtpu_all_api_h.h18
-rw-r--r--src/plugins/gtpu/gtpu_api.c256
-rw-r--r--src/plugins/gtpu/gtpu_decap.c1305
-rw-r--r--src/plugins/gtpu/gtpu_encap.c705
-rw-r--r--src/plugins/gtpu/gtpu_error.def18
-rw-r--r--src/plugins/gtpu/gtpu_msg_enum.h31
-rw-r--r--src/plugins/gtpu/gtpu_test.c498
-rw-r--r--src/plugins/ila.am20
-rw-r--r--src/plugins/ila/ila.c1079
-rw-r--r--src/plugins/ila/ila.h116
-rw-r--r--src/plugins/ioam.am247
-rw-r--r--src/plugins/ioam/analyse/ioam_analyse.h526
-rw-r--r--src/plugins/ioam/analyse/ioam_summary_export.c444
-rwxr-xr-xsrc/plugins/ioam/analyse/ioam_summary_export.h86
-rw-r--r--src/plugins/ioam/analyse/ip6/ip6_ioam_analyse.c163
-rw-r--r--src/plugins/ioam/analyse/ip6/ip6_ioam_analyse.h127
-rw-r--r--src/plugins/ioam/analyse/ip6/node.c523
-rw-r--r--src/plugins/ioam/dir.dox18
-rw-r--r--src/plugins/ioam/encap/ip6_ioam_e2e.c216
-rw-r--r--src/plugins/ioam/encap/ip6_ioam_e2e.h64
-rw-r--r--src/plugins/ioam/encap/ip6_ioam_pot.c265
-rw-r--r--src/plugins/ioam/encap/ip6_ioam_pot.h40
-rw-r--r--src/plugins/ioam/encap/ip6_ioam_seqno.c76
-rw-r--r--src/plugins/ioam/encap/ip6_ioam_seqno.h30
-rw-r--r--src/plugins/ioam/encap/ip6_ioam_trace.c502
-rw-r--r--src/plugins/ioam/encap/ip6_ioam_trace.h51
-rw-r--r--src/plugins/ioam/export-common/ioam_export.h634
-rw-r--r--src/plugins/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export.api34
-rw-r--r--src/plugins/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export.c271
-rw-r--r--src/plugins/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h16
-rw-r--r--src/plugins/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_msg_enum.h28
-rw-r--r--src/plugins/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_test.c179
-rw-r--r--src/plugins/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_thread.c50
-rw-r--r--src/plugins/ioam/export-vxlan-gpe/vxlan_gpe_node.c171
-rw-r--r--src/plugins/ioam/export/ioam_export.api34
-rw-r--r--src/plugins/ioam/export/ioam_export.c249
-rw-r--r--src/plugins/ioam/export/ioam_export_all_api_h.h16
-rw-r--r--src/plugins/ioam/export/ioam_export_msg_enum.h28
-rw-r--r--src/plugins/ioam/export/ioam_export_test.c173
-rw-r--r--src/plugins/ioam/export/ioam_export_thread.c39
-rw-r--r--src/plugins/ioam/export/node.c168
-rw-r--r--src/plugins/ioam/ioam_plugin_doc.md464
-rw-r--r--src/plugins/ioam/ip6/ioam_cache.api29
-rw-r--r--src/plugins/ioam/ip6/ioam_cache.c417
-rw-r--r--src/plugins/ioam/ip6/ioam_cache.h903
-rw-r--r--src/plugins/ioam/ip6/ioam_cache_all_api_h.h16
-rw-r--r--src/plugins/ioam/ip6/ioam_cache_msg_enum.h28
-rw-r--r--src/plugins/ioam/ip6/ioam_cache_node.c421
-rw-r--r--src/plugins/ioam/ip6/ioam_cache_tunnel_select_node.c768
-rw-r--r--src/plugins/ioam/ipfixcollector/ipfixcollector.c105
-rw-r--r--src/plugins/ioam/ipfixcollector/ipfixcollector.h124
-rw-r--r--src/plugins/ioam/ipfixcollector/node.c301
-rw-r--r--src/plugins/ioam/lib-e2e/e2e_util.h37
-rw-r--r--src/plugins/ioam/lib-e2e/ioam_seqno_lib.c84
-rw-r--r--src/plugins/ioam/lib-e2e/ioam_seqno_lib.h201
-rw-r--r--src/plugins/ioam/lib-pot/math64.h159
-rw-r--r--src/plugins/ioam/lib-pot/pot.api105
-rw-r--r--src/plugins/ioam/lib-pot/pot_all_api_h.h16
-rw-r--r--src/plugins/ioam/lib-pot/pot_api.c239
-rw-r--r--src/plugins/ioam/lib-pot/pot_msg_enum.h28
-rw-r--r--src/plugins/ioam/lib-pot/pot_test.c333
-rw-r--r--src/plugins/ioam/lib-pot/pot_util.c445
-rw-r--r--src/plugins/ioam/lib-pot/pot_util.h195
-rw-r--r--src/plugins/ioam/lib-trace/trace.api70
-rw-r--r--src/plugins/ioam/lib-trace/trace_all_api_h.h16
-rw-r--r--src/plugins/ioam/lib-trace/trace_api.c238
-rw-r--r--src/plugins/ioam/lib-trace/trace_config.h41
-rw-r--r--src/plugins/ioam/lib-trace/trace_msg_enum.h28
-rw-r--r--src/plugins/ioam/lib-trace/trace_test.c253
-rw-r--r--src/plugins/ioam/lib-trace/trace_util.c207
-rw-r--r--src/plugins/ioam/lib-trace/trace_util.h256
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/ioam_decap.c223
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/ioam_encap.c194
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/ioam_pop.c353
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/ioam_transit.c187
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/ioam_vxlan_gpe.api111
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h16
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/vxlan_gpe_api.c377
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/vxlan_gpe_ioam.c770
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h183
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_packet.h61
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_trace.c551
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_util.h172
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/vxlan_gpe_msg_enum.h28
-rw-r--r--src/plugins/ioam/lib-vxlan-gpe/vxlan_gpe_test.c548
-rw-r--r--src/plugins/ioam/udp-ping/udp_ping.api73
-rw-r--r--src/plugins/ioam/udp-ping/udp_ping.h138
-rw-r--r--src/plugins/ioam/udp-ping/udp_ping_all_api_h.h24
-rw-r--r--src/plugins/ioam/udp-ping/udp_ping_api.c169
-rw-r--r--src/plugins/ioam/udp-ping/udp_ping_export.c306
-rw-r--r--src/plugins/ioam/udp-ping/udp_ping_msg_enum.h37
-rw-r--r--src/plugins/ioam/udp-ping/udp_ping_node.c814
-rw-r--r--src/plugins/ioam/udp-ping/udp_ping_packet.h154
-rw-r--r--src/plugins/ioam/udp-ping/udp_ping_test.c269
-rw-r--r--src/plugins/ioam/udp-ping/udp_ping_util.c330
-rw-r--r--src/plugins/ioam/udp-ping/udp_ping_util.h83
-rw-r--r--src/plugins/ixge.am20
-rw-r--r--src/plugins/ixge/ixge.c2958
-rw-r--r--src/plugins/ixge/ixge.h1295
-rw-r--r--src/plugins/lb.am42
-rw-r--r--src/plugins/lb/api.c209
-rw-r--r--src/plugins/lb/cli.c275
-rw-r--r--src/plugins/lb/lb.api56
-rw-r--r--src/plugins/lb/lb.c841
-rw-r--r--src/plugins/lb/lb.h333
-rw-r--r--src/plugins/lb/lb_plugin_doc.md141
-rw-r--r--src/plugins/lb/lb_test.c270
-rw-r--r--src/plugins/lb/lbhash.h216
-rw-r--r--src/plugins/lb/node.c421
-rw-r--r--src/plugins/lb/refcount.c41
-rw-r--r--src/plugins/lb/refcount.h67
-rw-r--r--src/plugins/lb/util.c72
-rw-r--r--src/plugins/lb/util.h40
-rw-r--r--src/plugins/memif.am37
-rw-r--r--src/plugins/memif/cli.c365
-rw-r--r--src/plugins/memif/device.c380
-rw-r--r--src/plugins/memif/memif.api124
-rw-r--r--src/plugins/memif/memif.c819
-rw-r--r--src/plugins/memif/memif.h185
-rw-r--r--src/plugins/memif/memif_all_api_h.h18
-rw-r--r--src/plugins/memif/memif_api.c350
-rw-r--r--src/plugins/memif/memif_msg_enum.h31
-rw-r--r--src/plugins/memif/memif_test.c372
-rw-r--r--src/plugins/memif/node.c533
-rw-r--r--src/plugins/memif/private.h261
-rw-r--r--src/plugins/memif/socket.c740
-rw-r--r--src/plugins/nat.am41
-rwxr-xr-xsrc/plugins/nat/in2out.c3683
-rw-r--r--src/plugins/nat/nat.api1546
-rw-r--r--src/plugins/nat/nat.c3229
-rw-r--r--src/plugins/nat/nat.h555
-rw-r--r--src/plugins/nat/nat64.c861
-rw-r--r--src/plugins/nat/nat64.h322
-rw-r--r--src/plugins/nat/nat64_cli.c984
-rw-r--r--src/plugins/nat/nat64_db.c603
-rw-r--r--src/plugins/nat/nat64_db.h307
-rw-r--r--src/plugins/nat/nat64_doc.md73
-rw-r--r--src/plugins/nat/nat64_in2out.c1118
-rw-r--r--src/plugins/nat/nat64_out2in.c494
-rw-r--r--src/plugins/nat/nat_all_api_h.h19
-rw-r--r--src/plugins/nat/nat_api.c3396
-rw-r--r--src/plugins/nat/nat_det.c158
-rw-r--r--src/plugins/nat/nat_det.h196
-rw-r--r--src/plugins/nat/nat_ipfix_logging.c848
-rw-r--r--src/plugins/nat/nat_ipfix_logging.h79
-rw-r--r--src/plugins/nat/nat_msg_enum.h31
-rw-r--r--src/plugins/nat/nat_test.c1167
-rwxr-xr-xsrc/plugins/nat/out2in.c2514
-rw-r--r--src/plugins/pppoe.am39
-rw-r--r--src/plugins/pppoe/pppoe.api90
-rw-r--r--src/plugins/pppoe/pppoe.c739
-rw-r--r--src/plugins/pppoe/pppoe.h289
-rw-r--r--src/plugins/pppoe/pppoe_all_api_h.h18
-rw-r--r--src/plugins/pppoe/pppoe_api.c224
-rw-r--r--src/plugins/pppoe/pppoe_decap.c422
-rw-r--r--src/plugins/pppoe/pppoe_error.def18
-rw-r--r--src/plugins/pppoe/pppoe_msg_enum.h31
-rw-r--r--src/plugins/pppoe/pppoe_tap.c89
-rw-r--r--src/plugins/pppoe/pppoe_tap_node.c297
-rw-r--r--src/plugins/pppoe/pppoe_test.c330
-rw-r--r--src/plugins/sixrd.am26
-rw-r--r--src/plugins/sixrd/ip4_sixrd.c127
-rw-r--r--src/plugins/sixrd/ip6_sixrd.c129
-rw-r--r--src/plugins/sixrd/sixrd.c377
-rw-r--r--src/plugins/sixrd/sixrd.h141
-rw-r--r--src/plugins/sixrd/sixrd_dpo.c132
-rw-r--r--src/plugins/sixrd/sixrd_dpo.h61
-rwxr-xr-xsrc/scripts/version50
-rw-r--r--src/scripts/vnet/arp421
-rw-r--r--src/scripts/vnet/arp4-mpls24
-rw-r--r--src/scripts/vnet/arp621
-rw-r--r--src/scripts/vnet/bvi76
-rw-r--r--src/scripts/vnet/dhcp/dhcpd.conf8
-rw-r--r--src/scripts/vnet/dhcp/left-ping-target.sh4
-rw-r--r--src/scripts/vnet/dhcp/leftpeer.conf17
-rw-r--r--src/scripts/vnet/dhcp/proxy22
-rw-r--r--src/scripts/vnet/icmp16
-rw-r--r--src/scripts/vnet/icmp616
-rw-r--r--src/scripts/vnet/ige19
-rw-r--r--src/scripts/vnet/ip629
-rw-r--r--src/scripts/vnet/ip6-hbh84
-rw-r--r--src/scripts/vnet/ixge15
-rw-r--r--src/scripts/vnet/l2efpfilter83
-rw-r--r--src/scripts/vnet/l2efpfilter_perf58
-rw-r--r--src/scripts/vnet/l2fib46
-rw-r--r--src/scripts/vnet/l2fib_perf29
-rw-r--r--src/scripts/vnet/l2fib_xc31
-rw-r--r--src/scripts/vnet/l2flood42
-rw-r--r--src/scripts/vnet/l2tp134
-rwxr-xr-xsrc/scripts/vnet/leftpeer/leftpeer-classify8
-rw-r--r--src/scripts/vnet/leftpeer/leftpeer-classify65
-rw-r--r--src/scripts/vnet/leftpeer/leftpeer-classifyl28
-rw-r--r--src/scripts/vnet/leftpeer/leftpeer-dhcp23
-rw-r--r--src/scripts/vnet/leftpeer/leftpeer-ioam.conf15
-rw-r--r--src/scripts/vnet/leftpeer/leftpeer-l3vxlan.conf12
-rw-r--r--src/scripts/vnet/leftpeer/leftpeer-lisp.conf18
-rw-r--r--src/scripts/vnet/leftpeer/leftpeer-mpls.conf17
-rw-r--r--src/scripts/vnet/leftpeer/leftpeer-sr.conf24
-rw-r--r--src/scripts/vnet/leftpeer/leftpeer-vxlan.conf17
-rw-r--r--src/scripts/vnet/leftpeer/leftpeer.script9
-rw-r--r--src/scripts/vnet/lfib/ip4-to-mpls26
-rw-r--r--src/scripts/vnet/lfib/mpls-pop-to-mpls28
-rw-r--r--src/scripts/vnet/lfib/mpls-to-ip427
-rw-r--r--src/scripts/vnet/lfib/mpls-to-mpls26
-rw-r--r--src/scripts/vnet/mcast/ip425
-rw-r--r--src/scripts/vnet/mpls-o-ethernet/leftpeer.conf17
-rw-r--r--src/scripts/vnet/mpls-o-ethernet/pg10
-rw-r--r--src/scripts/vnet/mpls-o-ethernet/rightpeer.conf15
-rw-r--r--src/scripts/vnet/mpls-o-ethernet/single.conf17
-rw-r--r--src/scripts/vnet/mpls-o-gre/dhcpd.conf116
-rw-r--r--src/scripts/vnet/mpls-o-gre/leftpeer.conf14
-rw-r--r--src/scripts/vnet/mpls-o-gre/rightpeer.conf14
-rw-r--r--src/scripts/vnet/mpls-tunnel87
-rw-r--r--src/scripts/vnet/nat4441
-rw-r--r--src/scripts/vnet/nat44_det108
-rw-r--r--src/scripts/vnet/nat44_static44
-rw-r--r--src/scripts/vnet/nat44_static_with_port44
-rw-r--r--src/scripts/vnet/pcap18
-rw-r--r--src/scripts/vnet/probe411
-rw-r--r--src/scripts/vnet/probe67
-rw-r--r--src/scripts/vnet/rewrite62
-rw-r--r--src/scripts/vnet/rightpeer/rightpeer-ioam.conf14
-rw-r--r--src/scripts/vnet/rightpeer/rightpeer-l3vxlan.conf9
-rw-r--r--src/scripts/vnet/rightpeer/rightpeer-lisp.conf16
-rw-r--r--src/scripts/vnet/rightpeer/rightpeer-mpls-l2.conf24
-rw-r--r--src/scripts/vnet/rightpeer/rightpeer-mpls.conf17
-rw-r--r--src/scripts/vnet/rightpeer/rightpeer-sr.conf28
-rw-r--r--src/scripts/vnet/rightpeer/rightpeer-vxlan.conf16
-rw-r--r--src/scripts/vnet/rightpeer/rightpeer.script9
-rw-r--r--src/scripts/vnet/rpf18
-rw-r--r--src/scripts/vnet/rtt-test31
-rw-r--r--src/scripts/vnet/source_and_port_range_check63
-rw-r--r--src/scripts/vnet/speed14
-rw-r--r--src/scripts/vnet/sr/sr_mpls11
-rw-r--r--src/scripts/vnet/srp27
-rw-r--r--src/scripts/vnet/tcp18
-rw-r--r--src/scripts/vnet/tcp-test6
-rw-r--r--src/scripts/vnet/tf-ucs-116
-rw-r--r--src/scripts/vnet/udp19
-rw-r--r--src/scripts/vnet/uri/afp_setup.cli5
-rw-r--r--src/scripts/vnet/uri/dpdk_setup.cli4
-rw-r--r--src/scripts/vnet/uri/dummy_app.py100
-rw-r--r--src/scripts/vnet/uri/tap_setup.cli5
-rwxr-xr-xsrc/scripts/vnet/uri/tcp-setup.sh39
-rw-r--r--src/scripts/vnet/uri/udp20
-rw-r--r--src/scripts/vnet/urpf86
-rw-r--r--src/scripts/vnet/virl/ip6sr.virl874
-rw-r--r--src/scripts/vnet/virl/ip6sr_notes.txt38
-rw-r--r--src/scripts/vnet/virl/mplsogre.virl319
-rw-r--r--src/scripts/vnet/virl/simple.virl389
-rw-r--r--src/scripts/vnet/vlan23
-rwxr-xr-xsrc/scripts/vppctl134
-rw-r--r--src/scripts/vppctl_completion30
-rw-r--r--src/suffix-rules.mk27
-rw-r--r--src/svm.am40
-rw-r--r--src/svm/dir.dox21
-rw-r--r--src/svm/persist.c258
-rw-r--r--src/svm/ssvm.c212
-rw-r--r--src/svm/ssvm.h176
-rw-r--r--src/svm/svm.c1268
-rw-r--r--src/svm/svm.h107
-rw-r--r--src/svm/svm_common.h135
-rw-r--r--src/svm/svm_fifo.c838
-rw-r--r--src/svm/svm_fifo.h228
-rw-r--r--src/svm/svm_fifo_segment.c643
-rw-r--r--src/svm/svm_fifo_segment.h136
-rw-r--r--src/svm/svm_test.c79
-rw-r--r--src/svm/svmdb.c676
-rw-r--r--src/svm/svmdb.h135
-rw-r--r--src/svm/svmdbtool.c537
-rw-r--r--src/svm/svmtool.c528
-rw-r--r--src/svm/test_svm_fifo1.c357
-rw-r--r--src/tests/vnet/README10
-rw-r--r--src/tests/vnet/lisp-cp/test_cp_serdes.c683
-rw-r--r--src/tests/vnet/lisp-cp/test_lisp_types.c657
-rw-r--r--src/tools/elftool/dir.dox19
-rw-r--r--src/tools/elftool/elftool.c464
-rw-r--r--src/tools/g2/clib.c157
-rw-r--r--src/tools/g2/cpel.c470
-rw-r--r--src/tools/g2/cpel.h83
-rw-r--r--src/tools/g2/events.c475
-rw-r--r--src/tools/g2/g2.h196
-rw-r--r--src/tools/g2/g2version.c19
-rw-r--r--src/tools/g2/main.c199
-rw-r--r--src/tools/g2/menu1.c565
-rw-r--r--src/tools/g2/mkversion.c77
-rw-r--r--src/tools/g2/pointsel.c854
-rw-r--r--src/tools/g2/props.c279
-rw-r--r--src/tools/g2/props.h21
-rw-r--r--src/tools/g2/view1.c3237
-rw-r--r--src/tools/perftool/c2cpel.c251
-rw-r--r--src/tools/perftool/cpel.h83
-rw-r--r--src/tools/perftool/cpel_util.c456
-rw-r--r--src/tools/perftool/cpel_util.h68
-rw-r--r--src/tools/perftool/cpelatency.c927
-rw-r--r--src/tools/perftool/cpeldump.c641
-rw-r--r--src/tools/perftool/cpelinreg.c892
-rw-r--r--src/tools/perftool/cpelstate.c822
-rw-r--r--src/tools/perftool/delsvec.c315
-rw-r--r--src/tools/perftool/elog_merge.c181
-rw-r--r--src/tools/perftool/linreg.c78
-rw-r--r--src/tools/perftool/new.cpelbin0 -> 1672 bytes
-rw-r--r--src/tools/perftool/new.elogbin0 -> 4525 bytes
-rw-r--r--src/tools/perftool/props.c280
-rw-r--r--src/tools/vppapigen/gram.y91
-rw-r--r--src/tools/vppapigen/lex.c1120
-rw-r--r--src/tools/vppapigen/lex.h51
-rw-r--r--src/tools/vppapigen/node.c1547
-rw-r--r--src/tools/vppapigen/node.h96
-rw-r--r--src/uri.am67
-rw-r--r--src/uri/sock_test.h415
-rw-r--r--src/uri/sock_test_client.c1076
-rw-r--r--src/uri/sock_test_server.c596
-rw-r--r--src/uri/uri_socket_server.c231
-rw-r--r--src/uri/uri_socket_test.c181
-rwxr-xr-xsrc/uri/uri_tcp_test.c1274
-rw-r--r--src/uri/uri_udp_test.c1040
-rw-r--r--src/uri/vcl_test_client.c27
-rw-r--r--src/uri/vcl_test_server.c27
-rw-r--r--src/uri/vppcom.c2440
-rw-r--r--src/uri/vppcom.h152
-rw-r--r--src/uri/vppcom_test.conf25
-rw-r--r--src/vat/api_format.c21027
-rw-r--r--src/vat/json_format.c304
-rw-r--r--src/vat/json_format.h254
-rw-r--r--src/vat/json_test.c75
-rw-r--r--src/vat/main.c434
-rw-r--r--src/vat/plugin.c200
-rw-r--r--src/vat/plugin.h61
-rw-r--r--src/vat/plugin_api.c292
-rw-r--r--src/vat/restart.c246
-rw-r--r--src/vat/vat.h252
-rw-r--r--src/vlib-api.am84
-rw-r--r--src/vlib.am100
-rw-r--r--src/vlib/buffer.c1134
-rw-r--r--src/vlib/buffer.h540
-rw-r--r--src/vlib/buffer_funcs.h946
-rw-r--r--src/vlib/buffer_node.h337
-rw-r--r--src/vlib/buffer_serialize.c248
-rw-r--r--src/vlib/cli.c1345
-rw-r--r--src/vlib/cli.h196
-rw-r--r--src/vlib/cli_funcs.h58
-rw-r--r--src/vlib/counter.c143
-rw-r--r--src/vlib/counter.h330
-rw-r--r--src/vlib/defs.h82
-rw-r--r--src/vlib/dir.dox23
-rw-r--r--src/vlib/elog_samples.c122
-rw-r--r--src/vlib/error.c338
-rw-r--r--src/vlib/error.h101
-rw-r--r--src/vlib/error_funcs.h90
-rw-r--r--src/vlib/format.c196
-rw-r--r--src/vlib/format_funcs.h75
-rw-r--r--src/vlib/global_funcs.h45
-rw-r--r--src/vlib/i2c.c231
-rw-r--r--src/vlib/i2c.h67
-rw-r--r--src/vlib/init.c168
-rw-r--r--src/vlib/init.h239
-rw-r--r--src/vlib/lex.c271
-rw-r--r--src/vlib/lex.h145
-rw-r--r--src/vlib/linux/pci.c666
-rw-r--r--src/vlib/linux/physmem.c277
-rw-r--r--src/vlib/main.c1816
-rw-r--r--src/vlib/main.h375
-rw-r--r--src/vlib/mc.c2609
-rw-r--r--src/vlib/mc.h687
-rw-r--r--src/vlib/node.c679
-rw-r--r--src/vlib/node.h736
-rw-r--r--src/vlib/node_cli.c456
-rw-r--r--src/vlib/node_format.c187
-rw-r--r--src/vlib/node_funcs.h1175
-rw-r--r--src/vlib/parse.c1007
-rw-r--r--src/vlib/parse.h221
-rw-r--r--src/vlib/parse_builtin.c150
-rw-r--r--src/vlib/pci/pci.c264
-rw-r--r--src/vlib/pci/pci.h251
-rw-r--r--src/vlib/pci/pci_config.h731
-rw-r--r--src/vlib/physmem.h81
-rw-r--r--src/vlib/physmem_funcs.h161
-rw-r--r--src/vlib/threads.c1820
-rw-r--r--src/vlib/threads.h537
-rw-r--r--src/vlib/threads_cli.c584
-rw-r--r--src/vlib/trace.c552
-rw-r--r--src/vlib/trace.h100
-rw-r--r--src/vlib/trace_funcs.h185
-rw-r--r--src/vlib/unix/cj.c272
-rw-r--r--src/vlib/unix/cj.h79
-rw-r--r--src/vlib/unix/cli.c3468
-rw-r--r--src/vlib/unix/dir.dox28
-rw-r--r--src/vlib/unix/input.c272
-rw-r--r--src/vlib/unix/main.c642
-rw-r--r--src/vlib/unix/mc_socket.c1050
-rw-r--r--src/vlib/unix/mc_socket.h137
-rw-r--r--src/vlib/unix/plugin.c553
-rw-r--r--src/vlib/unix/plugin.h126
-rw-r--r--src/vlib/unix/unix.h168
-rw-r--r--src/vlib/unix/util.c191
-rw-r--r--src/vlib/vlib.h87
-rw-r--r--src/vlib/vlib_process_doc.h147
-rw-r--r--src/vlibapi/api.h131
-rw-r--r--src/vlibapi/api_common.h330
-rw-r--r--src/vlibapi/api_doc.md352
-rw-r--r--src/vlibapi/api_helper_macros.h261
-rw-r--r--src/vlibapi/api_shared.c925
-rw-r--r--src/vlibapi/node_serialize.c394
-rw-r--r--src/vlibapi/node_unserialize.c227
-rw-r--r--src/vlibapi/vat_helper_macros.h76
-rw-r--r--src/vlibmemory/api.h61
-rw-r--r--src/vlibmemory/api_common.h139
-rw-r--r--src/vlibmemory/memclnt.api114
-rw-r--r--src/vlibmemory/memory_client.c536
-rw-r--r--src/vlibmemory/memory_shared.c666
-rw-r--r--src/vlibmemory/memory_vlib.c2405
-rw-r--r--src/vlibmemory/unix_shared_memory_queue.c385
-rw-r--r--src/vlibmemory/unix_shared_memory_queue.h70
-rw-r--r--src/vlibmemory/vl_memory_api_h.h32
-rw-r--r--src/vlibmemory/vl_memory_msg_enum.h42
-rw-r--r--src/vlibsocket/api.h87
-rw-r--r--src/vlibsocket/sock_test.c155
-rw-r--r--src/vlibsocket/sockclnt.api50
-rw-r--r--src/vlibsocket/sockclnt_vlib.c209
-rw-r--r--src/vlibsocket/socksvr_vlib.c706
-rw-r--r--src/vlibsocket/vl_socket_api_h.h33
-rw-r--r--src/vlibsocket/vl_socket_msg_enum.h42
-rw-r--r--src/vnet.am1074
-rw-r--r--src/vnet/adj/adj.c607
-rw-r--r--src/vnet/adj/adj.h379
-rw-r--r--src/vnet/adj/adj_bfd.c184
-rw-r--r--src/vnet/adj/adj_delegate.c144
-rw-r--r--src/vnet/adj/adj_delegate.h104
-rw-r--r--src/vnet/adj/adj_glean.c285
-rw-r--r--src/vnet/adj/adj_glean.h61
-rw-r--r--src/vnet/adj/adj_internal.h112
-rw-r--r--src/vnet/adj/adj_l2.c192
-rw-r--r--src/vnet/adj/adj_l2.h24
-rw-r--r--src/vnet/adj/adj_mcast.c483
-rw-r--r--src/vnet/adj/adj_mcast.h114
-rw-r--r--src/vnet/adj/adj_midchain.c666
-rw-r--r--src/vnet/adj/adj_midchain.h82
-rw-r--r--src/vnet/adj/adj_nbr.c1124
-rw-r--r--src/vnet/adj/adj_nbr.h176
-rw-r--r--src/vnet/adj/adj_nsh.c211
-rw-r--r--src/vnet/adj/adj_nsh.h31
-rw-r--r--src/vnet/adj/adj_types.h53
-rw-r--r--src/vnet/adj/rewrite.c234
-rw-r--r--src/vnet/adj/rewrite.h350
-rw-r--r--src/vnet/api_errno.h137
-rw-r--r--src/vnet/bfd/bfd.api288
-rw-r--r--src/vnet/bfd/bfd_api.c411
-rw-r--r--src/vnet/bfd/bfd_api.h117
-rw-r--r--src/vnet/bfd/bfd_cli.c950
-rw-r--r--src/vnet/bfd/bfd_debug.h86
-rw-r--r--src/vnet/bfd/bfd_doc.md374
-rw-r--r--src/vnet/bfd/bfd_main.c2058
-rw-r--r--src/vnet/bfd/bfd_main.h400
-rw-r--r--src/vnet/bfd/bfd_protocol.c195
-rw-r--r--src/vnet/bfd/bfd_protocol.h212
-rw-r--r--src/vnet/bfd/bfd_udp.c1516
-rw-r--r--src/vnet/bfd/bfd_udp.h124
-rw-r--r--src/vnet/bfd/dir.dox18
-rw-r--r--src/vnet/buffer.h326
-rw-r--r--src/vnet/cdp/cdp.pg7
-rw-r--r--src/vnet/cdp/cdp_input.c506
-rw-r--r--src/vnet/cdp/cdp_node.c208
-rw-r--r--src/vnet/cdp/cdp_node.h147
-rw-r--r--src/vnet/cdp/cdp_periodic.c515
-rw-r--r--src/vnet/cdp/cdp_protocol.h186
-rw-r--r--src/vnet/classify/README180
-rw-r--r--src/vnet/classify/classify.api327
-rw-r--r--src/vnet/classify/classify_api.c547
-rw-r--r--src/vnet/classify/flow_classify.c212
-rw-r--r--src/vnet/classify/flow_classify.h51
-rw-r--r--src/vnet/classify/flow_classify_node.c338
-rw-r--r--src/vnet/classify/input_acl.c283
-rw-r--r--src/vnet/classify/input_acl.h54
-rw-r--r--src/vnet/classify/ip_classify.c365
-rw-r--r--src/vnet/classify/policer_classify.c227
-rw-r--r--src/vnet/classify/policer_classify.h55
-rw-r--r--src/vnet/classify/vnet_classify.c2642
-rw-r--r--src/vnet/classify/vnet_classify.h538
-rw-r--r--src/vnet/config.c361
-rw-r--r--src/vnet/config.h176
-rw-r--r--src/vnet/cop/cop.api66
-rw-r--r--src/vnet/cop/cop.c387
-rw-r--r--src/vnet/cop/cop.h89
-rw-r--r--src/vnet/cop/cop_api.c141
-rw-r--r--src/vnet/cop/ip4_whitelist.c338
-rw-r--r--src/vnet/cop/ip6_whitelist.c298
-rw-r--r--src/vnet/cop/node1.c319
-rw-r--r--src/vnet/devices/af_packet/af_packet.api61
-rw-r--r--src/vnet/devices/af_packet/af_packet.c433
-rw-r--r--src/vnet/devices/af_packet/af_packet.h73
-rw-r--r--src/vnet/devices/af_packet/af_packet_api.c143
-rw-r--r--src/vnet/devices/af_packet/cli.c211
-rw-r--r--src/vnet/devices/af_packet/device.c354
-rw-r--r--src/vnet/devices/af_packet/dir.dox29
-rw-r--r--src/vnet/devices/af_packet/node.c310
-rw-r--r--src/vnet/devices/devices.c365
-rw-r--r--src/vnet/devices/devices.h168
-rw-r--r--src/vnet/devices/netmap/cli.c236
-rw-r--r--src/vnet/devices/netmap/device.c256
-rw-r--r--src/vnet/devices/netmap/dir.dox27
-rw-r--r--src/vnet/devices/netmap/net_netmap.h650
-rw-r--r--src/vnet/devices/netmap/netmap.api54
-rw-r--r--src/vnet/devices/netmap/netmap.c312
-rw-r--r--src/vnet/devices/netmap/netmap.h166
-rw-r--r--src/vnet/devices/netmap/netmap_api.c137
-rw-r--r--src/vnet/devices/netmap/node.c302
-rw-r--r--src/vnet/devices/ssvm/node.c345
-rw-r--r--src/vnet/devices/ssvm/ssvm_eth.c491
-rw-r--r--src/vnet/devices/ssvm/ssvm_eth.h141
-rw-r--r--src/vnet/devices/virtio/dir.dox27
-rw-r--r--src/vnet/devices/virtio/vhost-user.c3671
-rw-r--r--src/vnet/devices/virtio/vhost-user.h342
-rw-r--r--src/vnet/devices/virtio/vhost_user.api105
-rw-r--r--src/vnet/devices/virtio/vhost_user_api.c254
-rw-r--r--src/vnet/dhcp/client.c1135
-rw-r--r--src/vnet/dhcp/client.h122
-rw-r--r--src/vnet/dhcp/dhcp.api139
-rw-r--r--src/vnet/dhcp/dhcp4_packet.h66
-rw-r--r--src/vnet/dhcp/dhcp4_proxy_error.def32
-rw-r--r--src/vnet/dhcp/dhcp4_proxy_node.c1068
-rw-r--r--src/vnet/dhcp/dhcp6_packet.h183
-rw-r--r--src/vnet/dhcp/dhcp6_proxy_error.def29
-rw-r--r--src/vnet/dhcp/dhcp6_proxy_node.c1147
-rw-r--r--src/vnet/dhcp/dhcp_api.c290
-rw-r--r--src/vnet/dhcp/dhcp_proxy.c351
-rw-r--r--src/vnet/dhcp/dhcp_proxy.h286
-rw-r--r--src/vnet/dir.dox29
-rw-r--r--src/vnet/dpo/classify_dpo.c131
-rw-r--r--src/vnet/dpo/classify_dpo.h56
-rw-r--r--src/vnet/dpo/dpo.c574
-rw-r--r--src/vnet/dpo/dpo.h411
-rw-r--r--src/vnet/dpo/drop_dpo.c112
-rw-r--r--src/vnet/dpo/drop_dpo.h31
-rw-r--r--src/vnet/dpo/interface_rx_dpo.c445
-rw-r--r--src/vnet/dpo/interface_rx_dpo.h69
-rw-r--r--src/vnet/dpo/interface_tx_dpo.c92
-rw-r--r--src/vnet/dpo/interface_tx_dpo.h33
-rw-r--r--src/vnet/dpo/ip_null_dpo.c408
-rw-r--r--src/vnet/dpo/ip_null_dpo.h56
-rw-r--r--src/vnet/dpo/load_balance.c1115
-rw-r--r--src/vnet/dpo/load_balance.h219
-rw-r--r--src/vnet/dpo/load_balance_map.c582
-rw-r--r--src/vnet/dpo/load_balance_map.h110
-rw-r--r--src/vnet/dpo/lookup_dpo.c1423
-rw-r--r--src/vnet/dpo/lookup_dpo.h128
-rw-r--r--src/vnet/dpo/mpls_disposition.c364
-rw-r--r--src/vnet/dpo/mpls_disposition.h85
-rw-r--r--src/vnet/dpo/mpls_label_dpo.c703
-rw-r--r--src/vnet/dpo/mpls_label_dpo.h101
-rw-r--r--src/vnet/dpo/punt_dpo.c100
-rw-r--r--src/vnet/dpo/punt_dpo.h30
-rw-r--r--src/vnet/dpo/receive_dpo.c170
-rw-r--r--src/vnet/dpo/receive_dpo.h62
-rw-r--r--src/vnet/dpo/replicate_dpo.c821
-rw-r--r--src/vnet/dpo/replicate_dpo.h148
-rw-r--r--src/vnet/ethernet/arp.c2536
-rw-r--r--src/vnet/ethernet/arp_packet.h180
-rw-r--r--src/vnet/ethernet/dir.dox24
-rw-r--r--src/vnet/ethernet/error.def46
-rw-r--r--src/vnet/ethernet/ethernet.h577
-rw-r--r--src/vnet/ethernet/format.c348
-rw-r--r--src/vnet/ethernet/init.c128
-rw-r--r--src/vnet/ethernet/interface.c880
-rw-r--r--src/vnet/ethernet/mac_swap.c397
-rwxr-xr-xsrc/vnet/ethernet/node.c1419
-rw-r--r--src/vnet/ethernet/p2p_ethernet.api50
-rw-r--r--src/vnet/ethernet/p2p_ethernet.c276
-rw-r--r--src/vnet/ethernet/p2p_ethernet.h63
-rw-r--r--src/vnet/ethernet/p2p_ethernet_api.c137
-rw-r--r--src/vnet/ethernet/p2p_ethernet_input.c262
-rw-r--r--src/vnet/ethernet/packet.h152
-rw-r--r--src/vnet/ethernet/pg.c183
-rw-r--r--src/vnet/ethernet/sfp.c117
-rw-r--r--src/vnet/ethernet/sfp.h117
-rw-r--r--src/vnet/ethernet/types.def113
-rw-r--r--src/vnet/feature/feature.c456
-rw-r--r--src/vnet/feature/feature.h387
-rw-r--r--src/vnet/feature/registration.c301
-rw-r--r--src/vnet/fib/fib.c43
-rw-r--r--src/vnet/fib/fib.h650
-rw-r--r--src/vnet/fib/fib_api.h58
-rw-r--r--src/vnet/fib/fib_attached_export.c565
-rw-r--r--src/vnet/fib/fib_attached_export.h57
-rw-r--r--src/vnet/fib/fib_bfd.c196
-rw-r--r--src/vnet/fib/fib_entry.c1618
-rw-r--r--src/vnet/fib/fib_entry.h548
-rw-r--r--src/vnet/fib/fib_entry_cover.c180
-rw-r--r--src/vnet/fib/fib_entry_cover.h42
-rw-r--r--src/vnet/fib/fib_entry_delegate.c256
-rw-r--r--src/vnet/fib/fib_entry_delegate.h158
-rw-r--r--src/vnet/fib/fib_entry_src.c1423
-rw-r--r--src/vnet/fib/fib_entry_src.h298
-rw-r--r--src/vnet/fib/fib_entry_src_adj.c381
-rw-r--r--src/vnet/fib/fib_entry_src_api.c171
-rw-r--r--src/vnet/fib/fib_entry_src_default.c121
-rw-r--r--src/vnet/fib/fib_entry_src_default_route.c58
-rw-r--r--src/vnet/fib/fib_entry_src_interface.c216
-rw-r--r--src/vnet/fib/fib_entry_src_lisp.c133
-rw-r--r--src/vnet/fib/fib_entry_src_mpls.c199
-rw-r--r--src/vnet/fib/fib_entry_src_rr.c300
-rw-r--r--src/vnet/fib/fib_entry_src_special.c70
-rw-r--r--src/vnet/fib/fib_internal.h70
-rw-r--r--src/vnet/fib/fib_node.c277
-rw-r--r--src/vnet/fib/fib_node.h377
-rw-r--r--src/vnet/fib/fib_node_list.c390
-rw-r--r--src/vnet/fib/fib_node_list.h64
-rw-r--r--src/vnet/fib/fib_path.c2242
-rw-r--r--src/vnet/fib/fib_path.h185
-rw-r--r--src/vnet/fib/fib_path_ext.c438
-rw-r--r--src/vnet/fib/fib_path_ext.h144
-rw-r--r--src/vnet/fib/fib_path_list.c1380
-rw-r--r--src/vnet/fib/fib_path_list.h183
-rw-r--r--src/vnet/fib/fib_table.c1295
-rw-r--r--src/vnet/fib/fib_table.h811
-rw-r--r--src/vnet/fib/fib_test.c8768
-rw-r--r--src/vnet/fib/fib_test.h111
-rw-r--r--src/vnet/fib/fib_types.c327
-rw-r--r--src/vnet/fib/fib_types.h426
-rw-r--r--src/vnet/fib/fib_urpf_list.c268
-rw-r--r--src/vnet/fib/fib_urpf_list.h146
-rw-r--r--src/vnet/fib/fib_walk.c1205
-rw-r--r--src/vnet/fib/fib_walk.h61
-rw-r--r--src/vnet/fib/ip4_fib.c740
-rw-r--r--src/vnet/fib/ip4_fib.h168
-rw-r--r--src/vnet/fib/ip6_fib.c757
-rw-r--r--src/vnet/fib/ip6_fib.h174
-rw-r--r--src/vnet/fib/mpls_fib.c456
-rw-r--r--src/vnet/fib/mpls_fib.h139
-rw-r--r--src/vnet/flow/flow.api147
-rw-r--r--src/vnet/flow/flow_api.c397
-rw-r--r--src/vnet/flow/flow_report.c507
-rw-r--r--src/vnet/flow/flow_report.h146
-rw-r--r--src/vnet/flow/flow_report_classify.c530
-rw-r--r--src/vnet/flow/flow_report_classify.h122
-rw-r--r--src/vnet/flow/ipfix_info_elements.h430
-rw-r--r--src/vnet/flow/ipfix_packet.h188
-rw-r--r--src/vnet/global_funcs.h32
-rw-r--r--src/vnet/gre/error.def23
-rw-r--r--src/vnet/gre/gre.api57
-rw-r--r--src/vnet/gre/gre.c522
-rw-r--r--src/vnet/gre/gre.h253
-rw-r--r--src/vnet/gre/gre_api.c226
-rw-r--r--src/vnet/gre/interface.c706
-rw-r--r--src/vnet/gre/node.c703
-rw-r--r--src/vnet/gre/packet.h55
-rw-r--r--src/vnet/gre/pg.c77
-rw-r--r--src/vnet/handoff.c594
-rw-r--r--src/vnet/handoff.h257
-rw-r--r--src/vnet/hdlc/error.def42
-rw-r--r--src/vnet/hdlc/hdlc.c249
-rw-r--r--src/vnet/hdlc/hdlc.h123
-rw-r--r--src/vnet/hdlc/node.c358
-rw-r--r--src/vnet/hdlc/packet.h72
-rw-r--r--src/vnet/hdlc/pg.c105
-rw-r--r--src/vnet/interface.api396
-rw-r--r--src/vnet/interface.c1464
-rw-r--r--src/vnet/interface.h711
-rw-r--r--src/vnet/interface_api.c958
-rw-r--r--src/vnet/interface_cli.c1660
-rw-r--r--src/vnet/interface_format.c430
-rw-r--r--src/vnet/interface_funcs.h347
-rw-r--r--src/vnet/interface_output.c1260
-rw-r--r--src/vnet/ip/dir.dox26
-rw-r--r--src/vnet/ip/format.c121
-rw-r--r--src/vnet/ip/format.h114
-rw-r--r--src/vnet/ip/icmp4.c784
-rw-r--r--src/vnet/ip/icmp4.h60
-rw-r--r--src/vnet/ip/icmp46_packet.h398
-rw-r--r--src/vnet/ip/icmp6.c882
-rw-r--r--src/vnet/ip/icmp6.h82
-rw-r--r--src/vnet/ip/igmp_packet.h155
-rw-r--r--src/vnet/ip/ip.api551
-rw-r--r--src/vnet/ip/ip.h203
-rw-r--r--src/vnet/ip/ip4.h387
-rw-r--r--src/vnet/ip/ip46_cli.c236
-rw-r--r--src/vnet/ip/ip4_error.h95
-rw-r--r--src/vnet/ip/ip4_format.c256
-rwxr-xr-xsrc/vnet/ip/ip4_forward.c3197
-rw-r--r--src/vnet/ip/ip4_input.c507
-rw-r--r--src/vnet/ip/ip4_mtrie.c811
-rw-r--r--src/vnet/ip/ip4_mtrie.h237
-rw-r--r--src/vnet/ip/ip4_packet.h385
-rw-r--r--src/vnet/ip/ip4_pg.c387
-rw-r--r--src/vnet/ip/ip4_source_and_port_range_check.c1424
-rw-r--r--src/vnet/ip/ip4_source_check.c562
-rw-r--r--src/vnet/ip/ip4_test.c347
-rw-r--r--src/vnet/ip/ip4_to_ip6.h659
-rw-r--r--src/vnet/ip/ip6.h605
-rw-r--r--src/vnet/ip/ip6_error.h92
-rw-r--r--src/vnet/ip/ip6_format.c383
-rw-r--r--src/vnet/ip/ip6_forward.c3558
-rw-r--r--src/vnet/ip/ip6_hop_by_hop.c1166
-rw-r--r--src/vnet/ip/ip6_hop_by_hop.h277
-rw-r--r--src/vnet/ip/ip6_hop_by_hop_packet.h56
-rw-r--r--src/vnet/ip/ip6_input.c378
-rw-r--r--src/vnet/ip/ip6_neighbor.c4332
-rw-r--r--src/vnet/ip/ip6_neighbor.h109
-rw-r--r--src/vnet/ip/ip6_packet.h536
-rw-r--r--src/vnet/ip/ip6_pg.c231
-rw-r--r--src/vnet/ip/ip6_to_ip4.h634
-rw-r--r--src/vnet/ip/ip_api.c1825
-rw-r--r--src/vnet/ip/ip_checksum.c228
-rw-r--r--src/vnet/ip/ip_frag.c581
-rw-r--r--src/vnet/ip/ip_frag.h96
-rw-r--r--src/vnet/ip/ip_init.c152
-rw-r--r--src/vnet/ip/ip_input_acl.c450
-rw-r--r--src/vnet/ip/ip_packet.h180
-rw-r--r--src/vnet/ip/ip_source_and_port_range_check.h148
-rw-r--r--src/vnet/ip/lookup.c1442
-rw-r--r--src/vnet/ip/lookup.h224
-rwxr-xr-xsrc/vnet/ip/ping.c928
-rw-r--r--src/vnet/ip/ping.h115
-rw-r--r--src/vnet/ip/ports.def757
-rw-r--r--src/vnet/ip/protocols.def162
-rw-r--r--src/vnet/ip/punt.c830
-rw-r--r--src/vnet/ip/punt.h91
-rw-r--r--src/vnet/ip/punt_error.def27
-rw-r--r--src/vnet/ipsec-gre/dir.dox18
-rw-r--r--src/vnet/ipsec-gre/error.def26
-rw-r--r--src/vnet/ipsec-gre/interface.c319
-rw-r--r--src/vnet/ipsec-gre/ipsec_gre.api79
-rw-r--r--src/vnet/ipsec-gre/ipsec_gre.c407
-rw-r--r--src/vnet/ipsec-gre/ipsec_gre.h114
-rw-r--r--src/vnet/ipsec-gre/ipsec_gre_api.c190
-rw-r--r--src/vnet/ipsec-gre/ipsec_gre_doc.md74
-rw-r--r--src/vnet/ipsec-gre/node.c433
-rw-r--r--src/vnet/ipsec/esp.h320
-rw-r--r--src/vnet/ipsec/esp_decrypt.c435
-rw-r--r--src/vnet/ipsec/esp_encrypt.c428
-rw-r--r--src/vnet/ipsec/ikev2.c3450
-rw-r--r--src/vnet/ipsec/ikev2.h435
-rw-r--r--src/vnet/ipsec/ikev2_cli.c602
-rw-r--r--src/vnet/ipsec/ikev2_crypto.c874
-rw-r--r--src/vnet/ipsec/ikev2_format.c155
-rw-r--r--src/vnet/ipsec/ikev2_payload.c550
-rw-r--r--src/vnet/ipsec/ikev2_priv.h362
-rw-r--r--src/vnet/ipsec/ipsec.api552
-rw-r--r--src/vnet/ipsec/ipsec.c586
-rw-r--r--src/vnet/ipsec/ipsec.h368
-rw-r--r--src/vnet/ipsec/ipsec_api.c757
-rw-r--r--src/vnet/ipsec/ipsec_cli.c863
-rw-r--r--src/vnet/ipsec/ipsec_format.c141
-rw-r--r--src/vnet/ipsec/ipsec_if.c413
-rw-r--r--src/vnet/ipsec/ipsec_if_in.c221
-rw-r--r--src/vnet/ipsec/ipsec_if_out.c172
-rw-r--r--src/vnet/ipsec/ipsec_input.c430
-rw-r--r--src/vnet/ipsec/ipsec_output.c458
-rw-r--r--src/vnet/l2/dir.dox24
-rw-r--r--src/vnet/l2/feat_bitmap.c185
-rw-r--r--src/vnet/l2/feat_bitmap.h110
-rw-r--r--src/vnet/l2/l2.api385
-rw-r--r--src/vnet/l2/l2_api.c679
-rw-r--r--src/vnet/l2/l2_bd.c1359
-rw-r--r--src/vnet/l2/l2_bd.h190
-rw-r--r--src/vnet/l2/l2_bvi.c40
-rw-r--r--src/vnet/l2/l2_bvi.h117
-rw-r--r--src/vnet/l2/l2_classify.h114
-rw-r--r--src/vnet/l2/l2_efp_filter.c575
-rw-r--r--src/vnet/l2/l2_efp_filter.h33
-rw-r--r--src/vnet/l2/l2_fib.c1250
-rw-r--r--src/vnet/l2/l2_fib.h432
-rw-r--r--src/vnet/l2/l2_flood.c568
-rw-r--r--src/vnet/l2/l2_flood.h35
-rw-r--r--src/vnet/l2/l2_fwd.c577
-rw-r--r--src/vnet/l2/l2_fwd.h36
-rw-r--r--src/vnet/l2/l2_input.c1187
-rw-r--r--src/vnet/l2/l2_input.h289
-rw-r--r--src/vnet/l2/l2_input_acl.c431
-rw-r--r--src/vnet/l2/l2_input_classify.c662
-rw-r--r--src/vnet/l2/l2_input_vtr.c369
-rw-r--r--src/vnet/l2/l2_input_vtr.h54
-rw-r--r--src/vnet/l2/l2_learn.c596
-rw-r--r--src/vnet/l2/l2_learn.h70
-rw-r--r--src/vnet/l2/l2_output.c710
-rw-r--r--src/vnet/l2/l2_output.h174
-rw-r--r--src/vnet/l2/l2_output_acl.c341
-rw-r--r--src/vnet/l2/l2_output_classify.c654
-rw-r--r--src/vnet/l2/l2_patch.c466
-rw-r--r--src/vnet/l2/l2_rw.c710
-rw-r--r--src/vnet/l2/l2_rw.h95
-rw-r--r--src/vnet/l2/l2_vtr.c831
-rw-r--r--src/vnet/l2/l2_vtr.h281
-rw-r--r--src/vnet/l2/l2_xcrw.c607
-rw-r--r--src/vnet/l2/l2_xcrw.h91
-rw-r--r--src/vnet/l2tp/decap.c309
-rw-r--r--src/vnet/l2tp/encap.c238
-rw-r--r--src/vnet/l2tp/l2tp.api104
-rw-r--r--src/vnet/l2tp/l2tp.c766
-rw-r--r--src/vnet/l2tp/l2tp.h147
-rw-r--r--src/vnet/l2tp/l2tp_api.c267
-rw-r--r--src/vnet/l2tp/packet.h44
-rw-r--r--src/vnet/l2tp/pg.c106
-rw-r--r--src/vnet/l3_types.h59
-rw-r--r--src/vnet/lawful-intercept/lawful_intercept.c112
-rw-r--r--src/vnet/lawful-intercept/lawful_intercept.h45
-rw-r--r--src/vnet/lawful-intercept/node.c285
-rw-r--r--src/vnet/lisp-cp/control.c4756
-rw-r--r--src/vnet/lisp-cp/control.h435
-rw-r--r--src/vnet/lisp-cp/gid_dictionary.c1055
-rw-r--r--src/vnet/lisp-cp/gid_dictionary.h161
-rw-r--r--src/vnet/lisp-cp/lisp.api750
-rw-r--r--src/vnet/lisp-cp/lisp_api.c1342
-rw-r--r--src/vnet/lisp-cp/lisp_cli.c1606
-rw-r--r--src/vnet/lisp-cp/lisp_cp_dpo.c122
-rw-r--r--src/vnet/lisp-cp/lisp_cp_dpo.h45
-rw-r--r--src/vnet/lisp-cp/lisp_cp_messages.h644
-rw-r--r--src/vnet/lisp-cp/lisp_msg_serdes.c380
-rw-r--r--src/vnet/lisp-cp/lisp_msg_serdes.h58
-rw-r--r--src/vnet/lisp-cp/lisp_types.c1779
-rw-r--r--src/vnet/lisp-cp/lisp_types.h407
-rw-r--r--src/vnet/lisp-cp/one.api1110
-rw-r--r--src/vnet/lisp-cp/one_api.c1809
-rw-r--r--src/vnet/lisp-cp/one_cli.c2158
-rw-r--r--src/vnet/lisp-cp/packets.c226
-rw-r--r--src/vnet/lisp-cp/packets.h38
-rw-r--r--src/vnet/lisp-gpe/decap.c605
-rw-r--r--src/vnet/lisp-gpe/dir.dox26
-rw-r--r--src/vnet/lisp-gpe/interface.c941
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe.api248
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe.c726
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe.h338
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_adjacency.c634
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_adjacency.h136
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_api.c597
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_error.def18
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c1588
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_fwd_entry.h240
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_packet.h149
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_sub_interface.c285
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_sub_interface.h157
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_tenant.c330
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_tenant.h88
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_tunnel.c293
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_tunnel.h89
-rw-r--r--src/vnet/lisp-gpe/rfc.txt826
-rw-r--r--src/vnet/llc/llc.c241
-rw-r--r--src/vnet/llc/llc.h191
-rw-r--r--src/vnet/llc/node.c331
-rw-r--r--src/vnet/llc/pg.c113
-rw-r--r--src/vnet/lldp/dir.dox18
-rw-r--r--src/vnet/lldp/lldp.api47
-rw-r--r--src/vnet/lldp/lldp.h32
-rw-r--r--src/vnet/lldp/lldp_api.c144
-rw-r--r--src/vnet/lldp/lldp_cli.c660
-rw-r--r--src/vnet/lldp/lldp_doc.md86
-rw-r--r--src/vnet/lldp/lldp_input.c302
-rw-r--r--src/vnet/lldp/lldp_node.c341
-rw-r--r--src/vnet/lldp/lldp_node.h148
-rw-r--r--src/vnet/lldp/lldp_output.c235
-rw-r--r--src/vnet/lldp/lldp_protocol.h142
-rwxr-xr-xsrc/vnet/map/examples/gen-rules.py186
-rw-r--r--src/vnet/map/examples/health_check.c109
-rwxr-xr-xsrc/vnet/map/examples/test_map.py141
-rwxr-xr-xsrc/vnet/map/gen-rules.py107
-rw-r--r--src/vnet/map/ip4_map.c754
-rw-r--r--src/vnet/map/ip4_map_t.c812
-rw-r--r--src/vnet/map/ip6_map.c1265
-rw-r--r--src/vnet/map/ip6_map_t.c1039
-rw-r--r--src/vnet/map/map.api160
-rw-r--r--src/vnet/map/map.c2287
-rw-r--r--src/vnet/map/map.h580
-rw-r--r--src/vnet/map/map_api.c302
-rw-r--r--src/vnet/map/map_doc.md69
-rw-r--r--src/vnet/map/map_dpo.c130
-rw-r--r--src/vnet/map/map_dpo.h43
-rw-r--r--src/vnet/map/test.c205
-rw-r--r--src/vnet/mfib/ip4_mfib.c494
-rw-r--r--src/vnet/mfib/ip4_mfib.h105
-rw-r--r--src/vnet/mfib/ip6_mfib.c699
-rw-r--r--src/vnet/mfib/ip6_mfib.h121
-rw-r--r--src/vnet/mfib/mfib_entry.c1313
-rw-r--r--src/vnet/mfib/mfib_entry.h184
-rw-r--r--src/vnet/mfib/mfib_forward.c525
-rw-r--r--src/vnet/mfib/mfib_itf.c123
-rw-r--r--src/vnet/mfib/mfib_itf.h63
-rw-r--r--src/vnet/mfib/mfib_signal.c214
-rw-r--r--src/vnet/mfib/mfib_signal.h59
-rw-r--r--src/vnet/mfib/mfib_table.c647
-rw-r--r--src/vnet/mfib/mfib_table.h424
-rw-r--r--src/vnet/mfib/mfib_test.c1405
-rw-r--r--src/vnet/mfib/mfib_types.c213
-rw-r--r--src/vnet/mfib/mfib_types.h205
-rw-r--r--src/vnet/misc.c127
-rw-r--r--src/vnet/mpls/error.def31
-rw-r--r--src/vnet/mpls/interface.c132
-rw-r--r--src/vnet/mpls/mpls.api246
-rw-r--r--src/vnet/mpls/mpls.c627
-rw-r--r--src/vnet/mpls/mpls.h110
-rw-r--r--src/vnet/mpls/mpls_api.c582
-rw-r--r--src/vnet/mpls/mpls_features.c154
-rw-r--r--src/vnet/mpls/mpls_input.c324
-rw-r--r--src/vnet/mpls/mpls_lookup.c723
-rw-r--r--src/vnet/mpls/mpls_lookup.h102
-rw-r--r--src/vnet/mpls/mpls_output.c498
-rw-r--r--src/vnet/mpls/mpls_tunnel.c1070
-rw-r--r--src/vnet/mpls/mpls_tunnel.h137
-rw-r--r--src/vnet/mpls/mpls_types.h60
-rw-r--r--src/vnet/mpls/packet.h125
-rw-r--r--src/vnet/mpls/pg.c71
-rw-r--r--src/vnet/osi/node.c326
-rw-r--r--src/vnet/osi/osi.c201
-rw-r--r--src/vnet/osi/osi.h168
-rw-r--r--src/vnet/osi/pg.c106
-rw-r--r--src/vnet/pg/cli.c655
-rw-r--r--src/vnet/pg/edit.c186
-rw-r--r--src/vnet/pg/edit.h210
-rw-r--r--src/vnet/pg/example.script6
-rw-r--r--src/vnet/pg/init.c72
-rw-r--r--src/vnet/pg/input.c1674
-rw-r--r--src/vnet/pg/output.c95
-rw-r--r--src/vnet/pg/pg.h390
-rw-r--r--src/vnet/pg/stream.c512
-rw-r--r--src/vnet/pipeline.h456
-rw-r--r--src/vnet/plugin/plugin.h25
-rw-r--r--src/vnet/policer/node_funcs.c942
-rw-r--r--src/vnet/policer/police.h214
-rw-r--r--src/vnet/policer/policer.api147
-rw-r--r--src/vnet/policer/policer.c569
-rw-r--r--src/vnet/policer/policer.h107
-rw-r--r--src/vnet/policer/policer_api.c232
-rw-r--r--src/vnet/policer/xlate.c1501
-rw-r--r--src/vnet/policer/xlate.h186
-rw-r--r--src/vnet/ppp/error.def42
-rw-r--r--src/vnet/ppp/node.c377
-rw-r--r--src/vnet/ppp/packet.h199
-rw-r--r--src/vnet/ppp/pg.c114
-rw-r--r--src/vnet/ppp/ppp.c261
-rw-r--r--src/vnet/ppp/ppp.h132
-rw-r--r--src/vnet/replication.c285
-rw-r--r--src/vnet/replication.h137
-rw-r--r--src/vnet/session/application.c657
-rw-r--r--src/vnet/session/application.h136
-rw-r--r--src/vnet/session/application_interface.c406
-rw-r--r--src/vnet/session/application_interface.h183
-rw-r--r--src/vnet/session/segment_manager.c636
-rw-r--r--src/vnet/session/segment_manager.h131
-rw-r--r--src/vnet/session/session.api331
-rw-r--r--src/vnet/session/session.c1036
-rw-r--r--src/vnet/session/session.h436
-rwxr-xr-xsrc/vnet/session/session_api.c763
-rwxr-xr-xsrc/vnet/session/session_cli.c494
-rw-r--r--src/vnet/session/session_debug.h142
-rw-r--r--src/vnet/session/session_lookup.c619
-rw-r--r--src/vnet/session/session_lookup.h100
-rw-r--r--src/vnet/session/session_node.c707
-rw-r--r--src/vnet/session/stream_session.h92
-rw-r--r--src/vnet/session/transport.h94
-rw-r--r--src/vnet/session/transport_interface.c109
-rw-r--r--src/vnet/session/transport_interface.h82
-rw-r--r--src/vnet/snap/node.c353
-rw-r--r--src/vnet/snap/pg.c116
-rw-r--r--src/vnet/snap/snap.c204
-rw-r--r--src/vnet/snap/snap.h206
-rw-r--r--src/vnet/span/node.c366
-rw-r--r--src/vnet/span/span.api56
-rw-r--r--src/vnet/span/span.c249
-rw-r--r--src/vnet/span/span.h77
-rw-r--r--src/vnet/span/span_api.c159
-rw-r--r--src/vnet/span/span_doc.md65
-rwxr-xr-xsrc/vnet/srmpls/dir.dox22
-rwxr-xr-xsrc/vnet/srmpls/sr.h152
-rw-r--r--src/vnet/srmpls/sr_doc.md87
-rwxr-xr-xsrc/vnet/srmpls/sr_mpls_policy.c569
-rwxr-xr-xsrc/vnet/srmpls/sr_mpls_steering.c453
-rw-r--r--src/vnet/srp/format.c147
-rw-r--r--src/vnet/srp/interface.c458
-rw-r--r--src/vnet/srp/node.c932
-rw-r--r--src/vnet/srp/packet.h204
-rw-r--r--src/vnet/srp/pg.c157
-rw-r--r--src/vnet/srp/srp.h222
-rwxr-xr-xsrc/vnet/srv6/dir.dox25
-rwxr-xr-xsrc/vnet/srv6/ietf_draft_05.txt1564
-rw-r--r--src/vnet/srv6/sr.api168
-rwxr-xr-xsrc/vnet/srv6/sr.c57
-rwxr-xr-xsrc/vnet/srv6/sr.h326
-rw-r--r--src/vnet/srv6/sr_api.c254
-rw-r--r--src/vnet/srv6/sr_doc.md55
-rwxr-xr-xsrc/vnet/srv6/sr_localsid.c1654
-rw-r--r--src/vnet/srv6/sr_localsid.md58
-rwxr-xr-xsrc/vnet/srv6/sr_packet.h159
-rw-r--r--src/vnet/srv6/sr_policy.md56
-rwxr-xr-xsrc/vnet/srv6/sr_policy_rewrite.c3231
-rwxr-xr-xsrc/vnet/srv6/sr_steering.c575
-rw-r--r--src/vnet/srv6/sr_steering.md11
-rw-r--r--src/vnet/tcp/builtin_client.c770
-rw-r--r--src/vnet/tcp/builtin_client.h121
-rw-r--r--src/vnet/tcp/builtin_http_server.c564
-rw-r--r--src/vnet/tcp/builtin_proxy.c601
-rw-r--r--src/vnet/tcp/builtin_proxy.h100
-rw-r--r--src/vnet/tcp/builtin_server.c455
-rw-r--r--src/vnet/tcp/tcp.api42
-rw-r--r--src/vnet/tcp/tcp.c1943
-rw-r--r--src/vnet/tcp/tcp.h985
-rw-r--r--src/vnet/tcp/tcp_api.c119
-rwxr-xr-xsrc/vnet/tcp/tcp_debug.h761
-rw-r--r--src/vnet/tcp/tcp_error.def43
-rw-r--r--src/vnet/tcp/tcp_format.c137
-rw-r--r--src/vnet/tcp/tcp_input.c3215
-rw-r--r--src/vnet/tcp/tcp_newreno.c107
-rw-r--r--src/vnet/tcp/tcp_output.c2113
-rw-r--r--src/vnet/tcp/tcp_packet.h184
-rw-r--r--src/vnet/tcp/tcp_pg.c244
-rw-r--r--src/vnet/tcp/tcp_syn_filter4.c545
-rw-r--r--src/vnet/tcp/tcp_test.c1764
-rw-r--r--src/vnet/tcp/tcp_timer.h29
-rw-r--r--src/vnet/udp/builtin_server.c261
-rw-r--r--src/vnet/udp/udp.c342
-rw-r--r--src/vnet/udp/udp.h371
-rw-r--r--src/vnet/udp/udp_error.def21
-rw-r--r--src/vnet/udp/udp_format.c91
-rw-r--r--src/vnet/udp/udp_input.c322
-rw-r--r--src/vnet/udp/udp_local.c656
-rw-r--r--src/vnet/udp/udp_packet.h65
-rw-r--r--src/vnet/udp/udp_pg.c237
-rw-r--r--src/vnet/unix/gdb_funcs.c224
-rw-r--r--src/vnet/unix/pcap.c241
-rw-r--r--src/vnet/unix/pcap.h230
-rw-r--r--src/vnet/unix/pcap2pg.c182
-rw-r--r--src/vnet/unix/tap.api119
-rw-r--r--src/vnet/unix/tap_api.c284
-rw-r--r--src/vnet/unix/tapcli.c1491
-rw-r--r--src/vnet/unix/tapcli.h52
-rw-r--r--src/vnet/unix/tuntap.c1037
-rw-r--r--src/vnet/unix/tuntap.h69
-rw-r--r--src/vnet/util/radix.c1104
-rw-r--r--src/vnet/util/radix.h147
-rw-r--r--src/vnet/vnet.h95
-rw-r--r--src/vnet/vnet_all_api_h.h69
-rw-r--r--src/vnet/vnet_msg_enum.h37
-rw-r--r--src/vnet/vxlan-gpe/decap.c1178
-rw-r--r--src/vnet/vxlan-gpe/dir.dox32
-rw-r--r--src/vnet/vxlan-gpe/encap.c388
-rw-r--r--src/vnet/vxlan-gpe/vxlan-gpe-rfc.txt868
-rw-r--r--src/vnet/vxlan-gpe/vxlan_gpe.api79
-rw-r--r--src/vnet/vxlan-gpe/vxlan_gpe.c1264
-rw-r--r--src/vnet/vxlan-gpe/vxlan_gpe.h259
-rw-r--r--src/vnet/vxlan-gpe/vxlan_gpe_api.c272
-rw-r--r--src/vnet/vxlan-gpe/vxlan_gpe_error.def16
-rw-r--r--src/vnet/vxlan-gpe/vxlan_gpe_packet.h110
-rw-r--r--src/vnet/vxlan/decap.c1239
-rw-r--r--src/vnet/vxlan/dir.dox24
-rw-r--r--src/vnet/vxlan/encap.c622
-rw-r--r--src/vnet/vxlan/vxlan.api71
-rw-r--r--src/vnet/vxlan/vxlan.c1113
-rw-r--r--src/vnet/vxlan/vxlan.h188
-rw-r--r--src/vnet/vxlan/vxlan_api.c240
-rw-r--r--src/vnet/vxlan/vxlan_error.def17
-rw-r--r--src/vnet/vxlan/vxlan_packet.h69
-rw-r--r--src/vpp-api-test.am62
-rw-r--r--src/vpp-api.am46
-rw-r--r--src/vpp-api/client/client.c489
-rw-r--r--src/vpp-api/client/libvppapiclient.map19
-rw-r--r--src/vpp-api/client/test.c140
-rw-r--r--src/vpp-api/client/vppapiclient.h36
-rw-r--r--src/vpp-api/java/Makefile.am263
-rw-r--r--src/vpp-api/java/Readme.txt236
-rw-r--r--src/vpp-api/java/jvpp-acl/io/fd/vpp/jvpp/acl/examples/AclExpectedDumpData.java135
-rw-r--r--src/vpp-api/java/jvpp-acl/io/fd/vpp/jvpp/acl/examples/AclTestData.java101
-rw-r--r--src/vpp-api/java/jvpp-acl/io/fd/vpp/jvpp/acl/examples/AclTestRequests.java159
-rw-r--r--src/vpp-api/java/jvpp-acl/io/fd/vpp/jvpp/acl/examples/FutureApiExample.java68
-rw-r--r--src/vpp-api/java/jvpp-acl/io/fd/vpp/jvpp/acl/examples/Readme.txt4
-rw-r--r--src/vpp-api/java/jvpp-acl/io/fd/vpp/jvpp/acl/test/CallbackApiTest.java33
-rw-r--r--src/vpp-api/java/jvpp-acl/io/fd/vpp/jvpp/acl/test/FutureApiTest.java62
-rw-r--r--src/vpp-api/java/jvpp-acl/io/fd/vpp/jvpp/acl/test/Readme.txt4
-rw-r--r--src/vpp-api/java/jvpp-acl/jvpp_acl.c107
-rw-r--r--src/vpp-api/java/jvpp-acl/jvpp_acl.h42
-rw-r--r--src/vpp-api/java/jvpp-common/jvpp_common.c96
-rw-r--r--src/vpp-api/java/jvpp-common/jvpp_common.h74
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/examples/CallbackApiExample.java100
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/examples/CallbackJVppFacadeExample.java110
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/examples/CallbackJVppFacadeNotificationExample.java87
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/examples/CallbackNotificationApiExample.java88
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/examples/CreateSubInterfaceExample.java121
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/examples/FutureApiExample.java127
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/examples/FutureApiNotificationExample.java55
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/examples/L2AclExample.java195
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/examples/LispAdjacencyExample.java125
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/examples/NotificationUtils.java52
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/examples/Readme.txt17
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackApiTest.java33
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/FutureApiTest.java79
-rw-r--r--src/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/Readme.txt18
-rw-r--r--src/vpp-api/java/jvpp-core/jvpp_core.c111
-rw-r--r--src/vpp-api/java/jvpp-gtpu/jvpp_gtpu.c107
-rw-r--r--src/vpp-api/java/jvpp-gtpu/jvpp_gtpu.h42
-rw-r--r--src/vpp-api/java/jvpp-ioamexport/io/fd/vpp/jvpp/ioamexport/examples/IoamExportApiExample.java56
-rw-r--r--src/vpp-api/java/jvpp-ioamexport/io/fd/vpp/jvpp/ioamexport/examples/Readme.txt4
-rw-r--r--src/vpp-api/java/jvpp-ioamexport/io/fd/vpp/jvpp/ioamexport/test/CallbackApiTest.java33
-rw-r--r--src/vpp-api/java/jvpp-ioamexport/io/fd/vpp/jvpp/ioamexport/test/FutureApiTest.java60
-rw-r--r--src/vpp-api/java/jvpp-ioamexport/io/fd/vpp/jvpp/ioamexport/test/Readme.txt4
-rw-r--r--src/vpp-api/java/jvpp-ioamexport/jvpp_ioam_export.c107
-rw-r--r--src/vpp-api/java/jvpp-ioamexport/jvpp_ioam_export.h42
-rw-r--r--src/vpp-api/java/jvpp-ioampot/io/fd/vpp/jvpp/ioampot/examples/IoamPotApiExample.java76
-rw-r--r--src/vpp-api/java/jvpp-ioampot/io/fd/vpp/jvpp/ioampot/examples/Readme.txt4
-rw-r--r--src/vpp-api/java/jvpp-ioampot/io/fd/vpp/jvpp/ioampot/test/CallbackApiTest.java33
-rw-r--r--src/vpp-api/java/jvpp-ioampot/io/fd/vpp/jvpp/ioampot/test/FutureApiTest.java66
-rw-r--r--src/vpp-api/java/jvpp-ioampot/io/fd/vpp/jvpp/ioampot/test/Readme.txt4
-rw-r--r--src/vpp-api/java/jvpp-ioampot/jvpp_ioam_pot.c107
-rw-r--r--src/vpp-api/java/jvpp-ioampot/jvpp_ioam_pot.h42
-rw-r--r--src/vpp-api/java/jvpp-ioamtrace/io/fd/vpp/jvpp/ioamtrace/examples/IoamTraceApiExample.java77
-rw-r--r--src/vpp-api/java/jvpp-ioamtrace/io/fd/vpp/jvpp/ioamtrace/examples/Readme.txt4
-rw-r--r--src/vpp-api/java/jvpp-ioamtrace/io/fd/vpp/jvpp/ioamtrace/test/CallbackApiTest.java33
-rw-r--r--src/vpp-api/java/jvpp-ioamtrace/io/fd/vpp/jvpp/ioamtrace/test/FutureApiTest.java60
-rw-r--r--src/vpp-api/java/jvpp-ioamtrace/io/fd/vpp/jvpp/ioamtrace/test/Readme.txt4
-rw-r--r--src/vpp-api/java/jvpp-ioamtrace/jvpp_ioam_trace.c107
-rw-r--r--src/vpp-api/java/jvpp-ioamtrace/jvpp_ioam_trace.h42
-rw-r--r--src/vpp-api/java/jvpp-nat/io/fd/vpp/jvpp/nat/examples/CallbackApiExample.java68
-rw-r--r--src/vpp-api/java/jvpp-nat/io/fd/vpp/jvpp/nat/examples/Readme.txt1
-rw-r--r--src/vpp-api/java/jvpp-nat/io/fd/vpp/jvpp/nat/test/CallbackApiTest.java33
-rw-r--r--src/vpp-api/java/jvpp-nat/io/fd/vpp/jvpp/nat/test/FutureApiTest.java66
-rw-r--r--src/vpp-api/java/jvpp-nat/io/fd/vpp/jvpp/nat/test/Readme.txt4
-rw-r--r--src/vpp-api/java/jvpp-nat/jvpp_nat.c107
-rw-r--r--src/vpp-api/java/jvpp-nat/jvpp_nat.h42
-rw-r--r--src/vpp-api/java/jvpp-pppoe/jvpp_pppoe.c107
-rw-r--r--src/vpp-api/java/jvpp-pppoe/jvpp_pppoe.h42
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/AbstractCallbackApiTest.java63
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/Assertions.java32
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVpp.java56
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVppRegistry.java76
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVppRegistryImpl.java154
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/NativeLibraryLoader.java73
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppBaseCallException.java79
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppCallbackException.java48
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppConnection.java45
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppInvocationException.java33
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppJNIConnection.java152
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/ControlPingCallback.java29
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/JVppCallback.java29
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/JVppNotificationCallback.java24
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/coverity/SuppressFBWarnings.java40
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/ControlPing.java34
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/ControlPingReply.java58
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppDump.java24
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppNotification.java23
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppReply.java24
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppReplyDump.java25
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppRequest.java34
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/future/AbstractFutureJVppInvoker.java141
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/future/FutureJVppInvoker.java49
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/notification/NotificationRegistry.java25
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/notification/NotificationRegistryProvider.java28
-rw-r--r--src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/test/ConnectionTest.java44
-rw-r--r--src/vpp-api/java/jvpp-registry/jvpp_registry.c402
-rwxr-xr-xsrc/vpp-api/java/jvpp/gen/jvpp_gen.py189
-rw-r--r--src/vpp-api/java/jvpp/gen/jvppgen/__init__.py0
-rw-r--r--src/vpp-api/java/jvpp/gen/jvppgen/callback_gen.py105
-rw-r--r--src/vpp-api/java/jvpp/gen/jvppgen/dto_gen.py310
-rw-r--r--src/vpp-api/java/jvpp/gen/jvppgen/jni_gen.py303
-rw-r--r--src/vpp-api/java/jvpp/gen/jvppgen/jvpp_c_gen.py392
-rw-r--r--src/vpp-api/java/jvpp/gen/jvppgen/jvpp_callback_facade_gen.py326
-rw-r--r--src/vpp-api/java/jvpp/gen/jvppgen/jvpp_future_facade_gen.py331
-rw-r--r--src/vpp-api/java/jvpp/gen/jvppgen/jvpp_impl_gen.py219
-rw-r--r--src/vpp-api/java/jvpp/gen/jvppgen/notification_gen.py199
-rw-r--r--src/vpp-api/java/jvpp/gen/jvppgen/types_gen.py232
-rw-r--r--src/vpp-api/java/jvpp/gen/jvppgen/util.py212
-rw-r--r--src/vpp-api/lua/README.md50
-rw-r--r--src/vpp-api/lua/bench.lua70
-rw-r--r--src/vpp-api/lua/examples/cli/README.md5
-rw-r--r--src/vpp-api/lua/examples/cli/lua-cli.lua747
-rw-r--r--src/vpp-api/lua/examples/example-acl-plugin.lua110
-rw-r--r--src/vpp-api/lua/examples/example-classifier.lua51
-rw-r--r--src/vpp-api/lua/examples/example-cli.lua44
-rw-r--r--src/vpp-api/lua/examples/lute/README.md66
-rw-r--r--src/vpp-api/lua/examples/lute/lute.lua777
-rw-r--r--src/vpp-api/lua/examples/lute/script-inout-acl-noacl.lute329
-rw-r--r--src/vpp-api/lua/examples/lute/script-inout-acl-old.lute329
-rw-r--r--src/vpp-api/lua/examples/lute/script-inout-acl.lute329
-rw-r--r--src/vpp-api/lua/examples/lute/script.lute7
-rw-r--r--src/vpp-api/lua/examples/lute/sessions-acl.lute308
-rw-r--r--src/vpp-api/lua/vpp-lapi.lua989
-rw-r--r--src/vpp-api/python/LICENSE.txt202
-rw-r--r--src/vpp-api/python/Makefile.am23
-rw-r--r--src/vpp-api/python/README.rst0
-rw-r--r--src/vpp-api/python/setup.cfg5
-rw-r--r--src/vpp-api/python/setup.py33
-rwxr-xr-xsrc/vpp-api/python/tests/test_cli.py52
-rwxr-xr-xsrc/vpp-api/python/tests/test_modules.py18
-rwxr-xr-xsrc/vpp-api/python/tests/test_papi.py119
-rwxr-xr-xsrc/vpp-api/python/tests/test_version.py35
-rwxr-xr-xsrc/vpp-api/python/tests/test_vpp_papi2.py487
-rw-r--r--src/vpp-api/python/vpp_papi.py706
-rw-r--r--src/vpp-api/vapi/Makefile.am74
-rw-r--r--src/vpp-api/vapi/libvapiclient.map44
-rw-r--r--src/vpp-api/vapi/vapi.c933
-rw-r--r--src/vpp-api/vapi/vapi.h263
-rw-r--r--src/vpp-api/vapi/vapi.hpp905
-rwxr-xr-xsrc/vpp-api/vapi/vapi_c_gen.py693
-rw-r--r--src/vpp-api/vapi/vapi_common.h61
-rwxr-xr-xsrc/vpp-api/vapi/vapi_cpp_gen.py263
-rw-r--r--src/vpp-api/vapi/vapi_dbg.h77
-rw-r--r--src/vpp-api/vapi/vapi_doc.md155
-rw-r--r--src/vpp-api/vapi/vapi_internal.h138
-rw-r--r--src/vpp-api/vapi/vapi_json_parser.py305
-rw-r--r--src/vpp.am142
-rw-r--r--src/vpp/api/api.c2468
l---------src/vpp/api/api_format.c1
-rw-r--r--src/vpp/api/api_main.c250
-rw-r--r--src/vpp/api/custom_dump.c3231
-rw-r--r--src/vpp/api/gmon.c306
-rw-r--r--src/vpp/api/json_format.c304
-rw-r--r--src/vpp/api/json_format.h254
-rw-r--r--src/vpp/api/plugin.c201
-rw-r--r--src/vpp/api/plugin.h61
-rw-r--r--src/vpp/api/summary_stats_client.c302
-rw-r--r--src/vpp/api/test_client.c1526
-rw-r--r--src/vpp/api/test_ha.c249
l---------src/vpp/api/vat.h1
-rw-r--r--src/vpp/api/vpe.api936
-rw-r--r--src/vpp/api/vpe_all_api_h.h40
-rw-r--r--src/vpp/api/vpe_msg_enum.h37
-rw-r--r--src/vpp/api/vpp_get_metrics.c253
-rw-r--r--src/vpp/app/sticky_hash.c581
-rw-r--r--src/vpp/app/version.c92
-rw-r--r--src/vpp/app/vpe_cli.c136
-rw-r--r--src/vpp/app/vppctl.c384
-rw-r--r--src/vpp/conf/80-vpp.conf15
-rw-r--r--src/vpp/conf/startup.conf133
-rw-r--r--src/vpp/oam/oam.c644
-rw-r--r--src/vpp/oam/oam.h96
-rw-r--r--src/vpp/stats/stats.api265
-rw-r--r--src/vpp/stats/stats.c2410
-rw-r--r--src/vpp/stats/stats.h200
-rw-r--r--src/vpp/stats/stats.reg42
-rw-r--r--src/vpp/vnet/main.c367
-rw-r--r--src/vppapigen.am29
-rw-r--r--src/vppinfra.am308
-rw-r--r--src/vppinfra/README43
-rw-r--r--src/vppinfra/anneal.c172
-rw-r--r--src/vppinfra/anneal.h89
-rw-r--r--src/vppinfra/asm_mips.h351
-rw-r--r--src/vppinfra/asm_x86.c1947
-rw-r--r--src/vppinfra/asm_x86.h125
-rw-r--r--src/vppinfra/backtrace.c267
-rw-r--r--src/vppinfra/bihash_16_8.h84
-rw-r--r--src/vppinfra/bihash_24_8.h85
-rw-r--r--src/vppinfra/bihash_40_8.h87
-rw-r--r--src/vppinfra/bihash_48_8.h89
-rw-r--r--src/vppinfra/bihash_8_8.h99
-rw-r--r--src/vppinfra/bihash_doc.h149
-rw-r--r--src/vppinfra/bihash_template.c624
-rw-r--r--src/vppinfra/bihash_template.h419
-rw-r--r--src/vppinfra/bitmap.h774
-rw-r--r--src/vppinfra/bitops.h179
-rw-r--r--src/vppinfra/byte_order.h202
-rw-r--r--src/vppinfra/cache.h104
-rw-r--r--src/vppinfra/clib.h365
-rw-r--r--src/vppinfra/clib_error.h35
-rw-r--r--src/vppinfra/cpu.c133
-rw-r--r--src/vppinfra/cpu.h112
-rw-r--r--src/vppinfra/crc32.h84
-rw-r--r--src/vppinfra/dir.dox19
-rw-r--r--src/vppinfra/dlist.h156
-rw-r--r--src/vppinfra/elf.c2040
-rw-r--r--src/vppinfra/elf.h1062
-rw-r--r--src/vppinfra/elf_clib.c377
-rw-r--r--src/vppinfra/elf_clib.h144
-rw-r--r--src/vppinfra/elog.c1113
-rw-r--r--src/vppinfra/elog.h567
-rw-r--r--src/vppinfra/error.c292
-rw-r--r--src/vppinfra/error.h199
-rw-r--r--src/vppinfra/error_bootstrap.h106
-rw-r--r--src/vppinfra/fheap.c473
-rw-r--r--src/vppinfra/fheap.h140
-rw-r--r--src/vppinfra/fifo.c137
-rw-r--r--src/vppinfra/fifo.h304
-rw-r--r--src/vppinfra/file.h134
-rw-r--r--src/vppinfra/format.c819
-rw-r--r--src/vppinfra/format.h334
-rw-r--r--src/vppinfra/graph.c182
-rw-r--r--src/vppinfra/graph.h127
-rw-r--r--src/vppinfra/hash.c1095
-rw-r--r--src/vppinfra/hash.h694
-rw-r--r--src/vppinfra/heap.c828
-rw-r--r--src/vppinfra/heap.h357
-rw-r--r--src/vppinfra/linux/mem.c266
-rw-r--r--src/vppinfra/linux/syscall.h56
-rw-r--r--src/vppinfra/linux/sysfs.c250
-rw-r--r--src/vppinfra/linux/sysfs.h46
-rw-r--r--src/vppinfra/lock.h99
-rw-r--r--src/vppinfra/longjmp.S690
-rw-r--r--src/vppinfra/longjmp.h124
-rw-r--r--src/vppinfra/macros.c266
-rw-r--r--src/vppinfra/macros.h54
-rw-r--r--src/vppinfra/math.h71
-rw-r--r--src/vppinfra/md5.c317
-rw-r--r--src/vppinfra/md5.h57
-rw-r--r--src/vppinfra/mem.h365
-rw-r--r--src/vppinfra/mem_mheap.c165
-rw-r--r--src/vppinfra/memcheck.h317
-rw-r--r--src/vppinfra/memcpy_avx.h296
-rw-r--r--src/vppinfra/memcpy_sse3.h356
-rw-r--r--src/vppinfra/mhash.c408
-rw-r--r--src/vppinfra/mhash.h179
-rw-r--r--src/vppinfra/mheap.c1643
-rw-r--r--src/vppinfra/mheap.h94
-rw-r--r--src/vppinfra/mheap_bootstrap.h374
-rw-r--r--src/vppinfra/mod_test_hash.c27
-rw-r--r--src/vppinfra/os.h88
-rw-r--r--src/vppinfra/pfhash.c689
-rw-r--r--src/vppinfra/pfhash.h276
-rw-r--r--src/vppinfra/phash.c1017
-rw-r--r--src/vppinfra/phash.h194
-rw-r--r--src/vppinfra/pipeline.h176
-rw-r--r--src/vppinfra/pool.c131
-rw-r--r--src/vppinfra/pool.h519
-rw-r--r--src/vppinfra/ptclosure.c125
-rw-r--r--src/vppinfra/ptclosure.h40
-rw-r--r--src/vppinfra/qhash.c858
-rw-r--r--src/vppinfra/qhash.h169
-rw-r--r--src/vppinfra/qsort.c269
-rw-r--r--src/vppinfra/random.c51
-rw-r--r--src/vppinfra/random.h178
-rw-r--r--src/vppinfra/random_buffer.c86
-rw-r--r--src/vppinfra/random_buffer.h118
-rw-r--r--src/vppinfra/random_isaac.c434
-rw-r--r--src/vppinfra/random_isaac.h81
-rw-r--r--src/vppinfra/serialize.c1254
-rw-r--r--src/vppinfra/serialize.h443
-rw-r--r--src/vppinfra/slist.c336
-rw-r--r--src/vppinfra/slist.h145
-rw-r--r--src/vppinfra/smp.c325
-rw-r--r--src/vppinfra/smp.h81
-rw-r--r--src/vppinfra/smp_fifo.c91
-rw-r--r--src/vppinfra/smp_fifo.h313
-rw-r--r--src/vppinfra/socket.c559
-rw-r--r--src/vppinfra/socket.h192
-rw-r--r--src/vppinfra/sparse_vec.h244
-rw-r--r--src/vppinfra/std-formats.c330
-rw-r--r--src/vppinfra/string.c94
-rw-r--r--src/vppinfra/string.h83
-rw-r--r--src/vppinfra/test_bihash_template.c369
-rw-r--r--src/vppinfra/test_dlist.c193
-rw-r--r--src/vppinfra/test_elf.c217
-rw-r--r--src/vppinfra/test_elog.c315
-rw-r--r--src/vppinfra/test_fifo.c144
-rw-r--r--src/vppinfra/test_format.c199
-rw-r--r--src/vppinfra/test_fpool.c69
-rw-r--r--src/vppinfra/test_hash.c458
-rw-r--r--src/vppinfra/test_heap.c198
-rw-r--r--src/vppinfra/test_longjmp.c129
-rw-r--r--src/vppinfra/test_macros.c64
-rw-r--r--src/vppinfra/test_md5.c141
-rw-r--r--src/vppinfra/test_mheap.c242
-rw-r--r--src/vppinfra/test_pfhash.c322
-rw-r--r--src/vppinfra/test_phash.c149
-rw-r--r--src/vppinfra/test_pool.c86
-rw-r--r--src/vppinfra/test_pool_iterate.c59
-rw-r--r--src/vppinfra/test_ptclosure.c212
-rw-r--r--src/vppinfra/test_qhash.c333
-rw-r--r--src/vppinfra/test_random.c148
-rw-r--r--src/vppinfra/test_random_isaac.c142
-rw-r--r--src/vppinfra/test_serialize.c274
-rw-r--r--src/vppinfra/test_slist.c228
-rw-r--r--src/vppinfra/test_socket.c134
-rw-r--r--src/vppinfra/test_time.c104
-rw-r--r--src/vppinfra/test_timing_wheel.c389
-rw-r--r--src/vppinfra/test_tw_timer.c1275
-rw-r--r--src/vppinfra/test_vec.c1159
-rw-r--r--src/vppinfra/test_vec.h243
-rw-r--r--src/vppinfra/test_vhash.c757
-rw-r--r--src/vppinfra/test_zvec.c117
-rw-r--r--src/vppinfra/time.c232
-rw-r--r--src/vppinfra/time.h312
-rw-r--r--src/vppinfra/timer.c322
-rw-r--r--src/vppinfra/timer.h46
-rw-r--r--src/vppinfra/timing_wheel.c759
-rw-r--r--src/vppinfra/timing_wheel.h155
-rw-r--r--src/vppinfra/tw_timer_16t_1w_2048sl.c26
-rw-r--r--src/vppinfra/tw_timer_16t_1w_2048sl.h52
-rw-r--r--src/vppinfra/tw_timer_16t_2w_512sl.c26
-rw-r--r--src/vppinfra/tw_timer_16t_2w_512sl.h52
-rw-r--r--src/vppinfra/tw_timer_1t_3w_1024sl_ov.c26
-rw-r--r--src/vppinfra/tw_timer_1t_3w_1024sl_ov.h53
-rw-r--r--src/vppinfra/tw_timer_2t_1w_2048sl.c26
-rw-r--r--src/vppinfra/tw_timer_2t_1w_2048sl.h52
-rw-r--r--src/vppinfra/tw_timer_4t_3w_256sl.c26
-rw-r--r--src/vppinfra/tw_timer_4t_3w_256sl.h52
-rw-r--r--src/vppinfra/tw_timer_4t_3w_4sl_ov.c32
-rw-r--r--src/vppinfra/tw_timer_4t_3w_4sl_ov.h53
-rw-r--r--src/vppinfra/tw_timer_template.c832
-rw-r--r--src/vppinfra/tw_timer_template.h267
-rw-r--r--src/vppinfra/types.h174
-rw-r--r--src/vppinfra/unformat.c1083
-rw-r--r--src/vppinfra/unix-formats.c956
-rw-r--r--src/vppinfra/unix-kelog.c415
-rw-r--r--src/vppinfra/unix-misc.c237
-rw-r--r--src/vppinfra/unix.h64
-rw-r--r--src/vppinfra/unix_error.def145
-rw-r--r--src/vppinfra/valgrind.h4030
-rw-r--r--src/vppinfra/vec.c171
-rw-r--r--src/vppinfra/vec.h1009
-rw-r--r--src/vppinfra/vec_bootstrap.h201
-rw-r--r--src/vppinfra/vector.c54
-rw-r--r--src/vppinfra/vector.h268
-rw-r--r--src/vppinfra/vector_altivec.h178
-rw-r--r--src/vppinfra/vector_funcs.h334
-rw-r--r--src/vppinfra/vector_iwmmxt.h149
-rw-r--r--src/vppinfra/vector_neon.h71
-rw-r--r--src/vppinfra/vector_sse2.h705
-rw-r--r--src/vppinfra/vhash.c772
-rw-r--r--src/vppinfra/vhash.h850
-rw-r--r--src/vppinfra/xxhash.h86
-rw-r--r--src/vppinfra/xy.h56
-rw-r--r--src/vppinfra/zvec.c442
-rw-r--r--src/vppinfra/zvec.h166
-rw-r--r--test/Makefile241
-rw-r--r--test/bfd.py459
-rw-r--r--test/debug.py23
-rwxr-xr-xtest/discover_tests.py57
-rw-r--r--test/doc/Makefile243
-rw-r--r--test/doc/conf.py342
-rw-r--r--test/doc/index.rst11
-rw-r--r--test/doc/indices.rst6
-rw-r--r--test/doc/overview.rst418
-rw-r--r--test/ext/Makefile31
-rw-r--r--test/ext/fake.api.json35
-rw-r--r--test/ext/vapi_c_test.c1168
-rw-r--r--test/ext/vapi_cpp_test.cpp591
-rw-r--r--test/framework.py1017
-rw-r--r--test/hook.py212
-rw-r--r--test/ipfix.py539
-rw-r--r--test/lisp.py326
-rw-r--r--test/log.py73
-rw-r--r--test/patches/scapy-2.3.3/dhcp6-options.patch58
-rw-r--r--test/patches/scapy-2.3.3/gre-layers.patch25
-rw-r--r--test/patches/scapy-2.3.3/inet6.py.patch185
-rw-r--r--test/patches/scapy-2.3.3/mpls.py.patch18
-rw-r--r--test/run_tests.py125
-rw-r--r--test/sanity_import_vpp_papi.py4
-rw-r--r--test/sanity_run_vpp.py32
-rw-r--r--test/scapy_handlers/__init__.py0
-rwxr-xr-xtest/scripts/compress_failed.sh37
-rwxr-xr-xtest/scripts/git_pull_or_clean.sh8
-rwxr-xr-xtest/scripts/run_in_venv_with_cleanup.sh39
-rwxr-xr-xtest/scripts/setsid_wrapper.sh12
-rwxr-xr-xtest/scripts/socket_test.sh855
-rwxr-xr-xtest/scripts/test-loop.sh123
-rw-r--r--test/template_bd.py158
-rw-r--r--test/test_acl_plugin.py1313
-rw-r--r--test/test_acl_plugin_conns.py403
-rw-r--r--test/test_acl_plugin_l2l3.py686
-rw-r--r--test/test_acl_plugin_macip.py961
-rw-r--r--test/test_bfd.py2591
-rw-r--r--test/test_classifier.py385
-rw-r--r--test/test_dhcp.py1209
-rw-r--r--test/test_fib.py30
-rw-r--r--test/test_flowprobe.py1021
-rw-r--r--test/test_gre.py814
-rw-r--r--test/test_gtpu.py289
-rw-r--r--test/test_interface_crud.py151
-rw-r--r--test/test_ip4.py1013
-rw-r--r--test/test_ip4_irb.py263
-rw-r--r--test/test_ip4_vrf_multi_instance.py414
-rw-r--r--test/test_ip6.py1510
-rw-r--r--test/test_ip6_vrf_multi_instance.py446
-rw-r--r--test/test_ip_mcast.py760
-rw-r--r--test/test_jvpp.py135
-rw-r--r--test/test_l2_fib.py542
-rw-r--r--test/test_l2bd.py285
-rw-r--r--test/test_l2bd_arp_term.py492
-rw-r--r--test/test_l2bd_multi_instance.py479
-rw-r--r--test/test_l2xc.py226
-rw-r--r--test/test_l2xc_multi_instance.py348
-rw-r--r--test/test_lb.py216
-rw-r--r--test/test_lisp.py166
-rw-r--r--test/test_map.py173
-rw-r--r--test/test_mpls.py1771
-rw-r--r--test/test_nat.py3846
-rw-r--r--test/test_neighbor.py1147
-rw-r--r--test/test_p2p_ethernet.py538
-rw-r--r--test/test_papi.py31
-rw-r--r--test/test_ping.py118
-rw-r--r--test/test_pppoe.py606
-rw-r--r--test/test_span.py481
-rw-r--r--test/test_srv6.py1997
-rw-r--r--test/test_vapi.py106
-rw-r--r--test/test_vtr.py332
-rw-r--r--test/test_vxlan.py234
-rw-r--r--test/test_vxlan_gpe.py313
-rw-r--r--test/util.py231
-rw-r--r--test/vpp_gre_interface.py71
-rw-r--r--test/vpp_interface.py374
-rw-r--r--test/vpp_ip_route.py529
-rw-r--r--test/vpp_lo_interface.py35
-rw-r--r--test/vpp_mpls_tunnel_interface.py48
-rw-r--r--test/vpp_neighbor.py79
-rw-r--r--test/vpp_object.py87
-rw-r--r--test/vpp_papi_provider.py2390
-rw-r--r--test/vpp_pg_interface.py481
-rw-r--r--test/vpp_pppoe_interface.py79
-rw-r--r--test/vpp_srv6.py238
-rw-r--r--test/vpp_sub_interface.py213
1770 files changed, 627661 insertions, 0 deletions
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..977ed2d
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,38 @@
+---
+AlignEscapedNewlinesLeft: true
+AlignTrailingComments: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: false
+AlwaysBreakBeforeMultilineStrings: false
+BreakBeforeBinaryOperators: false
+BreakBeforeTernaryOperators: true
+BinPackParameters: true
+BreakBeforeBraces: GNU
+ColumnLimit: 79
+IndentCaseLabels: false
+MaxEmptyLinesToKeep: 1
+PenaltyBreakBeforeFirstCallParameter: 19
+PenaltyBreakComment: 60
+PenaltyBreakString: 1000
+PenaltyBreakFirstLessLess: 120
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 60
+PointerBindsToType: false
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeParens: Always
+SpacesBeforeTrailingComments: 1
+SpacesInParentheses: false
+SpaceInEmptyParentheses: false
+SpacesInCStyleCastParentheses: false
+SpaceAfterControlStatementKeyword: true
+Cpp11BracedListStyle: true
+Standard: Cpp11
+SortIncludes: false
+IndentWidth: 2
+TabWidth: 4
+UseTab: Never
+IndentFunctionDeclarationAfterType: false
+ContinuationIndentWidth: 4
+...
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5a6266d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,99 @@
+*~
+*.sw[op]
+
+/build-root/.ccache
+/build-root/build-*/
+/build-root/install-*/
+/build-root/tools
+/build-root/dpdk-includes/
+/build-root/packages-vpp/
+/build-root/path_setup
+/build-root/build-config.mk
+/build-root/deb/debian/vpp-plugins/
+/build-root/deb/.pybuild/
+/build-root/*.deb
+/build-root/*.rpm
+/build-root/*.changes
+/build-root/test-doc/
+/build-root/test-cov/
+/build-root/python/
+/build-root/vapi_test/
+/build-config.mk
+/dpdk/*.tar.gz
+/dpdk/*.tar.xz
+/dpdk/vpp-dpdk*.deb
+/dpdk/vpp-dpdk*.changes
+/path_setup
+/tools/
+# start autotools ignore
+autom4te.cache/
+config/
+Makefile
+Makefile.in
+aclocal.m4
+app.info
+compile
+config.h
+config.h.in
+config.log
+config.guess
+config.sub
+config.status
+configure
+configure.scan
+coverage_report
+depcomp
+install-sh
+libtool
+m4
+missing
+stamp-h1
+ltmain.sh
+ylwrap
+test-driver
+
+*.iml
+.bootstrap.ok
+.settings
+.autotools
+# stop autotools ignore
+
+# OSX and some IDE
+.DS_Store
+.idea/
+.project
+.cproject
+.vscode/
+
+# cscope and ctags
+/cscope.*
+/tags
+ID
+TAGS
+# ggtags
+GPATH
+GRTAGS
+GTAGS
+# Generated documentation
+/build-root/docs
+/build-root/.doxygen-bootstrap.ok
+/build-root/.doxygen-siphon.dep
+
+# indent backup files
+*.BAK
+
+# Python bytecode
+*.pyc
+
+# Python api generator
+/src/vpp-api/python/build
+/src/vpp-api/python/dist
+/src/vpp-api/python/vpp_papi.egg-info
+/src/vpp-api/python/vpp_papi/memclnt.py
+/src/vpp-api/python/vpp_papi/vpe.py
+
+# Build files in the test directory
+/test/*.ok
+
+# vppctl command list
+/src/scripts/vppctl-cmd-list
diff --git a/.gitreview b/.gitreview
new file mode 100644
index 0000000..6ae300e
--- /dev/null
+++ b/.gitreview
@@ -0,0 +1,5 @@
+[gerrit]
+host=gerrit.fd.io
+port=29418
+project=vpp
+defaultbranch=stable/1710
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..7a4a3ea
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. \ No newline at end of file
diff --git a/MAINTAINERS b/MAINTAINERS
new file mode 100644
index 0000000..31bc082
--- /dev/null
+++ b/MAINTAINERS
@@ -0,0 +1,188 @@
+Descriptions of section entries:
+
+ M: Maintainer Full name and E-mail address: Full Name <address@domain>
+ One maintainer per line. Multiple M: lines acceptable.
+ F: Files and directories with wildcard patterns.
+ A trailing slash includes all files and subdirectory files.
+ F: drivers/net/ all files in and below drivers/net
+ F: drivers/net/* all files in drivers/net, but not below
+ One pattern per line. Multiple F: lines acceptable.
+ C: Single line comment related to current section.
+
+ -----------------------------------
+
+Build System
+M: Damjan Marion <damarion@cisco.com>
+F: Makefile
+F: src/*.ac
+F: src/*.am
+F: src/*.mk
+F: src/m4/
+
+Build System Internal
+M: Dave Barach <dave@barachs.net>
+F: build-root/Makefile
+F: build-data/*
+
+Doxygen
+M: Chris Luke <chrisy@flirble.org>
+F: doxygen/
+
+DPDK Development Packaging
+M: Damjan Marion <damarion@cisco.com>
+F: dpdk/
+F: dpdk/*
+
+Infrastructure Library
+M: Dave Barach <dave@barachs.net>
+F: src/vppinfra/
+
+VLIB Library
+M: Dave Barach <dave@barachs.net>
+M: Damjan Marion <damarion@cisco.com>
+F: src/vlib/
+
+VLIB API Libraries
+M: Dave Barach <dave@barachs.net>
+F: src/vlibapi/
+F: src/vlibmemory/
+F: src/vlibsocket/
+
+VNET Bidirectonal Forwarding Detection (BFD)
+M: Klement Sekera <ksekera@cisco.com>
+F: src/vnet/bfd/
+
+VNET Device Drivers
+M: Damjan Marion <damarion@cisco.com>
+F: src/vnet/devices/
+
+VNET Device Drivers - DPDK Crypto
+M: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
+F: src/devices/dpdk/ipsec/
+
+VNET Feature Arcs
+M: Dave Barach <dave@barachs.net>
+M: Damjan Marion <damarion@cisco.com>
+F: src/vnet/feature/
+
+VNET FIB
+M: Neale Ranns <nranns@cisco.com>
+F: src/vnet/fib/
+F: src/vnet/mfib/
+F: src/vnet/dpo
+F: src/vnet/adj
+
+VNET IPv4 and IPv6 LPM
+M: Dave Barach <dave@barachs.net>
+F: src/vnet/ip/
+
+VNET Segment Routing (IPv6 and MPLS)
+M: Pablo Camarillo <pcamaril@cisco.com>
+F: src/vnet/srv6/
+F: src/vnet/srmpls/
+F: src/examples/srv6-sample-localsid/
+
+VNET IPSec
+M: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
+M: Matus Fabian <matfabia@cisco.com>
+F: src/vnet/ipsec/
+
+VNET L2
+M: John Lo <loj@cisco.com>
+F: src/vnet/l2/
+
+VNET Link Layer Discovery Protocol (LLDP)
+M: Klement Sekera <ksekera@cisco.com>
+F: src/vnet/lldp/
+
+VNET LISP
+M: Florin Coras <fcoras@cisco.com>
+F: src/vnet/lisp-cp/
+F: src/vnet/lisp-gpe/
+
+VNET MAP
+M: Ole Troan <ot@cisco.com>
+F: src/vnet/map
+
+VNET MPLS
+M: Neale Ranns <nranns@cisco.com>
+F: src/vnet/mpls/
+
+VNET Host Stack Session Layer
+M: Florin Coras <fcoras@cisco.com>
+F: src/vnet/session
+
+VNET TCP Stack
+M: Florin Coras <fcoras@cisco.com>
+F: src/vnet/tcp
+
+VNET VXLAN
+M: John Lo <loj@cisco.com>
+F: src/vnet/vxlan/
+
+VNET VXLAN-GPE
+M: Keith Burns <alagalah@gmail.com>
+M: Hongjun Ni <hongjun.ni@intel.com>
+F: src/vnet/vxlan-gpe/
+
+Plugin - ACL
+M: Andrew Yourtchenko <ayourtch@gmail.com>
+F: src/plugins/acl/
+F: src/plugins/acl.am
+
+Plugin - flowprobe
+M: Ole Troan <otroan@employees.org>
+F: src/plugins/flowprobe/
+F: src/plugins/flowprobe.am
+
+Plugin - SIXRD
+M: Ole Troan <ot@cisco.com>
+F: src/plugins/sixrd/
+F: src/plugins/sixrd.am
+
+Plugin - GTPU
+M: Hongjun Ni <hongjun.ni@intel.com>
+F: src/plugins/gtpu/
+F: src/plugins/gtpu.am
+
+Plugin - PPPoE
+M: Hongjun Ni <hongjun.ni@intel.com>
+F: src/plugins/pppoe/
+F: src/plugins/pppoe.am
+
+Test Infrastructure
+M: Klement Sekera <ksekera@cisco.com>
+F: test/
+
+SVM Library
+M: Dave Barach <dave@barachs.net>
+F: src/svm
+
+VPP API TEST
+M: Dave Barach <dave@barachs.net>
+F: src/vat/
+
+VPP Executable
+M: Dave Barach <dave@barachs.net>
+F: src/vpp/
+
+Graphical Event Viewer
+M: Dave Barach <dave@barachs.net>
+F: src/tools/g2/
+
+Performance Tooling
+M: Dave Barach <dave@barachs.net>
+F: src/tools/perftool/
+
+Binary API Compiler
+M: Dave Barach <dave@barachs.net>
+F: src/tools/vppapigen/
+
+Ganglia Telemetry Module
+M: Dave Barach <dave@barachs.net>
+F: gmod/
+
+THE REST
+C: Contact vpp-dev Mailing List <vpp-dev@fd.io>
+F: *
+F: */
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..021e213
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,516 @@
+# Copyright (c) 2016 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+export WS_ROOT=$(CURDIR)
+export BR=$(WS_ROOT)/build-root
+CCACHE_DIR?=$(BR)/.ccache
+GDB?=gdb
+PLATFORM?=vpp
+SAMPLE_PLUGIN?=no
+export AESNI?=y
+
+,:=,
+define disable_plugins
+$(if $(1), \
+ "plugins {" \
+ $(patsubst %,"plugin %_plugin.so { disable }",$(subst $(,), ,$(1))) \
+ " }" \
+ ,)
+endef
+
+MINIMAL_STARTUP_CONF=" \
+unix { \
+ interactive \
+ cli-listen /run/vpp/cli.sock \
+ gid $(shell id -g) \
+ $(if $(wildcard startup.vpp),"exec startup.vpp",) \
+} \
+$(if $(DPDK_CONFIG), "dpdk { $(DPDK_CONFIG) }",) \
+$(call disable_plugins,$(DISABLED_PLUGINS)) \
+"
+
+GDB_ARGS= -ex "handle SIGUSR1 noprint nostop"
+
+#
+# OS Detection
+#
+# We allow Darwin (MacOS) for docs generation; VPP build will still fail.
+ifneq ($(shell uname),Darwin)
+OS_ID = $(shell grep '^ID=' /etc/os-release | cut -f2- -d= | sed -e 's/\"//g')
+OS_VERSION_ID= $(shell grep '^VERSION_ID=' /etc/os-release | cut -f2- -d= | sed -e 's/\"//g')
+endif
+
+ifeq ($(filter ubuntu debian,$(OS_ID)),$(OS_ID))
+PKG=deb
+else ifeq ($(filter rhel centos fedora opensuse,$(OS_ID)),$(OS_ID))
+PKG=rpm
+endif
+
+# +libganglia1-dev if building the gmond plugin
+
+DEB_DEPENDS = curl build-essential autoconf automake bison ccache
+DEB_DEPENDS += debhelper dkms git libtool libapr1-dev dh-systemd
+DEB_DEPENDS += libconfuse-dev git-review exuberant-ctags cscope pkg-config
+DEB_DEPENDS += lcov chrpath autoconf nasm indent libnuma-dev
+DEB_DEPENDS += python-all python-dev python-virtualenv python-pip libffi6 check
+ifeq ($(OS_VERSION_ID),14.04)
+ DEB_DEPENDS += openjdk-8-jdk-headless
+ DEB_DEPENDS += libssl-dev
+else ifeq ($(OS_ID)-$(OS_VERSION_ID),debian-8)
+ DEB_DEPENDS += openjdk-8-jdk-headless
+ DEB_DEPENDS += libssl-dev
+ APT_ARGS = -t jessie-backports
+else ifeq ($(OS_ID)-$(OS_VERSION_ID),debian-9)
+ DEB_DEPENDS += default-jdk-headless
+ DEB_DEPENDS += libssl1.0-dev
+else
+ DEB_DEPENDS += default-jdk-headless
+ DEB_DEPENDS += libssl-dev
+endif
+
+RPM_DEPENDS = redhat-lsb glibc-static java-1.8.0-openjdk-devel yum-utils
+RPM_DEPENDS += apr-devel
+RPM_DEPENDS += numactl-devel
+RPM_DEPENDS += check check-devel
+
+ifeq ($(OS_ID)-$(OS_VERSION_ID),fedora-25)
+ RPM_DEPENDS += subunit subunit-devel
+ RPM_DEPENDS += openssl-devel
+ RPM_DEPENDS += python-devel
+ RPM_DEPENDS += python2-virtualenv
+ RPM_DEPENDS_GROUPS = 'C Development Tools and Libraries'
+else ifeq ($(shell if [ "$(OS_ID)" = "fedora" ]; then test $(OS_VERSION_ID) -gt 25; echo $$?; fi),0)
+ RPM_DEPENDS += subunit subunit-devel
+ RPM_DEPENDS += compat-openssl10-devel
+ RPM_DEPENDS += python2-devel
+ RPM_DEPENDS += python2-virtualenv
+ RPM_DEPENDS_GROUPS = 'C Development Tools and Libraries'
+else
+ RPM_DEPENDS += openssl-devel
+ RPM_DEPENDS += python-devel
+ RPM_DEPENDS += python-virtualenv
+ RPM_DEPENDS_GROUPS = 'Development Tools'
+endif
+
+# +ganglia-devel if building the ganglia plugin
+
+RPM_DEPENDS += chrpath libffi-devel rpm-build
+ifeq ($(OS_ID),fedora)
+ RPM_DEPENDS += nasm
+else ifeq ($(findstring y,$(AESNI)),y)
+ RPM_DEPENDS += https://kojipkgs.fedoraproject.org//packages/nasm/2.12.02/2.fc26/x86_64/nasm-2.12.02-2.fc26.x86_64.rpm
+endif
+
+RPM_SUSE_DEPENDS = autoconf automake bison ccache chrpath distribution-release gcc6 glibc-devel-static
+RPM_SUSE_DEPENDS += java-1_8_0-openjdk-devel libopenssl-devel libtool make openssl-devel
+RPM_SUSE_DEPENDS += python-devel python-pip python-rpm-macros shadow nasm libnuma-devel
+
+ifneq ($(wildcard $(STARTUP_DIR)/startup.conf),)
+ STARTUP_CONF ?= $(STARTUP_DIR)/startup.conf
+endif
+
+ifeq ($(findstring y,$(UNATTENDED)),y)
+CONFIRM=-y
+FORCE=--force-yes
+endif
+
+TARGETS = vpp
+
+ifneq ($(SAMPLE_PLUGIN),no)
+TARGETS += sample-plugin
+endif
+
+.PHONY: help bootstrap wipe wipe-release build build-release rebuild rebuild-release
+.PHONY: run run-release debug debug-release build-vat run-vat pkg-deb pkg-rpm
+.PHONY: ctags cscope
+.PHONY: test test-debug retest retest-debug test-doc test-wipe-doc test-help test-wipe
+.PHONY: test-cov test-wipe-cov
+
+help:
+ @echo "Make Targets:"
+ @echo " bootstrap - prepare tree for build"
+ @echo " install-dep - install software dependencies"
+ @echo " wipe - wipe all products of debug build "
+ @echo " wipe-release - wipe all products of release build "
+ @echo " build - build debug binaries"
+ @echo " build-release - build release binaries"
+ @echo " build-coverity - build coverity artifacts"
+ @echo " rebuild - wipe and build debug binares"
+ @echo " rebuild-release - wipe and build release binares"
+ @echo " run - run debug binary"
+ @echo " run-release - run release binary"
+ @echo " debug - run debug binary with debugger"
+ @echo " debug-release - run release binary with debugger"
+ @echo " test - build and run (basic) functional tests"
+ @echo " test-debug - build and run (basic) functional tests (debug build)"
+ @echo " test-all - build and run (all) functional tests"
+ @echo " test-all-debug - build and run (all) functional tests (debug build)"
+ @echo " test-shell - enter shell with test environment"
+ @echo " test-shell-debug - enter shell with test environment (debug build)"
+ @echo " test-wipe - wipe files generated by unit tests"
+ @echo " retest - run functional tests"
+ @echo " retest-debug - run functional tests (debug build)"
+ @echo " test-help - show help on test framework"
+ @echo " run-vat - run vpp-api-test tool"
+ @echo " pkg-deb - build DEB packages"
+ @echo " pkg-rpm - build RPM packages"
+ @echo " dpdk-install-dev - install DPDK development packages"
+ @echo " ctags - (re)generate ctags database"
+ @echo " gtags - (re)generate gtags database"
+ @echo " cscope - (re)generate cscope database"
+ @echo " checkstyle - check coding style"
+ @echo " fixstyle - fix coding style"
+ @echo " doxygen - (re)generate documentation"
+ @echo " bootstrap-doxygen - setup Doxygen dependencies"
+ @echo " wipe-doxygen - wipe all generated documentation"
+ @echo " test-doc - generate documentation for test framework"
+ @echo " test-wipe-doc - wipe documentation for test framework"
+ @echo " test-cov - generate code coverage report for test framework"
+ @echo " test-wipe-cov - wipe code coverage report for test framework"
+ @echo " test-checkstyle - check PEP8 compliance for test framework"
+ @echo ""
+ @echo "Make Arguments:"
+ @echo " V=[0|1] - set build verbosity level"
+ @echo " STARTUP_CONF=<path> - startup configuration file"
+ @echo " (e.g. /etc/vpp/startup.conf)"
+ @echo " STARTUP_DIR=<path> - startup drectory (e.g. /etc/vpp)"
+ @echo " It also sets STARTUP_CONF if"
+ @echo " startup.conf file is present"
+ @echo " GDB=<path> - gdb binary to use for debugging"
+ @echo " PLATFORM=<name> - target platform. default is vpp"
+ @echo " TEST=<filter> - apply filter to test set, see test-help"
+ @echo " DPDK_CONFIG=<conf> - add specified dpdk config commands to"
+ @echo " autogenerated startup.conf"
+ @echo " (e.g. \"no-pci\" )"
+ @echo " SAMPLE_PLUGIN=yes - in addition build/run/debug sample plugin"
+ @echo " DISABLED_PLUGINS=<list> - comma separated list of plugins which"
+ @echo " should not be loaded"
+ @echo ""
+ @echo "Current Argument Values:"
+ @echo " V = $(V)"
+ @echo " STARTUP_CONF = $(STARTUP_CONF)"
+ @echo " STARTUP_DIR = $(STARTUP_DIR)"
+ @echo " GDB = $(GDB)"
+ @echo " PLATFORM = $(PLATFORM)"
+ @echo " DPDK_VERSION = $(DPDK_VERSION)"
+ @echo " DPDK_CONFIG = $(DPDK_CONFIG)"
+ @echo " SAMPLE_PLUGIN = $(SAMPLE_PLUGIN)"
+ @echo " DISABLED_PLUGINS = $(DISABLED_PLUGINS)"
+
+$(BR)/.bootstrap.ok:
+ifeq ($(findstring y,$(UNATTENDED)),y)
+ make install-dep
+endif
+ifeq ($(filter ubuntu debian,$(OS_ID)),$(OS_ID))
+ @MISSING=$$(apt-get install -y -qq -s $(DEB_DEPENDS) | grep "^Inst ") ; \
+ if [ -n "$$MISSING" ] ; then \
+ echo "\nPlease install missing packages: \n$$MISSING\n" ; \
+ echo "by executing \"make install-dep\"\n" ; \
+ exit 1 ; \
+ fi ; \
+ exit 0
+else ifneq ("$(wildcard /etc/redhat-release)","")
+ @for i in $(RPM_DEPENDS) ; do \
+ RPM=$$(basename -s .rpm "$${i##*/}" | cut -d- -f1,2,3) ; \
+ MISSING+=$$(rpm -q $$RPM | grep "^package") ; \
+ done ; \
+ if [ -n "$$MISSING" ] ; then \
+ echo "Please install missing RPMs: \n$$MISSING\n" ; \
+ echo "by executing \"make install-dep\"\n" ; \
+ exit 1 ; \
+ fi ; \
+ exit 0
+endif
+ @echo "SOURCE_PATH = $(WS_ROOT)" > $(BR)/build-config.mk
+ @echo "#!/bin/bash\n" > $(BR)/path_setup
+ @echo 'export PATH=$(BR)/tools/ccache-bin:$$PATH' >> $(BR)/path_setup
+ @echo 'export PATH=$(BR)/tools/bin:$$PATH' >> $(BR)/path_setup
+ @echo 'export CCACHE_DIR=$(CCACHE_DIR)' >> $(BR)/path_setup
+
+ifeq ("$(wildcard /usr/bin/ccache )","")
+ @echo "WARNING: Please install ccache AYEC and re-run this script"
+else
+ @rm -rf $(BR)/tools/ccache-bin
+ @mkdir -p $(BR)/tools/ccache-bin
+ @ln -s /usr/bin/ccache $(BR)/tools/ccache-bin/gcc
+ @ln -s /usr/bin/ccache $(BR)/tools/ccache-bin/g++
+endif
+ @make -C $(BR) V=$(V) is_build_tool=yes tools-install
+ @touch $@
+
+bootstrap: $(BR)/.bootstrap.ok
+
+install-dep:
+ifeq ($(filter ubuntu debian,$(OS_ID)),$(OS_ID))
+ifeq ($(OS_VERSION_ID),14.04)
+ @sudo -E apt-get $(CONFIRM) $(FORCE) install software-properties-common
+ @sudo -E add-apt-repository ppa:openjdk-r/ppa $(CONFIRM)
+endif
+ifeq ($(OS_ID)-$(OS_VERSION_ID),debian-8)
+ @grep -q jessie-backports /etc/apt/sources.list /etc/apt/sources.list.d/* 2> /dev/null \
+ || ( echo "Please install jessie-backports" ; exit 1 )
+endif
+ @sudo -E apt-get update
+ @sudo -E apt-get $(APT_ARGS) $(CONFIRM) $(FORCE) install $(DEB_DEPENDS)
+else ifneq ("$(wildcard /etc/redhat-release)","")
+ @sudo -E yum groupinstall $(CONFIRM) $(RPM_DEPENDS_GROUPS)
+ @sudo -E yum install $(CONFIRM) $(RPM_DEPENDS)
+ @sudo -E debuginfo-install $(CONFIRM) glibc openssl-libs zlib
+else ifeq ($(filter opensuse,$(OS_ID)),$(OS_ID))
+ @sudo -E zypper -n install -y $(RPM_SUSE_DEPENDS)
+else
+ $(error "This option currently works only on Ubuntu, Debian or Centos systems")
+endif
+
+define make
+ @make -C $(BR) PLATFORM=$(PLATFORM) TAG=$(1) $(2)
+endef
+
+$(BR)/scripts/.version:
+ifneq ("$(wildcard /etc/redhat-release)","")
+ $(shell $(BR)/scripts/version rpm-string > $(BR)/scripts/.version)
+else
+ $(shell $(BR)/scripts/version > $(BR)/scripts/.version)
+endif
+
+DIST_FILE = $(BR)/vpp-$(shell src/scripts/version).tar
+DIST_SUBDIR = vpp-$(shell src/scripts/version|cut -f1 -d-)
+
+dist:
+ @if git rev-parse 2> /dev/null ; then \
+ git archive \
+ --prefix=$(DIST_SUBDIR)/ \
+ --format=tar \
+ -o $(DIST_FILE) \
+ HEAD ; \
+ git describe > $(BR)/.version ; \
+ else \
+ (cd .. ; tar -cf $(DIST_FILE) $(DIST_SUBDIR) --exclude=*.tar) ; \
+ src/scripts/version > $(BR)/.version ; \
+ fi
+ @tar --append \
+ --file $(DIST_FILE) \
+ --transform='s,.*/.version,$(DIST_SUBDIR)/src/scripts/.version,' \
+ $(BR)/.version
+ @$(RM) $(BR)/.version $(DIST_FILE).xz
+ @xz -v --threads=0 $(DIST_FILE)
+ @$(RM) $(BR)/vpp-latest.tar.xz
+ @ln -rs $(DIST_FILE).xz $(BR)/vpp-latest.tar.xz
+
+build: $(BR)/.bootstrap.ok
+ $(call make,$(PLATFORM)_debug,$(addsuffix -install,$(TARGETS)))
+
+wipedist:
+ @$(RM) $(BR)/*.tar.xz
+
+wipe: wipedist $(BR)/.bootstrap.ok
+ $(call make,$(PLATFORM)_debug,$(addsuffix -wipe,$(TARGETS)))
+
+rebuild: wipe build
+
+build-release: $(BR)/.bootstrap.ok
+ $(call make,$(PLATFORM),$(addsuffix -install,$(TARGETS)))
+
+wipe-release: $(BR)/.bootstrap.ok
+ $(call make,$(PLATFORM),$(addsuffix -wipe,$(TARGETS)))
+
+rebuild-release: wipe-release build-release
+
+export VPP_PYTHON_PREFIX=$(BR)/python
+
+libexpand = $(subst $(subst ,, ),:,$(foreach lib,$(1),$(BR)/install-$(2)-native/vpp/$(lib)/$(3)))
+
+define test
+ $(if $(filter-out $(3),retest),make -C $(BR) PLATFORM=$(1) TAG=$(2) vpp-install,)
+ $(eval libs:=lib lib64)
+ make -C test \
+ TEST_DIR=$(WS_ROOT)/test \
+ VPP_TEST_BUILD_DIR=$(BR)/build-$(2)-native \
+ VPP_TEST_BIN=$(BR)/install-$(2)-native/vpp/bin/vpp \
+ VPP_TEST_PLUGIN_PATH=$(call libexpand,$(libs),$(2),vpp_plugins) \
+ VPP_TEST_INSTALL_PATH=$(BR)/install-$(2)-native/ \
+ LD_LIBRARY_PATH=$(call libexpand,$(libs),$(2),) \
+ EXTENDED_TESTS=$(EXTENDED_TESTS) \
+ PYTHON=$(PYTHON) \
+ $(3)
+endef
+
+test: bootstrap
+ $(call test,vpp,vpp,test)
+
+test-debug: bootstrap
+ $(call test,vpp,vpp_debug,test)
+
+test-all: bootstrap
+ $(eval EXTENDED_TESTS=yes)
+ $(call test,vpp,vpp,test)
+
+test-all-debug: bootstrap
+ $(eval EXTENDED_TESTS=yes)
+ $(call test,vpp,vpp_debug,test)
+
+test-help:
+ @make -C test help
+
+test-wipe:
+ @make -C test wipe
+
+test-shell: bootstrap
+ $(call test,vpp,vpp,shell)
+
+test-shell-debug: bootstrap
+ $(call test,vpp,vpp_debug,shell)
+
+test-doc:
+ @make -C test doc
+
+test-wipe-doc:
+ @make -C test wipe-doc
+
+test-cov: bootstrap
+ $(eval EXTENDED_TESTS=yes)
+ $(call test,vpp,vpp_gcov,cov)
+
+test-wipe-cov:
+ @make -C test wipe-cov
+
+test-checkstyle:
+ @make -C test checkstyle
+
+retest:
+ $(call test,vpp,vpp,retest)
+
+retest-debug:
+ $(call test,vpp,vpp_debug,retest)
+
+STARTUP_DIR ?= $(PWD)
+ifeq ("$(wildcard $(STARTUP_CONF))","")
+define run
+ @echo "WARNING: STARTUP_CONF not defined or file doesn't exist."
+ @echo " Running with minimal startup config: $(MINIMAL_STARTUP_CONF)\n"
+ @cd $(STARTUP_DIR) && \
+ sudo $(2) $(1)/vpp/bin/vpp $(MINIMAL_STARTUP_CONF) \
+ plugin_path $(subst $(subst ,, ),:,$(wildcard $(1)/*/lib*/vpp_plugins))
+endef
+else
+define run
+ @cd $(STARTUP_DIR) && \
+ sudo $(2) $(1)/vpp/bin/vpp $(shell cat $(STARTUP_CONF) | sed -e 's/#.*//') \
+ plugin_path $(subst $(subst ,, ),:,$(wildcard $(1)/*/lib*/vpp_plugins))
+endef
+endif
+
+%.files: .FORCE
+ @find . \( -name '*\.[chyS]' -o -name '*\.java' -o -name '*\.lex' \) -and \
+ \( -not -path './build-root*' -o -path \
+ './build-root/build-vpp_debug-native/dpdk*' \) > $@
+
+.FORCE:
+
+run:
+ $(call run, $(BR)/install-$(PLATFORM)_debug-native)
+
+run-release:
+ $(call run, $(BR)/install-$(PLATFORM)-native)
+
+debug:
+ $(call run, $(BR)/install-$(PLATFORM)_debug-native,$(GDB) $(GDB_ARGS) --args)
+
+build-coverity:
+ $(call make,$(PLATFORM)_coverity,install-packages)
+
+debug-release:
+ $(call run, $(BR)/install-$(PLATFORM)-native,$(GDB) $(GDB_ARGS) --args)
+
+build-vat:
+ $(call make,$(PLATFORM)_debug,vpp-api-test-install)
+
+run-vat:
+ @sudo $(BR)/install-$(PLATFORM)_debug-native/vpp/bin/vpp_api_test
+
+pkg-deb:
+ $(call make,$(PLATFORM),install-deb)
+
+pkg-rpm: dist
+ make -C extras/rpm
+
+pkg-srpm: dist
+ make -C extras/rpm srpm
+
+dpdk-install-dev:
+ make -C dpdk install-$(PKG)
+
+ctags: ctags.files
+ @ctags --totals --tag-relative -L $<
+ @rm $<
+
+gtags: ctags
+ @gtags --gtagslabel=ctags
+
+cscope: cscope.files
+ @cscope -b -q -v
+
+checkstyle:
+ @build-root/scripts/checkstyle.sh
+
+fixstyle:
+ @build-root/scripts/checkstyle.sh --fix
+
+#
+# Build the documentation
+#
+
+# Doxygen configuration and our utility scripts
+export DOXY_DIR ?= $(WS_ROOT)/doxygen
+
+define make-doxy
+ @OS_ID="$(OS_ID)" make -C $(DOXY_DIR) $@
+endef
+
+.PHONY: bootstrap-doxygen doxygen wipe-doxygen
+
+bootstrap-doxygen:
+ $(call make-doxy)
+
+doxygen:
+ $(call make-doxy)
+
+wipe-doxygen:
+ $(call make-doxy)
+
+define banner
+ @echo "========================================================================"
+ @echo " $(1)"
+ @echo "========================================================================"
+ @echo " "
+endef
+
+verify: install-dep $(BR)/.bootstrap.ok dpdk-install-dev
+ $(call banner,"Building for PLATFORM=vpp using gcc")
+ @make -C build-root PLATFORM=vpp TAG=vpp wipe-all install-packages
+ifeq ($(OS_ID)-$(OS_VERSION_ID),ubuntu-16.04)
+ $(call banner,"Installing dependencies")
+ @sudo -E apt-get update
+ @sudo -E apt-get $(CONFIRM) $(FORCE) install clang
+ $(call banner,"Building for PLATFORM=vpp using clang")
+ @make -C build-root CC=clang PLATFORM=vpp TAG=vpp_clang wipe-all install-packages
+endif
+ $(call banner,"Building sample-plugin")
+ @make -C build-root PLATFORM=vpp TAG=vpp sample-plugin-install
+ $(call banner,"Building $(PKG) packages")
+ @make pkg-$(PKG)
+ifeq ($(OS_ID)-$(OS_VERSION_ID),ubuntu-16.04)
+ @make COMPRESS_FAILED_TEST_LOGS=yes test
+endif
+
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..090dd35
--- /dev/null
+++ b/README.md
@@ -0,0 +1,107 @@
+Vector Packet Processing
+========================
+
+## Introduction
+
+The VPP platform is an extensible framework that provides out-of-the-box
+production quality switch/router functionality. It is the open source version
+of Cisco's Vector Packet Processing (VPP) technology: a high performance,
+packet-processing stack that can run on commodity CPUs.
+
+The benefits of this implementation of VPP are its high performance, proven
+technology, its modularity and flexibility, and rich feature set.
+
+For more information on VPP and its features please visit the
+[FD.io website](http://fd.io/) and
+[What is VPP?](https://wiki.fd.io/view/VPP/What_is_VPP%3F) pages.
+
+
+## Changes
+
+Details of the changes leading up to this version of VPP can be found under
+@ref release_notes.
+
+
+## Directory layout
+
+Directory name | Description
+---------------------- | -------------------------------------------
+ build-data | Build metadata
+ build-root | Build output directory
+ doxygen | Documentation generator configuration
+ dpdk | DPDK patches and build infrastructure
+@ref extras/libmemif | Client library for memif
+@ref src/examples | VPP example code
+@ref src/plugins | VPP bundled plugins directory
+@ref src/svm | Shared virtual memory allocation library
+ src/tests | Standalone tests (not part of test harness)
+ src/vat | VPP API test program
+@ref src/vlib | VPP application library
+@ref src/vlibapi | VPP API library
+@ref src/vlibmemory | VPP Memory management
+@ref src/vlibsocket | VPP Socket I/O
+@ref src/vnet | VPP networking
+@ref src/vpp | VPP application
+@ref src/vpp-api | VPP application API bindings
+@ref src/vppinfra | VPP core library
+@ref src/vpp/api | Not-yet-relocated API bindings
+ test | Unit tests and Python test harness
+
+## Getting started
+
+In general anyone interested in building, developing or running VPP should
+consult the [VPP wiki](https://wiki.fd.io/view/VPP) for more complete
+documentation.
+
+In particular, readers are recommended to take a look at [Pulling, Building,
+Running, Hacking, Pushing](https://wiki.fd.io/view/VPP/Pulling,_Building,_Run
+ning,_Hacking_and_Pushing_VPP_Code) which provides extensive step-by-step
+coverage of the topic.
+
+For the impatient, some salient information is distilled below.
+
+
+### Quick-start: On an existing Linux host
+
+To install system dependencies, build VPP and then install it, simply run the
+build script. This should be performed a non-privileged user with `sudo`
+access from the project base directory:
+
+ ./extras/vagrant/build.sh
+
+If you want a more fine-grained approach because you intend to do some
+development work, the `Makefile` in the root directory of the source tree
+provides several convenience shortcuts as `make` targets that may be of
+interest. To see the available targets run:
+
+ make
+
+
+### Quick-start: Vagrant
+
+The directory `extras/vagrant` contains a `VagrantFile` and supporting
+scripts to bootstrap a working VPP inside a Vagrant-managed Virtual Machine.
+This VM can then be used to test concepts with VPP or as a development
+platform to extend VPP. Some obvious caveats apply when using a VM for VPP
+since its performance will never match that of bare metal; if your work is
+timing or performance sensitive, consider using bare metal in addition or
+instead of the VM.
+
+For this to work you will need a working installation of Vagrant. Instructions
+for this can be found [on the Setting up Vagrant wiki page]
+(https://wiki.fd.io/view/DEV/Setting_Up_Vagrant).
+
+
+## More information
+
+Several modules provide documentation, see @subpage user_doc for more
+end-user-oriented information. Also see @subpage dev_doc for developer notes.
+
+Visit the [VPP wiki](https://wiki.fd.io/view/VPP) for details on more
+advanced building strategies and other development notes.
+
+
+## Test Framework
+
+There is PyDoc generated documentation available for the VPP test framework.
+See @ref test_framework_doc for details.
diff --git a/RELEASE.md b/RELEASE.md
new file mode 100644
index 0000000..3a9de71
--- /dev/null
+++ b/RELEASE.md
@@ -0,0 +1,726 @@
+# Release Notes {#release_notes}
+
+* @subpage release_notes_1710
+* @subpage release_notes_1707
+* @subpage release_notes_1704
+* @subpage release_notes_17011
+* @subpage release_notes_1701
+* @subpage release_notes_1609
+* @subpage release_notes_1606
+
+@page release_notes_1710 Release notes for VPP 17.10
+
+More than 400 commits since the 1707 release.
+
+## Features
+- Infrastructure
+ - DPDK 17.08
+ - IP reassembly
+ - Bounded-index extensible hash bucket-level LRU cache
+ - Templated timer wheel improvements
+
+- API
+ - C/C++ language binding
+ - API stats
+
+- Host stack
+ - VPP TCP stack scale/congestion improvements
+ - VPP Comms Library (VCL)
+ - Overall performance, scale and hardening
+
+- Network features
+ - IPSec rework - utilize new FIB
+ - VPLS and VPWS implementation
+
+ - NAT
+ - Renamed SNAT to NAT
+ - Performance / Scale
+ - Destination NAT44 with load-balancing
+ - In2out translation as an output feature on the outside interface
+ - Fullback to 3-tuple key for non TCP/UDP/ICMP sessions
+
+ - Security Groups/ACLs
+ - "Replace" semantics for adding a new MacIP acl
+ - Test suite tests for MacIP ACLs
+
+ - ONE-LISP
+ - Map-server fallback support
+ - Preemptive re-fetch of active mappings that are about to expire
+ - ND termination
+
+ - PPPoE
+ - PPPoE Control Plane packet dispatch
+ - PPPoE decapsulation
+ - PPPoE encapsulation
+
+## Known issues
+
+For the full list of issues please refer to fd.io [JIRA](https://jira.fd.io).
+
+## Issues fixed
+
+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/1710)
+
+## API changes
+
+Message Name Result
+bridge_domain_add_del definition changed
+bridge_domain_details definition changed
+connect_session definition changed
+connect_sock definition changed
+connect_sock_reply definition changed
+connect_uri_reply definition changed
+create_vhost_user_if definition changed
+dhcp_client_config definition changed
+ip4_arp_event definition changed
+ip6_fib_details definition changed
+ip6_nd_event definition changed
+ip_add_del_route definition changed
+ip_fib_details definition changed
+ip_table_add_del definition changed
+l2_macs_event only in image
+macip_acl_add_replace definition changed
+macip_acl_interface_list_details only in image
+macip_acl_interface_list_dump only in image
+modify_vhost_user_if definition changed
+mpls_fib_details definition changed
+mpls_route_add_del definition changed
+mpls_table_add_del definition changed
+mpls_tunnel_add_del definition changed
+nat44_add_del_address_range definition changed
+nat44_add_del_interface_addr definition changed
+nat44_add_del_lb_static_mapping definition changed
+nat44_add_del_static_mapping definition changed
+nat44_address_details only in image
+nat44_address_dump only in image
+nat44_interface_add_del_feature definition changed
+nat44_interface_add_del_output_feature definition changed
+nat44_interface_addr_details only in image
+nat44_interface_addr_dump only in image
+nat44_interface_details only in image
+nat44_interface_dump only in image
+nat44_interface_output_feature_details only in image
+nat44_interface_output_feature_dump only in image
+nat44_lb_static_mapping_details only in image
+nat44_lb_static_mapping_dump only in image
+nat44_static_mapping_details only in image
+nat44_static_mapping_dump only in image
+nat44_user_details only in image
+nat44_user_dump only in image
+nat44_user_session_details only in image
+nat44_user_session_dump only in image
+nat_control_ping definition changed
+nat_det_add_del_map definition changed
+nat_det_close_session_in definition changed
+nat_det_close_session_out definition changed
+nat_det_forward definition changed
+nat_det_get_timeouts definition changed
+nat_det_map_details only in image
+nat_det_map_dump only in image
+nat_det_reverse definition changed
+nat_det_session_details only in image
+nat_det_session_dump only in image
+nat_det_set_timeouts definition changed
+nat_ipfix_enable_disable definition changed
+nat_set_workers definition changed
+nat_show_config definition changed
+nat_worker_details only in image
+nat_worker_dump only in image
+one_add_del_ndp_entry definition changed
+one_enable_disable_petr_mode definition changed
+one_enable_disable_pitr_mode definition changed
+one_enable_disable_xtr_mode definition changed
+one_get_transport_protocol definition changed
+one_map_register_fallback_threshold definition changed
+one_map_register_set_ttl definition changed
+one_ndp_bd_get definition changed
+one_ndp_entries_get definition changed
+one_set_transport_protocol definition changed
+one_show_petr_mode definition changed
+one_show_pitr_mode definition changed
+one_show_xtr_mode definition changed
+p2p_ethernet_add definition changed
+pppoe_add_del_session definition changed
+pppoe_session_details only in image
+pppoe_session_dump only in image
+punt_socket_deregister definition changed
+punt_socket_register definition changed
+show_one_map_register_fallback_threshold definition changed
+show_one_map_register_ttl definition changed
+snat_interface_add_del_output_feature definition changed
+snat_interface_output_feature_details only in image
+snat_interface_output_feature_dump only in image
+sw_interface_event only in image
+sw_interface_set_flags definition changed
+sw_interface_span_dump definition changed
+sw_interface_span_enable_disable definition changed
+sw_interface_vhost_user_details definition changed
+tcp_configure_src_addresses definition changed
+vnet_per_interface_combined_counters only in image
+vnet_per_interface_simple_counters only in image
+want_interface_combined_stats definition changed
+want_interface_simple_stats definition changed
+want_ip4_fib_stats definition changed
+want_ip4_nbr_stats definition changed
+want_ip6_fib_stats definition changed
+want_ip6_nbr_stats definition changed
+want_l2_macs_events definition changed
+want_per_interface_combined_stats definition changed
+want_per_interface_simple_stats definition changed
+Found 103 api message signature differences
+
+Patches that updated the API files:
+
+./src/plugins/pppoe/pppoe.api
+62f9cdd8 Add PPPoE Plugin
+
+./src/plugins/acl/acl.api
+c29940c5 ACL-plugin add "replace" semantics for adding a new MacIP acl
+de9fbf43 MAC IP ACL interface list dump (as an alternative to the get/reply)
+
+./src/plugins/nat/nat.api
+704018cf NAT: Destination NAT44 with load-balancing (VPP-954)
+2ba92e32 NAT: Rename snat plugin to nat (VPP-955)
+
+./src/vnet/interface.api
+831fb59f Stats refactor
+d292ab1e No context in SW interface event
+a07bd708 Dedicated SW Interface Event
+
+./src/vnet/dhcp/dhcp.api
+51822bf0 DHCP client option 61 "client_id"
+4729b1ec DHCP complete event sends mask length
+
+./src/vnet/lldp/lldp.api
+99a0e60e Add API support for LLDP config/interface set
+
+./src/vnet/lisp-cp/one.api
+d630713d LISP: add neighbor discovery and CP protocol separation APIs
+111a5cea LISP: Add APIs for enable/disable xTR/P-ITR/P-ETR modes
+7048ff1e LISP: Map-server fallback feature
+1e553a00 LISP: make TTL for map register messages configurable
+
+./src/vnet/ethernet/p2p_ethernet.api
+15ac81c1 P2P Ethernet
+
+./src/vnet/mpls/mpls.api
+2297af01 Add a name to the creation of an IP and MPLS table
+28ab9cc1 FIB table add/delete API only
+da78f957 L2 over MPLS
+a0a908f1 FIB path weight incorrect in dump (VPP-922)
+57b5860f FIB path preference
+
+./src/vnet/session/session.api
+33e002b1 Fix session connect api message handling.
+
+./src/vnet/span/span.api
+5b311202 SPAN/API:enable L2 dump
+001fd406 SPAN:add l2 mirror
+
+./src/vnet/devices/virtio/vhost_user.api
+4ba75f54 vhost: Remove operation mode in the API
+
+./src/vnet/vxlan-gpe/vxlan_gpe.api
+04ffd0ad VPP crash on creating vxlan gpe interface. VPP-875
+
+./src/vnet/tcp/tcp.api
+3bbcfab1 TCP source address automation
+
+./src/vnet/ip/ip.api
+2297af01 Add a name to the creation of an IP and MPLS table
+28ab9cc1 FIB table add/delete API only
+57b5860f FIB path preference
+
+./src/vnet/lisp-gpe/lisp_gpe.api
+af3d9771 Remove unused retval from gpe_native_fwd_rpath type definition
+
+./src/vnet/l2/l2.api
+50570ece Update of free text tag patch for BD
+48304141 Support for bridge domain free text tag
+e531f4cb Increase default MAC learn limit and check it in learn-update path
+8d00fff8 Add support for API client to receive L2 MAC events
+
+./src/vpp/api/vpe.api
+8a19f12a Allow individual stats API and introduce stats.api
+4802632d Punt socket: Fix coverity error for pathname length mismatch between API and sun_path.
+f7a55ad7 PUNT socket: External control plane processes connected via UNIX domain sockets.
+75e2f2ac API:fix arp/ND event messages - remove context
+99a0e60e Add API support for LLDP config/interface set
+
+./src/vpp/stats/stats.api
+831fb59f Stats refactor
+8a19f12a Allow individual stats API and introduce stats.api
+
+@page release_notes_1707 Release notes for VPP 17.07
+
+More than 400 commits since the 1704 release.
+
+## Features
+- Infrastructure
+ - make test; improved debuggability.
+ - TAB auto-completion on the CLI
+ - DPDK 17.05
+ - python 3 support in test infra
+
+- Host stack
+ - Improved Linux TCP stack compatibility using IWL test suite (https://jira.fd.io/browse/VPP-720)
+ - Improved loss recovery (RFC5681, RFC6582, RF6675)
+ - Basic implementation of Eifel detection algorithm (RFC3522)
+ - Basic support for buffer chains
+ - Refactored session layer API
+ - Overall performance, scale and hardening
+
+- Interfaces
+ - memif: IP mode, jumbo frames, multi queue
+ - virtio-user support
+ - vhost-usr; adaptive (poll/interupt) support.
+
+- Network features
+ - MPLS Multicast FIB
+
+ - BFD FIB integration
+
+ - NAT64 support
+
+ - GRE over IPv6
+
+ - Segement routing MPLS
+
+ - IOAM configuration for SRv6 localsid
+
+ - LISP
+ - NSH support
+ - native forward static routes
+ - L2 ARP
+
+ - ACL multi-core suuport
+
+ - Flowprobe:
+ - Add flowstartns, flowendns and tcpcontrolbits
+ - Stateful flows and IPv6, L4 recording
+
+ - GTP-U support
+
+ - VXLAN GPE support for FIB2.0 and bypass.
+
+
+## Known issues
+
+For the full list of issues please reffer to fd.io [JIRA](https://jira.fd.io).
+
+## Issues fixed
+
+For the full list of fixed issues please reffer to:
+- fd.io [JIRA](https://jira.fd.io)
+- git [commit log](https://git.fd.io/vpp/log/?h=stable/1707)
+
+@page release_notes_1704 Release notes for VPP 17.04
+
+More than 500 commits since the 1701 release.
+
+## Features
+- Infrastructure
+ - make test improvements
+ - vnet: add device-input threadplacement infra
+ - 64 bit per-thread counters
+ - process restart cli
+ - High performance timer wheels
+ - Plugin infrastructure improvements
+ - Support for .default_disabled, .version_required
+ - Added MAINTAINERS file
+
+- Host stack
+ - TCP stack (experimental)
+ - DHCPv4 / DHCPv6 relay multi-destination
+ - DHCPv4 option 82
+ - ND proxy
+ - Attached hosts
+ - Consolidated DHCPv4 and DHCPv6 implementation
+
+- Interfaces
+ - DPDK 17.02 (retire support for DPDK 16.07)
+ - Add memif - packet memory interface for intra-host communication
+ - vhost: support interrupt mode
+ - DPDK as plugin (retired vpp_lite)
+ - DPDPK input optimizations
+ - Loopback interface allocation scheme
+
+- Network features
+ - IP Multicast FIB
+
+ - Bridging
+ - Learning on local interfaces
+ - Flushing of MACs from the L2 FIB
+
+ - SNAT
+ - CGN (Deterministic and dynamic)
+ - CGN configurable port allocation algorithm
+ - ICMP support
+ - Tentant VRF id for SNAT outside addresses
+ - Session dump / User dump
+ - Port allocation per protocol
+
+ - Security groups
+ - Routed interface support
+ - L2+L3 unified processing node
+ - Improve fragment handling
+
+ - Segement routing v6
+ - SR policies with weighted SID lists
+ - Binding SID
+ - SR steering policies
+ - SR Local SIDs
+ - Framework to expand local SIDs w/plugins
+ - Documentation
+
+ - IOAM
+ - UDP Pinger w/path fault isolation
+ - IOAM as type 2 metadata in NSH
+ - IAOM raw IPFIX collector and analyzer
+ - Anycast active server selection
+ - Documentation
+ - SRv6 Local SID
+ - IP6 HBH header and SR header co-existence
+ - Active probe
+
+ - LISP
+ - Statistics collection
+ - Generalize encap for overlay transport (vxlan-gpe support)
+ - Improve data plane speed
+
+ - GPE
+ - CLI
+ - NSH added to encap/decap path
+ - Renamed LISP GPE API to GPE
+
+ - MPLS
+ - Performance improvements (quad loop)
+
+ - BFD
+ - Command line interface
+ - Echo function
+ - Remote demand mode
+ - SHA1 authentication
+
+ - IPsec
+ - IKEv2 initiator features
+
+ - VXLAN
+ - unify IP4/IP6 control plane handling
+
+## API changes
+
+- Python API: To avoid conflicts between VPP API messages names and
+ the Python API binding function names, VPP API methods are put in a
+ separate proxy object.
+ https://gerrit.fd.io/r/#/c/5570/
+ The api methods are now referenced as:
+ vpp_handle = VPP(jsonfiles)
+ vpp_handle.connect(...)
+ vpp = vpp_handle.api
+ vpp.show_version()
+ vpp_handle.disconnect()
+
+ For backwards compatibility VPP API methods are left in the main
+ name space (VPP), but will be removed from 17.07.
+
+ - Python API: Change from cPython to CFFI.
+
+- create_loopback message to be replaced with create_loopback_instance
+ create_loopback will be removed from 17.07.
+ https://gerrit.fd.io/r/#/c/5572/
+
+## Known issues
+
+For the full list of issues please reffer to fd.io [JIRA](https://jira.fd.io).
+
+## Issues fixed
+
+For the full list of fixed issues please reffer to:
+- fd.io [JIRA](https://jira.fd.io)
+- git [commit log](https://git.fd.io/vpp/log/?h=stable/1704)
+
+@page release_notes_17011 Release notes for VPP 17.01.1
+
+This is bug fix release.
+
+For the full list of fixed issues please reffer to:
+- fd.io [JIRA](https://jira.fd.io)
+- git [commit log](https://git.fd.io/vpp/log/?h=stable/1701)
+
+
+@page release_notes_17011 Release notes for VPP 17.01.1
+
+This is bug fix release.
+
+For the full list of fixed issues please reffer to:
+- fd.io [JIRA](https://jira.fd.io)
+- git [commit log](https://git.fd.io/vpp/log/?h=stable/1701)
+
+@page release_notes_1701 Release notes for VPP 17.01
+
+@note This release was for a while known as 16.12.
+
+## Features
+
+- [Integrated November 2016 DPDK release](http://www.dpdk.org/doc/guides/rel_notes/release_16_11.html)
+
+- Complete rework of Forwarding Information Base (FIB)
+
+- Performance Improvements
+ - Improvements in DPDK input and output nodes
+ - Improvements in L2 path
+ - Improvmeents in IPv4 lookup node
+
+- Feature Arcs Improvements
+ - Consolidation of the code
+ - New feature arcs
+ - device-input
+ - interface-output
+
+- DPDK Cryptodev Support
+ - Software and Hardware Crypto Support
+
+- DPDK HQoS support
+
+- Simple Port Analyzer (SPAN)
+
+- Bidirectional Forwarding Detection
+ - Basic implementation
+
+- IPFIX Improvements
+
+- L2 GRE over IPSec tunnels
+
+- Link Layer Discovery Protocol (LLDP)
+
+- Vhost-user Improvements
+ - Performance Improvements
+ - Multiqueue
+ - Reconnect
+
+- LISP Enhancements
+ - Source/Dest control plane support
+ - L2 over LISP and GRE
+ - Map-Register/Map-Notify/RLOC-probing support
+ - L2 API improvements, overall code hardening
+
+- Plugins:
+ - New: ACL
+ - New: Flow per Packet
+ - Improved: SNAT
+ - Mutlithreading
+ - Flow export
+
+- Doxygen Enhancements
+
+- Luajit API bindings
+
+- API Refactoring
+ - file split
+ - message signatures
+
+- Python and Scapy based unit testing infrastructure
+ - Infrastructure
+ - Various tests
+
+- Packet Generator improvements
+
+- TUN/TAP jumbo frames support
+
+- Other various bug fixes and improvements
+
+## Known issues
+
+For the full list of issues please reffer to fd.io [JIRA](https://jira.fd.io).
+
+## Issues fixed
+
+For the full list of fixed issues please reffer to:
+- fd.io [JIRA](https://jira.fd.io)
+- git [commit log](https://git.fd.io/vpp/log/?h=stable/1701)
+
+@page release_notes_1609 Release notes for VPP 16.09
+
+## Features
+
+- [Integrated July 2016 DPDK release](http://www.dpdk.org/doc/guides/rel_notes/release_16_07.html)
+ - DPDK-vhost is depreciated pending a complete rework of the original integration and
+ addressing of rx performance deltas.
+ - Patches required for DPDK 16.07:
+ - Correctly setting the Packet Type in the IGB, IXGBE and i40e drivers.
+ - Correctly setting checksum in the i40e driver.
+ - NXP DPAA2 PMD Driver.
+ - rte_delay (yield) functionality.
+
+- Add “in tree” plugins:
+ - IPv6 ILA.
+ - iOAM.
+ - Load Balancer.
+ - SNAT.
+
+- High-performance (line-rate) “neutron like” L4 port-filtering.
+
+- API refactoring - addressing some of the issues around JVPP bindings.
+ - Accommodating plugins [(e.g. NSH_SFC)](https://wiki.fd.io/view/NSH_SFC)
+ - Binding for [python](https://wiki.fd.io/view/VPP/Python_API)
+
+- LISP
+ - L2 LISP overlays
+ - Multitenancy
+ - Multihoming
+ - RTR mode
+ - Map-resolver failover algorithm
+
+- Support 64-bit vector lengths, huge shared-memory segments.
+
+- Dynamic IP Feature ordering
+ - IP Features can now specify features they appear before and after
+
+- 16.09 Builds
+ - Ubuntu 14.04 LTS - Trusty Tahr
+ - Ubuntu 16.04 LTS - Xenial Xerus
+ - CentOS 7
+ - More information on [VPP wiki](https://wiki.fd.io/view/VPP/Installing_VPP_binaries_from_packages)
+
+- Performance, characterize and document performance for this release
+ [(more information on CSIT page)](https://wiki.fd.io/view/CSIT)
+
+ - IPv4 and IPv6 Scale - performance tests.
+ - Bidirectional 10k/100k/1M flows.
+ - 64B,570B, 1518B,9000B packet sizes.
+ - IPv6 iACL - performance
+ - DUT1 and DUT2 are configured with IPv6 routing, two static IPv6 /64 routes and IPv6 iAcl
+ security whitelist ingress /64 filter entries applied on links.
+ - TG traffic profile contains two L3 flow-groups (flow-group per direction, 253 flows per
+ flow-group) with all packets containing Ethernet header, IPv6 header and generated payload.
+ MAC addresses are matching MAC addresses of the TG node interfaces.
+
+ - L2XC VXLANoIPv4 - performance
+ - DUT1 and DUT2 are configured with L2 cross-connect. VXLAN tunnels are configured between
+ L2XCs on DUT1 and DUT2.
+ - TG traffic profile contains two L3 flow-groups (flow-group per direction, 253 flows per
+ flow-group) with all packets containing Ethernet header, IPv4 header with IP protocol=61
+ and generated payload. MAC addresses are matching MAC addresses of the TG node interfaces.
+
+- Documentation
+ - Autogenerated CLI documentation.
+ - Using doxygen to automate API/Node documentation.
+ - [(available online)](https://docs.fd.io/vpp/16.09/)
+
+- Resolved all static analysis issues found by Coverity
+ - Beginning of 16.09 cycle: 505 issues.
+ - Release: 0 outstanding issues.
+
+
+## Known issues
+
+Issues in fd.io are tracked in [JIRA](https://jira.fd.io).
+
+Issue | Description
+--- | ---
+VPP-391 | vpp debug version assert appeared in the process of start
+VPP-380 | Mapping algorithm compute wrong ea-bits when IPv4 prefix 0.0.0.0/0
+VPP-371 | load_one_plugin:63: Loaded plugin: message from vppctl
+VPP-367 | vpp packages need to depend on specific versions of each other
+VPP-312 | IP6 FIB gets in indeterminate state by duplicating commands
+VPP-224 | Lookup-in-vrf can not be set correctly
+VPP-206 | Fix classify table delete
+VPP-203 | Fix binary API for reading vpp node graph
+VPP-147 | Inconsistent behaviour when adding L2 FIB filter entry
+VPP-99 | VPP doesn't discard DHCPOFFER message with wrong XID
+
+
+## Issues fixed
+
+Issues in fd.io are tracked in [JIRA](https://jira.fd.io).
+
+Issue | Description
+--- | ---
+VPP-396 | Ubuntu systems Graphviz bug
+VPP-390 | vpp-lib rpm fails to include *.so symlinks, causing linking problems with out of tree builds
+VPP-388 | IPSec output feature assumes packets have been ethernet rewritten
+VPP-385 | ARP for indirect adjacencies not working correctly
+VPP-361 | Memory leak on delete of VXLAN over IPv6 tunnel
+VPP-357 | VNI not set correctly when removing LISP fwd entries
+VPP-349 | sw_interface_vhost_user_dump not working
+VPP-345 | net/enic: bad L4 checksum ptype set on ICMP packets
+VPP-340 | MAP-T wrong destination address
+VPP-330 | Use fifo to store LISP pending map-requests
+VPP-326 | map_add_domain VAT command: unable to configure domain with mtu parameter
+VPP-318 | The map_add_domain VAT command accepts invalid arguments
+VPP-315 | Fix "show vxlan-gpe" issue
+VPP-310 | Mapping algorithm compute wrong ea-bits
+VPP-239 | LISP IP forwarding does not tag packets that hit negative mapping entries
+VPP-235 | Invalid help in VAT for sw_interface_set_l2_bridge
+VPP-228 | Mapping algorithm sends packet to wrong IPv6 address
+VPP-214 | vpp-api-test: api_ipsec_sad_add_del_entry: vector "ck" not initialized
+VPP-200 | VPP - TAP port create problem
+VPP-189 | Coverity Issues for 16.09
+VPP-184 | u16 translating to char ,not short
+VPP-179 | Adjacency share-count botch
+VPP-163 | "show ip6 interface" ignores non-global addresses
+VPP-155 | Netmap: Inconsistency in interface state between "show hardware" and "show interface"
+VPP-145 | Dynamically compute IP feature ordering based on constraints
+VPP-137 | VPP sends ARP with wrong requested IP
+VPP-118 | JVpp: 0 length arrays not handled properly in VPP responses
+VPP-112 | linux kernel info missing from build log
+VPP-110 | vxlan encap node should never touch a deleted tunnel
+VPP-107 | RPM build broken in master
+VPP-92 | segment routing is not properly filling out the segment list
+VPP-91 | segment routing add/del tunnel lookup doesn't work
+VPP-84 | af_packet throws a fatal error on EAGAIN
+VPP-74 | Clang compile fails due to warning in vlib/unix/cli.c
+VPP-64 | Top level "make pkg-deb" fails if CDPATH is set in user env.
+VPP-48 | Traceroute does not terminate when VPP is the target
+VPP-23 | CLI pager does not gracefully handle lines longer than the terminal width
+
+
+@page release_notes_1606 Release notes for VPP 16.06
+
+
+The FD.io Project, relentlessly focused on data IO speed and efficiency
+supporting the creation of high performance, flexible, and scalable software
+defined infrastructures, announces the availability of the community’s first
+software release (16.06).
+
+In the four months since launching, FD.io has brought together more than 75
+developers from 11 different companies including network operators, solution
+providers chip vendors, and network equipment vendors who are collaborating to
+enhance and innovate around the Vector Packet Processing (VPP) technology. The
+FD.io community has quickly formed to grow the number of projects from the
+initial VPP project to an additional 6 projects addressing a diverse set of
+requirements and usability across a variety of deployment environments.
+
+The 16.06 release brings unprecedented performance: 480Gbps/200mpps with 8
+million routes and 2k whitelist entries on standard high volume x86 servers.
+
+
+## Features
+
+In addition to the existing full suite of vswitch/vrouter features, the new
+16.06 release adds:
+
+* Enhanced Switching and Routing:
+ * IPv6 Segment Routing multicast support.
+ * LISP xTR support.
+ * VXLAN over IPv6 underlay.
+ * Per interface whitelists.
+ * Shared adjacencies in FIB.
+
+* New and improved interface support:
+ * Jumbo frame support for vhost-user.
+ * Netmap interface support.
+ * AF_Packet interface support.
+
+* Expanded and improved programmability:
+ * Python API bindings.
+ * Enhanced JVPP Java API bindings.
+ * Debugging CLI.
+
+* Expanded Hardware and Software Support:
+ * Support for ARM 32 targets including Rasberry Pi single-board computer.
+ * Support for DPDK 16.04.
+
diff --git a/build-data/packages/dpdk.mk b/build-data/packages/dpdk.mk
new file mode 100644
index 0000000..ddfb8fd
--- /dev/null
+++ b/build-data/packages/dpdk.mk
@@ -0,0 +1,32 @@
+
+ifneq (,$(findstring debug,$(TAG)))
+ DPDK_DEBUG=y
+else
+ DPDK_DEBUG=n
+endif
+
+DPDK_MAKE_ARGS = -C $(call find_source_fn,$(PACKAGE_SOURCE)) \
+ DPDK_BUILD_DIR=$(PACKAGE_BUILD_DIR) \
+ DPDK_INSTALL_DIR=$(PACKAGE_INSTALL_DIR) \
+ DPDK_DEBUG=$(DPDK_DEBUG)
+
+DPDK_MLX5_PMD=$(strip $($(PLATFORM)_uses_dpdk_mlx5_pmd))
+ifneq ($(DPDK_MLX5_PMD),)
+DPDK_MAKE_ARGS += DPDK_MLX5_PMD=y
+endif
+
+DPDK_PLATFORM_TARGET=$(strip $($(PLATFORM)_dpdk_target))
+ifneq ($(DPDK_PLATFORM_TARGET),)
+DPDK_MAKE_ARGS += DPDK_TARGET=$(DPDK_PLATFORM_TARGET)
+endif
+
+DPDK_MAKE_EXTRA_ARGS = $(strip $($(PLATFORM)_dpdk_make_extra_args))
+ifneq ($(DPDK_MAKE_EXTRA_ARGS),)
+DPDK_MAKE_ARGS += DPDK_MAKE_EXTRA_ARGS="$(DPDK_MAKE_EXTRA_ARGS)"
+endif
+
+dpdk_configure = echo
+
+dpdk_make_args = $(DPDK_MAKE_ARGS) ebuild-build
+
+dpdk_install = make $(DPDK_MAKE_ARGS) ebuild-install
diff --git a/build-data/packages/g2.mk b/build-data/packages/g2.mk
new file mode 100644
index 0000000..9b760e6
--- /dev/null
+++ b/build-data/packages/g2.mk
@@ -0,0 +1,3 @@
+g2_source = src
+
+g2_configure_args = --disable-vlib --disable-svm --enable-g2
diff --git a/build-data/packages/gmod.mk b/build-data/packages/gmod.mk
new file mode 100644
index 0000000..6fa7e0f
--- /dev/null
+++ b/build-data/packages/gmod.mk
@@ -0,0 +1,9 @@
+gmod_configure_depend = vpp-install
+
+gmod_configure_args = --libdir=$(PACKAGE_INSTALL_DIR)/$(arch_lib_dir)/ganglia
+
+gmod_CPPFLAGS = $(call installed_includes_fn, vpp)
+gmod_CPPFLAGS += -I/usr/include/apr-1.0 -I/usr/include/apr-1 -I/usr/include
+gmod_LDFLAGS = $(call installed_libs_fn, vpp)
+
+gmod_image_include = echo $(arch_lib_dir)/ganglia/libgmodvpp.so etc
diff --git a/build-data/packages/perftool.mk b/build-data/packages/perftool.mk
new file mode 100644
index 0000000..e582c31
--- /dev/null
+++ b/build-data/packages/perftool.mk
@@ -0,0 +1,4 @@
+perftool_source = src
+
+perftool_configure_args = --disable-vlib --disable-svm --enable-perftool
+
diff --git a/build-data/packages/sample-plugin.mk b/build-data/packages/sample-plugin.mk
new file mode 100644
index 0000000..fd1ee32
--- /dev/null
+++ b/build-data/packages/sample-plugin.mk
@@ -0,0 +1,5 @@
+sample-plugin_source = src
+sample-plugin_configure_subdir = examples/sample-plugin
+sample-plugin_configure_depend = vpp-install
+sample-plugin_CPPFLAGS = $(call installed_includes_fn, vpp)
+sample-plugin_LDFLAGS = $(call installed_libs_fn, vpp)
diff --git a/build-data/packages/src.mk b/build-data/packages/src.mk
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build-data/packages/src.mk
diff --git a/build-data/packages/vpp-platform-scripts.mk b/build-data/packages/vpp-platform-scripts.mk
new file mode 100644
index 0000000..792d600
--- /dev/null
+++ b/build-data/packages/vpp-platform-scripts.mk
@@ -0,0 +1 @@
+#
diff --git a/build-data/packages/vpp.mk b/build-data/packages/vpp.mk
new file mode 100644
index 0000000..a31ae7f
--- /dev/null
+++ b/build-data/packages/vpp.mk
@@ -0,0 +1,35 @@
+vpp_source = src
+
+ifeq ($($(PLATFORM)_dpdk_shared_lib),yes)
+vpp_configure_args = --enable-dpdk-shared
+else
+vpp_configure_args =
+endif
+
+# Platform dependent configure flags
+vpp_configure_args += $(vpp_configure_args_$(PLATFORM))
+
+
+vpp_CPPFLAGS =
+vpp_LDFLAGS =
+
+ifneq ($($(PLATFORM)_uses_dpdk),no)
+ifeq ($($(PLATFORM)_uses_external_dpdk),yes)
+vpp_CPPFLAGS += -I$($(PLATFORM)_dpdk_inc_dir)
+vpp_LDFLAGS += -L$($(PLATFORM)_dpdk_lib_dir)
+else
+vpp_configure_depend += dpdk-install
+vpp_CPPFLAGS += $(call installed_includes_fn, dpdk)/dpdk
+vpp_LDFLAGS += $(call installed_libs_fn, dpdk)
+vpp_CPPFLAGS += -I/usr/include/dpdk
+endif
+ifeq ($($(PLATFORM)_uses_dpdk_mlx5_pmd),yes)
+vpp_configure_args += --with-dpdk-mlx5-pmd
+endif
+else
+vpp_configure_args += --disable-dpdk-plugin
+endif
+
+ifeq ($($(PLATFORM)_enable_tests),yes)
+vpp_configure_args += --enable-tests
+endif
diff --git a/build-data/platforms.mk b/build-data/platforms.mk
new file mode 100644
index 0000000..7904cc4
--- /dev/null
+++ b/build-data/platforms.mk
@@ -0,0 +1,96 @@
+# Copyright (c) 2015 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Pick up per-platform makefile fragments
+$(foreach d,$(SOURCE_PATH_BUILD_DATA_DIRS), \
+ $(eval -include $(d)/platforms/*.mk))
+
+.PHONY: install-deb
+install-deb: $(patsubst %,%-find-source,$(ROOT_PACKAGES))
+ @$(BUILD_ENV) ; \
+ set -eu$(BUILD_DEBUG) ; \
+ $(MAKE) -C $(MU_BUILD_ROOT_DIR) \
+ $(patsubst %,%-install, \
+ $(ROOT_PACKAGES)) || exit 1; \
+ \
+ : generate file manifests ; \
+ find $(INSTALL_PREFIX)$(ARCH)/*/bin -type f -print \
+ | sed -e 's:.*:../& /usr/bin:' | grep -v vppapigen \
+ > deb/debian/vpp.install ; \
+ \
+ : core api definitions ; \
+ ./scripts/find-api-core-contents $(INSTALL_PREFIX)$(ARCH) \
+ deb/debian/vpp.install ; \
+ \
+ : need symbolic links in the lib pkg ; \
+ find $(INSTALL_PREFIX)$(ARCH)/*/lib* \( -type f -o -type l \) \
+ -print | egrep -e '*\.so\.*\.*\.*' \
+ | grep -v plugins\/ \
+ | sed -e 's:.*:../& /usr/lib/x86_64-linux-gnu:' \
+ > deb/debian/vpp-lib.install ; \
+ \
+ : vnet api definitions ; \
+ ./scripts/find-api-lib-contents $(INSTALL_PREFIX)$(ARCH) \
+ deb/debian/vpp-lib.install ; \
+ \
+ : dev package ; \
+ ./scripts/find-dev-contents $(INSTALL_PREFIX)$(ARCH) \
+ deb/debian/vpp-dev.install ; \
+ \
+ : plugins package ; \
+ ./scripts/find-plugins-contents $(INSTALL_PREFIX)$(ARCH) \
+ deb/debian/vpp-plugins.install ; \
+ \
+ : vpp-api-lua package ; \
+ ./scripts/find-vpp-api-lua-contents $(INSTALL_PREFIX)$(ARCH) \
+ deb/debian/vpp-api-lua.install ; \
+ \
+ : vpp-api-java package ; \
+ ./scripts/find-vpp-api-java-contents $(INSTALL_PREFIX)$(ARCH) \
+ deb/debian/vpp-api-java.install ; \
+ \
+ : bin package needs startup config ; \
+ echo ../../src/vpp/conf/startup.conf /etc/vpp \
+ >> deb/debian/vpp.install ; \
+ \
+ : and sysctl config ; \
+ echo ../../src/vpp/conf/80-vpp.conf /etc/sysctl.d \
+ >> deb/debian/vpp.install ; \
+ \
+ : bash completion for vppctl ; \
+ echo ../../src/scripts/vppctl_completion /etc/bash_completion.d \
+ >> deb/debian/vpp.install ; \
+ \
+ : move dictionary of vppctl commands ; \
+ echo ../../src/scripts/vppctl-cmd-list /usr/share/vpp \
+ >> deb/debian/vpp.install ; \
+ \
+ : dev package needs a couple of additions ; \
+ echo ../$(INSTALL_PREFIX)$(ARCH)/vpp/bin/vppapigen /usr/bin \
+ >> deb/debian/vpp-dev.install ; \
+ echo ../../src/vpp-api/java/jvpp/gen/jvpp_gen.py /usr/bin \
+ >> deb/debian/vpp-dev.install ; \
+ for i in $$(ls ../src/vpp-api/java/jvpp/gen/jvppgen/*.py); do \
+ echo ../$${i} /usr/lib/python2.7/dist-packages/jvppgen \
+ >> deb/debian/vpp-dev.install; \
+ done; \
+ \
+ : generate changelog; \
+ ./scripts/generate-deb-changelog \
+ \
+ : Go fabricate the actual Debian packages ; \
+ ( \
+ cd deb && \
+ dpkg-buildpackage -us -uc -b \
+ )
+
diff --git a/build-data/platforms/arm32.mk b/build-data/platforms/arm32.mk
new file mode 100644
index 0000000..47d4ad5
--- /dev/null
+++ b/build-data/platforms/arm32.mk
@@ -0,0 +1,45 @@
+# Copyright (c) 2016 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vector packet processor
+arm32_arch = native
+arm32_native_tools = vppapigen
+
+arm32_uses_dpdk = yes
+arm32_uses_openssl = no
+
+arm32_root_packages = vpp vlib vlib-api vnet svm vpp-api-test \
+ jvpp gmod
+
+vlib_configure_args_arm32 = --with-pre-data=128
+vnet_configure_args_arm32 = --with-dpdk --without-libssl
+vpp_configure_args_arm32 = --with-dpdk --without-libssl
+
+arm32_dpdk_arch = "armv7a"
+arm32_dpdk_target = "arm-armv7a-linuxapp-gcc"
+arm32_dpdk_make_extra_args = "CPU_CFLAGS='-mfloat-abi=hard' \
+ CONFIG_RTE_EAL_IGB_UIO=y \
+ CONFIG_RTE_LIBRTE_E1000_PMD=y \
+ CONFIG_RTE_MAX_LCORE=4 \
+ CONFIG_RTE_MAX_NUMA_NODES=1"
+
+
+arm32_debug_TAG_CFLAGS = -g -O0 -DCLIB_DEBUG -DFORTIFY_SOURCE=2 -DVLIB_MAX_CPUS=4 -march=armv7-a \
+ -fstack-protector-all -fPIC -Werror
+arm32_debug_TAG_LDFLAGS = -g -O0 -DCLIB_DEBUG -DFORTIFY_SOURCE=2 -DVLIB_MAX_CPUS=4 -march=armv7-a \
+ -fstack-protector-all -fPIC -Werror
+
+arm32_TAG_CFLAGS = -g -O2 -DFORTIFY_SOURCE=2 -DVLIB_MAX_CPUS=4 -march=armv7-a \
+ -fstack-protector -fPIC -Werror
+arm32_TAG_LDFLAGS = -g -O2 -DFORTIFY_SOURCE=2 -DVLIB_MAX_CPUS=4 -march=armv7-a \
+ -fstack-protector -fPIC -Werror
diff --git a/build-data/platforms/dpaa2.mk b/build-data/platforms/dpaa2.mk
new file mode 100644
index 0000000..2d4745a
--- /dev/null
+++ b/build-data/platforms/dpaa2.mk
@@ -0,0 +1,66 @@
+# Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Configuration for NXP DPAA2 ARM64 based platform
+dpaa2_arch = aarch64
+dpaa2_os = linux-gnu
+dpaa2_target = aarch64-linux-gnu
+dpaa2_mtune = cortex-A57
+dpaa2_march = "armv8-a+fp+simd+crc+crypto"
+dpaa2_cross_ldflags = \
+ -Wl,--dynamic-linker=/lib/ld-linux-aarch64.so.1 \
+ -Wl,-rpath=/usr/lib64
+
+dpaa2_native_tools = vppapigen
+dpaa2_root_packages = vpp vlib vlib-api vnet svm vpp-api-test
+
+# DPDK configuration parameters
+dpaa2_uses_dpdk = yes
+# Compile with external DPDK only if "DPDK_PATH" variable is defined where we have
+# installed DPDK libraries and headers.
+ifeq ($(PLATFORM),dpaa2)
+ifneq ($(DPDK_PATH),)
+dpaa2_uses_dpdk = yes
+dpaa2_uses_external_dpdk = yes
+dpaa2_dpdk_inc_dir = $(DPDK_PATH)/include/dpdk
+dpaa2_dpdk_lib_dir = $(DPDK_PATH)/lib
+else
+# compile using internal DPDK + NXP DPAA2 Driver patch
+dpaa2_dpdk_arch = "armv8a"
+dpaa2_dpdk_target = "arm64-dpaa2-linuxapp-gcc"
+dpaa2_dpdk_make_extra_args = "CROSS=$(dpaa2_target)- DPDK_PKTMBUF_HEADROOM=256"
+endif
+endif
+
+vpp_configure_args_dpaa2 = --with-dpdk --without-libssl \
+ --with-sysroot=$(SYSROOT)
+vnet_configure_args_dpaa2 = --with-dpdk --without-libssl \
+ --with-sysroot=$(SYSROOT)
+
+# Set these parameters carefully. The vlib_buffer_t is 256 bytes, i.e.
+vlib_configure_args_dpaa2 = --with-pre-data=256
+
+
+dpaa2_debug_TAG_CFLAGS = -g -O2 -DCLIB_DEBUG -fPIC -fstack-protector-all \
+ -march=$(MARCH) -Werror -DCLIB_LOG2_CACHE_LINE_BYTES=6
+dpaa2_debug_TAG_LDFLAGS = -g -O2 -DCLIB_DEBUG -fstack-protector-all \
+ -march=$(MARCH) -Werror -DCLIB_LOG2_CACHE_LINE_BYTES=6
+
+# Use -rdynamic is for stack tracing, O0 for debugging....default is O2
+# Use -DCLIB_LOG2_CACHE_LINE_BYTES to change cache line size
+dpaa2_TAG_CFLAGS = -g -O2 -fPIC -march=$(MARCH) -mcpu=$(dpaa2_mtune) \
+ -mtune=$(dpaa2_mtune) -funroll-all-loops -Werror -DCLIB_LOG2_CACHE_LINE_BYTES=6
+dpaa2_TAG_LDFLAGS = -g -O2 -fPIC -march=$(MARCH) -mcpu=$(dpaa2_mtune) \
+ -mtune=$(dpaa2_mtune) -funroll-all-loops -Werror -DCLIB_LOG2_CACHE_LINE_BYTES=6
+
+
diff --git a/build-data/platforms/qppc.mk b/build-data/platforms/qppc.mk
new file mode 100644
index 0000000..983684f
--- /dev/null
+++ b/build-data/platforms/qppc.mk
@@ -0,0 +1,34 @@
+# Qemu "p-series" powerpc64
+
+qppc_os = linux-gnu
+
+qppc_cross_ldflags = \
+ -Wl,--dynamic-linker=/lib64/ld64.so.1
+
+qppc_arch = powerpc
+
+qppc_root_packages = vppinfra vlib vlib-api vnet svm \
+ vpp vpp-api-test
+
+vnet_configure_args_qppc = \
+ --without-libssl
+
+vpp_configure_args_qppc = \
+ --without-libssl
+
+vlib_configure_args_qppc = --with-pre-data=128
+
+qppc_march=powerpc64
+
+# native tool chain additions for this platform
+qppc_native_tools = vppapigen
+
+qppc_uses_dpdk = no
+
+qppc_debug_TAG_CFLAGS = -m64 -g -O0 -DCLIB_DEBUG -DCLIB_LOG2_CACHE_LINE_BYTES=6 -maltivec
+qppc_debug_TAG_LDFLAGS = -m64 -g -O0 -DCLIB_DEBUG -DCLIB_LOG2_CACHE_LINE_BYTES=6 -maltivec
+
+qppc_TAG_CFLAGS = -m64 -g -O2 -DCLIB_LOG2_CACHE_LINE_BYTES=6 -maltivec
+qppc_TAG_LDFLAGS = -m64 -g -O2 -DCLIB_LOG2_CACHE_LINE_BYTES=6 -maltivec
+
+
diff --git a/build-data/platforms/vpp.mk b/build-data/platforms/vpp.mk
new file mode 100644
index 0000000..7745717
--- /dev/null
+++ b/build-data/platforms/vpp.mk
@@ -0,0 +1,77 @@
+# Copyright (c) 2015 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vector packet processor
+
+MACHINE=$(shell uname -m)
+
+vpp_arch = native
+ifeq ($(MACHINE),$(filter $(MACHINE),x86_64 i686))
+vpp_march = corei7 # Nehalem Instruction set
+vpp_mtune = corei7-avx # Optimize for Sandy Bridge
+else ifeq ($(MACHINE),aarch64)
+ifeq ($(TARGET_PLATFORM),thunderx)
+vpp_march = armv8-a+crc
+vpp_mtune = thunderx
+vpp_dpdk_target = arm64-thunderx-linuxapp-gcc
+else
+vpp_march = native
+vpp_mtune = generic
+endif
+endif
+vpp_native_tools = vppapigen
+
+vpp_uses_dpdk = yes
+
+# Uncoment to enable building unit tests
+# vpp_enable_tests = yes
+
+vpp_root_packages = vpp
+
+# DPDK configuration parameters
+# vpp_uses_dpdk_mlx5_pmd = yes
+# vpp_uses_external_dpdk = yes
+# vpp_dpdk_inc_dir = /usr/include/dpdk
+# vpp_dpdk_lib_dir = /usr/lib
+# vpp_dpdk_shared_lib = yes
+
+# load balancer plugin is not portable on 32 bit platform
+ifeq ($(MACHINE),i686)
+vpp_configure_args_vpp = --disable-lb-plugin
+endif
+
+vpp_debug_TAG_CFLAGS = -g -O0 -DCLIB_DEBUG -DFORTIFY_SOURCE=2 -march=$(MARCH) \
+ -fstack-protector-all -fPIC -Werror
+vpp_debug_TAG_LDFLAGS = -g -O0 -DCLIB_DEBUG -DFORTIFY_SOURCE=2 -march=$(MARCH) \
+ -fstack-protector-all -fPIC -Werror
+
+vpp_TAG_CFLAGS = -g -O2 -DFORTIFY_SOURCE=2 -march=$(MARCH) -mtune=$(MTUNE) \
+ -fstack-protector -fPIC -Werror
+vpp_TAG_LDFLAGS = -g -O2 -DFORTIFY_SOURCE=2 -march=$(MARCH) -mtune=$(MTUNE) \
+ -fstack-protector -fPIC -Werror
+
+vpp_clang_TAG_CFLAGS = -g -O2 -DFORTIFY_SOURCE=2 -march=$(MARCH) -mtune=$(MTUNE) \
+ -fstack-protector -fPIC -Werror
+vpp_clang_TAG_LDFLAGS = -g -O2 -DFORTIFY_SOURCE=2 -march=$(MARCH) -mtune=$(MTUNE) \
+ -fstack-protector -fPIC -Werror
+
+vpp_gcov_TAG_CFLAGS = -g -O0 -DCLIB_DEBUG -march=$(MARCH) \
+ -fPIC -Werror -fprofile-arcs -ftest-coverage
+vpp_gcov_TAG_LDFLAGS = -g -O0 -DCLIB_DEBUG -march=$(MARCH) \
+ -fPIC -Werror -coverage
+
+vpp_coverity_TAG_CFLAGS = -g -O2 -march=$(MARCH) -mtune=$(MTUNE) \
+ -fPIC -Werror -D__COVERITY__
+vpp_coverity_TAG_LDFLAGS = -g -O2 -march=$(MARCH) -mtune=$(MTUNE) \
+ -fPIC -Werror -D__COVERITY__
+
diff --git a/build-root/Makefile b/build-root/Makefile
new file mode 100644
index 0000000..81f7b90
--- /dev/null
+++ b/build-root/Makefile
@@ -0,0 +1,1170 @@
+# Copyright (c) 2015 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Copyright (c) 2007-2008 Eliot Dresselhaus
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+######################################################################
+# Collect makefile fragments
+######################################################################
+
+# Scripts require non-POSIX parts of bash
+SHELL := /bin/bash
+
+# Where this makefile lives
+MU_BUILD_ROOT_DIR = $(shell pwd)
+MU_BUILD_NAME = $(shell basename $(MU_BUILD_ROOT_DIR))
+
+# Search path (e.g. multiple directories) where sources are found.
+SOURCE_PATH =
+
+# Pick up user's definitions for variables e.g. SOURCE_PATH, etc.
+-include build-config.mk
+
+MU_BUILD_ROOT_NAME = $(shell basename $(MU_BUILD_ROOT_DIR))
+MU_BUILD_DATA_DIR_NAME = build-data
+
+ABSOLUTE_SOURCE_PATH = $(foreach d,$(SOURCE_PATH),$(shell cd $(d) && pwd))
+
+SOURCE_PATH_BUILD_ROOT_DIRS = $(addsuffix /$(MU_BUILD_NAME),$(ABSOLUTE_SOURCE_PATH))
+SOURCE_PATH_BUILD_DATA_DIRS = $(addsuffix /$(MU_BUILD_DATA_DIR_NAME),$(ABSOLUTE_SOURCE_PATH))
+
+# For tools use build-root as source path, otherwise use given source path
+FIND_SOURCE_PATH = \
+ $(if $(is_build_tool), \
+ $(SOURCE_PATH_BUILD_ROOT_DIRS) $(MU_BUILD_ROOT_DIR), \
+ $(SOURCE_PATH_BUILD_DATA_DIRS))
+
+# First search given source path, then default to build-root
+FULL_SOURCE_PATH = $(SOURCE_PATH_BUILD_DATA_DIRS) $(MU_BUILD_ROOT_DIR)
+
+# Misc functions
+is_in_fn = $(strip $(filter $(1),$(2)))
+last_fn = $(lastword $1)
+chop_fn = $(wordlist 2,$(words $1),x $1)
+uniq_fn = $(strip $(if $1,$(call uniq_fn,$(call chop_fn,$1)) \
+ $(if $(filter $(call last_fn,$1),$(call chop_fn,$1)),,$(call last_fn,$1))))
+ifdef3_fn = $(if $(patsubst undefined,,$(origin $(1))),$(3),$(2))
+ifdef_fn = $(call ifdef3_fn,$(1),$(2),$($(1)))
+
+_mu_debug = $(warning "$(1) = $($(1))")
+
+$(foreach d,$(FIND_SOURCE_PATH), \
+ $(eval _mu_package_mk_in_$(d) = $(shell find $(d)/packages/*.mk 2> /dev/null)) \
+ $(eval _mu_srcdirs_in_$(d) = \
+ $(shell find $(d)/.. \
+ -maxdepth 1 \
+ -type d \
+ -and -not -name ".." \
+ -and -not -name $(MU_BUILD_ROOT_NAME) \
+ -and -not -name $(MU_BUILD_DATA_DIR_NAME))) \
+ $(eval _mu_non_package_files_in_$(d) = \
+ $(shell find $(d)/packages \
+ -type f \
+ -and -not -name '*.mk' \
+ -and -not -name '*~' 2> /dev/null)) \
+ $(foreach p,$(patsubst %.mk,%,$(notdir $(_mu_package_mk_in_$(d)))), \
+ $(eval _mu_package_dir_$(p) = $(d)) \
+ $(eval _mu_package_mk_$(p) = $(d)/packages/$(p).mk) \
+ ) \
+ $(foreach p,$(notdir $(_mu_srcdirs_in_$(d))), \
+ $(eval _mu_package_srcdir_$(p) = $(shell cd $(d)/../$(p) && pwd)) \
+ ) \
+)
+
+# Find root directory for package based on presence of package .mk
+# makefile fragment on source path.
+_find_build_data_dir_for_package_fn = $(shell \
+ set -eu$(BUILD_DEBUG) ; \
+ for d in $(FIND_SOURCE_PATH) ; do \
+ f="$${d}/packages/$(1).mk" ; \
+ [[ -f $${f} ]] && echo `cd $${d} && pwd` && exit 0 ; \
+ done ; \
+ echo "")
+find_build_data_dir_for_package_fn = $(call ifdef_fn,_mu_package_dir_$(1),)
+
+# dir/PACKAGE
+_find_source_fn = $(shell \
+ set -eu$(BUILD_DEBUG) ; \
+ d="$(call find_build_data_dir_for_package_fn,$(1))" ; \
+ [[ -n "$${d}" ]] && d="$${d}/../$(1)" ; \
+ echo "$${d}")
+find_source_fn = $(call ifdef3_fn,_mu_package_dir_$(1),,$(_mu_package_dir_$(1))/../$(1))
+
+# Find given FILE in source path as build-data/packages/FILE
+find_package_file_fn = $(shell \
+ set -eu$(BUILD_DEBUG) ; \
+ d="$(call find_build_data_dir_for_package_fn,$(1))" ; \
+ [[ -n "$${d}" ]] && d="$${d}/packages/$(2)" ; \
+ [[ -f "$${d}" ]] && echo "$${d}")
+
+# Find first FILE in source path with name PATH/build-data/FILE
+find_build_data_file_fn = $(shell \
+ set -eu$(BUILD_DEBUG) ; \
+ for d in $(FIND_SOURCE_PATH) ; do \
+ f="$${d}/$(1)" ; \
+ [[ -f $${f} ]] && echo `cd $${d} && pwd`/$(1) && exit 0 ; \
+ done ; \
+ echo "")
+
+######################################################################
+# ARCH, PLATFORM
+######################################################################
+
+NATIVE_ARCH = $(shell gcc -dumpmachine | sed -e 's/\([a-zA-Z_0-9]*\)-.*/\1/')
+
+# Find all platforms.mk that we can, including those from build-root
+$(foreach d,$(FULL_SOURCE_PATH), \
+ $(eval -include $(d)/platforms.mk))
+
+# Platform should be defined somewhere by specifying $($(PLATFORM)_arch)
+ARCH = $(strip $($(PLATFORM)_arch))
+ifeq ($(ARCH),)
+ $(error "Unknown platform `$(PLATFORM)'")
+endif
+
+# map e.g. ppc7450 -> ppc
+BASIC_ARCH = \
+ ${shell case '$(ARCH)' in \
+ (native) echo $(NATIVE_ARCH) ;; \
+ (i*86*) echo i386 ;; \
+ (ppc*|powerpc*) echo ppc ;; \
+ (*) echo '$(ARCH)' ;; \
+ esac }
+
+# x86_64 can be either 32/64. set BIACH=32 to get 32 bit libraries.
+BIARCH = 64
+
+aarch64_libdir = 64
+x86_64_libdir = $(BIARCH)
+native_libdir = $($(NATIVE_ARCH)_libdir)
+
+# lib or lib64 depending
+arch_lib_dir = lib$($(BASIC_ARCH)_libdir)
+
+# OS to configure for. configure --host will be set to $(ARCH)-$(OS)
+# Allow per-platform overrides
+
+OS = $(strip $($(PLATFORM)_os))
+ifeq ($(OS),)
+ OS = mu-linux
+endif
+
+spu_target = spu
+native_target =
+
+is_native = $(if $(ARCH:native=),,true)
+not_native = $(if $(ARCH:native=),true,)
+
+ARCH_TARGET_tmp = $(call ifdef_fn,$(ARCH)_target,$(ARCH)-$(OS))
+TARGET = $(call ifdef_fn,$(PLATFORM)_target,$(ARCH_TARGET_tmp))
+TARGET_PREFIX = $(if $(not_native),$(TARGET)-,)
+
+# CPU microarchitecture detection.
+# Either set <platform>_march in build-data/platforms/<platform>.mk,
+# or detect and use the build-host instruction set
+
+MARCH = $(strip $($(PLATFORM)_march))
+ifeq ($(MARCH),)
+ ifneq ($(wildcard $(TOOL_INSTALL_DIR)/bin/$(TARGET)-gcc),)
+ TARGET_GCC = $(TOOL_INSTALL_DIR)/bin/$(TARGET)-gcc
+ else ifneq ($(wildcard $(MU_BUILD_ROOT_DIR)/tools/bin/$(TARGET)-gcc),)
+ TARGET_GCC = $(MU_BUILD_ROOT_DIR)/tools/bin/$(TARGET)-gcc
+ endif
+ ifneq ($(TARGET_GCC),)
+ MARCH = $(shell $(TARGET_GCC) -Q --help=target -march=native | grep march | sed -e 's/.*march=[[:space:]]*//')
+ else
+ MARCH = native
+ endif
+else
+ ifeq ($(MARCH),nehalem)
+ override MARCH = corei7
+ else ifeq ($(MARCH),westmere)
+ override MARCH = corei7
+ else ifeq ($(MARCH),sandybridge)
+ override MARCH = corei7-avx
+ else ifeq ($(MARCH),ivybridge)
+ override MARCH = core-avx-i
+ else ifeq ($(MARCH),haswell)
+ override MARCH = core-avx2
+ endif
+endif
+export MARCH
+
+MTUNE = $(strip $($(PLATFORM)_mtune))
+ifeq ($(MTUNE),)
+ MTUNE = generic
+endif
+
+######################################################################
+# Generic build stuff
+######################################################################
+
+# The package we are currently working on
+PACKAGE = $*
+
+# Build/install tags. This lets you have different CFLAGS/CPPFLAGS/LDFLAGS
+# for e.g. debug versus optimized compiles. Each tag has its own set of build/install
+# areas.
+TAG =
+TAG_PREFIX = $(if $(TAG),$(TAG)-)
+
+# yes you need the space
+tag_var_with_added_space_fn = $(if $($(TAG)_TAG_$(1)),$($(TAG)_TAG_$(1)) )
+
+# TAG=debug for debugging
+debug_TAG_CFLAGS = -g -O0 -DCLIB_DEBUG -DFORTIFY_SOURCE=2 -march=$(MARCH) \
+ -fstack-protector-all -fPIC
+debug_TAG_LDFLAGS = -g -O0 -DCLIB_DEBUG -DFORTIFY_SOURCE=2 -march=$(MARCH) \
+ -fstack-protector-all -fPIC
+
+BUILD_PREFIX_package = build-$(TAG_PREFIX)
+BUILD_PREFIX_tool = build-tool-$(TAG_PREFIX)
+INSTALL_PREFIX = install-$(TAG_PREFIX)
+IMAGES_PREFIX = images-$(TAG_PREFIX)
+
+# Whether we are building a tool or not
+tool_or_package_fn = $(if $(is_build_tool),tool,package)
+
+# Directory where packages are built & installed
+BUILD_DIR = $(MU_BUILD_ROOT_DIR)/$(BUILD_PREFIX_$(call tool_or_package_fn))$(ARCH)
+
+## BURT
+# we will deprecate INSTALL_DIR shortly for DFLT_INSTALL_DIR
+INSTALL_DIR = $(MU_BUILD_ROOT_DIR)/$(INSTALL_PREFIX)$(ARCH)
+# DFLT_INSTALL_DIR used in platforms.mk for $(PLATFORM)_DESTDIR_BASE
+DFLT_INSTALL_DIR := $(MU_BUILD_ROOT_DIR)/$(INSTALL_PREFIX)$(ARCH)
+## BURT
+
+PLATFORM_IMAGE_DIR = $(MU_BUILD_ROOT_DIR)/$(IMAGES_PREFIX)$(PLATFORM)
+
+# $(call VAR,DEFAULT)
+override_var_with_default_fn = $(if $($(1)),$($(1)),$(2))
+
+# $(call if_directory_exists_fn,D1,D2) returns D1 if it exists else D2
+define if_directory_exists_fn
+$(shell if test -d $(1); then echo $(1); else echo $(2); fi)
+endef
+
+# $(call if_file_exists_fn,F1,F2) returns F1 if it exists else F2
+define if_file_exists_fn
+$(shell if test -f $(1); then echo $(1); else echo $(2); fi)
+endef
+
+# Default VAR, package specified override of default PACKAGE_VAR
+package_var_fn = $(call override_var_with_default_fn,$(1)_$(2),$(1))
+
+package_build_dir_fn = $(call package_var_fn,$(1),build_dir)
+
+package_install_dir_fn = \
+ $(if $(is_build_tool),$(TOOL_INSTALL_DIR),$(INSTALL_DIR)/$(call package_build_dir_fn,$(1)))
+
+PACKAGE_BUILD_DIR = \
+ $(BUILD_DIR)/$(call package_build_dir_fn,$(PACKAGE))
+PACKAGE_INSTALL_DIR = \
+ $(call package_install_dir_fn,$(PACKAGE))
+
+# Tools (gcc, binutils, glibc...) are installed here
+TOOL_INSTALL_DIR = $(MU_BUILD_ROOT_DIR)/tools
+
+# Target specific tools go here e.g. mu-build/tools/ppc-mu-linux
+TARGET_TOOL_INSTALL_DIR = $(TOOL_INSTALL_DIR)/$(TARGET)
+
+# Set BUILD_DEBUG to vx or x enable shell command tracing.
+BUILD_DEBUG =
+
+# Message from build system itself (as opposed to make or shell commands)
+build_msg_fn = echo "@@@@ $(1) @@@@"
+
+# Allow CCACHE_DIR to be overridden, e.g. in .../build-root/build-config.mk
+ifeq ($(CCACHE_DIR),)
+ CCACHE_DIR=$(MU_BUILD_ROOT_DIR)/.ccache
+endif
+
+# Always prefer our own tools to those installed on system.
+# Note: ccache-bin must be before tool bin.
+BUILD_ENV = \
+ export CCACHE_DIR=$(CCACHE_DIR) ; \
+ export PATH=$(TOOL_INSTALL_DIR)/ccache-bin:$(TOOL_INSTALL_DIR)/bin:$${PATH} ; \
+ export PATH="`echo $${PATH} | sed -e s/[.]://`" ; \
+ $(if $(not_native),export CONFIG_SITE=$(MU_BUILD_ROOT_DIR)/config.site ;,) \
+ export LD_LIBRARY_PATH=$(TOOL_INSTALL_DIR)/lib64:$(TOOL_INSTALL_DIR)/lib ; \
+ set -eu$(BUILD_DEBUG) ; \
+ set -o pipefail
+
+######################################################################
+# Package build generic definitions
+######################################################################
+
+package_dir_fn = \
+ $(call find_build_data_dir_for_package_fn,$(1))/packages
+
+package_mk_fn = $(call package_dir_fn,$(1))/$(1).mk
+
+### BURT
+
+#next version
+#pkgPhaseDependMacro = $(foreach x,configure build install, \
+ $(eval $(1)_$(x)_depend := $($(1)_depend:%=%-$(x))))
+#version equivalent to original code
+pkgPhaseDependMacro = $(eval $(1)_configure_depend := $($(1)_depend:%=%-install))
+
+### BURT
+
+# Pick up built-root/pre-package-include.mk for all source directories
+$(foreach d,$(SOURCE_PATH_BUILD_ROOT_DIRS), \
+ $(eval -include $(d)/pre-package-include.mk))
+
+$(foreach d,$(addsuffix /packages,$(FIND_SOURCE_PATH)), \
+ $(eval -include $(d)/*.mk) \
+ $(eval ALL_PACKAGES += $(patsubst $(d)/%.mk,%,$(wildcard $(d)/*.mk))) \
+)
+
+# Pick up built-root/post-package-include.mk for all source directories
+$(foreach d,$(SOURCE_PATH_BUILD_ROOT_DIRS), \
+ $(eval -include $(d)/post-package-include.mk))
+
+# Linux specific native build tools
+NATIVE_TOOLS_LINUX = \
+ e2fsimage \
+ e2fsprogs \
+ fakeroot \
+ jffs2 \
+ mkimage \
+ zlib \
+ xz \
+ squashfs
+
+IS_LINUX = $(if $(findstring no,$($(PLATFORM)_uses_linux)),no,yes)
+
+NATIVE_TOOLS_$(IS_LINUX) += $(NATIVE_TOOLS_LINUX)
+
+# only build glibc for linux installs
+CROSS_TOOLS_$(IS_LINUX) += glibc gcc
+
+# must be first for bootstrapping
+NATIVE_TOOLS = findutils make
+
+# basic tools needed for build system
+NATIVE_TOOLS += git automake autoconf libtool texinfo bison flex tar
+
+# needed to compile gcc
+NATIVE_TOOLS += mpfr gmp mpc
+
+# Tool to sign binaries
+NATIVE_TOOLS += sign
+
+# ccache
+NATIVE_TOOLS += ccache
+
+# Tools needed on native host to build for platform
+NATIVE_TOOLS += $(call ifdef_fn,$(PLATFORM)_native_tools,)
+
+# Tools for cross-compiling from native -> ARCH
+CROSS_TOOLS = binutils gcc-bootstrap gdb
+
+# Tools needed on native host to build for platform
+CROSS_TOOLS += $(call ifdef_fn,$(PLATFORM)_cross_tools,)
+
+NATIVE_TOOLS += $(NATIVE_TOOLS_yes)
+CROSS_TOOLS += $(CROSS_TOOLS_yes)
+
+timestamp_name_fn = .mu_build_$(1)_timestamp
+CONFIGURE_TIMESTAMP = $(call timestamp_name_fn,configure)
+BUILD_TIMESTAMP = $(call timestamp_name_fn,build)
+INSTALL_TIMESTAMP = $(call timestamp_name_fn,install)
+
+TIMESTAMP_DIR = $(PACKAGE_BUILD_DIR)
+
+find_newer_files_fn = \
+ "`for i in $(2) ; do \
+ [[ -f $$i && $$i -nt $(1) ]] && echo "$$i" && exit 0; \
+ done ; \
+ exit 0;`"
+
+find_filter = -not -name '*~'
+find_filter += -and -not -path '*/.git*'
+find_filter += -and -not -path '*/.svn*'
+find_filter += -and -not -path '*/.CVS*'
+find_filter += -and -not -path '*/manual/*'
+find_filter += -and -not -path '*/autom4te.cache/*'
+find_filter += -and -not -path '*/doc/all-cfg.texi'
+find_filter += -and -not -path '*/.mu_build_*'
+
+find_newer_filtered_fn = \
+ (! -f $(1) \
+ || -n $(call find_newer_files_fn,$(1),$(3)) \
+ || -n "`find -H $(2) \
+ -type f \
+ -and -newer $(1) \
+ -and \( $(4) \) \
+ -print -quit`")
+
+find_newer_fn = \
+ $(call find_newer_filtered_fn,$(1),$(2),$(3),$(find_filter))
+
+######################################################################
+# Package dependencies
+######################################################################
+
+# This must come before %-configure, %-build, %-install pattern rules
+# or else dependencies will not work.
+
+package_dependencies_fn = \
+ $(patsubst %-install, %, \
+ $(filter %-install,$($(1)_configure_depend)))
+
+PACKAGE_DEPENDENCIES = $(call package_dependencies_fn,$(PACKAGE))
+
+# package specific configure, build, install dependencies
+add_package_dependency_fn = \
+ $(if $($(1)_$(2)_depend), \
+ $(eval $(1)-$(2) : $($(1)_$(2)_depend)))
+
+$(foreach p,$(ALL_PACKAGES), \
+ $(call add_package_dependency_fn,$(p),configure) \
+ $(call add_package_dependency_fn,$(p),build) \
+ $(call add_package_dependency_fn,$(p),install))
+
+TARGETS_RESPECTING_DEPENDENCIES = image_install wipe diff push-all pull-all find-source
+
+# carry over packages dependencies to image install, wipe, pull-all, push-all
+$(foreach p,$(ALL_PACKAGES), \
+ $(if $($(p)_configure_depend), \
+ $(foreach s,$(TARGETS_RESPECTING_DEPENDENCIES), \
+ $(eval $(p)-$(s): \
+ $(addsuffix -$(s), $(call package_dependencies_fn,$(p)))))))
+
+# recursively resolve dependencies
+resolve_dependencies2_fn = $(strip \
+ $(eval __added = $(filter-out $(4), \
+ $(call uniq_fn, \
+ $(foreach l,$(3), \
+ $(call ifdef3_fn,$(l)$(1),,$(call $(2),$($(l)$(1)))) \
+ )))) \
+ $(eval __known = $(call uniq_fn,$(4) $(3) $(__added))) \
+ $(if $(__added), \
+ $(call resolve_dependencies2_fn,$(1),$(2),$(__added),$(__known)), \
+ $(__known)) \
+)
+
+resolve_dependencies_null_fn = $(1)
+
+resolve_dependencies_fn = $(call resolve_dependencies2_fn,$(1),resolve_dependencies_null_fn,$(2))
+
+######################################################################
+# Package configure
+######################################################################
+
+# x86_64 can be either 32/64. set BIACH=32 to get 32 bit libraries.
+BIARCH = 64
+
+x86_64_libdir = $(BIARCH)
+native_libdir = $($(NATIVE_ARCH)_libdir)
+
+# lib or lib64 depending
+arch_lib_dir = lib$($(BASIC_ARCH)_libdir)
+
+# find dynamic linker as absolute path
+TOOL_INSTALL_LIB_DIR=$(TOOL_INSTALL_DIR)/$(TARGET)/$(arch_lib_dir)
+DYNAMIC_LINKER=${shell cd $(TOOL_INSTALL_LIB_DIR); echo ld*.so.*}
+
+# Pad dynamic linker & rpath so elftool will never have to change ELF section sizes.
+# Yes, this is a kludge.
+lots_of_slashes_to_pad_names = "/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+
+# When PLATFORM != native we *always* use our own versions of GLIBC and dynamic linker
+# Allow per-platform overrides
+CROSS_LDFLAGS = $(strip $($(PLATFORM)_cross_ldflags))
+ifeq ($(CROSS_LDFLAGS),)
+ CROSS_LDFLAGS = \
+ -Wl,--dynamic-linker=$(lots_of_slashes_to_pad_names)$(TOOL_INSTALL_LIB_DIR)/$(DYNAMIC_LINKER) \
+ -Wl,-rpath -Wl,$(lots_of_slashes_to_pad_names)$(TOOL_INSTALL_LIB_DIR)
+endif
+
+cross_ldflags = $(if $(is_native)$(is_build_tool),,$(CROSS_LDFLAGS) )
+
+# $(call installed_libs_fn,PACKAGE)
+# Return install library directory for given package.
+# Some packages (e.g. openssl) don't install under lib64; instead they use lib
+define installed_lib_fn
+$(call if_directory_exists_fn,
+ $(call package_install_dir_fn,$(1))/$(arch_lib_dir),
+ $(call package_install_dir_fn,$(1))/lib)
+endef
+
+# Set -L and rpath to point to dependent libraries previously built by us.
+installed_libs_fn = \
+ $(foreach i,$(1), \
+ -L$(call installed_lib_fn,$(i)) \
+ -Wl,-rpath -Wl,$(call installed_lib_fn,$(i)))
+
+# As above for include files
+installed_include_fn = $(call package_install_dir_fn,$(1))/include
+
+installed_includes_fn = $(foreach i,$(1),-I$(call installed_include_fn,$(i)))
+
+# By default package CPPFLAGS (to set include path -I) and LDFLAGS (to set link path -L)
+# point at dependent install directories.
+DEFAULT_CPPFLAGS = $(call installed_includes_fn, $(PACKAGE_DEPENDENCIES))
+DEFAULT_LDFLAGS = $(call installed_libs_fn, $(PACKAGE_DEPENDENCIES))
+
+configure_var_fn = \
+ $(call tag_var_with_added_space_fn,$(1))$(call override_var_with_default_fn,$(PACKAGE)_$(1),$(DEFAULT_$(1)))
+configure_ldflags_fn = \
+ $(cross_ldflags)$(call configure_var_fn,LDFLAGS)
+
+# Allow packages to override CPPFLAGS, CFLAGS, and LDFLAGS
+CONFIGURE_ENV = \
+ $(if $(call configure_var_fn,CPPFLAGS), \
+ CPPFLAGS="$(CPPFLAGS) $(call configure_var_fn,CPPFLAGS)") \
+ $(if $(call configure_var_fn,CFLAGS), \
+ CFLAGS="$(CFLAGS) $(call configure_var_fn,CFLAGS)") \
+ $(if $(call configure_var_fn,CCASFLAGS), \
+ CCASFLAGS="$(CCASFLAGS) $(call configure_var_fn,CCASFLAGS)") \
+ $(if $(call configure_ldflags_fn), \
+ LDFLAGS="$(LDFLAGS) $(call configure_ldflags_fn)") \
+ $(if $($(PACKAGE)_configure_env),$($(PACKAGE)_configure_env))
+
+### BURT
+# only partially used now (used in a few .mk files)
+ifeq ($(is_build_tool),yes)
+prefix = $(PACKAGE_INSTALL_DIR)
+libdir = $(PACKAGE_INSTALL_DIR)/$(arch_lib_dir)
+libexecdir = $(PACKAGE_INSTALL_DIR)/usr/libexec
+DESTDIR = /
+else
+# Eventually simplify this with no per package DESTDIR or prefix
+ppdMacro = $(if $(PER_PACKAGE_DESTDIR),$(call package_build_dir_fn,$(1)))
+pppMacro = $(if $(PER_PACKAGE_PREFIX),$(call package_build_dir_fn,$(1)))
+prefixMacro = $($(PLATFORM)_PREFIX_BASE)/$(pppMacro)
+prefix = $(call prefixMacro,$(PACKAGE))
+libdir = $($(PLATFORM)_LIBDIR)
+libexecdir = $($(PLATFORM)_LIBEXECDIR)
+destdirMacro = $($(PLATFORM)_DESTDIR_BASE)$(ppdMacro)
+DESTDIR = $(call destdirMacro,$(PACKAGE))
+endif
+### BURT
+### dbarach
+image_extra_dependencies = $($(PLATFORM)_image_extra_dependencies)
+### dbarach
+
+configure_package_gnu = \
+ s=$(call find_source_fn,$(PACKAGE_SOURCE))$(PACKAGE_SUBDIR) ; \
+ if [ ! -f $$s/configure ] ; then \
+ autoreconf -i -f $$s ; \
+ fi ; \
+ cd $(PACKAGE_BUILD_DIR) ; \
+ env $(CONFIGURE_ENV) \
+ $$s/configure \
+ $(if $($(PACKAGE)_configure_host_and_target), \
+ $($(PACKAGE)_configure_host_and_target), \
+ $(if $(not_native),--host=$(TARGET),)) \
+ $(if $($(PACKAGE)_configure_prefix), \
+ $($(PACKAGE)_configure_prefix), \
+ --libdir=$(PACKAGE_INSTALL_DIR)/$(arch_lib_dir) \
+ --prefix=$(PACKAGE_INSTALL_DIR)) \
+ $($(PACKAGE)_configure_args) \
+ $($(PACKAGE)_configure_args_$(PLATFORM))
+
+configure_package = \
+ $(call build_msg_fn,Configuring $(PACKAGE) in $(PACKAGE_BUILD_DIR)) ; \
+ mkdir -p $(PACKAGE_BUILD_DIR) ; \
+ $(if $($(PACKAGE)_configure), \
+ $($(PACKAGE)_configure), \
+ $(configure_package_gnu))
+
+# Tools (e.g. gcc, binutils, gdb) required a platform to build for
+check_platform = \
+ is_tool="$(is_build_tool)" ; \
+ is_cross_package="$(findstring $(PACKAGE),$(CROSS_TOOLS))" ; \
+ is_arch_native="$(if $(subst native,,$(ARCH)),,yes)" ; \
+ if [ "$${is_tool}" == "yes" \
+ -a "$${is_cross_package}" != "" \
+ -a "$${is_arch_native}" != "" ]; then \
+ $(call build_msg_fn,You must specify PLATFORM for building tools) ; \
+ exit 1 ; \
+ fi ; \
+ : check that platform gcc can be found ; \
+ target_gcc=gcc ; \
+ if [ "$${is_arch_native}" != "yes" ] ; then \
+ target_gcc=$(TARGET)-gcc ; \
+ fi ; \
+ if [ "$${is_tool}" != "yes" \
+ -a "$${is_arch_native}" != "yes" \
+ -a ! -x "`which 2> /dev/null $${target_gcc}`" ] ; then \
+ $(call build_msg_fn, \
+ No cross-compiler found for platform $(PLATFORM) target $(TARGET); \
+ try make PLATFORM=$(PLATFORM) install-tools) ; \
+ exit 1 ; \
+ fi
+
+configure_check_timestamp = \
+ @$(BUILD_ENV) ; \
+ $(check_platform) ; \
+ mkdir -p $(PACKAGE_BUILD_DIR) ; \
+ mkdir -p $(PACKAGE_INSTALL_DIR) ; \
+ conf="$(TIMESTAMP_DIR)/$(CONFIGURE_TIMESTAMP)" ; \
+ dirs="$(call package_mk_fn,$(PACKAGE)) \
+ $(wildcard $(call find_source_fn, \
+ $(PACKAGE_SOURCE))$(PACKAGE_SUBDIR)/configure) \
+ $(MU_BUILD_ROOT_DIR)/config.site" ; \
+ if [[ $(call find_newer_fn, $${conf}, $${dirs}, $?) ]]; then \
+ $(configure_package) ; \
+ touch $${conf} ; \
+ else \
+ $(call build_msg_fn,Configuring $(PACKAGE): nothing to do) ; \
+ fi
+
+.PHONY: %-configure
+%-configure: %-find-source
+ $(configure_check_timestamp)
+
+######################################################################
+# Package build
+######################################################################
+
+# /proc/cpuinfo does not exist on platforms without a /proc and on some
+# platforms, notably inside containers, it has no content. In those cases
+# we assume there's 1 processor; we use 2*ncpu for the -j option.
+# NB: GNU Make 4.2 will let us use '$(file </proc/cpuinfo)' to both test
+# for file presence and content; for now this will have to do.
+MAKE_PARALLEL_JOBS = -j $(if $(shell [ -f /proc/cpuinfo ] && head /proc/cpuinfo), \
+ $(shell expr 2 '*' $$(grep -c ^processor /proc/cpuinfo)), 2)
+MAKE_PARALLEL_FLAGS = $(if $($(PACKAGE)_make_parallel_fails),,$(MAKE_PARALLEL_JOBS))
+
+# Make command shorthand for packages & tools.
+PACKAGE_MAKE = \
+ $(MAKE) \
+ -C $(PACKAGE_BUILD_DIR) \
+ $($(PACKAGE)_make_args) \
+ $(MAKE_PARALLEL_FLAGS)
+
+build_package = \
+ $(call build_msg_fn,Building $* in $(PACKAGE_BUILD_DIR)) ; \
+ mkdir -p $(PACKAGE_BUILD_DIR) ; \
+ cd $(PACKAGE_BUILD_DIR) ; \
+ $(if $($(PACKAGE)_build), \
+ $($(PACKAGE)_build), \
+ $(PACKAGE_MAKE))
+
+build_check_timestamp = \
+ @$(BUILD_ENV) ; \
+ comp="$(TIMESTAMP_DIR)/$(BUILD_TIMESTAMP)" ; \
+ conf="$(TIMESTAMP_DIR)/$(CONFIGURE_TIMESTAMP)" ; \
+ dirs="$(call find_source_fn,$(PACKAGE_SOURCE)) \
+ $($(PACKAGE)_build_timestamp_depends) \
+ $(if $(is_build_tool),,$(addprefix $(INSTALL_DIR)/,$(PACKAGE_DEPENDENCIES)))" ; \
+ if [[ $${conf} -nt $${comp} \
+ || $(call find_newer_fn, $${comp}, $${dirs}, $?) ]]; then \
+ $(build_package) ; \
+ touch $${comp} ; \
+ else \
+ $(call build_msg_fn,Building $(PACKAGE): nothing to do) ; \
+ fi
+
+.PHONY: %-build
+%-build: %-configure
+ $(build_check_timestamp)
+
+.PHONY: %-rebuild
+%-rebuild: %-wipe %-build
+ @ :
+
+######################################################################
+# Package install
+######################################################################
+
+install_package = \
+ : by default, for non-tools, remove any previously installed bits ; \
+ $(if $(is_build_tool)$($(PACKAGE)_keep_instdir), \
+ true, \
+ rm -rf $(PACKAGE_INSTALL_DIR)); \
+ mkdir -p $(PACKAGE_INSTALL_DIR) ; \
+ $(if $($(PACKAGE)_pre_install),$($(PACKAGE)_pre_install),true); \
+ $(if $($(PACKAGE)_install), \
+ $($(PACKAGE)_install), \
+ $(PACKAGE_MAKE) \
+ $($(PACKAGE)_install_args) \
+ install) ; \
+ $(if $($(PACKAGE)_post_install),$($(PACKAGE)_post_install),true)
+
+install_check_timestamp = \
+ @$(BUILD_ENV) ; \
+ inst=$(TIMESTAMP_DIR)/$(INSTALL_TIMESTAMP) ; \
+ dirs="$(PACKAGE_BUILD_DIR) \
+ $($(PACKAGE)_install_dependencies)" ; \
+ if [[ $(call find_newer_fn, $${inst}, $${dirs}, $?) ]]; then \
+ $(call build_msg_fn,Installing $(PACKAGE)) ; \
+ $(install_package) ; \
+ touch $${inst} ; \
+ else \
+ $(call build_msg_fn,Installing $(PACKAGE): nothing to do) ; \
+ fi
+
+.PHONY: %-install
+%-install: %-build
+ $(install_check_timestamp)
+
+######################################################################
+# Source code managment
+######################################################################
+
+GIT = git
+
+# Maps package name to source directory root.
+# Multiple packages may use a single source tree.
+# For example, gcc-bootstrap package shares gcc source.
+PACKAGE_SOURCE = $(if $($(PACKAGE)_source),$($(PACKAGE)_source),$(PACKAGE))
+PACKAGE_SUBDIR = $(if $($(PACKAGE)_configure_subdir),/$($(PACKAGE)_configure_subdir),)
+
+# Use git to download source if directory is not found
+find_source_for_package = \
+ @$(BUILD_ENV) ; \
+ $(call build_msg_fn,Arch for platform '$(PLATFORM)' is $(ARCH)) ; \
+ $(call build_msg_fn,Finding source for $(PACKAGE)) ; \
+ s="$(call find_source_fn,$(PACKAGE_SOURCE))" ; \
+ [[ -z "$${s}" ]] \
+ && $(call build_msg_fn,Package $(PACKAGE) not found with path $(SOURCE_PATH)) \
+ && exit 1; \
+ mk="$(call find_build_data_dir_for_package_fn,$(PACKAGE_SOURCE))/packages/$(PACKAGE).mk"; \
+ $(call build_msg_fn,Makefile fragment found in $${mk}) ; \
+ if [ ! -d "$${s}" ] ; then \
+ d=`dirname $${mk}` ; \
+ i=`cd $${d}/.. && ($(GIT) config remote.origin.url || \
+ awk '/URL/ { print $$2; }' .git/remotes/origin)`; \
+ g=`dirname $${i}` ; \
+ $(call build_msg_fn,Fetching source: $(GIT) clone $${g}/$(PACKAGE_SOURCE) $$s) ; \
+ if ! $(GIT) clone $${g}/$(PACKAGE_SOURCE) $$s; then \
+ $(call build_msg_fn,No source for $(PACKAGE) in $${g}); \
+ exit 1; \
+ fi ; \
+ $(call build_msg_fn,Fix file dates in $${g}/$(PACKAGE_SOURCE)) ; \
+ (cd $${s} ; $(MU_BUILD_ROOT_DIR)/autowank --touch) ; \
+ fi ; \
+ s=`cd $${s} && pwd` ; \
+ $(call build_msg_fn,Source found in $${s})
+
+.PHONY: %-find-source
+%-find-source:
+ $(find_source_for_package)
+
+.PHONY: %-push %-pull %-push-all %-pull-all
+%-push %-pull %-push-all %-pull-all:
+ @$(BUILD_ENV) ; \
+ push_or_pull=$(patsubst %-all,%,$(subst $(PACKAGE)-,,$@)) ; \
+ $(call build_msg_fn,Git $${push_or_pull} source for $(PACKAGE)) ; \
+ s=$(call find_source_fn,$(PACKAGE_SOURCE)) ; \
+ if [ "x$$s" = "x" ]; then \
+ $(call build_msg_fn,No source for $(PACKAGE)) ; \
+ exit 1; \
+ fi ; \
+ cd $$s && $(GIT) $${push_or_pull}
+
+# Pull all packages for platform
+.PHONY: pull-all
+pull-all:
+ @$(BUILD_ENV) ; \
+ $(call build_msg_fn,Git pull build system) ; \
+ for d in $(MU_BUILD_ROOT_DIR) \
+ $(SOURCE_PATH_BUILD_ROOT_DIRS) \
+ $(SOURCE_PATH_BUILD_DATA_DIRS); do \
+ $(call build_msg_fn,Git pull $${d}) ; \
+ pushd $${d} >& /dev/null && $(GIT) pull && popd >& /dev/null ; \
+ done ; \
+ $(call build_msg_fn,Git pull build tools) ; \
+ $(call tool_make_target_fn,pull-all) ; \
+ $(call build_msg_fn,Git pull packages for platform $(PLATFORM)) ; \
+ make PLATFORM=$(PLATFORM) $(patsubst %,%-pull-all,$(ROOT_PACKAGES))
+
+.PHONY: %-diff
+%-diff:
+ @$(BUILD_ENV) ; \
+ d=$(call find_source_fn,$(PACKAGE_SOURCE)) ; \
+ $(call build_msg_fn,Git diff $(PACKAGE)) ; \
+ if [ -d $${d}/.git ] ; then \
+ cd $${d} && $(GIT) --no-pager diff 2>/dev/null; \
+ else \
+ $(call build_msg_fn, $(PACKAGE) not a git directory) ; \
+ fi
+
+
+
+# generate diffs for everything in source path
+.PHONY: diff-all
+diff-all:
+ @$(BUILD_ENV) ; \
+ $(call build_msg_fn,Generate diffs) ; \
+ for r in $(ABSOLUTE_SOURCE_PATH); do \
+ for d in $${r}/* ; do \
+ if [ -d $${d} ] ; then \
+ $(call build_msg_fn,Git diff $${d}) ; \
+ if [ -d $${d}/.git ] ; then \
+ cd $${d} && $(GIT) --no-pager diff 2>/dev/null; \
+ else \
+ $(call build_msg_fn, $${d} not a git directory) ; \
+ fi ; \
+ fi ; \
+ done ; \
+ done
+
+######################################################################
+# System images
+######################################################################
+
+IMAGE_DIR = $(MU_BUILD_ROOT_DIR)/image-$(PLATFORM)
+
+# Reports shared libraries in given directory
+find_shared_libs_fn = \
+ find $(1) \
+ -maxdepth 1 \
+ -regex '.*/lib[a-z0-9_]+\+?\+?.so' \
+ -o -regex '.*/lib[a-z0-9_]+-[0-9.]+\+?\+?.so' \
+ -o -regex '.*/lib[a-z0-9_]+\+?\+?.so.[0-9.]+'
+
+# By default pick up files from binary directories and /etc.
+# Also include shared libraries.
+DEFAULT_IMAGE_INCLUDE = \
+ for d in bin sbin libexec \
+ usr/bin usr/sbin usr/libexec \
+ etc; do \
+ [[ -d $$d ]] && echo $$d; \
+ done ; \
+ [[ -d $(arch_lib_dir) ]] \
+ && $(call find_shared_libs_fn,$(arch_lib_dir))
+
+# Define any shell functions needed by install scripts
+image_install_functions = \
+ $(foreach p,$(ALL_PACKAGES), \
+ $(if $($(p)_image_install_functions), \
+ $($(p)_image_install_functions)))
+
+# Should always be over-written by temp dir in %-root-image rule
+IMAGE_INSTALL_DIR = $(error you need to set IMAGE_INSTALL_DIR)
+
+image_install_fn = \
+ @$(BUILD_ENV) ; \
+ $(call build_msg_fn,Image-install $(1) for platform $(PLATFORM)) ; \
+ inst_dir=$(IMAGE_INSTALL_DIR) ; \
+ mkdir -p $${inst_dir} ; \
+ cd $(2) ; \
+ : select files to include in image ; \
+ image_include_files=" \
+ `$(call ifdef_fn,$(1)_image_include,$(DEFAULT_IMAGE_INCLUDE)) ; \
+ echo "" ; \
+ exit 0 ; `"; \
+ : select files regexps to exclude from image ; \
+ image_exclude_files="" ; \
+ if [ ! -z "$($(1)_image_exclude)" ] ; then \
+ image_exclude_files="${image_exclude_files} \
+ $(patsubst %,--exclude=%,$($(1)_image_exclude))" ; \
+ fi ; \
+ [[ -z "$${image_include_files}" || $${image_include_files} == " " ]] \
+ || tar cf - $${image_include_files} $${image_exclude_files} \
+ | tar xf - -C $${inst_dir} ; \
+ : copy files from copyimg directories on source path if present ; \
+ for build_data_dir in $(SOURCE_PATH_BUILD_DATA_DIRS) ; do \
+ d="$${build_data_dir}/packages/$(1).copyimg" ; \
+ if [ -d "$${d}" ] ; then \
+ env $($(PLATFORM)_copyimg_env) \
+ $(MU_BUILD_ROOT_DIR)/copyimg $${d} $${inst_dir} ; \
+ fi ; \
+ done ; \
+ : run package dependent install script ; \
+ $(if $($(1)_image_install), \
+ $(image_install_functions) \
+ cd $${inst_dir} ; \
+ $($(1)_image_install))
+
+.PHONY: %-image_install
+%-image_install: %-install
+ $(call image_install_fn,$(PACKAGE),$(PACKAGE_INSTALL_DIR))
+
+basic_system_image_include = \
+ $(call ifdef_fn,$(PLATFORM)_basic_system_image_include, \
+ echo bin/ldd ; \
+ echo $(arch_lib_dir)/ld*.so* ; \
+ $(call find_shared_libs_fn, $(arch_lib_dir)))
+
+basic_system_image_install = \
+ mkdir -p bin lib mnt proc root sbin sys tmp etc ; \
+ mkdir -p usr usr/{bin,sbin} usr/lib ; \
+ mkdir -p var var/{lib,lock,log,run,tmp} ; \
+ mkdir -p var/lock/subsys var/lib/urandom
+
+.PHONY: basic_system-image_install
+basic_system-image_install: # linuxrc-install
+ $(if $(not_native), \
+ $(call image_install_fn,basic_system,$(TARGET_TOOL_INSTALL_DIR)),)
+
+ROOT_PACKAGES = $(if $($(PLATFORM)_root_packages),$($(PLATFORM)_root_packages),$(default_root_packages))
+
+.PHONY: install-packages
+install-packages: $(patsubst %,%-find-source,$(ROOT_PACKAGES))
+ @$(BUILD_ENV) ; \
+ set -eu$(BUILD_DEBUG) ; \
+ d=$(MU_BUILD_ROOT_DIR)/packages-$(PLATFORM) ; \
+ rm -rf $${d} ; \
+ mkdir -p $${d}; \
+ $(MAKE) -C $(MU_BUILD_ROOT_DIR) IMAGE_INSTALL_DIR=$${d} \
+ $(patsubst %,%-image_install, \
+ basic_system \
+ $(ROOT_PACKAGES)) || exit 1; \
+ $(call build_msg_fn, Relocating ELF executables to run in $${d}) ; \
+ find $${d} -type f \
+ -exec elftool quiet in '{}' out '{}' \
+ set-interpreter \
+ $${d}/$(arch_lib_dir)/$(DYNAMIC_LINKER) \
+ set-rpath $${d}/$(arch_lib_dir):$${d}/lib ';' ; \
+ : strip symbols from files ; \
+ if [ $${strip_symbols:-no} = 'yes' ] ; then \
+ $(call build_msg_fn, Stripping symbols from files) ; \
+ find $${d} -type f \
+ -exec \
+ $(TARGET_PREFIX)strip \
+ --strip-unneeded '{}' ';' \
+ >& /dev/null ; \
+ else \
+ $(call build_msg_fn, NOT stripping symbols) ; \
+ fi
+
+# readonly root squashfs image
+# Note: $(call build_msg_fn) does not seem to work inside of fakeroot so we use echo
+.PHONY: ro-image
+$(PLATFORM_IMAGE_DIR)/ro.img ro-image: $(patsubst %,%-find-source,$(ROOT_PACKAGES))
+ @$(BUILD_ENV) ; \
+ d=$(PLATFORM_IMAGE_DIR) ; \
+ mkdir -p $$d; \
+ ro_image=$$d/ro.img ; \
+ rm -f $${ro_image} ; \
+ tmp_dir="`mktemp -d $$d/ro-image-XXXXXX`" ; \
+ chmod 0755 $${tmp_dir} ; \
+ cd $${tmp_dir} ; \
+ trap "rm -rf $${tmp_dir}" err ; \
+ fakeroot /bin/bash -c "{ \
+ set -eu$(BUILD_DEBUG) ; \
+ $(MAKE) -C $(MU_BUILD_ROOT_DIR) IMAGE_INSTALL_DIR=$${tmp_dir} \
+ $(patsubst %,%-image_install, \
+ basic_system \
+ $(ROOT_PACKAGES)) ; \
+ : make dev directory ; \
+ $(linuxrc_makedev) ; \
+ echo @@@@ Relocating ELF executables to run in / @@@@ ; \
+ find $${d} -type f \
+ -exec elftool quiet in '{}' out '{}' \
+ set-interpreter \
+ /$(arch_lib_dir)/$(DYNAMIC_LINKER) \
+ set-rpath /$(arch_lib_dir):/lib ';' ; \
+ : strip symbols from files ; \
+ if [ '$${strip_symbols:-yes}' = 'yes' ] ; then \
+ echo @@@@ Stripping symbols from files @@@@ ; \
+ find $${tmp_dir} -type f \
+ -exec \
+ $(TARGET_PREFIX)strip \
+ --strip-unneeded '{}' ';' \
+ >& /dev/null ; \
+ else \
+ echo @@@@ NOT stripping symbols @@@@ ; \
+ fi ; \
+ if [ $${sign_executables:-yes} = 'yes' \
+ -a -n "$($(PLATFORM)_public_key)" ] ; then \
+ echo @@@@ Signing executables @@@@ ; \
+ find $${tmp_dir} -type f \
+ | xargs sign $($(PLATFORM)_public_key) \
+ $($(PLATFORM)_private_key_passphrase) ; \
+ fi ; \
+ : make read-only file system ; \
+ mksquashfs \
+ $${tmp_dir} $${ro_image} \
+ -no-exports -no-progress -no-recovery ; \
+ }" ; \
+ : cleanup tmp directory ; \
+ rm -rf $${tmp_dir}
+
+MKFS_JFFS2_BYTE_ORDER_x86_64 = -l
+MKFS_JFFS2_BYTE_ORDER_i686 = -l
+MKFS_JFFS2_BYTE_ORDER_ppc = -b
+MKFS_JFFS2_BYTE_ORDER_mips = -b
+MKFS_JFFS2_BYTE_ORDER_native = $(MKFS_JFFS2_BYTE_ORDER_$(NATIVE_ARCH))
+
+MKFS_JFFS2_SECTOR_SIZE_IN_KBYTES = \
+ $(call ifdef_fn,$(PLATFORM)_jffs2_sector_size_in_kbytes,256)
+
+mkfs_fn_jffs2 = mkfs.jffs2 \
+ --eraseblock=$(MKFS_JFFS2_SECTOR_SIZE_IN_KBYTES)KiB \
+ --root=$(1) --output=$(2) \
+ $(MKFS_JFFS2_BYTE_ORDER_$(BASIC_ARCH))
+
+# As things stand the actual initrd size parameter
+# is set in .../open-repo/build-data/packages/linuxrc.mk.
+EXT2_RW_IMAGE_SIZE=notused
+
+mkfs_fn_ext2 = \
+ e2fsimage -d $(1) -f $(2) -s $(EXT2_RW_IMAGE_SIZE)
+
+RW_IMAGE_TYPE=jffs2
+
+make_rw_image_fn = \
+ $(call mkfs_fn_$(RW_IMAGE_TYPE),$(1),$(2))
+
+rw_image_embed_ro_image_fn = \
+ mkdir -p proc initrd images ro rw union ; \
+ cp $(PLATFORM_IMAGE_DIR)/$(1) images/$(1) ; \
+ md5sum images/$(1) > images/$(1).md5 ; \
+ echo Built by $(LOGNAME) at `date` > images/$(1).stamp ; \
+ mkdir -p changes/$(1)
+
+# make sure RW_IMAGE_TYPE is a type we know how to build
+.PHONY: rw-image-check-type
+rw-image-check-type:
+ @$(BUILD_ENV) ; \
+ if [ -z "$(make_rw_image_fn)" ] ; then \
+ $(call build_msg_fn,Unknown read/write fs image type; \
+ try RW_IMAGE_TYPE=ext2 or RW_IMAGE_TYPE=jffs2) ; \
+ exit 1; \
+ fi
+
+# read write image
+.PHONY: rw-image
+rw-image: rw-image-check-type ro-image
+ @$(BUILD_ENV) ; \
+ d=$(PLATFORM_IMAGE_DIR) ; \
+ mkdir -p $$d ; \
+ rw_image="$$d/rw.$(RW_IMAGE_TYPE)" ; \
+ ro_image="ro.img" ; \
+ rm -f $$rw_image ; \
+ tmp_dir="`mktemp -d $$d/rw-image-XXXXXX`" ; \
+ chmod 0755 $${tmp_dir} ; \
+ cd $${tmp_dir} ; \
+ trap "rm -rf $${tmp_dir}" err ; \
+ fakeroot /bin/bash -c "{ \
+ set -eu$(BUILD_DEBUG) ; \
+ $(linuxrc_makedev) ; \
+ $(call rw_image_embed_ro_image_fn,$${ro_image}) ; \
+ $(call make_rw_image_fn,$${tmp_dir},$${rw_image}) ; \
+ }" ; \
+ : cleanup tmp directory ; \
+ rm -rf $${tmp_dir}
+
+images: linuxrc-install linux-install $(image_extra_dependencies) rw-image
+ @$(BUILD_ENV) ; \
+ d=$(PLATFORM_IMAGE_DIR) ; \
+ cd $(BUILD_DIR)/linux-$(PLATFORM) ; \
+ i="" ; \
+ [[ -z $$i && -f bzImage ]] && i=bzImage ; \
+ [[ -z $$i && -f zImage ]] && i=zImage ; \
+ [[ -z $$i && -f linux ]] && i=linux ; \
+ [[ -z $$i && -f vmlinux ]] && i=vmlinux ; \
+ [[ -z $$i ]] \
+ && $(call build_msg_fn,no linux image to install \
+ in $(BUILD_DIR)/linux-$(PLATFORM)) \
+ && exit 1 ; \
+ cp $$i $$d
+
+######################################################################
+# Tool chain build/install
+######################################################################
+
+.PHONY: ccache-install
+ccache-install:
+ $(MAKE) -C $(MU_BUILD_ROOT_DIR) ccache-build
+ mkdir -p $(TOOL_INSTALL_DIR)/ccache-bin
+ ln -sf $(MU_BUILD_ROOT_DIR)/build-tool-native/ccache/ccache \
+ $(TOOL_INSTALL_DIR)/ccache-bin/$(TARGET_PREFIX)gcc
+
+TOOL_MAKE = $(MAKE) is_build_tool=yes
+
+tool_make_target_fn = \
+ $(if $(strip $(NATIVE_TOOLS)), \
+ $(TOOL_MAKE) $(patsubst %,%-$(1),$(NATIVE_TOOLS)) ARCH=native || exit 1 ;) \
+ $(TOOL_MAKE) $(patsubst %,%-$(1),$(CROSS_TOOLS))
+
+.PHONY: install-tools
+install-tools:
+ $(call tool_make_target_fn,install)
+
+.PHONY: bootstrap-tools
+bootstrap-tools:
+ $(TOOL_MAKE) make-install findutils-install git-install \
+ automake-install autoconf-install libtool-install fakeroot-install
+
+
+######################################################################
+# Clean
+######################################################################
+
+package_clean_script = \
+ @$(call build_msg_fn, Cleaning $* in $(PACKAGE_INSTALL_DIR)) ; \
+ $(BUILD_ENV) ; \
+ $(if $(is_build_tool),,rm -rf $(PACKAGE_INSTALL_DIR) ;) \
+ rm -rf $(TIMESTAMP_DIR)/$(call timestamp_name_fn,*) ; \
+ $(if $($(PACKAGE)_clean), \
+ $($(PACKAGE)_clean), \
+ $(PACKAGE_MAKE) clean)
+
+.PHONY: %-clean
+%-clean:
+ $(package_clean_script)
+
+# Wipe e.g. remove build and install directories for packages.
+package_wipe_script = \
+ @message=$(if $(is_build_tool),"Wiping build $(PACKAGE)","Wiping build/install $(PACKAGE)") ; \
+ $(call build_msg_fn,$$message) ; \
+ $(BUILD_ENV) ; \
+ rm -rf $(if $(is_build_tool),$(PACKAGE_BUILD_DIR),$(PACKAGE_INSTALL_DIR) $(PACKAGE_BUILD_DIR))
+
+.PHONY: %-wipe
+%-wipe:
+ $(package_wipe_script)
+
+# Wipe entire build/install area for TAG and PLATFORM
+.PHONY: wipe-all
+wipe-all:
+ @$(call build_msg_fn, Wiping $(BUILD_DIR) $(INSTALL_DIR)) ; \
+ $(BUILD_ENV) ; \
+ rm -rf $(BUILD_DIR) $(INSTALL_DIR)
+
+# Clean everything
+distclean:
+ rm -rf $(MU_BUILD_ROOT_DIR)/$(BUILD_PREFIX_package)*/
+ rm -rf $(MU_BUILD_ROOT_DIR)/$(BUILD_PREFIX_tool)*
+ rm -rf $(MU_BUILD_ROOT_DIR)/$(INSTALL_PREFIX)*
+ rm -rf $(MU_BUILD_ROOT_DIR)/$(IMAGES_PREFIX)*
+ rm -rf $(TOOL_INSTALL_DIR)
+ rm -rf $(MU_BUILD_ROOT_DIR)/*.deb
+ rm -rf $(MU_BUILD_ROOT_DIR)/*.rpm
+ rm -rf $(MU_BUILD_ROOT_DIR)/*.changes
+ rm -rf $(MU_BUILD_ROOT_DIR)/python
+ if [ -e /usr/bin/dh ];then (cd $(MU_BUILD_ROOT_DIR)/deb/;debian/rules clean); fi
+ rm -f $(MU_BUILD_ROOT_DIR)/deb/debian/*.install
+ rm -f $(MU_BUILD_ROOT_DIR)/deb/debian/changelog
diff --git a/build-root/autowank b/build-root/autowank
new file mode 100755
index 0000000..21a440d
--- /dev/null
+++ b/build-root/autowank
@@ -0,0 +1,307 @@
+#!/bin/bash
+
+# Copyright (c) 2015 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This aptly-named script verifies and fixes time ordering
+# problems with Makefile.{am,in} aclocal.m4 configure* files.
+
+set -eu
+#set -vx
+
+touch=""
+commit=""
+comma_v=""
+aclocal=""
+optimize=""
+
+# The old autowank scheme used "touch <foo> ; sleep 1"
+# to ensure differentiable, ordered timestamps. Worked, but
+# took N seconds given N files to fix. We have an example
+# which wastes multiple minutes given the old scheme.
+#
+# This version generates a sequence of timestamps
+# starting an hour ago. That gives us
+# lots to play with, in case some obnoxious program feels the need
+# to complain about timestamps in the future.
+
+# If we're in UTC+N land, generate UTC+(N+1)
+# If we're in UTC-N land, generate UTC-(N-1)
+
+my_tz=`date +%z`
+sign=`echo $my_tz | sed -n -e 's/^\(.\{1\}\).*$/\1/p'`
+t=`echo $my_tz | sed -n -e 's/^\(.\{1\}\)//p'`
+tz_hour=`echo $t | sed -n -e 's/^\(.\{2\}\).*$/\1/p'`
+tz_hour=`echo $tz_hour | sed 's/^0//'`
+
+if [ $sign = "-" ] ; then
+ sign="+"
+ let tz_hour=$tz_hour+1
+ if [[ $tz_hour -ge "24" ]] ; then
+ tz_hour=0
+ fi
+else
+ sign="-"
+ let tz_hour=$tz_hour-1 || true
+ if [[ $tz_hour -lt "0" ]] ; then
+ tz_hour=23
+ fi
+fi
+
+# Timestamp, an hour ago:
+ts_begin=`TZ=UTC${sign}${tz_hour} date +%Y%m%d%H%M.%S`
+
+# break into constituent parts
+year=`echo $ts_begin | sed -n -e 's/^\(.\{4\}\).*$/\1/p'`
+t=`echo $ts_begin | sed -n -e 's/^\(.\{4\}\)//p'`
+month=`echo $t | sed -n -e 's/^\(.\{2\}\).*$/\1/p'`
+t=`echo $t | sed -n -e 's/^\(.\{2\}\)//p'`
+day=`echo $t | sed -n -e 's/^\(.\{2\}\).*$/\1/p'`
+t=`echo $t | sed -n -e 's/^\(.\{2\}\)//p'`
+hour=`echo $t | sed -n -e 's/^\(.\{2\}\).*$/\1/p'`
+t=`echo $t | sed -n -e 's/^\(.\{2\}\)//p'`
+min=`echo $t | sed -n -e 's/^\(.\{2\}\).*$/\1/p'`
+t=`echo $t | sed -n -e 's/^\(.\{2\}\)//p'`
+sec=`echo $t | sed -n -e 's/\.//p'`
+
+# How many days in the current month?
+# Good until someone changes the calendar rules
+days_in_current_month() {
+ if [[ $month -eq 9 || $month -eq 4 \
+ || $month -eq 6 || $month -eq 11 ]] ; then
+ return 30;
+ fi
+ if [[ $month -eq 2 ]] ; then
+ let t=($year/400)*400
+ if [[ $t -eq $year ]] ; then
+ return 29;
+ fi
+ let t=($year/100)*100
+ if [[ $t -eq $year ]] ; then
+ return 28;
+ fi
+ let t=($year/4)*4
+ if [[ $t -eq $year ]] ; then
+ return 29;
+ fi
+ return 28;
+ fi
+ return 31;
+}
+
+# The next timestamp to issue via touch
+# A real hemorrhoid because bash isnt easily convinced
+# that 08 is a decimal number
+next_ts() {
+ sec=`echo $sec | sed 's/^0//'`
+ let sec=$sec+1
+ if [[ "$sec" -lt "60" ]] ; then
+ if [[ "$sec" -lt "10" ]] ; then
+ sec=0$sec
+ fi
+ return 0;
+ fi
+ sec="00"
+ min=`echo $min | sed 's/^0//'`
+ let min=$min+1
+ if [[ "$min" -lt "60" ]] ; then
+ if [[ "$min" -lt "10" ]] ; then
+ min=0$min
+ fi
+ return 0;
+ fi
+ min="00"
+ hour=`echo $hour | sed 's/^0//'`
+ let hour=$hour+1
+ if [[ "$hour" -lt "24" ]] ; then
+ if [[ "$hour" -lt "10" ]] ; then
+ hour=0$hour
+ fi
+ return 0;
+ fi
+ hour="00"
+ days_in_current_month
+ days_in_month=$?
+ if [[ "$day" -lt "$days_in_month" ]] ; then
+ day=`echo $day | sed 's/^0//'`
+ let day=$day+1
+ if [[ "$day" -lt "10" ]] ; then
+ day=0$day
+ fi
+ return 0;
+ fi
+ day="01"
+ month=`echo $month | sed 's/^0//'`
+ let month=$month+1
+ if [[ "$month" -lt "13" ]] ; then
+ if [[ "$month" -lt "10" ]] ; then
+ month=0$month
+ fi
+ return 0;
+ fi
+ month="01"
+ let year=$year+1
+ return 0;
+}
+
+while [ $# != 0 ] ; do
+ case "$1" in
+ (--commav) comma_v=",v" ;;
+ (--touch) touch=yes ;;
+ (--aclocal) aclocal=yes ;;
+ (--nooptimize) optimize="" ;;
+ (--commit=*) commit="$1" ;;
+ (*) echo "$0: usage [--touch|--commit|]" > /dev/stderr
+ exit 17 ;;
+ esac
+ shift
+done
+
+if [ "${aclocal}" != "" ] ; then
+ if [ -f aclocal.m4 ] ; then
+ echo touching aclocal.m4
+ sleep 1
+ touch aclocal.m4
+ else
+ echo aclocal.m4 not found
+ fi
+fi
+
+if [ "${comma_v}" != "" -a "${commit}" != "" ] ; then
+ echo "No, you may NOT molest ,v files directly. Go away." > /dev/stderr
+ exit 1
+fi
+
+function touchme ()
+{
+ local victim="${1}"
+ shift
+ local touchmebaby=""
+ local sein="is"
+ local newer="no"
+ local older="no"
+
+ if [ ! -r "$victim" ] ; then
+ return
+ fi
+
+ while [ $# != 0 ] ; do
+ if [ "${1}" -nt "${victim}" ] ; then
+ newer="yes"
+ fi
+ if [ "${1}" -ot "${victim}" ] ; then
+ older="yes"
+ fi
+ if [ "${newer}" = "no" -a "${older}" = "no" ] ; then
+ newer="yes"
+ fi
+
+ if [ "${newer}" = "yes" ] ; then
+ if [ "${touchmebaby}" = "" ] ; then
+ touchmebaby="${1}"
+ else
+ sein="are"
+ touchmebaby="${touchmebaby} ${1}"
+ fi
+ fi
+ shift
+ done
+ if [ -n "${touchmebaby}" ] ; then
+ echo "*** ${touchmebaby} ${sein} newer than ${victim} "
+ if [ -n "${touch}" ] ; then
+ #
+ # This is the old version, in case something backfires...
+ if [ "${optimize}" != "yes" ] ; then
+ echo "Fixing " ;touch -c "$victim" ; sleep 1
+ else
+ echo "Fixing "
+ # echo touch -c -t $year$month$day$hour$min.$sec "$victim"
+ touch -c -t $year$month$day$hour$min.$sec "$victim"
+ next_ts
+ fi
+ fi
+ fi
+}
+
+makefileins="`/usr/bin/find . -name Attic -prune -o -name Makefile.in${comma_v}`"
+
+# aclocal.m4 depends on ***/Makefile.am, configure.ac, acinclude.m4, *.m4 crap
+touchme aclocal.m4${comma_v} \
+ `/usr/bin/find . -name Attic -prune -o -name Makefile.am${comma_v}` \
+ "configure.in${comma_v}" "configure.ac${comma_v}" \
+ "acinclude.m4${comma_v}"
+
+# Makefile.in must be newer than Makefile.am
+for f in $makefileins ; do
+ d="`dirname ${f}`"
+ touchme "${d}/Makefile.in${comma_v}" "${d}/Makefile.am${comma_v}"
+done
+
+# Makefile.in depends on aclocal.m4
+for f in $makefileins ; do
+ d="`dirname $f`"
+ touchme "${d}/Makefile.in${comma_v}" "aclocal.m4${comma_v}"
+done
+
+# config.in must be newer than aclocal.m4 and configure.ac
+if [ -f "config.in${comma_v}" ] ; then
+ touchme "config.in${comma_v}" "aclocal.m4${comma_v}" \
+ "configure.ac${comma_v}" \
+ "configure.in${comma_v}"
+fi
+
+# config.h.in (or More Thoroughly Modern configh.in)
+# must be newer than aclocal.m4 and (obsolete) acconfig.h
+for c_h_in in config.h.in configh.in ; do
+ if [ -f "${c_h_in}${comma_v}" ]; then
+ touchme "${c_h_in}${comma_v}" "aclocal.m4${comma_v}" "acconfig.h${comma_v}"
+ #>>>> WTF? Why? This is nonsensical
+ ## ***/Makefile.in must be newer than config.h.in
+ #for f in $makefileins ; do
+ # touchme "$f" "${c_h_in}${comma_v}"
+ #done
+ fi
+done
+
+# configure must be newer than everything
+# touchme configure $makefileins -- why would this be needed?
+touchme "configure${comma_v}" "aclocal.m4${comma_v}" "acconfig.h${comma_v}" \
+ "config.in${comma_v}" "config.h.in${comma_v}" \
+ "configh.in${comma_v}"
+
+if [ -n "${commit}" ] ; then
+ commit="${commit:9}" # strip off "--commit="
+ # First ***/Makefile.am,
+ # configure.in, configure.ac,
+ # ***/*.m4
+ # acconfig.h
+ cvs commit -m "${commit}" \
+ `for f in ${makefileins} ; do \
+ [ -f "$${f%.in}.am" ] && echo "$${f%.in}.am" ; \
+ done` \
+ `[ -f configure.in ] && echo configure.in` \
+ `[ -f configure.ac ] && echo configure.ac` \
+ `[ -f acconfig.h ] && echo acconfig.h` \
+ `/usr/bin/find . -name '*.m4' -mindepth 2`
+
+ # Next aclocal.m4
+ [ -f "aclocal.m4" ] && cvs commit -m "${commit}" aclocal.m4
+
+ # Next config.in, config.h.in, configh.in
+ [ -f "config.in" ] && cvs commit -m "${commit}" config.in
+ [ -f "config.h.in" ] && cvs commit -m "${commit}" config.h.in
+ [ -f "configh.in" ] && cvs commit -m "${commit}" configh.in
+
+ # Last ***/Makefile.in, configure
+ cvs commit -m "${commit}" ${makefileins} configure
+fi
diff --git a/build-root/bootstrap.sh b/build-root/bootstrap.sh
new file mode 100755
index 0000000..2949c18
--- /dev/null
+++ b/build-root/bootstrap.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+build_root=`pwd`
+cd ../
+wsroot=`pwd`
+
+# PATH
+if [[ ! $CCACHE_DIR ]];then
+ CCACHE_DIR="$build_root/.ccache"
+fi
+ADD_TO_PATH="$build_root/tools/ccache-bin:$build_root/tools/bin"
+
+# Construct build-config.mk
+cd $build_root
+echo SOURCE_PATH = $wsroot > build-config.mk
+echo
+echo Saving PATH settings in `pwd`/path_setup
+echo Source this file later, as needed
+cat >path_setup <<EOF
+#!/bin/bash
+
+export PATH=$ADD_TO_PATH:$PATH
+export CCACHE_DIR=$CCACHE_DIR
+EOF
+
+# regenerate tools/ccache-bin
+rm -rf tools/ccache-bin
+mkdir -p tools/ccache-bin
+
+if [ ! -f /usr/bin/ccache ] ; then
+ echo Please install ccache AYEC and re-run this script
+fi
+
+cd tools/ccache-bin
+for c in gcc g++
+ do
+ if [ -f /usr/bin/ccache ] ; then
+ ln -s /usr/bin/ccache $c
+ else
+ ln -s /usr/bin/gcc
+ fi
+done
+
+cd $wsroot
+
+cd $build_root
+echo Compile native tools
+for tool in tools
+do
+ make V=0 is_build_tool=yes $tool-install
+done
+
diff --git a/build-root/build-config.mk.README b/build-root/build-config.mk.README
new file mode 100644
index 0000000..8b8c87d
--- /dev/null
+++ b/build-root/build-config.mk.README
@@ -0,0 +1,3 @@
+# To specify directories to find sources, build/packages/*.mk
+# and build/platforms.mk
+# SOURCE_PATH = PATH1 PATH2 ...
diff --git a/build-root/config.site b/build-root/config.site
new file mode 100644
index 0000000..9f60708
--- /dev/null
+++ b/build-root/config.site
@@ -0,0 +1,105 @@
+######################################################################
+# glibc
+######################################################################
+
+# glibc needs this for cross compiling
+libc_cv_forced_unwind=yes
+libc_cv_c_cleanup=yes
+libc_cv_ssp=no
+# fixes gentoo build; not sure why?
+libc_cv_uname_release=""
+libc_cv_uname_version=""
+ac_cv_header_cpuid_h=yes
+######################################################################
+# bash
+######################################################################
+
+# Bash configure.in uses this to work around an autoconf 2.53 bug
+ac_cv_func_setvbuf_reversed=no
+ac_cv_rl_version=5.1
+bash_cv_termcap_lib=libncurses
+
+# These mostly come from debian bash-2.05b changes
+# They are needed to make a functioning bash. Without these
+# settings gdbserver exiting would cause the invoking bash to
+# exit also.
+bash_cv_have_mbstate_t=yes
+bash_cv_dup2_broken=no
+bash_cv_pgrp_pipe=no
+bash_cv_sys_siglist=yes
+bash_cv_under_sys_siglist=yes
+bash_cv_opendir_not_robust=no
+bash_cv_printf_declared=yes
+bash_cv_ulimit_maxfds=yes
+bash_cv_getenv_redef=yes
+bash_cv_getcwd_calls_popen=no
+bash_cv_func_strcoll_broken=no
+bash_cv_must_reinstall_sighandlers=no
+bash_cv_type_quad_t=yes
+bash_cv_func_sigsetjmp=present
+bash_cv_job_control_missing=present
+bash_cv_sys_named_pipes=present
+bash_cv_type_rlimit=long
+bash_cv_printf_a_format=yes
+bash_cv_unusable_rtsigs=no
+
+######################################################################
+# Apache
+######################################################################
+ac_cv_func_setpgrp_void=yes
+apr_cv_process_shared_works=yes
+apr_cv_tcp_nodelay_with_cork=yes
+ap_void_ptr_lt_long=no
+
+case ${host_cpu} in
+x86_64 | alpha)
+ ac_cv_sizeof_ssize_t=8
+ ac_cv_sizeof_size_t=8
+ ac_cv_sizeof_pid_t=4
+ ;;
+*)
+ ac_cv_sizeof_ssize_t=4
+ ac_cv_sizeof_size_t=4
+ ac_cv_sizeof_pid_t=4
+ ;;
+esac
+
+######################################################################
+# gdb
+######################################################################
+gdb_cv_func_ptrace_args=int,int,long,long
+
+######################################################################
+# dpkg
+######################################################################
+dpkg_cv_va_copy=yes
+
+######################################################################
+# coreutils
+######################################################################
+ac_cv_search_clock_gettime=no
+gl_cv_fs_space=yes
+
+######################################################################
+# valgrind
+######################################################################
+ac_cv_file__proc_self_fd=yes
+ac_cv_file__proc_self_exe=yes
+ac_cv_file__proc_self_maps=yes
+
+######################################################################
+# tcpdump
+######################################################################
+ac_cv_linux_vers=2
+ac_cv_func_pcap_findalldevs=no
+
+######################################################################
+# flex
+######################################################################
+ac_cv_func_malloc_0_nonnull=yes
+ac_cv_func_realloc_0_nonnull=yes
+
+######################################################################
+# tar
+######################################################################
+tar_gl_cv_func_mknod_works=yes
diff --git a/build-root/copyimg b/build-root/copyimg
new file mode 100755
index 0000000..e5e3fc2
--- /dev/null
+++ b/build-root/copyimg
@@ -0,0 +1,83 @@
+#!/bin/sh
+
+if [ $# -lt 2 ]; then
+ cat - <<EOF
+$0 FROM-DIR TO-DIR ENVIRONMENT
+
+Copies files from one directory to another with possible
+transformations.
+
+Files named FILE.spp will be transformed via the spp preprocessor
+subject to environment definitions. Source FILE.copyimgspp results in
+destination file FILE in the corresponding destination directory.
+
+Files named FILE.copyimgsh are run as shell scripts in (i.e. via chdir)
+the corresponding destination directory (and not copied).
+
+First regular files are copied. Then transformations are preformed.
+Finally, shell scripts are run.
+EOF
+ exit 1;
+fi
+
+FROM_DIR=$1
+TO_DIR=$2
+
+FILTER=" -and -not -name '*~'";
+FILTER="${FILTER} -and -not -name '.*~'";
+FILTER="$FILTER -and -not -path '*/.git*'";
+FILTER="$FILTER -and -not -path '*/.svn*'";
+FILTER="$FILTER -and -not -path '*/.CVS*'";
+
+FROM_FILES=`(cd $FROM_DIR; eval "find . -not -type d $FILTER")`;
+ FROM_DIRS=`(cd $FROM_DIR; eval "find . -type d $FILTER")`;
+
+COPY_FILES=
+SPP_FILES=
+SH_FILES=
+for f in $FROM_FILES; do
+ case $f in
+ *.copyimgspp) SPP_FILES="$SPP_FILES $f" ;;
+ *.copyimgsh) SH_FILES="$SH_FILES $f" ;;
+ *) COPY_FILES="$COPY_FILES $f";;
+ esac
+done
+
+# Make destination directories.
+mkdir -p $TO_DIR;
+if [ "$FROM_DIRS" != "" ]; then
+ for d in $FROM_DIRS; do
+ mkdir -p $TO_DIR/$d;
+ done
+fi
+
+# Copy files
+if [ "$COPY_FILES" != "" ]; then
+ tar -cf - -C $FROM_DIR $COPY_FILES | tar --preserve-permissions -xf - -C $TO_DIR;
+fi
+
+# Use spp to transform any spp files
+if [ "$SPP_FILES" != "" ]; then
+ for f in $SPP_FILES; do
+ d=`dirname $f`;
+ b=`basename $f .copyimgspp`;
+ mkdir -p $TO_DIR/$d;
+ t=$TO_DIR/$d/$b;
+ spp -o $TO_DIR/$d/$b $FROM_DIR/$f || exit 1;
+ done;
+fi
+
+# Now that all files have been copied/created we run any shell scripts
+ABS_FROM_DIR=`(cd $FROM_DIR; pwd)`;
+if [ "$SH_FILES" != "" ]; then
+ # Allow directory to define some functions
+ if [ -f $FROM_DIR/copyimgsh-functions.sh ]; then
+ . $FROM_DIR/copyimgsh-functions.sh ;
+ fi ;
+ for f in $SH_FILES; do
+ d=`dirname $f`;
+ b=`basename $f`;
+ mkdir -p $TO_DIR/$d;
+ (cd $TO_DIR/$d; . $ABS_FROM_DIR/$d/$b) || exit 1;
+ done;
+fi;
diff --git a/build-root/deb/debian/.gitignore b/build-root/deb/debian/.gitignore
new file mode 100644
index 0000000..7b1028d
--- /dev/null
+++ b/build-root/deb/debian/.gitignore
@@ -0,0 +1,13 @@
+changelog
+files
+*debhelper*
+*.substvars
+*.install
+vpp/
+vpp-dev/
+vpp-lib/
+vpp-dbg/
+vppctl/
+vpp-api-lua/
+vpp-api-java/
+vpp-api-python/
diff --git a/build-root/deb/debian/README.vpp b/build-root/deb/debian/README.vpp
new file mode 100755
index 0000000..b343c78
--- /dev/null
+++ b/build-root/deb/debian/README.vpp
@@ -0,0 +1,56 @@
+Building DEB packages
+=====================
+
+REQUIREMENTS:
+ You will need a working Internet connection to execute the build, because
+ the build procedure for the included "dpdk" project attempts to contact the
+ Internet host "dpdk.org".
+
+There are three main parts to the process:
+ a) Stage the source tree so that dpkg-source will recognize its organization
+ and create a valid DSC source package for you;
+ b) Ensure that the tools required for building DEB packages are installed;
+ and
+ c) Launch the build.
+
+1) Create, or have on hand, a local clone of the git repository, with no
+untracked files or local modifications pending, up-to-date with the branch or
+commit reference from which you wish to construct the source release.
+
+The branch and repository origins will differ based on local conditions.
+
+Example:
+$ git clone -b master ssh://git@example.com:7999/~username/open-vpp
+
+("-b master" can be omitted since master is the default branch)
+
+2) Rename the checkout with a version number embedded in its name as is
+conventional for code releases. Again, your version number may vary.
+
+Example:
+$ mv open-vpp open-vpp-0.0.0
+
+3) Ensure that the dpkg-buildpackage program is installed.
+
+E.g.,
+
+# apt-get install dpkg-dev
+
+4) From the PARENT directory of the debian/ directory, run:
+
+$ cd open-vpp-0.0.0
+$ dpkg-buildpackage -I .git -us -uc
+
+(The -us and -uc flags omit GPG signatures from the .dsc and .changes files,
+respectively. You can add them later, or if you are preparing a signed release
+and have the signing key on hand, leave off the flags.)
+
+5) Get rid of the source directory; you now either have a source package with
+which you can re-create it at any time, or there were problems with the build,
+and you should go back to your git checkout to fix them.
+
+$ rm -r open-vpp-0.0.0
+
+END
+
+vim:set ai et sw=4 ts=4 tw=80:
diff --git a/build-root/deb/debian/compat b/build-root/deb/debian/compat
new file mode 100755
index 0000000..ec63514
--- /dev/null
+++ b/build-root/deb/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/build-root/deb/debian/control b/build-root/deb/debian/control
new file mode 100644
index 0000000..4ed42b3
--- /dev/null
+++ b/build-root/deb/debian/control
@@ -0,0 +1,67 @@
+Source: vpp
+Section: net
+Priority: extra
+Maintainer: Cisco OpenVPP Packaging Team <bogus.address@cisco.com>
+Build-Depends: debhelper (>= 9), dh-systemd, dh-python, chrpath, python-all
+Standards-Version: 3.9.4
+
+Package: vpp
+Architecture: any
+Depends: vpp-lib (= ${source:Version}), ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}
+Description: Vector Packet Processing--executables
+ This package provides VPP executables: vpp, vpp_api_test, vpp_json_test
+ vpp - the vector packet engine
+ vpp_api_test - vector packet engine API test tool
+ vpp_json_test - vector packet engine JSON test tool
+
+Package: vpp-dbg
+Architecture: any
+Depends: ${misc:Depends}
+Description: Vector Packet Processing--debug symbols
+
+Package: vpp-dev
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}
+Description: Vector Packet Processing--development support
+ This package contains development support files for the VPP libraries
+ .
+
+Package: vpp-lib
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Vector Packet Processing--runtime libraries
+ This package contains the VPP shared libraries, including:
+ .
+ vppinfra - foundation library supporting vectors, hashes, bitmaps, pools, and string formatting.
+ svm - vm library
+ vlib - vector processing library
+ vlib-api - binary API library
+ vnet - network stack library
+
+Package: vpp-plugins
+Architecture: any
+Depends: vpp (= ${source:Version}), ${shlibs:Depends}, ${misc:Depends}
+Description: Vector Packet Processing--runtime plugins
+ This package contains VPP plugins
+ .
+
+Package: vpp-api-lua
+Architecture: any
+Depends: ${misc:Depends}, vpp (= ${source:Version})
+Description: VPP LUA API bindings
+ This package contains VPP lua api bindings
+ .
+
+Package: vpp-api-java
+Architecture: any
+Depends: ${misc:Depends}, vpp (= ${source:Version})
+Description: VPP Java API bindings
+ This package contains VPP java api bindings
+ .
+
+Package: vpp-api-python
+Architecture: any
+Depends: ${python:Depends}, ${misc:Depends}, vpp (= ${source:Version})
+Description: VPP Python API bindings
+ This package contains VPP python api bindings
+ .
diff --git a/build-root/deb/debian/copyright b/build-root/deb/debian/copyright
new file mode 100644
index 0000000..f9775c1
--- /dev/null
+++ b/build-root/deb/debian/copyright
@@ -0,0 +1,9 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: optional.
+Upstream-Contact: optional.
+Source: optional.
+Disclaimer: optional.
+Comment: optional.
+License: Apache-2.0
+Copyright: 2015 Cisco and/or its affiliates and others.
+
diff --git a/build-root/deb/debian/rules b/build-root/deb/debian/rules
new file mode 100755
index 0000000..3a1dd29
--- /dev/null
+++ b/build-root/deb/debian/rules
@@ -0,0 +1,39 @@
+#!/usr/bin/make -f
+# See debhelper(7) (uncomment to enable)
+# output every command that modifies files on the build system.
+DH_VERBOSE = 1
+
+# see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/*
+DPKG_EXPORT_BUILDFLAGS = 1
+include /usr/share/dpkg/default.mk
+
+# see FEATURE AREAS in dpkg-buildflags(1)
+#export DEB_BUILD_MAINT_OPTIONS = hardening=+all
+
+# see ENVIRONMENT in dpkg-buildflags(1)
+# package maintainers to append CFLAGS
+#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
+# package maintainers to append LDFLAGS
+#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
+
+export PYBUILD_NAME = vpp-api-python
+export PYBUILD_DIR = ../../src/vpp-api/python
+export PYBUILD_DESTDIR_python2=debian/vpp-api-python/
+export PYBUILD_DISABLE_python2=test
+export PYBUILD_SYSTEM=distutils
+
+# main packaging script based on dh7 syntax
+%:
+ dh $@ --with systemd,python2 --buildsystem=pybuild
+
+override_dh_install:
+ dh_install --exclude .git
+ ../scripts/remove-rpath .
+
+override_dh_shlibdeps:
+ @dh_shlibdeps 2>&1 \
+ | grep -v "probably a plugin" \
+ | grep -v "similar warnings have been skipped"
+
+override_dh_strip:
+ dh_strip --dbg-package=vpp-dbg
diff --git a/build-root/deb/debian/source/format b/build-root/deb/debian/source/format
new file mode 100755
index 0000000..89ae9db
--- /dev/null
+++ b/build-root/deb/debian/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/build-root/deb/debian/vpp-bin.README.Debian b/build-root/deb/debian/vpp-bin.README.Debian
new file mode 100644
index 0000000..1922896
--- /dev/null
+++ b/build-root/deb/debian/vpp-bin.README.Debian
@@ -0,0 +1,53 @@
+To run vpp with the debug shell:
+
+sudo vpp unix interactive
+
+which will result in a prompt that looks like:
+
+DBGvpd#
+
+To give it a spin, we can create a tap interface and try a simple ping
+(with trace).
+
+To create the tap:
+
+DBGvpd# tap connect foobar
+Created tap-0 for Linux tap 'foobar'
+DBGvpd# show int
+
+To assign it an ip address (and 'up' the interface):
+
+DBGvpd# set int ip address tap-0 192.168.1.1/24
+DBGvpd# set int state tap-0 up
+
+To turn on packet tracing for the tap interface:
+DBGvpd# trace add tapcli-rx 10
+
+Now, to set up and try the other end from the unix prompt:
+vagrant@vagrant-ubuntu-trusty-64:~$ sudo ip addr add 192.168.1.2/24 dev foobar
+vagrant@vagrant-ubuntu-trusty-64:~$ ping -c 3 192.168.1.1
+
+To look at the trace, back in the vpp CLI:
+DBGvpd# show trace
+
+And to stop tracing:
+
+DBGvpd# clear trace
+
+Other fun things to look at:
+
+The vlib packet processing graph:
+DBGvpd# show vlib graph
+
+which will produce output like:
+
+ Name Next Previous
+ip4-icmp-input error-punt [0] ip4-local
+ ip4-icmp-echo-request [1]
+ vpe-icmp4-oam [2]
+
+To read this, the first column (Name) is the name of the node.
+The second column (Next) is the name of the children of that node.
+The third column (Previous) is the name of the parents of this node.
+
+END
diff --git a/build-root/deb/debian/vpp.postinst b/build-root/deb/debian/vpp.postinst
new file mode 100644
index 0000000..78fcac2
--- /dev/null
+++ b/build-root/deb/debian/vpp.postinst
@@ -0,0 +1,8 @@
+#!/bin/sh -e
+
+# try to set the required values now. This may or may not work.
+sysctl --system
+
+#DEBHELPER#
+
+exit 0
diff --git a/build-root/deb/debian/vpp.postrm b/build-root/deb/debian/vpp.postrm
new file mode 100644
index 0000000..24b4842
--- /dev/null
+++ b/build-root/deb/debian/vpp.postrm
@@ -0,0 +1,21 @@
+#!/bin/sh -e
+
+removed=
+
+# Unbind user-mode PCI drivers
+pci_dirs=`find /sys/bus/pci/drivers -type d -name igb_uio -o -name uio_pci_generic -o -name vfio-pci`
+for d in $pci_dirs; do
+ for f in ${d}/*; do
+ [ -e "${f}/config" ] || continue
+ echo ${f##*/} > ${d}/unbind
+ basename `dirname ${f}` | xargs echo -n "Removing driver"; echo " for PCI ID" `basename ${f}`
+ removed=y
+ done
+done
+if [ -n "${removed}" ]; then
+ echo "There are changes in PCI drivers, rescaning"
+ echo 1 > /sys/bus/pci/rescan
+else
+ echo "There weren't PCI devices binded"
+fi
+
diff --git a/build-root/deb/debian/vpp.preinst b/build-root/deb/debian/vpp.preinst
new file mode 100644
index 0000000..d33cacf
--- /dev/null
+++ b/build-root/deb/debian/vpp.preinst
@@ -0,0 +1,4 @@
+#!/bin/sh -e
+
+# Add the vpp group
+groupadd -f -r vpp
diff --git a/build-root/deb/debian/vpp.service b/build-root/deb/debian/vpp.service
new file mode 100644
index 0000000..aa1651c
--- /dev/null
+++ b/build-root/deb/debian/vpp.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=vector packet processing engine
+After=network.target
+
+[Service]
+Type=simple
+ExecStartPre=-/bin/rm -f /dev/shm/db /dev/shm/global_vm /dev/shm/vpe-api
+ExecStartPre=-/sbin/modprobe uio_pci_generic
+ExecStart=/usr/bin/vpp -c /etc/vpp/startup.conf
+ExecStopPost=/bin/rm -f /dev/shm/db /dev/shm/global_vm /dev/shm/vpe-api
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
diff --git a/build-root/deb/debian/vpp.upstart b/build-root/deb/debian/vpp.upstart
new file mode 100644
index 0000000..62e1d27
--- /dev/null
+++ b/build-root/deb/debian/vpp.upstart
@@ -0,0 +1,21 @@
+description "vector packet processing engine"
+author "Cisco Systems, Inc <listname@cisco.com>"
+
+manual
+
+respawn
+
+pre-start script
+ rm -f /dev/shm/db /dev/shm/global_vm /dev/shm/vpe-api || true
+ # should be there via dkms, but if not, start anyway
+ modprobe uio_pci_generic || true
+end script
+
+
+script
+ exec vpp -c /etc/vpp/startup.conf
+end script
+
+post-stop script
+ rm -f /dev/shm/db /dev/shm/global_vm /dev/shm/vpe-api || true
+end script
diff --git a/build-root/packages/src.mk b/build-root/packages/src.mk
new file mode 100644
index 0000000..db48ed5
--- /dev/null
+++ b/build-root/packages/src.mk
@@ -0,0 +1,4 @@
+# nothing
+
+
+
diff --git a/build-root/packages/tools.mk b/build-root/packages/tools.mk
new file mode 100644
index 0000000..d64a795
--- /dev/null
+++ b/build-root/packages/tools.mk
@@ -0,0 +1,3 @@
+tools_source = src
+tools_configure_args = --disable-vlib --disable-svm --disable-japi
+
diff --git a/build-root/packages/vppinfra.mk b/build-root/packages/vppinfra.mk
new file mode 100644
index 0000000..db48ed5
--- /dev/null
+++ b/build-root/packages/vppinfra.mk
@@ -0,0 +1,4 @@
+# nothing
+
+
+
diff --git a/build-root/platforms.mk b/build-root/platforms.mk
new file mode 100644
index 0000000..cb36d1b
--- /dev/null
+++ b/build-root/platforms.mk
@@ -0,0 +1,50 @@
+# Copyright (c) 2015 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Copyright (c) 2007-2008 Eliot Dresselhaus
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+# Platform selects e.g. Linux config file
+PLATFORM = native
+
+native_arch = native
+
+# Default for which packages go into read-only image
+# used to have pam
+default_root_packages = bash coreutils sysvinit util-linux mingetty procps
+
+# Linux based platforms (PLATFORM=i686 PLATFORM=ppc etc.)
+i686_arch = i686
+x86_64_arch = x86_64
+ppc_arch = ppc
+
diff --git a/build-root/scripts/checkstyle.sh b/build-root/scripts/checkstyle.sh
new file mode 100755
index 0000000..6b760b3
--- /dev/null
+++ b/build-root/scripts/checkstyle.sh
@@ -0,0 +1,137 @@
+#!/bin/bash
+
+VPP_DIR=`dirname $0`/../../
+EXIT_CODE=0
+FIX="0"
+FULL="0"
+CHECKSTYLED_FILES=""
+UNCHECKSTYLED_FILES=""
+
+# If the user provides --fix, then actually fix things
+# Note: this is meant for use outside of the CI Jobs, by users cleaning things up
+
+while true; do
+ case ${1} in
+ --fix)
+ FIX="1"
+ ;;
+ --full)
+ FULL="1"
+ ;;
+ esac
+ shift || break
+done
+
+if [ "${FULL}" == "1" ]; then
+ FILELIST=$(git ls-tree -r HEAD --name-only)
+else
+ FILELIST=$((git diff HEAD~1.. --name-only; git ls-files -m ) | sort -u)
+fi
+
+# Check to make sure we have indent. Exit if we don't with an error message, but
+# don't *fail*.
+command -v indent > /dev/null
+if [ $? != 0 ]; then
+ echo "Cound not find required command \"indent\". Checkstyle aborted"
+ exit ${EXIT_CODE}
+fi
+indent --version
+
+# Check to make sure we have clang-format. Exit if we don't with an error message, but
+# don't *fail*.
+command -v clang-format > /dev/null
+HAVE_CLANG_FORMAT=0
+if [ $? != 0 ]; then
+ echo "Could not find command \"clang-format\". Checking C++ files will cause abort"
+else
+ clang-format --version
+ x=$(echo "" | clang-format 2>&1)
+ if [[ "$x" == "" ]]; then
+ HAVE_CLANG_FORMAT=1
+ else
+ echo "Output produced while formatting empty file (expected empty string):"
+ echo "$x"
+ echo "Could not find working \"clang-format\". Checking C++ files will cause abort"
+ fi
+fi
+
+cd ${VPP_DIR}
+git status
+for i in ${FILELIST}; do
+ if [ -f ${i} ] && [ ${i} != "build-root/scripts/checkstyle.sh" ] && [ ${i} != "extras/emacs/fix-coding-style.el" ]; then
+ grep -q "fd.io coding-style-patch-verification: ON" ${i}
+ if [ $? == 0 ]; then
+ EXTENSION=`basename ${i} | sed 's/^\w\+.//'`
+ case ${EXTENSION} in
+ hpp|cpp|cc|hh)
+ CMD="clang-format"
+ if [ ${HAVE_CLANG_FORMAT} == 0 ]; then
+ echo "C++ file detected. Abort. (missing clang-format)"
+ exit ${EXIT_CODE}
+ fi
+ ;;
+ *)
+ CMD="indent"
+ ;;
+ esac
+ CHECKSTYLED_FILES="${CHECKSTYLED_FILES} ${i}"
+ if [ ${FIX} == 0 ]; then
+ if [ "${CMD}" == "clang-format" ]
+ then
+ clang-format ${i} > ${i}.out2
+ else
+ indent ${i} -o ${i}.out1 > /dev/null 2>&1
+ indent ${i}.out1 -o ${i}.out2 > /dev/null 2>&1
+ fi
+ # Remove trailing whitespace
+ sed -i -e 's/[[:space:]]*$//' ${i}.out2
+ diff -q ${i} ${i}.out2
+ else
+ if [ "${CMD}" == "clang-format" ]; then
+ clang-format -i ${i} > /dev/null 2>&1
+ else
+ indent ${i}
+ indent ${i}
+ fi
+ # Remove trailing whitespace
+ sed -i -e 's/[[:space:]]*$//' ${i}
+ fi
+ if [ $? != 0 ]; then
+ EXIT_CODE=1
+ echo
+ echo "Checkstyle failed for ${i}."
+ if [ "${CMD}" == "clang-format" ]; then
+ echo "Run clang-format as shown to fix the problem:"
+ echo "clang-format -i ${VPP_DIR}${i}"
+ else
+ echo "Run indent (twice!) as shown to fix the problem:"
+ echo "indent ${VPP_DIR}${i}"
+ echo "indent ${VPP_DIR}${i}"
+ fi
+ fi
+ if [ -f ${i}.out1 ]; then
+ rm ${i}.out1
+ fi
+ if [ -f ${i}.out2 ]; then
+ rm ${i}.out2
+ fi
+ else
+ UNCHECKSTYLED_FILES="${UNCHECKSTYLED_FILES} ${i}"
+ fi
+ else
+ UNCHECKSTYLED_FILES="${UNCHECKSTYLED_FILES} ${i}"
+ fi
+done
+
+if [ ${EXIT_CODE} == 0 ]; then
+ echo "*******************************************************************"
+ echo "* VPP CHECKSTYLE SUCCESSFULLY COMPLETED"
+ echo "*******************************************************************"
+else
+ echo "*******************************************************************"
+ echo "* VPP CHECKSTYLE FAILED"
+ echo "* CONSULT FAILURE LOG ABOVE"
+ echo "* NOTE: Running 'build-root/scripts/checkstyle.sh --fix' *MAY* fix the issue"
+ echo "*******************************************************************"
+fi
+exit ${EXIT_CODE}
diff --git a/build-root/scripts/csit-test-branch b/build-root/scripts/csit-test-branch
new file mode 100755
index 0000000..e076402
--- /dev/null
+++ b/build-root/scripts/csit-test-branch
@@ -0,0 +1,2 @@
+#!/bin/sh
+echo oper-rls1710-171011
diff --git a/build-root/scripts/find-api-core-contents b/build-root/scripts/find-api-core-contents
new file mode 100755
index 0000000..c1af69d
--- /dev/null
+++ b/build-root/scripts/find-api-core-contents
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+for i in $(find ${1}/vpp/share/vpp/api/core -name *.api.json -type f -print); do
+ echo ../${i} /usr/share/vpp/api/ >> ${2}
+done
+for i in $(find ${1}/vlib-api -name *.api.json -type f -print); do
+ echo ../${i} /usr/share/vpp/api/ >> ${2}
+done
+
diff --git a/build-root/scripts/find-api-lib-contents b/build-root/scripts/find-api-lib-contents
new file mode 100755
index 0000000..562db7b
--- /dev/null
+++ b/build-root/scripts/find-api-lib-contents
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+for i in $(find ${1}/vnet -name *.api.json -type f -print); do
+ echo ../${i} /usr/share/vpp/api/ >> ${2}
+done
+
diff --git a/build-root/scripts/find-dev-contents b/build-root/scripts/find-dev-contents
new file mode 100755
index 0000000..d4f7b63
--- /dev/null
+++ b/build-root/scripts/find-dev-contents
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+# includes
+paths=`find $1/*/include -type f -print | grep -v '/dpdk/include/'`
+rm -f $2
+
+for path in $paths
+do
+ relpath=`echo $path | sed -e 's:.*/include/::'`
+ dir=`dirname $relpath`
+ if [ $dir = "." ] ; then
+ echo ../$path /usr/include >> $2
+ else
+ echo ../$path /usr/include/$dir >> $2
+ fi
+done
+
+# sample plugin
+paths=`(cd ..; find src/examples/sample-plugin -type f -print | grep -v autom4te)`
+
+for path in $paths
+do
+ relpath=`echo $path | sed -e 's:.*src/examples/::'`
+ dir=`dirname $relpath`
+ if [ $dir = "sample-plugin" ] ; then
+ echo ../../$path /usr/share/doc/vpp/examples/sample-plugin/ >> $2
+ else
+ echo ../../$path \
+ /usr/share/doc/vpp/examples/$dir >> $2
+ fi
+done
diff --git a/build-root/scripts/find-plugins-contents b/build-root/scripts/find-plugins-contents
new file mode 100755
index 0000000..ae2a427
--- /dev/null
+++ b/build-root/scripts/find-plugins-contents
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+rm -f $2
+
+for i in ${1}/vpp/lib64/vpp_plugins/*.so; do
+ echo ../${i} /usr/lib/vpp_plugins >> ${2}
+done
+
+for i in ${1}/vpp/lib64/vpp_api_test_plugins/*.so; do
+ echo ../${i} /usr/lib/vpp_api_test_plugins >> ${2}
+done
+
+for i in $(find ${1}/plugins ${1}/vpp/share/vpp/api/plugins/ -name *.api.json -type f -print); do
+ echo ../${i} /usr/share/vpp/api/ >> ${2}
+done
diff --git a/build-root/scripts/find-vpp-api-java-contents b/build-root/scripts/find-vpp-api-java-contents
new file mode 100755
index 0000000..5f1bf19
--- /dev/null
+++ b/build-root/scripts/find-vpp-api-java-contents
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+rm -f $2
+
+for i in $(find ${1}/vpp/share/java/ -type f -print); do
+ echo ../${i} /usr/share/java >> ${2}
+done
+
diff --git a/build-root/scripts/find-vpp-api-lua-contents b/build-root/scripts/find-vpp-api-lua-contents
new file mode 100755
index 0000000..f1173db
--- /dev/null
+++ b/build-root/scripts/find-vpp-api-lua-contents
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+#i for now put everything into examples directory
+
+echo ../../src/vpp-api/lua /usr/share/vpp/examples > ${2}
+
diff --git a/build-root/scripts/find-vpp-api-python-contents b/build-root/scripts/find-vpp-api-python-contents
new file mode 100755
index 0000000..819c912
--- /dev/null
+++ b/build-root/scripts/find-vpp-api-python-contents
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+rm -f $2
+
+for i in $(find ${1}/vpp/lib/python2.7/site-packages/ -type f -print); do
+ echo ../${i} /usr/lib/python2.7/site-packages/vpp_papi >> ${2}
+done
+
diff --git a/build-root/scripts/generate-deb-changelog b/build-root/scripts/generate-deb-changelog
new file mode 100755
index 0000000..7bdc633
--- /dev/null
+++ b/build-root/scripts/generate-deb-changelog
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+CHANGELOG=deb/debian/changelog
+DIST=unstable
+FIRST=1
+
+print_changelog_item() {
+ DATE=$(git log -1 --format=%cD ${TAG})
+ DEBFULLNAME=$(git log -1 --format=%an ${TAG})
+ DEBEMAIL=$(git log -1 --format=%ae ${TAG})
+
+ if [ ${FIRST} = 0 ]; then echo >> ${CHANGELOG}; fi
+ FIRST=0
+
+ echo "vpp (${VER}) ${DIST}; urgency=low" >> ${CHANGELOG}
+ echo >> ${CHANGELOG}
+ echo "${DESC}" >> ${CHANGELOG}
+ echo >> ${CHANGELOG}
+ echo " -- ${DEBFULLNAME} <${DEBEMAIL}> ${DATE}" >> ${CHANGELOG}
+}
+
+VER=$(scripts/version)
+TAG=HEAD
+ADDS=$(echo ${VER} | sed -e 's/~.*//'| cut -s -d- -f2)
+
+rm -f ${CHANGELOG}
+
+if [ -n "${ADDS}" ]; then
+ DESC=" * includes ${ADDS} commits after $(echo ${VER}| cut -d- -f1) release"
+ print_changelog_item
+fi
+
+for TAG in $(git tag -l 'v[0-9][0-9].[0-9][0-9]' | sort -r ); do
+ VER=$(echo ${TAG}| sed -e 's/^v//')
+ DESC=$(git tag -l -n20 ${TAG} | tail -n+2 | sed -e 's/^ */ /')
+ print_changelog_item
+done
diff --git a/build-root/scripts/remove-rpath b/build-root/scripts/remove-rpath
new file mode 100755
index 0000000..3912b37
--- /dev/null
+++ b/build-root/scripts/remove-rpath
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+if [ -z $1 ]; then
+ echo "Please specify path"
+ exit 1
+fi
+
+which chrpath &> /dev/null
+
+if [ $? -ne 0 ] ; then
+ echo "Please install chrpath tool"
+ exit 1
+fi
+
+libs=$(find $1 -type f -name \*.so\*)
+execs=$(find $1 -type f -path \*/bin/\* )
+
+for i in $libs $execs; do
+ chrpath $i 2> /dev/null | grep -q build-root
+ if [ $? -eq 0 ] ; then
+ chrpath -d $i
+ fi
+done
+
diff --git a/build-root/scripts/version b/build-root/scripts/version
new file mode 120000
index 0000000..8392c68
--- /dev/null
+++ b/build-root/scripts/version
@@ -0,0 +1 @@
+../../src/scripts/version \ No newline at end of file
diff --git a/build-root/vagrant b/build-root/vagrant
new file mode 120000
index 0000000..ada25b8
--- /dev/null
+++ b/build-root/vagrant
@@ -0,0 +1 @@
+../extras/vagrant \ No newline at end of file
diff --git a/doxygen/Makefile b/doxygen/Makefile
new file mode 100644
index 0000000..5870530
--- /dev/null
+++ b/doxygen/Makefile
@@ -0,0 +1,270 @@
+# Copyright (c) 2016 Comcast Cable Communications Management, LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Build the documentation
+#
+
+# Default target
+.PHONY: all
+all: doxygen
+
+# These should be passed in by the root Makefile
+WS_ROOT ?= $(CURDIR)/..
+BR ?= $(WS_ROOT)/build-root
+
+# We support MacOS for docs generation
+ifeq ($(shell uname),Darwin)
+OS_ID = darwin
+endif
+
+# Work out the OS if we haven't already
+OS_ID ?= $(shell grep '^ID=' /etc/os-release | cut -f2- -d= | sed -e 's/\"//g')
+
+# Package dependencies
+DOC_DEB_DEPENDS = doxygen graphviz python-pyparsing python-jinja2
+DOC_RPM_DEPENDS = doxygen graphviz pyparsing python-jinja2
+DOC_SUSE_RPM_DEPENDS = doxygen graphviz python-pyparsing python-Jinja2
+DOC_MAC_BIN_DEPENDS = doxygen dot git
+DOC_MAC_PY_DEPENDS = pyparsing jinja2
+
+# Doxygen configuration and our utility scripts
+DOXY_DIR ?= $(WS_ROOT)/doxygen
+
+# Primary source directories
+DOXY_SRC ?= src
+DOXY_SRC_DIRECTORIES = \
+ $(DOXY_SRC)/vppinfra \
+ $(DOXY_SRC)/svm \
+ $(DOXY_SRC)/vlib \
+ $(DOXY_SRC)/vlibapi \
+ $(DOXY_SRC)/vlibmemory \
+ $(DOXY_SRC)/vlibsocket \
+ $(DOXY_SRC)/vnet \
+ $(DOXY_SRC)/vpp \
+ $(DOXY_SRC)/vpp-api \
+ $(DOXY_SRC)/uri \
+ $(DOXY_SRC)/examples
+
+# Input directories and files
+DOXY_INPUT ?= \
+ $(wildcard $(WS_ROOT)/*.md) \
+ $(wildcard $(DOXY_DIR)/*.md) \
+ $(DOXY_SRC_DIRECTORIES) \
+ $(DOXY_SRC)/plugins \
+ extras
+
+# Strip leading workspace path from input names
+DOXY_INPUT := $(subst $(WS_ROOT)/,,$(DOXY_INPUT))
+
+# Files to exclude, from pre-Doxygen steps, eg because they're
+# selectively compiled.
+# Examples would be to exclude non-DPDK related sources when
+# there's a DPDK equivalent that conflicts.
+# These must be left-anchored paths for the regexp below to work.
+DOXY_EXCLUDE ?= \
+ $(DOXY_SRC)/vpp-api/lua
+
+# Generate a regexp for filenames to exclude
+DOXY_EXCLUDE_REGEXP = ($(subst .,\.,$(shell echo '$(strip $(DOXY_EXCLUDE))' | sed -e 's/ /|/g')))
+
+# Include all the normal source directories in the include file path
+DOXY_INCLUDE_PATH = $(DOXY_SRC_DIRECTORIES)
+
+# Find API header directories and include them in the header path.
+# This is only useful if VPP and plugins are already built; nothing
+# here depends on those targets. We don't build documentation for these
+# header files, they're just added to the INCLUDE search path for Doxygen.
+_vpp_br = $(shell find "$(BR)" -maxdepth 1 -type d \
+ '(' -name build-vpp_debug-native -o -name build-vpp-native ')' -print \
+ | sed -e 's@^$(WS_ROOT)/*@@' -e 1q)
+ifneq ($(strip $(_vpp_br)),)
+DOXY_INCLUDE_PATH += \
+ $(_vpp_br)/vlib-api \
+ $(_vpp_br)/vpp
+# Also include any plugin directories that exist
+DOXY_INCLUDE_PATH += \
+ $(shell find $(WS_ROOT)/$(_vpp_br)/plugins -maxdepth 1 -type d | sed -e 's@^$(WS_ROOT)/*@@')
+endif
+
+# Discover if we have CPP available
+_cpp = $(shell which cpp)
+ifneq ($(strip $(_cpp)),)
+# Add whatever directories CPP normally includes to the header path
+DOXY_INCLUDE_PATH += $(shell set -e; $(_cpp) -v </dev/null 2>&1 | awk 'f&&/^ /{print $$1} /^\#include/{f=1}')
+endif
+
+# Target directory for doxygen output
+DOXY_OUTPUT ?= $(BR)/docs
+
+# Siphoned fragments end up in here
+SIPHON_INPUT ?= $(DOXY_OUTPUT)/siphon_fragments
+
+# Siphoned fragements are processed into here
+SIPHON_OUTPUT ?= $(DOXY_OUTPUT)/siphon_docs
+
+# Extra document inputs that are processed in addition to DOXY_INPUT
+EXTRA_DOXY_INPUT += $(SIPHON_OUTPUT)
+
+# All the siphon types we know about
+SIPHONS ?= clicmd syscfg
+
+SIPHON_FILES = $(addprefix $(SIPHON_INPUT)/,$(addsuffix .siphon,$(SIPHONS)))
+SIPHON_DOCS = $(addprefix $(SIPHON_OUTPUT)/,$(addsuffix .md,$(SIPHONS)))
+SIPHON_ITEMLIST = $(addprefix $(SIPHON_OUTPUT)/,$(addsuffix .itemlist,$(filter clicmd,$(SIPHONS))))
+
+$(BR)/.doxygen-bootstrap.ok: Makefile
+ @echo "Checking whether dependencies for Doxygen are installed..."
+ifeq ($(OS_ID),ubuntu)
+ @set -e; inst=; \
+ for i in $(DOC_DEB_DEPENDS); do \
+ dpkg-query --show $$i >/dev/null 2>&1 || inst="$$inst $$i"; \
+ done; \
+ if [ "$$inst" ]; then \
+ sudo apt-get update; \
+ sudo apt-get $(CONFIRM) $(FORCE) install $$inst; \
+ fi
+ @if [ ! -s /usr/lib/graphviz/config6a ]; then \
+ echo "Rebuilding system Graphviz configuration."; \
+ sudo dot -c; \
+ fi
+else ifneq ("$(wildcard /etc/redhat-release)","")
+ @sudo yum install $(CONFIRM) $(DOC_RPM_DEPENDS)
+else ifeq ($(OS_ID),darwin)
+ @set -e; \
+ for bin in $(DOC_MAC_BIN_DEPENDS); do \
+ which -s $${bin} || (\
+ echo "Program '$${bin}' not found, please install it."; \
+ false; \
+ ); \
+ done
+ @set -e; \
+ for py in $(DOC_MAC_PY_DEPENDS); do \
+ python -c "import $${py}" >/dev/null 2>&1 || (\
+ echo "Python package '$${py}' not found, please install it."; \
+ false; \
+ ); \
+ done
+else ifeq ($(OS_ID),opensuse)
+ @sudo zypper install $(CONFIRM) $(DOC_SUSE_RPM_DEPENDS)
+else
+ $(error "Building documentation currently works only on Ubuntu, CentOS, MacOS and OpenSUSE systems.")
+endif
+ @touch $@
+
+.PHONY: bootstrap-doxygen
+bootstrap-doxygen: $(BR)/.doxygen-bootstrap.ok
+
+.DELETE_ON_ERROR: $(BR)/.doxygen-siphon.dep
+$(BR)/.doxygen-siphon.dep: Makefile \
+ $(addprefix,$(WSROOT),$(DOXY_INPUT))
+ @echo "Building siphon dependencies..."
+ @rm -f "$@"; for input in $(DOXY_INPUT); do \
+ [ -e "$(WS_ROOT)/$$input" ] && \
+ find "$(WS_ROOT)/$$input" -type f \
+ \( -name '*.[ch]' -or -name '*.dox' \) -print \
+ | grep -v -E '^$(WS_ROOT)/$(DOXY_EXCLUDE_REGEXP)' \
+ | sed -e "s/^/\$$(SIPHON_FILES): /" \
+ >> $@; \
+ done
+
+# Include the source -> siphon dependencies
+-include $(BR)/.doxygen-siphon.dep
+
+# Generate .siphon files that contain fragments of source file that
+# relate to the siphons we support.
+.NOTPARALLEL: $(SIPHON_FILES)
+$(SIPHON_FILES): $(BR)/.doxygen-bootstrap.ok \
+ $(DOXY_DIR)/siphon-generate \
+ $(addprefix,$(WSROOT),$(DOXY_INPUT)) \
+ $(wildcard $(DOXY_DIR)/siphon/*.py)
+ @echo "Validating source tree..."
+ @set -e; for input in $(DOXY_INPUT); do \
+ if [ ! -e "$(WS_ROOT)/$$input" ]; then \
+ echo "ERROR: Input path '$$input' does not exist." >&2; \
+ exit 1; \
+ fi; \
+ done
+ @rm -rf "$(SIPHON_INPUT)" "$(SIPHON_OUTPUT)"
+ @mkdir -p "$(SIPHON_INPUT)" "$(SIPHON_OUTPUT)"
+ @touch $(SIPHON_INPUT)/files
+ @echo "Collating source file list for siphoning..."
+ @for input in $(DOXY_INPUT); do \
+ cd "$(WS_ROOT)"; \
+ find "$$input" -type f \
+ \( -name '*.[ch]' -or -name '*.dox' \) -print \
+ | grep -v -E '^src/examples/' \
+ | grep -v -E '^$(DOXY_EXCLUDE_REGEXP)' \
+ >> $(SIPHON_INPUT)/files; \
+ done
+ @echo "Generating siphons..."
+ @set -e; \
+ cd "$(WS_ROOT)"; \
+ $(DOXY_DIR)/siphon-generate \
+ --output="$(SIPHON_INPUT)" \
+ "@$(SIPHON_INPUT)/files"
+
+# Evaluate this to build a siphon doc output target for each desired
+# output type:
+# $(eval $(call siphon-process,file_extension,output_type_name))
+define siphon-process
+$(SIPHON_OUTPUT)/%.$(1): $(SIPHON_INPUT)/%.siphon \
+ $(DOXY_DIR)/siphon-process \
+ $(wildcard $(DOXY_DIR)/siphon/*.py) \
+ $(wildcard $(DOXY_DIR)/siphon_templates/$(2)/*/*.$(1))
+ @echo "Processing siphon for $(2) from $$(notdir $$<)..."
+ @set -e; \
+ cd "$(WS_ROOT)"; \
+ $(DOXY_DIR)/siphon-process \
+ --type=$$(basename $$(notdir $$<)) \
+ --format=$(2) \
+ --output="$$@" \
+ "$$<"
+endef
+
+# Process the .siphon source fragments and render them into doxygen flavored
+# markdown documentation
+.DELETE_ON_ERROR: $(SIPHON_DOCS)
+$(eval $(call siphon-process,md,markdown))
+
+# Process the .siphon source fragments and render them into a list of cli
+# commands.
+.DELETE_ON_ERROR: $(SIPHON_ITEMLIST)
+$(eval $(call siphon-process,itemlist,itemlist))
+
+# This target can be used just to generate the siphoned things
+.PHONY: doxygen-siphon
+doxygen-siphon: $(SIPHON_DOCS) $(SIPHON_ITEMLIST)
+
+# Generate the doxygen docs
+.PHONY: doxygen
+doxygen: $(SIPHON_DOCS)
+ @mkdir -p "$(DOXY_OUTPUT)"
+ @echo "Running Doxygen..."
+ set -e; cd "$(WS_ROOT)"; \
+ ROOT="$(WS_ROOT)" \
+ BUILD_ROOT="$(BR)" \
+ INPUT="$(addprefix $(WS_ROOT)/,$(DOXY_INPUT)) $(EXTRA_DOXY_INPUT)" \
+ INCLUDE_PATH="$(DOXY_INCLUDE_PATH)" \
+ EXCLUDE="$(DOXY_EXCLUDE)" \
+ HTML=YES \
+ VERSION="`git describe --tags --dirty`" \
+ doxygen $(DOXY_DIR)/doxygen.cfg
+
+.PHONY: wipe-doxygen
+wipe-doxygen:
+ rm -rf "$(BR)/docs" "$(BR)/.doxygen-siphon.d"
+
+.PHONY: clean
+clean: wipe-doxygen
diff --git a/doxygen/assets/doxy-vpp.css b/doxygen/assets/doxy-vpp.css
new file mode 100644
index 0000000..108600a
--- /dev/null
+++ b/doxygen/assets/doxy-vpp.css
@@ -0,0 +1,53 @@
+/* VPP CSS overrides */
+
+body, table, div, p, dl {
+ font: initial;
+ font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+ font-size: small;
+}
+
+code, tt {
+ font: initial;
+ font-family: Consolas, Courier, monospace;
+ font-size: small;
+}
+
+pre {
+ font-size: 105%;
+}
+
+
+.title {
+ font: initial;
+ font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+ font-size: 150%;
+ font-weight: bold;
+}
+
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ font-family: Consolas, Courier, monospace;
+}
+
+.memname {
+ font-family: Consolas, Courier, monospace;
+ font-weight: bold;
+ font-size: 105%;
+}
+
+.paramname {
+ font-family: Consolas, Courier, monospace;
+ font-weight: bold;
+}
+
+a.el {
+ font-family: Consolas, Courier, monospace;
+}
+
+div.fragment {
+ padding: 2px;
+ margin-left: 8px;
+}
+
diff --git a/doxygen/assets/logo_fdio.png b/doxygen/assets/logo_fdio.png
new file mode 100644
index 0000000..ddfef2c
--- /dev/null
+++ b/doxygen/assets/logo_fdio.png
Binary files differ
diff --git a/doxygen/dev_doc.md b/doxygen/dev_doc.md
new file mode 100644
index 0000000..d1d22f7
--- /dev/null
+++ b/doxygen/dev_doc.md
@@ -0,0 +1,12 @@
+Developer Documentation {#dev_doc}
+=======================
+
+Programming notes for developers.
+
+- @subpage test_framework_doc
+- @subpage sample_plugin_doc
+- @subpage api_doc
+- @subpage vapi_doc
+- @subpage acl_hash_lookup
+- @subpage acl_multicore
+- @subpage libmemif_doc
diff --git a/doxygen/dir.dox.sample b/doxygen/dir.dox.sample
new file mode 100644
index 0000000..ccdd095
--- /dev/null
+++ b/doxygen/dir.dox.sample
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) <YEAR> <YOUR AFFILIATION HERE>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Doxygen directory documentation */
+
+/**
+@dir
+@brief Someone please fix this description.
+@todo This directory needs a description.
+
+This is where you would document the contents of a directory.
+
+This looks like a C file but it is not part of the build; it is purely
+for documentation.
+*/
+/*? %%clicmd:group_label CLI section description%% ?*/
+/*? %%syscfg:group_label Startup config section description%% ?*/
diff --git a/doxygen/doxygen.cfg b/doxygen/doxygen.cfg
new file mode 100644
index 0000000..f2d3911
--- /dev/null
+++ b/doxygen/doxygen.cfg
@@ -0,0 +1,2457 @@
+# Doxyfile 1.8.11
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "FD.io VPP"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER = $(VERSION)
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF = "Vector Packet Processing"
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO = $(ROOT)/doxygen/assets/logo_fdio.png
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = $(BUILD_ROOT)/docs
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = YES
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH = $(ROOT)
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH = $(ROOT)
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES =
+
+## Indexes VPP graph nodes
+ALIASES += "node=@xrefitem nodes \"Node Identifier\" \"Node Identifiers\" @c "
+
+## Formatting for CLI commands and output
+ALIASES += "cli{1}=<code><pre>\1</code></pre>"
+ALIASES += "clistart=<code><pre>"
+ALIASES += "cliend=</pre></code>"
+
+## Formatting for CLI example paragraphs
+ALIASES += "cliexpar=@par Example usage"
+ALIASES += "cliexcmd{1}=@clistart<b>vpp# <em>\1</em></b>@cliend"
+ALIASES += "cliexstart{1}=@cliexcmd{\1}@clistart"
+ALIASES += "cliexend=@cliend"
+
+## Formatting for config directives
+ALIASES += "cfgcmd{2}=@par <code><pre>\1 \2</pre></code>"
+ALIASES += "cfgcmd{1}=@par <code><pre>\1</pre></code>"
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING = def=C api=C
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = NO
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = YES
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS = DPDK
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 50
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE = $(ROOT)/doxygen/layout.xml
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = $(INPUT)
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,
+# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
+
+FILE_PATTERNS = *.md *.c *.h *.def *.inc *.S *.dox *.api
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE = $(EXCLUDE)
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = YES
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS = */test/* *_test.c test_*.c
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS = _ _*
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS = *.c *.h
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that con