trema 0.1.3

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.
Files changed (560) hide show
  1. data/.mono.rant +4107 -0
  2. data/.rspec +1 -0
  3. data/.yardopts +4 -0
  4. data/Doxyfile +1679 -0
  5. data/GPL2 +339 -0
  6. data/Gemfile +22 -0
  7. data/Gemfile.lock +71 -0
  8. data/README.md +135 -0
  9. data/Rakefile +140 -0
  10. data/Rantfile +834 -0
  11. data/VERSION +1 -0
  12. data/build.rb +32 -0
  13. data/cruise.rb +389 -0
  14. data/features/example.dumper.feature +87 -0
  15. data/features/example.learning_switch.feature +39 -0
  16. data/features/example.list_switches.feature +38 -0
  17. data/features/example.message.echo_reply.feature +26 -0
  18. data/features/example.message.echo_request.feature +25 -0
  19. data/features/example.message.features_request.feature +84 -0
  20. data/features/example.message.hello.feature +25 -0
  21. data/features/example.message.set_config.feature +27 -0
  22. data/features/example.multi_learning_switch.feature +135 -0
  23. data/features/example.packetin_filter_config.feature +91 -0
  24. data/features/example.repeater_hub.feature +49 -0
  25. data/features/example.switch_monitor.feature +39 -0
  26. data/features/packetin_filter.feature +49 -0
  27. data/features/step_definitions/kill_steps.rb +30 -0
  28. data/features/step_definitions/log_steps.rb +90 -0
  29. data/features/step_definitions/misc_steps.rb +64 -0
  30. data/features/step_definitions/off_steps.rb +30 -0
  31. data/features/step_definitions/run_steps.rb +91 -0
  32. data/features/step_definitions/send_packets_steps.rb +42 -0
  33. data/features/step_definitions/show_stats_steps.rb +43 -0
  34. data/features/step_definitions/stats_steps.rb +39 -0
  35. data/features/support/env.rb +75 -0
  36. data/features/support/hooks.rb +8 -0
  37. data/features/switch_manager.feature +35 -0
  38. data/features/trema-config.feature +68 -0
  39. data/features/trema.dump_flows.feature +25 -0
  40. data/features/trema.feature +25 -0
  41. data/features/trema.kill.feature +53 -0
  42. data/features/trema.killall.feature +30 -0
  43. data/features/trema.reset_stats.feature +14 -0
  44. data/features/trema.run.feature +46 -0
  45. data/features/trema.send_packets.feature +56 -0
  46. data/features/trema.show_stats.feature +67 -0
  47. data/features/tutorial.hello_trema.feature +27 -0
  48. data/features/tutorial.packet_in.feature +47 -0
  49. data/features/tutorial.switch_info.feature +55 -0
  50. data/ruby/.gitignore +4 -0
  51. data/ruby/blocker.rb +78 -0
  52. data/ruby/extconf.rb +71 -0
  53. data/ruby/sub-process.rb +291 -0
  54. data/ruby/trema/action-common.c +60 -0
  55. data/ruby/trema/action-common.h +42 -0
  56. data/ruby/trema/action-enqueue.c +161 -0
  57. data/ruby/trema/action-enqueue.h +40 -0
  58. data/ruby/trema/action-output.c +169 -0
  59. data/ruby/trema/action-output.h +42 -0
  60. data/ruby/trema/action-set-dl-dst.c +131 -0
  61. data/ruby/trema/action-set-dl-dst.h +44 -0
  62. data/ruby/trema/action-set-dl-src.c +131 -0
  63. data/ruby/trema/action-set-dl-src.h +44 -0
  64. data/ruby/trema/action-set-nw-dst.c +135 -0
  65. data/ruby/trema/action-set-nw-dst.h +42 -0
  66. data/ruby/trema/action-set-nw-src.c +140 -0
  67. data/ruby/trema/action-set-nw-src.h +42 -0
  68. data/ruby/trema/action-set-nw-tos.c +124 -0
  69. data/ruby/trema/action-set-nw-tos.h +42 -0
  70. data/ruby/trema/action-set-tp-dst.c +122 -0
  71. data/ruby/trema/action-set-tp-dst.h +42 -0
  72. data/ruby/trema/action-set-tp-src.c +124 -0
  73. data/ruby/trema/action-set-tp-src.h +42 -0
  74. data/ruby/trema/action-set-vlan-pcp.c +128 -0
  75. data/ruby/trema/action-set-vlan-pcp.h +42 -0
  76. data/ruby/trema/action-set-vlan-vid.c +125 -0
  77. data/ruby/trema/action-set-vlan-vid.h +42 -0
  78. data/ruby/trema/action-strip-vlan.c +81 -0
  79. data/ruby/trema/action-strip-vlan.h +42 -0
  80. data/ruby/trema/action-vendor.c +121 -0
  81. data/ruby/trema/action-vendor.h +42 -0
  82. data/ruby/trema/aggregate-stats-reply.rb +70 -0
  83. data/ruby/trema/app.rb +112 -0
  84. data/ruby/trema/barrier-reply.c +99 -0
  85. data/ruby/trema/barrier-reply.h +46 -0
  86. data/ruby/trema/barrier-request.c +108 -0
  87. data/ruby/trema/barrier-request.h +44 -0
  88. data/ruby/trema/cli.rb +269 -0
  89. data/ruby/trema/command.rb +40 -0
  90. data/ruby/trema/command/dump_flows.rb +62 -0
  91. data/ruby/trema/command/kill.rb +71 -0
  92. data/ruby/trema/command/killall.rb +56 -0
  93. data/ruby/trema/command/reset_stats.rb +61 -0
  94. data/ruby/trema/command/ruby.rb +55 -0
  95. data/ruby/trema/command/run.rb +120 -0
  96. data/ruby/trema/command/send_packets.rb +130 -0
  97. data/ruby/trema/command/shell.rb +61 -0
  98. data/ruby/trema/command/show_stats.rb +84 -0
  99. data/ruby/trema/command/usage.rb +61 -0
  100. data/ruby/trema/command/version.rb +39 -0
  101. data/ruby/trema/controller.c +595 -0
  102. data/ruby/trema/controller.h +44 -0
  103. data/ruby/trema/controller.rb +81 -0
  104. data/ruby/trema/daemon.rb +167 -0
  105. data/ruby/trema/dsl.rb +34 -0
  106. data/ruby/trema/dsl/configuration.rb +153 -0
  107. data/ruby/trema/dsl/context.rb +71 -0
  108. data/ruby/trema/dsl/link.rb +41 -0
  109. data/ruby/trema/dsl/parser.rb +70 -0
  110. data/ruby/trema/dsl/run.rb +49 -0
  111. data/ruby/trema/dsl/runner.rb +165 -0
  112. data/ruby/trema/dsl/stanza.rb +53 -0
  113. data/ruby/trema/dsl/switch.rb +78 -0
  114. data/ruby/trema/dsl/syntax-error.rb +33 -0
  115. data/ruby/trema/dsl/syntax.rb +109 -0
  116. data/ruby/trema/dsl/vhost.rb +108 -0
  117. data/ruby/trema/dsl/vswitch.rb +47 -0
  118. data/ruby/trema/echo-reply.c +107 -0
  119. data/ruby/trema/echo-reply.h +42 -0
  120. data/ruby/trema/echo-request.c +140 -0
  121. data/ruby/trema/echo-request.h +42 -0
  122. data/ruby/trema/error.c +253 -0
  123. data/ruby/trema/error.h +44 -0
  124. data/ruby/trema/exact-match.rb +36 -0
  125. data/ruby/trema/executables.rb +95 -0
  126. data/ruby/trema/features-reply.c +238 -0
  127. data/ruby/trema/features-reply.h +60 -0
  128. data/ruby/trema/features-request.c +109 -0
  129. data/ruby/trema/features-request.h +44 -0
  130. data/ruby/trema/flow-removed.c +275 -0
  131. data/ruby/trema/flow-removed.h +46 -0
  132. data/ruby/trema/flow-stats-reply.rb +109 -0
  133. data/ruby/trema/flow.rb +56 -0
  134. data/ruby/trema/get-config-reply.c +159 -0
  135. data/ruby/trema/get-config-reply.h +52 -0
  136. data/ruby/trema/get-config-request.c +107 -0
  137. data/ruby/trema/get-config-request.h +44 -0
  138. data/ruby/trema/hello.c +110 -0
  139. data/ruby/trema/hello.h +44 -0
  140. data/ruby/trema/host.rb +257 -0
  141. data/ruby/trema/ip.rb +101 -0
  142. data/ruby/trema/link.rb +176 -0
  143. data/ruby/trema/list-switches-reply.c +46 -0
  144. data/ruby/trema/list-switches-reply.h +40 -0
  145. data/ruby/trema/logger.c +162 -0
  146. data/ruby/trema/logger.h +44 -0
  147. data/ruby/trema/mac.rb +151 -0
  148. data/ruby/trema/match.c +594 -0
  149. data/ruby/trema/match.h +36 -0
  150. data/ruby/trema/monkey-patch/integer.rb +35 -0
  151. data/ruby/trema/monkey-patch/integer/base-conversions.rb +36 -0
  152. data/ruby/trema/monkey-patch/integer/ranges.rb +51 -0
  153. data/ruby/trema/monkey-patch/module.rb +33 -0
  154. data/ruby/trema/monkey-patch/module/deprecation.rb +41 -0
  155. data/ruby/trema/monkey-patch/string.rb +33 -0
  156. data/ruby/trema/monkey-patch/string/inflectors.rb +54 -0
  157. data/ruby/trema/network-component.rb +153 -0
  158. data/ruby/trema/ofctl.rb +62 -0
  159. data/ruby/trema/open-vswitch.rb +154 -0
  160. data/ruby/trema/openflow-error.c +191 -0
  161. data/ruby/trema/openflow-error.h +53 -0
  162. data/ruby/trema/openflow-switch.rb +88 -0
  163. data/ruby/trema/ordered-hash.rb +74 -0
  164. data/ruby/trema/packet-queue.rb +178 -0
  165. data/ruby/trema/packet_in.c +736 -0
  166. data/ruby/trema/packet_in.h +46 -0
  167. data/ruby/trema/packetin-filter.rb +126 -0
  168. data/ruby/trema/path.rb +135 -0
  169. data/ruby/trema/phost.rb +69 -0
  170. data/ruby/trema/port-mod.c +226 -0
  171. data/ruby/trema/port-mod.h +36 -0
  172. data/ruby/trema/port-stats-reply.rb +111 -0
  173. data/ruby/trema/port-status.c +156 -0
  174. data/ruby/trema/port-status.h +45 -0
  175. data/ruby/trema/port.c +295 -0
  176. data/ruby/trema/port.h +47 -0
  177. data/ruby/trema/process.rb +76 -0
  178. data/ruby/trema/queue-get-config-reply.c +200 -0
  179. data/ruby/trema/queue-get-config-reply.h +47 -0
  180. data/ruby/trema/queue-get-config-request.c +141 -0
  181. data/ruby/trema/queue-get-config-request.h +44 -0
  182. data/ruby/trema/queue-stats-reply.rb +78 -0
  183. data/ruby/trema/set-config.c +171 -0
  184. data/ruby/trema/set-config.h +44 -0
  185. data/ruby/trema/shell.rb +39 -0
  186. data/ruby/trema/shell/down.rb +39 -0
  187. data/ruby/trema/shell/killall.rb +40 -0
  188. data/ruby/trema/shell/link.rb +61 -0
  189. data/ruby/trema/shell/reset_stats.rb +50 -0
  190. data/ruby/trema/shell/run.rb +67 -0
  191. data/ruby/trema/shell/send_packets.rb +42 -0
  192. data/ruby/trema/shell/show_stats.rb +49 -0
  193. data/ruby/trema/shell/up.rb +43 -0
  194. data/ruby/trema/shell/vhost.rb +44 -0
  195. data/ruby/trema/shell/vswitch.rb +49 -0
  196. data/ruby/trema/stats-helper.rb +65 -0
  197. data/ruby/trema/stats-reply.c +483 -0
  198. data/ruby/trema/stats-reply.h +53 -0
  199. data/ruby/trema/stats-request.c +634 -0
  200. data/ruby/trema/stats-request.h +42 -0
  201. data/ruby/trema/switch-daemon.rb +74 -0
  202. data/ruby/trema/switch-disconnected.c +40 -0
  203. data/ruby/trema/switch-disconnected.h +38 -0
  204. data/ruby/trema/switch-manager.rb +121 -0
  205. data/ruby/trema/switch.rb +37 -0
  206. data/ruby/trema/table-stats-reply.rb +87 -0
  207. data/ruby/trema/timers.rb +97 -0
  208. data/ruby/trema/trema.c +122 -0
  209. data/ruby/trema/tremashark.rb +39 -0
  210. data/ruby/trema/util.rb +84 -0
  211. data/ruby/trema/vendor-request.c +193 -0
  212. data/ruby/trema/vendor-request.h +44 -0
  213. data/ruby/trema/vendor-stats-reply.rb +62 -0
  214. data/ruby/trema/vendor.c +152 -0
  215. data/ruby/trema/vendor.h +52 -0
  216. data/ruby/trema/version.rb +30 -0
  217. data/spec/spec_helper.rb +153 -0
  218. data/spec/support/openflow-message.rb +94 -0
  219. data/spec/trema/action-enqueue_spec.rb +100 -0
  220. data/spec/trema/action-output_spec.rb +116 -0
  221. data/spec/trema/action-set-dl-dst_spec.rb +95 -0
  222. data/spec/trema/action-set-dl-src_spec.rb +92 -0
  223. data/spec/trema/action-set-nw-dst_spec.rb +96 -0
  224. data/spec/trema/action-set-nw-src_spec.rb +97 -0
  225. data/spec/trema/action-set-nw-tos_spec.rb +88 -0
  226. data/spec/trema/action-set-tp-dst_spec.rb +88 -0
  227. data/spec/trema/action-set-tp-src_spec.rb +88 -0
  228. data/spec/trema/action-set-vlan-pcp_spec.rb +91 -0
  229. data/spec/trema/action-set-vlan-vid_spec.rb +91 -0
  230. data/spec/trema/action-strip-vlan_spec.rb +57 -0
  231. data/spec/trema/action-vendor_spec.rb +90 -0
  232. data/spec/trema/app_spec.rb +90 -0
  233. data/spec/trema/barrier-reply_spec.rb +45 -0
  234. data/spec/trema/barrier-request_spec.rb +83 -0
  235. data/spec/trema/cli_spec.rb +160 -0
  236. data/spec/trema/controller_spec.rb +100 -0
  237. data/spec/trema/dsl/configuration_spec.rb +122 -0
  238. data/spec/trema/dsl/link_spec.rb +54 -0
  239. data/spec/trema/dsl/run_spec.rb +78 -0
  240. data/spec/trema/dsl/runner_spec.rb +239 -0
  241. data/spec/trema/dsl/switch_spec.rb +77 -0
  242. data/spec/trema/dsl/syntax_spec.rb +121 -0
  243. data/spec/trema/dsl/vhost_spec.rb +148 -0
  244. data/spec/trema/dsl/vswitch_spec.rb +90 -0
  245. data/spec/trema/echo-reply_spec.rb +49 -0
  246. data/spec/trema/echo-request_spec.rb +75 -0
  247. data/spec/trema/error_spec.rb +142 -0
  248. data/spec/trema/executables_spec.rb +75 -0
  249. data/spec/trema/features-reply_spec.rb +57 -0
  250. data/spec/trema/features-request_spec.rb +66 -0
  251. data/spec/trema/flow-removed_spec.rb +146 -0
  252. data/spec/trema/get-config-reply_spec.rb +43 -0
  253. data/spec/trema/get-config-request_spec.rb +82 -0
  254. data/spec/trema/hello_spec.rb +49 -0
  255. data/spec/trema/host_spec.rb +193 -0
  256. data/spec/trema/link_spec.rb +64 -0
  257. data/spec/trema/list-switches-reply_spec.rb +48 -0
  258. data/spec/trema/logger_spec.rb +48 -0
  259. data/spec/trema/mac_spec.rb +115 -0
  260. data/spec/trema/match_spec.rb +113 -0
  261. data/spec/trema/open-vswitch_spec.rb +123 -0
  262. data/spec/trema/openflow-error_spec.rb +141 -0
  263. data/spec/trema/openflow-switch_spec.rb +56 -0
  264. data/spec/trema/packet-in_spec.rb +168 -0
  265. data/spec/trema/packet-out_spec.rb +128 -0
  266. data/spec/trema/packetin-filter_spec.rb +41 -0
  267. data/spec/trema/port-mod_spec.rb +101 -0
  268. data/spec/trema/port-status_spec.rb +108 -0
  269. data/spec/trema/port_spec.rb +61 -0
  270. data/spec/trema/process_spec.rb +71 -0
  271. data/spec/trema/queue-get-config-reply_spec.rb +66 -0
  272. data/spec/trema/queue-get-config-request_spec.rb +69 -0
  273. data/spec/trema/set-config_spec.rb +80 -0
  274. data/spec/trema/shell/vhost_spec.rb +57 -0
  275. data/spec/trema/shell/vswitch_spec.rb +89 -0
  276. data/spec/trema/stats-reply_spec.rb +306 -0
  277. data/spec/trema/stats-request_spec.rb +151 -0
  278. data/spec/trema/switch-disconnected_spec.rb +58 -0
  279. data/spec/trema/switch-manager_spec.rb +43 -0
  280. data/spec/trema/tremashark_spec.rb +41 -0
  281. data/spec/trema/util_spec.rb +93 -0
  282. data/spec/trema/vendor-request_spec.rb +79 -0
  283. data/src/examples/cbench_switch/README +21 -0
  284. data/src/examples/cbench_switch/cbench-switch.rb +39 -0
  285. data/src/examples/cbench_switch/cbench_switch.c +68 -0
  286. data/src/examples/dumper/dumper.c +370 -0
  287. data/src/examples/dumper/dumper.conf +7 -0
  288. data/src/examples/dumper/dumper.rb +196 -0
  289. data/src/examples/hello_trema/README +13 -0
  290. data/src/examples/hello_trema/hello_trema.c +51 -0
  291. data/src/examples/hello_trema/hello_trema.conf +3 -0
  292. data/src/examples/hello_trema/hello_trema.rb +35 -0
  293. data/src/examples/learning_switch/README +15 -0
  294. data/src/examples/learning_switch/fdb.rb +112 -0
  295. data/src/examples/learning_switch/learning-switch.rb +88 -0
  296. data/src/examples/learning_switch/learning_switch.c +236 -0
  297. data/src/examples/learning_switch/learning_switch.conf +18 -0
  298. data/src/examples/list_switches/README +19 -0
  299. data/src/examples/list_switches/list-switches.rb +45 -0
  300. data/src/examples/list_switches/list_switches.c +81 -0
  301. data/src/examples/list_switches/list_switches.conf +15 -0
  302. data/src/examples/match_compare/match-compare.conf +30 -0
  303. data/src/examples/match_compare/match-compare.rb +99 -0
  304. data/src/examples/multi_learning_switch/README +14 -0
  305. data/src/examples/multi_learning_switch/multi-learning-switch.rb +96 -0
  306. data/src/examples/multi_learning_switch/multi_learning_switch.c +296 -0
  307. data/src/examples/multi_learning_switch/multi_learning_switch.conf +17 -0
  308. data/src/examples/openflow_message/README +11 -0
  309. data/src/examples/openflow_message/echo-reply.rb +59 -0
  310. data/src/examples/openflow_message/echo-request.rb +58 -0
  311. data/src/examples/openflow_message/echo_reply.c +70 -0
  312. data/src/examples/openflow_message/echo_request.c +70 -0
  313. data/src/examples/openflow_message/example.rb +63 -0
  314. data/src/examples/openflow_message/features-request.rb +97 -0
  315. data/src/examples/openflow_message/features_request.c +168 -0
  316. data/src/examples/openflow_message/hello.c +70 -0
  317. data/src/examples/openflow_message/hello.rb +58 -0
  318. data/src/examples/openflow_message/set-config.rb +59 -0
  319. data/src/examples/openflow_message/set_config.c +70 -0
  320. data/src/examples/packet_in/README +15 -0
  321. data/src/examples/packet_in/packet_in.c +55 -0
  322. data/src/examples/packet_in/packet_in.conf +15 -0
  323. data/src/examples/packet_in/packet_in.rb +34 -0
  324. data/src/examples/packetin_filter_config/README +12 -0
  325. data/src/examples/packetin_filter_config/add_filter.c +73 -0
  326. data/src/examples/packetin_filter_config/delete_filter.c +65 -0
  327. data/src/examples/packetin_filter_config/delete_filter_strict.c +75 -0
  328. data/src/examples/packetin_filter_config/dump_filter.c +65 -0
  329. data/src/examples/packetin_filter_config/dump_filter_strict.c +75 -0
  330. data/src/examples/packetin_filter_config/packetin_filter_config.c +134 -0
  331. data/src/examples/packetin_filter_config/packetin_filter_config.conf +7 -0
  332. data/src/examples/packetin_filter_config/utils.c +102 -0
  333. data/src/examples/packetin_filter_config/utils.h +42 -0
  334. data/src/examples/repeater_hub/README +8 -0
  335. data/src/examples/repeater_hub/repeater-hub.rb +43 -0
  336. data/src/examples/repeater_hub/repeater-hub_spec.rb +156 -0
  337. data/src/examples/repeater_hub/repeater_hub.c +83 -0
  338. data/src/examples/repeater_hub/repeater_hub.conf +28 -0
  339. data/src/examples/switch_info/README +13 -0
  340. data/src/examples/switch_info/switch_info.c +80 -0
  341. data/src/examples/switch_info/switch_info.conf +3 -0
  342. data/src/examples/switch_info/switch_info.rb +46 -0
  343. data/src/examples/switch_monitor/switch-monitor.conf +3 -0
  344. data/src/examples/switch_monitor/switch-monitor.rb +58 -0
  345. data/src/examples/switch_monitor/switch_monitor.c +154 -0
  346. data/src/examples/traffic_monitor/counter.c +74 -0
  347. data/src/examples/traffic_monitor/counter.h +48 -0
  348. data/src/examples/traffic_monitor/counter.rb +46 -0
  349. data/src/examples/traffic_monitor/fdb.c +76 -0
  350. data/src/examples/traffic_monitor/fdb.h +50 -0
  351. data/src/examples/traffic_monitor/fdb.rb +44 -0
  352. data/src/examples/traffic_monitor/traffic-monitor.rb +100 -0
  353. data/src/examples/traffic_monitor/traffic_monitor.c +163 -0
  354. data/src/examples/traffic_monitor/traffic_monitor.conf +16 -0
  355. data/src/lib/arp.h +61 -0
  356. data/src/lib/bool.h +49 -0
  357. data/src/lib/buffer.c +305 -0
  358. data/src/lib/buffer.h +56 -0
  359. data/src/lib/byteorder.c +547 -0
  360. data/src/lib/byteorder.h +110 -0
  361. data/src/lib/checks.h +42 -0
  362. data/src/lib/daemon.c +302 -0
  363. data/src/lib/daemon.h +42 -0
  364. data/src/lib/doubly_linked_list.c +281 -0
  365. data/src/lib/doubly_linked_list.h +88 -0
  366. data/src/lib/ether.c +48 -0
  367. data/src/lib/ether.h +94 -0
  368. data/src/lib/etherip.h +46 -0
  369. data/src/lib/event_handler.c +389 -0
  370. data/src/lib/event_handler.h +64 -0
  371. data/src/lib/hash_table.c +417 -0
  372. data/src/lib/hash_table.h +138 -0
  373. data/src/lib/icmp.h +74 -0
  374. data/src/lib/igmp.h +50 -0
  375. data/src/lib/ipv4.h +50 -0
  376. data/src/lib/linked_list.c +199 -0
  377. data/src/lib/linked_list.h +84 -0
  378. data/src/lib/log.c +402 -0
  379. data/src/lib/log.h +78 -0
  380. data/src/lib/match.h +84 -0
  381. data/src/lib/match_table.c +608 -0
  382. data/src/lib/match_table.h +51 -0
  383. data/src/lib/message_queue.c +143 -0
  384. data/src/lib/message_queue.h +61 -0
  385. data/src/lib/messenger.c +1714 -0
  386. data/src/lib/messenger.h +145 -0
  387. data/src/lib/openflow_application_interface.c +1673 -0
  388. data/src/lib/openflow_application_interface.h +329 -0
  389. data/src/lib/openflow_message.c +4051 -0
  390. data/src/lib/openflow_message.h +288 -0
  391. data/src/lib/openflow_service_interface.h +59 -0
  392. data/src/lib/packet_info.c +230 -0
  393. data/src/lib/packet_info.h +209 -0
  394. data/src/lib/packet_parser.c +502 -0
  395. data/src/lib/packetin_filter_interface.c +294 -0
  396. data/src/lib/packetin_filter_interface.h +127 -0
  397. data/src/lib/persistent_storage.c +480 -0
  398. data/src/lib/persistent_storage.h +46 -0
  399. data/src/lib/stat.c +213 -0
  400. data/src/lib/stat.h +44 -0
  401. data/src/lib/tcp.h +67 -0
  402. data/src/lib/timer.c +350 -0
  403. data/src/lib/timer.h +53 -0
  404. data/src/lib/trema.c +710 -0
  405. data/src/lib/trema.h +79 -0
  406. data/src/lib/trema_private.c +177 -0
  407. data/src/lib/trema_private.h +60 -0
  408. data/src/lib/trema_wrapper.c +56 -0
  409. data/src/lib/trema_wrapper.h +64 -0
  410. data/src/lib/udp.h +43 -0
  411. data/src/lib/utility.c +515 -0
  412. data/src/lib/utility.h +67 -0
  413. data/src/lib/wrapper.c +100 -0
  414. data/src/lib/wrapper.h +76 -0
  415. data/src/packetin_filter/README +17 -0
  416. data/src/packetin_filter/packetin_filter.c +575 -0
  417. data/src/switch_manager/README +20 -0
  418. data/src/switch_manager/cookie_table.c +292 -0
  419. data/src/switch_manager/cookie_table.h +72 -0
  420. data/src/switch_manager/dpid_table.c +110 -0
  421. data/src/switch_manager/dpid_table.h +46 -0
  422. data/src/switch_manager/management_interface.h +44 -0
  423. data/src/switch_manager/ofpmsg_recv.c +482 -0
  424. data/src/switch_manager/ofpmsg_recv.h +42 -0
  425. data/src/switch_manager/ofpmsg_send.c +235 -0
  426. data/src/switch_manager/ofpmsg_send.h +50 -0
  427. data/src/switch_manager/secure_channel_listener.c +281 -0
  428. data/src/switch_manager/secure_channel_listener.h +42 -0
  429. data/src/switch_manager/secure_channel_receiver.c +126 -0
  430. data/src/switch_manager/secure_channel_receiver.h +43 -0
  431. data/src/switch_manager/secure_channel_sender.c +126 -0
  432. data/src/switch_manager/secure_channel_sender.h +43 -0
  433. data/src/switch_manager/service_interface.c +181 -0
  434. data/src/switch_manager/service_interface.h +46 -0
  435. data/src/switch_manager/switch.c +538 -0
  436. data/src/switch_manager/switch.h +51 -0
  437. data/src/switch_manager/switch_manager.c +448 -0
  438. data/src/switch_manager/switch_manager.h +63 -0
  439. data/src/switch_manager/switchinfo.h +72 -0
  440. data/src/switch_manager/xid_table.c +184 -0
  441. data/src/switch_manager/xid_table.h +56 -0
  442. data/src/tremashark/README +78 -0
  443. data/src/tremashark/packet_capture.c +357 -0
  444. data/src/tremashark/pcap_private.h +47 -0
  445. data/src/tremashark/pcap_queue.c +197 -0
  446. data/src/tremashark/pcap_queue.h +58 -0
  447. data/src/tremashark/plugin/.gitignore +6 -0
  448. data/src/tremashark/plugin/packet-trema/.gitignore +5 -0
  449. data/src/tremashark/plugin/packet-trema/Makefile +77 -0
  450. data/src/tremashark/plugin/packet-trema/Makefile.am +110 -0
  451. data/src/tremashark/plugin/packet-trema/Makefile.common +31 -0
  452. data/src/tremashark/plugin/packet-trema/moduleinfo.h +41 -0
  453. data/src/tremashark/plugin/packet-trema/packet-trema.c +1659 -0
  454. data/src/tremashark/plugin/packet-trema/plugin.c +31 -0
  455. data/src/tremashark/plugin/user_dlts +2 -0
  456. data/src/tremashark/queue.c +168 -0
  457. data/src/tremashark/queue.h +60 -0
  458. data/src/tremashark/stdin_relay.c +257 -0
  459. data/src/tremashark/syslog_relay.c +247 -0
  460. data/src/tremashark/tremashark.c +556 -0
  461. data/trema +93 -0
  462. data/trema-config +61 -0
  463. data/unittests/buffer_stubs.c +74 -0
  464. data/unittests/cmockery_trema.c +123 -0
  465. data/unittests/cmockery_trema.h +96 -0
  466. data/unittests/lib/buffer_test.c +370 -0
  467. data/unittests/lib/byteorder_test.c +1717 -0
  468. data/unittests/lib/daemon_test.c +664 -0
  469. data/unittests/lib/doubly_linked_list_test.c +346 -0
  470. data/unittests/lib/ether_test.c +127 -0
  471. data/unittests/lib/hash_table_test.c +278 -0
  472. data/unittests/lib/linked_list_test.c +343 -0
  473. data/unittests/lib/log_test.c +459 -0
  474. data/unittests/lib/match_table_test.c +1509 -0
  475. data/unittests/lib/message_queue_test.c +379 -0
  476. data/unittests/lib/messenger_test.c +438 -0
  477. data/unittests/lib/openflow_application_interface_test.c +3488 -0
  478. data/unittests/lib/openflow_message_test.c +7337 -0
  479. data/unittests/lib/packet_info_test.c +544 -0
  480. data/unittests/lib/packet_parser_test.c +703 -0
  481. data/unittests/lib/packetin_filter_interface_test.c +723 -0
  482. data/unittests/lib/persistent_storage_test.c +802 -0
  483. data/unittests/lib/stat_test.c +291 -0
  484. data/unittests/lib/test_packets/arp_rep.cap +0 -0
  485. data/unittests/lib/test_packets/arp_req.cap +0 -0
  486. data/unittests/lib/test_packets/icmp_echo_rep.cap +0 -0
  487. data/unittests/lib/test_packets/icmp_echo_req.cap +0 -0
  488. data/unittests/lib/test_packets/igmp_query_v2.cap +0 -0
  489. data/unittests/lib/test_packets/ipx.cap +0 -0
  490. data/unittests/lib/test_packets/lldp.cap +0 -0
  491. data/unittests/lib/test_packets/lldp_over_ip.cap +0 -0
  492. data/unittests/lib/test_packets/tcp.cap +0 -0
  493. data/unittests/lib/test_packets/tcp_syn.cap +0 -0
  494. data/unittests/lib/test_packets/udp.cap +0 -0
  495. data/unittests/lib/test_packets/udp_frag_head.cap +0 -0
  496. data/unittests/lib/test_packets/udp_frag_next.cap +0 -0
  497. data/unittests/lib/test_packets/vtag_icmp_echo_rep.cap +0 -0
  498. data/unittests/lib/test_packets/vtag_icmp_echo_req.cap +0 -0
  499. data/unittests/lib/timer_test.c +248 -0
  500. data/unittests/lib/trema_private_test.c +323 -0
  501. data/unittests/lib/trema_test.c +985 -0
  502. data/unittests/lib/utility_test.c +628 -0
  503. data/unittests/lib/wrapper_test.c +201 -0
  504. data/unittests/packetin_filter/packetin_filter_test.c +477 -0
  505. data/unittests/switch_manager/switch_manager_test.c +1178 -0
  506. data/unittests/wrapper_stubs.c +39 -0
  507. data/vendor/.gitignore +6 -0
  508. data/vendor/README +30 -0
  509. data/vendor/cmockery-20110428.tar.gz +0 -0
  510. data/vendor/oflops-0.03.tar.gz +0 -0
  511. data/vendor/oflops_no_snmp+1.0.0.patch +340 -0
  512. data/vendor/openflow-1.0.0.tar.gz +0 -0
  513. data/vendor/openflow.git.tar.gz +0 -0
  514. data/vendor/openvswitch-1.2.2.tar.gz +0 -0
  515. data/vendor/ruby-ifconfig-1.2/COPYING +340 -0
  516. data/vendor/ruby-ifconfig-1.2/Changelog +16 -0
  517. data/vendor/ruby-ifconfig-1.2/INSTALL +239 -0
  518. data/vendor/ruby-ifconfig-1.2/README +38 -0
  519. data/vendor/ruby-ifconfig-1.2/Rakefile +14 -0
  520. data/vendor/ruby-ifconfig-1.2/TODO +8 -0
  521. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/darwin.txt +17 -0
  522. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd.txt +10 -0
  523. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd_netstat.txt +14 -0
  524. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd.txt +17 -0
  525. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd_netstat.txt +24 -0
  526. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux.txt +60 -0
  527. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux_ethernet.txt +20 -0
  528. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/netbsd.txt +10 -0
  529. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/openbsd.txt +36 -0
  530. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/sunos.txt +10 -0
  531. data/vendor/ruby-ifconfig-1.2/lib/ifconfig.rb +71 -0
  532. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/ifconfig.rb +72 -0
  533. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/interface_types.rb +69 -0
  534. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/network_types.rb +3 -0
  535. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/ifconfig.rb +84 -0
  536. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/interface_types.rb +130 -0
  537. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/network_types.rb +49 -0
  538. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/ifconfig.rb +43 -0
  539. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/interface_types.rb +112 -0
  540. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/network_types.rb +55 -0
  541. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/ifconfig.rb +38 -0
  542. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/interface_types.rb +77 -0
  543. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/network_types.rb +4 -0
  544. data/vendor/ruby-ifconfig-1.2/setup.rb +1306 -0
  545. data/vendor/ruby-ifconfig-1.2/test/test_bsd.rb +35 -0
  546. data/vendor/ruby-ifconfig-1.2/test/test_darwin.rb +33 -0
  547. data/vendor/ruby-ifconfig-1.2/test/test_dragonflybsd.rb +35 -0
  548. data/vendor/ruby-ifconfig-1.2/test/test_helper.rb +4 -0
  549. data/vendor/ruby-ifconfig-1.2/test/test_linux.rb +31 -0
  550. data/vendor/ruby-ifconfig-1.2/test/test_netbsd.rb +33 -0
  551. data/vendor/ruby-ifconfig-1.2/test/test_openbsd.rb +33 -0
  552. data/vendor/ruby-ifconfig-1.2/test/test_sunos.rb +35 -0
  553. data/vendor/ruby-ifconfig-1.2/test/unit/tc_darwin.rb +40 -0
  554. data/vendor/ruby-ifconfig-1.2/test/unit/tc_dragonflybsd.rb +39 -0
  555. data/vendor/ruby-ifconfig-1.2/test/unit/tc_freebsd.rb +40 -0
  556. data/vendor/ruby-ifconfig-1.2/test/unit/tc_linux.rb +49 -0
  557. data/vendor/ruby-ifconfig-1.2/test/unit/tc_netbsd.rb +39 -0
  558. data/vendor/ruby-ifconfig-1.2/test/unit/tc_openbsd.rb +39 -0
  559. data/vendor/ruby-ifconfig-1.2/test/unit/tc_sunos.rb +44 -0
  560. metadata +856 -0
@@ -0,0 +1,209 @@
1
+ /*
2
+ * Functions for accessing commonly-used header fields values.
3
+ *
4
+ * Author: Kazuya Suzuki
5
+ *
6
+ * Copyright (C) 2008-2012 NEC Corporation
7
+ *
8
+ * This program is free software; you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License, version 2, as
10
+ * published by the Free Software Foundation.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+
23
+ #ifndef PACKET_INFO_H
24
+ #define PACKET_INFO_H
25
+
26
+
27
+ #include "arp.h"
28
+ #include "checks.h"
29
+ #include "bool.h"
30
+ #include "ether.h"
31
+ #include "icmp.h"
32
+ #include "igmp.h"
33
+ #include "ipv4.h"
34
+ #include "tcp.h"
35
+ #include "udp.h"
36
+ #include "etherip.h"
37
+
38
+
39
+ enum {
40
+ ETH_DIX = 0x00000001,
41
+ ETH_8023_RAW = 0x00000002,
42
+ ETH_8023_LLC = 0x00000004,
43
+ ETH_8023_SNAP = 0x00000008,
44
+ ETH_8021Q = 0x00000010,
45
+ NW_IPV4 = 0x00000100,
46
+ NW_ICMPV4 = 0x00000200,
47
+ NW_IPV6 = 0x00000400,
48
+ NW_ICMPV6 = 0x00000800,
49
+ NW_ARP = 0x00001000,
50
+ NW_IGMP = 0x00002000,
51
+ NW_LLDP = 0x00004000,
52
+ TP_TCP = 0x00010000,
53
+ TP_UDP = 0x00020000,
54
+ TP_ETHERIP = 0x00040000,
55
+
56
+ ETH_VTAG_DIX = ETH_8021Q | ETH_DIX,
57
+ ETH_VTAG_RAW = ETH_8021Q | ETH_8023_RAW,
58
+ ETH_VTAG_LLC = ETH_8021Q | ETH_8023_LLC,
59
+ ETH_VTAG_SNAP = ETH_8021Q | ETH_8023_SNAP,
60
+ ETH_ARP = ETH_DIX | NW_ARP,
61
+ ETH_LLDP = ETH_DIX | NW_LLDP,
62
+ ETH_IPV4 = ETH_DIX | NW_IPV4,
63
+ ETH_IPV4_ICMPV4 = ETH_IPV4 | NW_ICMPV4,
64
+ ETH_IPV4_IGMP = ETH_IPV4 | NW_IGMP,
65
+ ETH_IPV4_TCP = ETH_IPV4 | TP_TCP,
66
+ ETH_IPV4_UDP = ETH_IPV4 | TP_UDP,
67
+ ETH_IPV4_ETHERIP = ETH_IPV4 | TP_ETHERIP,
68
+ ETH_VTAG_ARP = ETH_VTAG_DIX | NW_ARP,
69
+ ETH_VTAG_IPV4 = ETH_VTAG_DIX | NW_IPV4,
70
+ ETH_VTAG_IPV4_ICMPV4 = ETH_VTAG_IPV4 | NW_ICMPV4,
71
+ ETH_VTAG_IPV4_TCP = ETH_VTAG_IPV4 | TP_TCP,
72
+ ETH_VTAG_IPV4_UDP = ETH_VTAG_IPV4 | TP_UDP,
73
+ ETH_SNAP_ARP = ETH_8023_SNAP | NW_ARP,
74
+ ETH_SNAP_IPV4 = ETH_8023_SNAP | NW_IPV4,
75
+ ETH_SNAP_IPV4_ICMPV4 = ETH_SNAP_IPV4 | NW_ICMPV4,
76
+ ETH_SNAP_IPV4_TCP = ETH_SNAP_IPV4 | TP_TCP,
77
+ ETH_SNAP_IPV4_UDP = ETH_SNAP_IPV4 | TP_UDP,
78
+ ETH_VTAG_SNAP_ARP = ETH_VTAG_SNAP | NW_ARP,
79
+ ETH_VTAG_SNAP_IPV4 = ETH_VTAG_SNAP | NW_IPV4,
80
+ ETH_VTAG_SNAP_IPV4_ICMPV4 = ETH_VTAG_SNAP_IPV4 | NW_ICMPV4,
81
+ ETH_VTAG_SNAP_IPV4_TCP = ETH_VTAG_SNAP_IPV4 | TP_TCP,
82
+ ETH_VTAG_SNAP_IPV4_UDP = ETH_VTAG_SNAP_IPV4 | TP_UDP,
83
+ };
84
+
85
+
86
+ enum {
87
+ SNAP_LLC_LENGTH = 3,
88
+ SNAP_OUI_LENGTH = 3,
89
+ };
90
+
91
+
92
+ typedef struct {
93
+ uint32_t format;
94
+
95
+ uint8_t eth_macda[ ETH_ADDRLEN ];
96
+ uint8_t eth_macsa[ ETH_ADDRLEN ];
97
+ uint16_t eth_type;
98
+
99
+ uint16_t vlan_tci;
100
+ uint16_t vlan_tpid;
101
+ uint8_t vlan_prio;
102
+ uint8_t vlan_cfi;
103
+ uint16_t vlan_vid;
104
+
105
+ uint8_t snap_llc[ SNAP_LLC_LENGTH ];
106
+ uint8_t snap_oui[ SNAP_OUI_LENGTH ];
107
+ uint16_t snap_type;
108
+
109
+ uint16_t arp_ar_hrd;
110
+ uint16_t arp_ar_pro;
111
+ uint8_t arp_ar_hln;
112
+ uint8_t arp_ar_pln;
113
+ uint16_t arp_ar_op;
114
+ uint8_t arp_sha[ ETH_ADDRLEN ];
115
+ uint32_t arp_spa;
116
+ uint8_t arp_tha[ ETH_ADDRLEN ];
117
+ uint32_t arp_tpa;
118
+
119
+ uint8_t ipv4_version;
120
+ uint8_t ipv4_ihl;
121
+ uint8_t ipv4_tos;
122
+ uint16_t ipv4_tot_len;
123
+ uint16_t ipv4_id;
124
+ uint16_t ipv4_frag_off;
125
+ uint8_t ipv4_ttl;
126
+ uint8_t ipv4_protocol;
127
+ uint16_t ipv4_checksum;
128
+ uint32_t ipv4_saddr;
129
+ uint32_t ipv4_daddr;
130
+
131
+ uint8_t icmpv4_type;
132
+ uint8_t icmpv4_code;
133
+ uint16_t icmpv4_checksum;
134
+ uint16_t icmpv4_id;
135
+ uint16_t icmpv4_seq;
136
+ uint32_t icmpv4_gateway;
137
+
138
+ uint8_t igmp_type;
139
+ uint8_t igmp_code;
140
+ uint16_t igmp_cksum;
141
+ uint32_t igmp_group;
142
+
143
+ uint16_t tcp_src_port;
144
+ uint16_t tcp_dst_port;
145
+ uint32_t tcp_seq_no;
146
+ uint32_t tcp_ack_no;
147
+ uint8_t tcp_offset;
148
+ uint8_t tcp_flags;
149
+ uint16_t tcp_window;
150
+ uint16_t tcp_checksum;
151
+ uint16_t tcp_urgent;
152
+
153
+ uint16_t udp_src_port;
154
+ uint16_t udp_dst_port;
155
+ uint16_t udp_len;
156
+ uint16_t udp_checksum;
157
+
158
+ uint16_t etherip_version;
159
+ uint16_t etherip_offset;
160
+
161
+ void *l2_header;
162
+ void *l2_payload;
163
+ size_t l2_payload_length;
164
+ void *l3_header;
165
+ void *l3_payload;
166
+ size_t l3_payload_length;
167
+ void *l4_header;
168
+ void *l4_payload;
169
+ size_t l4_payload_length;
170
+ } packet_info;
171
+
172
+
173
+ bool parse_packet( buffer *buf );
174
+
175
+ void calloc_packet_info( buffer *frame );
176
+ void free_packet_info( buffer *frame );
177
+ packet_info get_packet_info( const buffer *frame );
178
+
179
+ bool packet_type_eth_dix( const buffer *frame );
180
+ bool packet_type_eth_vtag( const buffer *frame );
181
+ bool packet_type_eth_raw( const buffer *frame );
182
+ bool packet_type_eth_llc( const buffer *frame );
183
+ bool packet_type_eth_snap( const buffer *frame );
184
+ bool packet_type_ether( const buffer *frame );
185
+ bool packet_type_arp( const buffer *frame );
186
+ bool packet_type_ipv4( const buffer *frame );
187
+ bool packet_type_lldp( const buffer *frame );
188
+ bool packet_type_icmpv4( const buffer *frame );
189
+ bool packet_type_igmp( const buffer *frame );
190
+ bool packet_type_ipv4_tcp( const buffer *frame );
191
+ bool packet_type_ipv4_udp( const buffer *frame );
192
+ bool packet_type_ipv4_etherip( const buffer *frame );
193
+
194
+ bool packet_type_igmp_membership_query( const buffer *frame );
195
+ bool packet_type_igmp_v1_membership_report( const buffer *frame );
196
+ bool packet_type_igmp_v2_membership_report( const buffer *frame );
197
+ bool packet_type_igmp_v2_leave_group( const buffer *frame );
198
+ bool packet_type_igmp_v3_membership_report( const buffer *frame );
199
+
200
+
201
+ #endif // PACKET_INFO_H
202
+
203
+
204
+ /*
205
+ * Local variables:
206
+ * c-basic-offset: 2
207
+ * indent-tabs-mode: nil
208
+ * End:
209
+ */
@@ -0,0 +1,502 @@
1
+ /*
2
+ * Author: Kazuya Suzuki
3
+ *
4
+ * Copyright (C) 2008-2012 NEC Corporation
5
+ *
6
+ * This program is free software; you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License, version 2, as
8
+ * published by the Free Software Foundation.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License along
16
+ * with this program; if not, write to the Free Software Foundation, Inc.,
17
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ */
19
+
20
+
21
+ #include <assert.h>
22
+ #include <stdint.h>
23
+ #include <net/ethernet.h>
24
+ #include <netinet/ip.h>
25
+ #include "packet_info.h"
26
+ #include "log.h"
27
+ #include "wrapper.h"
28
+
29
+
30
+ #define REMAINED_BUFFER_LENGTH( buf, ptr ) \
31
+ ( buf->length - ( size_t ) ( ( char * ) ptr - ( char * ) buf->data ) )
32
+
33
+
34
+ static void
35
+ parse_ether( buffer *buf ) {
36
+ assert( buf != NULL );
37
+
38
+ packet_info *packet_info = buf->user_data;
39
+ void *ptr = packet_info->l2_header;
40
+ assert( ptr != NULL );
41
+
42
+ // Check the length of remained buffer
43
+ size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
44
+ if ( length < sizeof( ether_header_t ) ) {
45
+ return;
46
+ }
47
+
48
+ // Ethernet header
49
+ ether_header_t *ether_header = ptr;
50
+ memcpy( packet_info->eth_macsa, ether_header->macsa, ETH_ADDRLEN );
51
+ memcpy( packet_info->eth_macda, ether_header->macda, ETH_ADDRLEN );
52
+ packet_info->eth_type = ntohs( ether_header->type );
53
+
54
+ ptr = ( void * ) ( ether_header + 1 );
55
+
56
+ // vlan tag
57
+ if ( packet_info->eth_type == ETH_ETHTYPE_TPID ) {
58
+ // Check the length of remained buffer
59
+ length = REMAINED_BUFFER_LENGTH( buf, ptr );
60
+ if ( length < sizeof( vlantag_header_t ) ) {
61
+ return;
62
+ }
63
+ vlantag_header_t *vlantag_header = ptr;
64
+
65
+ packet_info->vlan_tci = ntohs( vlantag_header->tci );
66
+ packet_info->vlan_tpid = packet_info->eth_type;
67
+ packet_info->vlan_prio =TCI_GET_PRIO( packet_info->vlan_tci );
68
+ packet_info->vlan_cfi = TCI_GET_CFI( packet_info->vlan_tci );
69
+ packet_info->vlan_vid = TCI_GET_VID( packet_info->vlan_tci );
70
+
71
+ // Rewrite eth_type
72
+ packet_info->eth_type = ntohs( vlantag_header->type );
73
+
74
+ packet_info->format |= ETH_8021Q;
75
+
76
+ ptr = ( void * ) ( vlantag_header + 1 );
77
+ }
78
+
79
+ // Skip nested vlan headers.
80
+ while ( packet_info->eth_type == ETH_ETHTYPE_TPID ) {
81
+ // Check the length of remained buffer
82
+ length = REMAINED_BUFFER_LENGTH( buf, ptr );
83
+ if ( length < sizeof( vlantag_header_t ) ) {
84
+ return;
85
+ }
86
+ vlantag_header_t *vlantag_header = ptr;
87
+
88
+ // Rewrite eth_type
89
+ packet_info->eth_type = ntohs( vlantag_header->type );
90
+ ptr = ( void * ) ( vlantag_header + 1 );
91
+ }
92
+
93
+ // snap header.
94
+ if ( packet_info->eth_type <= ETH_MTU ) {
95
+ // Check the length of remained buffer
96
+ length = REMAINED_BUFFER_LENGTH( buf, ptr );
97
+ if ( length < sizeof( snap_header_t ) ) {
98
+ return;
99
+ }
100
+ snap_header_t *snap_header = ptr;
101
+
102
+ memcpy( packet_info->snap_llc, snap_header->llc, SNAP_LLC_LENGTH );
103
+ memcpy( packet_info->snap_oui, snap_header->oui, SNAP_OUI_LENGTH );
104
+ packet_info->snap_type = ntohs( snap_header->type );
105
+
106
+ packet_info->format |= ETH_8023_SNAP;
107
+
108
+ ptr = ( void * ) ( snap_header + 1 );
109
+ }
110
+ else {
111
+ packet_info->format |= ETH_DIX;
112
+ }
113
+
114
+ size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
115
+ if ( payload_length > 0 ) {
116
+ packet_info->l2_payload = ptr;
117
+ packet_info->l2_payload_length = payload_length;
118
+ }
119
+
120
+ return;
121
+ }
122
+
123
+
124
+ static void
125
+ parse_arp( buffer *buf ) {
126
+ assert( buf != NULL );
127
+
128
+ packet_info *packet_info = buf->user_data;
129
+ void *ptr = packet_info->l3_header;
130
+ assert( ptr != NULL );
131
+
132
+ // Check the length of remained buffer
133
+ size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
134
+ if ( length < sizeof( arp_header_t ) ) {
135
+ return;
136
+ }
137
+
138
+ // Ethernet header
139
+ arp_header_t *arp_header = ptr;
140
+ packet_info->arp_ar_hrd = ntohs( arp_header->ar_hrd );
141
+ packet_info->arp_ar_pro = ntohs( arp_header->ar_pro );
142
+ packet_info->arp_ar_hln = arp_header->ar_hln;
143
+ packet_info->arp_ar_pln = arp_header->ar_pln;
144
+ packet_info->arp_ar_op = ntohs( arp_header->ar_op );
145
+ memcpy( packet_info->arp_sha, arp_header->sha, ETH_ADDRLEN );
146
+ packet_info->arp_spa = ntohl( arp_header->sip );
147
+ memcpy( packet_info->arp_tha, arp_header->tha, ETH_ADDRLEN );
148
+ packet_info->arp_tpa = ntohl( arp_header->tip );
149
+
150
+ packet_info->format |= NW_ARP;
151
+
152
+ return;
153
+ };
154
+
155
+
156
+ static void
157
+ parse_ipv4( buffer *buf ) {
158
+ assert( buf != NULL );
159
+
160
+ packet_info *packet_info = buf->user_data;
161
+ void *ptr = packet_info->l3_header;
162
+ assert( ptr != NULL );
163
+
164
+ // Check the length of remained buffer for an ipv4 header without options.
165
+ size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
166
+ if ( length < sizeof( ipv4_header_t ) ) {
167
+ return;
168
+ }
169
+
170
+ // Check the length of remained buffer for an ipv4 header with options.
171
+ ipv4_header_t *ipv4_header = ptr;
172
+ if ( ipv4_header->ihl < 5 ) {
173
+ return;
174
+ }
175
+ if ( length < ( size_t ) ipv4_header->ihl * 4 ) {
176
+ return;
177
+ }
178
+
179
+ // Parses IPv4 header
180
+ packet_info->ipv4_version = ipv4_header->version;
181
+ packet_info->ipv4_ihl = ipv4_header->ihl;
182
+ packet_info->ipv4_tos = ipv4_header->tos;
183
+ packet_info->ipv4_tot_len = ntohs( ipv4_header->tot_len );
184
+ packet_info->ipv4_id = ntohs( ipv4_header->id );
185
+ packet_info->ipv4_frag_off = ntohs( ipv4_header->frag_off );
186
+ packet_info->ipv4_ttl = ipv4_header->ttl;
187
+ packet_info->ipv4_protocol = ipv4_header->protocol;
188
+ packet_info->ipv4_checksum = ntohs( ipv4_header->check );
189
+ packet_info->ipv4_saddr = ntohl( ipv4_header->saddr );
190
+ packet_info->ipv4_daddr = ntohl( ipv4_header->daddr );
191
+
192
+ ptr = ( char * ) ipv4_header + packet_info->ipv4_ihl * 4;
193
+ size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
194
+ if ( payload_length > 0 ) {
195
+ packet_info->l3_payload = ptr;
196
+ packet_info->l3_payload_length = payload_length;
197
+ }
198
+
199
+ packet_info->format |= NW_IPV4;
200
+
201
+ return;
202
+ }
203
+
204
+
205
+ static void
206
+ parse_lldp( buffer *buf ) {
207
+ assert( buf != NULL );
208
+
209
+ packet_info *packet_info = buf->user_data;
210
+ void *ptr = packet_info->l3_header;
211
+ assert( ptr != NULL );
212
+
213
+ size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
214
+ if ( payload_length > 0 ) {
215
+ packet_info->l3_payload = ptr;
216
+ packet_info->l3_payload_length = payload_length;
217
+ }
218
+
219
+ packet_info->format |= NW_LLDP;
220
+
221
+ return;
222
+ }
223
+
224
+
225
+ static void
226
+ parse_icmp( buffer *buf ) {
227
+ assert( buf != NULL );
228
+
229
+ packet_info *packet_info = buf->user_data;
230
+ void *ptr = packet_info->l4_header;
231
+ assert( ptr != NULL );
232
+
233
+ // Check the length of remained buffer
234
+ size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
235
+ if ( length < sizeof( icmp_header_t ) ) {
236
+ return;
237
+ }
238
+
239
+ // ICMPV4 header
240
+ icmp_header_t *icmp_header = ptr;
241
+ packet_info->icmpv4_type = icmp_header->type;
242
+ packet_info->icmpv4_code = icmp_header->code;
243
+ packet_info->icmpv4_checksum = ntohs( icmp_header->csum );
244
+
245
+ switch ( packet_info->icmpv4_type ) {
246
+ case ICMP_TYPE_ECHOREP:
247
+ case ICMP_TYPE_ECHOREQ:
248
+ packet_info->icmpv4_id = ntohs( icmp_header->icmp_data.echo.ident );
249
+ packet_info->icmpv4_seq = ntohs( icmp_header->icmp_data.echo.seq );
250
+ break;
251
+
252
+ case ICMP_TYPE_REDIRECT:
253
+ packet_info->icmpv4_gateway = ntohl( icmp_header->icmp_data.gateway );
254
+ break;
255
+
256
+ default:
257
+ break;
258
+ }
259
+
260
+ ptr = ( void * ) ( icmp_header + 1 );
261
+ size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
262
+ if ( payload_length > 0 ) {
263
+ packet_info->l4_payload = ptr;
264
+ packet_info->l4_payload_length = payload_length;
265
+ }
266
+
267
+ packet_info->format |= NW_ICMPV4;
268
+
269
+ return;
270
+ };
271
+
272
+
273
+ static void
274
+ parse_udp( buffer *buf ) {
275
+ assert( buf != NULL );
276
+
277
+ packet_info *packet_info = buf->user_data;
278
+ void *ptr = packet_info->l4_header;
279
+ assert( ptr != NULL );
280
+
281
+ // Check the length of remained buffer
282
+ size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
283
+ if ( length < sizeof( udp_header_t ) ) {
284
+ return;
285
+ }
286
+
287
+ // UDP header
288
+ udp_header_t *udp_header = ptr;
289
+ packet_info->udp_src_port = ntohs( udp_header->src_port );
290
+ packet_info->udp_dst_port = ntohs( udp_header->dst_port );
291
+ packet_info->udp_len = ntohs( udp_header->len );
292
+ packet_info->udp_checksum = ntohs( udp_header->csum );
293
+
294
+ ptr = ( void * ) ( udp_header + 1 );
295
+ size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
296
+ if ( payload_length > 0 ) {
297
+ packet_info->l4_payload = ptr;
298
+ packet_info->l4_payload_length = payload_length;
299
+ }
300
+
301
+ packet_info->format |= TP_UDP;
302
+
303
+ return;
304
+ };
305
+
306
+
307
+ static void
308
+ parse_tcp( buffer *buf ) {
309
+ assert( buf != NULL );
310
+
311
+ packet_info *packet_info = buf->user_data;
312
+ void *ptr = packet_info->l4_header;
313
+ assert( ptr != NULL );
314
+
315
+ // Check the length of remained buffer for the tcp header without options
316
+ size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
317
+ if ( length < sizeof( tcp_header_t ) ) {
318
+ return;
319
+ }
320
+
321
+ // Check the length of remained buffer for the tcp header with options
322
+ tcp_header_t *tcp_header = ptr;
323
+ if ( tcp_header->offset < 5 ) {
324
+ return;
325
+ }
326
+ if ( length < ( size_t ) tcp_header->offset * 4 ) {
327
+ return;
328
+ }
329
+
330
+ // TCP header
331
+ packet_info->tcp_src_port = ntohs( tcp_header->src_port );
332
+ packet_info->tcp_dst_port = ntohs( tcp_header->dst_port );
333
+ packet_info->tcp_seq_no = ntohl( tcp_header->seq_no );
334
+ packet_info->tcp_ack_no = ntohl( tcp_header->ack_no );
335
+ packet_info->tcp_offset = tcp_header->offset;
336
+ packet_info->tcp_flags = tcp_header->flags;
337
+ packet_info->tcp_window = ntohs( tcp_header->window );
338
+ packet_info->tcp_checksum = ntohs( tcp_header->csum );
339
+ packet_info->tcp_urgent = ntohs( tcp_header->urgent );
340
+
341
+ ptr = ( char * ) tcp_header + packet_info->tcp_offset * 4;
342
+ size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
343
+ if ( payload_length > 0 ) {
344
+ packet_info->l4_payload = ptr;
345
+ packet_info->l4_payload_length = payload_length;
346
+ }
347
+
348
+ packet_info->format |= TP_TCP;
349
+
350
+ return;
351
+ };
352
+
353
+
354
+
355
+ static void
356
+ parse_igmp( buffer *buf ) {
357
+ assert( buf != NULL );
358
+
359
+ packet_info *packet_info = buf->user_data;
360
+ void *ptr = packet_info->l4_header;
361
+ assert( ptr != NULL );
362
+
363
+ // Check the length of remained buffer
364
+ size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
365
+ if ( length < sizeof( igmp_header_t ) ) {
366
+ return;
367
+ }
368
+
369
+ igmp_header_t *igmp = ptr;
370
+ packet_info->igmp_type = igmp->type;
371
+ packet_info->igmp_code = igmp->code;
372
+ packet_info->igmp_cksum = ntohs( igmp->csum );
373
+ packet_info->igmp_group = ntohl( igmp->group );
374
+
375
+ packet_info->format |= NW_IGMP;
376
+
377
+ return;
378
+ }
379
+
380
+
381
+ static void
382
+ parse_etherip( buffer *buf ) {
383
+ assert( buf != NULL );
384
+
385
+ packet_info *packet_info = buf->user_data;
386
+ void *ptr = packet_info->l4_header;
387
+ assert( ptr != NULL );
388
+
389
+ // Check the length of remained buffer
390
+ size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
391
+ if ( length < sizeof( etherip_header ) ) {
392
+ return;
393
+ }
394
+
395
+ // Ether header
396
+ etherip_header *etherip_header = ptr;
397
+ packet_info->etherip_version = ntohs( etherip_header->version );
398
+ packet_info->etherip_offset = 0;
399
+
400
+ ptr = ( void * ) ( etherip_header + 1 );
401
+ size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
402
+ if ( payload_length > 0 ) {
403
+ packet_info->l4_payload = ptr;
404
+ packet_info->l4_payload_length = payload_length;
405
+ packet_info->etherip_offset = ( uint16_t ) ( ( char * ) ptr - ( char *) buf->data );
406
+ }
407
+
408
+ packet_info->format |= TP_ETHERIP;
409
+
410
+ return;
411
+ }
412
+
413
+
414
+ bool
415
+ parse_packet( buffer *buf ) {
416
+ assert( buf != NULL );
417
+ assert( buf->data != NULL );
418
+
419
+ calloc_packet_info( buf );
420
+ if ( buf->user_data == NULL ) {
421
+ error( "Can't alloc memory for packet_info." );
422
+ return false;
423
+ }
424
+
425
+ // Parse the L2 header.
426
+ packet_info *packet_info = buf->user_data;
427
+ packet_info->l2_header = buf->data;
428
+ parse_ether( buf );
429
+
430
+ // Parse the L3 header.
431
+ switch ( packet_info->eth_type ) {
432
+ case ETH_ETHTYPE_ARP:
433
+ packet_info->l3_header = packet_info->l2_payload;
434
+ parse_arp( buf );
435
+ break;
436
+
437
+ case ETH_ETHTYPE_IPV4:
438
+ packet_info->l3_header = packet_info->l2_payload;
439
+ parse_ipv4( buf );
440
+ break;
441
+
442
+ case ETH_ETHTYPE_LLDP:
443
+ packet_info->l3_header = packet_info->l2_payload;
444
+ parse_lldp( buf );
445
+ break;
446
+
447
+ default:
448
+ // Unknown L3 type
449
+ return true;
450
+ }
451
+
452
+ if ( !( packet_info->format & NW_IPV4 ) ) {
453
+ return true;
454
+ }
455
+ else if ( ( packet_info->ipv4_frag_off & IP_OFFMASK ) != 0 ) {
456
+ // The ipv4 packet is fragmented.
457
+ return true;
458
+ }
459
+
460
+ // Parse the L4 header.
461
+ switch ( packet_info->ipv4_protocol ) {
462
+ case IPPROTO_ICMP:
463
+ packet_info->l4_header = packet_info->l3_payload;
464
+ parse_icmp( buf );
465
+ break;
466
+
467
+ case IPPROTO_TCP:
468
+ packet_info->l4_header = packet_info->l3_payload;
469
+ parse_tcp( buf );
470
+ break;
471
+
472
+ case IPPROTO_UDP:
473
+ packet_info->l4_header = packet_info->l3_payload;
474
+ parse_udp( buf );
475
+ break;
476
+
477
+ case IPPROTO_IGMP:
478
+ packet_info->l4_header = packet_info->l3_payload;
479
+ parse_igmp( buf );
480
+ break;
481
+
482
+ case IPPROTO_ETHERIP:
483
+ packet_info->l4_header = packet_info->l3_payload;
484
+ parse_etherip( buf );
485
+ break;
486
+
487
+ default:
488
+ // Unknown L4 type
489
+ break;
490
+ }
491
+
492
+ return true;
493
+
494
+ }
495
+
496
+
497
+ /*
498
+ * Local variables:
499
+ * c-basic-offset: 2
500
+ * indent-tabs-mode: nil
501
+ * End:
502
+ */