Added Intel AMT clock sync.
Ylian Saint-Hilaire committed
Oct 14, 2020 at 14:57 UTC
1deacd93b3d226e77bc6e059d8c3967a6f8b53c4
1 file changed
+44
-6
amtmanager.js
+44
-6
@@ -331,13 +331,17 @@ module.exports.CreateAmtManager = function(parent) {
331
if (stack.wsman.comm.xtls == 1) { dev.aquired.hash = stack.wsman.comm.xtlsCertificate.fingerprint.split(':').join('').toLowerCase(); } else { delete dev.aquired.hash; }
332
//console.log(dev.nodeid, dev.name, dev.host, dev.aquired);
333
UpdateDevice(dev);
334
- attemptFetchHardwareInventory(dev); // See if we need to get hardware inventory
334
336
- // Start power polling
337
- var ppfunc = function powerPoleFunction() { fetchPowerState(powerPoleFunction.dev); }
338
- ppfunc.dev = dev;
339
- dev.polltimer = new setTimeout(ppfunc, 290000); // Poll for power state every 4 minutes 50 seconds.
340
- fetchPowerState(dev);
335
+ // Perform Intel AMT clock sync
336
+ attemptSyncClock(dev, function () {
337
+ attemptFetchHardwareInventory(dev); // See if we need to get hardware inventory
338
+
339
+ // Start power polling
340
+ var ppfunc = function powerPoleFunction() { fetchPowerState(powerPoleFunction.dev); }
341
+ ppfunc.dev = dev;
342
+ dev.polltimer = new setTimeout(ppfunc, 290000); // Poll for power state every 4 minutes 50 seconds.
343
+ fetchPowerState(dev);
344
+ });
345
} else {
346
// We got a bad response
347
if ((dev.conntype == 1) && (dev.tlsfail !== true) && (status == 408)) {
@@ -442,6 +446,40 @@ module.exports.CreateAmtManager = function(parent) {
446
});
447
}
448
449
+ // Attempt to sync the Intel AMT clock if needed, call func back when done.
450
+ // Care should be take not to have many pending WSMAN called when performing clock sync.
451
+ function attemptSyncClock(dev, func) {
452
+ if (obj.amtDevices[dev.nodeid] == null) return false; // Device no longer exists, ignore this request.
453
+ dev.clockSyncCompleted = func;
454
+ dev.amtstack.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch(attemptSyncClockEx);
455
+ }
456
+
457
+ // Intel AMT clock query response
458
+ function attemptSyncClockEx(stack, name, response, status) {
459
+ const dev = stack.dev;
460
+ if (obj.amtDevices[dev.nodeid] == null) return; // Device no longer exists, ignore this response.
461
+ if (status != 200) { removeDevice(dev.nodeid); }
462
+
463
+ // Compute how much drift between Intel AMT and our clock.
464
+ var t = new Date(), now = new Date();
465
+ t.setTime(response.Body['Ta0'] * 1000);
466
+ if (Math.abs(t - now) > 10000) { // If the Intel AMT clock is more than 10 seconds off, set it.
467
+ var Tm1 = Math.round(now.getTime() / 1000);
468
+ dev.amtstack.AMT_TimeSynchronizationService_SetHighAccuracyTimeSynch(response.Body['Ta0'], Tm1, Tm1, attemptSyncClockSet);
469
+ } else {
470
+ // Clock is fine, we are done.
471
+ if (dev.clockSyncCompleted != null) { var f = dev.clockSyncCompleted; delete dev.clockSyncCompleted; f(); }
472
+ }
473
+ }
474
+
475
+ // Intel AMT clock set response
476
+ function attemptSyncClockSet(stack, name, responses, status) {
477
+ const dev = stack.dev;
478
+ if (obj.amtDevices[dev.nodeid] == null) return; // Device no longer exists, ignore this response.
479
+ if (status != 200) { removeDevice(dev.nodeid); }
480
+ if (dev.clockSyncCompleted != null) { var f = dev.clockSyncCompleted; delete dev.clockSyncCompleted; f(); }
481
+ }
482
+
483
function attemptFetchHardwareInventory(dev) {
484
if (obj.amtDevices[dev.nodeid] == null) return false; // Device no longer exists, ignore this request.
485
const mesh = parent.webserver.meshes[dev.meshid];