packet_via_dmem 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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