Start work on parser

This commit is contained in:
2026-08-13 08:35:49 -07:00
parent 82c05ac4dc
commit 2f2727777b
541 changed files with 184695 additions and 10058 deletions

55
docs/core/parser.md Normal file
View File

@@ -0,0 +1,55 @@
# Parser
The parser must parse the following packet:
EthernetII | IPv4 | UDP | WireGuard
From this packet type, we must parse the Following:
1. Dest Mac address
2. Source Mac Address
3. Ethertype
4. Source IP address
5. Destination IP address
6. Protocol
7. UDP Source port
8. UDP Destination Port
9. Wireguard Message Type
10. Wireguard Receiver Index
11. Wireguard Counter
These fields all go to metadata lookup to determine the destination and
operations to perform on the packet.
The parser works by analyzing the packet 32 bits at a time as it flows in.
It uses a state machine which keeps track of the position in the packet,
and based on what it sees it updates the fields. Here are the states:
| State | Desciption |
| -------- | -------- |
| ETH_1 | Upper 32 bits of Dest Mac |
| ETH_2 | Lower 16 bits of Dest Mac, Upper 16 bits of source mac |
| ETH_3 | Lower 32 bits of Source Mac |
| ETH_4_IP_1 | Ethertype and first 16 bits of IP. Version, IHL, DCSP, ECN |
| IP_2 | Total Length, Identification |
| IP_3 | Flags, Fragment Offset, TTL, Protocol |
| IP_4 | Header Checksum, upper 16 bits of source ip |
| IP_5 | lower 16 bits of source ip, upper 16 bits of dest ip |
| IP_6_UDP_1 | lower 16 bits of dest ip, UDP Source port |
| UDP_2 | Destination Port, Length |
| UDP_3_WG_1 | Checksum, Message Type |
| WG_2 | lower 16 bits of receiver index |
| WG_3 | upper 16 bits of receiver index, lower 16 bits of counter |
| WG_4 | middle 32 bits of counter |
| WG_5 | upper 16 bits of counter |
| IDLE | Do nothing until the packet ends |
As we parse, if we detect that the packet no longer follows the pattern, for example
if the protocol is not UDP or the Ethertype is not IPv4, then we set as many fields
as we parsed, for example if the protocol is TCP we would set the ethernet mac addresses,
the ethertype, ip addresses, and protcol, but the udp ports and wireguard ports would all
be 0. The outputs will either match the metadata rules or not, so we don't care in this
block.
The pattern specifically is IPv4 Ethertype (No VLAN), IHL 5 (No options), UDP protocol,
Wireguard dest port, and wireguard message type 4.

View File

@@ -1,92 +1,271 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.3.0 Chrome/140.0.7339.249 Electron/38.7.2 Safari/537.36" version="29.3.0">
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.3.0 Chrome/140.0.7339.249 Electron/38.7.2 Safari/537.36">
<diagram name="Page-1" id="72PB9eZoycvEeqRRA-Ze">
<mxGraphModel dx="786" dy="595" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<mxGraphModel dx="1284" dy="863" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="e5_vLxzb2aWtIEc7nj2M-17" edge="1" parent="1" source="e5_vLxzb2aWtIEc7nj2M-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" target="e5_vLxzb2aWtIEc7nj2M-15">
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-37" edge="1" parent="1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.875;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitPerimeter=0;">
<mxGeometry relative="1" as="geometry">
<mxPoint x="840" y="390" as="sourcePoint" />
<mxPoint x="960" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-42" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-37" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Post Crypto Data" vertex="1">
<mxGeometry relative="1" x="-0.158" y="1" as="geometry">
<mxPoint x="9" y="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-68" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.25;entryDx=0;entryDy=0;exitX=1;exitY=0.813;exitDx=0;exitDy=0;exitPerimeter=0;" target="7ZK-1vDvfmA7mbs2EBc0-36">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="encrypt datapath" vertex="1">
<mxGeometry height="40" width="200" x="320" y="220" as="geometry" />
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-69" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-68" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="tag" vertex="1">
<mxGeometry relative="1" x="-0.2276" y="-1" as="geometry">
<mxPoint x="14" y="-11" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-25" edge="1" parent="1" source="e5_vLxzb2aWtIEc7nj2M-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" target="e5_vLxzb2aWtIEc7nj2M-20">
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-77" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="7ZK-1vDvfmA7mbs2EBc0-74">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-2" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="decrypt datapath" vertex="1">
<mxGeometry height="40" width="200" x="320" y="300" as="geometry" />
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-78" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-77" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="tag" vertex="1">
<mxGeometry relative="1" x="-0.097" as="geometry">
<mxPoint x="39" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-3" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="S2M DMA" vertex="1">
<mxGeometry height="40" width="40" x="320" y="140" as="geometry" />
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-2" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="ChaCha20-Poly1305" vertex="1">
<mxGeometry height="160" width="160" x="680" y="240" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-4" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="M2S DMA" vertex="1">
<mxGeometry height="40" width="40" x="480" y="140" as="geometry" />
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-13" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.063;entryDx=0;entryDy=0;entryPerimeter=0;" target="7ZK-1vDvfmA7mbs2EBc0-2" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="560" y="250" as="sourcePoint" />
<mxPoint x="590" y="220" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-5" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="S2M DMA" vertex="1">
<mxGeometry height="40" width="40" x="480" y="380" as="geometry" />
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-15" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-13" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="key" vertex="1">
<mxGeometry relative="1" x="-0.5355" as="geometry">
<mxPoint x="12" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-24" edge="1" parent="1" source="e5_vLxzb2aWtIEc7nj2M-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" target="e5_vLxzb2aWtIEc7nj2M-20">
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-31" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="7ZK-1vDvfmA7mbs2EBc0-2">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="540.01" y="320.01" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-35" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-31" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="encrypt/decrypt" vertex="1">
<mxGeometry relative="1" x="0.1873" as="geometry">
<mxPoint y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-33" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="7ZK-1vDvfmA7mbs2EBc0-21">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-6" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="S2M DMA" vertex="1">
<mxGeometry height="40" width="40" x="320" y="380" as="geometry" />
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-34" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-33" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="decap_len" vertex="1">
<mxGeometry relative="1" x="0.3582" y="1" as="geometry">
<mxPoint x="-31" y="-14" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-18" edge="1" parent="1" source="e5_vLxzb2aWtIEc7nj2M-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="e5_vLxzb2aWtIEc7nj2M-3">
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-39" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" target="7ZK-1vDvfmA7mbs2EBc0-38">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-19" edge="1" parent="1" source="e5_vLxzb2aWtIEc7nj2M-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="e5_vLxzb2aWtIEc7nj2M-1">
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-62" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-39" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="tunnel index" vertex="1">
<mxGeometry relative="1" x="-0.1041" y="1" as="geometry">
<mxPoint x="191" y="11" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-64" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="7ZK-1vDvfmA7mbs2EBc0-44">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="560" y="210" />
<mxPoint x="840" y="210" />
<mxPoint x="840" y="180" />
<mxPoint x="1220" y="180" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-65" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-64" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="destination" vertex="1">
<mxGeometry relative="1" x="0.211" y="1" as="geometry">
<mxPoint x="48" y="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-14" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="Metadata Lookup" vertex="1">
<mxGeometry height="80" width="160" x="400" y="200" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-16" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.063;entryDx=0;entryDy=0;entryPerimeter=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="560" y="270" as="sourcePoint" />
<mxPoint x="680" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-17" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-16" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="counter" vertex="1">
<mxGeometry relative="1" x="-0.5355" as="geometry">
<mxPoint x="12" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-22" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.9;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitPerimeter=0;" target="7ZK-1vDvfmA7mbs2EBc0-21">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-14" parent="1" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=-90;" value="" vertex="1">
<mxGeometry height="40" width="120" x="200" y="180" as="geometry" />
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-23" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-22" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="data" vertex="1">
<mxGeometry relative="1" x="-0.2054" as="geometry">
<mxPoint x="8" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-32" edge="1" parent="1" source="e5_vLxzb2aWtIEc7nj2M-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="e5_vLxzb2aWtIEc7nj2M-30">
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-25" edge="1" parent="1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.625;entryDx=0;entryDy=0;entryPerimeter=0;">
<mxGeometry relative="1" as="geometry">
<mxPoint x="320" y="230" as="sourcePoint" />
<mxPoint x="400" y="230" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-26" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-25" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="source ip" vertex="1">
<mxGeometry relative="1" x="0.1137" as="geometry">
<mxPoint x="-5" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-75" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="7ZK-1vDvfmA7mbs2EBc0-74">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="300" y="350" />
<mxPoint x="300" y="460" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-76" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-75" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="tag" vertex="1">
<mxGeometry relative="1" x="-0.2126" as="geometry">
<mxPoint x="166" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-18" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="Parser" vertex="1">
<mxGeometry height="200" width="40" x="280" y="200" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-19" edge="1" parent="1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.2;exitDx=0;exitDy=0;exitPerimeter=0;">
<mxGeometry relative="1" as="geometry">
<mxPoint x="320" y="210" as="sourcePoint" />
<mxPoint x="400" y="210" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-20" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-19" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="dest ip" vertex="1">
<mxGeometry relative="1" x="0.0846" y="-1" as="geometry">
<mxPoint x="-3" y="-11" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-21" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="Decap" vertex="1">
<mxGeometry height="40" width="160" x="400" y="360" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-24" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.875;entryDx=0;entryDy=0;entryPerimeter=0;" target="7ZK-1vDvfmA7mbs2EBc0-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-15" parent="1" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=-90;flipV=1;legacyAnchorPoints=0;" value="" vertex="1">
<mxGeometry height="40" width="120" x="520" y="180" as="geometry" />
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-41" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-24" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Raw Data" vertex="1">
<mxGeometry relative="1" x="-0.2123" y="1" as="geometry">
<mxPoint x="3" y="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-16" edge="1" parent="1" source="e5_vLxzb2aWtIEc7nj2M-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" target="e5_vLxzb2aWtIEc7nj2M-15">
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-27" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.625;entryDx=0;entryDy=0;entryPerimeter=0;" target="7ZK-1vDvfmA7mbs2EBc0-14">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-29" edge="1" parent="1" source="e5_vLxzb2aWtIEc7nj2M-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="e5_vLxzb2aWtIEc7nj2M-28">
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-28" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-27" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="type" vertex="1">
<mxGeometry relative="1" x="0.2841" as="geometry">
<mxPoint x="-11" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-29" edge="1" parent="1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.875;entryDx=0;entryDy=0;entryPerimeter=0;" target="7ZK-1vDvfmA7mbs2EBc0-14">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="320" y="270" />
</Array>
<mxPoint x="320" y="270" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-30" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-29" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="counter" vertex="1">
<mxGeometry relative="1" x="-0.3376" as="geometry">
<mxPoint x="14" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-45" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="7ZK-1vDvfmA7mbs2EBc0-44">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-20" parent="1" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=-90;" value="" vertex="1">
<mxGeometry height="40" width="120" x="200" y="340" as="geometry" />
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-36" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="Encap" vertex="1">
<mxGeometry height="40" width="160" x="960" y="360" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-22" edge="1" parent="1" source="e5_vLxzb2aWtIEc7nj2M-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="e5_vLxzb2aWtIEc7nj2M-2">
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-40" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="7ZK-1vDvfmA7mbs2EBc0-36">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-23" edge="1" parent="1" source="e5_vLxzb2aWtIEc7nj2M-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="e5_vLxzb2aWtIEc7nj2M-5">
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-43" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-40" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="header/len" vertex="1">
<mxGeometry relative="1" x="-0.0722" y="2" as="geometry">
<mxPoint x="-32" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-38" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="Encap Header Lookup" vertex="1">
<mxGeometry height="80" width="160" x="960" y="200" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-47" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.9;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitPerimeter=0;" target="7ZK-1vDvfmA7mbs2EBc0-46">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-21" parent="1" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=-90;flipV=1;legacyAnchorPoints=0;" value="" vertex="1">
<mxGeometry height="40" width="120" x="520" y="340" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-26" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Downstream RX" vertex="1">
<mxGeometry height="80" width="80" x="120" y="160" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-27" edge="1" parent="1" source="e5_vLxzb2aWtIEc7nj2M-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.502;entryY=-0.037;entryDx=0;entryDy=0;entryPerimeter=0;" target="e5_vLxzb2aWtIEc7nj2M-14">
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-49" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="7ZK-1vDvfmA7mbs2EBc0-48">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-28" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Downstream TX" vertex="1">
<mxGeometry height="80" width="80" x="120" y="320" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-30" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Upstream TX" vertex="1">
<mxGeometry height="80" width="80" x="640" y="160" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-33" edge="1" parent="1" source="e5_vLxzb2aWtIEc7nj2M-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="e5_vLxzb2aWtIEc7nj2M-21">
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-52" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitPerimeter=0;" target="7ZK-1vDvfmA7mbs2EBc0-50">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-31" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Upstream RX" vertex="1">
<mxGeometry height="80" width="80" x="640" y="320" as="geometry" />
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-44" parent="1" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;shapeInside=1;fixedSize=1;rotation=-90;" value="" vertex="1">
<mxGeometry height="40" width="200" x="1120" y="280" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-35" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;dashed=1;" value="upstream path" vertex="1">
<mxGeometry height="160" width="400" x="220" y="120" as="geometry" />
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-46" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="CPU DMA" vertex="1">
<mxGeometry height="40" width="40" x="1280" y="200" as="geometry" />
</mxCell>
<mxCell id="e5_vLxzb2aWtIEc7nj2M-36" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;dashed=1;" value="downstream path" vertex="1">
<mxGeometry height="160" width="400" x="220" y="280" as="geometry" />
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-48" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Local Eth" vertex="1">
<mxGeometry height="40" width="40" x="1280" y="280" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-50" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Remote Eth" vertex="1">
<mxGeometry height="40" width="40" x="1280" y="360" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-53" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.9;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" target="7ZK-1vDvfmA7mbs2EBc0-56">
<mxGeometry relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-54" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-58" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" target="7ZK-1vDvfmA7mbs2EBc0-56">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-55" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-59" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.1;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" target="7ZK-1vDvfmA7mbs2EBc0-56">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-61" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="7ZK-1vDvfmA7mbs2EBc0-18">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-56" parent="1" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;shapeInside=1;fixedSize=1;rotation=-90;flipV=1;legacyAnchorPoints=0;" value="" vertex="1">
<mxGeometry height="40" width="200" x="120" y="280" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-57" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="CPU DMA" vertex="1">
<mxGeometry height="40" width="40" x="120" y="200" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-58" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Local Eth" vertex="1">
<mxGeometry height="40" width="40" x="120" y="280" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-59" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Remote Eth" vertex="1">
<mxGeometry height="40" width="40" x="120" y="360" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-66" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.563;entryDx=0;entryDy=0;entryPerimeter=0;" target="7ZK-1vDvfmA7mbs2EBc0-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-67" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-66" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="bypass" vertex="1">
<mxGeometry relative="1" x="0.3463" y="1" as="geometry">
<mxPoint y="11" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-79" edge="1" parent="1" source="7ZK-1vDvfmA7mbs2EBc0-74" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" target="7ZK-1vDvfmA7mbs2EBc0-36">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1040" y="460" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-80" connectable="0" parent="7ZK-1vDvfmA7mbs2EBc0-79" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="tag match" vertex="1">
<mxGeometry relative="1" x="-0.5624" as="geometry">
<mxPoint x="9" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="7ZK-1vDvfmA7mbs2EBc0-74" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="Tag Check" vertex="1">
<mxGeometry height="40" width="120" x="840" y="440" as="geometry" />
</mxCell>
</root>
</mxGraphModel>