# HG changeset patch
# User Rob Hoes <[email protected]>
# Date 1278671988 -3600
# Node ID a7baa421f3d5efc6198dab2849359a4cecf7efd0
# Parent  2c476bb5574a9e4c53960dd759d03578c20a31ea
Tunnelling: creation and destruction of tunnels

Signed-off-by: Rob Hoes <[email protected]>

diff -r 2c476bb5574a -r a7baa421f3d5 ocaml/xapi/xapi_tunnel.ml
--- a/ocaml/xapi/xapi_tunnel.ml
+++ b/ocaml/xapi/xapi_tunnel.ml
@@ -14,11 +14,36 @@
 module D = Debug.Debugger(struct let name="xapi" end) 
 open D
 
+let choose_tunnel_device_name ~__context ~host = 
+       let pifs = List.filter (fun self -> Db.PIF.get_host ~__context ~self = 
host) (Db.PIF.get_all ~__context) in
+       let devices = List.map (fun self -> Db.PIF.get_device ~__context ~self) 
pifs in
+       let rec choose n = 
+               let name = Printf.sprintf "tunnel%d" n in
+               if List.mem name devices
+               then choose (n + 1)
+               else name in
+       choose 0
+
 let create ~__context ~transport_PIF ~network =
-       debug "CREATE TUNNEL";
-       Ref.make ()
+       let tunnel = Ref.make () in
+       let access_PIF = Ref.make () in
+       let host = Db.PIF.get_host ~__context ~self:transport_PIF in
+       let device = choose_tunnel_device_name ~__context ~host in
+       let device_name = device in
+       let mAC = Xapi_vif_helpers.gen_mac (0, Uuid.to_string (Uuid.make_uuid 
())) in
+       Db.PIF.create ~__context ~ref:access_PIF ~uuid:(Uuid.to_string 
(Uuid.make_uuid ()))
+               ~device ~device_name ~network ~host ~mAC ~mTU:(-1L) ~vLAN:(-1L) 
~metrics:Ref.null
+               ~physical:false ~currently_attached:false 
+               ~ip_configuration_mode:`None ~iP:"" ~netmask:"" ~gateway:"" 
~dNS:"" ~bond_slave_of:Ref.null 
+               ~vLAN_master_of:Ref.null ~management:false ~other_config:[] 
~disallow_unplug:false;
+       Db.Tunnel.create ~__context ~ref:tunnel ~uuid:(Uuid.to_string 
(Uuid.make_uuid ()))
+               ~access_PIF ~transport_PIF ~status:["active", "false"] 
~other_config:[];
+       Xapi_pif.plug ~__context ~self:access_PIF;
+       tunnel
        
 let destroy ~__context ~self =
-       debug "DESTROY TUNNEL";
-       ()
+       let pif = Db.Tunnel.get_access_PIF ~__context ~self in
+       Xapi_pif.unplug ~__context ~self:pif;
+       Db.PIF.destroy ~__context ~self:pif;
+       Db.Tunnel.destroy ~__context ~self
 
diff -r 2c476bb5574a -r a7baa421f3d5 ocaml/xapi/xapi_vif_helpers.mli
--- a/ocaml/xapi/xapi_vif_helpers.mli
+++ b/ocaml/xapi/xapi_vif_helpers.mli
@@ -64,4 +64,7 @@
   __context:Context.t ->
   vm:[ `VM ] Ref.t ->
   preserve_mac_address:bool -> [ `VIF ] Ref.t -> API.ref_VIF
-  
+
+(** Generate a MAC address *)  
+val gen_mac : int * string -> string
+
 ocaml/xapi/xapi_tunnel.ml       |  33 +++++++++++++++++++++++++++++----
 ocaml/xapi/xapi_vif_helpers.mli |   5 ++++-
 2 files changed, 33 insertions(+), 5 deletions(-)


# HG changeset patch
# User Rob Hoes <[email protected]>
# Date 1278671988 -3600
# Node ID a7baa421f3d5efc6198dab2849359a4cecf7efd0
# Parent  2c476bb5574a9e4c53960dd759d03578c20a31ea
Tunnelling: creation and destruction of tunnels

Signed-off-by: Rob Hoes <[email protected]>

diff -r 2c476bb5574a -r a7baa421f3d5 ocaml/xapi/xapi_tunnel.ml
--- a/ocaml/xapi/xapi_tunnel.ml
+++ b/ocaml/xapi/xapi_tunnel.ml
@@ -14,11 +14,36 @@
 module D = Debug.Debugger(struct let name="xapi" end) 
 open D
 
+let choose_tunnel_device_name ~__context ~host = 
+	let pifs = List.filter (fun self -> Db.PIF.get_host ~__context ~self = host) (Db.PIF.get_all ~__context) in
+	let devices = List.map (fun self -> Db.PIF.get_device ~__context ~self) pifs in
+	let rec choose n = 
+		let name = Printf.sprintf "tunnel%d" n in
+		if List.mem name devices
+		then choose (n + 1)
+		else name in
+	choose 0
+
 let create ~__context ~transport_PIF ~network =
-	debug "CREATE TUNNEL";
-	Ref.make ()
+	let tunnel = Ref.make () in
+	let access_PIF = Ref.make () in
+	let host = Db.PIF.get_host ~__context ~self:transport_PIF in
+	let device = choose_tunnel_device_name ~__context ~host in
+	let device_name = device in
+	let mAC = Xapi_vif_helpers.gen_mac (0, Uuid.to_string (Uuid.make_uuid ())) in
+	Db.PIF.create ~__context ~ref:access_PIF ~uuid:(Uuid.to_string (Uuid.make_uuid ()))
+		~device ~device_name ~network ~host ~mAC ~mTU:(-1L) ~vLAN:(-1L) ~metrics:Ref.null
+		~physical:false ~currently_attached:false 
+		~ip_configuration_mode:`None ~iP:"" ~netmask:"" ~gateway:"" ~dNS:"" ~bond_slave_of:Ref.null 
+		~vLAN_master_of:Ref.null ~management:false ~other_config:[] ~disallow_unplug:false;
+	Db.Tunnel.create ~__context ~ref:tunnel ~uuid:(Uuid.to_string (Uuid.make_uuid ()))
+		~access_PIF ~transport_PIF ~status:["active", "false"] ~other_config:[];
+	Xapi_pif.plug ~__context ~self:access_PIF;
+	tunnel
 	
 let destroy ~__context ~self =
-	debug "DESTROY TUNNEL";
-	()
+	let pif = Db.Tunnel.get_access_PIF ~__context ~self in
+	Xapi_pif.unplug ~__context ~self:pif;
+	Db.PIF.destroy ~__context ~self:pif;
+	Db.Tunnel.destroy ~__context ~self
 
diff -r 2c476bb5574a -r a7baa421f3d5 ocaml/xapi/xapi_vif_helpers.mli
--- a/ocaml/xapi/xapi_vif_helpers.mli
+++ b/ocaml/xapi/xapi_vif_helpers.mli
@@ -64,4 +64,7 @@
   __context:Context.t ->
   vm:[ `VM ] Ref.t ->
   preserve_mac_address:bool -> [ `VIF ] Ref.t -> API.ref_VIF
-  
+
+(** Generate a MAC address *)  
+val gen_mac : int * string -> string
+
_______________________________________________
xen-api mailing list
[email protected]
http://lists.xensource.com/mailman/listinfo/xen-api

Reply via email to