feat(core): DHCP in the simulation core, as in Swift
engine.ts ports Swift's "DHCP server and automatic client": an active server listens on port 67 from the start and offers a static assignment before its range, round from the address after the last one offered; offers last 10 s, dynamic leases a day, and a server whose offer another server beat blacklists that address for a while. A client starts as an event: DISCOVER, OFFER, a check by ARP, DECLINE, REQUEST, ACK or NAK, 2.5 s per wait, and after ten failures its old address back. The snapshot carries the DHCP settings of clients and servers. Four scenarios match the Swift engine. One Swift error is named in the oracle test: a client run directly is advanced a second time, to FINISH, by the server's answer within its own DISCOVER, and the outer run then writes back its stale copy of the status (Swift's value types); the address and every trace agree, only the reported status is wrong in Swift. Swift's three DHCP engine tests are ported, with tests for stopping and the message format. 15 mutation probes, 14 caught; the other concerns the home router, which runs only once NAT is ported. Two departures from Java remain, to be fixed next: from the event queue the client's ARP check does not wait, so an address conflict is never found, and each answer that wakes the client makes it send its state's message again (a second DISCOVER and REQUEST, the second answered with NAK). Java waits a round trip and sends once per attempt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,12 +1,17 @@
|
||||
// Ported from filius-ipad ios/FiliusPadTests/TopologyNetworkRuntimeEngineTests.swift:
|
||||
// the event queue, the virtual clock, Java-compatible randomness, restart,
|
||||
// Ethernet/switch/ARP/IPv4/ICMP, routing errors, the firewall, packet loss
|
||||
// and trace retention, UDP and TCP sockets. The remaining Swift tests (DHCP,
|
||||
// DNS, RIP, NAT, remote link, packet viewer) follow with their protocol
|
||||
// and trace retention, UDP and TCP sockets, DHCP. The remaining Swift tests
|
||||
// (DNS, RIP, NAT, remote link, packet viewer) follow with their protocol
|
||||
// slices.
|
||||
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import {
|
||||
decodeDhcpMessage,
|
||||
DHCP_DYNAMIC_LEASE_LIFETIME_MILLISECONDS,
|
||||
deviceConfiguration,
|
||||
dhcpServerConfiguration,
|
||||
encodeDhcpMessage,
|
||||
EMPTY_TOPOLOGY_SNAPSHOT,
|
||||
ETHERNET_BROADCAST_MAC_ADDRESS,
|
||||
firewallConfiguration,
|
||||
@@ -26,6 +31,8 @@ import {
|
||||
topologySnapshot,
|
||||
traceRetentionPolicy,
|
||||
UNSPECIFIED_MAC_ADDRESS,
|
||||
type DeviceConfiguration,
|
||||
type DhcpServerConfiguration,
|
||||
type EthernetFrame,
|
||||
type EthernetPayload,
|
||||
type FirewallConfiguration,
|
||||
@@ -212,6 +219,36 @@ describe('event queue and virtual clock', () => {
|
||||
expect(engine.bindUdpSocket(nodeId, { localPort: 7 })).toBe(uuid(1));
|
||||
});
|
||||
|
||||
it('forgets DHCP leases and client state on stop', () => {
|
||||
const [serverId, serverPortId, clientId, clientPortId] = [0x31, 0x32, 0x33, 0x34].map(uuid) as [string, string, string, string];
|
||||
const engine = startedEngine({
|
||||
nodes: [pc(serverId, serverPortId), pc(clientId, clientPortId)],
|
||||
links: [link(serverId, serverPortId, clientId, clientPortId)],
|
||||
deviceConfigurations: new Map([
|
||||
[serverId, device('10.4.0.1')],
|
||||
[clientId, device('0.0.0.0')],
|
||||
]),
|
||||
dhcpClientConfigurationsByNodeId: new Map([[clientId, { isEnabled: true }]]),
|
||||
dhcpServerConfigurationsByNodeId: new Map([
|
||||
[serverId, dhcpServerConfiguration({ isActive: true, lowerBoundIPAddress: '10.4.0.20', upperBoundIPAddress: '10.4.0.29' })],
|
||||
]),
|
||||
});
|
||||
engine.handle({ type: 'advance', toMilliseconds: 1_000 });
|
||||
expect(engine.state.dhcpLeasesByIPAddress.size).toBe(1);
|
||||
|
||||
engine.handle({ type: 'stop' });
|
||||
const state = engine.state;
|
||||
expect([
|
||||
state.dhcpOffersByIPAddress.size,
|
||||
state.dhcpLeasesByIPAddress.size,
|
||||
state.dhcpBlacklistByServerNodeId.size,
|
||||
state.dhcpLastOfferedAddressByServerNodeId.size,
|
||||
state.dhcpServerSocketIdsByNodeId.size,
|
||||
state.dhcpClientStatusesByNodeId.size,
|
||||
state.dhcpClientContextsByNodeId.size,
|
||||
]).toEqual([0, 0, 0, 0, 0, 0, 0]);
|
||||
});
|
||||
|
||||
it('forgets TCP sessions and accepted sockets on stop', () => {
|
||||
const [clientId, clientPortId, serverId, serverPortId] = [0x21, 0x22, 0x23, 0x24].map(uuid) as [string, string, string, string];
|
||||
const engine = startedEngine({
|
||||
@@ -867,3 +904,108 @@ describe('TCP sockets', () => {
|
||||
expect(engine.state.socketsById.get(listenerId)?.tcpState).toBe('LISTEN');
|
||||
});
|
||||
});
|
||||
|
||||
describe('DHCP', () => {
|
||||
const serverAndClient = (first: number, serverIp: string, client: DeviceConfiguration, server: Partial<DhcpServerConfiguration>) => {
|
||||
const [serverId, serverPortId, clientId, clientPortId] = [first, first + 1, first + 2, first + 3].map(uuid) as [string, string, string, string];
|
||||
const engine = startedEngine(
|
||||
{
|
||||
nodes: [pc(serverId, serverPortId), pc(clientId, clientPortId)],
|
||||
links: [link(serverId, serverPortId, clientId, clientPortId)],
|
||||
deviceConfigurations: new Map([
|
||||
[serverId, device(serverIp)],
|
||||
[clientId, client],
|
||||
]),
|
||||
dhcpClientConfigurationsByNodeId: new Map([[clientId, { isEnabled: true }]]),
|
||||
dhcpServerConfigurationsByNodeId: new Map([[serverId, dhcpServerConfiguration({ isActive: true, ...server })]]),
|
||||
},
|
||||
16,
|
||||
);
|
||||
return { engine, clientId, clientPortId };
|
||||
};
|
||||
|
||||
it('completes DISCOVER, OFFER, REQUEST and ACK and applies the configuration', () => {
|
||||
const { engine, clientId } = serverAndClient(0x1601, '192.168.50.1', device('169.254.1.2', { mask: '0.0.0.0' }), {
|
||||
lowerBoundIPAddress: '192.168.50.20',
|
||||
upperBoundIPAddress: '192.168.50.29',
|
||||
gatewayIPAddress: '192.168.50.1',
|
||||
dnsServerIPAddress: '192.168.50.53',
|
||||
useOwnSettings: true,
|
||||
});
|
||||
|
||||
engine.handle({ type: 'advance', toMilliseconds: 1_000 });
|
||||
|
||||
expect(engine.state.topologySnapshot.deviceConfigurations.get(clientId)).toEqual(
|
||||
deviceConfiguration('192.168.50.20', '255.255.255.0', '192.168.50.1', '192.168.50.53'),
|
||||
);
|
||||
const status = engine.state.dhcpClientStatusesByNodeId.get(clientId);
|
||||
expect([status?.state, status?.errorCount, status?.succeeded]).toEqual(['FINISH', 0, true]);
|
||||
const leaseExpiry = [...engine.state.dhcpLeasesByIPAddress.values()][0]?.expiresAtMilliseconds;
|
||||
expect(leaseExpiry).toBeGreaterThan(engine.state.currentTimeMilliseconds);
|
||||
expect(leaseExpiry! - engine.state.currentTimeMilliseconds).toBeLessThanOrEqual(DHCP_DYNAMIC_LEASE_LIFETIME_MILLISECONDS);
|
||||
const details = engine.state.packetTraces.map((trace) => trace.detail);
|
||||
for (const message of ['DHCPDISCOVER', 'DHCPOFFER', 'DHCPREQUEST', 'DHCPACK']) expect(details).toContain(message);
|
||||
});
|
||||
|
||||
it('matches a static assignment regardless of case, with a lease that does not expire', () => {
|
||||
const clientPortId = uuid(0x1611 + 3);
|
||||
const { engine, clientId } = serverAndClient(0x1611, '10.0.0.1', device('0.0.0.0'), {
|
||||
lowerBoundIPAddress: '10.0.0.20',
|
||||
upperBoundIPAddress: '10.0.0.20',
|
||||
staticAssignments: [{ id: 'static', macAddress: stableMacAddress(clientPortId).toLowerCase(), ipAddress: '10.0.0.99' }],
|
||||
});
|
||||
|
||||
engine.handle({ type: 'advance', toMilliseconds: 1_000 });
|
||||
|
||||
expect(engine.state.topologySnapshot.deviceConfigurations.get(clientId)?.ipAddress).toBe('10.0.0.99');
|
||||
expect([...engine.state.dhcpLeasesByIPAddress.values()][0]?.expiresAtMilliseconds).toBeUndefined();
|
||||
});
|
||||
|
||||
it('retries ten timeouts and gives back only the old address', () => {
|
||||
const clientId = uuid(0x1621);
|
||||
const oldConfiguration = deviceConfiguration('169.254.5.7', '255.255.0.0', '169.254.0.1', '169.254.0.53');
|
||||
const engine = startedEngine(
|
||||
{
|
||||
nodes: [pc(clientId, uuid(0x1622))],
|
||||
links: [],
|
||||
deviceConfigurations: new Map([[clientId, oldConfiguration]]),
|
||||
dhcpClientConfigurationsByNodeId: new Map([[clientId, { isEnabled: true }]]),
|
||||
},
|
||||
16,
|
||||
);
|
||||
|
||||
engine.handle({ type: 'advance', toMilliseconds: 0 });
|
||||
expect(engine.state.topologySnapshot.deviceConfigurations.get(clientId)?.ipAddress).toBe('0.0.0.0');
|
||||
expect(engine.state.dhcpClientStatusesByNodeId.get(clientId)?.state).toBe('DISCOVER');
|
||||
expect(engine.state.dhcpClientStatusesByNodeId.get(clientId)?.errorCount).toBe(0);
|
||||
|
||||
engine.handle({ type: 'advance', toMilliseconds: 25_000 });
|
||||
|
||||
const status = engine.state.dhcpClientStatusesByNodeId.get(clientId);
|
||||
expect([status?.state, status?.errorCount, status?.succeeded]).toEqual(['FINISH', 10, false]);
|
||||
expect(engine.state.topologySnapshot.deviceConfigurations.get(clientId)).toEqual(oldConfiguration);
|
||||
expect(engine.state.dhcpClientContextsByNodeId.has(clientId)).toBe(false);
|
||||
expect(engine.state.socketsById.size).toBe(0);
|
||||
});
|
||||
|
||||
it("writes and reads a message in Swift's text format", () => {
|
||||
const message = {
|
||||
type: 'DHCPOFFER' as const,
|
||||
yourIPAddress: '10.0.0.5',
|
||||
clientMacAddress: '02:00:00:00:00:01',
|
||||
subnetMask: '255.255.255.0',
|
||||
routerIPAddress: '10.0.0.1',
|
||||
dnsServerIPAddress: '10.0.0.53',
|
||||
requestedIPAddress: '',
|
||||
serverIdentifier: '10.0.0.1',
|
||||
};
|
||||
const text = new TextDecoder().decode(encodeDhcpMessage(message));
|
||||
expect(text).toBe(
|
||||
'DHCPOFFER\nyiaddr=10.0.0.5\nchaddr=02:00:00:00:00:01\nrouter=10.0.0.1\nsubnetmask=255.255.255.0\ndnsserver=10.0.0.53\nserverident=10.0.0.1',
|
||||
);
|
||||
const { requestedIPAddress: _empty, ...withoutEmpty } = message;
|
||||
expect(decodeDhcpMessage(new TextEncoder().encode(text))).toEqual(withoutEmpty);
|
||||
expect(decodeDhcpMessage(new TextEncoder().encode('dhcpack\nyiaddr=1.2.3.4\nnoise'))).toEqual({ type: 'DHCPACK', yourIPAddress: '1.2.3.4' });
|
||||
expect(decodeDhcpMessage(new TextEncoder().encode('HELLO'))).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -9,6 +9,7 @@ import { fileURLToPath } from 'node:url';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import {
|
||||
deviceConfiguration,
|
||||
dhcpServerConfiguration,
|
||||
firewallConfiguration,
|
||||
firewallRule,
|
||||
interfaceKey,
|
||||
@@ -16,6 +17,7 @@ import {
|
||||
portSnapshot,
|
||||
switchConfiguration,
|
||||
topologySnapshot,
|
||||
type DhcpClientStatus,
|
||||
type FirewallConfiguration,
|
||||
type IPv4DeliveryResult,
|
||||
type IcmpObservation,
|
||||
@@ -55,6 +57,11 @@ interface Scenario {
|
||||
}[];
|
||||
}
|
||||
>;
|
||||
dhcpServers?: Record<
|
||||
string,
|
||||
{ active?: boolean; lower?: string; upper?: string; gateway?: string; dns?: string; own?: boolean; staticAssignments?: [string, string][] }
|
||||
>;
|
||||
dhcpClients?: string[];
|
||||
steps: {
|
||||
op: string;
|
||||
from?: string;
|
||||
@@ -144,6 +151,25 @@ function snapshotOf(scenario: Scenario): TopologySnapshot {
|
||||
),
|
||||
]),
|
||||
),
|
||||
dhcpServerConfigurationsByNodeId: new Map(
|
||||
Object.entries(scenario.dhcpServers ?? {}).map(([node, config]) => [
|
||||
node,
|
||||
dhcpServerConfiguration({
|
||||
isActive: config.active ?? false,
|
||||
lowerBoundIPAddress: config.lower ?? '0.0.0.0',
|
||||
upperBoundIPAddress: config.upper ?? '0.0.0.0',
|
||||
gatewayIPAddress: config.gateway ?? '0.0.0.0',
|
||||
dnsServerIPAddress: config.dns ?? '0.0.0.0',
|
||||
useOwnSettings: config.own ?? false,
|
||||
staticAssignments: (config.staticAssignments ?? []).map(([macAddress, ipAddress], index) => ({
|
||||
id: `static-${index}`,
|
||||
macAddress,
|
||||
ipAddress,
|
||||
})),
|
||||
}),
|
||||
]),
|
||||
),
|
||||
dhcpClientConfigurationsByNodeId: new Map((scenario.dhcpClients ?? []).map((node) => [node, { isEnabled: true }])),
|
||||
switchConfigurationsByNodeId: new Map(
|
||||
Object.entries(scenario.switches ?? {}).map(([node, config]) => [
|
||||
node,
|
||||
@@ -156,6 +182,16 @@ function snapshotOf(scenario: Scenario): TopologySnapshot {
|
||||
|
||||
const upper = (id: string) => id.toUpperCase();
|
||||
|
||||
function dhcpStatusJson(status: DhcpClientStatus) {
|
||||
return {
|
||||
state: status.state,
|
||||
errors: status.errorCount,
|
||||
server: status.selectedServerIPAddress ?? null,
|
||||
offered: status.offeredIPAddress ?? null,
|
||||
succeeded: status.succeeded,
|
||||
};
|
||||
}
|
||||
|
||||
function traceJson(event: TraceEvent): Record<string, unknown> {
|
||||
return {
|
||||
id: event.id,
|
||||
@@ -315,6 +351,11 @@ function run(scenario: Scenario): Record<string, unknown> {
|
||||
case 'cleanTcp':
|
||||
results.push(engine.cleanClosedTcpSocket(step.socket!));
|
||||
break;
|
||||
case 'runDhcp': {
|
||||
const status = engine.runDhcpClient(step.node!);
|
||||
results.push(status === undefined ? null : dhcpStatusJson(status));
|
||||
break;
|
||||
}
|
||||
case 'closeSocket':
|
||||
engine.closeSocket(step.socket!);
|
||||
results.push(!engine.state.socketsById.has(step.socket!));
|
||||
@@ -339,6 +380,25 @@ function run(scenario: Scenario): Record<string, unknown> {
|
||||
Object.fromEntries([...table].map(([mac, port]) => [mac, upper(port)])),
|
||||
),
|
||||
icmpObservations: mapOf(state.icmpObservationsByNodeId, (items) => items.map(observationJson)),
|
||||
devices: Object.fromEntries(
|
||||
[...state.topologySnapshot.deviceConfigurations].map(([node, device]) => [
|
||||
upper(node),
|
||||
[device.ipAddress, device.subnetMask, device.defaultGateway, device.dnsServer],
|
||||
]),
|
||||
),
|
||||
dhcp: {
|
||||
clients: mapOf(state.dhcpClientStatusesByNodeId, dhcpStatusJson),
|
||||
leases: [...state.dhcpLeasesByIPAddress]
|
||||
.sort(([lhs], [rhs]) => (lhs < rhs ? -1 : 1))
|
||||
.map(([key, lease]) => [key, lease.clientMacAddress, lease.ipAddress, lease.expiresAtMilliseconds ?? null]),
|
||||
offers: [...state.dhcpOffersByIPAddress]
|
||||
.sort(([lhs], [rhs]) => (lhs < rhs ? -1 : 1))
|
||||
.map(([key, offer]) => [key, offer.clientMacAddress, offer.expiresAtMilliseconds]),
|
||||
blacklist: mapOf(state.dhcpBlacklistByServerNodeId, (entries) =>
|
||||
[...entries].sort(([lhs], [rhs]) => (lhs < rhs ? -1 : 1)).map(([address, expiry]) => [address, expiry]),
|
||||
),
|
||||
servers: mapOf(state.dhcpServerSocketIdsByNodeId, upper),
|
||||
},
|
||||
sockets: [...state.socketsById.values()]
|
||||
.sort((lhs, rhs) => (upper(lhs.id) < upper(rhs.id) ? -1 : 1))
|
||||
.map((socket) => ({
|
||||
@@ -378,7 +438,35 @@ const scenarioNames = readdirSync(scenarioDirectory)
|
||||
.map((name) => name.replace('.scenario.json', ''))
|
||||
.sort();
|
||||
|
||||
/**
|
||||
* Where the Swift engine is wrong, per scenario: its result corrected.
|
||||
*
|
||||
* dhcp-lan: a DHCP client run directly (not from the event queue) sends its
|
||||
* DISCOVER at once; the server's OFFER arrives within that send, and the
|
||||
* UDP delivery advances the client again — to FINISH, with the address set.
|
||||
* The outer run then writes back its stale copy of the status (Swift's
|
||||
* value types): DISCOVER, not succeeded. The address and every trace are
|
||||
* the same; only the reported status is wrong in Swift.
|
||||
*/
|
||||
const SWIFT_ERRORS: Record<string, (expected: Record<string, unknown>) => Record<string, unknown>> = {
|
||||
'dhcp-lan': (expected) => {
|
||||
const client = '00000000-0000-0000-0000-000000000102';
|
||||
const finished = { errors: 0, offered: '192.168.0.102', server: '192.168.0.10', state: 'FINISH', succeeded: true };
|
||||
const results = [...(expected.results as unknown[])];
|
||||
results[1] = finished;
|
||||
const dhcp = expected.dhcp as { clients: Record<string, unknown> };
|
||||
return { ...expected, results, dhcp: { ...dhcp, clients: { ...dhcp.clients, [client]: finished } } };
|
||||
},
|
||||
};
|
||||
|
||||
describe('same result as the Swift engine', () => {
|
||||
it('corrects Swift only where it errs', () => {
|
||||
for (const [name, correct] of Object.entries(SWIFT_ERRORS)) {
|
||||
const expected = JSON.parse(readFileSync(join(scenarioDirectory, `${name}.swift.json`), 'utf8')) as Record<string, unknown>;
|
||||
expect(JSON.stringify(correct(expected)), name).not.toBe(JSON.stringify(expected));
|
||||
}
|
||||
});
|
||||
|
||||
it('has scenarios with Swift results', () => {
|
||||
expect(scenarioNames.length).toBeGreaterThan(0);
|
||||
});
|
||||
@@ -386,10 +474,8 @@ describe('same result as the Swift engine', () => {
|
||||
for (const name of scenarioNames) {
|
||||
it(name, () => {
|
||||
const scenario = JSON.parse(readFileSync(join(scenarioDirectory, `${name}.scenario.json`), 'utf8')) as Scenario;
|
||||
const expected = JSON.parse(readFileSync(join(scenarioDirectory, `${name}.swift.json`), 'utf8')) as Record<
|
||||
string,
|
||||
unknown
|
||||
>;
|
||||
const swift = JSON.parse(readFileSync(join(scenarioDirectory, `${name}.swift.json`), 'utf8')) as Record<string, unknown>;
|
||||
const expected = SWIFT_ERRORS[name]?.(swift) ?? swift;
|
||||
const actual = run(scenario);
|
||||
|
||||
// Traces first and one by one: the first difference is the one that matters.
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"seed": 43,
|
||||
"nodes": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000101",
|
||||
"kind": "pc",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000111",
|
||||
"label": "eth0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000102",
|
||||
"kind": "pc",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000112",
|
||||
"label": "eth0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000103",
|
||||
"kind": "pc",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000113",
|
||||
"label": "eth0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000104",
|
||||
"kind": "networkSwitch",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000121",
|
||||
"label": "sw1"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000122",
|
||||
"label": "sw2"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000123",
|
||||
"label": "sw3"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000124",
|
||||
"label": "sw4"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"links": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-00000000F001",
|
||||
"sourceNode": "00000000-0000-0000-0000-000000000101",
|
||||
"sourcePort": "00000000-0000-0000-0000-000000000111",
|
||||
"targetNode": "00000000-0000-0000-0000-000000000104",
|
||||
"targetPort": "00000000-0000-0000-0000-000000000121"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-00000000F002",
|
||||
"sourceNode": "00000000-0000-0000-0000-000000000102",
|
||||
"sourcePort": "00000000-0000-0000-0000-000000000112",
|
||||
"targetNode": "00000000-0000-0000-0000-000000000104",
|
||||
"targetPort": "00000000-0000-0000-0000-000000000122"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-00000000F003",
|
||||
"sourceNode": "00000000-0000-0000-0000-000000000103",
|
||||
"sourcePort": "00000000-0000-0000-0000-000000000113",
|
||||
"targetNode": "00000000-0000-0000-0000-000000000104",
|
||||
"targetPort": "00000000-0000-0000-0000-000000000123"
|
||||
}
|
||||
],
|
||||
"devices": {
|
||||
"00000000-0000-0000-0000-000000000101": {
|
||||
"ip": "192.168.0.10",
|
||||
"mask": "255.255.255.0"
|
||||
},
|
||||
"00000000-0000-0000-0000-000000000102": {
|
||||
"ip": "169.254.1.2",
|
||||
"mask": "255.255.0.0"
|
||||
},
|
||||
"00000000-0000-0000-0000-000000000103": {
|
||||
"ip": "192.168.0.100",
|
||||
"mask": "255.255.255.0"
|
||||
}
|
||||
},
|
||||
"switches": {
|
||||
"00000000-0000-0000-0000-000000000104": {
|
||||
"ssid": "lab",
|
||||
"retention": 5000
|
||||
}
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"op": "advance",
|
||||
"to": 60000
|
||||
}
|
||||
],
|
||||
"dhcpServers": {
|
||||
"00000000-0000-0000-0000-000000000101": {
|
||||
"active": true,
|
||||
"lower": "192.168.0.100",
|
||||
"upper": "192.168.0.100"
|
||||
}
|
||||
},
|
||||
"dhcpClients": [
|
||||
"00000000-0000-0000-0000-000000000102"
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,144 @@
|
||||
{
|
||||
"seed": 41,
|
||||
"nodes": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000101",
|
||||
"kind": "pc",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000111",
|
||||
"label": "eth0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000102",
|
||||
"kind": "pc",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000112",
|
||||
"label": "eth0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000103",
|
||||
"kind": "pc",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000113",
|
||||
"label": "eth0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000104",
|
||||
"kind": "networkSwitch",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000121",
|
||||
"label": "sw1"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000122",
|
||||
"label": "sw2"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000123",
|
||||
"label": "sw3"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000124",
|
||||
"label": "sw4"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"links": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-00000000F001",
|
||||
"sourceNode": "00000000-0000-0000-0000-000000000101",
|
||||
"sourcePort": "00000000-0000-0000-0000-000000000111",
|
||||
"targetNode": "00000000-0000-0000-0000-000000000104",
|
||||
"targetPort": "00000000-0000-0000-0000-000000000121"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-00000000F002",
|
||||
"sourceNode": "00000000-0000-0000-0000-000000000102",
|
||||
"sourcePort": "00000000-0000-0000-0000-000000000112",
|
||||
"targetNode": "00000000-0000-0000-0000-000000000104",
|
||||
"targetPort": "00000000-0000-0000-0000-000000000122"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-00000000F003",
|
||||
"sourceNode": "00000000-0000-0000-0000-000000000103",
|
||||
"sourcePort": "00000000-0000-0000-0000-000000000113",
|
||||
"targetNode": "00000000-0000-0000-0000-000000000104",
|
||||
"targetPort": "00000000-0000-0000-0000-000000000123"
|
||||
}
|
||||
],
|
||||
"devices": {
|
||||
"00000000-0000-0000-0000-000000000101": {
|
||||
"ip": "192.168.0.10",
|
||||
"mask": "255.255.255.0"
|
||||
},
|
||||
"00000000-0000-0000-0000-000000000102": {
|
||||
"ip": "169.254.1.2",
|
||||
"mask": "255.255.0.0"
|
||||
},
|
||||
"00000000-0000-0000-0000-000000000103": {
|
||||
"ip": "169.254.1.3",
|
||||
"mask": "255.255.0.0"
|
||||
}
|
||||
},
|
||||
"switches": {
|
||||
"00000000-0000-0000-0000-000000000104": {
|
||||
"ssid": "lab",
|
||||
"retention": 5000
|
||||
}
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"op": "advance",
|
||||
"to": 20000
|
||||
},
|
||||
{
|
||||
"op": "runDhcp",
|
||||
"node": "00000000-0000-0000-0000-000000000102"
|
||||
},
|
||||
{
|
||||
"op": "ping",
|
||||
"from": "00000000-0000-0000-0000-000000000102",
|
||||
"target": "192.168.0.10",
|
||||
"identifier": 1,
|
||||
"sequence": 1
|
||||
},
|
||||
{
|
||||
"op": "ping",
|
||||
"from": "00000000-0000-0000-0000-000000000101",
|
||||
"target": "192.168.0.150",
|
||||
"identifier": 2,
|
||||
"sequence": 1
|
||||
}
|
||||
],
|
||||
"dhcpServers": {
|
||||
"00000000-0000-0000-0000-000000000101": {
|
||||
"active": true,
|
||||
"lower": "192.168.0.100",
|
||||
"upper": "192.168.0.102",
|
||||
"gateway": "192.168.0.1",
|
||||
"dns": "192.168.0.53",
|
||||
"own": true,
|
||||
"staticAssignments": [
|
||||
[
|
||||
"02:00:00:00:01:13",
|
||||
"192.168.0.150"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"dhcpClients": [
|
||||
"00000000-0000-0000-0000-000000000102",
|
||||
"00000000-0000-0000-0000-000000000103"
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,121 @@
|
||||
{
|
||||
"seed": 44,
|
||||
"nodes": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000101",
|
||||
"kind": "pc",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000111",
|
||||
"label": "eth0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000102",
|
||||
"kind": "pc",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000112",
|
||||
"label": "eth0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000103",
|
||||
"kind": "pc",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000113",
|
||||
"label": "eth0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000104",
|
||||
"kind": "networkSwitch",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000121",
|
||||
"label": "sw1"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000122",
|
||||
"label": "sw2"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000123",
|
||||
"label": "sw3"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000124",
|
||||
"label": "sw4"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"links": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-00000000F001",
|
||||
"sourceNode": "00000000-0000-0000-0000-000000000101",
|
||||
"sourcePort": "00000000-0000-0000-0000-000000000111",
|
||||
"targetNode": "00000000-0000-0000-0000-000000000104",
|
||||
"targetPort": "00000000-0000-0000-0000-000000000121"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-00000000F002",
|
||||
"sourceNode": "00000000-0000-0000-0000-000000000102",
|
||||
"sourcePort": "00000000-0000-0000-0000-000000000112",
|
||||
"targetNode": "00000000-0000-0000-0000-000000000104",
|
||||
"targetPort": "00000000-0000-0000-0000-000000000122"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-00000000F003",
|
||||
"sourceNode": "00000000-0000-0000-0000-000000000103",
|
||||
"sourcePort": "00000000-0000-0000-0000-000000000113",
|
||||
"targetNode": "00000000-0000-0000-0000-000000000104",
|
||||
"targetPort": "00000000-0000-0000-0000-000000000123"
|
||||
}
|
||||
],
|
||||
"devices": {
|
||||
"00000000-0000-0000-0000-000000000101": {
|
||||
"ip": "192.168.0.10",
|
||||
"mask": "255.255.255.0"
|
||||
},
|
||||
"00000000-0000-0000-0000-000000000102": {
|
||||
"ip": "169.254.1.2",
|
||||
"mask": "255.255.0.0"
|
||||
},
|
||||
"00000000-0000-0000-0000-000000000103": {
|
||||
"ip": "192.168.0.30",
|
||||
"mask": "255.255.255.0"
|
||||
}
|
||||
},
|
||||
"switches": {
|
||||
"00000000-0000-0000-0000-000000000104": {
|
||||
"ssid": "lab",
|
||||
"retention": 5000
|
||||
}
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"op": "advance",
|
||||
"to": 10000
|
||||
},
|
||||
{
|
||||
"op": "runDhcp",
|
||||
"node": "00000000-0000-0000-0000-000000000102"
|
||||
},
|
||||
{
|
||||
"op": "advance",
|
||||
"to": 60000
|
||||
},
|
||||
{
|
||||
"op": "runDhcp",
|
||||
"node": "00000000-0000-0000-0000-000000000101"
|
||||
}
|
||||
],
|
||||
"dhcpClients": [
|
||||
"00000000-0000-0000-0000-000000000102"
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"seed": 42,
|
||||
"nodes": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000101",
|
||||
"kind": "pc",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000111",
|
||||
"label": "eth0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000102",
|
||||
"kind": "pc",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000112",
|
||||
"label": "eth0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000103",
|
||||
"kind": "pc",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000113",
|
||||
"label": "eth0"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000104",
|
||||
"kind": "networkSwitch",
|
||||
"ports": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000121",
|
||||
"label": "sw1"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000122",
|
||||
"label": "sw2"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000123",
|
||||
"label": "sw3"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-000000000124",
|
||||
"label": "sw4"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"links": [
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-00000000F001",
|
||||
"sourceNode": "00000000-0000-0000-0000-000000000101",
|
||||
"sourcePort": "00000000-0000-0000-0000-000000000111",
|
||||
"targetNode": "00000000-0000-0000-0000-000000000104",
|
||||
"targetPort": "00000000-0000-0000-0000-000000000121"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-00000000F002",
|
||||
"sourceNode": "00000000-0000-0000-0000-000000000102",
|
||||
"sourcePort": "00000000-0000-0000-0000-000000000112",
|
||||
"targetNode": "00000000-0000-0000-0000-000000000104",
|
||||
"targetPort": "00000000-0000-0000-0000-000000000122"
|
||||
},
|
||||
{
|
||||
"id": "00000000-0000-0000-0000-00000000F003",
|
||||
"sourceNode": "00000000-0000-0000-0000-000000000103",
|
||||
"sourcePort": "00000000-0000-0000-0000-000000000113",
|
||||
"targetNode": "00000000-0000-0000-0000-000000000104",
|
||||
"targetPort": "00000000-0000-0000-0000-000000000123"
|
||||
}
|
||||
],
|
||||
"devices": {
|
||||
"00000000-0000-0000-0000-000000000101": {
|
||||
"ip": "192.168.0.10",
|
||||
"mask": "255.255.255.0",
|
||||
"gateway": "192.168.0.254"
|
||||
},
|
||||
"00000000-0000-0000-0000-000000000102": {
|
||||
"ip": "169.254.1.2",
|
||||
"mask": "255.255.0.0"
|
||||
},
|
||||
"00000000-0000-0000-0000-000000000103": {
|
||||
"ip": "192.168.0.30",
|
||||
"mask": "255.255.255.0"
|
||||
}
|
||||
},
|
||||
"switches": {
|
||||
"00000000-0000-0000-0000-000000000104": {
|
||||
"ssid": "lab",
|
||||
"retention": 5000
|
||||
}
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"op": "advance",
|
||||
"to": 20000
|
||||
}
|
||||
],
|
||||
"dhcpServers": {
|
||||
"00000000-0000-0000-0000-000000000101": {
|
||||
"active": true,
|
||||
"lower": "192.168.0.100",
|
||||
"upper": "192.168.0.110"
|
||||
},
|
||||
"00000000-0000-0000-0000-000000000103": {
|
||||
"active": true,
|
||||
"lower": "192.168.0.200",
|
||||
"upper": "192.168.0.210",
|
||||
"own": true,
|
||||
"gateway": "192.168.0.1",
|
||||
"dns": "8.8.8.8"
|
||||
}
|
||||
},
|
||||
"dhcpClients": [
|
||||
"00000000-0000-0000-0000-000000000102"
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -13,6 +13,49 @@
|
||||
"10.1.0.2" : "02:00:00:00:04:11"
|
||||
}
|
||||
},
|
||||
"devices" : {
|
||||
"00000000-0000-0000-0000-000000000401" : [
|
||||
"10.1.0.2",
|
||||
"255.255.255.0",
|
||||
"10.1.0.1",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000402" : [
|
||||
"10.1.0.1",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000403" : [
|
||||
"10.2.0.2",
|
||||
"255.255.255.0",
|
||||
"10.2.0.1",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000404" : [
|
||||
"10.1.0.3",
|
||||
"255.255.255.0",
|
||||
"10.1.0.1",
|
||||
""
|
||||
]
|
||||
},
|
||||
"dhcp" : {
|
||||
"blacklist" : {
|
||||
|
||||
},
|
||||
"clients" : {
|
||||
|
||||
},
|
||||
"leases" : [
|
||||
|
||||
],
|
||||
"offers" : [
|
||||
|
||||
],
|
||||
"servers" : {
|
||||
|
||||
}
|
||||
},
|
||||
"firewallDecisions" : [
|
||||
{
|
||||
"accepted" : false,
|
||||
|
||||
@@ -11,6 +11,43 @@
|
||||
"20.0.0.1" : "02:00:00:00:02:22"
|
||||
}
|
||||
},
|
||||
"devices" : {
|
||||
"00000000-0000-0000-0000-000000000201" : [
|
||||
"10.0.0.2",
|
||||
"255.255.255.0",
|
||||
"10.0.0.1",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000202" : [
|
||||
"10.0.0.1",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000203" : [
|
||||
"20.0.0.2",
|
||||
"255.255.255.0",
|
||||
"20.0.0.1",
|
||||
""
|
||||
]
|
||||
},
|
||||
"dhcp" : {
|
||||
"blacklist" : {
|
||||
|
||||
},
|
||||
"clients" : {
|
||||
|
||||
},
|
||||
"leases" : [
|
||||
|
||||
],
|
||||
"offers" : [
|
||||
|
||||
],
|
||||
"servers" : {
|
||||
|
||||
}
|
||||
},
|
||||
"firewallDecisions" : [
|
||||
{
|
||||
"accepted" : true,
|
||||
|
||||
@@ -15,6 +15,55 @@
|
||||
"172.16.0.1" : "02:00:00:00:03:32"
|
||||
}
|
||||
},
|
||||
"devices" : {
|
||||
"00000000-0000-0000-0000-000000000301" : [
|
||||
"192.168.1.10",
|
||||
"255.255.255.0",
|
||||
"192.168.1.1",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000302" : [
|
||||
"192.168.1.1",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000303" : [
|
||||
"10.10.10.2",
|
||||
"255.255.255.0",
|
||||
"10.10.10.1",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000304" : [
|
||||
"172.16.0.10",
|
||||
"255.255.0.0",
|
||||
"172.16.0.1",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000305" : [
|
||||
"172.16.0.20",
|
||||
"255.255.0.0",
|
||||
"",
|
||||
""
|
||||
]
|
||||
},
|
||||
"dhcp" : {
|
||||
"blacklist" : {
|
||||
|
||||
},
|
||||
"clients" : {
|
||||
|
||||
},
|
||||
"leases" : [
|
||||
|
||||
],
|
||||
"offers" : [
|
||||
|
||||
],
|
||||
"servers" : {
|
||||
|
||||
}
|
||||
},
|
||||
"firewallDecisions" : [
|
||||
{
|
||||
"accepted" : true,
|
||||
|
||||
@@ -7,6 +7,37 @@
|
||||
"10.5.0.1" : "02:00:00:00:05:11"
|
||||
}
|
||||
},
|
||||
"devices" : {
|
||||
"00000000-0000-0000-0000-000000000501" : [
|
||||
"10.5.0.1",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000502" : [
|
||||
"10.5.0.2",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
]
|
||||
},
|
||||
"dhcp" : {
|
||||
"blacklist" : {
|
||||
|
||||
},
|
||||
"clients" : {
|
||||
|
||||
},
|
||||
"leases" : [
|
||||
|
||||
],
|
||||
"offers" : [
|
||||
|
||||
],
|
||||
"servers" : {
|
||||
|
||||
}
|
||||
},
|
||||
"firewallDecisions" : [
|
||||
|
||||
],
|
||||
|
||||
@@ -13,6 +13,43 @@
|
||||
"192.168.0.20" : "02:00:00:00:01:12"
|
||||
}
|
||||
},
|
||||
"devices" : {
|
||||
"00000000-0000-0000-0000-000000000101" : [
|
||||
"192.168.0.10",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000102" : [
|
||||
"192.168.0.20",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000103" : [
|
||||
"192.168.0.30",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
]
|
||||
},
|
||||
"dhcp" : {
|
||||
"blacklist" : {
|
||||
|
||||
},
|
||||
"clients" : {
|
||||
|
||||
},
|
||||
"leases" : [
|
||||
|
||||
],
|
||||
"offers" : [
|
||||
|
||||
],
|
||||
"servers" : {
|
||||
|
||||
}
|
||||
},
|
||||
"firewallDecisions" : [
|
||||
|
||||
],
|
||||
|
||||
@@ -10,6 +10,43 @@
|
||||
"192.168.0.20" : "02:00:00:00:01:12"
|
||||
}
|
||||
},
|
||||
"devices" : {
|
||||
"00000000-0000-0000-0000-000000000101" : [
|
||||
"192.168.0.10",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000102" : [
|
||||
"192.168.0.20",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000103" : [
|
||||
"192.168.0.30",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
]
|
||||
},
|
||||
"dhcp" : {
|
||||
"blacklist" : {
|
||||
|
||||
},
|
||||
"clients" : {
|
||||
|
||||
},
|
||||
"leases" : [
|
||||
|
||||
],
|
||||
"offers" : [
|
||||
|
||||
],
|
||||
"servers" : {
|
||||
|
||||
}
|
||||
},
|
||||
"firewallDecisions" : [
|
||||
|
||||
],
|
||||
|
||||
@@ -13,6 +13,43 @@
|
||||
"192.168.0.20" : "02:00:00:00:01:12"
|
||||
}
|
||||
},
|
||||
"devices" : {
|
||||
"00000000-0000-0000-0000-000000000101" : [
|
||||
"192.168.0.10",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000102" : [
|
||||
"192.168.0.20",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000103" : [
|
||||
"192.168.0.30",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
]
|
||||
},
|
||||
"dhcp" : {
|
||||
"blacklist" : {
|
||||
|
||||
},
|
||||
"clients" : {
|
||||
|
||||
},
|
||||
"leases" : [
|
||||
|
||||
],
|
||||
"offers" : [
|
||||
|
||||
],
|
||||
"servers" : {
|
||||
|
||||
}
|
||||
},
|
||||
"firewallDecisions" : [
|
||||
|
||||
],
|
||||
|
||||
@@ -11,6 +11,43 @@
|
||||
"20.0.0.1" : "02:00:00:00:02:22"
|
||||
}
|
||||
},
|
||||
"devices" : {
|
||||
"00000000-0000-0000-0000-000000000201" : [
|
||||
"10.0.0.2",
|
||||
"255.255.255.0",
|
||||
"10.0.0.1",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000202" : [
|
||||
"10.0.0.1",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000203" : [
|
||||
"20.0.0.2",
|
||||
"255.255.255.0",
|
||||
"20.0.0.1",
|
||||
""
|
||||
]
|
||||
},
|
||||
"dhcp" : {
|
||||
"blacklist" : {
|
||||
|
||||
},
|
||||
"clients" : {
|
||||
|
||||
},
|
||||
"leases" : [
|
||||
|
||||
],
|
||||
"offers" : [
|
||||
|
||||
],
|
||||
"servers" : {
|
||||
|
||||
}
|
||||
},
|
||||
"firewallDecisions" : [
|
||||
{
|
||||
"accepted" : true,
|
||||
|
||||
@@ -11,6 +11,43 @@
|
||||
"192.168.0.20" : "02:00:00:00:01:12"
|
||||
}
|
||||
},
|
||||
"devices" : {
|
||||
"00000000-0000-0000-0000-000000000101" : [
|
||||
"192.168.0.10",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000102" : [
|
||||
"192.168.0.20",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000103" : [
|
||||
"192.168.0.30",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
]
|
||||
},
|
||||
"dhcp" : {
|
||||
"blacklist" : {
|
||||
|
||||
},
|
||||
"clients" : {
|
||||
|
||||
},
|
||||
"leases" : [
|
||||
|
||||
],
|
||||
"offers" : [
|
||||
|
||||
],
|
||||
"servers" : {
|
||||
|
||||
}
|
||||
},
|
||||
"firewallDecisions" : [
|
||||
|
||||
],
|
||||
|
||||
@@ -11,6 +11,43 @@
|
||||
"20.0.0.1" : "02:00:00:00:02:22"
|
||||
}
|
||||
},
|
||||
"devices" : {
|
||||
"00000000-0000-0000-0000-000000000201" : [
|
||||
"10.0.0.2",
|
||||
"255.255.255.0",
|
||||
"10.0.0.1",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000202" : [
|
||||
"10.0.0.1",
|
||||
"255.255.255.0",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"00000000-0000-0000-0000-000000000203" : [
|
||||
"20.0.0.2",
|
||||
"255.255.255.0",
|
||||
"20.0.0.1",
|
||||
""
|
||||
]
|
||||
},
|
||||
"dhcp" : {
|
||||
"blacklist" : {
|
||||
|
||||
},
|
||||
"clients" : {
|
||||
|
||||
},
|
||||
"leases" : [
|
||||
|
||||
],
|
||||
"offers" : [
|
||||
|
||||
],
|
||||
"servers" : {
|
||||
|
||||
}
|
||||
},
|
||||
"firewallDecisions" : [
|
||||
{
|
||||
"accepted" : true,
|
||||
|
||||
Reference in New Issue
Block a user