pcapr-local 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. data/.document +5 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +64 -0
  4. data/Rakefile +57 -0
  5. data/VERSION +1 -0
  6. data/bin/pcap2par +49 -0
  7. data/bin/startpcapr +40 -0
  8. data/bin/stoppcapr +33 -0
  9. data/bin/xtractr +5 -0
  10. data/lib/environment.rb +106 -0
  11. data/lib/exe/xtractr +0 -0
  12. data/lib/mu/pcap.rb +110 -0
  13. data/lib/mu/pcap/ethernet.rb +148 -0
  14. data/lib/mu/pcap/header.rb +75 -0
  15. data/lib/mu/pcap/io_pair.rb +67 -0
  16. data/lib/mu/pcap/io_wrapper.rb +76 -0
  17. data/lib/mu/pcap/ip.rb +61 -0
  18. data/lib/mu/pcap/ipv4.rb +257 -0
  19. data/lib/mu/pcap/ipv6.rb +148 -0
  20. data/lib/mu/pcap/packet.rb +104 -0
  21. data/lib/mu/pcap/pkthdr.rb +155 -0
  22. data/lib/mu/pcap/reader.rb +61 -0
  23. data/lib/mu/pcap/reader/http_family.rb +170 -0
  24. data/lib/mu/pcap/sctp.rb +367 -0
  25. data/lib/mu/pcap/sctp/chunk.rb +123 -0
  26. data/lib/mu/pcap/sctp/chunk/data.rb +134 -0
  27. data/lib/mu/pcap/sctp/chunk/init.rb +100 -0
  28. data/lib/mu/pcap/sctp/chunk/init_ack.rb +68 -0
  29. data/lib/mu/pcap/sctp/parameter.rb +110 -0
  30. data/lib/mu/pcap/sctp/parameter/ip_address.rb +48 -0
  31. data/lib/mu/pcap/stream_packetizer.rb +72 -0
  32. data/lib/mu/pcap/tcp.rb +505 -0
  33. data/lib/mu/pcap/udp.rb +69 -0
  34. data/lib/mu/scenario/pcap.rb +164 -0
  35. data/lib/mu/scenario/pcap/fields.rb +50 -0
  36. data/lib/mu/scenario/pcap/rtp.rb +71 -0
  37. data/lib/pcapr_local.rb +159 -0
  38. data/lib/pcapr_local/config.rb +336 -0
  39. data/lib/pcapr_local/db.rb +197 -0
  40. data/lib/pcapr_local/scanner.rb +250 -0
  41. data/lib/pcapr_local/server.rb +178 -0
  42. data/lib/pcapr_local/www/favicon.ico +0 -0
  43. data/lib/pcapr_local/www/favicon.png +0 -0
  44. data/lib/pcapr_local/www/home/index.html +138 -0
  45. data/lib/pcapr_local/www/static/image/16x16/Cancel.png +0 -0
  46. data/lib/pcapr_local/www/static/image/16x16/Cancel.png.1 +0 -0
  47. data/lib/pcapr_local/www/static/image/16x16/Download.png +0 -0
  48. data/lib/pcapr_local/www/static/image/16x16/Folder3.png +0 -0
  49. data/lib/pcapr_local/www/static/image/16x16/Full Size.png +0 -0
  50. data/lib/pcapr_local/www/static/image/16x16/Minus.png +0 -0
  51. data/lib/pcapr_local/www/static/image/16x16/Plus.png +0 -0
  52. data/lib/pcapr_local/www/static/image/16x16/Search.png +0 -0
  53. data/lib/pcapr_local/www/static/image/16x16/User.png +0 -0
  54. data/lib/pcapr_local/www/static/image/48x48/Phone.png +0 -0
  55. data/lib/pcapr_local/www/static/image/48x48/Video.png +0 -0
  56. data/lib/pcapr_local/www/static/image/bar-orange.gif +0 -0
  57. data/lib/pcapr_local/www/static/image/beta.png +0 -0
  58. data/lib/pcapr_local/www/static/image/bg.png +0 -0
  59. data/lib/pcapr_local/www/static/image/blockquote.png +0 -0
  60. data/lib/pcapr_local/www/static/image/body-bg.png +0 -0
  61. data/lib/pcapr_local/www/static/image/body-h3.png +0 -0
  62. data/lib/pcapr_local/www/static/image/body-hl1-bg.png +0 -0
  63. data/lib/pcapr_local/www/static/image/body-hl1-h3.png +0 -0
  64. data/lib/pcapr_local/www/static/image/body-hl1-readmore.png +0 -0
  65. data/lib/pcapr_local/www/static/image/body-hl2-bg.png +0 -0
  66. data/lib/pcapr_local/www/static/image/body-hl2-h3.png +0 -0
  67. data/lib/pcapr_local/www/static/image/body-hl2-readmore.png +0 -0
  68. data/lib/pcapr_local/www/static/image/body-hl3-bg.png +0 -0
  69. data/lib/pcapr_local/www/static/image/body-hl3-h3.png +0 -0
  70. data/lib/pcapr_local/www/static/image/body-hl3-readmore.png +0 -0
  71. data/lib/pcapr_local/www/static/image/body-hl4-bg.png +0 -0
  72. data/lib/pcapr_local/www/static/image/body-hl4-h3.png +0 -0
  73. data/lib/pcapr_local/www/static/image/body-hl4-readmore.png +0 -0
  74. data/lib/pcapr_local/www/static/image/body-hl5-h3.png +0 -0
  75. data/lib/pcapr_local/www/static/image/body-hl6-h3.png +0 -0
  76. data/lib/pcapr_local/www/static/image/body-hl7-h3.png +0 -0
  77. data/lib/pcapr_local/www/static/image/body-hl8-h3.png +0 -0
  78. data/lib/pcapr_local/www/static/image/body-readmore.png +0 -0
  79. data/lib/pcapr_local/www/static/image/bottom-bg.png +0 -0
  80. data/lib/pcapr_local/www/static/image/bottom-l.png +0 -0
  81. data/lib/pcapr_local/www/static/image/bottom-r.png +0 -0
  82. data/lib/pcapr_local/www/static/image/btn-search.png +0 -0
  83. data/lib/pcapr_local/www/static/image/bullet-1.png +0 -0
  84. data/lib/pcapr_local/www/static/image/bullet-2.png +0 -0
  85. data/lib/pcapr_local/www/static/image/bullet-3.png +0 -0
  86. data/lib/pcapr_local/www/static/image/bullet-4.png +0 -0
  87. data/lib/pcapr_local/www/static/image/bullet-5.png +0 -0
  88. data/lib/pcapr_local/www/static/image/bullet-6.png +0 -0
  89. data/lib/pcapr_local/www/static/image/bullet-7.png +0 -0
  90. data/lib/pcapr_local/www/static/image/bullet-hl1.png +0 -0
  91. data/lib/pcapr_local/www/static/image/bullet-hl2.png +0 -0
  92. data/lib/pcapr_local/www/static/image/bullet-hl3.png +0 -0
  93. data/lib/pcapr_local/www/static/image/bullet-hl4.png +0 -0
  94. data/lib/pcapr_local/www/static/image/bullet-pathway.png +0 -0
  95. data/lib/pcapr_local/www/static/image/bullet-section1.png +0 -0
  96. data/lib/pcapr_local/www/static/image/bullet-section2.png +0 -0
  97. data/lib/pcapr_local/www/static/image/collapsed.gif +0 -0
  98. data/lib/pcapr_local/www/static/image/crosslink.png +0 -0
  99. data/lib/pcapr_local/www/static/image/expanded.gif +0 -0
  100. data/lib/pcapr_local/www/static/image/favicon.ico +0 -0
  101. data/lib/pcapr_local/www/static/image/favicon.png +0 -0
  102. data/lib/pcapr_local/www/static/image/icon-author.png +0 -0
  103. data/lib/pcapr_local/www/static/image/icon-created.png +0 -0
  104. data/lib/pcapr_local/www/static/image/p-expand.gif +0 -0
  105. data/lib/pcapr_local/www/static/image/pcapr-logo.png +0 -0
  106. data/lib/pcapr_local/www/static/image/powered-by.png +0 -0
  107. data/lib/pcapr_local/www/static/image/section1-bg.png +0 -0
  108. data/lib/pcapr_local/www/static/image/section1-h3.png +0 -0
  109. data/lib/pcapr_local/www/static/image/section1-readmore.png +0 -0
  110. data/lib/pcapr_local/www/static/image/section2-bg.png +0 -0
  111. data/lib/pcapr_local/www/static/image/section2-h3.png +0 -0
  112. data/lib/pcapr_local/www/static/image/section2-readmore.png +0 -0
  113. data/lib/pcapr_local/www/static/image/status-alert.png +0 -0
  114. data/lib/pcapr_local/www/static/image/status-download.png +0 -0
  115. data/lib/pcapr_local/www/static/image/status-info.png +0 -0
  116. data/lib/pcapr_local/www/static/image/status-note.png +0 -0
  117. data/lib/pcapr_local/www/static/image/tab-round.png +0 -0
  118. data/lib/pcapr_local/www/static/image/throbber.gif +0 -0
  119. data/lib/pcapr_local/www/static/image/user.jpg +0 -0
  120. data/lib/pcapr_local/www/static/script/closet/async.js +421 -0
  121. data/lib/pcapr_local/www/static/script/closet/closet.api.js +241 -0
  122. data/lib/pcapr_local/www/static/script/closet/closet.folders.js +94 -0
  123. data/lib/pcapr_local/www/static/script/closet/closet.js +187 -0
  124. data/lib/pcapr_local/www/static/script/closet/closet.mr.js +219 -0
  125. data/lib/pcapr_local/www/static/script/closet/closet.options.js +359 -0
  126. data/lib/pcapr_local/www/static/script/closet/closet.quantity.js +73 -0
  127. data/lib/pcapr_local/www/static/script/closet/closet.render.js +205 -0
  128. data/lib/pcapr_local/www/static/script/closet/closet.report.js +86 -0
  129. data/lib/pcapr_local/www/static/script/closet/closet.reports.http.js +135 -0
  130. data/lib/pcapr_local/www/static/script/closet/closet.reports.overview.js +163 -0
  131. data/lib/pcapr_local/www/static/script/closet/closet.reports.sip.js +159 -0
  132. data/lib/pcapr_local/www/static/script/closet/closet.reports.tcp.js +72 -0
  133. data/lib/pcapr_local/www/static/script/closet/closet.reports.visualize.js +263 -0
  134. data/lib/pcapr_local/www/static/script/closet/closet.util.js +40 -0
  135. data/lib/pcapr_local/www/static/script/jquery/jquery-1.4.2.min.js +154 -0
  136. data/lib/pcapr_local/www/static/script/jquery/jquery-ui.js +10921 -0
  137. data/lib/pcapr_local/www/static/script/jquery/jquery.flot.js +2123 -0
  138. data/lib/pcapr_local/www/static/script/jquery/jquery.flot.selection.js +184 -0
  139. data/lib/pcapr_local/www/static/script/jquery/jquery.flot.stack.js +184 -0
  140. data/lib/pcapr_local/www/static/script/jquery/jquery.form.js +643 -0
  141. data/lib/pcapr_local/www/static/script/jquery/jquery.jsonp.min.js +3 -0
  142. data/lib/pcapr_local/www/static/script/jquery/jquery.menu.js +142 -0
  143. data/lib/pcapr_local/www/static/script/jquery/jquery.suggest.js +308 -0
  144. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.core.js +203 -0
  145. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.slider.js +629 -0
  146. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.sortable.js +1055 -0
  147. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.widget.js +236 -0
  148. data/lib/pcapr_local/www/static/script/json2.js +481 -0
  149. data/lib/pcapr_local/www/static/script/sammy/plugins/sammy.cache.js +115 -0
  150. data/lib/pcapr_local/www/static/script/sammy/plugins/sammy.template.js +117 -0
  151. data/lib/pcapr_local/www/static/script/sammy/sammy.js +1696 -0
  152. data/lib/pcapr_local/www/static/script/tipsy/jquery.tipsy.js +104 -0
  153. data/lib/pcapr_local/www/static/style/c3p0.css +116 -0
  154. data/lib/pcapr_local/www/static/style/jquery.suggest.css +27 -0
  155. data/lib/pcapr_local/www/static/style/page.css +1113 -0
  156. data/lib/pcapr_local/www/static/style/tipsy.css +7 -0
  157. data/lib/pcapr_local/www/templates/browse.services.template +10 -0
  158. data/lib/pcapr_local/www/templates/browse.template +77 -0
  159. data/lib/pcapr_local/www/templates/flows.template +38 -0
  160. data/lib/pcapr_local/www/templates/pcap.template +63 -0
  161. data/lib/pcapr_local/www/templates/sip.calls.template +35 -0
  162. data/lib/pcapr_local/www/templates/statistics.template +6 -0
  163. data/lib/pcapr_local/xtractr.rb +179 -0
  164. data/lib/pcapr_local/xtractr/instance.rb +172 -0
  165. data/pcapr-local.gemspec +297 -0
  166. data/test/mu/pcap/reader/tc_http_family.rb +251 -0
  167. data/test/mu/pcap/tc_ethernet.rb +71 -0
  168. data/test/mu/pcap/tc_header.rb +56 -0
  169. data/test/mu/pcap/tc_ipv4.rb +103 -0
  170. data/test/mu/pcap/tc_ipv6.rb +83 -0
  171. data/test/mu/pcap/tc_packet.rb +44 -0
  172. data/test/mu/pcap/tc_pair.rb +58 -0
  173. data/test/mu/pcap/tc_pkthdr.rb +33 -0
  174. data/test/mu/pcap/tc_reader.rb +76 -0
  175. data/test/mu/pcap/tc_tcp.rb +426 -0
  176. data/test/mu/pcap/tc_udp.rb +33 -0
  177. data/test/mu/pcap/tc_wrapper.rb +80 -0
  178. data/test/mu/scenario/pcap/tc_fields.rb +67 -0
  179. data/test/mu/scenario/pcap/tc_rtp.rb +135 -0
  180. data/test/mu/scenario/sip_signalled_call_1.pcap +0 -0
  181. data/test/mu/scenario/tc_pcap.rb +190 -0
  182. data/test/mu/scenario/test_data/arp.pcap +0 -0
  183. data/test/mu/scenario/test_data/dns.pcap +0 -0
  184. data/test/mu/scenario/test_data/http-v6.pcap +0 -0
  185. data/test/mu/scenario/test_data/http.pcap +0 -0
  186. data/test/mu/scenario/test_data/http_chunked.pcap +0 -0
  187. data/test/mu/scenario/test_data/http_deflate.pcap +0 -0
  188. data/test/mu/scenario/test_data/httpauth3.pcap +0 -0
  189. data/test/mu/scenario/test_data/icmp.pcap +0 -0
  190. data/test/mu/scenario/test_data/sip_signalled_call_1.pcap +0 -0
  191. data/test/mu/tc_pcap.rb +39 -0
  192. data/test/mu/testcase.rb +86 -0
  193. data/test/pcapr_local/arp.pcap +0 -0
  194. data/test/pcapr_local/data.js +3 -0
  195. data/test/pcapr_local/http_chunked.pcap +0 -0
  196. data/test/pcapr_local/tc_api.rb +181 -0
  197. data/test/pcapr_local/test.tgz +0 -0
  198. data/test/pcapr_local/test_scanner.rb +241 -0
  199. data/test/pcapr_local/test_xtractr.rb +219 -0
  200. data/test/pcapr_local/testcase.rb +107 -0
  201. data/test/test_export_to_scenario.sh +25 -0
  202. data/test/test_pcapr_local.rb +29 -0
  203. metadata +450 -0
@@ -0,0 +1,123 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ module Mu
6
+ class Pcap
7
+ class SCTP
8
+
9
+ class Chunk < Packet
10
+ attr_accessor :type, :flags, :size
11
+
12
+ def initialize
13
+ super
14
+
15
+ @type = 0
16
+ @flags = 0
17
+ @size = 0
18
+ end
19
+
20
+ def self.from_bytes bytes
21
+ # Basic validation
22
+ Pcap.assert(bytes.length >= 4,
23
+ "Truncated chunk header: 4 > #{bytes.length}")
24
+
25
+ # Read chunk header
26
+ type, flags, size = bytes.unpack('CCn')
27
+
28
+ # Validate chunk size
29
+ Pcap.assert(bytes.length >= size,
30
+ "Truncated chunk: #{size} set, #{bytes.length} available")
31
+
32
+ # Create chunk based on type
33
+ case type
34
+ when CHUNK_DATA
35
+ chunk = Data.from_bytes(flags, size, bytes[4..-1])
36
+ when CHUNK_INIT
37
+ chunk = Init.from_bytes(flags, size, bytes[4..-1])
38
+ when CHUNK_INIT_ACK
39
+ chunk = InitAck.from_bytes(flags, size, bytes[4..-1])
40
+ when CHUNK_SACK
41
+ chunk = dummy_chunk(type, flags, size, bytes)
42
+ when CHUNK_HEARTBEAT
43
+ chunk = dummy_chunk(type, flags, size, bytes)
44
+ when CHUNK_HEARTBEAT_ACK
45
+ chunk = dummy_chunk(type, flags, size, bytes)
46
+ when CHUNK_ABORT
47
+ chunk = dummy_chunk(type, flags, size, bytes)
48
+ when CHUNK_SHUTDOWN
49
+ chunk = dummy_chunk(type, flags, size, bytes)
50
+ when CHUNK_SHUTDOWN_ACK
51
+ chunk = dummy_chunk(type, flags, size, bytes)
52
+ when CHUNK_ERROR
53
+ chunk = dummy_chunk(type, flags, size, bytes)
54
+ when CHUNK_COOKIE_ECHO
55
+ chunk = dummy_chunk(type, flags, size, bytes)
56
+ when CHUNK_COOKIE_ACK
57
+ chunk = dummy_chunk(type, flags, size, bytes)
58
+ when CHUNK_ECNE
59
+ chunk = dummy_chunk(type, flags, size, bytes)
60
+ when CHUNK_CWR
61
+ chunk = dummy_chunk(type, flags, size, bytes)
62
+ when CHUNK_SHUTDOWN_COMPLETE
63
+ chunk = dummy_chunk(type, flags, size, bytes)
64
+ when CHUNK_AUTH
65
+ chunk = dummy_chunk(type, flags, size, bytes)
66
+ when CHUNK_ASCONF_ACK
67
+ chunk = dummy_chunk(type, flags, size, bytes)
68
+ when CHUNK_PADDING
69
+ chunk = dummy_chunk(type, flags, size, bytes)
70
+ when CHUNK_FORWARD_TSN
71
+ chunk = dummy_chunk(type, flags, size, bytes)
72
+ when CHUNK_ASCONF
73
+ chunk = dummy_chunk(type, flags, size, bytes)
74
+ else
75
+ chunk = dummy_chunk(type, flags, size, bytes)
76
+ end
77
+
78
+ # Return the result
79
+ return chunk
80
+ end
81
+
82
+ def write io, ip
83
+ header = [@type, @flags, @size].pack('CCn')
84
+
85
+ # Write Chunk header followed by the payload
86
+ io.write(header)
87
+ io.write(@payload_raw)
88
+ end
89
+
90
+ def padded_size
91
+ if 0 == @size % 4
92
+ return @size
93
+ else
94
+ return (@size + 4 - (@size % 4))
95
+ end
96
+ end
97
+
98
+ def to_s
99
+ return "chunk(%d, %d, %d)" % [@type, @flags, @size]
100
+ end
101
+
102
+ def self.dummy_chunk type, flags, size, bytes
103
+ # Create new dummy chunk
104
+ chunk = Chunk.new
105
+ chunk.type = type
106
+ chunk.flags = flags
107
+ chunk.size = size
108
+
109
+ # Save the payload
110
+ chunk.payload_raw = chunk.payload = bytes[4..chunk.padded_size]
111
+
112
+ # Return the result
113
+ return chunk
114
+ end
115
+ end # class Chunk
116
+
117
+ end # class SCTP
118
+ end # class Pcap
119
+ end # module Mu
120
+
121
+ require 'mu/pcap/sctp/chunk/data'
122
+ require 'mu/pcap/sctp/chunk/init'
123
+ require 'mu/pcap/sctp/chunk/init_ack'
@@ -0,0 +1,134 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ module Mu
6
+ class Pcap
7
+ class SCTP
8
+ class Chunk
9
+
10
+ class Data < Chunk
11
+ FLAG_LAST_SEG = 0x01
12
+ FLAG_FIRST_SEG = 0x02
13
+ FLAG_UNORDERED = 0x04
14
+
15
+ attr_accessor :tsn, :sid, :ssn, :ppid
16
+
17
+ def initialize
18
+ super
19
+
20
+ @type = CHUNK_DATA
21
+ @tsn = 0
22
+ @sid = 0
23
+ @ssn = 0
24
+ @ppid = 0
25
+ end
26
+
27
+ def self.from_bytes flags, size, bytes
28
+ # Basic validation
29
+ Pcap.assert(bytes.length >= 12,
30
+ "Truncated data chunk header: 12 > #{bytes.length}")
31
+
32
+ # Read init chunk header
33
+ tsn, sid, ssn, ppid = bytes.unpack('NnnN')
34
+
35
+ # Create data chunk
36
+ data = Data.new
37
+ data.flags = flags
38
+ data.size = size
39
+ data.tsn = tsn
40
+ data.sid = sid
41
+ data.ssn = ssn
42
+ data.ppid = ppid
43
+
44
+ # Save the payload
45
+ data.payload_raw = data.payload = bytes[12..size - 5]
46
+
47
+ # Return the result
48
+ return data
49
+ end
50
+
51
+ def write io, ip
52
+ chunk_header = [@type, @flags, @size].pack('CCn')
53
+ data_header = [@tsn, @sid, @ssn, @ppid].pack('NnnN')
54
+
55
+ # Write Chunk header followed by the Data chunk header and payload
56
+ io.write(chunk_header)
57
+ io.write(data_header)
58
+ io.write(@payload_raw)
59
+
60
+ # Write padding, if necessary
61
+ if size < padded_size
62
+ (padded_size - size).times do
63
+ io.write("\x00")
64
+ end
65
+ end
66
+ end
67
+
68
+ def ordered?
69
+ if 0 == @flags[2]
70
+ return true
71
+ else
72
+ return false
73
+ end
74
+ end
75
+
76
+ def first_segment?
77
+ if 1 == @flags[1] and 0 == @flags[0]
78
+ return true
79
+ else
80
+ return false
81
+ end
82
+ end
83
+
84
+ def last_segment?
85
+ if 0 == @flags[1] and 1 == @flags[0]
86
+ return true
87
+ else
88
+ return false
89
+ end
90
+ end
91
+
92
+ def complete_segment?
93
+ if 1 == @flags[1] and 1 == @flags[0]
94
+ return true
95
+ else
96
+ return false
97
+ end
98
+ end
99
+
100
+ def to_s
101
+ flags_s = '['
102
+
103
+ if ordered?
104
+ flags_s += 'ordered, '
105
+ else
106
+ flags_s += 'unordered, '
107
+ end
108
+
109
+ if complete_segment?
110
+ flags_s += 'complete segment'
111
+ elsif first_segment?
112
+ flags_s += 'first segment'
113
+ elsif last_segment?
114
+ flags_s += 'last segment'
115
+ else
116
+ flags_s += 'middle segment'
117
+ end
118
+
119
+ flags_s += ']'
120
+
121
+ return "data(%s, %d, %d, %d, %d, %d, %s)" % [flags_s,
122
+ @size,
123
+ @tsn,
124
+ @sid,
125
+ @ssn,
126
+ @ppid,
127
+ @payload.inspect]
128
+ end
129
+ end # class Data
130
+
131
+ end # class Chunk
132
+ end # class SCTP
133
+ end # class Pcap
134
+ end # module Mu
@@ -0,0 +1,100 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ module Mu
6
+ class Pcap
7
+ class SCTP
8
+ class Chunk
9
+
10
+ class Init < Chunk
11
+ attr_accessor :init_tag, :a_rwnd, :o_streams, :i_streams, :init_tsn
12
+
13
+ def initialize
14
+ super
15
+
16
+ @type = CHUNK_INIT
17
+ @init_tag = 0
18
+ @a_rwnd = 0
19
+ @o_streams = 0
20
+ @i_streams = 0
21
+ @init_tsn = 0
22
+ @payload = []
23
+ end
24
+
25
+ def self.from_bytes flags, size, bytes
26
+ # Basic validation
27
+ Pcap.assert(bytes.length >= 16,
28
+ "Truncated init chunk header: 16 > #{bytes.length}")
29
+
30
+ # Read init chunk header
31
+ init_tag, a_rwnd, o_streams, i_streams, init_tsn = bytes.unpack('NNnnN')
32
+
33
+ # Create init chunk
34
+ init = Init.new
35
+ init.flags = flags
36
+ init.size = size
37
+ init.init_tag = init_tag
38
+ init.a_rwnd = a_rwnd
39
+ init.o_streams = o_streams
40
+ init.i_streams = i_streams
41
+ init.init_tsn = init_tsn
42
+
43
+ # Initialize the counter
44
+ length = 16
45
+
46
+ # Collect the chunks
47
+ while length < bytes.length
48
+ # Parse new parameter from the bytes
49
+ parameter = Parameter.from_bytes(bytes[length..-1])
50
+
51
+ # Get parameter size with padding
52
+ length += parameter.padded_size
53
+
54
+ # Add chunk to the list
55
+ init << parameter
56
+ end
57
+
58
+ # Return the result
59
+ return init
60
+ end
61
+
62
+ def write io, ip
63
+ chunk_header = [@type, @flags, @size].pack('CCn')
64
+ init_header = [@init_tag,
65
+ @a_rwnd,
66
+ @o_streams,
67
+ @i_streams,
68
+ @init_tsn].pack('NNnnN')
69
+
70
+ # Write Chunk header followed by the Init chunk header
71
+ io.write(chunk_header)
72
+ io.write(init_header)
73
+
74
+ # Write each parameter
75
+ @payload.each do |parameter|
76
+ parameter.write(io, ip)
77
+ end
78
+ end
79
+
80
+ def << parameter
81
+ @payload << parameter
82
+ end
83
+
84
+ def to_s
85
+ return "init(%d, %d, %d, %d, %d, %d, %s)" % [@size,
86
+ @init_tag,
87
+ @a_rwnd,
88
+ @o_streams,
89
+ @i_streams,
90
+ @init_tsn,
91
+ @payload.join(", ")]
92
+ end
93
+ end # class Init
94
+
95
+ end # class Chunk
96
+ end # class SCTP
97
+ end # class Pcap
98
+ end # module Mu
99
+
100
+ require 'mu/pcap/sctp/parameter'
@@ -0,0 +1,68 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ module Mu
6
+ class Pcap
7
+ class SCTP
8
+ class Chunk
9
+
10
+ class InitAck < Init
11
+ def initialize
12
+ super
13
+
14
+ @type = CHUNK_INIT_ACK
15
+ end
16
+
17
+ def self.from_bytes flags, size, bytes
18
+ # Basic validation
19
+ Pcap.assert(bytes.length >= 16,
20
+ "Truncated init_ack chunk header: 16 > #{bytes.length}")
21
+
22
+ # Read init_ack chunk header
23
+ init_tag, a_rwnd, o_streams, i_streams, init_tsn = bytes.unpack('NNnnN')
24
+
25
+ # Create init chunk
26
+ init_ack = InitAck.new
27
+ init_ack.flags = flags
28
+ init_ack.size = size
29
+ init_ack.init_tag = init_tag
30
+ init_ack.a_rwnd = a_rwnd
31
+ init_ack.o_streams = o_streams
32
+ init_ack.i_streams = i_streams
33
+ init_ack.init_tsn = init_tsn
34
+
35
+ # Initialize the counter
36
+ length = 16
37
+
38
+ # Collect the chunks
39
+ while length < bytes.length
40
+ # Parse new parameter from the bytes
41
+ parameter = Parameter.from_bytes(bytes[length..-1])
42
+
43
+ # Get parameter size with padding
44
+ length += parameter.padded_size
45
+
46
+ # Add chunk to the list
47
+ init_ack << parameter
48
+ end
49
+
50
+ # Return the result
51
+ return init_ack
52
+ end
53
+
54
+ def to_s
55
+ return "init_ack(%d, %d, %d, %d, %d, %d, %s)" % [@size,
56
+ @init_tag,
57
+ @a_rwnd,
58
+ @o_streams,
59
+ @i_streams,
60
+ @init_tsn,
61
+ @payload.join(", ")]
62
+ end
63
+ end # class InitAck
64
+
65
+ end # class Chunk
66
+ end # class SCTP
67
+ end # class Pcap
68
+ end # module Mu
@@ -0,0 +1,110 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ module Mu
6
+ class Pcap
7
+ class SCTP
8
+
9
+ class Parameter < Packet
10
+ attr_accessor :type, :size
11
+
12
+ def initialize
13
+ super
14
+
15
+ @type = 0
16
+ @size = 0
17
+ end
18
+
19
+ def self.from_bytes bytes
20
+ # Basic validation
21
+ Pcap.assert(bytes.length >= 4,
22
+ "Truncated parameter header: 4 > #{bytes.length}")
23
+
24
+ # Read chunk header
25
+ type, size = bytes.unpack('nn')
26
+
27
+ # Validate chunk size
28
+ Pcap.assert(bytes.length >= size,
29
+ "Truncated parameter: #{size} set, #{bytes.length} available")
30
+
31
+ # Create chunk based on type
32
+ case type
33
+ when PARAM_IPV4
34
+ parameter = IpAddress.from_bytes(type, size, bytes[4..-1])
35
+ when PARAM_IPV6
36
+ parameter = IpAddress.from_bytes(type, size, bytes[4..-1])
37
+ when PARAM_STATE_COOKIE
38
+ parameter = dummy_parameter(type, size, bytes)
39
+ when PARAM_COOKIE_PRESERVATIVE
40
+ parameter = dummy_parameter(type, size, bytes)
41
+ when PARAM_HOST_NAME_ADDR
42
+ parameter = dummy_parameter(type, size, bytes)
43
+ when PARAM_SUPPORTED_ADDR_TYPES
44
+ parameter = dummy_parameter(type, size, bytes)
45
+ when PARAM_ECN
46
+ parameter = dummy_parameter(type, size, bytes)
47
+ when PARAM_RANDOM
48
+ parameter = dummy_parameter(type, size, bytes)
49
+ when PARAM_CHUNK_LIST
50
+ parameter = dummy_parameter(type, size, bytes)
51
+ when PARAM_HMAC_ALGORITHM
52
+ parameter = dummy_parameter(type, size, bytes)
53
+ when PARAM_PADDING
54
+ parameter = dummy_parameter(type, size, bytes)
55
+ when PARAM_SUPPORTED_EXTENSIONS
56
+ parameter = dummy_parameter(type, size, bytes)
57
+ when PARAM_FORWARD_TSN
58
+ parameter = dummy_parameter(type, size, bytes)
59
+ when PARAM_SET_PRIMARY_ADDR
60
+ parameter = dummy_parameter(type, size, bytes)
61
+ when PARAM_ADAPTATION_LAYER_INDICATION
62
+ parameter = dummy_parameter(type, size, bytes)
63
+ else
64
+ parameter = dummy_parameter(type, size, bytes)
65
+ end
66
+
67
+ # Return the result
68
+ return parameter
69
+ end
70
+
71
+ def write io, ip
72
+ header = [@type, @size].pack('nn')
73
+
74
+ # Write Parameter header followed by the payload
75
+ io.write(header)
76
+ io.write(@payload_raw)
77
+ end
78
+
79
+ def padded_size
80
+ if 0 == @size % 4
81
+ return @size
82
+ else
83
+ return (@size + 4 - (@size % 4))
84
+ end
85
+ end
86
+
87
+ def to_s
88
+ return "parameter(%d, %d)" % [@type, @size]
89
+ end
90
+
91
+ def self.dummy_parameter type, size, bytes
92
+ # Create new dummy parameter
93
+ parameter = Parameter.new
94
+ parameter.type = type
95
+ parameter.size = size
96
+
97
+ # Save the payload
98
+ parameter.payload = bytes[4..parameter.padded_size - 1]
99
+ parameter.payload_raw = parameter.payload
100
+
101
+ # Return the result
102
+ return parameter
103
+ end
104
+ end # class Parameter
105
+
106
+ end # class SCTP
107
+ end # class Pcap
108
+ end # module Mu
109
+
110
+ require 'mu/pcap/sctp/parameter/ip_address'