packet_via_dmem 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c91bd72301863ca9092e643890091fce9b9387ac
4
- data.tar.gz: f60d3d27a871d6e6b18fce2e8cb8464890bb4a66
3
+ metadata.gz: 8440c5a60e199124adc3d0324bf38437174fb6a3
4
+ data.tar.gz: 73eebe8936d415da89dbf6e61c1c2086d8fa050b
5
5
  SHA512:
6
- metadata.gz: d22df958223f3f66373060765fcc3619f2055119613c89244e98238b5dec7376d9f312bfadc0f847c4280b30a215815cf44ff9e13eebd82c690c737f1937f716
7
- data.tar.gz: 218cde3c052d3418b7c667b3b50ca25dce497931db7e07c3102c66022c3e66999039ca59e63d1ea57e4e9a0fe7a8553265ad3d0f9e99a7688c2e6e8e2c3a1461
6
+ metadata.gz: 16e295f2ce92ffba8b559bba2aaf92b7df0bc2e2754a72736e47b9ae3418c54b5695a74f7bc149123ab733af600d087d0e30d64e66d135c5d16066007da40097
7
+ data.tar.gz: b3180ed9bac4472230ca4b0bd421bd79043f5dbe321d0501431fe0f9df588d8a3862aaed6f538c7854e0797417ca6694363b22f8b366f8480cc429bf01594ed4
data/README.md CHANGED
@@ -2,13 +2,16 @@
2
2
  Finds junos packet-via-dmem packets from arbitrary output and generates text2pcap compatible output
3
3
 
4
4
  ## JunOS
5
+ To capture say packets with IP address 10.11.12.13
6
+
5
7
  % ssh test2nqe31.dk|tee output.txt
6
8
  fisakytt@test2nqe31-re1.dk> start shell pfe network afeb0
7
9
 
8
10
  AFEB platform (1000Mhz QorIQ P2020 processor, 2048MB memory, 512KB flash)
9
11
  MX104-ABB-0(test2nqe31-re1.dk vty)# test jnh 0 packet-via-dmem enable
10
- MX104-ABB-0(test2nqe31-re1.dk vty)# test jnh 0 packet-via-dmem 0x3 0xaabbcc
11
- MX104-ABB-0(test2nqe31-re1.dk vty)# test jnh 0 packet-via-dmem 0x0
12
+ MX104-ABB-0(test2nqe31-re1.dk vty)# test jnh 0 packet-via-dmem capture 0x3 0x0a0b0c0d
13
+ MX104-ABB-0(test2nqe31-re1.dk vty)# test jnh 0 packet-via-dmem capture 0x0
14
+ MX104-ABB-0(test2nqe31-re1.dk vty)# test jnh 0 packet-via-dmem dump
12
15
  MX104-ABB-0(test2nqe31-re1.dk vty)# test jnh 0 packet-via-dmem disable
13
16
 
14
17
 
@@ -65,6 +68,72 @@ Finds junos packet-via-dmem packets from arbitrary output and generates text2pca
65
68
  dmem = PacketViaDMEM.new
66
69
  puts dmem.parse File.read(ARGF[0])
67
70
 
71
+
72
+ ## Header format
73
+ Potentially first is type
74
+ * 00 ?? ?? ?? source ??
75
+ * 10 ?? ?? ?? ?? ?? source ??
76
+
77
+ Example receive headers, MX480
78
+ 00 0b 40 60 41 08
79
+ 00 01 c0 70 81 08
80
+ 00 02 40 70 81 08
81
+ 00 02 c0 70 81 08
82
+ 10 03 40 70 05 40 81 08
83
+ 00 03 c0 70 81 08
84
+ 00 06 40 70 81 08
85
+ 00 07 c0 70 81 08
86
+ 00 08 47 f0 20 00
87
+ 00 09 45 f0 20 00
88
+ 00 09 c7 f0 80 00
89
+ 00 0b c0 70 81 08
90
+ 10 0c 08 00 02 00 1f 00
91
+ 00 00 c0 70 81 08
92
+ 00 01 47 f0 80 00
93
+ 00 04 40 60 41 08
94
+ 10 04 c0 70 01 50 81 08
95
+ 00 05 40 70 81 08
96
+ 00 05 c0 70 81 08
97
+ 00 06 c5 f0 20 00
98
+ 10 07 08 00 02 00 1f 00
99
+ 00 08 c0 70 81 08
100
+ 00 0a 40 70 81 08
101
+ 00 0a c0 70 81 08
102
+ 00 0b 47 f0 20 00
103
+ 00 01 c0 70 81 08
104
+ 00 02 40 60 41 08
105
+ 00 07 c7 f0 b0 80
106
+
107
+ Example receive headers, MX80
108
+ 00 08 00 f0 81 08
109
+ 10 08 80 f0 05 b4 81 08
110
+ 10 09 00 f0 05 b4 81 08
111
+ 10 09 80 f0 05 b4 81 08
112
+ 00 0a 00 f0 92 08
113
+ 10 0a 80 f0 05 b4 81 08
114
+ 10 03 00 f0 05 b4 81 08
115
+ 00 04 00 f0 81 08
116
+ 10 04 80 f0 05 b4 81 08
117
+ 10 05 00 f0 05 b4 81 08
118
+ 10 05 80 f0 05 b4 81 08
119
+ 00 06 00 f0 81 08
120
+ 10 06 80 f0 05 b4 81 08
121
+ 00 07 00 f0 80 08
122
+ 10 07 80 f0 05 b4 81 08
123
+ 10 0b 00 f0 02 28 81 08
124
+
125
+ TAZ-TBB-0(X vty)# show ixchip ifd
126
+
127
+ IFD IFD IX WAN Ing Queue Egr Queue
128
+ Index Name Id Port Rt/Ct/Be H/L
129
+ ====== ========== ====== ====== ============== ======
130
+ 148 ge-1/0/0 2 0 0/32/64 0/32
131
+ 149 ge-1/0/1 2 1 1/33/65 1/33
132
+ 166 ge-1/1/8 2 18 18/50/82 18/50
133
+
134
+ For this box, second to last byte, divmod 64, returns these ports, which are
135
+ correct port for source.
136
+
68
137
  ## Todo
69
138
  1. correctly discover how many bytes need to be popped, perhaps by finding valid ethernet headers and ignore anything before?
70
- 1. reverse engineer header/cookie, at least figuring out which egress NPU is going to be used should be trivial
139
+ 1. reverse engineer header/cookie, at least figuring out which fabric stream (And hence egress NPU) is going to be used should be trivial
@@ -16,7 +16,8 @@ class PacketViaDMEM
16
16
  end
17
17
 
18
18
  def parse str
19
- pkts = []
19
+ packets = []
20
+ headers = []
20
21
  @sc.string = str
21
22
  while @sc.scan_until PACKET
22
23
  match = @sc.matched.split(/\s+/)
@@ -24,25 +25,40 @@ class PacketViaDMEM
24
25
  next if type == :received and (not @received or @received < 1)
25
26
  next if type == :sent and (not @sent or @sent < 1)
26
27
  @sc.scan_until(/\n/) if type == :received
27
- type = type == :received ? @received : @sent
28
28
  pkt = ''
29
29
  while @sc.match?(/^0x/)
30
30
  pkt << @sc.scan_until(/\n/).strip
31
31
  end
32
- pkt = parse_packet(pkt, type)
33
- pkts << pkt if pkt
32
+ pkt = parse_packet pkt
33
+ pop = get_pop(type, pkt)
34
+ header = pkt[0..pop-1]
35
+ pkt = pkt[pop..-1]
36
+ if pkt
37
+ packets << '000000 ' + pkt.join(' ')
38
+ headers << header.join(' ')
39
+ end
34
40
  end
35
- pkts
41
+ [packets, headers]
36
42
  end
37
43
 
38
44
  private
39
45
 
40
- def parse_packet pkt, pop
46
+ def get_pop type, pkt
47
+ if type == :sent
48
+ @sent
49
+ else
50
+ case pkt.first.to_i(16)
51
+ when 0x0 then 6 #1,2,3,4,5,6
52
+ when 0x10 then 8 #1,2,3,4,7,8,5,6
53
+ else @received
54
+ end
55
+ end
56
+ end
57
+
58
+ def parse_packet pkt
41
59
  pkt = pkt.gsub(/0x/, '')
42
60
  pkt = pkt.gsub(/\s+/, '')
43
61
  pkt = pkt.scan(/../)
44
- '000000 ' + pkt[pop..-1].join(' ')
45
- rescue
46
- nil
62
+ pkt
47
63
  end
48
64
  end
@@ -11,7 +11,7 @@ class PacketViaDMEM
11
11
  @opts = opts_parse
12
12
  @debug = @opts.debug?
13
13
  end
14
-
14
+
15
15
  def run
16
16
  file = @opts.arguments.shift
17
17
  raise NoFile, 'filename is mandatory argument' unless file
@@ -20,7 +20,9 @@ class PacketViaDMEM
20
20
  rescue
21
21
  raise InvalidFile, "unable to read #{file}"
22
22
  end
23
- puts PacketViaDMEM.new(:received=>@opts[:received], :sent=>@opts[:sent]).parse file
23
+ packets, headers = PacketViaDMEM.new(:received=>@opts[:received], :sent=>@opts[:sent]).parse file
24
+ $stderr.puts headers if @opts.headers?
25
+ puts packets
24
26
  end
25
27
 
26
28
  private
@@ -28,6 +30,7 @@ class PacketViaDMEM
28
30
  def opts_parse
29
31
  Slop.parse do |o|
30
32
  o.bool '-d', '--debug', 'turn on debugging'
33
+ o.bool '--headers', 'print headers to stderr'
31
34
  o.int '-r', '--received', "pop BYTES from received frames, default #{PacketViaDMEM::HEADER_SIZE[:received]}", :default=>PacketViaDMEM::HEADER_SIZE[:received]
32
35
  o.int '-s', '--sent', "pop BYTES from senti frames, default is not to show sent frames"
33
36
  o.on '-h', '--help' do puts o; exit; end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'packet_via_dmem'
3
- s.version = '0.0.0'
3
+ s.version = '0.0.1'
4
4
  s.licenses = %w( Apache-2.0 )
5
5
  s.platform = Gem::Platform::RUBY
6
6
  s.authors = [ 'Saku Ytti' ]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packet_via_dmem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Saku Ytti