Skip to content

Commit 63733cf

Browse files
committed
multi: finish basic API for 0x04
Missing query apis.
1 parent 6532bb1 commit 63733cf

File tree

3 files changed

+59
-40
lines changed

3 files changed

+59
-40
lines changed

async/Async_OpenFlow.mli

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,25 @@ module OpenFlow0x04 : sig
242242

243243
open OpenFlow0x04_Core
244244

245-
val clear_table : t -> Client_id.t -> (unit, exn) Deferred.Result.t
246-
val send_flow_mods : ?clear:bool -> t -> Client_id.t -> flowMod list -> (unit, exn) Deferred.Result.t
245+
val clear_flows
246+
: ?pattern:oxmMatch -> t -> Client_id.t
247+
-> (unit, exn) Deferred.Result.t
248+
249+
val clear_groups
250+
: ?pattern:(groupType * groupId) -> t -> Client_id.t
251+
-> (unit, exn) Deferred.Result.t
252+
253+
val send_flow_mods
254+
: ?clear:bool -> t -> Client_id.t -> flowMod list
255+
-> (unit, exn) Deferred.Result.t
256+
257+
val send_pkt_out
258+
: t -> Client_id.t -> packetOut
259+
-> (unit, exn) Deferred.Result.t
247260

248-
val send_pkt_out : t -> Client_id.t -> packetOut -> (unit, exn) Deferred.Result.t
249-
val barrier : t -> Client_id.t -> (unit, exn) Result.t Deferred.t
261+
val barrier
262+
: t -> Client_id.t
263+
-> (unit, exn) Result.t Deferred.t
250264
end
251265

252266
end
@@ -275,18 +289,19 @@ module SDN : sig
275289

276290
val listen : t -> e Pipe.Reader.t
277291

278-
(* val clear_flows : t -> Pattern.t -> switchId -> (unit, exn) Deferred.Result.t *)
279-
val clear_table : t -> switchId -> (unit, exn) Deferred.Result.t
292+
val clear_flows
293+
: ?pattern:Pattern.t -> t -> switchId
294+
-> (unit, exn) Deferred.Result.t
280295

281296
val install_flows
282-
: ?clear:bool
283-
-> t
284-
-> switchId
285-
-> flow list
297+
: ?clear:bool -> t -> switchId -> flow list
286298
-> (unit, exn) Deferred.Result.t
287299

288-
val send_pkt_out : t -> switchId -> pktOut -> (unit, exn) Deferred.Result.t
289-
290-
val barrier : t -> switchId -> (unit, exn) Deferred.Result.t
300+
val send_pkt_out
301+
: t -> switchId -> pktOut
302+
-> (unit, exn) Deferred.Result.t
291303

304+
val barrier
305+
: t -> switchId
306+
-> (unit, exn) Result.t Deferred.t
292307
end

async/Async_OpenFlow0x04.ml

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -233,20 +233,22 @@ module Controller = struct
233233
let open ChunkController in
234234
listen_pipe t (run (handshake 0x04) t.sub (listen t.sub))
235235

236-
let clear_table (t : t) (sw_id : Client_id.t) =
237-
let flows = send_result t sw_id (0l, M.FlowModMsg C.delete_all_flows) in
238-
let groups = send_result t sw_id (0l, M.GroupModMsg C.delete_all_groups) in
239-
Deferred.Result.all_ignore [flows; groups]
236+
let clear_flows ?(pattern=C.match_all) (t:t) (sw_id:Client_id.t) =
237+
send_result t sw_id (0l, M.FlowModMsg
238+
{ C.delete_all_flows with C.mfOfp_match = pattern })
239+
240+
let clear_groups ?(pattern=C.(All,0xfffffffcl)) (t:t) (sw_id:Client_id.t) =
241+
let typ, id = pattern in
242+
send_result t sw_id (0l, M.GroupModMsg (C.DeleteGroup(typ, id)))
240243

241244
let send_flow_mods ?(clear=true) (t : t) (sw_id : Client_id.t) flow_mods =
242-
begin if clear then clear_table t sw_id else return (Result.Ok ()) end
243-
>>= function
244-
| Result.Error exn -> return (Result.Error exn)
245-
| Result.Ok () ->
246-
let sends = List.map flow_mods
247-
~f:(fun f -> send_result t sw_id (0l, M.FlowModMsg f))
248-
in
249-
Deferred.Result.all_ignore sends
245+
let open Deferred.Result in
246+
begin if clear then clear_flows t sw_id else return () end
247+
>>= fun () ->
248+
let sends = List.map flow_mods
249+
~f:(fun f -> send_result t sw_id (0l, M.FlowModMsg f))
250+
in
251+
all_ignore sends
250252

251253
let send_pkt_out (t : t) (sw_id : Client_id.t) pkt_out =
252254
send_result t sw_id (0l, M.PacketOutMsg pkt_out)

async/Async_SDN.ml

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ type t =
2121
}
2222

2323
type e = [
24-
| `Connect of SDN.switchId * SDN.switchFeatures
24+
| `Connect of SDN.switchId * SDN.switchFeatures
2525
| `Disconnect of SDN.switchId * Sexp.t
26-
| `PacketIn of SDN.switchId * SDN.pktIn
26+
| `PacketIn of SDN.switchId * SDN.pktIn
2727
| `PortUp of SDN.switchId * SDN.portId
2828
| `PortDown of SDN.switchId * SDN.portId ]
2929

@@ -71,7 +71,9 @@ let listen_of0x01 (t : t) : Chunk_Controller.h Pipe.Writer.t * e Pipe.Reader.t =
7171
| `Connect(sw_id, fs) ->
7272
let sdn_fs =
7373
{ SDN.switch_id = sw_id
74-
; SDN.switch_ports = List.filter_map fs.OF.SwitchFeatures.ports ~f:get_port }
74+
; SDN.switch_ports = List.filter_map fs.OF.SwitchFeatures.ports
75+
~f:get_port
76+
}
7577
in
7678
Some(`Connect(sw_id, sdn_fs))
7779
| `Disconnect(sw_id, exn) ->
@@ -165,7 +167,7 @@ let listen (t : t) : e Pipe.Reader.t =
165167
match version with
166168
| 0x01 -> Pipe.write of0x01_w e
167169
| 0x04 -> Pipe.write of0x04_w e
168-
| _ -> failwith "Unsupported version"));
170+
| v -> failwith Printf.(sprintf "SDN.listen: unsupported version: %d" v)));
169171
Pipe.interleave [of0x01_r; of0x04_r]
170172

171173
let switch_version (t : t) (sw_id : SDN.switchId) =
@@ -182,14 +184,13 @@ let clear_flows ?(pattern:SDN.Pattern.t option) (t:t) (sw_id:SDN.switchId) =
182184
| 0x01 ->
183185
let pattern = Option.map pattern ~f:SDN_OpenFlow0x01.from_pattern in
184186
OF0x01_Controller.clear_flows ?pattern t.sub_0x01 sw_id
185-
| 0x04
186-
| _ -> failwith "Unsupported version"
187-
188-
let clear_table (t : t) (sw_id : SDN.switchId) =
189-
match switch_version t sw_id with
190-
| 0x01 -> OF0x01_Controller.clear_flows t.sub_0x01 sw_id
191-
| 0x04 -> OF0x04_Controller.clear_table t.sub_0x04 sw_id
192-
| _ -> failwith "Unsupported version"
187+
| 0x04 ->
188+
let pattern = match Option.map pattern ~f:SDN_OpenFlow0x04.from_pattern with
189+
| Some(pattern, _) -> Some(pattern)
190+
| None -> None
191+
in
192+
OF0x04_Controller.clear_flows ?pattern t.sub_0x04 sw_id
193+
| v -> failwith Printf.(sprintf "SDN.clear_flows: unsupported version: %d" v)
193194

194195
let install_flows ?(clear=true) (t : t) (sw_id : SDN.switchId) flows =
195196
let priority = ref 65536 in
@@ -203,21 +204,22 @@ let install_flows ?(clear=true) (t : t) (sw_id : SDN.switchId) flows =
203204
let f flow = decr priority; SDN_OpenFlow0x04.from_flow groups !priority flow in
204205
let flow_mods = List.map flows ~f in
205206
let open Deferred.Result in
207+
OF0x04_Controller.clear_groups t.sub_0x04 sw_id >>= fun () ->
206208
OF0x04_Controller.send_flow_mods ~clear t.sub_0x04 sw_id flow_mods >>= fun () ->
207209
let f group = OF0x04_Controller.send_result t.sub_0x04 sw_id (0l, group) in
208210
Deferred.Result.all_ignore (List.map (GroupTable0x04.commit groups) ~f)
209-
| _ -> failwith "Unsupported version"
211+
| v -> failwith Printf.(sprintf "SDN.install_flows: unsupported version: %d" v)
210212

211213
let send_pkt_out (t : t) (sw_id : SDN.switchId) (pkt_out : SDN.pktOut) =
212214
match switch_version t sw_id with
213215
| 0x01 -> OF0x01_Controller.send_pkt_out t.sub_0x01 sw_id
214216
(SDN_OpenFlow0x01.from_packetOut pkt_out)
215217
| 0x04 -> OF0x04_Controller.send_pkt_out t.sub_0x04 sw_id
216218
(SDN_OpenFlow0x04.from_packetOut pkt_out)
217-
| _ -> failwith "Unsupported version"
219+
| v -> failwith Printf.(sprintf "SDN.send_pkt_out: unsupported version: %d" v)
218220

219221
let barrier (t : t) (sw_id : SDN.switchId) =
220222
match switch_version t sw_id with
221223
| 0x01 -> OF0x01_Controller.barrier t.sub_0x01 sw_id
222224
| 0x04 -> OF0x04_Controller.barrier t.sub_0x04 sw_id
223-
| _ -> failwith "Unsupported version"
225+
| v -> failwith Printf.(sprintf "SDN.barrier: unsupported version: %d" v)

0 commit comments

Comments
 (0)