IP Conflict Diagnostics

Get IP Conflicts

GET /api/v1/diagnostics/ip-conflicts?area_id=<uuid>
GET /api/v1/diagnostics/ip-conflicts?pi_id=<uuid>
GET /api/v1/diagnostics/ip-conflicts?rd_id=<uuid>
GET /api/v1/diagnostics/ip-conflicts?network_id=<uuid>

Detects IP address conflicts and misconfigurations within the selected scope. Runs 4 SQL queries:

  1. Duplicate Router IDs — devices sharing the same router ID
  2. Duplicate IPs — interfaces on different devices sharing the same IP address
  3. Duplicate Prefixes — same network advertised by multiple devices within the same source type (stub or inter-area)
  4. Conflicting Externals — same prefix advertised by multiple ASBRs with different attributes (metric type, metric, or tag)

Auth: Any authenticated user.

Response: 200 OK

{
  "summary": {
    "duplicate_router_ids": 1,
    "duplicate_ips": 2,
    "duplicate_prefixes": 3,
    "conflicting_externals": 1,
    "total": 7
  },
  "duplicate_router_ids": [
    {
      "router_id": "10.0.0.1",
      "devices": [
        { "device_id": "uuid-1", "hostname": "router-a" },
        { "device_id": "uuid-2", "hostname": "router-b" }
      ]
    }
  ],
  "duplicate_ips": [
    {
      "ip_address": "192.168.1.1",
      "devices": [
        { "device_id": "uuid-1", "hostname": "router-a", "if_name": "GigabitEthernet0/0", "router_id": "10.0.0.1" },
        { "device_id": "uuid-3", "hostname": "router-c", "if_name": "GigabitEthernet0/1", "router_id": "10.0.0.3" }
      ]
    }
  ],
  "duplicate_prefixes": [
    {
      "network": "10.0.1.0/24",
      "source": "stub",
      "devices": [
        { "device_id": "10.0.0.1", "hostname": "router-a" },
        { "device_id": "10.0.0.2", "hostname": "router-b" }
      ]
    }
  ],
  "conflicting_externals": [
    {
      "network": "192.0.2.0/24",
      "entries": [
        { "adv_router": "10.0.0.5", "hostname": "asbr-1", "metric_type": 2, "metric": 100, "tag": 0, "is_nssa": false },
        { "adv_router": "10.0.0.6", "hostname": "asbr-2", "metric_type": 1, "metric": 200, "tag": 0, "is_nssa": false }
      ]
    }
  ]
}

Error responses:

Get Single Points of Failure

GET /api/v1/diagnostics/spof?area_id=<uuid>
GET /api/v1/diagnostics/spof?pi_id=<uuid>
GET /api/v1/diagnostics/spof?rd_id=<uuid>
GET /api/v1/diagnostics/spof?network_id=<uuid>

Identifies articulation points (cut vertices) and bridge links in the topology graph using Tarjan's algorithm. These are devices/links whose failure would partition the network into disconnected components. Only considers links with state "up".

Auth: Any authenticated user.

Response: 200 OK

{
  "summary": {
    "total_devices": 12,
    "total_links": 15,
    "articulation_points": 2,
    "bridge_links": 3
  },
  "articulation_points": [
    {
      "device_id": "uuid-1",
      "router_id": "10.0.0.1",
      "hostname": "core-rtr-1",
      "affected_components": 3
    }
  ],
  "bridge_links": [
    {
      "link_id": "uuid-link-1",
      "source_device_id": "uuid-1",
      "source_router_id": "10.0.0.1",
      "source_hostname": "core-rtr-1",
      "target_device_id": "uuid-2",
      "target_router_id": "10.0.0.2",
      "target_hostname": "edge-rtr-1",
      "affected_components": 2
    }
  ]
}

Fields:

Error responses:

Get Routing Stability Report

GET /api/v1/diagnostics/stability?area_id=<uuid>&period=24h
GET /api/v1/diagnostics/stability?pi_id=<uuid>&period=7d
GET /api/v1/diagnostics/stability?rd_id=<uuid>&period=6h
GET /api/v1/diagnostics/stability?network_id=<uuid>&period=1h

Identifies flapping links (frequent state changes) and unstable devices (high event rate) by aggregating topology_event data over the specified period. Uses SQL GROUP BY aggregation for efficiency.

Query parameters:

Response: 200 OK

{
  "flapping_links": [
    {
      "entity_id": "uuid",
      "source_router_id": "10.0.0.1",
      "source_hostname": "router-a",
      "target_router_id": "10.0.0.2",
      "target_hostname": "router-b",
      "state_changes": 7,
      "period_hours": 24,
      "first_event": "2026-02-23T10:15:00Z",
      "last_event": "2026-02-24T08:30:00Z"
    }
  ],
  "unstable_devices": [
    {
      "router_id": "10.0.0.3",
      "hostname": "router-c",
      "event_count": 25,
      "period_hours": 24,
      "breakdown": {
        "link_state_changed": 12,
        "link_added": 8,
        "link_removed": 5
      },
      "first_event": "2026-02-23T06:00:00Z",
      "last_event": "2026-02-24T09:45:00Z"
    }
  ],
  "summary": {
    "flapping_links": 1,
    "unstable_devices": 1,
    "total_events": 150,
    "period_hours": 24
  }
}

Thresholds:

Error responses:

Get Timer Consistency Report

GET /api/v1/diagnostics/timer-consistency?area_id=<uuid>
GET /api/v1/diagnostics/timer-consistency?pi_id=<uuid>
GET /api/v1/diagnostics/timer-consistency?rd_id=<uuid>
GET /api/v1/diagnostics/timer-consistency?network_id=<uuid>

Compares OSPF hello/dead timers, authentication type, network type, and MTU across interfaces that share a link within each area. Returns mismatches where two connected interfaces have different timer, configuration, or MTU values. Data is populated by the SNMP poller from OSPF-MIB (ospfIfHelloInterval, ospfIfRtrDeadInterval, ospfIfAuthType, ospfIfType) and IF-MIB (ifMtu).

Auth: Any authenticated user.

Query parameters:

Response: 200 OK

{
  "mismatches": [
    {
      "area_id": "uuid",
      "interface_a": {
        "device_id": "uuid",
        "router_id": "10.0.0.1",
        "hostname": "core-rtr-1",
        "ip_address": "192.168.1.1",
        "if_name": "Gi0/0/0",
        "hello_interval": 10,
        "dead_interval": 40,
        "auth_type": "md5",
        "network_type": "p2p",
        "if_mtu": 9000
      },
      "interface_b": {
        "device_id": "uuid",
        "router_id": "10.0.0.2",
        "hostname": "edge-rtr-1",
        "ip_address": "192.168.1.2",
        "if_name": "Gi0/1/0",
        "hello_interval": 30,
        "dead_interval": 120,
        "auth_type": "none",
        "network_type": "broadcast",
        "if_mtu": 1500
      },
      "mismatch_type": "hello_interval"
    }
  ],
  "summary": {
    "interfaces_checked": 42,
    "mismatches": 3
  }
}

Fields:

Error responses:


Get Best Practices Report

GET /api/v1/diagnostics/best-practices?area_id=<uuid>
GET /api/v1/diagnostics/best-practices?pi_id=<uuid>
GET /api/v1/diagnostics/best-practices?rd_id=<uuid>
GET /api/v1/diagnostics/best-practices?network_id=<uuid>

Best practices compliance report. Runs 5 automated OSPF checks (IS-IS areas are filtered out automatically):

  1. Reference Bandwidth Consistency (warning) — detects routers in same PI with different implied reference bandwidths
  2. Area 0 Contiguity (critical) — non-backbone areas with no ABR connected to backbone
  3. Stub Area Compliance (warning) — ASBRs in stub/totally_stub areas (Type 5 leakage risk)
  4. Router ID Uniqueness (critical) — duplicate router IDs across devices
  5. Passive Interface Suggestions (info) — interfaces with no peer that aren't loopback/stub/virtual

Auth: Any authenticated user.

Query parameters:

Response: 200 OK

{
  "findings": [{
    "category": "backbone_design",
    "severity": "critical",
    "title": "Area 0.0.1.20 has no backbone connectivity",
    "description": "No ABR in area 0.0.1.20 connects to area 0.0.0.0. 3 device(s) in this area are isolated from the backbone.",
    "devices": [{"id": "uuid", "name": "r1", "router_id": "10.0.0.1"}],
    "area_id": "uuid"
  }],
  "summary": {"total": 5, "critical": 1, "warning": 2, "info": 2, "devices_checked": 42, "areas_checked": 6}
}

Fields:

Error responses:


Get Asymmetric Costs

GET /api/v1/diagnostics/asymmetric-costs?area_id=<uuid>
GET /api/v1/diagnostics/asymmetric-costs?pi_id=<uuid>
GET /api/v1/diagnostics/asymmetric-costs?rd_id=<uuid>
GET /api/v1/diagnostics/asymmetric-costs?network_id=<uuid>

Returns all links where forward cost differs from reverse cost — a common OSPF misconfiguration that causes asymmetric routing. Only up links with both costs set (> 0) are checked.

Response: 200 OK

{
  "summary": {
    "total_links_checked": 87,
    "asymmetric_count": 3
  },
  "asymmetric_links": [
    {
      "link_id": "uuid",
      "area_id": "uuid",
      "area_label": "0.0.0.0",
      "link_type": "point-to-point",
      "source": {
        "device_id": "uuid",
        "router_id": "10.0.0.1",
        "name": "core-rtr-01",
        "cost": 10
      },
      "destination": {
        "device_id": "uuid",
        "router_id": "10.0.0.2",
        "name": "core-rtr-02",
        "cost": 20
      }
    }
  ]
}

Fields:

Error responses: