The tunnel cases this example wants to test can be covered by testpmd
with rte_flow_create. And this example hasn't been used for a long time.
So deprecate this example.

Signed-off-by: Xiaoyun Li <xiaoyun...@intel.com>
---
 MAINTAINERS                                   |    4 -
 .../img/tep_termination_arch.svg              | 1400 -----------------
 doc/guides/sample_app_ug/index.rst            |    1 -
 doc/guides/sample_app_ug/tep_termination.rst  |  233 ---
 examples/meson.build                          |    2 +-
 examples/tep_termination/Makefile             |   45 -
 examples/tep_termination/main.c               | 1235 ---------------
 examples/tep_termination/main.h               |   93 --
 examples/tep_termination/meson.build          |   16 -
 examples/tep_termination/vxlan.c              |  243 ---
 examples/tep_termination/vxlan.h              |   57 -
 examples/tep_termination/vxlan_setup.c        |  443 ------
 examples/tep_termination/vxlan_setup.h        |   58 -
 13 files changed, 1 insertion(+), 3829 deletions(-)
 delete mode 100644 doc/guides/sample_app_ug/img/tep_termination_arch.svg
 delete mode 100644 doc/guides/sample_app_ug/tep_termination.rst
 delete mode 100644 examples/tep_termination/Makefile
 delete mode 100644 examples/tep_termination/main.c
 delete mode 100644 examples/tep_termination/main.h
 delete mode 100644 examples/tep_termination/meson.build
 delete mode 100644 examples/tep_termination/vxlan.c
 delete mode 100644 examples/tep_termination/vxlan.h
 delete mode 100644 examples/tep_termination/vxlan_setup.c
 delete mode 100644 examples/tep_termination/vxlan_setup.h

diff --git a/MAINTAINERS b/MAINTAINERS
index f7ecb5305..cd7e0215c 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1659,10 +1659,6 @@ M: John McNamara <john.mcnam...@intel.com>
 F: examples/skeleton/
 F: doc/guides/sample_app_ug/skeleton.rst
 
-TEP termination example
-M: Xiaoyun Li <xiaoyun...@intel.com>
-F: examples/tep_termination/
-
 VMDq examples
 F: examples/vmdq/
 F: doc/guides/sample_app_ug/vmdq_forwarding.rst
diff --git a/doc/guides/sample_app_ug/img/tep_termination_arch.svg 
b/doc/guides/sample_app_ug/img/tep_termination_arch.svg
deleted file mode 100644
index 54f1655cd..000000000
--- a/doc/guides/sample_app_ug/img/tep_termination_arch.svg
+++ /dev/null
@@ -1,1400 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Generated by Microsoft Visio, SVG Export VXLAN.svg Page-1 -->
-
-<svg
-   xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/";
-   xmlns:dc="http://purl.org/dc/elements/1.1/";
-   xmlns:cc="http://creativecommons.org/ns#";
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
-   xmlns:svg="http://www.w3.org/2000/svg";
-   xmlns="http://www.w3.org/2000/svg";
-   xmlns:xlink="http://www.w3.org/1999/xlink";
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
-   width="4.9898949in"
-   height="6.1537709in"
-   viewBox="0 0 359.27243 443.07151"
-   xml:space="preserve"
-   class="st24"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="tep_termination_arch.svg"
-   
style="font-size:12px;overflow:visible;color-interpolation-filters:sRGB;fill:none;fill-rule:evenodd;stroke-linecap:square;stroke-miterlimit:3"><metadata
-     id="metadata389"><rdf:RDF><cc:Work
-         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; 
/><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1875"
-     inkscape:window-height="1056"
-     id="namedview387"
-     showgrid="false"
-     inkscape:zoom="0.23838384"
-     inkscape:cx="236.40625"
-     inkscape:cy="204.93313"
-     inkscape:window-x="-2"
-     inkscape:window-y="-3"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg2"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0" /><v:documentProperties
-     v:langID="1033"
-     v:viewMarkup="false"><v:userDefs><v:ud
-         v:nameU="msvSubprocessMaster"
-         v:prompt=""
-         v:val="VT4(Rectangle)" /><v:ud
-         v:nameU="msvNoAutoConnect"
-         v:val="VT0(1):26" /><v:ud
-         v:nameU="msvConvertTheme" /></v:userDefs></v:documentProperties><style
-     type="text/css"
-     id="style4"><![CDATA[
-               .st1 {visibility:visible}
-               .st2 
{fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5}
-               .st3 
{fill:#d1dab4;stroke:#404040;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
-               .st4 
{fill:#6b9bc7;stroke:#404040;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
-               .st5 
{fill:#000000;font-family:Calibri;font-size:0.916672em;font-weight:bold}
-               .st6 
{fill:#92d050;stroke:#404040;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
-               .st7 {fill:#000000;font-family:Calibri;font-size:0.833336em}
-               .st8 {font-size:1em}
-               .st9 
{fill:#3e75a6;stroke:#404040;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
-               .st10 
{fill:#d8d8d8;stroke:#404040;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
-               .st11 
{fill:#404040;fill-opacity:1;stroke:#404040;stroke-opacity:1;stroke-width:0.08695652173913}
-               .st12 
{fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
-               .st13 
{fill:#000000;font-family:Calibri;font-size:1.00001em;font-weight:bold}
-               .st14 {fill:#000000;font-family:Calibri;font-size:1.00001em}
-               .st15 
{fill:#000000;font-family:Calibri;font-size:1.16666em;font-weight:bold}
-               .st16 
{fill:url(#grad0-72);stroke:#404040;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
-               .st17 
{fill:url(#grad0-83);stroke:#404040;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
-               .st18 
{fill:#f2c096;stroke:#404040;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
-               .st19 
{fill:#e1ebf3;stroke:#404040;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
-               .st20 {fill:#000000;font-family:Calibri;font-size:1.16666em}
-               .st21 {font-size:0.857157em}
-               .st22 
{fill:#d26d19;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
-               .st23 
{fill:#a6c3dd;stroke:#404040;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
-               .st24 
{fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
-       ]]></style><defs
-     id="Patterns_And_Gradients"><linearGradient
-       id="grad0-72"
-       x1="0"
-       y1="0"
-       x2="1"
-       y2="0"
-       gradientTransform="matrix(0,-1,1,0,0,1)"><stop
-         offset="0"
-         stop-color="#efaf7a"
-         stop-opacity="1"
-         id="stop8" /><stop
-         offset="1"
-         stop-color="#f2bf96"
-         stop-opacity="1"
-         id="stop10" /></linearGradient><linearGradient
-       id="grad0-83"
-       x1="-0.024014981"
-       y1="1433.2565"
-       x2="86.829642"
-       y2="1433.2565"
-       gradientTransform="scale(1.9190145,0.52110079)"
-       gradientUnits="userSpaceOnUse"><stop
-         offset="0"
-         stop-color="#f0f0f0"
-         stop-opacity="1"
-         id="stop13" /><stop
-         offset="1"
-         stop-color="#ffffff"
-         stop-opacity="1"
-         id="stop15" /></linearGradient><linearGradient
-       inkscape:collect="always"
-       xlink:href="#grad0-72"
-       id="linearGradient4536"
-       gradientTransform="scale(5.2221044,0.19149368)"
-       x1="-0.023935719"
-       y1="4088.255"
-       x2="48.280345"
-       y2="4088.255"
-       gradientUnits="userSpaceOnUse" /><linearGradient
-       inkscape:collect="always"
-       xlink:href="#grad0-72"
-       id="linearGradient4538"
-       gradientTransform="scale(5.2221044,0.19149368)"
-       x1="-0.023935719"
-       y1="4088.255"
-       x2="48.280345"
-       y2="4088.255"
-       gradientUnits="userSpaceOnUse" /></defs><defs
-     id="Markers"><g
-       id="lend13"><path
-         d="M 3,1 0,0 3,-1 3,1"
-         style="stroke:none"
-         id="path19"
-         inkscape:connector-curvature="0" /></g><marker
-       id="mrkr13-28"
-       class="st11"
-       v:arrowType="13"
-       v:arrowSize="2"
-       v:setback="34.5"
-       refX="-34.5"
-       orient="auto"
-       markerUnits="strokeWidth"
-       overflow="visible"
-       
style="overflow:visible;fill:#404040;fill-opacity:1;stroke:#404040;stroke-width:0.08695652;stroke-opacity:1"><use
-         xlink:href="#lend13"
-         transform="scale(-11.5,-11.5)"
-         id="use22"
-         x="0"
-         y="0"
-         width="100%"
-         height="100%" /></marker></defs><g
-     v:mID="0"
-     v:index="1"
-     v:groupContext="foregroundPage"
-     id="g24"
-     transform="translate(-116.875,-116.875)"><v:userDefs><v:ud
-         v:nameU="msvThemeColors"
-         v:val="VT0(36):26" /><v:ud
-         v:nameU="msvThemeEffects"
-         v:val="VT0(16):26" /><v:ud
-         v:nameU="msvThemeOrder"
-         v:val="VT0(0):26" /></v:userDefs><title
-       id="title26">Page-1</title><v:pageProperties
-       v:drawingScale="1"
-       v:pageScale="1"
-       v:drawingUnits="0"
-       v:shadowOffsetX="9"
-       v:shadowOffsetY="-9" /><v:layer
-       v:name="Flowchart"
-       v:index="0" /><g
-       id="shape33-1"
-       v:mID="33"
-       v:groupContext="shape"
-       transform="translate(117,-432)"><title
-         id="title29">Rectangle.18</title><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(15):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><g
-         id="shadow33-2"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><rect
-           x="0"
-           y="666"
-           width="342"
-           height="126"
-           class="st2"
-           id="rect32"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><rect
-         x="0"
-         y="666"
-         width="342"
-         height="126"
-         class="st3"
-         id="rect34"
-         
style="fill:#d1dab4;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /></g><g
-       id="shape10-5"
-       v:mID="10"
-       v:groupContext="shape"
-       transform="translate(216,-522)"><title
-         id="title37">Rounded rectangle.10</title><desc
-         id="desc39">Userspace vhost Interface</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="74.25"
-         cy="778.5"
-         width="148.5"
-         height="27" /><g
-         id="shadow10-6"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="m 139.5,792 a 9.00007,9.00007 -180 0 0 9,-9 l 0,-9 a 
9.00007,9.00007 -180 0 0 -9,-9 L 9,765 a 9.00007,9.00007 -180 0 0 -9,9 l 0,9 a 
9.00007,9.00007 -180 0 0 9,9 l 130.5,0 z"
-           class="st2"
-           id="path42"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="m 139.5,792 a 9.00007,9.00007 -180 0 0 9,-9 l 0,-9 a 
9.00007,9.00007 -180 0 0 -9,-9 L 9,765 a 9.00007,9.00007 -180 0 0 -9,9 l 0,9 a 
9.00007,9.00007 -180 0 0 9,9 l 130.5,0 z"
-         class="st4"
-         id="path44"
-         inkscape:connector-curvature="0"
-         
style="fill:#6b9bc7;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="15.14"
-         y="781.79999"
-         class="st5"
-         v:langID="2052"
-         id="text46"
-         
style="font-weight:bold;font-size:11.0000639px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />Userspace vhost Interface  </text>
-</g><g
-       id="shape12-10"
-       v:mID="12"
-       v:groupContext="shape"
-       transform="translate(355.5,-481.5)"><title
-         id="title49">Rounded rectangle.12</title><desc
-         id="desc51">Encapsulation</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="45"
-         cy="785.25"
-         width="90"
-         height="13.5" /><g
-         id="shadow12-11"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="M 83.25,792 A 6.75005,6.75005 -180 0 0 90,785.25 6.75005,6.75005 
-180 0 0 83.25,778.5 l -76.5,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 76.5,0 z"
-           class="st2"
-           id="path54"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="M 83.25,792 A 6.75005,6.75005 -180 0 0 90,785.25 6.75005,6.75005 
-180 0 0 83.25,778.5 l -76.5,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 76.5,0 z"
-         class="st6"
-         id="path56"
-         inkscape:connector-curvature="0"
-         
style="fill:#92d050;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="16.58"
-         y="788.25"
-         class="st7"
-         v:langID="1033"
-         id="text58"
-         
style="font-size:10.00003242px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />Encapsulation</text>
-</g><g
-       id="shape13-15"
-       v:mID="13"
-       v:groupContext="shape"
-       transform="translate(153,-483.75)"><title
-         id="title61">Rounded rectangle.13</title><desc
-         id="desc63">Decapsulation</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="36"
-         cy="785.25"
-         width="72"
-         height="13.5" /><g
-         id="shadow13-16"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="M 65.25,792 A 6.75005,6.75005 -180 0 0 72,785.25 6.75005,6.75005 
-180 0 0 65.25,778.5 l -58.5,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 58.5,0 z"
-           class="st2"
-           id="path66"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="M 65.25,792 A 6.75005,6.75005 -180 0 0 72,785.25 6.75005,6.75005 
-180 0 0 65.25,778.5 l -58.5,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 58.5,0 z"
-         class="st6"
-         id="path68"
-         inkscape:connector-curvature="0"
-         
style="fill:#92d050;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="8.2200003"
-         y="788.25"
-         class="st7"
-         v:langID="1033"
-         id="text70"
-         
style="font-size:10.00003242px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />D<tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan72"
-   style="font-size:10.00003242px">ecap</tspan>sulation</text>
-</g><g
-       id="shape35-21"
-       v:mID="35"
-       v:groupContext="shape"
-       transform="translate(117,-324)"><title
-         id="title75">Rectangle.18.35</title><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(15):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><g
-         id="shadow35-22"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><rect
-           x="0"
-           y="697.5"
-           width="342"
-           height="94.5"
-           class="st2"
-           id="rect78"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><rect
-         x="0"
-         y="697.5"
-         width="342"
-         height="94.5"
-         class="st9"
-         id="rect80"
-         
style="fill:#3e75a6;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /></g><g
-       id="shape15-25"
-       v:mID="15"
-       v:groupContext="shape"
-       transform="translate(259.654,-263.25)"><title
-         id="title83">Data store</title><v:userDefs><v:ud
-           v:nameU="CH"
-           v:val="VT0(5):26" /><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /></v:userDefs><path
-         d="m 0,600.13 a 28.3465,10.6299 0 0 1 56.69,0 28.3465,10.6299 0 0 1 
-56.69,0 z m 0,0 0,181.24 a 28.3465,10.6299 -180 1 0 56.69,0 l 0,-181.24 a 
28.3465,10.6299 0 0 1 -56.69,0 z"
-         class="st10"
-         id="path85"
-         inkscape:connector-curvature="0"
-         
style="fill:#d8d8d8;stroke:#404040;stroke-width:0.23999999;stroke-linecap:round;stroke-linejoin:round"
 /></g><g
-       id="shape16-29"
-       v:mID="16"
-       v:groupContext="shape"
-       transform="translate(324,-391.5)"><title
-         id="title88">Rounded rectangle.16</title><desc
-         id="desc90">Inner IP/L4 checksum offload</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="67.5"
-         cy="785.25"
-         width="135"
-         height="13.5" /><g
-         id="shadow16-30"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="m 128.25,792 a 6.75005,6.75005 -180 0 0 6.75,-6.75 
6.75005,6.75005 -180 0 0 -6.75,-6.75 l -121.5,0 A 6.75005,6.75005 -180 0 0 
0,785.25 6.75005,6.75005 -180 0 0 6.75,792 l 121.5,0 z"
-           class="st2"
-           id="path93"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="m 128.25,792 a 6.75005,6.75005 -180 0 0 6.75,-6.75 6.75005,6.75005 
-180 0 0 -6.75,-6.75 l -121.5,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 121.5,0 z"
-         class="st6"
-         id="path95"
-         inkscape:connector-curvature="0"
-         
style="fill:#92d050;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="8.2700005"
-         y="788.25"
-         class="st7"
-         v:langID="2052"
-         id="text97"
-         
style="font-size:10.00003242px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />Inner IP/L4 checksum offload</text>
-</g><g
-       id="shape17-34"
-       v:mID="17"
-       v:groupContext="shape"
-       transform="translate(144,-337.5)"><title
-         id="title100">Rounded rectangle.17</title><desc
-         id="desc102">UDP port configuration</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="54"
-         cy="785.25"
-         width="108"
-         height="13.5" /><g
-         id="shadow17-35"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="m 101.25,792 a 6.75005,6.75005 -180 0 0 6.75,-6.75 
6.75005,6.75005 -180 0 0 -6.75,-6.75 l -94.5,0 A 6.75005,6.75005 -180 0 0 
0,785.25 6.75005,6.75005 -180 0 0 6.75,792 l 94.5,0 z"
-           class="st2"
-           id="path105"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="m 101.25,792 a 6.75005,6.75005 -180 0 0 6.75,-6.75 6.75005,6.75005 
-180 0 0 -6.75,-6.75 l -94.5,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 94.5,0 z"
-         class="st6"
-         id="path107"
-         inkscape:connector-curvature="0"
-         
style="fill:#92d050;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="6.9299998"
-         y="788.25"
-         class="st7"
-         v:langID="1033"
-         id="text109"
-         
style="font-size:10.00003242px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />UDP port configuration</text>
-</g><g
-       id="shape18-39"
-       v:mID="18"
-       v:groupContext="shape"
-       transform="translate(145.346,-357.75)"><title
-         id="title112">Rounded rectangle.18</title><desc
-         id="desc114">Inner IP/L4 csum verify</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="53.3268"
-         cy="785.25"
-         width="106.66"
-         height="13.5" /><g
-         id="shadow18-40"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="m 99.9,792 a 6.75005,6.75005 -180 0 0 6.75,-6.75 6.75005,6.75005 
-180 0 0 -6.75,-6.75 l -93.15,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 93.15,0 z"
-           class="st2"
-           id="path117"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="m 99.9,792 a 6.75005,6.75005 -180 0 0 6.75,-6.75 6.75005,6.75005 
-180 0 0 -6.75,-6.75 l -93.15,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 93.15,0 z"
-         class="st6"
-         id="path119"
-         inkscape:connector-curvature="0"
-         
style="fill:#92d050;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="6.6599998"
-         y="788.25"
-         class="st7"
-         v:langID="2052"
-         id="text121"
-         
style="font-size:10.00003242px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />Inner IP/L4<tspan
-   class="st8"
-   v:langID="1033"
-   id="tspan123"
-   style="font-size:10.00003242px" /><tspan
-   class="st8"
-   v:langID="1033"
-   id="tspan125"
-   style="font-size:10.00003242px">csum</tspan> verify</text>
-</g><g
-       id="shape19-46"
-       v:mID="19"
-       v:groupContext="shape"
-       transform="translate(162,-378)"><title
-         id="title128">Rounded rectangle.19</title><desc
-         id="desc130">Tunnel Filter</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="45"
-         cy="785.25"
-         width="90"
-         height="13.5" /><g
-         id="shadow19-47"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="M 83.25,792 A 6.75005,6.75005 -180 0 0 90,785.25 6.75005,6.75005 
-180 0 0 83.25,778.5 l -76.5,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 76.5,0 z"
-           class="st2"
-           id="path133"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="M 83.25,792 A 6.75005,6.75005 -180 0 0 90,785.25 6.75005,6.75005 
-180 0 0 83.25,778.5 l -76.5,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 76.5,0 z"
-         class="st6"
-         id="path135"
-         inkscape:connector-curvature="0"
-         
style="fill:#92d050;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="18.290001"
-         y="788.25"
-         class="st7"
-         v:langID="1033"
-         id="text137"
-         
style="font-size:10.00003242px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />Tunnel <tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan139"
-   style="font-size:10.00003242px" />F<tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan141"
-   style="font-size:10.00003242px">ilter</tspan></text>
-</g><g
-       id="shape20-53"
-       v:mID="20"
-       v:groupContext="shape"
-       transform="translate(162,-398.25)"><title
-         id="title144">Rounded rectangle.20</title><desc
-         id="desc146">Packet Type</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="45"
-         cy="785.25"
-         width="90"
-         height="13.5" /><g
-         id="shadow20-54"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="M 83.25,792 A 6.75005,6.75005 -180 0 0 90,785.25 6.75005,6.75005 
-180 0 0 83.25,778.5 l -76.5,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 76.5,0 z"
-           class="st2"
-           id="path149"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="M 83.25,792 A 6.75005,6.75005 -180 0 0 90,785.25 6.75005,6.75005 
-180 0 0 83.25,778.5 l -76.5,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 76.5,0 z"
-         class="st6"
-         id="path151"
-         inkscape:connector-curvature="0"
-         
style="fill:#92d050;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="20.530001"
-         y="788.25"
-         class="st7"
-         v:langID="1033"
-         id="text153"
-         
style="font-size:10.00003242px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />Packet Type</text>
-</g><g
-       id="shape27-58"
-       v:mID="27"
-       v:groupContext="shape"
-       transform="translate(326.25,-441)"><title
-         id="title156">Sheet.27</title><desc
-         id="desc158">DPDK Application</desc><v:userDefs><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="54"
-         cy="783"
-         width="108"
-         height="18" /><rect
-         x="0"
-         y="774"
-         width="108"
-         height="18"
-         class="st12"
-         id="rect160"
-         
style="fill:none;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="10.11"
-         y="786.59998"
-         class="st13"
-         v:langID="2052"
-         id="text162"
-         
style="font-weight:bold;font-size:12.00012016px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />DPDK Application</text>
-</g><g
-       id="shape26-61"
-       v:mID="26"
-       v:groupContext="shape"
-       transform="translate(324,-279)"><title
-         id="title165">Sheet.26</title><desc
-         id="desc167">VXLAN Tunnel</desc><v:userDefs><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="45"
-         cy="778.5"
-         width="90"
-         height="27" /><rect
-         x="0"
-         y="765"
-         width="90"
-         height="27"
-         class="st12"
-         id="rect169"
-         
style="fill:none;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="10.51"
-         y="782.09998"
-         class="st14"
-         v:langID="2052"
-         id="text171"
-         
style="font-size:12.00012016px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />VXLAN Tunnel</text>
-</g><g
-       id="shape28-64"
-       v:mID="28"
-       v:groupContext="shape"
-       transform="translate(342,-333)"><title
-         id="title174">Sheet.28</title><desc
-         id="desc176">NIC</desc><v:userDefs><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="45"
-         cy="783"
-         width="90"
-         height="18" /><rect
-         x="0"
-         y="774"
-         width="90"
-         height="18"
-         class="st12"
-         id="rect178"
-         
style="fill:none;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="36.400002"
-         y="787.20001"
-         class="st15"
-         v:langID="2052"
-         id="text180"
-         
style="font-weight:bold;font-size:13.99991989px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />NIC</text>
-</g><g
-       id="shape29-67"
-       v:mID="29"
-       v:groupContext="shape"
-       transform="matrix(0,1,1,0,-517.5,270)"><title
-         id="title183">45 degree single</title><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><g
-         id="shadow29-68"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="m 0,787.5 4.5,-4.5 0,2.97 247.5,0 0,3.06 -247.5,0 0,2.97 
-4.5,-4.5 z"
-           class="st2"
-           id="path186"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="m 0,787.5 4.5,-4.5 0,2.97 247.5,0 0,3.06 -247.5,0 0,2.97 -4.5,-4.5 
z"
-         class="st16"
-         id="path188"
-         inkscape:connector-curvature="0"
-         
style="fill:url(#linearGradient4536);stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /></g><g
-       id="shape30-73"
-       v:mID="30"
-       v:groupContext="shape"
-       transform="matrix(0,-1,-1,0,1093.5,522)"><title
-         id="title191">45 degree single.30</title><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><g
-         id="shadow30-74"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(-1.44,-1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="m 0,787.5 4.5,-4.5 0,2.97 247.5,0 0,3.06 -247.5,0 0,2.97 
-4.5,-4.5 z"
-           class="st2"
-           id="path194"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="m 0,787.5 4.5,-4.5 0,2.97 247.5,0 0,3.06 -247.5,0 0,2.97 -4.5,-4.5 
z"
-         class="st16"
-         id="path196"
-         inkscape:connector-curvature="0"
-         
style="fill:url(#linearGradient4538);stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /></g><g
-       id="shape14-78"
-       v:mID="14"
-       v:groupContext="shape"
-       v:layerMember="0"
-       transform="translate(207,-234)"><title
-         id="title199">Object</title><desc
-         id="desc201">WAN/LAN</desc><v:custProps><v:cp
-           v:nameU="Cost"
-           v:lbl="Cost"
-           v:type="7"
-           v:format="@"
-           v:langID="1033" /><v:cp
-           v:nameU="Duration"
-           v:lbl="Duration"
-           v:type="2"
-           v:langID="1033" /><v:cp
-           v:nameU="Resources"
-           v:lbl="Resources"
-           v:langID="1033" /></v:custProps><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(1,1,1,1)"
-         v:tabSpace="42.5197" /><v:textRect
-         cx="83.25"
-         cy="769.5"
-         width="166.5"
-         height="45" /><g
-         id="shadow14-79"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="m 23.93,782.24 a 19.1532,6.46551 -180 0 0 27.59,5.48 
26.5285,8.95514 -180 0 0 47.98,-2.03 8.02422,2.70871 -180 0 0 8.66,2.93 
30.5319,10.3066 -180 0 0 29.32,-4.28 18.9723,6.40442 -180 0 0 20.66,-4.05 
29.3596,9.20857 -176.98 0 0 -12.51,-8.69 100.331,31.9328 -2.78 0 0 20.84,-8.56 
42.3527,12.6007 -180 0 0 -21.95,-11.54 25.2977,7.52648 -180 0 0 -48.39,3.6 
21.4707,5.9338 -1.58 0 0 -36.32,0.33 30.834,8.86245 -178.72 0 0 -39.29,12.27 
24.6202,7.32494 -180 0 0 3.41,14.54 z"
-           class="st2"
-           id="path204"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="m 23.93,782.24 a 19.1532,6.46551 -180 0 0 27.59,5.48 
26.5285,8.95514 -180 0 0 47.98,-2.03 8.02422,2.70871 -180 0 0 8.66,2.93 
30.5319,10.3066 -180 0 0 29.32,-4.28 18.9723,6.40442 -180 0 0 20.66,-4.05 
29.3596,9.20857 -176.98 0 0 -12.51,-8.69 100.331,31.9328 -2.78 0 0 20.84,-8.56 
42.3527,12.6007 -180 0 0 -21.95,-11.54 25.2977,7.52648 -180 0 0 -48.39,3.6 
21.4707,5.9338 -1.58 0 0 -36.32,0.33 30.834,8.86245 -178.72 0 0 -39.29,12.27 
24.6202,7.32494 -180 0 0 3.41,14.54 z"
-         class="st17"
-         id="path206"
-         inkscape:connector-curvature="0"
-         
style="fill:url(#grad0-83);stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="53.23"
-         y="773.70001"
-         class="st15"
-         v:langID="2052"
-         id="text208"
-         
style="font-weight:bold;font-size:13.99991989px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />WAN/LAN</text>
-</g><g
-       id="shape11-85"
-       v:mID="11"
-       v:groupContext="shape"
-       transform="translate(236.25,-472.5)"><title
-         id="title211">Rounded rectangle.11</title><desc
-         id="desc213">TEP</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="54"
-         cy="774"
-         width="108"
-         height="36" /><g
-         id="shadow11-86"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="m 99,792 a 9.00007,9.00007 -180 0 0 9,-9 l 0,-18 a 
9.00007,9.00007 -180 0 0 -9,-9 l -90,0 a 9.00007,9.00007 -180 0 0 -9,9 l 0,18 a 
9.00007,9.00007 -180 0 0 9,9 l 90,0 z"
-           class="st2"
-           id="path216"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="m 99,792 a 9.00007,9.00007 -180 0 0 9,-9 l 0,-18 a 9.00007,9.00007 
-180 0 0 -9,-9 l -90,0 a 9.00007,9.00007 -180 0 0 -9,9 l 0,18 a 9.00007,9.00007 
-180 0 0 9,9 l 90,0 z"
-         class="st18"
-         id="path218"
-         inkscape:connector-curvature="0"
-         
style="fill:#f2c096;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="44.91"
-         y="777.59998"
-         class="st13"
-         v:langID="2052"
-         id="text220"
-         
style="font-weight:bold;font-size:12.00012016px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />TEP</text>
-</g><g
-       id="shape36-90"
-       v:mID="36"
-       v:groupContext="shape"
-       transform="translate(117,-571.5)"><title
-         id="title223">Rectangle.18.36</title><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(15):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><g
-         id="shadow36-91"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><rect
-           x="0"
-           y="688.5"
-           width="342"
-           height="103.5"
-           class="st2"
-           id="rect226"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><rect
-         x="0"
-         y="688.5"
-         width="342"
-         height="103.5"
-         class="st19"
-         id="rect228"
-         
style="fill:#e1ebf3;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /></g><g
-       id="shape5-94"
-       v:mID="5"
-       v:groupContext="shape"
-       transform="translate(306,-594)"><title
-         id="title231">Rounded rectangle.5</title><desc
-         id="desc233">VM-2 (VNID:200)</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="61.3125"
-         cy="765"
-         width="122.63"
-         height="54" /><g
-         id="shadow5-95"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="m 113.62,792 a 9.00007,9.00007 -180 0 0 9.01,-9 l -0.01,-36 a 
9.00007,9.00007 -180 0 0 -9,-9 L 9,738 a 9.00007,9.00007 -180 0 0 -9,9 l 0,36 a 
9.00007,9.00007 -180 0 0 9,9 l 104.62,0 z"
-           class="st2"
-           id="path236"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="m 113.62,792 a 9.00007,9.00007 -180 0 0 9.01,-9 l -0.01,-36 a 
9.00007,9.00007 -180 0 0 -9,-9 L 9,738 a 9.00007,9.00007 -180 0 0 -9,9 l 0,36 a 
9.00007,9.00007 -180 0 0 9,9 l 104.62,0 z"
-         class="st9"
-         id="path238"
-         inkscape:connector-curvature="0"
-         
style="fill:#3e75a6;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="16.93"
-         y="769.20001"
-         class="st20"
-         v:langID="2052"
-         id="text240"
-         
style="font-size:13.99991989px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />VM<tspan
-   class="st8"
-   v:langID="1033"
-   id="tspan242"
-   style="font-size:13.99991989px">-</tspan>2 (<tspan
-   class="st21"
-   id="tspan244"
-   style="font-size:12.00012875px">VNID</tspan><tspan
-   class="st21"
-   id="tspan246"
-   style="font-size:12.00012875px">:</tspan><tspan
-   class="st21"
-   id="tspan248"
-   style="font-size:12.00012875px">200</tspan><tspan
-   class="st21"
-   id="tspan250"
-   style="font-size:12.00012875px">)</tspan></text>
-</g><g
-       id="shape3-104"
-       v:mID="3"
-       v:groupContext="shape"
-       transform="translate(135,-594)"><title
-         id="title253">Rounded rectangle</title><desc
-         id="desc255">VM-1 (VNID: 100)</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="61.3125"
-         cy="765"
-         width="122.63"
-         height="54" /><g
-         id="shadow3-105"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="m 113.62,792 a 9.00007,9.00007 -180 0 0 9.01,-9 l -0.01,-36 a 
9.00007,9.00007 -180 0 0 -9,-9 L 9,738 a 9.00007,9.00007 -180 0 0 -9,9 l 0,36 a 
9.00007,9.00007 -180 0 0 9,9 l 104.62,0 z"
-           class="st2"
-           id="path258"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="m 113.62,792 a 9.00007,9.00007 -180 0 0 9.01,-9 l -0.01,-36 a 
9.00007,9.00007 -180 0 0 -9,-9 L 9,738 a 9.00007,9.00007 -180 0 0 -9,9 l 0,36 a 
9.00007,9.00007 -180 0 0 9,9 l 104.62,0 z"
-         class="st9"
-         id="path260"
-         inkscape:connector-curvature="0"
-         
style="fill:#3e75a6;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="15.58"
-         y="769.20001"
-         class="st20"
-         v:langID="2052"
-         id="text262"
-         
style="font-size:13.99991989px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />VM<tspan
-   class="st8"
-   v:langID="1033"
-   id="tspan264"
-   style="font-size:13.99991989px">-</tspan>1 (<tspan
-   class="st21"
-   id="tspan266"
-   style="font-size:12.00012875px">VNID</tspan><tspan
-   class="st21"
-   id="tspan268"
-   style="font-size:12.00012875px">: </tspan><tspan
-   class="st21"
-   id="tspan270"
-   style="font-size:12.00012875px">100</tspan><tspan
-   class="st21"
-   id="tspan272"
-   style="font-size:12.00012875px">)</tspan></text>
-</g><g
-       id="shape23-114"
-       v:mID="23"
-       v:groupContext="shape"
-       
transform="matrix(0.8626982,0.50571911,-0.50571911,0.8626982,624.813,-477.284)"><title
-         id="title275">Process boundary.23</title><v:userDefs><v:ud
-           v:nameU="CH"
-           v:val="VT0(5):26" /><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /></v:userDefs><rect
-         x="0"
-         y="789.16498"
-         width="75.634804"
-         height="2.83465"
-         class="st22"
-         id="rect277"
-         
style="fill:#d26d19;stroke:none;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:round"
 /></g><g
-       id="shape22-116"
-       v:mID="22"
-       v:groupContext="shape"
-       
transform="matrix(0.95221525,0.30542775,-0.30542775,0.95221525,412.466,-548.055)"><title
-         id="title280">Process boundary</title><v:userDefs><v:ud
-           v:nameU="CH"
-           v:val="VT0(5):26" /><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /></v:userDefs><rect
-         x="0"
-         y="789.16498"
-         width="125.234"
-         height="2.83465"
-         class="st22"
-         id="rect282"
-         
style="fill:#d26d19;stroke:none;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:round"
 /></g><g
-       id="shape24-118"
-       v:mID="24"
-       v:groupContext="shape"
-       
transform="matrix(-0.93547487,0.35339321,-0.35339321,-0.93547487,670.892,944.318)"><title
-         id="title285">Process boundary.24</title><v:userDefs><v:ud
-           v:nameU="CH"
-           v:val="VT0(5):26" /><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /></v:userDefs><rect
-         x="0"
-         y="789.16498"
-         width="108.234"
-         height="2.83465"
-         class="st22"
-         id="rect287"
-         
style="fill:#d26d19;stroke:none;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:round"
 /></g><g
-       id="shape25-120"
-       v:mID="25"
-       v:groupContext="shape"
-       
transform="matrix(-0.78441927,0.62023093,-0.62023093,-0.78441927,828.973,824.895)"><title
-         id="title290">Process boundary.25</title><v:userDefs><v:ud
-           v:nameU="CH"
-           v:val="VT0(5):26" /><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /></v:userDefs><rect
-         x="0"
-         y="789.16498"
-         width="61.670101"
-         height="2.83465"
-         class="st22"
-         id="rect292"
-         
style="fill:#d26d19;stroke:none;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:round"
 /></g><g
-       id="shape4-122"
-       v:mID="4"
-       v:groupContext="shape"
-       transform="translate(148.5,-587.25)"><title
-         id="title295">Rectangle</title><desc
-         id="desc297">vport-0</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="22.5"
-         cy="784.125"
-         width="45"
-         height="15.75" /><g
-         id="shadow4-123"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><rect
-           x="0"
-           y="776.25"
-           width="45"
-           height="15.75"
-           class="st2"
-           id="rect300"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><rect
-         x="0"
-         y="776.25"
-         width="45"
-         height="15.75"
-         class="st23"
-         id="rect302"
-         
style="fill:#a6c3dd;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="7.5"
-         y="787.13"
-         class="st7"
-         v:langID="1033"
-         id="text304"
-         
style="font-size:10.00003242px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />v<tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan306"
-   style="font-size:10.00003242px">port</tspan><tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan308"
-   style="font-size:10.00003242px">-</tspan><tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan310"
-   style="font-size:10.00003242px">0</tspan></text>
-</g><g
-       id="shape2-130"
-       v:mID="2"
-       v:groupContext="shape"
-       transform="translate(202.5,-587.25)"><title
-         id="title313">Rectangle.2</title><desc
-         id="desc315">vport-1</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="22.5"
-         cy="784.125"
-         width="45"
-         height="15.75" /><g
-         id="shadow2-131"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><rect
-           x="0"
-           y="776.25"
-           width="45"
-           height="15.75"
-           class="st2"
-           id="rect318"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><rect
-         x="0"
-         y="776.25"
-         width="45"
-         height="15.75"
-         class="st23"
-         id="rect320"
-         
style="fill:#a6c3dd;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="7.5"
-         y="787.13"
-         class="st7"
-         v:langID="1033"
-         id="text322"
-         
style="font-size:10.00003242px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />v<tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan324"
-   style="font-size:10.00003242px">port</tspan><tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan326"
-   style="font-size:10.00003242px">-</tspan><tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan328"
-   style="font-size:10.00003242px">1</tspan></text>
-</g><g
-       id="shape6-138"
-       v:mID="6"
-       v:groupContext="shape"
-       transform="translate(317.25,-587.25)"><title
-         id="title331">Rectangle.6</title><desc
-         id="desc333">vport-0</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="21.375"
-         cy="784.125"
-         width="42.75"
-         height="15.75" /><g
-         id="shadow6-139"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><rect
-           x="0"
-           y="776.25"
-           width="42.75"
-           height="15.75"
-           class="st2"
-           id="rect336"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><rect
-         x="0"
-         y="776.25"
-         width="42.75"
-         height="15.75"
-         class="st23"
-         id="rect338"
-         
style="fill:#a6c3dd;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="6.3699999"
-         y="787.13"
-         class="st7"
-         v:langID="1033"
-         id="text340"
-         
style="font-size:10.00003242px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />v<tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan342"
-   style="font-size:10.00003242px">port</tspan><tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan344"
-   style="font-size:10.00003242px">-</tspan><tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan346"
-   style="font-size:10.00003242px">0</tspan></text>
-</g><g
-       id="shape7-146"
-       v:mID="7"
-       v:groupContext="shape"
-       transform="translate(369,-587.25)"><title
-         id="title349">Rectangle.7</title><desc
-         id="desc351">vport-1</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="22.5"
-         cy="784.125"
-         width="45"
-         height="15.75" /><g
-         id="shadow7-147"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><rect
-           x="0"
-           y="776.25"
-           width="45"
-           height="15.75"
-           class="st2"
-           id="rect354"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><rect
-         x="0"
-         y="776.25"
-         width="45"
-         height="15.75"
-         class="st23"
-         id="rect356"
-         
style="fill:#a6c3dd;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="7.5"
-         y="787.13"
-         class="st7"
-         v:langID="1033"
-         id="text358"
-         
style="font-size:10.00003242px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />v<tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan360"
-   style="font-size:10.00003242px">port</tspan><tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan362"
-   style="font-size:10.00003242px">-</tspan><tspan
-   class="st8"
-   v:langID="2052"
-   id="tspan364"
-   style="font-size:10.00003242px">1</tspan></text>
-</g><g
-       id="shape37-154"
-       v:mID="37"
-       v:groupContext="shape"
-       transform="translate(234,-648)"><title
-         id="title367">Sheet.37</title><desc
-         id="desc369">Guest</desc><v:userDefs><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="54"
-         cy="783"
-         width="108"
-         height="18" /><rect
-         x="0"
-         y="774"
-         width="108"
-         height="18"
-         class="st12"
-         id="rect371"
-         
style="fill:none;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="39.459999"
-         y="786.59998"
-         class="st13"
-         v:langID="1033"
-         id="text373"
-         
style="font-weight:bold;font-size:12.00012016px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />Guest</text>
-</g><g
-       id="shape38-157"
-       v:mID="38"
-       v:groupContext="shape"
-       transform="translate(324,-357.75)"><title
-         id="title376">Rounded rectangle.38</title><desc
-         id="desc378">TSO offload</desc><v:userDefs><v:ud
-           v:nameU="visVersion"
-           v:val="VT0(14):26" /><v:ud
-           v:nameU="msvThemeColors"
-           v:val="VT0(36):26" /><v:ud
-           v:nameU="msvThemeEffects"
-           v:val="VT0(16):26" /></v:userDefs><v:textBlock
-         v:margins="rect(4,4,4,4)" /><v:textRect
-         cx="36"
-         cy="785.25"
-         width="72"
-         height="13.5" /><g
-         id="shadow38-158"
-         v:groupContext="shadow"
-         v:shadowOffsetX="1.44"
-         v:shadowOffsetY="-1.44"
-         v:shadowType="1"
-         transform="translate(1.44,1.44)"
-         class="st1"
-         style="visibility:visible"><path
-           d="M 65.25,792 A 6.75005,6.75005 -180 0 0 72,785.25 6.75005,6.75005 
-180 0 0 65.25,778.5 l -58.5,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 58.5,0 z"
-           class="st2"
-           id="path381"
-           inkscape:connector-curvature="0"
-           
style="fill:#cdcdcd;fill-opacity:0.5;stroke:#cdcdcd;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.5"
 /></g><path
-         d="M 65.25,792 A 6.75005,6.75005 -180 0 0 72,785.25 6.75005,6.75005 
-180 0 0 65.25,778.5 l -58.5,0 A 6.75005,6.75005 -180 0 0 0,785.25 
6.75005,6.75005 -180 0 0 6.75,792 l 58.5,0 z"
-         class="st6"
-         id="path383"
-         inkscape:connector-curvature="0"
-         
style="fill:#92d050;stroke:#404040;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round"
 /><text
-         x="12.33"
-         y="788.25"
-         class="st7"
-         v:langID="2052"
-         id="text385"
-         
style="font-size:10.00003242px;font-family:Calibri;fill:#000000"><v:paragraph
-   v:horizAlign="1" /><v:tabList />TSO offload</text>
-</g></g></svg>
\ No newline at end of file
diff --git a/doc/guides/sample_app_ug/index.rst 
b/doc/guides/sample_app_ug/index.rst
index affa9c574..ef66e23bb 100644
--- a/doc/guides/sample_app_ug/index.rst
+++ b/doc/guides/sample_app_ug/index.rst
@@ -51,7 +51,6 @@ Sample Applications User Guides
     eventdev_pipeline
     dist_app
     vm_power_management
-    tep_termination
     ptpclient
     performance_thread
     fips_validation
diff --git a/doc/guides/sample_app_ug/tep_termination.rst 
b/doc/guides/sample_app_ug/tep_termination.rst
deleted file mode 100644
index df159355d..000000000
--- a/doc/guides/sample_app_ug/tep_termination.rst
+++ /dev/null
@@ -1,233 +0,0 @@
-..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright(c) 2010-2015 Intel Corporation.
-
-TEP termination Sample Application
-==================================
-
-The TEP (Tunnel End point) termination sample application simulates a VXLAN
-Tunnel Endpoint (VTEP) termination in DPDK, which is used to demonstrate
-the offload and filtering capabilities of Intel® XL710 10/40 Gigabit Ethernet
-Controller for VXLAN packet.
-This sample uses the basic virtio devices management mechanism from vhost 
example,
-and also uses the us-vHost interface and tunnel filtering mechanism to direct
-a specified traffic to a specific VM.
-In addition, this sample is also designed to show how tunneling protocols can 
be handled.
-
-Background
-----------
-
-With virtualization, overlay networks allow a network structure to be built
-or imposed across physical nodes which is abstracted away from the actual
-underlining physical network connections.
-This allows network isolation, QOS, etc to be provided on a per client basis.
-
-.. _figure_overlay_networking:
-
-.. figure:: img/overlay_networking.*
-
-   Overlay Networking.
-
-In a typical setup, the network overlay tunnel is terminated at the 
Virtual/Tunnel End Point (VEP/TEP).
-The TEP is normally located at the physical host level ideally in the software 
switch.
-Due to processing constraints and the inevitable bottleneck that the switch
-becomes, the ability to offload overlay support features becomes an important 
requirement.
-Intel® XL710 10/40 Gigabit Ethernet network card provides hardware filtering
-and offload capabilities to support overlay networks implementations such as 
MAC in UDP and MAC in GRE.
-
-Sample Code Overview
---------------------
-
-The DPDK TEP termination sample code demonstrates the offload and filtering
-capabilities of Intel® XL710 10/40 Gigabit Ethernet Controller for VXLAN 
packet.
-
-The sample code is based on vhost library.
-The vhost library is developed for user space Ethernet switch to easily 
integrate with vhost functionality.
-
-The sample will support the followings:
-
-*   Tunneling packet recognition.
-
-*   The port of UDP tunneling is configurable
-
-*   Directing incoming traffic to the correct queue based on the tunnel filter 
type.
-    The supported filter type are listed below.
-
-    * Inner MAC and VLAN and tenant ID
-
-    * Inner MAC and tenant ID, and Outer MAC
-
-    * Inner MAC and tenant ID
-
-    The tenant ID will be assigned from a static internal table based on the 
us-vhost device ID.
-    Each device will receive a unique device ID.
-    The inner MAC will be learned by the first packet transmitted from a 
device.
-
-*   Decapsulation of RX VXLAN traffic. This is a software only operation.
-
-*   Encapsulation of TX VXLAN traffic. This is a software only operation.
-
-*   Inner IP and inner L4 checksum offload.
-
-*   TSO offload support for tunneling packet.
-
-The following figure shows the framework of the TEP termination sample
-application based on DPDK vhost lib.
-
-.. _figure_tep_termination_arch:
-
-.. figure:: img/tep_termination_arch.*
-
-   TEP termination Framework Overview
-
-Supported Distributions
------------------------
-
-The example in this section have been validated with the following 
distributions:
-
-*   Fedora* 18
-
-*   Fedora* 19
-
-*   Fedora* 20
-
-Compiling the Sample Code
--------------------------
-
-To enable vhost, turn on vhost library in the configure file
-``config/common_linux``.
-
-    .. code-block:: console
-
-        CONFIG_RTE_LIBRTE_VHOST=y
-
-Then following the to compile the sample application shown in
-:doc:`compiling`.
-
-Running the Sample Code
------------------------
-
-#.  Go to the examples directory:
-
-    .. code-block:: console
-
-        export RTE_SDK=/path/to/rte_sdk
-        cd ${RTE_SDK}/examples/tep_termination
-
-#.  Run the tep_termination sample code:
-
-    .. code-block:: console
-
-        user@target:~$ ./build/app/tep_termination -l 0-3 -n 4 --huge-dir 
/mnt/huge --
-                        -p 0x1 --dev-basename tep-termination --nb-devices 4
-                        --udp-port 4789 --filter-type 1
-
-.. note::
-
-    Please note the huge-dir parameter instructs the DPDK to allocate its 
memory from the 2 MB page hugetlbfs.
-
-Parameters
-~~~~~~~~~~
-
-**The same parameters with the vhost sample.**
-
-Refer to :ref:`vhost_app_parameters` for detailed explanation.
-
-**Number of Devices.**
-
-The nb-devices option specifies the number of virtIO device.
-The default value is 2.
-
-.. code-block:: console
-
-    user@target:~$ ./build/app/tep_termination -l 0-3 -n 4 --huge-dir 
/mnt/huge --
-                    --nb-devices 2
-
-**Tunneling UDP port.**
-
-The udp-port option is used to specify the destination UDP number for UDP 
tunneling packet.
-The default value is 4789.
-
-.. code-block:: console
-
-    user@target:~$ ./build/app/tep_termination -l 0-3 -n 4 --huge-dir 
/mnt/huge --
-                    --nb-devices 2 --udp-port 4789
-
-**Filter Type.**
-
-The filter-type option is used to specify which filter type is used to
-filter UDP tunneling packet to a specified queue.
-The default value is 1, which means the filter type of inner MAC and tenant ID 
is used.
-
-.. code-block:: console
-
-    user@target:~$ ./build/app/tep_termination -l 0-3 -n 4 --huge-dir 
/mnt/huge --
-                --nb-devices 2 --udp-port 4789 --filter-type 1
-
-**TX Checksum.**
-
-The tx-checksum option is used to enable or disable the inner header checksum 
offload.
-The default value is 0, which means the checksum offload is disabled.
-
-.. code-block:: console
-
-    user@target:~$ ./build/app/tep_termination -l 0-3 -n 4 --huge-dir 
/mnt/huge --
-                --nb-devices 2 --tx-checksum
-
-**TCP segment size.**
-
-The tso-segsz option specifies the TCP segment size for TSO offload for 
tunneling packet.
-The default value is 0, which means TSO offload is disabled.
-
-.. code-block:: console
-
-    user@target:~$ ./build/app/tep_termination -l 0-3 -n 4 --huge-dir 
/mnt/huge --
-                --tx-checksum --tso-segsz 800
-
-**Decapsulation option.**
-
-The decap option is used to enable or disable decapsulation operation for 
received VXLAN packet.
-The default value is 1.
-
-.. code-block:: console
-
-    user@target:~$ ./build/app/tep_termination -l 0-3 -n 4 --huge-dir 
/mnt/huge --
-                --nb-devices 4 --udp-port 4789 --decap 1
-
-**Encapsulation option.**
-
-The encap option is used to enable or disable encapsulation operation for 
transmitted packet.
-The default value is 1.
-
-.. code-block:: console
-
-    user@target:~$ ./build/app/tep_termination -l 0-3 -n 4 --huge-dir 
/mnt/huge --
-                --nb-devices 4 --udp-port 4789 --encap 1
-
-
-Running the Virtual Machine (QEMU)
-----------------------------------
-
-Refer to :ref:`vhost_app_run_vm`.
-
-Running DPDK in the Virtual Machine
------------------------------------
-
-Refer to :ref:`vhost_app_run_dpdk_inside_guest`.
-
-Passing Traffic to the Virtual Machine Device
----------------------------------------------
-
-For a virtio-net device to receive traffic, the traffic's Layer 2 header must 
include
-both the virtio-net device's MAC address.
-The DPDK sample code behaves in a similar manner to a learning switch in that
-it learns the MAC address of the virtio-net devices from the first transmitted 
packet.
-On learning the MAC address,
-the DPDK vhost sample code prints a message with the MAC address and tenant ID 
virtio-net device.
-For example:
-
-.. code-block:: console
-
-    DATA: (0) MAC_ADDRESS cc:bb:bb:bb:bb:bb and VNI 1000 registered
-
-The above message indicates that device 0 has been registered with MAC address 
cc:bb:bb:bb:bb:bb and VNI 1000.
-Any packets received on the NIC with these values are placed on the devices 
receive queue.
diff --git a/examples/meson.build b/examples/meson.build
index 414ec55cc..f17995532 100644
--- a/examples/meson.build
+++ b/examples/meson.build
@@ -40,7 +40,7 @@ all_examples = [
        'server_node_efd/node',
        'server_node_efd/server',
        'service_cores',
-       'skeleton', 'tep_termination',
+       'skeleton',
        'timer', 'vdpa',
        'vhost', 'vhost_crypto',
        'vhost_blk', 'vm_power_manager',
diff --git a/examples/tep_termination/Makefile 
b/examples/tep_termination/Makefile
deleted file mode 100644
index 443bcb190..000000000
--- a/examples/tep_termination/Makefile
+++ /dev/null
@@ -1,45 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2010-2015 Intel Corporation
-
-# binary name
-APP = tep_termination
-
-# all source are stored in SRCS-y
-SRCS-y := main.c vxlan_setup.c vxlan.c
-
-# Build using pkg-config variables if possible
-ifneq ($(shell pkg-config --exists libdpdk && echo 0),0)
-$(error "no installation of DPDK found")
-endif
-
-all: shared
-.PHONY: shared static
-shared: build/$(APP)-shared
-       ln -sf $(APP)-shared build/$(APP)
-static: build/$(APP)-static
-       ln -sf $(APP)-static build/$(APP)
-
-LDFLAGS += -pthread
-
-PKGCONF ?= pkg-config
-
-PC_FILE := $(shell $(PKGCONF) --path libdpdk 2>/dev/null)
-CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
-LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
-LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
-
-CFLAGS += -Wno-deprecated-declarations
-
-build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
-       $(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
-
-build/$(APP)-static: $(SRCS-y) Makefile $(PC_FILE) | build
-       $(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_STATIC)
-
-build:
-       @mkdir -p $@
-
-.PHONY: clean
-clean:
-       rm -f build/$(APP) build/$(APP)-static build/$(APP)-shared
-       test -d build && rmdir -p build || true
diff --git a/examples/tep_termination/main.c b/examples/tep_termination/main.c
deleted file mode 100644
index 232ed59b6..000000000
--- a/examples/tep_termination/main.c
+++ /dev/null
@@ -1,1235 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2015 Intel Corporation
- */
-
-#include <arpa/inet.h>
-#include <getopt.h>
-#include <linux/if_ether.h>
-#include <linux/if_vlan.h>
-#include <linux/virtio_net.h>
-#include <linux/virtio_ring.h>
-#include <signal.h>
-#include <stdint.h>
-#include <sys/eventfd.h>
-#include <sys/param.h>
-#include <unistd.h>
-
-#include <rte_atomic.h>
-#include <rte_cycles.h>
-#include <rte_ethdev.h>
-#include <rte_log.h>
-#include <rte_string_fns.h>
-#include <rte_malloc.h>
-#include <rte_vhost.h>
-#include <rte_pause.h>
-
-#include "main.h"
-#include "vxlan.h"
-#include "vxlan_setup.h"
-
-/* the maximum number of external ports supported */
-#define MAX_SUP_PORTS 1
-
-/**
- * Calculate the number of buffers needed per port
- */
-#define NUM_MBUFS_PER_PORT ((MAX_QUEUES * RTE_TEST_RX_DESC_DEFAULT) +\
-                               (nb_switching_cores * MAX_PKT_BURST) +\
-                               (nb_switching_cores * \
-                               RTE_TEST_TX_DESC_DEFAULT) +\
-                               (nb_switching_cores * MBUF_CACHE_SIZE))
-
-#define MBUF_CACHE_SIZE 128
-#define MBUF_DATA_SIZE RTE_MBUF_DEFAULT_BUF_SIZE
-
-#define MAX_PKT_BURST 32       /* Max burst size for RX/TX */
-#define BURST_TX_DRAIN_US 100  /* TX drain every ~100us */
-
-/* Defines how long we wait between retries on RX */
-#define BURST_RX_WAIT_US 15
-
-#define BURST_RX_RETRIES 4     /* Number of retries on RX. */
-
-#define JUMBO_FRAME_MAX_SIZE    0x2600
-
-/* Config_core_flag status definitions. */
-#define REQUEST_DEV_REMOVAL 1
-#define ACK_DEV_REMOVAL     0
-
-/* Configurable number of RX/TX ring descriptors */
-#define RTE_TEST_RX_DESC_DEFAULT 1024
-#define RTE_TEST_TX_DESC_DEFAULT 512
-
-/* Get first 4 bytes in mbuf headroom. */
-#define MBUF_HEADROOM_UINT32(mbuf) (*(uint32_t *)((uint8_t *)(mbuf) \
-               + sizeof(struct rte_mbuf)))
-
-#define INVALID_PORT_ID 0xFFFF
-
-/* Maximum character device basename size. */
-#define MAX_BASENAME_SZ 20
-
-/* Maximum long option length for option parsing. */
-#define MAX_LONG_OPT_SZ 64
-
-/* Used to compare MAC addresses. */
-#define MAC_ADDR_CMP 0xFFFFFFFFFFFFULL
-
-#define CMD_LINE_OPT_NB_DEVICES "nb-devices"
-#define CMD_LINE_OPT_UDP_PORT "udp-port"
-#define CMD_LINE_OPT_TX_CHECKSUM "tx-checksum"
-#define CMD_LINE_OPT_TSO_SEGSZ "tso-segsz"
-#define CMD_LINE_OPT_FILTER_TYPE "filter-type"
-#define CMD_LINE_OPT_ENCAP "encap"
-#define CMD_LINE_OPT_DECAP "decap"
-#define CMD_LINE_OPT_RX_RETRY "rx-retry"
-#define CMD_LINE_OPT_RX_RETRY_DELAY "rx-retry-delay"
-#define CMD_LINE_OPT_RX_RETRY_NUM "rx-retry-num"
-#define CMD_LINE_OPT_STATS "stats"
-#define CMD_LINE_OPT_DEV_BASENAME "dev-basename"
-
-/* mask of enabled ports */
-static uint32_t enabled_port_mask;
-
-/*Number of switching cores enabled*/
-static uint32_t nb_switching_cores;
-
-/* number of devices/queues to support*/
-uint16_t nb_devices = 2;
-
-/* max ring descriptor, ixgbe, i40e, e1000 all are 4096. */
-#define MAX_RING_DESC 4096
-
-struct vpool {
-       struct rte_mempool *pool;
-       struct rte_ring *ring;
-       uint32_t buf_size;
-} vpool_array[MAX_QUEUES+MAX_QUEUES];
-
-/* UDP tunneling port */
-uint16_t udp_port = 4789;
-
-/* enable/disable inner TX checksum */
-uint8_t tx_checksum = 0;
-
-/* TCP segment size */
-uint16_t tso_segsz = 0;
-
-/* enable/disable decapsulation */
-uint8_t rx_decap = 1;
-
-/* enable/disable encapsulation */
-uint8_t tx_encap = 1;
-
-/* RX filter type for tunneling packet */
-uint8_t filter_idx = 1;
-
-/* overlay packet operation */
-struct ol_switch_ops overlay_options = {
-       .port_configure = vxlan_port_init,
-       .tunnel_setup = vxlan_link,
-       .tunnel_destroy = vxlan_unlink,
-       .tx_handle = vxlan_tx_pkts,
-       .rx_handle = vxlan_rx_pkts,
-       .param_handle = NULL,
-};
-
-/* Enable stats. */
-uint32_t enable_stats = 0;
-/* Enable retries on RX. */
-static uint32_t enable_retry = 1;
-/* Specify timeout (in useconds) between retries on RX. */
-static uint32_t burst_rx_delay_time = BURST_RX_WAIT_US;
-/* Specify the number of retries on RX. */
-static uint32_t burst_rx_retry_num = BURST_RX_RETRIES;
-
-/* Character device basename. Can be set by user. */
-static char dev_basename[MAX_BASENAME_SZ] = "vhost-net";
-
-static unsigned lcore_ids[RTE_MAX_LCORE];
-uint16_t ports[RTE_MAX_ETHPORTS];
-
-static unsigned nb_ports; /**< The number of ports specified in command line */
-
-/* ethernet addresses of ports */
-struct rte_ether_addr ports_eth_addr[RTE_MAX_ETHPORTS];
-
-/* heads for the main used and free linked lists for the data path. */
-static struct virtio_net_data_ll *ll_root_used;
-static struct virtio_net_data_ll *ll_root_free;
-
-/**
- * Array of data core structures containing information on
- * individual core linked lists.
- */
-static struct lcore_info lcore_info[RTE_MAX_LCORE];
-
-/* Used for queueing bursts of TX packets. */
-struct mbuf_table {
-       unsigned len;
-       unsigned txq_id;
-       struct rte_mbuf *m_table[MAX_PKT_BURST];
-};
-
-/* TX queue for each data core. */
-struct mbuf_table lcore_tx_queue[RTE_MAX_LCORE];
-
-struct device_statistics dev_statistics[MAX_DEVICES];
-
-/**
- * Set character device basename.
- */
-static int
-us_vhost_parse_basename(const char *q_arg)
-{
-       /* parse number string */
-       if (strlen(q_arg) >= MAX_BASENAME_SZ)
-               return -1;
-       else
-               strlcpy((char *)&dev_basename, q_arg, MAX_BASENAME_SZ);
-
-       return 0;
-}
-
-/**
- * Parse the portmask provided at run time.
- */
-static int
-parse_portmask(const char *portmask)
-{
-       char *end = NULL;
-       unsigned long pm;
-
-       /* parse hexadecimal string */
-       pm = strtoul(portmask, &end, 16);
-       if ((portmask[0] == '\0') || (end == NULL) || (*end != '\0'))
-               return 0;
-
-       return pm;
-}
-
-/**
- * Parse num options at run time.
- */
-static int
-parse_num_opt(const char *q_arg, uint32_t max_valid_value)
-{
-       char *end = NULL;
-       unsigned long num;
-
-       /* parse unsigned int string */
-       num = strtoul(q_arg, &end, 10);
-       if ((q_arg[0] == '\0') || (end == NULL) || (*end != '\0'))
-               return -1;
-
-       if (num > max_valid_value)
-               return -1;
-
-       return num;
-}
-
-/**
- * Display usage
- */
-static void
-tep_termination_usage(const char *prgname)
-{
-       RTE_LOG(INFO, VHOST_CONFIG, "%s [EAL options] -- -p PORTMASK\n"
-       "               --udp-port: UDP destination port for VXLAN packet\n"
-       "               --nb-devices[1-64]: The number of virtIO device\n"
-       "               --tx-checksum [0|1]: inner Tx checksum offload\n"
-       "               --tso-segsz [0-N]: TCP segment size\n"
-       "               --decap [0|1]: tunneling packet decapsulation\n"
-       "               --encap [0|1]: tunneling packet encapsulation\n"
-       "               --filter-type[1-3]: filter type for tunneling packet\n"
-       "                   1: Inner MAC and tenent ID\n"
-       "                   2: Inner MAC and VLAN, and tenent ID\n"
-       "                   3: Outer MAC, Inner MAC and tenent ID\n"
-       "               -p PORTMASK: Set mask for ports to be used by 
application\n"
-       "               --rx-retry [0|1]: disable/enable(default) retries on 
rx."
-       "                Enable retry if destintation queue is full\n"
-       "               --rx-retry-delay [0-N]: timeout(in usecond) between 
retries on RX."
-       "                This makes effect only if retries on rx enabled\n"
-       "               --rx-retry-num [0-N]: the number of retries on rx."
-       "                This makes effect only if retries on rx enabled\n"
-       "               --stats [0-N]: 0: Disable stats, N: Time in seconds to 
print stats\n"
-       "               --dev-basename: The basename to be used for the 
character device.\n",
-              prgname);
-}
-
-/**
- * Parse the arguments given in the command line of the application.
- */
-static int
-tep_termination_parse_args(int argc, char **argv)
-{
-       int opt, ret;
-       int option_index;
-       unsigned i;
-       const char *prgname = argv[0];
-       static struct option long_option[] = {
-               {CMD_LINE_OPT_NB_DEVICES, required_argument, NULL, 0},
-               {CMD_LINE_OPT_UDP_PORT, required_argument, NULL, 0},
-               {CMD_LINE_OPT_TX_CHECKSUM, required_argument, NULL, 0},
-               {CMD_LINE_OPT_TSO_SEGSZ, required_argument, NULL, 0},
-               {CMD_LINE_OPT_DECAP, required_argument, NULL, 0},
-               {CMD_LINE_OPT_ENCAP, required_argument, NULL, 0},
-               {CMD_LINE_OPT_FILTER_TYPE, required_argument, NULL, 0},
-               {CMD_LINE_OPT_RX_RETRY, required_argument, NULL, 0},
-               {CMD_LINE_OPT_RX_RETRY_DELAY, required_argument, NULL, 0},
-               {CMD_LINE_OPT_RX_RETRY_NUM, required_argument, NULL, 0},
-               {CMD_LINE_OPT_STATS, required_argument, NULL, 0},
-               {CMD_LINE_OPT_DEV_BASENAME, required_argument, NULL, 0},
-               {NULL, 0, 0, 0},
-       };
-
-       /* Parse command line */
-       while ((opt = getopt_long(argc, argv, "p:",
-                       long_option, &option_index)) != EOF) {
-               switch (opt) {
-               /* Portmask */
-               case 'p':
-                       enabled_port_mask = parse_portmask(optarg);
-                       if (enabled_port_mask == 0) {
-                               RTE_LOG(INFO, VHOST_CONFIG,
-                                       "Invalid portmask\n");
-                               tep_termination_usage(prgname);
-                               return -1;
-                       }
-                       break;
-               case 0:
-                       if (!strncmp(long_option[option_index].name,
-                               CMD_LINE_OPT_NB_DEVICES,
-                               sizeof(CMD_LINE_OPT_NB_DEVICES))) {
-                               ret = parse_num_opt(optarg, MAX_DEVICES);
-                               if (ret == -1) {
-                                       RTE_LOG(INFO, VHOST_CONFIG,
-                                       "Invalid argument for nb-devices 
[0-%d]\n",
-                                       MAX_DEVICES);
-                                       tep_termination_usage(prgname);
-                                       return -1;
-                               } else
-                                       nb_devices = ret;
-                       }
-
-                       /* Enable/disable retries on RX. */
-                       if (!strncmp(long_option[option_index].name,
-                               CMD_LINE_OPT_RX_RETRY,
-                               sizeof(CMD_LINE_OPT_RX_RETRY))) {
-                               ret = parse_num_opt(optarg, 1);
-                               if (ret == -1) {
-                                       RTE_LOG(INFO, VHOST_CONFIG,
-                                               "Invalid argument for rx-retry 
[0|1]\n");
-                                       tep_termination_usage(prgname);
-                                       return -1;
-                               } else
-                                       enable_retry = ret;
-                       }
-
-                       if (!strncmp(long_option[option_index].name,
-                               CMD_LINE_OPT_TSO_SEGSZ,
-                               sizeof(CMD_LINE_OPT_TSO_SEGSZ))) {
-                               ret = parse_num_opt(optarg, INT16_MAX);
-                               if (ret == -1) {
-                                       RTE_LOG(INFO, VHOST_CONFIG,
-                                               "Invalid argument for TCP 
segment size [0-N]\n");
-                                       tep_termination_usage(prgname);
-                                       return -1;
-                               } else
-                                       tso_segsz = ret;
-                       }
-
-                       if (!strncmp(long_option[option_index].name,
-                                       CMD_LINE_OPT_UDP_PORT,
-                                       sizeof(CMD_LINE_OPT_UDP_PORT))) {
-                               ret = parse_num_opt(optarg, INT16_MAX);
-                               if (ret == -1) {
-                                       RTE_LOG(INFO, VHOST_CONFIG,
-                                               "Invalid argument for UDP port 
[0-N]\n");
-                                       tep_termination_usage(prgname);
-                                       return -1;
-                               } else
-                                       udp_port = ret;
-                       }
-
-                       /* Specify the retries delay time (in useconds) on RX.*/
-                       if (!strncmp(long_option[option_index].name,
-                               CMD_LINE_OPT_RX_RETRY_DELAY,
-                               sizeof(CMD_LINE_OPT_RX_RETRY_DELAY))) {
-                               ret = parse_num_opt(optarg, INT32_MAX);
-                               if (ret == -1) {
-                                       RTE_LOG(INFO, VHOST_CONFIG,
-                                               "Invalid argument for 
rx-retry-delay [0-N]\n");
-                                       tep_termination_usage(prgname);
-                                       return -1;
-                               } else
-                                       burst_rx_delay_time = ret;
-                       }
-
-                       /* Specify the retries number on RX. */
-                       if (!strncmp(long_option[option_index].name,
-                               CMD_LINE_OPT_RX_RETRY_NUM,
-                               sizeof(CMD_LINE_OPT_RX_RETRY_NUM))) {
-                               ret = parse_num_opt(optarg, INT32_MAX);
-                               if (ret == -1) {
-                                       RTE_LOG(INFO, VHOST_CONFIG,
-                                               "Invalid argument for 
rx-retry-num [0-N]\n");
-                                       tep_termination_usage(prgname);
-                                       return -1;
-                               } else
-                                       burst_rx_retry_num = ret;
-                       }
-
-                       if (!strncmp(long_option[option_index].name,
-                               CMD_LINE_OPT_TX_CHECKSUM,
-                               sizeof(CMD_LINE_OPT_TX_CHECKSUM))) {
-                               ret = parse_num_opt(optarg, 1);
-                               if (ret == -1) {
-                                       RTE_LOG(INFO, VHOST_CONFIG,
-                                               "Invalid argument for 
tx-checksum [0|1]\n");
-                                       tep_termination_usage(prgname);
-                                       return -1;
-                               } else
-                                       tx_checksum = ret;
-                       }
-
-                       if (!strncmp(long_option[option_index].name,
-                                       CMD_LINE_OPT_FILTER_TYPE,
-                                       sizeof(CMD_LINE_OPT_FILTER_TYPE))) {
-                               ret = parse_num_opt(optarg, 3);
-                               if ((ret == -1) || (ret == 0)) {
-                                       RTE_LOG(INFO, VHOST_CONFIG,
-                                               "Invalid argument for filter 
type [1-3]\n");
-                                       tep_termination_usage(prgname);
-                                       return -1;
-                               } else
-                                       filter_idx = ret - 1;
-                       }
-
-                       /* Enable/disable encapsulation on RX. */
-                       if (!strncmp(long_option[option_index].name,
-                               CMD_LINE_OPT_DECAP,
-                               sizeof(CMD_LINE_OPT_DECAP))) {
-                               ret = parse_num_opt(optarg, 1);
-                               if (ret == -1) {
-                                       RTE_LOG(INFO, VHOST_CONFIG,
-                                               "Invalid argument for decap 
[0|1]\n");
-                                       tep_termination_usage(prgname);
-                                       return -1;
-                               } else
-                                       rx_decap = ret;
-                       }
-
-                       /* Enable/disable encapsulation on TX. */
-                       if (!strncmp(long_option[option_index].name,
-                               CMD_LINE_OPT_ENCAP,
-                               sizeof(CMD_LINE_OPT_ENCAP))) {
-                               ret = parse_num_opt(optarg, 1);
-                               if (ret == -1) {
-                                       RTE_LOG(INFO, VHOST_CONFIG,
-                                               "Invalid argument for encap 
[0|1]\n");
-                                       tep_termination_usage(prgname);
-                                       return -1;
-                               } else
-                                       tx_encap = ret;
-                       }
-
-                       /* Enable/disable stats. */
-                       if (!strncmp(long_option[option_index].name,
-                               CMD_LINE_OPT_STATS,
-                               sizeof(CMD_LINE_OPT_STATS))) {
-                               ret = parse_num_opt(optarg, INT32_MAX);
-                               if (ret == -1) {
-                                       RTE_LOG(INFO, VHOST_CONFIG,
-                                                       "Invalid argument for 
stats [0..N]\n");
-                                       tep_termination_usage(prgname);
-                                       return -1;
-                               } else
-                                       enable_stats = ret;
-                       }
-
-                       /* Set character device basename. */
-                       if (!strncmp(long_option[option_index].name,
-                               CMD_LINE_OPT_DEV_BASENAME,
-                               sizeof(CMD_LINE_OPT_DEV_BASENAME))) {
-                               if (us_vhost_parse_basename(optarg) == -1) {
-                                       RTE_LOG(INFO, VHOST_CONFIG,
-                                               "Invalid argument for character 
"
-                                               "device basename (Max %d 
characters)\n",
-                                               MAX_BASENAME_SZ);
-                                       tep_termination_usage(prgname);
-                                       return -1;
-                               }
-                       }
-
-                       break;
-
-                       /* Invalid option - print options. */
-               default:
-                       tep_termination_usage(prgname);
-                       return -1;
-               }
-       }
-
-       for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
-               if (enabled_port_mask & (1 << i))
-                       ports[nb_ports++] = (uint8_t)i;
-       }
-
-       if ((nb_ports ==  0) || (nb_ports > MAX_SUP_PORTS)) {
-               RTE_LOG(INFO, VHOST_PORT, "Current enabled port number is %u,"
-                       "but only %u port can be enabled\n", nb_ports,
-                       MAX_SUP_PORTS);
-               return -1;
-       }
-
-       return 0;
-}
-
-/**
- * Update the global var NB_PORTS and array PORTS
- * according to system ports number and return valid ports number
- */
-static unsigned
-check_ports_num(unsigned max_nb_ports)
-{
-       unsigned valid_nb_ports = nb_ports;
-       unsigned portid;
-
-       if (nb_ports > max_nb_ports) {
-               RTE_LOG(INFO, VHOST_PORT, "\nSpecified port number(%u) "
-                       " exceeds total system port number(%u)\n",
-                       nb_ports, max_nb_ports);
-               nb_ports = max_nb_ports;
-       }
-
-       for (portid = 0; portid < nb_ports; portid++) {
-               if (!rte_eth_dev_is_valid_port(ports[portid])) {
-                       RTE_LOG(INFO, VHOST_PORT,
-                               "\nSpecified port ID(%u) is not valid\n",
-                               ports[portid]);
-                       ports[portid] = INVALID_PORT_ID;
-                       valid_nb_ports--;
-               }
-       }
-       return valid_nb_ports;
-}
-
-/**
- * This function routes the TX packet to the correct interface. This may be a 
local device
- * or the physical port.
- */
-static __rte_always_inline void
-virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m)
-{
-       struct mbuf_table *tx_q;
-       struct rte_mbuf **m_table;
-       unsigned len, ret = 0;
-       const uint16_t lcore_id = rte_lcore_id();
-
-       RTE_LOG_DP(DEBUG, VHOST_DATA, "(%d) TX: MAC address is external\n",
-               vdev->vid);
-
-       /* Add packet to the port tx queue */
-       tx_q = &lcore_tx_queue[lcore_id];
-       len = tx_q->len;
-
-       tx_q->m_table[len] = m;
-       len++;
-       if (enable_stats) {
-               dev_statistics[vdev->vid].tx_total++;
-               dev_statistics[vdev->vid].tx++;
-       }
-
-       if (unlikely(len == MAX_PKT_BURST)) {
-               m_table = (struct rte_mbuf **)tx_q->m_table;
-               ret = overlay_options.tx_handle(ports[0],
-                       (uint16_t)tx_q->txq_id, m_table,
-                       (uint16_t)tx_q->len);
-
-               /* Free any buffers not handled by TX and update
-                * the port stats.
-                */
-               if (unlikely(ret < len)) {
-                       do {
-                               rte_pktmbuf_free(m_table[ret]);
-                       } while (++ret < len);
-               }
-
-               len = 0;
-       }
-
-       tx_q->len = len;
-       return;
-}
-
-/**
- * This function is called by each data core. It handles all
- * RX/TX registered with the core. For TX the specific lcore
- * linked list is used. For RX, MAC addresses are compared
- * with all devices in the main linked list.
- */
-static int
-switch_worker(__rte_unused void *arg)
-{
-       struct rte_mempool *mbuf_pool = arg;
-       struct vhost_dev *vdev = NULL;
-       struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
-       struct virtio_net_data_ll *dev_ll;
-       struct mbuf_table *tx_q;
-       volatile struct lcore_ll_info *lcore_ll;
-       const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1)
-                                       / US_PER_S * BURST_TX_DRAIN_US;
-       uint64_t prev_tsc, diff_tsc, cur_tsc, ret_count = 0;
-       unsigned i, ret = 0;
-       const uint16_t lcore_id = rte_lcore_id();
-       const uint16_t num_cores = (uint16_t)rte_lcore_count();
-       uint16_t rx_count = 0;
-       uint16_t tx_count;
-       uint32_t retry = 0;
-
-       RTE_LOG(INFO, VHOST_DATA, "Procesing on Core %u started\n", lcore_id);
-       lcore_ll = lcore_info[lcore_id].lcore_ll;
-       prev_tsc = 0;
-
-       tx_q = &lcore_tx_queue[lcore_id];
-       for (i = 0; i < num_cores; i++) {
-               if (lcore_ids[i] == lcore_id) {
-                       tx_q->txq_id = i;
-                       break;
-               }
-       }
-
-       while (1) {
-               cur_tsc = rte_rdtsc();
-               /*
-                * TX burst queue drain
-                */
-               diff_tsc = cur_tsc - prev_tsc;
-               if (unlikely(diff_tsc > drain_tsc)) {
-
-                       if (tx_q->len) {
-                               RTE_LOG_DP(DEBUG, VHOST_DATA, "TX queue drained 
after "
-                                       "timeout with burst size %u\n",
-                                       tx_q->len);
-                               ret = overlay_options.tx_handle(ports[0],
-                                       (uint16_t)tx_q->txq_id,
-                                       (struct rte_mbuf **)tx_q->m_table,
-                                       (uint16_t)tx_q->len);
-                               if (unlikely(ret < tx_q->len)) {
-                                       do {
-                                               
rte_pktmbuf_free(tx_q->m_table[ret]);
-                                       } while (++ret < tx_q->len);
-                               }
-
-                               tx_q->len = 0;
-                       }
-
-                       prev_tsc = cur_tsc;
-
-               }
-
-               rte_prefetch0(lcore_ll->ll_root_used);
-
-               /**
-                * Inform the configuration core that we have exited
-                * the linked list and that no devices are
-                * in use if requested.
-                */
-               if (lcore_ll->dev_removal_flag == REQUEST_DEV_REMOVAL)
-                       lcore_ll->dev_removal_flag = ACK_DEV_REMOVAL;
-
-               /*
-                * Process devices
-                */
-               dev_ll = lcore_ll->ll_root_used;
-
-               while (dev_ll != NULL) {
-                       vdev = dev_ll->vdev;
-
-                       if (unlikely(vdev->remove)) {
-                               dev_ll = dev_ll->next;
-                               overlay_options.tunnel_destroy(vdev);
-                               vdev->ready = DEVICE_SAFE_REMOVE;
-                               continue;
-                       }
-                       if (likely(vdev->ready == DEVICE_RX)) {
-                               /* Handle guest RX */
-                               rx_count = rte_eth_rx_burst(ports[0],
-                                       vdev->rx_q, pkts_burst, MAX_PKT_BURST);
-
-                               if (rx_count) {
-                                       /*
-                                       * Retry is enabled and the queue is
-                                       * full then we wait and retry to
-                                       * avoid packet loss. Here MAX_PKT_BURST
-                                       * must be less than virtio queue size
-                                       */
-                                       if (enable_retry && unlikely(rx_count >
-                                               
rte_vhost_avail_entries(vdev->vid, VIRTIO_RXQ))) {
-                                               for (retry = 0; retry < 
burst_rx_retry_num;
-                                                       retry++) {
-                                                       
rte_delay_us(burst_rx_delay_time);
-                                                       if (rx_count <= 
rte_vhost_avail_entries(vdev->vid, VIRTIO_RXQ))
-                                                               break;
-                                               }
-                                       }
-
-                                       ret_count = 
overlay_options.rx_handle(vdev->vid, pkts_burst, rx_count);
-                                       if (enable_stats) {
-                                               rte_atomic64_add(
-                                               
&dev_statistics[vdev->vid].rx_total_atomic,
-                                               rx_count);
-                                               rte_atomic64_add(
-                                               
&dev_statistics[vdev->vid].rx_atomic, ret_count);
-                                       }
-                                       while (likely(rx_count)) {
-                                               rx_count--;
-                                               
rte_pktmbuf_free(pkts_burst[rx_count]);
-                                       }
-
-                               }
-                       }
-
-                       if (likely(!vdev->remove)) {
-                               /* Handle guest TX*/
-                               tx_count = rte_vhost_dequeue_burst(vdev->vid,
-                                               VIRTIO_TXQ, mbuf_pool,
-                                               pkts_burst, MAX_PKT_BURST);
-                               /* If this is the first received packet we need 
to learn the MAC */
-                               if (unlikely(vdev->ready == 
DEVICE_MAC_LEARNING) && tx_count) {
-                                       if (vdev->remove ||
-                                               
(overlay_options.tunnel_setup(vdev, pkts_burst[0]) == -1)) {
-                                               while (tx_count)
-                                                       
rte_pktmbuf_free(pkts_burst[--tx_count]);
-                                       }
-                               }
-                               while (tx_count)
-                                       virtio_tx_route(vdev, 
pkts_burst[--tx_count]);
-                       }
-
-                       /* move to the next device in the list */
-                       dev_ll = dev_ll->next;
-               }
-       }
-
-       return 0;
-}
-
-/**
- * Add an entry to a used linked list. A free entry must first be found
- * in the free linked list using get_data_ll_free_entry();
- */
-static void
-add_data_ll_entry(struct virtio_net_data_ll **ll_root_addr,
-       struct virtio_net_data_ll *ll_dev)
-{
-       struct virtio_net_data_ll *ll = *ll_root_addr;
-
-       /* Set next as NULL and use a compiler barrier to avoid reordering. */
-       ll_dev->next = NULL;
-       rte_compiler_barrier();
-
-       /* If ll == NULL then this is the first device. */
-       if (ll) {
-               /* Increment to the tail of the linked list. */
-               while (ll->next != NULL)
-                       ll = ll->next;
-
-               ll->next = ll_dev;
-       } else {
-               *ll_root_addr = ll_dev;
-       }
-}
-
-/**
- * Remove an entry from a used linked list. The entry must then be added to
- * the free linked list using put_data_ll_free_entry().
- */
-static void
-rm_data_ll_entry(struct virtio_net_data_ll **ll_root_addr,
-       struct virtio_net_data_ll *ll_dev,
-       struct virtio_net_data_ll *ll_dev_last)
-{
-       struct virtio_net_data_ll *ll = *ll_root_addr;
-
-       if (unlikely((ll == NULL) || (ll_dev == NULL)))
-               return;
-
-       if (ll_dev == ll)
-               *ll_root_addr = ll_dev->next;
-       else
-               if (likely(ll_dev_last != NULL))
-                       ll_dev_last->next = ll_dev->next;
-               else
-                       RTE_LOG(ERR, VHOST_CONFIG,
-                               "Remove entry form ll failed.\n");
-}
-
-/**
- * Find and return an entry from the free linked list.
- */
-static struct virtio_net_data_ll *
-get_data_ll_free_entry(struct virtio_net_data_ll **ll_root_addr)
-{
-       struct virtio_net_data_ll *ll_free = *ll_root_addr;
-       struct virtio_net_data_ll *ll_dev;
-
-       if (ll_free == NULL)
-               return NULL;
-
-       ll_dev = ll_free;
-       *ll_root_addr = ll_free->next;
-
-       return ll_dev;
-}
-
-/**
- * Place an entry back on to the free linked list.
- */
-static void
-put_data_ll_free_entry(struct virtio_net_data_ll **ll_root_addr,
-       struct virtio_net_data_ll *ll_dev)
-{
-       struct virtio_net_data_ll *ll_free = *ll_root_addr;
-
-       if (ll_dev == NULL)
-               return;
-
-       ll_dev->next = ll_free;
-       *ll_root_addr = ll_dev;
-}
-
-/**
- * Creates a linked list of a given size.
- */
-static struct virtio_net_data_ll *
-alloc_data_ll(uint32_t size)
-{
-       struct virtio_net_data_ll *ll_new;
-       uint32_t i;
-
-       /* Malloc and then chain the linked list. */
-       ll_new = malloc(size * sizeof(struct virtio_net_data_ll));
-       if (ll_new == NULL) {
-               RTE_LOG(ERR, VHOST_CONFIG,
-                       "Failed to allocate memory for ll_new.\n");
-               return NULL;
-       }
-
-       for (i = 0; i < size - 1; i++) {
-               ll_new[i].vdev = NULL;
-               ll_new[i].next = &ll_new[i+1];
-       }
-       ll_new[i].next = NULL;
-
-       return ll_new;
-}
-
-/**
- * Create the main linked list along with each individual cores
- * linked list. A used and a free list are created to manage entries.
- */
-static int
-init_data_ll(void)
-{
-       int lcore;
-
-       RTE_LCORE_FOREACH_SLAVE(lcore) {
-               lcore_info[lcore].lcore_ll =
-                       malloc(sizeof(struct lcore_ll_info));
-               if (lcore_info[lcore].lcore_ll == NULL) {
-                       RTE_LOG(ERR, VHOST_CONFIG,
-                               "Failed to allocate memory for lcore_ll.\n");
-                       return -1;
-               }
-
-               lcore_info[lcore].lcore_ll->device_num = 0;
-               lcore_info[lcore].lcore_ll->dev_removal_flag = ACK_DEV_REMOVAL;
-               lcore_info[lcore].lcore_ll->ll_root_used = NULL;
-               if (nb_devices % nb_switching_cores)
-                       lcore_info[lcore].lcore_ll->ll_root_free =
-                               alloc_data_ll((nb_devices / nb_switching_cores)
-                                               + 1);
-               else
-                       lcore_info[lcore].lcore_ll->ll_root_free =
-                               alloc_data_ll(nb_devices / nb_switching_cores);
-       }
-
-       /* Allocate devices up to a maximum of MAX_DEVICES. */
-       ll_root_free = alloc_data_ll(MIN((nb_devices), MAX_DEVICES));
-
-       return 0;
-}
-
-/**
- * Remove a device from the specific data core linked list and
- * from the main linked list. Synchonization occurs through the use
- * of the lcore dev_removal_flag.
- */
-static void
-destroy_device(int vid)
-{
-       struct virtio_net_data_ll *ll_lcore_dev_cur;
-       struct virtio_net_data_ll *ll_main_dev_cur;
-       struct virtio_net_data_ll *ll_lcore_dev_last = NULL;
-       struct virtio_net_data_ll *ll_main_dev_last = NULL;
-       struct vhost_dev *vdev = NULL;
-       int lcore;
-
-       ll_main_dev_cur = ll_root_used;
-       while (ll_main_dev_cur != NULL) {
-               if (ll_main_dev_cur->vdev->vid == vid) {
-                       vdev = ll_main_dev_cur->vdev;
-                       break;
-               }
-       }
-       if (!vdev)
-               return;
-
-       /* set the remove flag. */
-       vdev->remove = 1;
-       while (vdev->ready != DEVICE_SAFE_REMOVE)
-               rte_pause();
-
-       /* Search for entry to be removed from lcore ll */
-       ll_lcore_dev_cur = lcore_info[vdev->coreid].lcore_ll->ll_root_used;
-       while (ll_lcore_dev_cur != NULL) {
-               if (ll_lcore_dev_cur->vdev == vdev) {
-                       break;
-               } else {
-                       ll_lcore_dev_last = ll_lcore_dev_cur;
-                       ll_lcore_dev_cur = ll_lcore_dev_cur->next;
-               }
-       }
-
-       if (ll_lcore_dev_cur == NULL) {
-               RTE_LOG(ERR, VHOST_CONFIG,
-                       "(%d) Failed to find the dev to be destroy.\n", vid);
-               return;
-       }
-
-       /* Search for entry to be removed from main ll */
-       ll_main_dev_cur = ll_root_used;
-       ll_main_dev_last = NULL;
-       while (ll_main_dev_cur != NULL) {
-               if (ll_main_dev_cur->vdev == vdev) {
-                       break;
-               } else {
-                       ll_main_dev_last = ll_main_dev_cur;
-                       ll_main_dev_cur = ll_main_dev_cur->next;
-               }
-       }
-
-       /* Remove entries from the lcore and main ll. */
-       rm_data_ll_entry(&lcore_info[vdev->coreid].lcore_ll->ll_root_used,
-                       ll_lcore_dev_cur, ll_lcore_dev_last);
-       rm_data_ll_entry(&ll_root_used, ll_main_dev_cur, ll_main_dev_last);
-
-       /* Set the dev_removal_flag on each lcore. */
-       RTE_LCORE_FOREACH_SLAVE(lcore) {
-               lcore_info[lcore].lcore_ll->dev_removal_flag =
-                       REQUEST_DEV_REMOVAL;
-       }
-
-       /*
-        * Once each core has set the dev_removal_flag to
-        * ACK_DEV_REMOVAL we can be sure that they can no longer access
-        * the device removed from the linked lists and that the devices
-        * are no longer in use.
-        */
-       RTE_LCORE_FOREACH_SLAVE(lcore) {
-               while (lcore_info[lcore].lcore_ll->dev_removal_flag
-                       != ACK_DEV_REMOVAL)
-                       rte_pause();
-       }
-
-       /* Add the entries back to the lcore and main free ll.*/
-       put_data_ll_free_entry(&lcore_info[vdev->coreid].lcore_ll->ll_root_free,
-                               ll_lcore_dev_cur);
-       put_data_ll_free_entry(&ll_root_free, ll_main_dev_cur);
-
-       /* Decrement number of device on the lcore. */
-       lcore_info[vdev->coreid].lcore_ll->device_num--;
-
-       RTE_LOG(INFO, VHOST_DATA, "(%d) Device has been removed "
-               "from data core\n", vid);
-
-       rte_free(vdev);
-
-}
-
-/**
- * A new device is added to a data core. First the device is added
- * to the main linked list and the allocated to a specific data core.
- */
-static int
-new_device(int vid)
-{
-       struct virtio_net_data_ll *ll_dev;
-       int lcore, core_add = 0;
-       uint32_t device_num_min = nb_devices;
-       struct vhost_dev *vdev;
-
-       vdev = rte_zmalloc("vhost device", sizeof(*vdev), RTE_CACHE_LINE_SIZE);
-       if (vdev == NULL) {
-               RTE_LOG(INFO, VHOST_DATA,
-                       "(%d) Couldn't allocate memory for vhost dev\n", vid);
-               return -1;
-       }
-       vdev->vid = vid;
-       /* Add device to main ll */
-       ll_dev = get_data_ll_free_entry(&ll_root_free);
-       if (ll_dev == NULL) {
-               RTE_LOG(INFO, VHOST_DATA, "(%d) No free entry found in"
-                       " linked list Device limit of %d devices per core"
-                       " has been reached\n", vid, nb_devices);
-               if (vdev->regions_hpa)
-                       rte_free(vdev->regions_hpa);
-               rte_free(vdev);
-               return -1;
-       }
-       ll_dev->vdev = vdev;
-       add_data_ll_entry(&ll_root_used, ll_dev);
-       vdev->rx_q = vid;
-
-       /* reset ready flag */
-       vdev->ready = DEVICE_MAC_LEARNING;
-       vdev->remove = 0;
-
-       /* Find a suitable lcore to add the device. */
-       RTE_LCORE_FOREACH_SLAVE(lcore) {
-               if (lcore_info[lcore].lcore_ll->device_num < device_num_min) {
-                       device_num_min = lcore_info[lcore].lcore_ll->device_num;
-                       core_add = lcore;
-               }
-       }
-       /* Add device to lcore ll */
-       ll_dev = 
get_data_ll_free_entry(&lcore_info[core_add].lcore_ll->ll_root_free);
-       if (ll_dev == NULL) {
-               RTE_LOG(INFO, VHOST_DATA,
-                       "(%d) Failed to add device to data core\n",
-                       vid);
-               vdev->ready = DEVICE_SAFE_REMOVE;
-               destroy_device(vid);
-               rte_free(vdev->regions_hpa);
-               rte_free(vdev);
-               return -1;
-       }
-       ll_dev->vdev = vdev;
-       vdev->coreid = core_add;
-
-       add_data_ll_entry(&lcore_info[vdev->coreid].lcore_ll->ll_root_used,
-                       ll_dev);
-
-       /* Initialize device stats */
-       memset(&dev_statistics[vid], 0,
-               sizeof(struct device_statistics));
-
-       /* Disable notifications. */
-       rte_vhost_enable_guest_notification(vid, VIRTIO_RXQ, 0);
-       rte_vhost_enable_guest_notification(vid, VIRTIO_TXQ, 0);
-       lcore_info[vdev->coreid].lcore_ll->device_num++;
-
-       RTE_LOG(INFO, VHOST_DATA, "(%d) Device has been added to data core 
%d\n",
-               vid, vdev->coreid);
-
-       return 0;
-}
-
-/**
- * These callback allow devices to be added to the data core when configuration
- * has been fully complete.
- */
-static const struct vhost_device_ops virtio_net_device_ops = {
-       .new_device =  new_device,
-       .destroy_device = destroy_device,
-};
-
-/**
- * This is a thread will wake up after a period to print stats if the user has
- * enabled them.
- */
-static void *
-print_stats(__rte_unused void *arg)
-{
-       struct virtio_net_data_ll *dev_ll;
-       uint64_t tx_dropped, rx_dropped;
-       uint64_t tx, tx_total, rx, rx_total, rx_ip_csum, rx_l4_csum;
-       int vid;
-       const char clr[] = { 27, '[', '2', 'J', '\0' };
-       const char top_left[] = { 27, '[', '1', ';', '1', 'H', '\0' };
-
-       while (1) {
-               sleep(enable_stats);
-
-               /* Clear screen and move to top left */
-               printf("%s%s", clr, top_left);
-
-               printf("\nDevice statistics ================================");
-
-               dev_ll = ll_root_used;
-               while (dev_ll != NULL) {
-                       vid = dev_ll->vdev->vid;
-                       tx_total = dev_statistics[vid].tx_total;
-                       tx = dev_statistics[vid].tx;
-                       tx_dropped = tx_total - tx;
-
-                       rx_total = rte_atomic64_read(
-                               &dev_statistics[vid].rx_total_atomic);
-                       rx = rte_atomic64_read(
-                               &dev_statistics[vid].rx_atomic);
-                       rx_dropped = rx_total - rx;
-                       rx_ip_csum = rte_atomic64_read(
-                               &dev_statistics[vid].rx_bad_ip_csum);
-                       rx_l4_csum = rte_atomic64_read(
-                               &dev_statistics[vid].rx_bad_l4_csum);
-
-                       printf("\nStatistics for device %d ----------"
-                                       "\nTX total:            %"PRIu64""
-                                       "\nTX dropped:          %"PRIu64""
-                                       "\nTX successful:               
%"PRIu64""
-                                       "\nRX total:            %"PRIu64""
-                                       "\nRX bad IP csum:      %"PRIu64""
-                                       "\nRX bad L4 csum:      %"PRIu64""
-                                       "\nRX dropped:          %"PRIu64""
-                                       "\nRX successful:               
%"PRIu64"",
-                                       vid,
-                                       tx_total,
-                                       tx_dropped,
-                                       tx,
-                                       rx_total,
-                                       rx_ip_csum,
-                                       rx_l4_csum,
-                                       rx_dropped,
-                                       rx);
-
-                       dev_ll = dev_ll->next;
-               }
-               printf("\n================================================\n");
-
-               fflush(stdout);
-       }
-
-       return NULL;
-}
-
-/**
- * Main function, does initialisation and calls the per-lcore functions.
- */
-int
-main(int argc, char *argv[])
-{
-       struct rte_mempool *mbuf_pool = NULL;
-       unsigned lcore_id, core_id = 0;
-       unsigned nb_ports, valid_nb_ports;
-       int ret;
-       uint16_t portid;
-       uint16_t queue_id;
-       static pthread_t tid;
-
-       /* init EAL */
-       ret = rte_eal_init(argc, argv);
-       if (ret < 0)
-               rte_exit(EXIT_FAILURE, "Error with EAL initialization\n");
-       argc -= ret;
-       argv += ret;
-
-       /* parse app arguments */
-       ret = tep_termination_parse_args(argc, argv);
-       if (ret < 0)
-               rte_exit(EXIT_FAILURE, "Invalid argument\n");
-
-       for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++)
-               if (rte_lcore_is_enabled(lcore_id))
-                       lcore_ids[core_id++] = lcore_id;
-
-       /* set the number of swithcing cores available */
-       nb_switching_cores = rte_lcore_count()-1;
-
-       /* Get the number of physical ports. */
-       nb_ports = rte_eth_dev_count_avail();
-
-       /*
-        * Update the global var NB_PORTS and global array PORTS
-        * and get value of var VALID_NB_PORTS according to system ports number
-        */
-       valid_nb_ports = check_ports_num(nb_ports);
-
-       if ((valid_nb_ports == 0) || (valid_nb_ports > MAX_SUP_PORTS)) {
-               rte_exit(EXIT_FAILURE, "Current enabled port number is %u,"
-                       "but only %u port can be enabled\n", nb_ports,
-                       MAX_SUP_PORTS);
-       }
-       /* Create the mbuf pool. */
-       mbuf_pool = rte_pktmbuf_pool_create(
-                       "MBUF_POOL",
-                       NUM_MBUFS_PER_PORT * valid_nb_ports,
-                       MBUF_CACHE_SIZE,
-                       0,
-                       MBUF_DATA_SIZE,
-                       rte_socket_id());
-       if (mbuf_pool == NULL)
-               rte_exit(EXIT_FAILURE, "Cannot create mbuf pool\n");
-
-       for (queue_id = 0; queue_id < MAX_QUEUES + 1; queue_id++)
-               vpool_array[queue_id].pool = mbuf_pool;
-
-       /* initialize all ports */
-       RTE_ETH_FOREACH_DEV(portid) {
-               /* skip ports that are not enabled */
-               if ((enabled_port_mask & (1 << portid)) == 0) {
-                       RTE_LOG(INFO, VHOST_PORT,
-                               "Skipping disabled port %d\n", portid);
-                       continue;
-               }
-               if (overlay_options.port_configure(portid, mbuf_pool) != 0)
-                       rte_exit(EXIT_FAILURE,
-                               "Cannot initialize network ports\n");
-       }
-
-       /* Initialise all linked lists. */
-       if (init_data_ll() == -1)
-               rte_exit(EXIT_FAILURE, "Failed to initialize linked list\n");
-
-       /* Initialize device stats */
-       memset(&dev_statistics, 0, sizeof(dev_statistics));
-
-       /* Enable stats if the user option is set. */
-       if (enable_stats) {
-               ret = rte_ctrl_thread_create(&tid, "print-stats", NULL,
-                                       print_stats, NULL);
-               if (ret < 0)
-                       rte_exit(EXIT_FAILURE, "Cannot create print-stats 
thread\n");
-       }
-
-       /* Launch all data cores. */
-       RTE_LCORE_FOREACH_SLAVE(lcore_id) {
-               rte_eal_remote_launch(switch_worker,
-                       mbuf_pool, lcore_id);
-       }
-
-       ret = rte_vhost_driver_register((char *)&dev_basename, 0);
-       if (ret != 0)
-               rte_exit(EXIT_FAILURE, "failed to register vhost driver.\n");
-
-       rte_vhost_driver_disable_features(dev_basename,
-               1ULL << VIRTIO_NET_F_MRG_RXBUF);
-
-       ret = rte_vhost_driver_callback_register(dev_basename,
-               &virtio_net_device_ops);
-       if (ret != 0) {
-               rte_exit(EXIT_FAILURE,
-                       "failed to register vhost driver callbacks.\n");
-       }
-
-       if (rte_vhost_driver_start(dev_basename) < 0) {
-               rte_exit(EXIT_FAILURE,
-                       "failed to start vhost driver.\n");
-       }
-
-       RTE_LCORE_FOREACH_SLAVE(lcore_id)
-               rte_eal_wait_lcore(lcore_id);
-
-       return 0;
-}
diff --git a/examples/tep_termination/main.h b/examples/tep_termination/main.h
deleted file mode 100644
index 7a70f7396..000000000
--- a/examples/tep_termination/main.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2015 Intel Corporation
- */
-
-#ifndef _MAIN_H_
-#define _MAIN_H_
-
-#include <rte_ether.h>
-
-/* Macros for printing using RTE_LOG */
-#define RTE_LOGTYPE_VHOST_CONFIG RTE_LOGTYPE_USER1
-#define RTE_LOGTYPE_VHOST_DATA   RTE_LOGTYPE_USER2
-#define RTE_LOGTYPE_VHOST_PORT   RTE_LOGTYPE_USER3
-
-/* State of virtio device. */
-#define DEVICE_MAC_LEARNING    0
-#define DEVICE_RX              1
-#define DEVICE_SAFE_REMOVE     2
-
-#define MAX_QUEUES 512
-
-/* Max burst size for RX/TX */
-#define MAX_PKT_BURST 32
-
-/* Max number of devices. Limited by the application. */
-#define MAX_DEVICES 64
-
-enum {VIRTIO_RXQ, VIRTIO_TXQ, VIRTIO_QNUM};
-
-/* Per-device statistics struct */
-struct device_statistics {
-       uint64_t tx_total;
-       rte_atomic64_t rx_total_atomic;
-       uint64_t rx_total;
-       uint64_t tx;
-       rte_atomic64_t rx_atomic;
-       /**< Bad inner IP csum for tunneling pkt */
-       rte_atomic64_t rx_bad_ip_csum;
-       /**< Bad inner L4 csum for tunneling pkt */
-       rte_atomic64_t rx_bad_l4_csum;
-} __rte_cache_aligned;
-
-/**
- * Device linked list structure for data path.
- */
-struct vhost_dev {
-       int vid;
-       /**< Number of memory regions for gpa to hpa translation. */
-       uint32_t nregions_hpa;
-       /**< Memory region information for gpa to hpa translation. */
-       struct virtio_memory_regions_hpa *regions_hpa;
-       /**< Device MAC address (Obtained on first TX packet). */
-       struct rte_ether_addr mac_address;
-       /**< RX queue number. */
-       uint16_t rx_q;
-       /**< Data core that the device is added to. */
-       uint16_t coreid;
-       /**< A device is set as ready if the MAC address has been set. */
-       volatile uint8_t ready;
-       /**< Device is marked for removal from the data core. */
-       volatile uint8_t remove;
-} __rte_cache_aligned;
-
-/**
- * Structure containing data core specific information.
- */
-struct lcore_ll_info {
-       /**< Pointer to head in free linked list. */
-       struct virtio_net_data_ll *ll_root_free;
-       /**< Pointer to head of used linked list. */
-       struct virtio_net_data_ll *ll_root_used;
-       /**< Number of devices on lcore. */
-       uint32_t device_num;
-       /**< Flag to synchronize device removal. */
-       volatile uint8_t dev_removal_flag;
-};
-
-struct lcore_info {
-       /**< Pointer to data core specific lcore_ll_info struct */
-       struct lcore_ll_info    *lcore_ll;
-};
-
-struct virtio_net_data_ll {
-       /**< Pointer to device created by configuration core. */
-       struct vhost_dev            *vdev;
-       /**< Pointer to next device in linked list. */
-       struct virtio_net_data_ll   *next;
-};
-
-uint32_t
-virtio_dev_rx(int vid, struct rte_mbuf **pkts, uint32_t count);
-
-#endif /* _MAIN_H_ */
diff --git a/examples/tep_termination/meson.build 
b/examples/tep_termination/meson.build
deleted file mode 100644
index f65d68980..000000000
--- a/examples/tep_termination/meson.build
+++ /dev/null
@@ -1,16 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2017 Intel Corporation
-
-# meson file, for building this example as part of a main DPDK build.
-#
-# To build this example as a standalone application with an already-installed
-# DPDK instance, use 'make'
-
-if not is_linux
-       build = false
-endif
-deps += ['hash', 'vhost']
-cflags += '-Wno-deprecated-declarations'
-sources = files(
-       'main.c', 'vxlan.c', 'vxlan_setup.c'
-)
diff --git a/examples/tep_termination/vxlan.c b/examples/tep_termination/vxlan.c
deleted file mode 100644
index 0ba6b8be8..000000000
--- a/examples/tep_termination/vxlan.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2015 Intel Corporation
- */
-
-#include <stdint.h>
-#include <rte_mbuf.h>
-#include <rte_hash_crc.h>
-#include <rte_byteorder.h>
-#include <rte_udp.h>
-#include <rte_tcp.h>
-#include <rte_sctp.h>
-
-#include "main.h"
-#include "vxlan.h"
-
-static uint16_t
-get_psd_sum(void *l3_hdr, uint16_t ethertype, uint64_t ol_flags)
-{
-       if (ethertype == RTE_ETHER_TYPE_IPV4)
-               return rte_ipv4_phdr_cksum(l3_hdr, ol_flags);
-       else /* assume ethertype == RTE_ETHER_TYPE_IPV6 */
-               return rte_ipv6_phdr_cksum(l3_hdr, ol_flags);
-}
-
-/**
- * Parse an ethernet header to fill the ethertype, outer_l2_len, outer_l3_len 
and
- * ipproto. This function is able to recognize IPv4/IPv6 with one optional vlan
- * header.
- */
-static void
-parse_ethernet(struct rte_ether_hdr *eth_hdr, union tunnel_offload_info *info,
-               uint8_t *l4_proto)
-{
-       struct rte_ipv4_hdr *ipv4_hdr;
-       struct rte_ipv6_hdr *ipv6_hdr;
-       uint16_t ethertype;
-
-       info->outer_l2_len = sizeof(struct rte_ether_hdr);
-       ethertype = rte_be_to_cpu_16(eth_hdr->ether_type);
-
-       if (ethertype == RTE_ETHER_TYPE_VLAN) {
-               struct rte_vlan_hdr *vlan_hdr =
-                       (struct rte_vlan_hdr *)(eth_hdr + 1);
-               info->outer_l2_len  += sizeof(struct rte_vlan_hdr);
-               ethertype = rte_be_to_cpu_16(vlan_hdr->eth_proto);
-       }
-
-       switch (ethertype) {
-       case RTE_ETHER_TYPE_IPV4:
-               ipv4_hdr = (struct rte_ipv4_hdr *)
-                       ((char *)eth_hdr + info->outer_l2_len);
-               info->outer_l3_len = sizeof(struct rte_ipv4_hdr);
-               *l4_proto = ipv4_hdr->next_proto_id;
-               break;
-       case RTE_ETHER_TYPE_IPV6:
-               ipv6_hdr = (struct rte_ipv6_hdr *)
-                       ((char *)eth_hdr + info->outer_l2_len);
-               info->outer_l3_len = sizeof(struct rte_ipv6_hdr);
-               *l4_proto = ipv6_hdr->proto;
-               break;
-       default:
-               info->outer_l3_len = 0;
-               *l4_proto = 0;
-               break;
-       }
-}
-
-/**
- * Calculate the checksum of a packet in hardware
- */
-static uint64_t
-process_inner_cksums(struct rte_ether_hdr *eth_hdr,
-               union tunnel_offload_info *info)
-{
-       void *l3_hdr = NULL;
-       uint8_t l4_proto;
-       uint16_t ethertype;
-       struct rte_ipv4_hdr *ipv4_hdr;
-       struct rte_ipv6_hdr *ipv6_hdr;
-       struct rte_udp_hdr *udp_hdr;
-       struct rte_tcp_hdr *tcp_hdr;
-       struct rte_sctp_hdr *sctp_hdr;
-       uint64_t ol_flags = 0;
-
-       info->l2_len = sizeof(struct rte_ether_hdr);
-       ethertype = rte_be_to_cpu_16(eth_hdr->ether_type);
-
-       if (ethertype == RTE_ETHER_TYPE_VLAN) {
-               struct rte_vlan_hdr *vlan_hdr =
-                       (struct rte_vlan_hdr *)(eth_hdr + 1);
-               info->l2_len  += sizeof(struct rte_vlan_hdr);
-               ethertype = rte_be_to_cpu_16(vlan_hdr->eth_proto);
-       }
-
-       l3_hdr = (char *)eth_hdr + info->l2_len;
-
-       if (ethertype == RTE_ETHER_TYPE_IPV4) {
-               ipv4_hdr = (struct rte_ipv4_hdr *)l3_hdr;
-               ipv4_hdr->hdr_checksum = 0;
-               ol_flags |= PKT_TX_IPV4;
-               ol_flags |= PKT_TX_IP_CKSUM;
-               info->l3_len = sizeof(struct rte_ipv4_hdr);
-               l4_proto = ipv4_hdr->next_proto_id;
-       } else if (ethertype == RTE_ETHER_TYPE_IPV6) {
-               ipv6_hdr = (struct rte_ipv6_hdr *)l3_hdr;
-               info->l3_len = sizeof(struct rte_ipv6_hdr);
-               l4_proto = ipv6_hdr->proto;
-               ol_flags |= PKT_TX_IPV6;
-       } else
-               return 0; /* packet type not supported, nothing to do */
-
-       if (l4_proto == IPPROTO_UDP) {
-               udp_hdr = (struct rte_udp_hdr *)((char *)l3_hdr + info->l3_len);
-               ol_flags |= PKT_TX_UDP_CKSUM;
-               udp_hdr->dgram_cksum = get_psd_sum(l3_hdr,
-                               ethertype, ol_flags);
-       } else if (l4_proto == IPPROTO_TCP) {
-               tcp_hdr = (struct rte_tcp_hdr *)((char *)l3_hdr + info->l3_len);
-               /* Put PKT_TX_TCP_SEG bit setting before get_psd_sum(), because
-                * it depends on PKT_TX_TCP_SEG to calculate pseudo-header
-                * checksum.
-                */
-               if (tso_segsz != 0) {
-                       ol_flags |= PKT_TX_TCP_SEG;
-                       info->tso_segsz = tso_segsz;
-                       info->l4_len = (tcp_hdr->data_off & 0xf0) >> 2;
-               }
-               ol_flags |= PKT_TX_TCP_CKSUM;
-               tcp_hdr->cksum = get_psd_sum(l3_hdr, ethertype, ol_flags);
-
-       } else if (l4_proto == IPPROTO_SCTP) {
-               sctp_hdr = (struct rte_sctp_hdr *)
-                       ((char *)l3_hdr + info->l3_len);
-               sctp_hdr->cksum = 0;
-               ol_flags |= PKT_TX_SCTP_CKSUM;
-       }
-
-       return ol_flags;
-}
-
-int
-decapsulation(struct rte_mbuf *pkt)
-{
-       uint8_t l4_proto = 0;
-       uint16_t outer_header_len;
-       struct rte_udp_hdr *udp_hdr;
-       union tunnel_offload_info info = { .data = 0 };
-       struct rte_ether_hdr *phdr =
-               rte_pktmbuf_mtod(pkt, struct rte_ether_hdr *);
-
-       parse_ethernet(phdr, &info, &l4_proto);
-
-       if (l4_proto != IPPROTO_UDP)
-               return -1;
-
-       udp_hdr = (struct rte_udp_hdr *)((char *)phdr +
-               info.outer_l2_len + info.outer_l3_len);
-
-       /** check udp destination port, 4789 is the default vxlan port
-        * (rfc7348) or that the rx offload flag is set (i40e only
-        * currently)*/
-       if (udp_hdr->dst_port != rte_cpu_to_be_16(RTE_VXLAN_DEFAULT_PORT) &&
-               (pkt->packet_type & RTE_PTYPE_TUNNEL_MASK) == 0)
-               return -1;
-       outer_header_len = info.outer_l2_len + info.outer_l3_len
-               + sizeof(struct rte_udp_hdr) + sizeof(struct rte_vxlan_hdr);
-
-       rte_pktmbuf_adj(pkt, outer_header_len);
-
-       return 0;
-}
-
-void
-encapsulation(struct rte_mbuf *m, uint8_t queue_id)
-{
-       uint vport_id;
-       uint64_t ol_flags = 0;
-       uint32_t old_len = m->pkt_len, hash;
-       union tunnel_offload_info tx_offload = { .data = 0 };
-       struct rte_ether_hdr *phdr =
-               rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
-
-       /*Allocate space for new ethernet, IPv4, UDP and VXLAN headers*/
-       struct rte_ether_hdr *pneth =
-               (struct rte_ether_hdr *) rte_pktmbuf_prepend(m,
-               sizeof(struct rte_ether_hdr) + sizeof(struct rte_ipv4_hdr)
-               + sizeof(struct rte_udp_hdr) + sizeof(struct rte_vxlan_hdr));
-
-       struct rte_ipv4_hdr *ip = (struct rte_ipv4_hdr *) &pneth[1];
-       struct rte_udp_hdr *udp = (struct rte_udp_hdr *) &ip[1];
-       struct rte_vxlan_hdr *vxlan = (struct rte_vxlan_hdr *) &udp[1];
-
-       /* convert TX queue ID to vport ID */
-       vport_id = queue_id - 1;
-
-       /* replace original Ethernet header with ours */
-       pneth = rte_memcpy(pneth, &app_l2_hdr[vport_id],
-               sizeof(struct rte_ether_hdr));
-
-       /* copy in IP header */
-       ip = rte_memcpy(ip, &app_ip_hdr[vport_id],
-               sizeof(struct rte_ipv4_hdr));
-       ip->total_length = rte_cpu_to_be_16(m->pkt_len
-                               - sizeof(struct rte_ether_hdr));
-
-       /* outer IP checksum */
-       ol_flags |= PKT_TX_OUTER_IP_CKSUM;
-       ip->hdr_checksum = 0;
-
-       /* inner IP checksum offload */
-       if (tx_checksum) {
-               ol_flags |= process_inner_cksums(phdr, &tx_offload);
-               m->l2_len = tx_offload.l2_len;
-               m->l3_len = tx_offload.l3_len;
-               m->l4_len = tx_offload.l4_len;
-               m->l2_len += RTE_ETHER_VXLAN_HLEN;
-       }
-
-       m->outer_l2_len = sizeof(struct rte_ether_hdr);
-       m->outer_l3_len = sizeof(struct rte_ipv4_hdr);
-
-       ol_flags |= PKT_TX_TUNNEL_VXLAN;
-
-       m->ol_flags |= ol_flags;
-       m->tso_segsz = tx_offload.tso_segsz;
-
-       /*VXLAN HEADER*/
-       vxlan->vx_flags = rte_cpu_to_be_32(VXLAN_HF_VNI);
-       vxlan->vx_vni = rte_cpu_to_be_32(vxdev.out_key << 8);
-
-       /*UDP HEADER*/
-       udp->dgram_cksum = 0;
-       udp->dgram_len = rte_cpu_to_be_16(old_len
-                               + sizeof(struct rte_udp_hdr)
-                               + sizeof(struct rte_vxlan_hdr));
-
-       udp->dst_port = rte_cpu_to_be_16(vxdev.dst_port);
-       hash = rte_hash_crc(phdr, 2 * RTE_ETHER_ADDR_LEN, phdr->ether_type);
-       udp->src_port = rte_cpu_to_be_16((((uint64_t) hash * PORT_RANGE) >> 32)
-                                       + PORT_MIN);
-
-       return;
-}
diff --git a/examples/tep_termination/vxlan.h b/examples/tep_termination/vxlan.h
deleted file mode 100644
index 587fb9fe5..000000000
--- a/examples/tep_termination/vxlan.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2015 Intel Corporation
- */
-
-#ifndef _VXLAN_H_
-#define _VXLAN_H_
-
-#include <rte_ether.h>
-#include <rte_ip.h>
-#include <rte_vxlan.h>
-
-#define PORT_MIN       49152
-#define PORT_MAX       65535
-#define PORT_RANGE ((PORT_MAX - PORT_MIN) + 1)
-
-#define VXLAN_N_PORTS  2
-#define VXLAN_HF_VNI 0x08000000
-
-extern struct rte_ipv4_hdr app_ip_hdr[VXLAN_N_PORTS];
-extern struct rte_ether_hdr app_l2_hdr[VXLAN_N_PORTS];
-extern uint8_t tx_checksum;
-extern uint16_t tso_segsz;
-
-struct vxlan_port {
-       uint32_t vport_id;           /**< VirtIO port id */
-       uint32_t peer_ip;            /**< remote VTEP IP address */
-       struct rte_ether_addr peer_mac;  /**< remote VTEP MAC address */
-       struct rte_ether_addr vport_mac; /**< VirtIO port MAC address */
-} __rte_cache_aligned;
-
-struct vxlan_conf {
-       uint16_t dst_port;      /**< VXLAN UDP destination port */
-       uint32_t port_ip;       /**< DPDK port IP address*/
-       uint32_t in_key;        /**< VLAN  ID */
-       uint32_t out_key;       /**< VXLAN VNI */
-       struct vxlan_port port[VXLAN_N_PORTS]; /**< VXLAN configuration */
-} __rte_cache_aligned;
-
-extern struct vxlan_conf vxdev;
-
-/* structure that caches offload info for the current packet */
-union tunnel_offload_info {
-       uint64_t data;
-       struct {
-               uint64_t l2_len:7; /**< L2 (MAC) Header Length. */
-               uint64_t l3_len:9; /**< L3 (IP) Header Length. */
-               uint64_t l4_len:8; /**< L4 Header Length. */
-               uint64_t tso_segsz:16; /**< TCP TSO segment size */
-               uint64_t outer_l2_len:7; /**< outer L2 Header Length */
-               uint64_t outer_l3_len:16; /**< outer L3 Header Length */
-       };
-} __rte_cache_aligned;
-
-int decapsulation(struct rte_mbuf *pkt);
-void encapsulation(struct rte_mbuf *m, uint8_t queue_id);
-
-#endif /* _VXLAN_H_ */
diff --git a/examples/tep_termination/vxlan_setup.c 
b/examples/tep_termination/vxlan_setup.c
deleted file mode 100644
index 4b44ccc14..000000000
--- a/examples/tep_termination/vxlan_setup.c
+++ /dev/null
@@ -1,443 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2015 Intel Corporation
- */
-
-#include <getopt.h>
-#include <linux/if_ether.h>
-#include <linux/if_vlan.h>
-#include <linux/virtio_net.h>
-#include <linux/virtio_ring.h>
-#include <sys/param.h>
-#include <unistd.h>
-
-#include <rte_ethdev.h>
-#include <rte_log.h>
-#include <rte_string_fns.h>
-#include <rte_mbuf.h>
-#include <rte_malloc.h>
-#include <rte_ip.h>
-#include <rte_udp.h>
-#include <rte_tcp.h>
-
-#include "main.h"
-#include "rte_vhost.h"
-#include "vxlan.h"
-#include "vxlan_setup.h"
-
-#define IPV4_HEADER_LEN 20
-#define UDP_HEADER_LEN  8
-#define VXLAN_HEADER_LEN 8
-
-#define IP_DEFTTL  64   /* from RFC 1340. */
-
-#define IP_DN_FRAGMENT_FLAG 0x0040
-
-/* Used to compare MAC addresses. */
-#define MAC_ADDR_CMP 0xFFFFFFFFFFFFULL
-
-/* Configurable number of RX/TX ring descriptors */
-#define RTE_TEST_RX_DESC_DEFAULT 1024
-#define RTE_TEST_TX_DESC_DEFAULT 512
-
-/* Default inner VLAN ID */
-#define INNER_VLAN_ID 100
-
-/* VXLAN device */
-struct vxlan_conf vxdev;
-
-struct rte_ipv4_hdr app_ip_hdr[VXLAN_N_PORTS];
-struct rte_ether_hdr app_l2_hdr[VXLAN_N_PORTS];
-
-/* local VTEP IP address */
-uint8_t vxlan_multicast_ips[2][4] = { {239, 1, 1, 1 }, {239, 1, 2, 1 } };
-
-/* Remote VTEP IP address */
-uint8_t vxlan_overlay_ips[2][4] = { {192, 168, 10, 1}, {192, 168, 30, 1} };
-
-/* Remote VTEP MAC address */
-uint8_t peer_mac[6] = {0x00, 0x11, 0x01, 0x00, 0x00, 0x01};
-
-/* VXLAN RX filter type */
-uint8_t tep_filter_type[] = {RTE_TUNNEL_FILTER_IMAC_TENID,
-                       RTE_TUNNEL_FILTER_IMAC_IVLAN_TENID,
-                       RTE_TUNNEL_FILTER_OMAC_TENID_IMAC,};
-
-/* Options for configuring ethernet port */
-static struct rte_eth_conf port_conf = {
-       .rxmode = {
-               .split_hdr_size = 0,
-       },
-       .txmode = {
-               .mq_mode = ETH_MQ_TX_NONE,
-               .offloads = (DEV_TX_OFFLOAD_IPV4_CKSUM |
-                            DEV_TX_OFFLOAD_UDP_CKSUM |
-                            DEV_TX_OFFLOAD_TCP_CKSUM |
-                            DEV_TX_OFFLOAD_SCTP_CKSUM |
-                            DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM |
-                            DEV_TX_OFFLOAD_TCP_TSO |
-                            DEV_TX_OFFLOAD_MULTI_SEGS |
-                            DEV_TX_OFFLOAD_VXLAN_TNL_TSO),
-       },
-};
-
-/**
- * The one or two device(s) that belongs to the same tenant ID can
- * be assigned in a VM.
- */
-const uint16_t tenant_id_conf[] = {
-       1000, 1000, 1001, 1001, 1002, 1002, 1003, 1003,
-       1004, 1004, 1005, 1005, 1006, 1006, 1007, 1007,
-       1008, 1008, 1009, 1009, 1010, 1010, 1011, 1011,
-       1012, 1012, 1013, 1013, 1014, 1014, 1015, 1015,
-       1016, 1016, 1017, 1017, 1018, 1018, 1019, 1019,
-       1020, 1020, 1021, 1021, 1022, 1022, 1023, 1023,
-       1024, 1024, 1025, 1025, 1026, 1026, 1027, 1027,
-       1028, 1028, 1029, 1029, 1030, 1030, 1031, 1031,
-};
-
-/**
- * Initialises a given port using global settings and with the rx buffers
- * coming from the mbuf_pool passed as parameter
- */
-int
-vxlan_port_init(uint16_t port, struct rte_mempool *mbuf_pool)
-{
-       int retval;
-       uint16_t q;
-       struct rte_eth_dev_info dev_info;
-       uint16_t rx_rings, tx_rings = (uint16_t)rte_lcore_count();
-       uint16_t rx_ring_size = RTE_TEST_RX_DESC_DEFAULT;
-       uint16_t tx_ring_size = RTE_TEST_TX_DESC_DEFAULT;
-       struct rte_eth_udp_tunnel tunnel_udp;
-       struct rte_eth_rxconf *rxconf;
-       struct rte_eth_txconf *txconf;
-       struct vxlan_conf *pconf = &vxdev;
-       struct rte_eth_conf local_port_conf = port_conf;
-
-       pconf->dst_port = udp_port;
-
-       retval = rte_eth_dev_info_get(port, &dev_info);
-       if (retval != 0)
-               rte_exit(EXIT_FAILURE,
-                       "Error during getting device (port %u) info: %s\n",
-                       port, strerror(-retval));
-
-       if (dev_info.max_rx_queues > MAX_QUEUES) {
-               rte_exit(EXIT_FAILURE,
-                       "please define MAX_QUEUES no less than %u in %s\n",
-                       dev_info.max_rx_queues, __FILE__);
-       }
-
-       rxconf = &dev_info.default_rxconf;
-       txconf = &dev_info.default_txconf;
-
-       if (!rte_eth_dev_is_valid_port(port))
-               return -1;
-
-       rx_rings = nb_devices;
-       if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
-               local_port_conf.txmode.offloads |=
-                       DEV_TX_OFFLOAD_MBUF_FAST_FREE;
-       /* Configure ethernet device. */
-       retval = rte_eth_dev_configure(port, rx_rings, tx_rings,
-                                      &local_port_conf);
-       if (retval != 0)
-               return retval;
-
-       retval = rte_eth_dev_adjust_nb_rx_tx_desc(port, &rx_ring_size,
-                       &tx_ring_size);
-       if (retval != 0)
-               return retval;
-
-       /* Setup the queues. */
-       rxconf->offloads = local_port_conf.rxmode.offloads;
-       for (q = 0; q < rx_rings; q++) {
-               retval = rte_eth_rx_queue_setup(port, q, rx_ring_size,
-                                               rte_eth_dev_socket_id(port),
-                                               rxconf,
-                                               mbuf_pool);
-               if (retval < 0)
-                       return retval;
-       }
-       txconf->offloads = local_port_conf.txmode.offloads;
-       for (q = 0; q < tx_rings; q++) {
-               retval = rte_eth_tx_queue_setup(port, q, tx_ring_size,
-                                               rte_eth_dev_socket_id(port),
-                                               txconf);
-               if (retval < 0)
-                       return retval;
-       }
-
-       /* Start the device. */
-       retval  = rte_eth_dev_start(port);
-       if (retval < 0)
-               return retval;
-
-       /* Configure UDP port for UDP tunneling */
-       tunnel_udp.udp_port = udp_port;
-       tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN;
-       retval = rte_eth_dev_udp_tunnel_port_add(port, &tunnel_udp);
-       if (retval < 0)
-               return retval;
-       retval = rte_eth_macaddr_get(port, &ports_eth_addr[port]);
-       if (retval < 0)
-               return retval;
-
-       RTE_LOG(INFO, PORT, "Port %u MAC: %02"PRIx8" %02"PRIx8" %02"PRIx8
-                       " %02"PRIx8" %02"PRIx8" %02"PRIx8"\n",
-                       port,
-                       ports_eth_addr[port].addr_bytes[0],
-                       ports_eth_addr[port].addr_bytes[1],
-                       ports_eth_addr[port].addr_bytes[2],
-                       ports_eth_addr[port].addr_bytes[3],
-                       ports_eth_addr[port].addr_bytes[4],
-                       ports_eth_addr[port].addr_bytes[5]);
-
-       if (tso_segsz != 0) {
-               if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0)
-                       RTE_LOG(WARNING, PORT,
-                               "hardware TSO offload is not supported\n");
-       }
-       return 0;
-}
-
-static int
-vxlan_rx_process(struct rte_mbuf *pkt)
-{
-       int ret = 0;
-
-       if (rx_decap)
-               ret = decapsulation(pkt);
-
-       return ret;
-}
-
-static void
-vxlan_tx_process(uint8_t queue_id, struct rte_mbuf *pkt)
-{
-       if (tx_encap)
-               encapsulation(pkt, queue_id);
-
-       return;
-}
-
-/*
- * This function learns the MAC address of the device and set init
- * L2 header and L3 header info.
- */
-int
-vxlan_link(struct vhost_dev *vdev, struct rte_mbuf *m)
-{
-       int i, ret;
-       struct rte_ether_hdr *pkt_hdr;
-       uint64_t portid = vdev->vid;
-       struct rte_ipv4_hdr *ip;
-
-       struct rte_eth_tunnel_filter_conf tunnel_filter_conf;
-
-       if (unlikely(portid >= VXLAN_N_PORTS)) {
-               RTE_LOG(INFO, VHOST_DATA,
-                       "(%d) WARNING: Not configuring device,"
-                       "as already have %d ports for VXLAN.",
-                       vdev->vid, VXLAN_N_PORTS);
-               return -1;
-       }
-
-       /* Learn MAC address of guest device from packet */
-       pkt_hdr = rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
-       if (rte_is_same_ether_addr(&(pkt_hdr->s_addr), &vdev->mac_address)) {
-               RTE_LOG(INFO, VHOST_DATA,
-                       "(%d) WARNING: This device is using an existing"
-                       " MAC address and has not been registered.\n",
-                       vdev->vid);
-               return -1;
-       }
-
-       for (i = 0; i < RTE_ETHER_ADDR_LEN; i++) {
-               vdev->mac_address.addr_bytes[i] =
-                       vxdev.port[portid].vport_mac.addr_bytes[i] =
-                       pkt_hdr->s_addr.addr_bytes[i];
-               vxdev.port[portid].peer_mac.addr_bytes[i] = peer_mac[i];
-       }
-
-       memset(&tunnel_filter_conf, 0,
-               sizeof(struct rte_eth_tunnel_filter_conf));
-
-       rte_ether_addr_copy(&ports_eth_addr[0], &tunnel_filter_conf.outer_mac);
-       tunnel_filter_conf.filter_type = tep_filter_type[filter_idx];
-
-       /* inner MAC */
-       rte_ether_addr_copy(&vdev->mac_address, &tunnel_filter_conf.inner_mac);
-
-       tunnel_filter_conf.queue_id = vdev->rx_q;
-       tunnel_filter_conf.tenant_id = tenant_id_conf[vdev->rx_q];
-
-       if (tep_filter_type[filter_idx] == RTE_TUNNEL_FILTER_IMAC_IVLAN_TENID)
-               tunnel_filter_conf.inner_vlan = INNER_VLAN_ID;
-
-       tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_VXLAN;
-
-       ret = rte_eth_dev_filter_ctrl(ports[0],
-               RTE_ETH_FILTER_TUNNEL,
-               RTE_ETH_FILTER_ADD,
-               &tunnel_filter_conf);
-       if (ret) {
-               RTE_LOG(ERR, VHOST_DATA,
-                       "%d Failed to add device MAC address to cloud filter\n",
-               vdev->rx_q);
-               return -1;
-       }
-
-       /* Print out inner MAC and VNI info. */
-       RTE_LOG(INFO, VHOST_DATA,
-               "(%d) MAC_ADDRESS %02x:%02x:%02x:%02x:%02x:%02x and VNI %d 
registered\n",
-               vdev->rx_q,
-               vdev->mac_address.addr_bytes[0],
-               vdev->mac_address.addr_bytes[1],
-               vdev->mac_address.addr_bytes[2],
-               vdev->mac_address.addr_bytes[3],
-               vdev->mac_address.addr_bytes[4],
-               vdev->mac_address.addr_bytes[5],
-               tenant_id_conf[vdev->rx_q]);
-
-       vxdev.port[portid].vport_id = portid;
-
-       for (i = 0; i < 4; i++) {
-               /* Local VTEP IP */
-               vxdev.port_ip |= vxlan_multicast_ips[portid][i] << (8 * i);
-               /* Remote VTEP IP */
-               vxdev.port[portid].peer_ip |=
-                       vxlan_overlay_ips[portid][i] << (8 * i);
-       }
-
-       vxdev.out_key = tenant_id_conf[vdev->rx_q];
-       rte_ether_addr_copy(&vxdev.port[portid].peer_mac,
-                       &app_l2_hdr[portid].d_addr);
-       rte_ether_addr_copy(&ports_eth_addr[0],
-                       &app_l2_hdr[portid].s_addr);
-       app_l2_hdr[portid].ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
-
-       ip = &app_ip_hdr[portid];
-       ip->version_ihl = RTE_IPV4_VHL_DEF;
-       ip->type_of_service = 0;
-       ip->total_length = 0;
-       ip->packet_id = 0;
-       ip->fragment_offset = IP_DN_FRAGMENT_FLAG;
-       ip->time_to_live = IP_DEFTTL;
-       ip->next_proto_id = IPPROTO_UDP;
-       ip->hdr_checksum = 0;
-       ip->src_addr = vxdev.port_ip;
-       ip->dst_addr = vxdev.port[portid].peer_ip;
-
-       /* Set device as ready for RX. */
-       vdev->ready = DEVICE_RX;
-
-       return 0;
-}
-
-/**
- * Removes cloud filter. Ensures that nothing is adding buffers to the RX
- * queue before disabling RX on the device.
- */
-void
-vxlan_unlink(struct vhost_dev *vdev)
-{
-       unsigned i = 0, rx_count;
-       int ret;
-       struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
-       struct rte_eth_tunnel_filter_conf tunnel_filter_conf;
-
-       if (vdev->ready == DEVICE_RX) {
-               memset(&tunnel_filter_conf, 0,
-                       sizeof(struct rte_eth_tunnel_filter_conf));
-
-               rte_ether_addr_copy(&ports_eth_addr[0],
-                               &tunnel_filter_conf.outer_mac);
-               rte_ether_addr_copy(&vdev->mac_address,
-                               &tunnel_filter_conf.inner_mac);
-               tunnel_filter_conf.tenant_id = tenant_id_conf[vdev->rx_q];
-               tunnel_filter_conf.filter_type = tep_filter_type[filter_idx];
-
-               if (tep_filter_type[filter_idx] ==
-                       RTE_TUNNEL_FILTER_IMAC_IVLAN_TENID)
-                       tunnel_filter_conf.inner_vlan = INNER_VLAN_ID;
-
-               tunnel_filter_conf.queue_id = vdev->rx_q;
-               tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_VXLAN;
-
-               ret = rte_eth_dev_filter_ctrl(ports[0],
-                               RTE_ETH_FILTER_TUNNEL,
-                               RTE_ETH_FILTER_DELETE,
-                               &tunnel_filter_conf);
-               if (ret) {
-                       RTE_LOG(ERR, VHOST_DATA,
-                               "%d Failed to add device MAC address to cloud 
filter\n",
-                               vdev->rx_q);
-                       return;
-               }
-               for (i = 0; i < RTE_ETHER_ADDR_LEN; i++)
-                       vdev->mac_address.addr_bytes[i] = 0;
-
-               /* Clear out the receive buffers */
-               rx_count = rte_eth_rx_burst(ports[0],
-                               (uint16_t)vdev->rx_q,
-                               pkts_burst, MAX_PKT_BURST);
-
-               while (rx_count) {
-                       for (i = 0; i < rx_count; i++)
-                               rte_pktmbuf_free(pkts_burst[i]);
-
-                       rx_count = rte_eth_rx_burst(ports[0],
-                                       (uint16_t)vdev->rx_q,
-                                       pkts_burst, MAX_PKT_BURST);
-               }
-               vdev->ready = DEVICE_MAC_LEARNING;
-       }
-}
-
-/* Transmit packets after encapsulating */
-int
-vxlan_tx_pkts(uint16_t port_id, uint16_t queue_id,
-               struct rte_mbuf **tx_pkts, uint16_t nb_pkts) {
-       int ret = 0;
-       uint16_t i;
-
-       for (i = 0; i < nb_pkts; i++)
-               vxlan_tx_process(queue_id, tx_pkts[i]);
-
-       ret = rte_eth_tx_burst(port_id, queue_id, tx_pkts, nb_pkts);
-
-       return ret;
-}
-
-/* Check for decapsulation and pass packets directly to VIRTIO device */
-int
-vxlan_rx_pkts(int vid, struct rte_mbuf **pkts_burst, uint32_t rx_count)
-{
-       uint32_t i = 0;
-       uint32_t count = 0;
-       int ret;
-       struct rte_mbuf *pkts_valid[rx_count];
-
-       for (i = 0; i < rx_count; i++) {
-               if (enable_stats) {
-                       rte_atomic64_add(
-                               &dev_statistics[vid].rx_bad_ip_csum,
-                               (pkts_burst[i]->ol_flags & PKT_RX_IP_CKSUM_BAD)
-                               != 0);
-                       rte_atomic64_add(
-                               &dev_statistics[vid].rx_bad_ip_csum,
-                               (pkts_burst[i]->ol_flags & PKT_RX_L4_CKSUM_BAD)
-                               != 0);
-               }
-               ret = vxlan_rx_process(pkts_burst[i]);
-               if (unlikely(ret < 0))
-                       continue;
-
-               pkts_valid[count] = pkts_burst[i];
-                       count++;
-       }
-
-       ret = rte_vhost_enqueue_burst(vid, VIRTIO_RXQ, pkts_valid, count);
-       return ret;
-}
diff --git a/examples/tep_termination/vxlan_setup.h 
b/examples/tep_termination/vxlan_setup.h
deleted file mode 100644
index 4dc37d673..000000000
--- a/examples/tep_termination/vxlan_setup.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2015 Intel Corporation
- */
-
-#ifndef VXLAN_SETUP_H_
-#define VXLAN_SETUP_H_
-
-extern uint16_t nb_devices;
-extern uint16_t udp_port;
-extern uint8_t filter_idx;
-extern uint16_t ports[RTE_MAX_ETHPORTS];
-extern struct rte_ether_addr ports_eth_addr[RTE_MAX_ETHPORTS];
-extern uint32_t enable_stats;
-extern struct device_statistics dev_statistics[MAX_DEVICES];
-extern uint8_t rx_decap;
-extern uint8_t tx_encap;
-
-typedef int (*ol_port_configure_t)(uint16_t port,
-                                  struct rte_mempool *mbuf_pool);
-
-typedef int (*ol_tunnel_setup_t)(struct vhost_dev *vdev,
-                                struct rte_mbuf *m);
-
-typedef void (*ol_tunnel_destroy_t)(struct vhost_dev *vdev);
-
-typedef int (*ol_tx_handle_t)(uint16_t port_id, uint16_t queue_id,
-                             struct rte_mbuf **tx_pkts, uint16_t nb_pkts);
-
-typedef int (*ol_rx_handle_t)(int vid, struct rte_mbuf **pkts,
-                             uint32_t count);
-
-typedef int (*ol_param_handle)(int vid);
-
-struct ol_switch_ops {
-       ol_port_configure_t        port_configure;
-       ol_tunnel_setup_t          tunnel_setup;
-       ol_tunnel_destroy_t        tunnel_destroy;
-       ol_tx_handle_t             tx_handle;
-       ol_rx_handle_t             rx_handle;
-       ol_param_handle            param_handle;
-};
-
-int
-vxlan_port_init(uint16_t port, struct rte_mempool *mbuf_pool);
-
-int
-vxlan_link(struct vhost_dev *vdev, struct rte_mbuf *m);
-
-void
-vxlan_unlink(struct vhost_dev *vdev);
-
-int
-vxlan_tx_pkts(uint16_t port_id, uint16_t queue_id,
-                       struct rte_mbuf **tx_pkts, uint16_t nb_pkts);
-int
-vxlan_rx_pkts(int vid, struct rte_mbuf **pkts, uint32_t count);
-
-#endif /* VXLAN_SETUP_H_ */
-- 
2.17.1

Reply via email to