{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "https://www.omg.org/spec/DDS-JSON/20190601/dds-tsn_definitions.schema.json",
    "title": "DDS-TSN: JSON Schema Definitions",
    "description": "This schema provides the ability to describe a DDS-TSN configuration.",
    "definitions": {
        "macAddress": {
            "type": "string",
            "pattern": "[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}"
        },
        "ipv4Address": {
            "type": "string"
        },
        "ipv6Address": {
            "type": "string"
        },
        "node": {
            "type": "object",
            "properties": {
                "name": {
                    "$ref": "dds-json_qos.schema.json#/definitions/elementName"
                },
                "hostname": {
                    "type": "string"
                },
                "ipv4_address": {
                    "$ref": "#/definitions/ipv4Address"
                },
                "ipv6_address": {
                    "$ref": "#/definitions/ipv6Address"
                },
                "mac_address": {
                    "$ref": "#/definitions/macAddress"
                }
            },
            "required": [
                "name"
            ],
            "additionalProperties": false
        },
        "nodeLibrary": {
            "type": "object",
            "properties": {
                "name": {
                    "$ref": "dds-json_qos.schema.json#/definitions/elementName"
                },
                "nodes": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/node"
                    }
                }
            },
            "required": [
                "name"
            ],
            "additionalProperties": false
        },
        "timeAware": {
            "type": "object",
            "properties": {
                "earliest_transmit_offset": {
                    "type": "integer",
                    "minimum": 0
                },
                "latest_transmit_offset": {
                    "type": "integer",
                    "minimum": 0
                },
                "jitter": {
                    "type": "integer",
                    "minimum": 0
                }
            },
            "additionalProperties": false
        },
        "trafficSpecification": {
            "type": "object",
            "properties": {
                "periodicity": {
                    "$ref": "dds-json_qos.schema.json#/definitions/duration"
                },
                "samples_per_period": {
                    "type": "integer",
                    "minimum": 1
                },
                "max_bytes_per_sample": {
                    "type": "integer",
                    "minimum": 0
                },
                "transmission_selection": {
                    "oneOf": [
                        {
                            "type": "integer",
                            "minimum": 0
                        },
                        {
                            "type": "string",
                            "enum": [
                                "STRICT_PRIORITY",
                                "CREDIT_BASED_SHAPER",
                                "ENHANCED_TRANSMISSION_SELECTION",
                                "ATS_TRANSMISSION_SELECTION"
                            ]
                        }
                    ]
                },
                "time_aware": {
                    "$ref": "#/definitions/timeAware"
                }
            },
            "additionalProperties": false
        },
        "networkRequirements": {
            "type": "object",
            "properties": {
                "num_seamless_trees": {
                    "type": "integer",
                    "minimum": 0
                },
                "max_latency": {
                    "type": "integer",
                    "minimum": 0
                }
            },
            "additionalProperties": false
        },
        "ieee802MacAddresses": {
            "type": "object",
            "properties": {
                "destination_mac_address": {
                    "$ref": "#/definitions/macAddress"
                },
                "source_mac_address": {
                    "$ref": "#/definitions/macAddress"
                }
            },
            "additionalProperties": false
        },
        "ieee802VlanTag": {
            "type": "object",
            "properties": {
                "priority_code_point": {
                    "type": "integer",
                    "minimum": 0
                },
                "vlan_id": {
                    "type": "integer",
                    "minimum": 0
                }
            },
            "additionalProperties": false
        },
        "ipv4Tuple": {
            "type": "object",
            "properties": {
                "source_ip_address": {
                    "$ref": "#/definitions/ipv4Address"
                },
                "destination_ip_address": {
                    "$ref": "#/definitions/ipv4Address"
                },
                "dscp": {
                    "type": "integer"
                },
                "protocol": {
                    "type": "integer"
                },
                "source_port": {
                    "type": "integer"
                },
                "destination_port": {
                    "type": "integer"
                }
            },
            "additionalProperties": false
        },
        "ipv6Tuple": {
            "type": "object",
            "properties": {
                "source_ip_address": {
                    "$ref": "#/definitions/ipv6Address"
                },
                "destination_ip_address": {
                    "$ref": "#/definitions/ipv6Address"
                },
                "dscp": {
                    "type": "integer"
                },
                "protocol": {
                    "type": "integer"
                },
                "source_port": {
                    "type": "integer"
                },
                "destination_port": {
                    "type": "integer"
                }
            },
            "additionalProperties": false
        },
        "dataFrameSpecification": {
            "type": "object",
            "properties": {
                "mac_addresses": {
                    "$ref": "#/definitions/ieee802MacAddresses"
                },
                "vlan_tag": {
                    "$ref": "#/definitions/ieee802VlanTag"
                },
                "ipv4_tuple": {
                    "$ref": "#/definitions/ipv4Tuple"
                },
                "ipv6_tuple": {
                    "$ref": "#/definitions/ipv6Tuple"
                }
            },
            "additionalProperties": false
        },
        "tsnTalker": {
            "type": "object",
            "properties": {
                "name": {
                    "$ref": "dds-json_qos.schema.json#/definitions/elementName"
                },
                "stream_name": {
                    "type": "string"
                },
                "datawriter_ref": {
                    "$ref": "dds-json_qos.schema.json#/definitions/elementNameReference"
                },
                "traffic_specification": {
                    "$ref": "#/definitions/trafficSpecification"
                },
                "network_requirements": {
                    "$ref": "#/definitions/networkRequirements"
                },
                "data_frame_specification": {
                    "$ref": "#/definitions/dataFrameSpecification"
                }
            },
            "required": [
                "name",
                "stream_name",
                "datawriter_ref"
            ],
            "additionalProperties": false
        },
        "tsnListener": {
            "type": "object",
            "properties": {
                "name": {
                    "$ref": "dds-json_qos.schema.json#/definitions/elementName"
                },
                "stream_name": {
                    "type": "string"
                },
                "datareader_ref": {
                    "$ref": "dds-json_qos.schema.json#/definitions/elementNameReference"
                },
                "network_requirements": {
                    "$ref": "#/definitions/networkRequirements"
                }
            },
            "required": [
                "name",
                "stream_name",
                "datareader_ref"
            ],
            "additionalProperties": false
        },
        "tsnConfiguration": {
            "type": "object",
            "properties": {
                "tsn_talkers": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/tsnTalker"
                    }
                },
                "tsn_listeners": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/tsnListener"
                    }
                }
            },
            "additionalProperties": false
        },
        "deploymentLibraryElement": {
            "type": "object",
            "properties": {
                "name": {
                    "$ref": "dds-json_qos.schema.json#/definitions/elementName"
                },
                "node_ref": {
                    "$ref": "dds-json_qos.schema.json#/definitions/elementNameReference"
                },
                "application_list": {
                    "type": "array",
                    "items": {
                        "$ref": "dds-json_qos.schema.json#/definitions/elementNameReference"
                    }
                },
                "configuration": {
                    "type": "object",
                    "properties": {
                        "tsn": {
                            "$ref": "#/definitions/tsnConfiguration"
                        }
                    },
                    "additionalProperties": false
                }
            },
            "required": [
                "name",
                "node_ref"
            ],
            "additionalProperties": false
        },
        "deploymentLibrary": {
            "type": "object",
            "properties": {
                "name": {
                    "$ref": "dds-json_qos.schema.json#/definitions/elementName"
                },
                "deployments": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/deploymentLibraryElement"
                    }
                }
            },
            "required": [
                "name"
            ],
            "additionalProperties": false
        },
        "ddsSystem": {
            "type": "object",
            "properties": {
                "types": {
                    "type": "object",
                    "patternProperties": {
                        "^[a-zA-Z][a-zA-Z0-9_.]*$": {
                            "$ref": "dds-json_types.schema.json#/definitions/moduleElement"
                        }
                    }
                },
                "qos_libraries": {
                    "type": "array",
                    "items": {
                        "$ref": "dds-json_qos.schema.json#/definitions/qosLibrary"
                    }
                },
                "domain_libraries": {
                    "type": "array",
                    "items": {
                        "$ref": "dds-json_domains.schema.json#/definitions/domainLibrary"
                    }
                },
                "domain_participant_libraries": {
                    "type": "array",
                    "items": {
                        "$ref": "dds-json_domainparticipants.schema.json#/definitions/domainParticipantLibrary"
                    }
                },
                "application_libraries": {
                    "type": "array",
                    "items": {
                        "$ref": "dds-json_applications.schema.json#/definitions/applicationLibrary"
                    }
                },
                "node_libraries": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/nodeLibrary"
                    }
                },
                "deployment_libraries": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/deploymentLibrary"
                    }
                }
            }
        }
    },
    "$ref": "#/definitions/ddsSystem"
}