Skip to content

Commit 3e552d3

Browse files
author
Jon Ludlam
committed
Merge pull request #14 from robhoes/ea1254
Make ea1254 branch equal to master minus libnl patch plus IP watcher patch
2 parents a495619 + 93a8ed7 commit 3e552d3

File tree

5 files changed

+50
-40
lines changed

5 files changed

+50
-40
lines changed

lib/network_utils.ml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ let call_script ?(log_successful_output=false) script args =
4545
let pid = Forkhelpers.safe_close_and_exec ~env None (Some writeme) None [] script args in
4646
Unix.close writeme;
4747
(* assume output is never larger than a pipe buffer *)
48-
Forkhelpers.waitpid pid;
48+
let (_: (int * Unix.process_status)) = Forkhelpers.waitpid pid in
4949
let output = String.make 16384 '\000' in
5050
let n = Unix.read readme output 0 (String.length output) in
5151
Unix.close readme;
@@ -190,7 +190,8 @@ info "Found at [ %s ]" (String.concat ", " (List.map string_of_int indices));
190190
ignore (call ~log:true ("link" :: "set" :: dev :: args))
191191

192192
let link_set_mtu dev mtu =
193-
ignore (link_set dev ["mtu"; string_of_int mtu])
193+
try ignore (link_set dev ["mtu"; string_of_int mtu])
194+
with e -> error "MTU size is not supported: %s" (string_of_int mtu)
194195

195196
let link_set_up dev =
196197
ignore (link_set dev ["up"])
@@ -199,21 +200,26 @@ info "Found at [ %s ]" (String.concat ", " (List.map string_of_int indices));
199200
if is_up dev then
200201
ignore (link_set dev ["down"])
201202

203+
let link ?(version=V46) dev attr =
204+
let v = string_of_version version in
205+
let output = call (v @ ["link"; "show"; "dev"; dev]) in
206+
find output attr
207+
202208
let addr ?(version=V46) dev attr =
203209
let v = string_of_version version in
204210
let output = call (v @ ["addr"; "show"; "dev"; dev]) in
205211
find output attr
206212

207213
let get_mtu dev =
208-
int_of_string (List.hd (addr dev "mtu"))
214+
int_of_string (List.hd (link dev "mtu"))
209215

210216
let get_state dev =
211217
match addr dev "state" with
212218
| "UP" :: _ -> true
213219
| _ -> false
214220

215221
let get_mac dev =
216-
List.hd (addr dev "link/ether")
222+
List.hd (link dev "link/ether")
217223

218224
let set_mac dev mac =
219225
try

lib/xcp-networkd.mllib

Lines changed: 0 additions & 4 deletions
This file was deleted.

networkd/libxcp-networkd_stubs.clib

Lines changed: 0 additions & 4 deletions
This file was deleted.

networkd/network_monitor_thread.ml

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -171,31 +171,21 @@ let rec monitor dbg () =
171171
let vendor_id, device_id = if List.length devs = 1 then Sysfs.get_pci_ids dev else "", "" in
172172
let carriers = List.map Sysfs.get_carrier devs in
173173
let speed, duplex =
174-
let int_of_duplex = function
175-
| Duplex_half -> 1
176-
| Duplex_full -> 2
177-
| Duplex_unknown -> 0
174+
let combine_duplex = function
175+
| Duplex_full, Duplex_full -> Duplex_full
176+
| Duplex_unknown, a | a, Duplex_unknown -> a
177+
| _ -> Duplex_half
178178
in
179-
let duplex_of_int = function
180-
| 1 -> Duplex_half
181-
| 2 -> Duplex_full
182-
| _ -> Duplex_unknown
183-
in
184-
let statuses = List.map2 (fun dev carrier ->
185-
let speed, duplex =
186-
try
187-
if not carrier then failwith "no carrier";
188-
Bindings.get_status dev
189-
with _ ->
190-
0,
191-
Duplex_unknown
192-
in
193-
speed, int_of_duplex duplex
194-
) devs carriers in
195-
let speed, duplex =
196-
List.fold_left (fun (speed, duplex) (speed', duplex') -> (speed + speed'), (min duplex duplex')) (0, 2) statuses
197-
in
198-
speed, duplex_of_int duplex
179+
List.fold_left2 (fun (speed, duplex) dev carrier ->
180+
try
181+
if not carrier then
182+
speed, duplex
183+
else
184+
let speed', duplex' = Bindings.get_status dev in
185+
speed + speed', combine_duplex (duplex, duplex')
186+
with _ ->
187+
speed, duplex
188+
) (0, Duplex_unknown) devs carriers
199189
in
200190
let nb_links = List.length devs in
201191
let carrier = List.mem true carriers in
@@ -247,6 +237,19 @@ let signal_networking_change () =
247237
(fun () -> XenAPI.Host.signal_networking_change xapi_rpc session)
248238
(fun () -> XenAPI.Session.local_logout xapi_rpc session)
249239

240+
(* Remove all outstanding reads on a file descriptor *)
241+
let clear_input fd =
242+
let buf = String.make 255 ' ' in
243+
let rec loop () =
244+
try
245+
ignore (Unix.read fd buf 0 255);
246+
loop ()
247+
with _ -> ()
248+
in
249+
Unix.set_nonblock fd;
250+
loop ();
251+
Unix.clear_nonblock fd
252+
250253
let ip_watcher () =
251254
let cmd = Network_utils.iproute2 in
252255
let args = ["monitor"; "address"] in
@@ -256,16 +259,25 @@ let ip_watcher () =
256259
);
257260
Unix.close writeme;
258261
let in_channel = Unix.in_channel_of_descr readme in
259-
debug "Started IP watcher thread";
260262
let rec loop () =
261263
let line = input_line in_channel in
262-
(* Do not send events for link-local IPv6 addresses *)
264+
(* Do not send events for link-local IPv6 addresses, and removed IPs *)
263265
if String.has_substr line "inet" && not (String.has_substr line "inet6 fe80") then begin
266+
(* Ignore changes for the next second, since they usually come in bursts,
267+
* and signal only once. *)
268+
Thread.delay 1.;
269+
clear_input readme;
264270
signal_networking_change ()
265271
end;
266272
loop ()
267273
in
268-
loop ()
274+
while true do
275+
try
276+
info "(Re)started IP watcher thread";
277+
loop ()
278+
with e ->
279+
warn "Error in IP watcher: %s\n%s" (Printexc.to_string e) (Printexc.get_backtrace ())
280+
done
269281

270282
let start () =
271283
let dbg = "monitor_thread" in

scripts/init.d-networkd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ start() {
3636
# Enable backtraces
3737
export OCAMLRUNPARAM="b"
3838

39-
${NETWORKD} -daemon -pidfile ${PID_FILE} >/dev/null 2>&1 </dev/null
39+
${NETWORKD} -daemon true -pidfile ${PID_FILE} >/dev/null 2>&1 </dev/null
4040

4141
MAX_RETRIES=100
4242
RETRY=0

0 commit comments

Comments
 (0)