-
Notifications
You must be signed in to change notification settings - Fork 51
Creating Apps With OCaml and Ox
Ox is a framework for straight OpenFlow programming in OCaml, in other words there is no NetKAT involved in Ox. It is similar to Python-based frameworks RYU and Pox in this respect. Since Frenetic already has an OpenFlow library baked in (and it's the only OCaml-based OpenFlow implementation out there), you can think of Ox as a thin OCaml veneer over the top of it.
The Frenetic Tutorial covers Ox, mostly as a contrasting technology to NetKAT.
Here's a template for an Ox program:
open Frenetic_Ox
open Frenetic_OpenFlow0x01
open Core.Std
open Async.Std
module MyApplication = struct
include DefaultHandlers
open Platform
let packet_in (sw : switchId) (xid : xid) (pk : packetIn) : unit =
()
let switch_disconnected (sw : switchId) : unit = ()
let switch_connected (sw : switchId) (feats : SwitchFeatures.t) : unit = ()
let barrier_reply _ _ = ()
let stats_reply _ _ _ = ()
let cleanup _ = ()
end
let _ =
let module C = Make (MyApplication) in
C.start ();
The handlers listed above mirror OpenFlow 1.0's switch-to-controller messages (and are also in Frenetic_Ox.Default_Handlers
, so you don't need to provide all of them). Most of the data types you use in Ox, like SwitchFeatures.t
are from the Frenetic_OpenFlow0x01
module.
The commands for Ox mirror OpenFlow 1.0's controller-to-switch messages, and are also listed in Frenetic_OpenFlow0x01
. For example, a Packet Out command looks like this:
send_packet_out sw 0l {
output_payload = pk.input_payload;
port_id = None;
apply_actions = [Output AllPorts]
}
Then compile the code:
[email protected]:~/src/frenetic/examples$ ox-build template_ox.d.byte
The ox-build is a bundled crutch build script, similar to Jane Street's core-build. See the Build Section for more sophisticated Build script tips.
See the API Documentation for Frenetic_OpenFlow0x01 or in the source code on Github.