NDTwin Kernel API

Explain the usages of NDTWin kernel API, which is used by NDTWin applications and NDTWin tools for requesting data/services from the NDTwin kernel or asking the NDTwin kernel to control the network.

NDT RESTful API Documentation

1. POST /ndt/link_failure_detected

Description

Called by Ryu when a link-down event is detected. Marks the edge(s) DOWN and emits internal events.

Request

  • Method: POST

  • Content-Type: application/json

  • Body (the information of failed link)

{
  "src_dpid": 106225808402492,
  "src_interface": 23,
  "dst_dpid": 106225808387660,
  "dst_interface": 23
}

Response

Success

  • Status: 200 OK
{
  "status": "link failure processed"
}

Error

  • Status: 400 Bad Request
{
  "error": "Invalid link-failure payload"
}

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}
  • Status: 404 Not Found
{
  "error": "edge not found in topology"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

2. POST /ndt/link_recovery_detected

Description

Called by Ryu when a failed link becomes UP. Marks the edge(s) UP.

Request

  • Method: POST
  • Content-Type: application/json
  • Body (the information of recovered link)
{
  "src_dpid": 106225808402492,
  "src_interface": 23,
  "dst_dpid": 106225808387660,
  "dst_interface": 23
}

Response

Success

  • Status: 200 OK
{
  "status": "link recovery processed"
}

Error

  • Status: 400 Bad Request
{
  "error": "Missing src_dpid or dst_dpid or src_interface or dst_interface"
}

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}
  • Status: 404 Not Found
{
  "error": "edge not found in topology"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

3. GET /ndt/get_graph_data

Description

Returns the complete graph topology configured in setting/StaticNetworkTopology.json including nodes and edges, flow information, and edge status. vertex_type = 0 means a switch, and vertex_type = 1 means a host. is_up suggests whether a switch reply ping or whether a host is detected by Ryu. is_enable in switch node suggests whether the switch is connected to controller. At the edge between the switch and host, the dpid and interface on the host side are set to 0.

Note: src_ip/dst_ip are in network order.

Request

  • Method: GET

Response

Success

  • Status: 200 OK
{
  "nodes": [
    {
      "device_name": "s4",
      "dpid": 106225808380928,
      "ip": [
        168430090
      ],
      "is_enabled": true,
      "is_up": true,
      "mac": 0,
      "vertex_type": 0,
      "brand_name": "OVS",
      "device_layer": 1
    },
    {
      "device_name": "h9",
      "dpid": 0,
      "ip": [
        1157736640,
        1174513856,
        1107404992,
        1090627776,
        1191291072,
        1124182208,
        1140959424,
        1208068288
      ],
      "is_enabled": true,
      "is_up": true,
      "mac": 31362038109890,
      "vertex_type": 1,
      "brand_name": "",
      "device_layer": 3
    },
    ...
  ],
  "edges": [
    {
      "dst_dpid": 0,
      "dst_ip": [
        50440384,
        33663168,
        100772032,
        117549248,
        134326464,
        83994816,
        67217600,
        16885952
      ],
      "dst_interface": 0,
      "flow_set": [
        {
          "dst_ip": 2147592384,
          "dst_port": 5201,
          "protocol_number": 6,
          "src_ip": 16885952,
          "src_port": 40997
        }
      ],
      "is_enabled": true,
      "is_up": true,
      "left_link_bandwidth_bps": 998396604,
      "link_bandwidth_bps": 1000000000,
      "link_bandwidth_usage_bps": 1603396,
      "link_bandwidth_utilization_percent": 0.16033960000000347,
      "src_dpid": 106225808402492,
      "src_ip": [
        67766794
      ],
      "src_interface": 1
    },
    ...
  ]
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

4. GET /ndt/get_detected_flow_data

Description

Returns detailed information about all active flows observed by the network system (sFLow), including their estimated sending rates, timestamps, protocol type, and the full path taken across the network.

Note: For ICMP packets, the src_port field represents the ICMP type, and the dst_port field represents the ICMP code.

Note: src_ip/dst_ip are in network order.

Request

  • Method: GET

Response

Success

  • Status: 200 OK
[
    {
        "dst_ip": 16885952,
        "dst_port": 55367,
        "estimated_flow_sending_rate_bps_in_the_last_sec": 1712000,
        "estimated_flow_sending_rate_bps_in_the_proceeding_1sec_timeslot": 1817600,
        "estimated_packet_rate_in_the_last_sec": 3000,
        "estimated_packet_rate_in_the_proceeding_1sec_timeslot": 3200,
        "first_sampled_time": "2025-08-22 10:13:12",
        "latest_sampled_time": "2025-08-22 10:13:17",
        "path": [
            {
                "interface": 5,
                "node": 1359063232
            },
            {
                "interface": 22,
                "node": 106225808391692
            },
            {
                "interface": 65,
                "node": 106225808398208
            },
            {
                "interface": 25,
                "node": 897475217989184
            },
            {
                "interface": 21,
                "node": 106225808403428
            },
            {
                "interface": 1,
                "node": 106225808402492
            },
            {
                "interface": 0,
                "node": 16885952
            }
        ],
        "protocol_id": 6,
        "src_ip": 1359063232,
        "src_port": 5201
    },
    {
        "dst_ip": 1359063232,
        "dst_port": 5201,
        "estimated_flow_sending_rate_bps_in_the_last_sec": 988560000,
        "estimated_flow_sending_rate_bps_in_the_proceeding_1sec_timeslot": 962242666,
        "estimated_packet_rate_in_the_last_sec": 81333,
        "estimated_packet_rate_in_the_proceeding_1sec_timeslot": 79166,
        "first_sampled_time": "2025-08-22 10:13:12",
        "latest_sampled_time": "2025-08-22 10:13:18",
        "path": [
            {
                "interface": 1,
                "node": 16885952
            },
            {
                "interface": 22,
                "node": 106225808402492
            },
            {
                "interface": 65,
                "node": 106225803167444
            },
            {
                "interface": 27,
                "node": 897475217989184
            },
            {
                "interface": 21,
                "node": 106225808384924
            },
            {
                "interface": 5,
                "node": 106225808391692
            },
            {
                "interface": 0,
                "node": 1359063232
            }
        ],
        "protocol_id": 6,
        "src_ip": 16885952,
        "src_port": 55367
    }
]

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

5. GET /ndt/get_switch_openflow_table_entries

Description

Returns raw OpenFlow flow table entries directly from each switch in the topology.

Each entry includes the DPID of the switch and the exact OpenFlow flow entries as reported by that switch.

Request

  • Method: GET

Response

Success

  • Status: 200 OK
[
  {
    "dpid": 106225808402492,
    "flows": {
      "106225808402492": [
        {
          "actions": [
            "OUTPUT:1"
          ],
          "byte_count": 0,
          "cookie": 0,
          "duration_nsec": 91000000,
          "duration_sec": 3935,
          "flags": 0,
          "hard_timeout": 0,
          "idle_timeout": 0,
          "length": 96,
          "match": {
            "dl_type": 2048,
            "nw_dst": "192.168.1.1"
          },
          "packet_count": 0,
          "priority": 10,
          "table_id": 0
        },
        ...
      ]
    }
  }
]

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

6. GET /ndt/get_power_report

Description

Returns the estimated power consumption (in watts, W) of each switch. The behavior varies based on deployment mode:

In MININET mode, random values are generated for demonstration purposes.

In TESTBED mode, power values are collected via SSH or SNMP from each switch’s IP address and parsed from the returned output.

Request

  • Method: GET

Response

Success

  • Status: 200 OK
[
  {
    "dpid": 106225808391692,
    "power_consumed": 851157966
  },
  {
    "dpid": 106225808380928,
    "power_consumed": 851152638
  },
  {
    "dpid": 106225808387660,
    "power_consumed": 842764030
  },
  {
    "dpid": 106225808402492,
    "power_consumed": 851157966
  }
]

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

7. GET /ndt/get_switches_power_state

Description

Query the power state of one or all switches.

  • With ?ip=: returns the state of the specified switch
  • Without parameters: returns the state of all known switches
 GET "http://127.0.0.1:8000/ndt/get_switches_power_state?ip=10.10.10.10"

Results are returned as a JSON object where each key is a switch IP and each value is "ON" or "OFF".

Request

  • Method: GET

  • Query Parameter:

    ip (optional) — the switch IP to query; if omitted, returns all switches

Response

Success

  • Status: 200 OK
{
  "10.10.10.10": "ON"
}
{
  "10.10.10.10": "ON",
  "10.10.10.3":  "OFF",
  "10.10.10.4":  "ON",
  "10.10.10.9":  "OFF"
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}
  • Status: 404 Not Found
{
  "error": "Unknown switch IP"
}
  • Status: 500 Internal Server Error
{
  "error": "Internal server error"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

8. POST /ndt/set_switches_power_state

Description

Controls the operational state of a switch.

  • TESTBED mode: Sends a power control command to a physical switch by interacting with the smart plug associated with it.
  • MININET mode: Simulates switch power ON/OFF by adding (on) or removing (off) the corresponding OVS bridge via ovs-vsctl commands.

Request

  • Method: POST
  • Content-Type: application/json
  • Query Parameters:
FieldTypeDescription
ipstringIP address of the switch
actionstringDesired power state: "on" or "off"
  • Body None
POST "http://localhost:8000/ndt/set_switches_power_state?ip=10.10.10.10&action=on"

Response

Success

  • Status: 200 OK
{
  "10.10.10.10": "Success"
}

Error

  • Status: 400 Bad Request
{
  "error": "Missing or malformed query parameters"
}

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

9. POST /ndt/install_flow_entry

Description

Installs a new OpenFlow flow entry in a specific switch via the Ryu controller.

The API constructs and sends a flowentry/add POST request to Ryu.

Request

  • Method: POST
  • Content-Type: application/json
  • Body
{
  "dpid": 106225808380928,
  "priority": 99,
  "match": {
    "eth_type": 2048,
    "ipv4_dst": "10.0.0.3"
  },
  "actions": [
    {
      "type": "OUTPUT",
      "port": 24
    }
  ]
}

Response

Success

  • Status: 200 OK
  • Body
{
  "status": "Flow installed"
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

10. POST /ndt/delete_flow_entry

Description

Deletes a flow entry from a switch based on match fields.

  • If the request body does not include “priority”, NDTwin forwards the request to Ryu /stats/flowentry/delete (non-strict delete).

  • If the request body includes “priority”, NDTwin forwards the request to Ryu /stats/flowentry/delete_strict (strict delete, exact match+priority).

Request

  • Method: POST
  • Content-Type: application/json
  • Body
{
  "dpid": 106225808380928,
  "match": {
    "eth_type": 2048,
    "ipv4_dst": "10.0.0.3"
  }
}

Response

Success

  • Status: 200 OK
  • Body
{
  "status": "Flow deleted"
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

11. POST /ndt/modify_flow_entry

Description

Modifies an existing flow entry by matching criteria and applying new actions.

Sends a flowentry/modify request to the Ryu controller.

Request

  • Method: POST
  • Content-Type: application/json
  • Body
{
  "dpid": 106225808380928,
  "priority": 99,
  "match": {
    "eth_type": 2048,
    "ipv4_dst": "10.0.0.3"
  },
  "actions": [
    {
      "type": "OUTPUT",
      "port": 25
    }
  ]
}

Response

Success

  • Status: 200 OK
  • Body
{
  "status": "Flow modified"
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

12. GET /ndt/get_cpu_utilization

Description

Returns the current CPU utilization(%) of all up switches in the network topology. Uses SNMP to retrieve CPU data.

In MININET mode, dummy values are generated for demonstration purposes.

Request

  • Method: GET

Response

Success

  • Status: 200 OK
  • Body
{"10.10.10.10":1,"10.10.10.3":1,"10.10.10.4":1,"10.10.10.9":1}

A value of -1 means SNMP query failed or data is unavailable.

13. GET /ndt/get_memory_utilization

Description

Returns the memory utilization(%) of all up switches using SNMP.

In MININET mode, dummy values are generated for demonstration purposes.

Note: A value of -1 means SNMP query failed or data is unavailable.

Request

  • Method: GET

Response

Success

  • Status: 200 OK
{"10.10.10.10":28,"10.10.10.3":27,"10.10.10.4":27,"10.10.10.9":27}

14. GET /ndt/inform_switch_entered

Description

Called by Ryu to notify the NDTwin system that a new switch has entered the network (i.e., connected). This will mark the switch as UP in the internal topology.

GET "http://localhost:8000/ndt/inform_switch_entered?dpid=106225808402492"

Request

  • Method: GET

  • Query Parameter:

    dpid

Response

Success

  • Status: 200 OK
{
  "status": "Switch set to up"
}

Error

  • Status: 400 Bad Request
{
  "error": "Missing dpid parameter"
}
  • Status: 400 Bad Request
{
  "error": "Invalid dpid format"
}

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}
  • Status: 404 Not Found
{
  "error": "Switch not found"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

15. POST /ndt/modify_device_name

Description

Updates the name of a switch or host in the NDTwin topology and StaticNetworkTopology.json.

Request

  • Content-Type: application/json
  • Body Parameters:
FieldTypeRequiredDescription
vertex_typeintYes0 for switch, 1 for host
dpiduint64Yes (if switch)The DPID of the switch to rename
macstringYes (if host)The MAC address of the host to rename (e.g., “00:11:22:33:44:55”)
new_namestringYesThe new name to assign to the device
  • Body
{
  "vertex_type": 1,
  "mac": "00:11:22:33:44:55",
  "new_name": "HostA"
}

Response

Success

  • Status: 200 OK
  • Body
{
  "status": "Device name updated successfully."
}

Error

  • Status: 400 Bad Request
{
  "error": 	"Invalid vertex_type. Must be 0 (switch) or 1 (host)."
}
  • Status: 400 Bad Request
{
  "error": 	"Invalid request format."
}

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}
  • Status: 404 Not Found
{
  "error": 	"Device not found."
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

16. POST /ndt/app_register

Description

Registers a new application with the server. When an application is registered:

  • The server assigns it a unique app_id.

  • Creates a dedicated folder for the application in the NFS export directory (e.g., /srv/nfs/sim/<app_id>).

  • This folder can be used by the application to store its simulation files.

Request

  • Method: POST
  • Content-Type: application/json
  • Body
{
  "app_name": "MyApp",
  "simulation_completed_url": "http://192.168.100.5:9000/simulation_completed"
}

Response

Success

  • Status: 200 OK
{
  "app_id": 1,
  "message": "Application registered successfully"
}

Error

  • Status: 400 Bad Request
{
  "error": "Missing or invalid 'appName'"
}

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

17. POST /ndt/received_a_simulation_case

Description

Called by NDTwin Application to notify the NDTwin server that a new simulation case has been dispatched by an external simulator and reply the response from simulation platform manager.

Request

  • Method: POST
  • Content-Type: application/json
  • Body Parameters:
FieldTypeDescription
simulatorstringName of the simulator (e.g., "NetSquid")
versionstringVersion identifier of the simulator (e.g., "v1.2.3")
app_idstringIdentifier of the registered application (as returned by app_register)
case_idstringUnique identifier for this simulation case
inputfilestringPath or URL where the simulator can fetch its input description
{
  "simulator": "MySimulator",
  "version": "1.0.0",
  "app_id": "1",
  "case_id": "case_123",
  "inputfile": "/srv/nfs/sim/1/case_123.json"
}

Response

Success

  • Status: 202 Accepted
{
  "status": "Request received (response from simulation server)"
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

18. POST /ndt/simulation_completed

Description

Called by the external simulator when a simulation finishes. The NDTwin will forward the result URL to the registered application.

Request

  • Method: POST
  • Content-Type: application/json
  • Body Parameters:
FieldTypeDescription
app_idstringIdentifier of the application that submitted the simulation
case_idstringIdentifier of the simulation case that has completed
outputfilestringPath or URL where the simulator has deposited its output file
{
  "app_id": "1",
  "case_id": "case_123",
  "outputfile": "/srv/nfs/sim/1/case_123_result.json"
}

Response

Success

  • Status: 200 OK
{
  "status": "result forwarded"
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

19. GET /ndt/get_nickname

Description

Retrieves the nickname of a single device from the network topology. The device must be identified by one of the query parameters: dpid, mac, or name.

If multiple parameters are provided, they are processed in the following order of priority: dpid > mac > name. For example, if both dpid and mac are in the URL, the system will only search for the device by its dpid.

Request

  • Method: GET
  • Query Parameters:

At least one of the following parameters is required.

ParameterTypeDescription
dpiduint64The DPID of the switch to find.
macstringThe MAC address of the device to find (e.g., “00:1A:2B:3C:4D:5E”).
namestringThe current device name to find.
  • Example URLs:

    To get by DPID: /api/device/nickname?dpid=4660

    To get by MAC address: /api/device/nickname?mac=00:1A:2B:3C:4D:5E

Response

Success

  • Status**: 200 OK
{
  "nickname": "Main-Web-Server"
}

Error

Returned if an identifier has an invalid format (e.g., a non-numeric DPID).

  • Status: 400 Bad Request
{
  "error": "Invalid DPID format",
  "details": "stoull"
}

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when a valid identifier is provided, but no matching device is found in the topology.

  • Status: 404 Not Found
{
  "error": "Device not found"
}

Returned if no identifier parameter (dpid, mac, or name) is provided in the URL.

  • Status: 404 Not Found
{
  "error": "Missing dpid, mac, or name parameter"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

20. POST /ndt/modify_nickname

Description

Updates the nickname of a device (e.g., a switch or host) in the network topology. The device can be identified by its DPID, MAC address, or its current name(e.g., name or nickname).

Request

  • Method: POST

  • Content-Type: application/json

  • Body Parameters:

FieldTypeRequiredDescription
identifierobjectYesAn object containing the unique identifier for the device.
identifier.typestringYesSpecifies the type of identifier. Must be one of: "dpid", "mac", or "name".
identifier.valueint,uint64 or stringYesThe value corresponding to the identifier type (e.g., a DPID for dpid, a MAC address string for mac).
new_nicknamestringYesThe new nickname to assign to the device.
  • Body (Example by DPID)
{
  "identifier": {
    "type": "dpid",
    "value": 4660
  },
  "new_nickname": "Sinica-Switch-01"
}
  • Body (Example by MAC)
{
"identifier": {
  "type": "mac",
  "value": "00:1A:2B:3C:4D:5E"
},
"new_nickname": "Main-Web-Server"
}
  • Body (Example by NAME)
{
  "identifier": {
    "type": "name",
    "value": "h1"
  },
  "new_nickname": "Core-Switch-01"
}

Response

Success

  • Status: 200 OK
{
  "status": "success",
  "message": "Nickname updated successfully."
}

Error

  • Status: 404 Not Found
{
  "error": "Device not found"
}

This error is returned for invalid request formats, such as malformed JSON, missing required fields, or an invalid identifier type.

  • Status: 400 Bad Request
{
  "error": "Failed to modify nickname",
  "details": "Invalid identifier type: ip"
}

21. GET /ndt/get_temperature

Description

Retrieves the current operating temperature for all switches in the network topology.

This function is designed to work in two modes:

  • In a MININET environment, it returns randomly generated dummy data for any switch.
  • In a TESTBED environment, it uses SNMP to query the temperature. It will only return a valid temperature for devices with a brand_name of “HPE 5520”. For other devices or switches that are down, it returns a descriptive status message.

Request

  • Method: GET

Response

Success

  • Status: 200 OK

A JSON object where each key is a switch’s IP address. The value is either the current temperature in Celsius (as an integer) or a status message (as a string).

{
  "10.10.10.15": "The temperature function only supports the HPE 5520.",
  "10.10.10.16": 29,
  "10.10.10.17": "The switch is down."
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

22. GET /ndt/get_path_switch_count

Description

Retrieves the number of switches along network paths.

  • If a source IP and destination IP are specified, it returns the switch count for that single path.
  • If no IP addresses are specified, it returns a list of all known paths and their corresponding switch counts.

Request

  • Method: GET
  • Query Parameters:
ParameterTypeRequiredDescription
src_ipstringNoThe source IP address of the path (e.g., “10.0.0.1”). If omitted, all paths will be returned.
dst_ipstringNoThe destination IP address of the path (e.g., “10.0.0.2”). If omitted, all paths will be returned.
  • Example URLs:

    For a specific path: /ndt/get_path_switch_count?src_ip=10.0.0.1&dst_ip=10.0.0.2

    For all paths (empty query): /ndt/get_path_switch_count

Response

Success

  • Status: 200 OK

A JSON object confirming the request and providing the count of switches on the specified path.

{
  "status": "success",
  "src_ip": "10.0.0.1",
  "dst_ip": "10.0.0.2",
  "switch_count": 1
}

Success

  • Status: 200 OK

A JSON object containing a data array with all known paths and their switch counts. The array will be empty if no paths are currently known.

{
  "status": "success",
  "data": [
    {
      "src_ip": "10.0.0.1",
      "dst_ip": "10.0.0.2",
      "switch_count": 1
    },
    {
      "src_ip": "10.0.0.3",
      "dst_ip": "10.0.0.4",
      "switch_count": 2
    }
  ]
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

This error is returned only when requesting a specific path that cannot be found in the system’s records.

  • Status: 404 Not Found
{
  "status": "error",
  "message": "Path not found for the given IPs."
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

23. POST /ndt/install_flow_entries_modify_flow_entries_and_delete_flow_entries

Description

Installs, modifies and deletes OpenFlow entries in one request.

Implementation details: To minimize update time, the controller uses a producer–consumer architecture: the request handler (producer) parses and validates flow actions, then pushes them into an internal queue. A dedicated worker (consumer) dequeues actions and applies them to switches, reducing per-request overhead and improving flow update throughput.

Request

  • Method: POST
  • Content-Type: application/json
  • Body Parameters:
FieldTypeDescription
install_flow_entriesarrayArray of install entries. Each item must include dpid, match, and actions; priority optional (0 as default value).
modify_flow_entriesarrayArray of modify entries. Each item must include dpid, match, and actions; priority optional (0 as default value).
delete_flow_entriesarrayArray of delete entries. Each item must include dpid and match.
  • Install/Modify entry fields

    FieldTypeDescription
    dpiduint64_tSwitch datapath ID.
    priorityintRule priority (optional; defaults to 0 if missing).
    matchobjectMatch fields.
    actionsarrayList of actions.
  • Delete entry fields

    FieldTypeDescription
    dpiduint64_tSwitch datapath ID.
    matchobjectMatch fields.
    priorityintRule priority (optional; defaults to -1 if missing)
{
    "install_flow_entries":
    [
        {
            "dpid": 106225808387660,
            "priority": 99,
            "match": {
                "eth_type": 2048,
                "ipv4_dst": "10.0.0.3"
            },
            "actions": [
                {
                "type": "OUTPUT",
                "port": 21
                }
            ]
        }
    ],
    "modify_flow_entries":
    [
        {
            "dpid": 106225808387660,
            "priority": 10,
            "match": {
                "eth_type": 2048,
                "ipv4_dst": "192.168.1.1"
            },
            "actions": [
                {
                "type": "OUTPUT",
                "port": 1
                }
            ]
        },
        {
            "dpid": 106225808387660,
            "priority": 10,
            "match": {
                "eth_type": 2048,
                "ipv4_dst": "192.168.1.2"
            },
            "actions": [
                {
                "type": "OUTPUT",
                "port": 1
                }
            ]
        },
        {
            "dpid": 106225808402492,
            "priority": 10,
            "match": {
                "eth_type": 2048,
                "ipv4_dst": "192.168.1.1"
            },
            "actions": [
                {
                "type": "OUTPUT",
                "port": 1
                }
            ]
        }
    ],
    "delete_flow_entries":
    [
        
        {
            "dpid": 106225808387660,
            "match": {
                "eth_type": 2048,
                "ipv4_dst": "192.168.1.3"
            }
        }
    ]
}
{
    "install_flow_entries": [
        {
            "dpid": 5,
            "table_id": 0,
            "priority": 202,
            "match": {
                "eth_type": 2048,
                "ip_proto": 17,
                "ipv4_src": "10.0.0.1",
                "ipv4_dst": "10.0.0.2",
                "udp_src": 12345,
                "udp_dst": 5678
            },
            "actions": [
                {
                    "type": "OUTPUT",
                    "port": 2
                }
            ]
        },
        {
            "dpid": 5,
            "table_id": 0,
            "priority": 201,
            "match": {
                "eth_type": 2048,
                "ip_proto": 6,
                "ipv4_src": "10.0.0.1",
                "ipv4_dst": "10.0.0.2",
                "tcp_src": 12345,
                "tcp_dst": 443
            },
            "actions": [
                {
                    "type": "OUTPUT",
                    "port": 2
                }
            ]
        },
        {
            "dpid": 5,
            "priority": 203,
            "match": {
                "eth_type": 2048,
                "ip_proto": 1,
                "icmpv4_type": 8,
                "icmpv4_code": 0,
                "ipv4_dst": "10.0.0.2"
            },
            "actions": [
                {
                    "type": "OUTPUT",
                    "port": 2
                }
            ]
        }
    ],
    "modify_flow_entries": [],
    "delete_flow_entries": []
}
{
  "install_flow_entries": [
    {
      "dpid": 5,
      "match": {
        "ip_proto": 6,
        "eth_type": 2048,
        "ipv4_src": "10.0.0.1/24",
        "ipv4_dst": "10.0.0.2/24",
        "tcp_src": 12345,
        "tcp_dst": 443
      },
      "actions": [
        {
          "type": "OUTPUT",
          "port": 2
        }
      ],
      "priority": 201
    }
  ],
  "modify_flow_entries": [],
  "delete_flow_entries": []
}

Response

Success

  • Status: 200 OK
{
  "status": "Flows installed, modified and deleted"
}

Error

  • Status: 400 Bad Request
{
  "error": "install_flow_entries/modify_flow_entries/delete_flow_entries must be arrays"
}
  • Status: 400 Bad Request
{
  "error": "Bad entry"
}

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}
  • Status: 500 Internal Server Error
{
  "error": "internal server error"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

Description

Returns the average link utilization across all UP inter-switch links (host-facing links are excluded). Only links with non-zero link_bandwidth_usage_bps are included in the average.

Request

  • Method: GET

Example

 GET "http://127.0.0.1:8000/ndt/get_average_link_usage"

Response

Success

  • Status: 200 OK
{
  "status": "success",
  "avg_link_usage": 0.12
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

25. POST /ndt/get_total_input_traffic_load_passing_a_switch

Description

Returns the total incoming traffic load (bps) for a given switch. It sums link_bandwidth_usage_bps for all edges whose destination DPID equals the provided dpid (i.e., all incoming directed links to that switch).

Request

  • Method: POST
  • Content-Type: application/json
  • Body
{
  "dpid": 106225808380928
}

Response

Success

  • Status: 200 OK
{
  "status": "success",
  "total_input_traffic_load_bps": 12345678
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

26. POST /ndt/get_num_of_flows_passing_a_switch

Description

Returns the number of flows passing a switch, computed by summing the number of flows over all edges whose destination DPID equals the provided dpid (i.e., incoming links to that switch).

Request

  • Method: POST
  • Content-Type: application/json
  • Body
{
  "dpid": 106225808380928
}

Response

Success

  • Status: 200 OK
{
  "status": "success",
  "num_of_flows": 42
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

27. POST /ndt/acquire_lock

Description

Acquires a global lock (typed lock) to prevent application conflicts (mutual exclusion). Supports optional type and ttl (seconds). If the JSON body is missing/invalid, defaults are used.

  • Body Parameters:
FieldTypeDescription
typestringlock category/name
ttlintlock time-to-live in seconds

Request

  • Method: POST
  • Content-Type: application/json
  • Body
{
  "type": "routing_lock",
  "ttl": 30
}

Response

Success

  • Status: 200 OK
{
  "status": "locked",
  "type": "routing_lock",
  "ttl": 30
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Busy / Invalid Type

  • Status: 423 Locked
{
  "error": "Lock acquisition failed",
  "detail": "System busy or invalid lock type: routing_lock"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

28. POST /ndt/renew_lock

Description

Renews (extends) the TTL of an existing lock to keep exclusive access. Supports optional type and ttl. If missing/invalid JSON, defaults are used.

Request

  • Method: POST
  • Content-Type: application/json
  • Body (optional)
{
  "type": "routing_lock",
  "ttl": 30
}

Response

Success

  • Status: 200 OK
{
  "status": "renewed",
  "type": "routing_lock",
  "ttl": 30
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Not Held / Expired / Invalid

  • Status: 412 Precondition Failed
{
  "error": "Renew failed",
  "detail": "Lock 'routing_lock' is expired, not held, or invalid type"
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}

29. POST /ndt/release_lock

Description

Releases a previously acquired lock, allowing other applications to proceed. Supports optional type. If missing/invalid JSON, the default lock type is used.

Request

  • Method: POST
  • Content-Type: application/json
  • Body (optional)
{
  "type": "routing_lock"
}

Response

Success

  • Status: 200 OK
{
  "status": "released",
  "type": "routing_lock"
}

Error

Returned when the request body is not valid JSON, or JSON fields have invalid types/format.

  • Status: 400 Bad Request
{
  "error": "JSON parsing error",
  "details": "<exception message>"
}

Busy / Invalid Type

  • Status: 423 Locked
{
  "error": "Lock release failed", 
  "detail": "..."
}

Returned when an unexpected runtime error occurs (e.g., invalid state, missing dependency, system failure).

  • Status: 500 Internal Server Error
{
  "error": "Internal server error",
  "details": "<exception message>"
}

Returned when an unknown exception type is thrown.

  • Status: 500 Internal Server Error
{
  "error": "An unknown error occurred"
}