README.md in packet_via_dmem-0.0.1 vs README.md in packet_via_dmem-0.0.2
- old
+ new
@@ -68,15 +68,59 @@
dmem = PacketViaDMEM.new
puts dmem.parse File.read(ARGF[0])
## Header format
-Potentially first is type
- * 00 ?? ?? ?? source ??
- * 10 ?? ?? ?? ?? ?? source ??
+### Received header
-Example receive headers, MX480
+ * First byte is type of header?
+ * 00 'lu packet' (i.e. whole packet was sent for lookup, i.e. small packet)
+ * 10 'lu packet head' (i.e. only head of packet was sent for lookup, i.e. large packet)
+
+ * Second and third byte appear to tell nothing about where packet came from,
+ but more when it came from. Timing? Counter? Randomness?
+
+ * Fourth byte is 0xf0 on MX80, tendency for last nibble to be 0. Perhaps src fabric stream?
+ * Fifth byte appears to be source port?
+
+ * Sixth byte is perhaps source NPU?
+
+ * 00 (22) (33) (44) \<src\> (66)
+ * 10 (22) (33) (44) \<si\> \<ze\> \<src\> (66)
+
+Example from MX960
+
+ 00 00 c0 30 80 08
+ 00 03 40 30 80 08
+ 00 03 c0 70 81 08
+ 00 06 c0 30 80 08
+ 00 07 c0 70 81 08
+ 00 0a 40 30 80 08
+ 00 01 c0 70 81 08
+ 00 02 40 70 81 08
+ 10 01 40 70 05 c0 81 08
+ 00 05 40 70 81 08
+ 00 08 c0 30 80 08
+ 00 0a c0 70 81 08
+ 10 0b 40 20 05 28 40 08
+ 00 0d c0 30 80 08
+ 10 00 c0 30 05 8c 80 08
+ 00 03 c0 30 80 08
+ 10 03 40 30 05 8c 80 08
+ 10 06 40 30 05 8c 80 08
+ 10 06 c0 30 05 f0 80 08
+ 00 07 40 70 81 08
+ 00 07 80 40 42 20
+ 00 09 00 98 42 20
+ 00 0a 00 48 42 20
+ 10 09 c0 30 05 8c 80 08
+ 00 02 40 70 81 08
+ 10 0b 80 48 05 ce 42 20
+ 10 01 c0 30 05 8c 80 08
+
+Example from MX480
+
00 0b 40 60 41 08
00 01 c0 70 81 08
00 02 40 70 81 08
00 02 c0 70 81 08
10 03 40 70 05 40 81 08
@@ -102,11 +146,12 @@
00 0b 47 f0 20 00
00 01 c0 70 81 08
00 02 40 60 41 08
00 07 c7 f0 b0 80
-Example receive headers, MX80
+Example from MX80
+
00 08 00 f0 81 08
10 08 80 f0 05 b4 81 08
10 09 00 f0 05 b4 81 08
10 09 80 f0 05 b4 81 08
00 0a 00 f0 92 08
@@ -120,20 +165,101 @@
10 06 80 f0 05 b4 81 08
00 07 00 f0 80 08
10 07 80 f0 05 b4 81 08
10 0b 00 f0 02 28 81 08
-TAZ-TBB-0(X vty)# show ixchip ifd
-
- IFD IFD IX WAN Ing Queue Egr Queue
- Index Name Id Port Rt/Ct/Be H/L
- ====== ========== ====== ====== ============== ======
- 148 ge-1/0/0 2 0 0/32/64 0/32
- 149 ge-1/0/1 2 1 1/33/65 1/33
- 166 ge-1/1/8 2 18 18/50/82 18/50
-
For this box, second to last byte, divmod 64, returns these ports, which are
correct port for source.
+ TAZ-TBB-0(X vty)# show ixchip ifd
+ IFD IFD IX WAN Ing Queue Egr Queue
+ Index Name Id Port Rt/Ct/Be H/L
+ ====== ========== ====== ====== ============== ======
+ 148 ge-1/0/0 2 0 0/32/64 0/32
+ 149 ge-1/0/1 2 1 1/33/65 1/33
+ 166 ge-1/1/8 2 18 18/50/82 18/50
+
+### Sent header
+I'm really not sure about sent headers, need more data to figure out what is
+our type. For all my examples, when we sent frame without L2 headers for
+fabric, it was MPLS, but almost certainly it can be IPv4, IPv6, ARP etc too.
+Need data to know which header tells that. So we are going to pop wrong amount
+of bytes in many sent cases.
+
+ * first byte is output
+ * 0x00 == to fabric
+ * 0x08 == to wan
+
+ * byte 6, 7, 9, 11 or 21 probably defines type (different if we sent layer2 to fabric or if we don't)
+
+Example from MX960
+
+ 00 bf e0 0d 71 f0 00 04 42 20 01 44 03 01 00 81 00 00 00 00 00 00 07 e9
+ 00 bf e0 0f 71 f0 00 09 42 20 01 44 03 01 01 21 00 00 00 00 00 00 16 65
+ 00 bf e0 14 11 f0 00 04 42 20 01 44 00 01 00 81 00 00 00 00 00 00 0b ad
+ 00 bf e0 03 71 f0 00 04 42 20 01 44 03 01 00 81 00 00 00 00 00 00 04 06
+ 00 bf e0 04 71 f0 00 00 42 20 01 44 03 01 00 01 00 00 00 00 00 00 24 42
+ 00 bf e0 0a 71 f0 00 04 42 20 01 44 03 01 00 81 00 00 00 00 00 00 18 a4
+ 00 a0 00 02 71 f0 00 04 42 20 01 44 03 01 00 81 00 00 00 00 00 00 0a 8f
+ 00 bf e0 11 11 f0 00 04 42 20 01 44 00 01 00 81 00 00 00 00 00 00 04 00
+ 00 bf e0 15 71 f0 00 04 42 20 01 44 03 01 00 81 00 00 00 00 00 00 1c 69
+ 00 bf e0 1b 11 f0 00 04 42 20 01 44 00 01 00 81 00 00 00 00 00 00 0b ad
+ 00 a0 00 16 71 f0 00 04 42 20 01 44 03 01 00 81 00 00 00 00 00 00 05 ec
+ 00 bf e0 07 11 f0 00 04 42 20 01 44 00 01 00 81 00 00 00 00 00 00 0b ad
+ 00 a0 00 01 11 f0 00 04 42 20 01 44 00 01 00 81 00 00 00 00 00 00 08 0a
+ 00 a0 00 06 11 f0 00 04 42 20 01 44 00 01 00 81 00 00 00 00 00 00 08 0a
+ 00 a0 00 0c 11 f0 00 04 42 20 01 44 00 01 00 81 00 00 00 00 00 00 08 0a
+ 00 a0 00 0d 71 f0 00 00 42 20 01 44 03 01 00 01 00 00 00 00 00 00 24 06
+ 08 bf e0 0f 70 00 00 08 b0 0e 80 03 0a
+ 00 bf e0 0e 11 f0 00 04 42 20 01 44 00 01 00 81 00 00 00 00 00 00 06 6b
+ 08 bf e0 12 10 00 00 08 b0 0e 80 03 0a
+ 08 bf e0 14 10 00 00 08 b0 0e 80 03 0a
+ 00 bf e0 04 71 f0 00 09 42 20 01 44 03 01 01 21 00 00 00 00 00 00 16 65
+
+Example from MX480
+
+ 00 bf e0 16 10 00 03 f9 20 00 20 03 02 b0 03 7a 00 0e 00 42 80 00 00 20 0e 00 00 10 00 0c 00 00 00
+ 00 bf e0 03 10 00 03 f8 20 40 20 00 20 10 03 7a 00 12 00 46 80 00 00 20 12 00 00 18 00 00 00 00 00
+ 00 bf e0 04 10 00 03 f8 20 40 20 00 20 10 03 7a 00 12 00 46 80 00 00 20 12 00 00 18 00 00 00 00 00
+ 08 bf e0 05 14 00 00 10 20 12 80 5a 28
+ 08 a0 00 06 14 00 00 10 b0 12 80 5a 28
+ 08 bf e0 07 14 00 00 10 20 12 80 5a 28
+ 08 bf e0 0c 14 00 00 10 b0 12 80 5a 28
+ 08 bf e0 0f 14 00 00 10 20 12 80 5a 28
+ 08 bf e0 10 14 00 00 0b 20 12 80 33 2a
+ 08 bf e0 12 14 00 00 0b 20 0e 80 33 2c
+ 08 bf e0 13 14 00 00 08 00 00 80 00 be
+ 08 bf e0 17 14 00 00 10 20 12 80 5a 28
+ 08 bf e0 01 14 00 00 10 b0 12 80 5a 28
+ 08 bf e0 02 14 00 00 08 00 00 80 00 be
+ 08 a0 00 09 14 00 00 10 a0 12 80 5a 28
+ 08 bf e0 0a 14 00 00 10 20 12 80 5a 28
+ 08 bf e0 0b 14 00 00 10 a0 12 80 5a 28
+ 08 bf e0 0d 14 00 00 0b 00 0e 80 33 2c
+ 08 bf e0 11 14 00 00 10 b0 12 80 5a 28
+ 08 bf e0 14 14 00 00 10 b0 12 80 5a 28
+ 08 bf e0 15 14 00 00 10 20 12 80 5a 28
+ 08 bf e0 16 14 00 00 0b 20 0e 80 33 2c
+
+Example from MX80
+
+ 08 bf e0 10 11 00 00 00 70 0e 80 0a 1e
+ 08 a0 00 11 11 00 00 00 70 0e 80 0a 1e
+ 08 a0 00 12 11 00 00 00 70 0e 80 0a 1e
+ 08 a0 00 13 11 00 00 00 10 0e 80 0a 1e
+ 08 bf e0 14 11 00 00 00 70 12 80 0a 1e
+ 08 a0 00 15 11 00 00 00 70 0e 80 0a 1e
+ 08 bf e0 08 11 00 00 00 70 0e 80 0a 1e
+ 08 a0 00 06 11 00 00 00 70 0e 80 0a 1e
+ 08 a0 00 09 11 00 00 00 70 0e 80 0a 1e
+ 08 a0 00 0a 11 00 00 00 70 0e 80 0a 1e
+ 08 a0 00 0b 11 00 00 00 70 0e 80 0a 1e
+ 08 bf e0 0c 11 00 00 00 70 0e 80 0a 1e
+ 08 a0 00 0d 11 00 00 00 70 0e 80 0a 1e
+ 08 bf e0 0e 71 00 00 08 10 0e 80 0a 32
+ 08 a0 00 0f 11 00 00 00 70 0e 80 0a 1e
+ 08 a0 00 16 11 00 00 00 70 0e 80 0a 1e
+
## Todo
- 1. correctly discover how many bytes need to be popped, perhaps by finding valid ethernet headers and ignore anything before?
- 1. reverse engineer header/cookie, at least figuring out which fabric stream (And hence egress NPU) is going to be used should be trivial
+ 1. reverse engineer sent headers (so we can pop them correctly)
+ 1. reverse engineer cookie
+ 1. more research on received headers source fabric, port, npu